From 8fc6e784ffad3a0c202e38cbbe80e260cc6b242c Mon Sep 17 00:00:00 2001 From: Victor Nguyen Date: Tue, 19 Feb 2013 19:19:08 +1100 Subject: [PATCH] removed node_modules/ and added to gitignore --- .gitignore | 3 +- node_modules/.bin/express | 422 - node_modules/.bin/jade | 168 - node_modules/express/.npmignore | 9 - node_modules/express/.travis.yml | 4 - node_modules/express/History.md | 1091 - node_modules/express/LICENSE | 22 - node_modules/express/Makefile | 33 - node_modules/express/Readme.md | 179 - node_modules/express/bin/express | 422 - node_modules/express/client.js | 25 - node_modules/express/index.js | 4 - node_modules/express/lib/application.js | 534 - node_modules/express/lib/express.js | 92 - node_modules/express/lib/middleware.js | 33 - node_modules/express/lib/request.js | 493 - node_modules/express/lib/response.js | 754 - node_modules/express/lib/router/index.js | 273 - node_modules/express/lib/router/route.js | 72 - node_modules/express/lib/utils.js | 282 - node_modules/express/lib/view.js | 76 - .../node_modules/buffer-crc32/.npmignore | 1 - .../node_modules/buffer-crc32/.travis.yml | 8 - .../node_modules/buffer-crc32/README.md | 33 - .../node_modules/buffer-crc32/index.js | 84 - .../node_modules/buffer-crc32/package.json | 30 - .../buffer-crc32/tests/crc.test.js | 52 - .../express/node_modules/commander/.npmignore | 4 - .../node_modules/commander/.travis.yml | 4 - .../express/node_modules/commander/History.md | 107 - .../express/node_modules/commander/Makefile | 7 - .../express/node_modules/commander/Readme.md | 262 - .../express/node_modules/commander/index.js | 2 - .../node_modules/commander/lib/commander.js | 1026 - .../node_modules/commander/package.json | 34 - .../express/node_modules/connect/.npmignore | 12 - .../express/node_modules/connect/.travis.yml | 5 - .../express/node_modules/connect/LICENSE | 24 - .../express/node_modules/connect/Readme.md | 133 - .../express/node_modules/connect/index.js | 4 - .../node_modules/connect/lib-cov/cache.js | 68 - .../node_modules/connect/lib-cov/connect.js | 93 - .../node_modules/connect/lib-cov/index.js | 6 - .../connect/lib-cov/middleware/basicAuth.js | 128 - .../connect/lib-cov/middleware/bodyParser.js | 43 - .../connect/lib-cov/middleware/compress.js | 159 - .../lib-cov/middleware/cookieParser.js | 70 - .../lib-cov/middleware/cookieSession.js | 132 - .../connect/lib-cov/middleware/csrf.js | 51 - .../connect/lib-cov/middleware/directory.js | 256 - .../lib-cov/middleware/errorHandler.js | 104 - .../connect/lib-cov/middleware/favicon.js | 60 - .../connect/lib-cov/middleware/json.js | 117 - .../connect/lib-cov/middleware/limit.js | 63 - .../connect/lib-cov/middleware/logger.js | 312 - .../lib-cov/middleware/methodOverride.js | 42 - .../connect/lib-cov/middleware/multipart.js | 183 - .../connect/lib-cov/middleware/query.js | 27 - .../lib-cov/middleware/responseTime.js | 39 - .../connect/lib-cov/middleware/session.js | 321 - .../lib-cov/middleware/session/cookie.js | 65 - .../lib-cov/middleware/session/memory.js | 128 - .../lib-cov/middleware/session/session.js | 108 - .../lib-cov/middleware/session/store.js | 90 - .../connect/lib-cov/middleware/static.js | 92 - .../connect/lib-cov/middleware/staticCache.js | 276 - .../connect/lib-cov/middleware/timeout.js | 66 - .../connect/lib-cov/middleware/urlencoded.js | 98 - .../connect/lib-cov/middleware/vhost.js | 59 - .../node_modules/connect/lib-cov/patch.js | 85 - .../node_modules/connect/lib-cov/proto.js | 285 - .../connect/lib-cov/public/directory.html | 75 - .../connect/lib-cov/public/error.html | 13 - .../connect/lib-cov/public/favicon.ico | Bin 1406 -> 0 bytes .../connect/lib-cov/public/icons/page.png | Bin 635 -> 0 bytes .../connect/lib-cov/public/icons/page_add.png | Bin 739 -> 0 bytes .../lib-cov/public/icons/page_attach.png | Bin 794 -> 0 bytes .../lib-cov/public/icons/page_code.png | Bin 818 -> 0 bytes .../lib-cov/public/icons/page_copy.png | Bin 663 -> 0 bytes .../lib-cov/public/icons/page_delete.png | Bin 740 -> 0 bytes .../lib-cov/public/icons/page_edit.png | Bin 807 -> 0 bytes .../lib-cov/public/icons/page_error.png | Bin 793 -> 0 bytes .../lib-cov/public/icons/page_excel.png | Bin 817 -> 0 bytes .../lib-cov/public/icons/page_find.png | Bin 879 -> 0 bytes .../lib-cov/public/icons/page_gear.png | Bin 833 -> 0 bytes .../connect/lib-cov/public/icons/page_go.png | Bin 779 -> 0 bytes .../lib-cov/public/icons/page_green.png | Bin 621 -> 0 bytes .../connect/lib-cov/public/icons/page_key.png | Bin 801 -> 0 bytes .../lib-cov/public/icons/page_lightning.png | Bin 839 -> 0 bytes .../lib-cov/public/icons/page_link.png | Bin 830 -> 0 bytes .../lib-cov/public/icons/page_paintbrush.png | Bin 813 -> 0 bytes .../lib-cov/public/icons/page_paste.png | Bin 703 -> 0 bytes .../connect/lib-cov/public/icons/page_red.png | Bin 641 -> 0 bytes .../lib-cov/public/icons/page_refresh.png | Bin 858 -> 0 bytes .../lib-cov/public/icons/page_save.png | Bin 774 -> 0 bytes .../lib-cov/public/icons/page_white.png | Bin 294 -> 0 bytes .../public/icons/page_white_acrobat.png | Bin 591 -> 0 bytes .../public/icons/page_white_actionscript.png | Bin 664 -> 0 bytes .../lib-cov/public/icons/page_white_add.png | Bin 512 -> 0 bytes .../lib-cov/public/icons/page_white_c.png | Bin 587 -> 0 bytes .../public/icons/page_white_camera.png | Bin 656 -> 0 bytes .../lib-cov/public/icons/page_white_cd.png | Bin 666 -> 0 bytes .../lib-cov/public/icons/page_white_code.png | Bin 603 -> 0 bytes .../public/icons/page_white_code_red.png | Bin 587 -> 0 bytes .../public/icons/page_white_coldfusion.png | Bin 592 -> 0 bytes .../public/icons/page_white_compressed.png | Bin 724 -> 0 bytes .../lib-cov/public/icons/page_white_copy.png | Bin 309 -> 0 bytes .../public/icons/page_white_cplusplus.png | Bin 621 -> 0 bytes .../public/icons/page_white_csharp.png | Bin 700 -> 0 bytes .../lib-cov/public/icons/page_white_cup.png | Bin 639 -> 0 bytes .../public/icons/page_white_database.png | Bin 579 -> 0 bytes .../public/icons/page_white_delete.png | Bin 536 -> 0 bytes .../lib-cov/public/icons/page_white_dvd.png | Bin 638 -> 0 bytes .../lib-cov/public/icons/page_white_edit.png | Bin 618 -> 0 bytes .../lib-cov/public/icons/page_white_error.png | Bin 623 -> 0 bytes .../lib-cov/public/icons/page_white_excel.png | Bin 663 -> 0 bytes .../lib-cov/public/icons/page_white_find.png | Bin 676 -> 0 bytes .../lib-cov/public/icons/page_white_flash.png | Bin 582 -> 0 bytes .../public/icons/page_white_freehand.png | Bin 639 -> 0 bytes .../lib-cov/public/icons/page_white_gear.png | Bin 402 -> 0 bytes .../lib-cov/public/icons/page_white_get.png | Bin 516 -> 0 bytes .../lib-cov/public/icons/page_white_go.png | Bin 612 -> 0 bytes .../lib-cov/public/icons/page_white_h.png | Bin 603 -> 0 bytes .../public/icons/page_white_horizontal.png | Bin 296 -> 0 bytes .../lib-cov/public/icons/page_white_key.png | Bin 616 -> 0 bytes .../public/icons/page_white_lightning.png | Bin 669 -> 0 bytes .../lib-cov/public/icons/page_white_link.png | Bin 614 -> 0 bytes .../public/icons/page_white_magnify.png | Bin 554 -> 0 bytes .../lib-cov/public/icons/page_white_medal.png | Bin 706 -> 0 bytes .../public/icons/page_white_office.png | Bin 779 -> 0 bytes .../lib-cov/public/icons/page_white_paint.png | Bin 688 -> 0 bytes .../public/icons/page_white_paintbrush.png | Bin 618 -> 0 bytes .../lib-cov/public/icons/page_white_paste.png | Bin 620 -> 0 bytes .../lib-cov/public/icons/page_white_php.png | Bin 538 -> 0 bytes .../public/icons/page_white_picture.png | Bin 650 -> 0 bytes .../public/icons/page_white_powerpoint.png | Bin 588 -> 0 bytes .../lib-cov/public/icons/page_white_put.png | Bin 523 -> 0 bytes .../lib-cov/public/icons/page_white_ruby.png | Bin 626 -> 0 bytes .../lib-cov/public/icons/page_white_stack.png | Bin 317 -> 0 bytes .../lib-cov/public/icons/page_white_star.png | Bin 565 -> 0 bytes .../public/icons/page_white_swoosh.png | Bin 634 -> 0 bytes .../lib-cov/public/icons/page_white_text.png | Bin 342 -> 0 bytes .../public/icons/page_white_text_width.png | Bin 315 -> 0 bytes .../lib-cov/public/icons/page_white_tux.png | Bin 668 -> 0 bytes .../public/icons/page_white_vector.png | Bin 644 -> 0 bytes .../public/icons/page_white_visualstudio.png | Bin 702 -> 0 bytes .../lib-cov/public/icons/page_white_width.png | Bin 309 -> 0 bytes .../lib-cov/public/icons/page_white_word.png | Bin 651 -> 0 bytes .../lib-cov/public/icons/page_white_world.png | Bin 734 -> 0 bytes .../public/icons/page_white_wrench.png | Bin 613 -> 0 bytes .../lib-cov/public/icons/page_white_zip.png | Bin 386 -> 0 bytes .../lib-cov/public/icons/page_word.png | Bin 777 -> 0 bytes .../lib-cov/public/icons/page_world.png | Bin 903 -> 0 bytes .../connect/lib-cov/public/style.css | 141 - .../node_modules/connect/lib-cov/utils.js | 282 - .../express/node_modules/connect/lib/cache.js | 81 - .../node_modules/connect/lib/connect.js | 93 - .../express/node_modules/connect/lib/index.js | 50 - .../connect/lib/middleware/basicAuth.js | 103 - .../connect/lib/middleware/bodyParser.js | 61 - .../connect/lib/middleware/compress.js | 147 - .../connect/lib/middleware/cookieParser.js | 62 - .../connect/lib/middleware/cookieSession.js | 115 - .../connect/lib/middleware/csrf.js | 73 - .../connect/lib/middleware/directory.js | 228 - .../connect/lib/middleware/errorHandler.js | 86 - .../connect/lib/middleware/favicon.js | 81 - .../connect/lib/middleware/json.js | 86 - .../connect/lib/middleware/limit.js | 55 - .../connect/lib/middleware/logger.js | 339 - .../connect/lib/middleware/methodOverride.js | 40 - .../connect/lib/middleware/multipart.js | 133 - .../connect/lib/middleware/query.js | 46 - .../connect/lib/middleware/responseTime.js | 32 - .../connect/lib/middleware/session.js | 352 - .../connect/lib/middleware/session/cookie.js | 128 - .../connect/lib/middleware/session/memory.js | 129 - .../connect/lib/middleware/session/session.js | 116 - .../connect/lib/middleware/session/store.js | 84 - .../connect/lib/middleware/static.js | 94 - .../connect/lib/middleware/staticCache.js | 231 - .../connect/lib/middleware/timeout.js | 56 - .../connect/lib/middleware/urlencoded.js | 78 - .../connect/lib/middleware/vhost.js | 40 - .../express/node_modules/connect/lib/patch.js | 79 - .../express/node_modules/connect/lib/proto.js | 239 - .../connect/lib/public/directory.html | 81 - .../connect/lib/public/error.html | 14 - .../connect/lib/public/favicon.ico | Bin 1406 -> 0 bytes .../connect/lib/public/icons/page.png | Bin 635 -> 0 bytes .../connect/lib/public/icons/page_add.png | Bin 739 -> 0 bytes .../connect/lib/public/icons/page_attach.png | Bin 794 -> 0 bytes .../connect/lib/public/icons/page_code.png | Bin 818 -> 0 bytes .../connect/lib/public/icons/page_copy.png | Bin 663 -> 0 bytes .../connect/lib/public/icons/page_delete.png | Bin 740 -> 0 bytes .../connect/lib/public/icons/page_edit.png | Bin 807 -> 0 bytes .../connect/lib/public/icons/page_error.png | Bin 793 -> 0 bytes .../connect/lib/public/icons/page_excel.png | Bin 817 -> 0 bytes .../connect/lib/public/icons/page_find.png | Bin 879 -> 0 bytes .../connect/lib/public/icons/page_gear.png | Bin 833 -> 0 bytes .../connect/lib/public/icons/page_go.png | Bin 779 -> 0 bytes .../connect/lib/public/icons/page_green.png | Bin 621 -> 0 bytes .../connect/lib/public/icons/page_key.png | Bin 801 -> 0 bytes .../lib/public/icons/page_lightning.png | Bin 839 -> 0 bytes .../connect/lib/public/icons/page_link.png | Bin 830 -> 0 bytes .../lib/public/icons/page_paintbrush.png | Bin 813 -> 0 bytes .../connect/lib/public/icons/page_paste.png | Bin 703 -> 0 bytes .../connect/lib/public/icons/page_red.png | Bin 641 -> 0 bytes .../connect/lib/public/icons/page_refresh.png | Bin 858 -> 0 bytes .../connect/lib/public/icons/page_save.png | Bin 774 -> 0 bytes .../connect/lib/public/icons/page_white.png | Bin 294 -> 0 bytes .../lib/public/icons/page_white_acrobat.png | Bin 591 -> 0 bytes .../public/icons/page_white_actionscript.png | Bin 664 -> 0 bytes .../lib/public/icons/page_white_add.png | Bin 512 -> 0 bytes .../connect/lib/public/icons/page_white_c.png | Bin 587 -> 0 bytes .../lib/public/icons/page_white_camera.png | Bin 656 -> 0 bytes .../lib/public/icons/page_white_cd.png | Bin 666 -> 0 bytes .../lib/public/icons/page_white_code.png | Bin 603 -> 0 bytes .../lib/public/icons/page_white_code_red.png | Bin 587 -> 0 bytes .../public/icons/page_white_coldfusion.png | Bin 592 -> 0 bytes .../public/icons/page_white_compressed.png | Bin 724 -> 0 bytes .../lib/public/icons/page_white_copy.png | Bin 309 -> 0 bytes .../lib/public/icons/page_white_cplusplus.png | Bin 621 -> 0 bytes .../lib/public/icons/page_white_csharp.png | Bin 700 -> 0 bytes .../lib/public/icons/page_white_cup.png | Bin 639 -> 0 bytes .../lib/public/icons/page_white_database.png | Bin 579 -> 0 bytes .../lib/public/icons/page_white_delete.png | Bin 536 -> 0 bytes .../lib/public/icons/page_white_dvd.png | Bin 638 -> 0 bytes .../lib/public/icons/page_white_edit.png | Bin 618 -> 0 bytes .../lib/public/icons/page_white_error.png | Bin 623 -> 0 bytes .../lib/public/icons/page_white_excel.png | Bin 663 -> 0 bytes .../lib/public/icons/page_white_find.png | Bin 676 -> 0 bytes .../lib/public/icons/page_white_flash.png | Bin 582 -> 0 bytes .../lib/public/icons/page_white_freehand.png | Bin 639 -> 0 bytes .../lib/public/icons/page_white_gear.png | Bin 402 -> 0 bytes .../lib/public/icons/page_white_get.png | Bin 516 -> 0 bytes .../lib/public/icons/page_white_go.png | Bin 612 -> 0 bytes .../connect/lib/public/icons/page_white_h.png | Bin 603 -> 0 bytes .../public/icons/page_white_horizontal.png | Bin 296 -> 0 bytes .../lib/public/icons/page_white_key.png | Bin 616 -> 0 bytes .../lib/public/icons/page_white_lightning.png | Bin 669 -> 0 bytes .../lib/public/icons/page_white_link.png | Bin 614 -> 0 bytes .../lib/public/icons/page_white_magnify.png | Bin 554 -> 0 bytes .../lib/public/icons/page_white_medal.png | Bin 706 -> 0 bytes .../lib/public/icons/page_white_office.png | Bin 779 -> 0 bytes .../lib/public/icons/page_white_paint.png | Bin 688 -> 0 bytes .../public/icons/page_white_paintbrush.png | Bin 618 -> 0 bytes .../lib/public/icons/page_white_paste.png | Bin 620 -> 0 bytes .../lib/public/icons/page_white_php.png | Bin 538 -> 0 bytes .../lib/public/icons/page_white_picture.png | Bin 650 -> 0 bytes .../public/icons/page_white_powerpoint.png | Bin 588 -> 0 bytes .../lib/public/icons/page_white_put.png | Bin 523 -> 0 bytes .../lib/public/icons/page_white_ruby.png | Bin 626 -> 0 bytes .../lib/public/icons/page_white_stack.png | Bin 317 -> 0 bytes .../lib/public/icons/page_white_star.png | Bin 565 -> 0 bytes .../lib/public/icons/page_white_swoosh.png | Bin 634 -> 0 bytes .../lib/public/icons/page_white_text.png | Bin 342 -> 0 bytes .../public/icons/page_white_text_width.png | Bin 315 -> 0 bytes .../lib/public/icons/page_white_tux.png | Bin 668 -> 0 bytes .../lib/public/icons/page_white_vector.png | Bin 644 -> 0 bytes .../public/icons/page_white_visualstudio.png | Bin 702 -> 0 bytes .../lib/public/icons/page_white_width.png | Bin 309 -> 0 bytes .../lib/public/icons/page_white_word.png | Bin 651 -> 0 bytes .../lib/public/icons/page_white_world.png | Bin 734 -> 0 bytes .../lib/public/icons/page_white_wrench.png | Bin 613 -> 0 bytes .../lib/public/icons/page_white_zip.png | Bin 386 -> 0 bytes .../connect/lib/public/icons/page_word.png | Bin 777 -> 0 bytes .../connect/lib/public/icons/page_world.png | Bin 903 -> 0 bytes .../node_modules/connect/lib/public/style.css | 141 - .../express/node_modules/connect/lib/utils.js | 370 - .../connect/node_modules/bytes/.npmignore | 1 - .../connect/node_modules/bytes/History.md | 5 - .../connect/node_modules/bytes/Makefile | 7 - .../connect/node_modules/bytes/Readme.md | 51 - .../connect/node_modules/bytes/component.json | 7 - .../connect/node_modules/bytes/index.js | 39 - .../connect/node_modules/bytes/package.json | 24 - .../node_modules/formidable/.npmignore | 4 - .../node_modules/formidable/.travis.yml | 4 - .../connect/node_modules/formidable/Makefile | 14 - .../connect/node_modules/formidable/Readme.md | 311 - .../connect/node_modules/formidable/TODO | 3 - .../benchmark/bench-multipart-parser.js | 70 - .../node_modules/formidable/example/post.js | 43 - .../node_modules/formidable/example/upload.js | 48 - .../connect/node_modules/formidable/index.js | 1 - .../node_modules/formidable/lib/file.js | 73 - .../formidable/lib/incoming_form.js | 384 - .../node_modules/formidable/lib/index.js | 3 - .../formidable/lib/multipart_parser.js | 312 - .../formidable/lib/querystring_parser.js | 25 - .../node_modules/formidable/lib/util.js | 6 - .../formidable/node-gently/Makefile | 4 - .../formidable/node-gently/Readme.md | 167 - .../formidable/node-gently/example/dog.js | 22 - .../node-gently/example/event_emitter.js | 11 - .../formidable/node-gently/index.js | 1 - .../node-gently/lib/gently/gently.js | 184 - .../node-gently/lib/gently/index.js | 1 - .../formidable/node-gently/package.json | 14 - .../formidable/node-gently/test/common.js | 8 - .../node-gently/test/simple/test-gently.js | 348 - .../node_modules/formidable/package.json | 27 - .../node_modules/formidable/test/common.js | 19 - .../test/fixture/file/funkyfilename.txt | 1 - .../formidable/test/fixture/file/plain.txt | 1 - .../http/special-chars-in-filename/info.md | 3 - .../formidable/test/fixture/js/no-filename.js | 3 - .../fixture/js/special-chars-in-filename.js | 21 - .../formidable/test/fixture/multipart.js | 72 - .../test/integration/test-fixtures.js | 89 - .../formidable/test/legacy/common.js | 24 - .../integration/test-multipart-parser.js | 80 - .../test/legacy/simple/test-file.js | 104 - .../test/legacy/simple/test-incoming-form.js | 727 - .../legacy/simple/test-multipart-parser.js | 50 - .../legacy/simple/test-querystring-parser.js | 45 - .../legacy/system/test-multi-video-upload.js | 75 - .../node_modules/formidable/test/run.js | 2 - .../test/unit/test-incoming-form.js | 63 - .../node_modules/formidable/tool/record.js | 47 - .../connect/node_modules/pause/.npmignore | 4 - .../connect/node_modules/pause/History.md | 5 - .../connect/node_modules/pause/Makefile | 7 - .../connect/node_modules/pause/Readme.md | 29 - .../connect/node_modules/pause/index.js | 29 - .../connect/node_modules/pause/package.json | 19 - .../connect/node_modules/qs/.gitmodules | 6 - .../connect/node_modules/qs/.npmignore | 1 - .../connect/node_modules/qs/.travis.yml | 4 - .../connect/node_modules/qs/History.md | 83 - .../connect/node_modules/qs/Makefile | 12 - .../connect/node_modules/qs/Readme.md | 58 - .../connect/node_modules/qs/benchmark.js | 17 - .../connect/node_modules/qs/component.json | 6 - .../connect/node_modules/qs/examples.js | 51 - .../connect/node_modules/qs/index.js | 2 - .../connect/node_modules/qs/lib/head.js | 1 - .../node_modules/qs/lib/querystring.js | 262 - .../connect/node_modules/qs/lib/tail.js | 1 - .../connect/node_modules/qs/package.json | 35 - .../connect/node_modules/qs/querystring.js | 254 - .../node_modules/qs/test/browser/expect.js | 1202 - .../node_modules/qs/test/browser/index.html | 18 - .../node_modules/qs/test/browser/jquery.js | 8981 ----- .../node_modules/qs/test/browser/mocha.css | 163 - .../node_modules/qs/test/browser/mocha.js | 4201 --- .../node_modules/qs/test/browser/qs.css | 0 .../node_modules/qs/test/browser/qs.js | 351 - .../connect/node_modules/qs/test/parse.js | 147 - .../connect/node_modules/qs/test/stringify.js | 73 - .../express/node_modules/connect/package.json | 49 - .../express/node_modules/connect/test.js | 7 - .../node_modules/cookie-signature/.npmignore | 4 - .../node_modules/cookie-signature/History.md | 5 - .../node_modules/cookie-signature/Makefile | 7 - .../node_modules/cookie-signature/Readme.md | 42 - .../node_modules/cookie-signature/index.js | 42 - .../cookie-signature/package.json | 23 - .../express/node_modules/cookie/.npmignore | 1 - .../express/node_modules/cookie/.travis.yml | 4 - .../express/node_modules/cookie/README.md | 44 - .../express/node_modules/cookie/index.js | 61 - .../express/node_modules/cookie/package.json | 32 - .../node_modules/cookie/test/mocha.opts | 1 - .../express/node_modules/cookie/test/parse.js | 28 - .../node_modules/cookie/test/serialize.js | 59 - .../express/node_modules/debug/.npmignore | 4 - .../express/node_modules/debug/History.md | 47 - .../express/node_modules/debug/Makefile | 4 - .../express/node_modules/debug/Readme.md | 130 - .../node_modules/debug/debug.component.js | 120 - .../express/node_modules/debug/debug.js | 116 - .../express/node_modules/debug/example/app.js | 19 - .../node_modules/debug/example/browser.html | 24 - .../node_modules/debug/example/wildcards.js | 10 - .../node_modules/debug/example/worker.js | 22 - .../express/node_modules/debug/head.js | 1 - .../express/node_modules/debug/index.js | 2 - .../express/node_modules/debug/lib/debug.js | 135 - .../express/node_modules/debug/package.json | 31 - .../express/node_modules/debug/tail.js | 4 - .../express/node_modules/fresh/.npmignore | 1 - .../express/node_modules/fresh/Makefile | 7 - .../express/node_modules/fresh/Readme.md | 32 - .../express/node_modules/fresh/index.js | 49 - .../express/node_modules/fresh/package.json | 19 - .../express/node_modules/methods/index.js | 26 - .../express/node_modules/methods/package.json | 20 - .../node_modules/mkdirp/.gitignore.orig | 2 - .../node_modules/mkdirp/.gitignore.rej | 5 - .../express/node_modules/mkdirp/.npmignore | 2 - .../express/node_modules/mkdirp/.travis.yml | 4 - .../express/node_modules/mkdirp/LICENSE | 21 - .../node_modules/mkdirp/README.markdown | 61 - .../node_modules/mkdirp/examples/pow.js | 6 - .../node_modules/mkdirp/examples/pow.js.orig | 6 - .../node_modules/mkdirp/examples/pow.js.rej | 19 - .../express/node_modules/mkdirp/index.js | 94 - .../express/node_modules/mkdirp/package.json | 32 - .../express/node_modules/mkdirp/test/chmod.js | 38 - .../node_modules/mkdirp/test/clobber.js | 37 - .../node_modules/mkdirp/test/mkdirp.js | 28 - .../express/node_modules/mkdirp/test/perm.js | 32 - .../node_modules/mkdirp/test/perm_sync.js | 39 - .../express/node_modules/mkdirp/test/race.js | 41 - .../express/node_modules/mkdirp/test/rel.js | 32 - .../node_modules/mkdirp/test/return.js | 25 - .../node_modules/mkdirp/test/return_sync.js | 24 - .../express/node_modules/mkdirp/test/root.js | 18 - .../express/node_modules/mkdirp/test/sync.js | 32 - .../express/node_modules/mkdirp/test/umask.js | 28 - .../node_modules/mkdirp/test/umask_sync.js | 32 - .../node_modules/range-parser/.npmignore | 1 - .../node_modules/range-parser/History.md | 15 - .../node_modules/range-parser/Makefile | 7 - .../node_modules/range-parser/Readme.md | 28 - .../node_modules/range-parser/index.js | 49 - .../node_modules/range-parser/package.json | 19 - .../express/node_modules/send/.npmignore | 4 - .../express/node_modules/send/History.md | 25 - .../express/node_modules/send/Makefile | 8 - .../express/node_modules/send/Readme.md | 123 - .../express/node_modules/send/index.js | 2 - .../express/node_modules/send/lib/send.js | 473 - .../express/node_modules/send/lib/utils.js | 47 - .../send/node_modules/mime/LICENSE | 19 - .../send/node_modules/mime/README.md | 63 - .../send/node_modules/mime/mime.js | 104 - .../send/node_modules/mime/package.json | 31 - .../send/node_modules/mime/test.js | 55 - .../send/node_modules/mime/types/mime.types | 1510 - .../send/node_modules/mime/types/node.types | 65 - .../express/node_modules/send/package.json | 33 - node_modules/express/package.json | 83 - node_modules/express/test.js | 14 - node_modules/jade/.npmignore | 14 - node_modules/jade/LICENSE | 22 - node_modules/jade/Readme.md | 1298 - node_modules/jade/Readme_zh-cn.md | 921 - node_modules/jade/bin/jade | 168 - node_modules/jade/index.js | 4 - node_modules/jade/jade.js | 3654 -- node_modules/jade/jade.md | 510 - node_modules/jade/jade.min.js | 2 - node_modules/jade/lib/compiler.js | 655 - node_modules/jade/lib/doctypes.js | 18 - node_modules/jade/lib/filters.js | 105 - node_modules/jade/lib/inline-tags.js | 28 - node_modules/jade/lib/jade.js | 253 - node_modules/jade/lib/lexer.js | 775 - node_modules/jade/lib/nodes/attrs.js | 77 - node_modules/jade/lib/nodes/block-comment.js | 33 - node_modules/jade/lib/nodes/block.js | 122 - node_modules/jade/lib/nodes/case.js | 43 - node_modules/jade/lib/nodes/code.js | 35 - node_modules/jade/lib/nodes/comment.js | 32 - node_modules/jade/lib/nodes/doctype.js | 29 - node_modules/jade/lib/nodes/each.js | 35 - node_modules/jade/lib/nodes/filter.js | 34 - node_modules/jade/lib/nodes/index.js | 20 - node_modules/jade/lib/nodes/literal.js | 32 - node_modules/jade/lib/nodes/mixin.js | 36 - node_modules/jade/lib/nodes/node.js | 25 - node_modules/jade/lib/nodes/tag.js | 95 - node_modules/jade/lib/nodes/text.js | 36 - node_modules/jade/lib/parser.js | 699 - node_modules/jade/lib/runtime.js | 174 - node_modules/jade/lib/self-closing.js | 19 - node_modules/jade/lib/utils.js | 68 - node_modules/jade/node_modules/.bin/cake | 7 - node_modules/jade/node_modules/.bin/coffee | 7 - .../node_modules/coffee-script/.npmignore | 11 - .../jade/node_modules/coffee-script/CNAME | 1 - .../coffee-script/CONTRIBUTING.md | 9 - .../jade/node_modules/coffee-script/LICENSE | 22 - .../jade/node_modules/coffee-script/README | 51 - .../jade/node_modules/coffee-script/Rakefile | 78 - .../jade/node_modules/coffee-script/bin/cake | 7 - .../node_modules/coffee-script/bin/coffee | 7 - .../coffee-script/extras/jsl.conf | 44 - .../lib/coffee-script/browser.js | 92 - .../coffee-script/lib/coffee-script/cake.js | 113 - .../lib/coffee-script/coffee-script.js | 171 - .../lib/coffee-script/command.js | 502 - .../lib/coffee-script/grammar.js | 606 - .../lib/coffee-script/helpers.js | 88 - .../coffee-script/lib/coffee-script/index.js | 11 - .../coffee-script/lib/coffee-script/lexer.js | 788 - .../coffee-script/lib/coffee-script/nodes.js | 2971 -- .../lib/coffee-script/optparse.js | 138 - .../coffee-script/lib/coffee-script/parser.js | 683 - .../coffee-script/lib/coffee-script/repl.js | 276 - .../lib/coffee-script/rewriter.js | 349 - .../coffee-script/lib/coffee-script/scope.js | 146 - .../node_modules/coffee-script/package.json | 50 - .../jade/node_modules/commander/.npmignore | 4 - .../jade/node_modules/commander/.travis.yml | 4 - .../jade/node_modules/commander/History.md | 107 - .../jade/node_modules/commander/Makefile | 7 - .../jade/node_modules/commander/Readme.md | 262 - .../jade/node_modules/commander/index.js | 2 - .../node_modules/commander/lib/commander.js | 1026 - .../jade/node_modules/commander/package.json | 34 - .../jade/node_modules/mkdirp/.npmignore | 2 - .../jade/node_modules/mkdirp/.travis.yml | 4 - node_modules/jade/node_modules/mkdirp/LICENSE | 21 - .../jade/node_modules/mkdirp/README.markdown | 61 - .../jade/node_modules/mkdirp/examples/pow.js | 6 - .../jade/node_modules/mkdirp/index.js | 82 - .../jade/node_modules/mkdirp/package.json | 35 - .../jade/node_modules/mkdirp/test/chmod.js | 38 - .../jade/node_modules/mkdirp/test/clobber.js | 37 - .../jade/node_modules/mkdirp/test/mkdirp.js | 28 - .../jade/node_modules/mkdirp/test/perm.js | 32 - .../node_modules/mkdirp/test/perm_sync.js | 39 - .../jade/node_modules/mkdirp/test/race.js | 41 - .../jade/node_modules/mkdirp/test/rel.js | 32 - .../jade/node_modules/mkdirp/test/return.js | 25 - .../node_modules/mkdirp/test/return_sync.js | 24 - .../jade/node_modules/mkdirp/test/root.js | 18 - .../jade/node_modules/mkdirp/test/sync.js | 32 - .../jade/node_modules/mkdirp/test/umask.js | 28 - .../node_modules/mkdirp/test/umask_sync.js | 32 - node_modules/jade/package.json | 48 - node_modules/jade/runtime.js | 179 - node_modules/jade/runtime.min.js | 1 - node_modules/jade/testing/index.html | 5 - node_modules/jade/testing/index.jade | 4 - node_modules/jade/testing/layout.html | 1 - node_modules/jade/testing/layout.jade | 6 - node_modules/jade/testing/mobile.html | 0 node_modules/jade/testing/mobile.jade | 0 .../jade/testing/nested/something.html | 1 - .../jade/testing/nested/something.jade | 1 - node_modules/jade/testing/some.js | 4 - node_modules/jade/testing/test.md | 5 - node_modules/jsdom/.travis.yml | 3 - node_modules/jsdom/LICENSE.txt | 22 - node_modules/jsdom/README.md | 310 - node_modules/jsdom/lib/jsdom.js | 368 - .../lib/jsdom/browser/documentfeatures.js | 52 - .../jsdom/lib/jsdom/browser/domtohtml.js | 173 - .../jsdom/lib/jsdom/browser/htmlencoding.js | 1506 - .../jsdom/lib/jsdom/browser/htmltodom.js | 187 - node_modules/jsdom/lib/jsdom/browser/index.js | 653 - node_modules/jsdom/lib/jsdom/level1/core.js | 1769 - node_modules/jsdom/lib/jsdom/level2/core.js | 643 - node_modules/jsdom/lib/jsdom/level2/events.js | 411 - node_modules/jsdom/lib/jsdom/level2/html.js | 1812 - node_modules/jsdom/lib/jsdom/level2/index.js | 7 - .../lib/jsdom/level2/languages/javascript.js | 13 - node_modules/jsdom/lib/jsdom/level2/style.js | 259 - node_modules/jsdom/lib/jsdom/level3/core.js | 644 - node_modules/jsdom/lib/jsdom/level3/events.js | 299 - node_modules/jsdom/lib/jsdom/level3/html.js | 9 - node_modules/jsdom/lib/jsdom/level3/index.js | 10 - node_modules/jsdom/lib/jsdom/level3/ls.js | 221 - node_modules/jsdom/lib/jsdom/level3/xpath.js | 1859 -- .../jsdom/lib/jsdom/selectors/index.js | 37 - node_modules/jsdom/lib/jsdom/utils.js | 27 - .../jsdom/node_modules/contextify/.npmignore | 12 - .../jsdom/node_modules/contextify/LICENSE.txt | 22 - .../jsdom/node_modules/contextify/README.md | 102 - .../jsdom/node_modules/contextify/binding.gyp | 8 - .../node_modules/contextify/build/Makefile | 359 - .../Release/.deps/Release/contextify.node.d | 1 - .../obj.target/contextify/src/contextify.o.d | 29 - .../contextify/build/Release/contextify.node | Bin 27164 -> 0 bytes .../contextify/build/Release/linker.lock | 0 .../obj.target/contextify/src/contextify.o | Bin 117640 -> 0 bytes .../contextify/build/binding.Makefile | 6 - .../node_modules/contextify/build/config.gypi | 101 - .../contextify/build/contextify.target.mk | 135 - .../contextify/build/gyp-mac-tool | 210 - .../jsdom/node_modules/contextify/changelog | 40 - .../node_modules/contextify/lib/contextify.js | 30 - .../node_modules/bindings/README.md | 97 - .../node_modules/bindings/bindings.js | 151 - .../node_modules/bindings/package.json | 30 - .../node_modules/contextify/package.json | 51 - .../node_modules/contextify/src/contextify.cc | 218 - .../contextify/test/contextify.js | 461 - .../jsdom/node_modules/contextify/wscript | 18 - .../jsdom/node_modules/cssom/.gitmodules | 6 - .../jsdom/node_modules/cssom/.npmignore | 7 - .../jsdom/node_modules/cssom/README.mdown | 34 - .../node_modules/cssom/lib/CSSFontFaceRule.js | 34 - .../node_modules/cssom/lib/CSSImportRule.js | 131 - .../node_modules/cssom/lib/CSSKeyframeRule.js | 35 - .../cssom/lib/CSSKeyframesRule.js | 37 - .../node_modules/cssom/lib/CSSMediaRule.js | 39 - .../jsdom/node_modules/cssom/lib/CSSRule.js | 39 - .../cssom/lib/CSSStyleDeclaration.js | 148 - .../node_modules/cssom/lib/CSSStyleRule.js | 189 - .../node_modules/cssom/lib/CSSStyleSheet.js | 87 - .../jsdom/node_modules/cssom/lib/MediaList.js | 61 - .../node_modules/cssom/lib/StyleSheet.js | 17 - .../jsdom/node_modules/cssom/lib/clone.js | 76 - .../jsdom/node_modules/cssom/lib/index.js | 15 - .../jsdom/node_modules/cssom/lib/parse.js | 338 - .../jsdom/node_modules/cssom/package.json | 48 - .../jsdom/node_modules/cssstyle/.npmignore | 1 - .../jsdom/node_modules/cssstyle/README.md | 9 - .../cssstyle/lib/CSSStyleDeclaration.js | 972 - .../lib/properties/alignmentBaseline.js | 11 - .../cssstyle/lib/properties/azimuth.js | 11 - .../cssstyle/lib/properties/background.js | 11 - .../lib/properties/backgroundAttachment.js | 11 - .../cssstyle/lib/properties/backgroundClip.js | 11 - .../lib/properties/backgroundColor.js | 11 - .../lib/properties/backgroundImage.js | 11 - .../lib/properties/backgroundOrigin.js | 11 - .../lib/properties/backgroundPosition.js | 11 - .../lib/properties/backgroundPositionX.js | 11 - .../lib/properties/backgroundPositionY.js | 11 - .../lib/properties/backgroundRepeat.js | 11 - .../lib/properties/backgroundRepeatX.js | 11 - .../lib/properties/backgroundRepeatY.js | 11 - .../cssstyle/lib/properties/backgroundSize.js | 11 - .../cssstyle/lib/properties/baselineShift.js | 11 - .../cssstyle/lib/properties/border.js | 11 - .../cssstyle/lib/properties/borderBottom.js | 11 - .../lib/properties/borderBottomColor.js | 11 - .../lib/properties/borderBottomLeftRadius.js | 11 - .../lib/properties/borderBottomRightRadius.js | 11 - .../lib/properties/borderBottomStyle.js | 11 - .../lib/properties/borderBottomWidth.js | 11 - .../cssstyle/lib/properties/borderCollapse.js | 11 - .../cssstyle/lib/properties/borderColor.js | 11 - .../cssstyle/lib/properties/borderImage.js | 11 - .../lib/properties/borderImageOutset.js | 11 - .../lib/properties/borderImageRepeat.js | 11 - .../lib/properties/borderImageSlice.js | 11 - .../lib/properties/borderImageSource.js | 11 - .../lib/properties/borderImageWidth.js | 11 - .../cssstyle/lib/properties/borderLeft.js | 11 - .../lib/properties/borderLeftColor.js | 11 - .../lib/properties/borderLeftStyle.js | 11 - .../lib/properties/borderLeftWidth.js | 11 - .../cssstyle/lib/properties/borderRadius.js | 11 - .../cssstyle/lib/properties/borderRight.js | 11 - .../lib/properties/borderRightColor.js | 11 - .../lib/properties/borderRightStyle.js | 11 - .../lib/properties/borderRightWidth.js | 11 - .../cssstyle/lib/properties/borderSpacing.js | 11 - .../cssstyle/lib/properties/borderStyle.js | 11 - .../cssstyle/lib/properties/borderTop.js | 11 - .../cssstyle/lib/properties/borderTopColor.js | 11 - .../lib/properties/borderTopLeftRadius.js | 11 - .../lib/properties/borderTopRightRadius.js | 11 - .../cssstyle/lib/properties/borderTopStyle.js | 11 - .../cssstyle/lib/properties/borderTopWidth.js | 11 - .../cssstyle/lib/properties/borderWidth.js | 11 - .../cssstyle/lib/properties/bottom.js | 11 - .../cssstyle/lib/properties/boxShadow.js | 11 - .../cssstyle/lib/properties/boxSizing.js | 11 - .../cssstyle/lib/properties/captionSide.js | 11 - .../cssstyle/lib/properties/clear.js | 11 - .../cssstyle/lib/properties/clip.js | 11 - .../cssstyle/lib/properties/clipPath.js | 11 - .../cssstyle/lib/properties/clipRule.js | 11 - .../cssstyle/lib/properties/color.js | 11 - .../lib/properties/colorInterpolation.js | 11 - .../properties/colorInterpolationFilters.js | 11 - .../cssstyle/lib/properties/colorProfile.js | 11 - .../cssstyle/lib/properties/colorRendering.js | 11 - .../cssstyle/lib/properties/content.js | 11 - .../lib/properties/counterIncrement.js | 11 - .../cssstyle/lib/properties/counterReset.js | 11 - .../cssstyle/lib/properties/cssFloat.js | 11 - .../cssstyle/lib/properties/cue.js | 11 - .../cssstyle/lib/properties/cueAfter.js | 11 - .../cssstyle/lib/properties/cueBefore.js | 11 - .../cssstyle/lib/properties/cursor.js | 11 - .../cssstyle/lib/properties/direction.js | 11 - .../cssstyle/lib/properties/display.js | 11 - .../lib/properties/dominantBaseline.js | 11 - .../cssstyle/lib/properties/elevation.js | 11 - .../cssstyle/lib/properties/emptyCells.js | 11 - .../lib/properties/enableBackground.js | 11 - .../cssstyle/lib/properties/fill.js | 11 - .../cssstyle/lib/properties/fillOpacity.js | 11 - .../cssstyle/lib/properties/fillRule.js | 11 - .../cssstyle/lib/properties/filter.js | 11 - .../cssstyle/lib/properties/floodColor.js | 11 - .../cssstyle/lib/properties/floodOpacity.js | 11 - .../cssstyle/lib/properties/font.js | 11 - .../cssstyle/lib/properties/fontFamily.js | 11 - .../cssstyle/lib/properties/fontSize.js | 11 - .../cssstyle/lib/properties/fontSizeAdjust.js | 11 - .../cssstyle/lib/properties/fontStretch.js | 11 - .../cssstyle/lib/properties/fontStyle.js | 11 - .../cssstyle/lib/properties/fontVariant.js | 11 - .../cssstyle/lib/properties/fontWeight.js | 11 - .../properties/glyphOrientationHorizontal.js | 11 - .../properties/glyphOrientationVertical.js | 11 - .../cssstyle/lib/properties/height.js | 11 - .../cssstyle/lib/properties/imageRendering.js | 11 - .../cssstyle/lib/properties/kerning.js | 11 - .../cssstyle/lib/properties/left.js | 11 - .../cssstyle/lib/properties/letterSpacing.js | 11 - .../cssstyle/lib/properties/lightingColor.js | 11 - .../cssstyle/lib/properties/lineHeight.js | 11 - .../cssstyle/lib/properties/listStyle.js | 11 - .../cssstyle/lib/properties/listStyleImage.js | 11 - .../lib/properties/listStylePosition.js | 11 - .../cssstyle/lib/properties/listStyleType.js | 11 - .../cssstyle/lib/properties/margin.js | 11 - .../cssstyle/lib/properties/marginBottom.js | 11 - .../cssstyle/lib/properties/marginLeft.js | 11 - .../cssstyle/lib/properties/marginRight.js | 11 - .../cssstyle/lib/properties/marginTop.js | 11 - .../cssstyle/lib/properties/marker.js | 11 - .../cssstyle/lib/properties/markerEnd.js | 11 - .../cssstyle/lib/properties/markerMid.js | 11 - .../cssstyle/lib/properties/markerOffset.js | 11 - .../cssstyle/lib/properties/markerStart.js | 11 - .../cssstyle/lib/properties/marks.js | 11 - .../cssstyle/lib/properties/mask.js | 11 - .../cssstyle/lib/properties/maxHeight.js | 11 - .../cssstyle/lib/properties/maxWidth.js | 11 - .../cssstyle/lib/properties/minHeight.js | 11 - .../cssstyle/lib/properties/minWidth.js | 11 - .../cssstyle/lib/properties/opacity.js | 11 - .../cssstyle/lib/properties/orphans.js | 11 - .../cssstyle/lib/properties/outline.js | 11 - .../cssstyle/lib/properties/outlineColor.js | 11 - .../cssstyle/lib/properties/outlineOffset.js | 11 - .../cssstyle/lib/properties/outlineStyle.js | 11 - .../cssstyle/lib/properties/outlineWidth.js | 11 - .../cssstyle/lib/properties/overflow.js | 11 - .../cssstyle/lib/properties/overflowX.js | 11 - .../cssstyle/lib/properties/overflowY.js | 11 - .../cssstyle/lib/properties/padding.js | 11 - .../cssstyle/lib/properties/paddingBottom.js | 11 - .../cssstyle/lib/properties/paddingLeft.js | 11 - .../cssstyle/lib/properties/paddingRight.js | 11 - .../cssstyle/lib/properties/paddingTop.js | 11 - .../cssstyle/lib/properties/page.js | 11 - .../cssstyle/lib/properties/pageBreakAfter.js | 11 - .../lib/properties/pageBreakBefore.js | 11 - .../lib/properties/pageBreakInside.js | 11 - .../cssstyle/lib/properties/pause.js | 11 - .../cssstyle/lib/properties/pauseAfter.js | 11 - .../cssstyle/lib/properties/pauseBefore.js | 11 - .../cssstyle/lib/properties/pitch.js | 11 - .../cssstyle/lib/properties/pitchRange.js | 11 - .../cssstyle/lib/properties/playDuring.js | 11 - .../cssstyle/lib/properties/pointerEvents.js | 11 - .../cssstyle/lib/properties/position.js | 11 - .../cssstyle/lib/properties/quotes.js | 11 - .../cssstyle/lib/properties/resize.js | 11 - .../cssstyle/lib/properties/richness.js | 11 - .../cssstyle/lib/properties/right.js | 11 - .../cssstyle/lib/properties/shapeRendering.js | 11 - .../cssstyle/lib/properties/size.js | 11 - .../cssstyle/lib/properties/speak.js | 11 - .../cssstyle/lib/properties/speakHeader.js | 11 - .../cssstyle/lib/properties/speakNumeral.js | 11 - .../lib/properties/speakPunctuation.js | 11 - .../cssstyle/lib/properties/speechRate.js | 11 - .../cssstyle/lib/properties/src.js | 11 - .../cssstyle/lib/properties/stopColor.js | 11 - .../cssstyle/lib/properties/stopOpacity.js | 11 - .../cssstyle/lib/properties/stress.js | 11 - .../cssstyle/lib/properties/stroke.js | 11 - .../lib/properties/strokeDasharray.js | 11 - .../lib/properties/strokeDashoffset.js | 11 - .../cssstyle/lib/properties/strokeLinecap.js | 11 - .../cssstyle/lib/properties/strokeLinejoin.js | 11 - .../lib/properties/strokeMiterlimit.js | 11 - .../cssstyle/lib/properties/strokeOpacity.js | 11 - .../cssstyle/lib/properties/strokeWidth.js | 11 - .../cssstyle/lib/properties/tableLayout.js | 11 - .../cssstyle/lib/properties/textAlign.js | 11 - .../cssstyle/lib/properties/textAnchor.js | 11 - .../cssstyle/lib/properties/textDecoration.js | 11 - .../cssstyle/lib/properties/textIndent.js | 11 - .../lib/properties/textLineThrough.js | 11 - .../lib/properties/textLineThroughColor.js | 11 - .../lib/properties/textLineThroughMode.js | 11 - .../lib/properties/textLineThroughStyle.js | 11 - .../lib/properties/textLineThroughWidth.js | 11 - .../cssstyle/lib/properties/textOverflow.js | 11 - .../cssstyle/lib/properties/textOverline.js | 11 - .../lib/properties/textOverlineColor.js | 11 - .../lib/properties/textOverlineMode.js | 11 - .../lib/properties/textOverlineStyle.js | 11 - .../lib/properties/textOverlineWidth.js | 11 - .../cssstyle/lib/properties/textRendering.js | 11 - .../cssstyle/lib/properties/textShadow.js | 11 - .../cssstyle/lib/properties/textTransform.js | 11 - .../cssstyle/lib/properties/textUnderline.js | 11 - .../lib/properties/textUnderlineColor.js | 11 - .../lib/properties/textUnderlineMode.js | 11 - .../lib/properties/textUnderlineStyle.js | 11 - .../lib/properties/textUnderlineWidth.js | 11 - .../cssstyle/lib/properties/top.js | 11 - .../cssstyle/lib/properties/unicodeBidi.js | 11 - .../cssstyle/lib/properties/unicodeRange.js | 11 - .../cssstyle/lib/properties/vectorEffect.js | 11 - .../cssstyle/lib/properties/verticalAlign.js | 11 - .../cssstyle/lib/properties/visibility.js | 11 - .../cssstyle/lib/properties/voiceFamily.js | 11 - .../cssstyle/lib/properties/volume.js | 11 - .../lib/properties/webkitAnimation.js | 11 - .../lib/properties/webkitAnimationDelay.js | 11 - .../properties/webkitAnimationDirection.js | 11 - .../lib/properties/webkitAnimationDuration.js | 11 - .../lib/properties/webkitAnimationFillMode.js | 11 - .../webkitAnimationIterationCount.js | 11 - .../lib/properties/webkitAnimationName.js | 11 - .../properties/webkitAnimationPlayState.js | 11 - .../webkitAnimationTimingFunction.js | 11 - .../lib/properties/webkitAppearance.js | 11 - .../lib/properties/webkitAspectRatio.js | 11 - .../properties/webkitBackfaceVisibility.js | 11 - .../lib/properties/webkitBackgroundClip.js | 11 - .../properties/webkitBackgroundComposite.js | 11 - .../lib/properties/webkitBackgroundOrigin.js | 11 - .../lib/properties/webkitBackgroundSize.js | 11 - .../lib/properties/webkitBorderAfter.js | 11 - .../lib/properties/webkitBorderAfterColor.js | 11 - .../lib/properties/webkitBorderAfterStyle.js | 11 - .../lib/properties/webkitBorderAfterWidth.js | 11 - .../lib/properties/webkitBorderBefore.js | 11 - .../lib/properties/webkitBorderBeforeColor.js | 11 - .../lib/properties/webkitBorderBeforeStyle.js | 11 - .../lib/properties/webkitBorderBeforeWidth.js | 11 - .../lib/properties/webkitBorderEnd.js | 11 - .../lib/properties/webkitBorderEndColor.js | 11 - .../lib/properties/webkitBorderEndStyle.js | 11 - .../lib/properties/webkitBorderEndWidth.js | 11 - .../lib/properties/webkitBorderFit.js | 11 - .../webkitBorderHorizontalSpacing.js | 11 - .../lib/properties/webkitBorderImage.js | 11 - .../lib/properties/webkitBorderRadius.js | 11 - .../lib/properties/webkitBorderStart.js | 11 - .../lib/properties/webkitBorderStartColor.js | 11 - .../lib/properties/webkitBorderStartStyle.js | 11 - .../lib/properties/webkitBorderStartWidth.js | 11 - .../properties/webkitBorderVerticalSpacing.js | 11 - .../cssstyle/lib/properties/webkitBoxAlign.js | 11 - .../lib/properties/webkitBoxDirection.js | 11 - .../cssstyle/lib/properties/webkitBoxFlex.js | 11 - .../lib/properties/webkitBoxFlexGroup.js | 11 - .../cssstyle/lib/properties/webkitBoxLines.js | 11 - .../lib/properties/webkitBoxOrdinalGroup.js | 11 - .../lib/properties/webkitBoxOrient.js | 11 - .../cssstyle/lib/properties/webkitBoxPack.js | 11 - .../lib/properties/webkitBoxReflect.js | 11 - .../lib/properties/webkitBoxShadow.js | 11 - .../lib/properties/webkitColorCorrection.js | 11 - .../lib/properties/webkitColumnAxis.js | 11 - .../lib/properties/webkitColumnBreakAfter.js | 11 - .../lib/properties/webkitColumnBreakBefore.js | 11 - .../lib/properties/webkitColumnBreakInside.js | 11 - .../lib/properties/webkitColumnCount.js | 11 - .../lib/properties/webkitColumnGap.js | 11 - .../lib/properties/webkitColumnRule.js | 11 - .../lib/properties/webkitColumnRuleColor.js | 11 - .../lib/properties/webkitColumnRuleStyle.js | 11 - .../lib/properties/webkitColumnRuleWidth.js | 11 - .../lib/properties/webkitColumnSpan.js | 11 - .../lib/properties/webkitColumnWidth.js | 11 - .../cssstyle/lib/properties/webkitColumns.js | 11 - .../cssstyle/lib/properties/webkitFilter.js | 11 - .../lib/properties/webkitFlexAlign.js | 11 - .../lib/properties/webkitFlexDirection.js | 11 - .../cssstyle/lib/properties/webkitFlexFlow.js | 11 - .../lib/properties/webkitFlexItemAlign.js | 11 - .../lib/properties/webkitFlexLinePack.js | 11 - .../lib/properties/webkitFlexOrder.js | 11 - .../cssstyle/lib/properties/webkitFlexPack.js | 11 - .../cssstyle/lib/properties/webkitFlexWrap.js | 11 - .../cssstyle/lib/properties/webkitFlowFrom.js | 11 - .../cssstyle/lib/properties/webkitFlowInto.js | 11 - .../properties/webkitFontFeatureSettings.js | 11 - .../lib/properties/webkitFontKerning.js | 11 - .../lib/properties/webkitFontSizeDelta.js | 11 - .../lib/properties/webkitFontSmoothing.js | 11 - .../properties/webkitFontVariantLigatures.js | 11 - .../lib/properties/webkitHighlight.js | 11 - .../properties/webkitHyphenateCharacter.js | 11 - .../properties/webkitHyphenateLimitAfter.js | 11 - .../properties/webkitHyphenateLimitBefore.js | 11 - .../properties/webkitHyphenateLimitLines.js | 11 - .../cssstyle/lib/properties/webkitHyphens.js | 11 - .../lib/properties/webkitLineAlign.js | 11 - .../lib/properties/webkitLineBoxContain.js | 11 - .../lib/properties/webkitLineBreak.js | 11 - .../lib/properties/webkitLineClamp.js | 11 - .../cssstyle/lib/properties/webkitLineGrid.js | 11 - .../cssstyle/lib/properties/webkitLineSnap.js | 11 - .../cssstyle/lib/properties/webkitLocale.js | 11 - .../lib/properties/webkitLogicalHeight.js | 11 - .../lib/properties/webkitLogicalWidth.js | 11 - .../lib/properties/webkitMarginAfter.js | 11 - .../properties/webkitMarginAfterCollapse.js | 11 - .../lib/properties/webkitMarginBefore.js | 11 - .../properties/webkitMarginBeforeCollapse.js | 11 - .../properties/webkitMarginBottomCollapse.js | 11 - .../lib/properties/webkitMarginCollapse.js | 11 - .../lib/properties/webkitMarginEnd.js | 11 - .../lib/properties/webkitMarginStart.js | 11 - .../lib/properties/webkitMarginTopCollapse.js | 11 - .../cssstyle/lib/properties/webkitMarquee.js | 11 - .../lib/properties/webkitMarqueeDirection.js | 11 - .../lib/properties/webkitMarqueeIncrement.js | 11 - .../lib/properties/webkitMarqueeRepetition.js | 11 - .../lib/properties/webkitMarqueeSpeed.js | 11 - .../lib/properties/webkitMarqueeStyle.js | 11 - .../cssstyle/lib/properties/webkitMask.js | 11 - .../lib/properties/webkitMaskAttachment.js | 11 - .../lib/properties/webkitMaskBoxImage.js | 11 - .../properties/webkitMaskBoxImageOutset.js | 11 - .../properties/webkitMaskBoxImageRepeat.js | 11 - .../lib/properties/webkitMaskBoxImageSlice.js | 11 - .../properties/webkitMaskBoxImageSource.js | 11 - .../lib/properties/webkitMaskBoxImageWidth.js | 11 - .../cssstyle/lib/properties/webkitMaskClip.js | 11 - .../lib/properties/webkitMaskComposite.js | 11 - .../lib/properties/webkitMaskImage.js | 11 - .../lib/properties/webkitMaskOrigin.js | 11 - .../lib/properties/webkitMaskPosition.js | 11 - .../lib/properties/webkitMaskPositionX.js | 11 - .../lib/properties/webkitMaskPositionY.js | 11 - .../lib/properties/webkitMaskRepeat.js | 11 - .../lib/properties/webkitMaskRepeatX.js | 11 - .../lib/properties/webkitMaskRepeatY.js | 11 - .../cssstyle/lib/properties/webkitMaskSize.js | 11 - .../webkitMatchNearestMailBlockquoteColor.js | 11 - .../lib/properties/webkitMaxLogicalHeight.js | 11 - .../lib/properties/webkitMaxLogicalWidth.js | 11 - .../lib/properties/webkitMinLogicalHeight.js | 11 - .../lib/properties/webkitMinLogicalWidth.js | 11 - .../cssstyle/lib/properties/webkitNbspMode.js | 11 - .../lib/properties/webkitOverflowScrolling.js | 11 - .../lib/properties/webkitPaddingAfter.js | 11 - .../lib/properties/webkitPaddingBefore.js | 11 - .../lib/properties/webkitPaddingEnd.js | 11 - .../lib/properties/webkitPaddingStart.js | 11 - .../lib/properties/webkitPerspective.js | 11 - .../lib/properties/webkitPerspectiveOrigin.js | 11 - .../properties/webkitPerspectiveOriginX.js | 11 - .../properties/webkitPerspectiveOriginY.js | 11 - .../lib/properties/webkitPrintColorAdjust.js | 11 - .../lib/properties/webkitRegionBreakAfter.js | 11 - .../lib/properties/webkitRegionBreakBefore.js | 11 - .../lib/properties/webkitRegionBreakInside.js | 11 - .../lib/properties/webkitRegionOverflow.js | 11 - .../lib/properties/webkitRtlOrdering.js | 11 - .../lib/properties/webkitSvgShadow.js | 11 - .../lib/properties/webkitTapHighlightColor.js | 11 - .../lib/properties/webkitTextCombine.js | 11 - .../webkitTextDecorationsInEffect.js | 11 - .../lib/properties/webkitTextEmphasis.js | 11 - .../lib/properties/webkitTextEmphasisColor.js | 11 - .../properties/webkitTextEmphasisPosition.js | 11 - .../lib/properties/webkitTextEmphasisStyle.js | 11 - .../lib/properties/webkitTextFillColor.js | 11 - .../lib/properties/webkitTextOrientation.js | 11 - .../lib/properties/webkitTextSecurity.js | 11 - .../lib/properties/webkitTextSizeAdjust.js | 11 - .../lib/properties/webkitTextStroke.js | 11 - .../lib/properties/webkitTextStrokeColor.js | 11 - .../lib/properties/webkitTextStrokeWidth.js | 11 - .../lib/properties/webkitTransform.js | 11 - .../lib/properties/webkitTransformOrigin.js | 11 - .../lib/properties/webkitTransformOriginX.js | 11 - .../lib/properties/webkitTransformOriginY.js | 11 - .../lib/properties/webkitTransformOriginZ.js | 11 - .../lib/properties/webkitTransformStyle.js | 11 - .../lib/properties/webkitTransition.js | 11 - .../lib/properties/webkitTransitionDelay.js | 11 - .../properties/webkitTransitionDuration.js | 11 - .../properties/webkitTransitionProperty.js | 11 - .../webkitTransitionTimingFunction.js | 11 - .../cssstyle/lib/properties/webkitUserDrag.js | 11 - .../lib/properties/webkitUserModify.js | 11 - .../lib/properties/webkitUserSelect.js | 11 - .../cssstyle/lib/properties/webkitWrap.js | 11 - .../cssstyle/lib/properties/webkitWrapFlow.js | 11 - .../lib/properties/webkitWrapMargin.js | 11 - .../lib/properties/webkitWrapPadding.js | 11 - .../lib/properties/webkitWrapShapeInside.js | 11 - .../lib/properties/webkitWrapShapeOutside.js | 11 - .../lib/properties/webkitWrapThrough.js | 11 - .../lib/properties/webkitWritingMode.js | 11 - .../cssstyle/lib/properties/whiteSpace.js | 11 - .../cssstyle/lib/properties/widows.js | 11 - .../cssstyle/lib/properties/width.js | 11 - .../cssstyle/lib/properties/wordBreak.js | 11 - .../cssstyle/lib/properties/wordSpacing.js | 11 - .../cssstyle/lib/properties/wordWrap.js | 11 - .../cssstyle/lib/properties/writingMode.js | 11 - .../cssstyle/lib/properties/zIndex.js | 11 - .../cssstyle/lib/properties/zoom.js | 11 - .../jsdom/node_modules/cssstyle/lib/props | 788 - .../node_modules/cssstyle/make_properties.pl | 26 - .../jsdom/node_modules/cssstyle/package.json | 50 - .../node_modules/cssstyle/tests/tests.js | 76 - .../jsdom/node_modules/htmlparser/.project | 17 - .../node_modules/htmlparser/.project.bak | 17 - .../htmlparser/.settings/.jsdtscope | 6 - .../org.eclipse.core.resources.prefs | 3 - ...rg.eclipse.wst.jsdt.ui.superType.container | 1 - .../org.eclipse.wst.jsdt.ui.superType.name | 1 - .../jsdom/node_modules/htmlparser/CHANGELOG | 47 - .../jsdom/node_modules/htmlparser/LICENSE | 18 - .../jsdom/node_modules/htmlparser/README.md | 247 - node_modules/jsdom/node_modules/htmlparser/a | 20 - node_modules/jsdom/node_modules/htmlparser/b | 26 - node_modules/jsdom/node_modules/htmlparser/c | 35 - .../jsdom/node_modules/htmlparser/json2.js | 482 - .../node_modules/htmlparser/lib/htmlparser.js | 823 - .../htmlparser/lib/htmlparser.min.js | 22 - .../htmlparser/lib/node-htmlparser.js | 6 - .../htmlparser/lib/node-htmlparser.min.js | 6 - .../node_modules/htmlparser/libxmljs.node | Bin 102420 -> 0 bytes .../jsdom/node_modules/htmlparser/new/a | 6 - .../jsdom/node_modules/htmlparser/new/b | 6 - .../node_modules/htmlparser/new/compat.js | 954 - .../node_modules/htmlparser/new/htmlparser.js | 645 - .../node_modules/htmlparser/new/parser.zip | Bin 6706 -> 0 bytes .../node_modules/htmlparser/new/test01.js | 258 - .../node_modules/htmlparser/new/test02.js | 856 - .../node_modules/htmlparser/newparser.js | 54 - .../htmlparser/node-htmlparser.old.js | 754 - .../node_modules/htmlparser/package.json | 44 - .../jsdom/node_modules/htmlparser/profile | 4 - .../htmlparser/profile.getelement.js | 53 - .../htmlparser/profile.getelement.txt | 199 - .../jsdom/node_modules/htmlparser/profile.js | 63 - .../htmlparser/profileresults.txt | 301 - .../pulls/node-htmlparser/CHANGELOG | 9 - .../htmlparser/pulls/node-htmlparser/LICENSE | 18 - .../pulls/node-htmlparser/README.md | 186 - .../htmlparser/pulls/node-htmlparser/json2.js | 482 - .../node-htmlparser/lib/node-htmlparser.js | 772 - .../lib/node-htmlparser.min.js | 22 - .../pulls/node-htmlparser/package.json | 23 - .../pulls/node-htmlparser/profile.js | 63 - .../pulls/node-htmlparser/runtests.html | 107 - .../pulls/node-htmlparser/runtests.js | 75 - .../pulls/node-htmlparser/runtests.min.html | 107 - .../pulls/node-htmlparser/runtests.min.js | 75 - .../pulls/node-htmlparser/snippet.js | 15 - .../pulls/node-htmlparser/tests/01-basic.js | 57 - .../node-htmlparser/tests/02-single_tag_1.js | 35 - .../node-htmlparser/tests/03-single_tag_2.js | 36 - .../tests/04-unescaped_in_script.js | 52 - .../tests/05-tags_in_comment.js | 44 - .../tests/06-comment_in_script.js | 44 - .../tests/07-unescaped_in_style.js | 45 - .../tests/08-extra_spaces_in_tag.js | 45 - .../tests/09-unquoted_attrib.js | 45 - .../tests/10-singular_attribute.js | 39 - .../tests/11-text_outside_tags.js | 46 - .../node-htmlparser/tests/12-text_only.js | 37 - .../tests/13-comment_in_text.js | 45 - .../tests/14-comment_in_text_in_script.js | 53 - .../node-htmlparser/tests/15-non-verbose.js | 43 - .../tests/16-ignore_whitespace.js | 68 - .../node-htmlparser/tests/17-xml_namespace.js | 34 - .../tests/18-enforce_empty_tags.js | 36 - .../tests/19-ignore_empty_tags.js | 38 - .../pulls/node-htmlparser/tests/20-rss.js | 117 - .../pulls/node-htmlparser/tests/21-atom.js | 77 - .../pulls/node-htmlparser/utils_example.js | 35 - .../jsdom/node_modules/htmlparser/rssbug.js | 16 - .../jsdom/node_modules/htmlparser/rssbug.rss | 1 - .../node_modules/htmlparser/runtests.html | 108 - .../jsdom/node_modules/htmlparser/runtests.js | 75 - .../node_modules/htmlparser/runtests.min.html | 108 - .../node_modules/htmlparser/runtests.min.js | 75 - .../node_modules/htmlparser/runtests_new.js | 75 - .../jsdom/node_modules/htmlparser/snippet.js | 15 - .../jsdom/node_modules/htmlparser/test01.js | 105 - .../htmlparser/testdata/.tmp_test.html.2854~ | 11 - .../testdata/.tmp_trackerchecker.html.65425~ | 2948 -- .../testdata/.tmp_trackerchecker.html.76922~ | 10 - .../testdata/.tmp_trackerchecker.html.80022~ | 2948 -- .../testdata/.tmp_trackerchecker2.html.51378~ | 2948 -- .../testdata/.tmp_trackerchecker2.html.75287~ | 2947 -- .../node_modules/htmlparser/testdata/api.html | 3311 -- .../htmlparser/testdata/getelement.html | 3460 -- .../htmlparser/testdata/trackerchecker.html | 2733 -- .../node_modules/htmlparser/tests/01-basic.js | 61 - .../htmlparser/tests/02-single_tag_1.js | 39 - .../htmlparser/tests/03-single_tag_2.js | 40 - .../tests/04-unescaped_in_script.js | 56 - .../htmlparser/tests/05-tags_in_comment.js | 48 - .../htmlparser/tests/06-comment_in_script.js | 48 - .../htmlparser/tests/07-unescaped_in_style.js | 49 - .../tests/08-extra_spaces_in_tag.js | 49 - .../htmlparser/tests/09-unquoted_attrib.js | 49 - .../htmlparser/tests/10-singular_attribute.js | 43 - .../htmlparser/tests/11-text_outside_tags.js | 50 - .../htmlparser/tests/12-text_only.js | 41 - .../htmlparser/tests/13-comment_in_text.js | 49 - .../tests/14-comment_in_text_in_script.js | 57 - .../htmlparser/tests/15-non-verbose.js | 46 - .../htmlparser/tests/16-ignore_whitespace.js | 71 - .../htmlparser/tests/17-xml_namespace.js | 38 - .../htmlparser/tests/18-enforce_empty_tags.js | 40 - .../htmlparser/tests/19-ignore_empty_tags.js | 41 - .../node_modules/htmlparser/tests/20-rss.js | 120 - .../node_modules/htmlparser/tests/21-atom.js | 80 - .../htmlparser/tests/22-position_data.js | 100 - .../node_modules/htmlparser/tmp/snippet.js | 13 - .../node_modules/htmlparser/utils_example.js | 35 - .../jsdom/node_modules/htmlparser/v8.log | 1956 -- .../jsdom/node_modules/nwmatcher/.npmignore | 8 - .../jsdom/node_modules/nwmatcher/LICENSE | 22 - .../jsdom/node_modules/nwmatcher/README | 0 .../node_modules/nwmatcher/dist/lint.log | 0 .../nwmatcher/dist/nwmatcher-min.js | 1 - .../nwmatcher/dist/nwmatcher-pac.js | 6 - .../nwmatcher/dist/nwmatcher-src.js | 1659 - .../nwmatcher/dist/nwmatcher-zip.js | Bin 7130 -> 0 bytes .../node_modules/nwmatcher/dist/nwmatcher.js | 6 - .../nwmatcher/lib/ender/bridge.js | 105 - .../lib/prototype/selector_engine.js | 23 - .../nwmatcher/lib/spidermonkey/dom.js | 27868 ---------------- .../lib/spidermonkey/headless-tests.js | 4 - .../nwmatcher/lib/spidermonkey/js | Bin 5500416 -> 0 bytes .../lib/spidermonkey/libmozglue.dylib | Bin 48168 -> 0 bytes .../nwmatcher/lib/spidermonkey/libnspr4.dylib | Bin 263096 -> 0 bytes .../nwmatcher/lib/spidermonkey/libplc4.dylib | Bin 25056 -> 0 bytes .../nwmatcher/lib/spidermonkey/libplds4.dylib | Bin 21920 -> 0 bytes .../nwmatcher/lib/spidermonkey/nwmatcher.js | 1653 - .../jsdom/node_modules/nwmatcher/package.json | 45 - .../nwmatcher/src/NEW/nwmatcher-base.js | 668 - .../nwmatcher/src/NEW/nwmatcher.js | 1655 - .../nwmatcher/src/NEW2/nwmatcher-base.js.NEW | 686 - .../nwmatcher/src/NEW2/nwmatcher.js.NEW | 1659 - .../nwmatcher/src/OLD/nwmatcher-GITHUB.js | 1648 - .../src/OLD/nwmatcher-base-GITHUB.js | 669 - .../src/OLD2/nwmatcher-base.js.GITHUB | 673 - .../nwmatcher/src/OLD2/nwmatcher-base.js.NEW | 697 - .../nwmatcher/src/OLD2/nwmatcher-base.js.NEW2 | 686 - .../nwmatcher/src/OLD2/nwmatcher-base.js.NEW3 | 684 - .../nwmatcher/src/OLD2/nwmatcher-base.js.NEW4 | 691 - .../nwmatcher/src/modules/nwmatcher-cache.js | 184 - .../nwmatcher/src/modules/nwmatcher-jquery.js | 119 - .../src/modules/nwmatcher-pseudos.js | 275 - .../src/modules/nwmatcher-shortcuts.js | 35 - .../nwmatcher/src/modules/nwmatcher-thin.js | 7 - .../src/modules/nwmatcher-traversal.js | 90 - .../src/modules/nwmatcher-webforms.js | 100 - .../nwmatcher/src/nwmatcher-base.js | 686 - .../node_modules/nwmatcher/src/nwmatcher.js | 1659 - .../jsdom/node_modules/request/LICENSE | 55 - .../jsdom/node_modules/request/README.md | 310 - .../jsdom/node_modules/request/aws.js | 191 - .../jsdom/node_modules/request/forever.js | 103 - .../jsdom/node_modules/request/main.js | 1123 - .../request/node_modules/form-data/.npmignore | 5 - .../request/node_modules/form-data/Makefile | 7 - .../request/node_modules/form-data/Readme.md | 86 - .../node_modules/form-data/lib/form_data.js | 237 - .../form-data/node-form-data.sublime-project | 8 - .../node-form-data.sublime-workspace | 508 - .../form-data/node_modules/async/.gitmodules | 9 - .../form-data/node_modules/async/LICENSE | 19 - .../form-data/node_modules/async/Makefile | 21 - .../form-data/node_modules/async/README.md | 970 - .../node_modules/async/async.min.js.gzip | Bin 1859 -> 0 bytes .../node_modules/async/deps/nodeunit.css | 70 - .../node_modules/async/deps/nodeunit.js | 1966 -- .../node_modules/async/dist/async.min.js | 1 - .../form-data/node_modules/async/index.js | 3 - .../form-data/node_modules/async/lib/async.js | 632 - .../form-data/node_modules/async/nodelint.cfg | 4 - .../form-data/node_modules/async/package.json | 41 - .../form-data/node_modules/async/test/.swp | Bin 12288 -> 0 bytes .../node_modules/async/test/test-async.js | 1367 - .../node_modules/async/test/test.html | 24 - .../node_modules/combined-stream/.npmignore | 3 - .../node_modules/combined-stream/License | 19 - .../node_modules/combined-stream/Makefile | 7 - .../node_modules/combined-stream/Readme.md | 132 - .../combined-stream/lib/combined_stream.js | 183 - .../node_modules/delayed-stream/.npmignore | 2 - .../node_modules/delayed-stream/License | 19 - .../node_modules/delayed-stream/Makefile | 7 - .../node_modules/delayed-stream/Readme.md | 154 - .../delayed-stream/lib/delayed_stream.js | 99 - .../node_modules/delayed-stream/package.json | 38 - .../delayed-stream/test/common.js | 6 - .../integration/test-delayed-http-upload.js | 38 - .../test-delayed-stream-auto-pause.js | 21 - .../integration/test-delayed-stream-pause.js | 14 - .../test/integration/test-delayed-stream.js | 48 - .../integration/test-handle-source-errors.js | 15 - .../test/integration/test-max-data-size.js | 18 - .../test/integration/test-pipe-resumes.js | 13 - .../test/integration/test-proxy-readable.js | 13 - .../node_modules/delayed-stream/test/run.js | 7 - .../node_modules/combined-stream/package.json | 39 - .../combined-stream/test/common.js | 12 - .../combined-stream/test/fixture/file1.txt | 256 - .../combined-stream/test/fixture/file2.txt | 256 - .../test/integration/test-callback-streams.js | 27 - .../test/integration/test-data-size.js | 34 - ...delayed-streams-and-buffers-and-strings.js | 38 - .../test/integration/test-delayed-streams.js | 35 - .../test/integration/test-max-data-size.js | 24 - .../test/integration/test-unpaused-streams.js | 30 - .../node_modules/combined-stream/test/run.js | 7 - .../node_modules/form-data/package.json | 43 - .../node_modules/form-data/test/common.js | 14 - .../form-data/test/fixture/bacon.txt | 1 - .../form-data/test/fixture/unicycle.jpg | Bin 19806 -> 0 bytes .../test/integration/test-form-get-length.js | 93 - .../test/integration/test-get-boundary.js | 18 - .../test/integration/test-http-response.js | 121 - .../form-data/test/integration/test-pipe.js | 111 - .../form-data/test/integration/test-submit.js | 107 - .../node_modules/form-data/test/run.js | 7 - .../request/node_modules/mime/LICENSE | 19 - .../request/node_modules/mime/README.md | 63 - .../request/node_modules/mime/mime.js | 104 - .../request/node_modules/mime/package.json | 42 - .../request/node_modules/mime/test.js | 55 - .../node_modules/mime/types/mime.types | 1588 - .../node_modules/mime/types/node.types | 59 - .../jsdom/node_modules/request/oauth.js | 43 - .../jsdom/node_modules/request/package.json | 43 - .../request/tests/googledoodle.png | Bin 38510 -> 0 bytes .../jsdom/node_modules/request/tests/run.js | 45 - .../node_modules/request/tests/server.js | 90 - .../node_modules/request/tests/squid.conf | 77 - .../node_modules/request/tests/ssl/ca/ca.cnf | 20 - .../node_modules/request/tests/ssl/ca/ca.crl | 0 .../node_modules/request/tests/ssl/ca/ca.crt | 17 - .../node_modules/request/tests/ssl/ca/ca.csr | 13 - .../node_modules/request/tests/ssl/ca/ca.key | 18 - .../node_modules/request/tests/ssl/ca/ca.srl | 1 - .../request/tests/ssl/ca/server.cnf | 19 - .../request/tests/ssl/ca/server.crt | 16 - .../request/tests/ssl/ca/server.csr | 11 - .../request/tests/ssl/ca/server.js | 28 - .../request/tests/ssl/ca/server.key | 9 - .../node_modules/request/tests/ssl/npm-ca.crt | 16 - .../node_modules/request/tests/ssl/test.crt | 15 - .../node_modules/request/tests/ssl/test.key | 15 - .../node_modules/request/tests/test-body.js | 117 - .../node_modules/request/tests/test-cookie.js | 29 - .../request/tests/test-cookiejar.js | 90 - .../request/tests/test-defaults.js | 114 - .../node_modules/request/tests/test-errors.js | 37 - .../request/tests/test-follow-all-303.js | 30 - .../request/tests/test-follow-all.js | 35 - .../node_modules/request/tests/test-form.js | 79 - .../request/tests/test-headers.js | 52 - .../request/tests/test-httpModule.js | 94 - .../request/tests/test-https-strict.js | 97 - .../node_modules/request/tests/test-https.js | 86 - .../node_modules/request/tests/test-oauth.js | 117 - .../node_modules/request/tests/test-params.js | 92 - .../request/tests/test-piped-redirect.js | 52 - .../node_modules/request/tests/test-pipes.js | 216 - .../node_modules/request/tests/test-pool.js | 16 - .../tests/test-protocol-changing-redirect.js | 60 - .../node_modules/request/tests/test-proxy.js | 39 - .../node_modules/request/tests/test-qs.js | 28 - .../request/tests/test-redirect.js | 154 - .../node_modules/request/tests/test-s3.js | 13 - .../request/tests/test-timeout.js | 87 - .../node_modules/request/tests/test-toJSON.js | 14 - .../node_modules/request/tests/test-tunnel.js | 63 - .../node_modules/request/tests/unicycle.jpg | Bin 19806 -> 0 bytes .../jsdom/node_modules/request/tunnel.js | 227 - .../jsdom/node_modules/request/uuid.js | 19 - .../request/vendor/cookie/index.js | 65 - .../node_modules/request/vendor/cookie/jar.js | 72 - node_modules/jsdom/package.json | 215 - node_modules/jsdom/test.css | 6 - node_modules/jsdom/test.js | 17 - node_modules/request/LICENSE | 55 - node_modules/request/README.md | 310 - node_modules/request/aws.js | 191 - node_modules/request/forever.js | 103 - node_modules/request/main.js | 1123 - .../request/node_modules/form-data/.npmignore | 5 - .../request/node_modules/form-data/Makefile | 7 - .../request/node_modules/form-data/Readme.md | 86 - .../node_modules/form-data/lib/form_data.js | 237 - .../form-data/node-form-data.sublime-project | 8 - .../node-form-data.sublime-workspace | 508 - .../form-data/node_modules/async/.gitmodules | 9 - .../form-data/node_modules/async/LICENSE | 19 - .../form-data/node_modules/async/Makefile | 21 - .../form-data/node_modules/async/README.md | 970 - .../node_modules/async/async.min.js.gzip | Bin 1859 -> 0 bytes .../node_modules/async/deps/nodeunit.css | 70 - .../node_modules/async/deps/nodeunit.js | 1966 -- .../node_modules/async/dist/async.min.js | 1 - .../form-data/node_modules/async/index.js | 3 - .../form-data/node_modules/async/lib/async.js | 632 - .../form-data/node_modules/async/nodelint.cfg | 4 - .../form-data/node_modules/async/package.json | 41 - .../form-data/node_modules/async/test/.swp | Bin 12288 -> 0 bytes .../node_modules/async/test/test-async.js | 1367 - .../node_modules/async/test/test.html | 24 - .../node_modules/combined-stream/.npmignore | 3 - .../node_modules/combined-stream/License | 19 - .../node_modules/combined-stream/Makefile | 7 - .../node_modules/combined-stream/Readme.md | 132 - .../combined-stream/lib/combined_stream.js | 183 - .../node_modules/delayed-stream/.npmignore | 2 - .../node_modules/delayed-stream/License | 19 - .../node_modules/delayed-stream/Makefile | 7 - .../node_modules/delayed-stream/Readme.md | 154 - .../delayed-stream/lib/delayed_stream.js | 99 - .../node_modules/delayed-stream/package.json | 38 - .../delayed-stream/test/common.js | 6 - .../integration/test-delayed-http-upload.js | 38 - .../test-delayed-stream-auto-pause.js | 21 - .../integration/test-delayed-stream-pause.js | 14 - .../test/integration/test-delayed-stream.js | 48 - .../integration/test-handle-source-errors.js | 15 - .../test/integration/test-max-data-size.js | 18 - .../test/integration/test-pipe-resumes.js | 13 - .../test/integration/test-proxy-readable.js | 13 - .../node_modules/delayed-stream/test/run.js | 7 - .../node_modules/combined-stream/package.json | 39 - .../combined-stream/test/common.js | 12 - .../combined-stream/test/fixture/file1.txt | 256 - .../combined-stream/test/fixture/file2.txt | 256 - .../test/integration/test-callback-streams.js | 27 - .../test/integration/test-data-size.js | 34 - ...delayed-streams-and-buffers-and-strings.js | 38 - .../test/integration/test-delayed-streams.js | 35 - .../test/integration/test-max-data-size.js | 24 - .../test/integration/test-unpaused-streams.js | 30 - .../node_modules/combined-stream/test/run.js | 7 - .../node_modules/form-data/package.json | 43 - .../node_modules/form-data/test/common.js | 14 - .../form-data/test/fixture/bacon.txt | 1 - .../form-data/test/fixture/unicycle.jpg | Bin 19806 -> 0 bytes .../test/integration/test-form-get-length.js | 93 - .../test/integration/test-get-boundary.js | 18 - .../test/integration/test-http-response.js | 121 - .../form-data/test/integration/test-pipe.js | 111 - .../form-data/test/integration/test-submit.js | 107 - .../node_modules/form-data/test/run.js | 7 - .../request/node_modules/mime/LICENSE | 19 - .../request/node_modules/mime/README.md | 63 - .../request/node_modules/mime/mime.js | 104 - .../request/node_modules/mime/package.json | 42 - .../request/node_modules/mime/test.js | 55 - .../node_modules/mime/types/mime.types | 1588 - .../node_modules/mime/types/node.types | 59 - node_modules/request/oauth.js | 43 - node_modules/request/package.json | 40 - node_modules/request/tests/googledoodle.png | Bin 38510 -> 0 bytes node_modules/request/tests/run.js | 45 - node_modules/request/tests/server.js | 90 - node_modules/request/tests/squid.conf | 77 - node_modules/request/tests/ssl/ca/ca.cnf | 20 - node_modules/request/tests/ssl/ca/ca.crl | 0 node_modules/request/tests/ssl/ca/ca.crt | 17 - node_modules/request/tests/ssl/ca/ca.csr | 13 - node_modules/request/tests/ssl/ca/ca.key | 18 - node_modules/request/tests/ssl/ca/ca.srl | 1 - node_modules/request/tests/ssl/ca/server.cnf | 19 - node_modules/request/tests/ssl/ca/server.crt | 16 - node_modules/request/tests/ssl/ca/server.csr | 11 - node_modules/request/tests/ssl/ca/server.js | 28 - node_modules/request/tests/ssl/ca/server.key | 9 - node_modules/request/tests/ssl/npm-ca.crt | 16 - node_modules/request/tests/ssl/test.crt | 15 - node_modules/request/tests/ssl/test.key | 15 - node_modules/request/tests/test-body.js | 117 - node_modules/request/tests/test-cookie.js | 29 - node_modules/request/tests/test-cookiejar.js | 90 - node_modules/request/tests/test-defaults.js | 114 - node_modules/request/tests/test-errors.js | 37 - .../request/tests/test-follow-all-303.js | 30 - node_modules/request/tests/test-follow-all.js | 35 - node_modules/request/tests/test-form.js | 79 - node_modules/request/tests/test-headers.js | 52 - node_modules/request/tests/test-httpModule.js | 94 - .../request/tests/test-https-strict.js | 97 - node_modules/request/tests/test-https.js | 86 - node_modules/request/tests/test-oauth.js | 117 - node_modules/request/tests/test-params.js | 92 - .../request/tests/test-piped-redirect.js | 52 - node_modules/request/tests/test-pipes.js | 216 - node_modules/request/tests/test-pool.js | 16 - .../tests/test-protocol-changing-redirect.js | 60 - node_modules/request/tests/test-proxy.js | 39 - node_modules/request/tests/test-qs.js | 28 - node_modules/request/tests/test-redirect.js | 154 - node_modules/request/tests/test-s3.js | 13 - node_modules/request/tests/test-timeout.js | 87 - node_modules/request/tests/test-toJSON.js | 14 - node_modules/request/tests/test-tunnel.js | 63 - node_modules/request/tests/unicycle.jpg | Bin 19806 -> 0 bytes node_modules/request/tunnel.js | 227 - node_modules/request/uuid.js | 19 - node_modules/request/vendor/cookie/index.js | 65 - node_modules/request/vendor/cookie/jar.js | 72 - node_modules/underscore/.npmignore | 3 - node_modules/underscore/CNAME | 1 - node_modules/underscore/CONTRIBUTING.md | 9 - node_modules/underscore/LICENSE | 22 - node_modules/underscore/README.md | 19 - node_modules/underscore/favicon.ico | Bin 1406 -> 0 bytes node_modules/underscore/index.html | 2407 -- node_modules/underscore/index.js | 1 - node_modules/underscore/package.json | 28 - node_modules/underscore/raw/underscore.psd | Bin 215540 -> 0 bytes node_modules/underscore/underscore-min.js | 1 - node_modules/underscore/underscore.js | 1221 - 1419 files changed, 2 insertions(+), 192076 deletions(-) delete mode 100755 node_modules/.bin/express delete mode 100755 node_modules/.bin/jade delete mode 100644 node_modules/express/.npmignore delete mode 100644 node_modules/express/.travis.yml delete mode 100644 node_modules/express/History.md delete mode 100644 node_modules/express/LICENSE delete mode 100644 node_modules/express/Makefile delete mode 100644 node_modules/express/Readme.md delete mode 100755 node_modules/express/bin/express delete mode 100644 node_modules/express/client.js delete mode 100644 node_modules/express/index.js delete mode 100644 node_modules/express/lib/application.js delete mode 100644 node_modules/express/lib/express.js delete mode 100644 node_modules/express/lib/middleware.js delete mode 100644 node_modules/express/lib/request.js delete mode 100644 node_modules/express/lib/response.js delete mode 100644 node_modules/express/lib/router/index.js delete mode 100644 node_modules/express/lib/router/route.js delete mode 100644 node_modules/express/lib/utils.js delete mode 100644 node_modules/express/lib/view.js delete mode 100644 node_modules/express/node_modules/buffer-crc32/.npmignore delete mode 100644 node_modules/express/node_modules/buffer-crc32/.travis.yml delete mode 100644 node_modules/express/node_modules/buffer-crc32/README.md delete mode 100644 node_modules/express/node_modules/buffer-crc32/index.js delete mode 100644 node_modules/express/node_modules/buffer-crc32/package.json delete mode 100644 node_modules/express/node_modules/buffer-crc32/tests/crc.test.js delete mode 100644 node_modules/express/node_modules/commander/.npmignore delete mode 100644 node_modules/express/node_modules/commander/.travis.yml delete mode 100644 node_modules/express/node_modules/commander/History.md delete mode 100644 node_modules/express/node_modules/commander/Makefile delete mode 100644 node_modules/express/node_modules/commander/Readme.md delete mode 100644 node_modules/express/node_modules/commander/index.js delete mode 100644 node_modules/express/node_modules/commander/lib/commander.js delete mode 100644 node_modules/express/node_modules/commander/package.json delete mode 100644 node_modules/express/node_modules/connect/.npmignore delete mode 100644 node_modules/express/node_modules/connect/.travis.yml delete mode 100644 node_modules/express/node_modules/connect/LICENSE delete mode 100644 node_modules/express/node_modules/connect/Readme.md delete mode 100644 node_modules/express/node_modules/connect/index.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/cache.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/connect.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/index.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/basicAuth.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/bodyParser.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/compress.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/cookieParser.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/cookieSession.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/csrf.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/directory.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/errorHandler.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/favicon.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/json.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/limit.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/logger.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/methodOverride.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/multipart.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/query.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/responseTime.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/session.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/session/cookie.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/session/memory.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/session/session.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/session/store.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/static.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/staticCache.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/timeout.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/urlencoded.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/middleware/vhost.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/patch.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/proto.js delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/directory.html delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/error.html delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/favicon.ico delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_add.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_attach.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_code.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_copy.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_delete.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_edit.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_error.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_excel.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_find.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_gear.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_go.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_green.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_key.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_lightning.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_link.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_paintbrush.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_paste.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_red.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_refresh.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_save.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_acrobat.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_actionscript.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_add.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_c.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_camera.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_cd.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code_red.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_coldfusion.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_compressed.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_copy.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_cplusplus.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_csharp.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_cup.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_database.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_delete.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_dvd.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_edit.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_error.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_excel.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_find.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_flash.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_freehand.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_gear.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_get.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_go.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_h.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_horizontal.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_key.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_lightning.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_link.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_magnify.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_medal.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_office.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_paint.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_paintbrush.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_paste.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_php.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_picture.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_powerpoint.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_put.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_ruby.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_stack.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_star.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_swoosh.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_text.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_text_width.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_tux.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_vector.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_visualstudio.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_width.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_word.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_world.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_wrench.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_zip.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_word.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/icons/page_world.png delete mode 100644 node_modules/express/node_modules/connect/lib-cov/public/style.css delete mode 100644 node_modules/express/node_modules/connect/lib-cov/utils.js delete mode 100644 node_modules/express/node_modules/connect/lib/cache.js delete mode 100644 node_modules/express/node_modules/connect/lib/connect.js delete mode 100644 node_modules/express/node_modules/connect/lib/index.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/basicAuth.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/bodyParser.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/compress.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/cookieParser.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/cookieSession.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/csrf.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/directory.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/errorHandler.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/favicon.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/json.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/limit.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/logger.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/methodOverride.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/multipart.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/query.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/responseTime.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/session.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/session/cookie.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/session/memory.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/session/session.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/session/store.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/static.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/staticCache.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/timeout.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/urlencoded.js delete mode 100644 node_modules/express/node_modules/connect/lib/middleware/vhost.js delete mode 100644 node_modules/express/node_modules/connect/lib/patch.js delete mode 100644 node_modules/express/node_modules/connect/lib/proto.js delete mode 100644 node_modules/express/node_modules/connect/lib/public/directory.html delete mode 100644 node_modules/express/node_modules/connect/lib/public/error.html delete mode 100644 node_modules/express/node_modules/connect/lib/public/favicon.ico delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_add.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_attach.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_code.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_copy.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_delete.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_edit.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_error.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_excel.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_find.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_gear.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_go.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_green.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_key.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_lightning.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_link.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_paintbrush.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_paste.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_red.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_refresh.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_save.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_acrobat.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_actionscript.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_add.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_c.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_camera.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_cd.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_code.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_code_red.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_coldfusion.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_compressed.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_copy.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_cplusplus.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_csharp.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_cup.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_database.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_delete.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_dvd.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_edit.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_error.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_excel.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_find.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_flash.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_freehand.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_gear.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_get.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_go.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_h.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_horizontal.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_key.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_lightning.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_link.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_magnify.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_medal.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_office.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_paint.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_paintbrush.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_paste.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_php.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_picture.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_powerpoint.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_put.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_ruby.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_stack.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_star.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_swoosh.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_text.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_text_width.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_tux.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_vector.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_visualstudio.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_width.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_word.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_world.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_wrench.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_white_zip.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_word.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/icons/page_world.png delete mode 100644 node_modules/express/node_modules/connect/lib/public/style.css delete mode 100644 node_modules/express/node_modules/connect/lib/utils.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/bytes/.npmignore delete mode 100644 node_modules/express/node_modules/connect/node_modules/bytes/History.md delete mode 100644 node_modules/express/node_modules/connect/node_modules/bytes/Makefile delete mode 100644 node_modules/express/node_modules/connect/node_modules/bytes/Readme.md delete mode 100644 node_modules/express/node_modules/connect/node_modules/bytes/component.json delete mode 100644 node_modules/express/node_modules/connect/node_modules/bytes/index.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/bytes/package.json delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/.npmignore delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/.travis.yml delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/Makefile delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/Readme.md delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/TODO delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/benchmark/bench-multipart-parser.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/example/post.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/example/upload.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/index.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/lib/file.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/lib/incoming_form.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/lib/index.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/lib/multipart_parser.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/lib/querystring_parser.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/lib/util.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/node-gently/Makefile delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/node-gently/Readme.md delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/node-gently/example/dog.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/node-gently/example/event_emitter.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/node-gently/index.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/node-gently/lib/gently/gently.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/node-gently/lib/gently/index.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/node-gently/package.json delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/node-gently/test/common.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/node-gently/test/simple/test-gently.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/package.json delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/common.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/funkyfilename.txt delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/plain.txt delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/info.md delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/no-filename.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/special-chars-in-filename.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/multipart.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/integration/test-fixtures.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/common.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/integration/test-multipart-parser.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-file.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-incoming-form.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-multipart-parser.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-querystring-parser.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/system/test-multi-video-upload.js delete mode 100755 node_modules/express/node_modules/connect/node_modules/formidable/test/run.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/test/unit/test-incoming-form.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/formidable/tool/record.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/pause/.npmignore delete mode 100644 node_modules/express/node_modules/connect/node_modules/pause/History.md delete mode 100644 node_modules/express/node_modules/connect/node_modules/pause/Makefile delete mode 100644 node_modules/express/node_modules/connect/node_modules/pause/Readme.md delete mode 100644 node_modules/express/node_modules/connect/node_modules/pause/index.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/pause/package.json delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/.gitmodules delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/.npmignore delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/.travis.yml delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/History.md delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/Makefile delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/Readme.md delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/benchmark.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/component.json delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/examples.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/index.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/lib/head.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/lib/querystring.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/lib/tail.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/package.json delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/querystring.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/test/browser/expect.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/test/browser/index.html delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/test/browser/jquery.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/test/browser/mocha.css delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/test/browser/mocha.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/test/browser/qs.css delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/test/browser/qs.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/test/parse.js delete mode 100644 node_modules/express/node_modules/connect/node_modules/qs/test/stringify.js delete mode 100644 node_modules/express/node_modules/connect/package.json delete mode 100644 node_modules/express/node_modules/connect/test.js delete mode 100644 node_modules/express/node_modules/cookie-signature/.npmignore delete mode 100644 node_modules/express/node_modules/cookie-signature/History.md delete mode 100644 node_modules/express/node_modules/cookie-signature/Makefile delete mode 100644 node_modules/express/node_modules/cookie-signature/Readme.md delete mode 100644 node_modules/express/node_modules/cookie-signature/index.js delete mode 100644 node_modules/express/node_modules/cookie-signature/package.json delete mode 100644 node_modules/express/node_modules/cookie/.npmignore delete mode 100644 node_modules/express/node_modules/cookie/.travis.yml delete mode 100644 node_modules/express/node_modules/cookie/README.md delete mode 100644 node_modules/express/node_modules/cookie/index.js delete mode 100644 node_modules/express/node_modules/cookie/package.json delete mode 100644 node_modules/express/node_modules/cookie/test/mocha.opts delete mode 100644 node_modules/express/node_modules/cookie/test/parse.js delete mode 100644 node_modules/express/node_modules/cookie/test/serialize.js delete mode 100644 node_modules/express/node_modules/debug/.npmignore delete mode 100644 node_modules/express/node_modules/debug/History.md delete mode 100644 node_modules/express/node_modules/debug/Makefile delete mode 100644 node_modules/express/node_modules/debug/Readme.md delete mode 100644 node_modules/express/node_modules/debug/debug.component.js delete mode 100644 node_modules/express/node_modules/debug/debug.js delete mode 100644 node_modules/express/node_modules/debug/example/app.js delete mode 100644 node_modules/express/node_modules/debug/example/browser.html delete mode 100644 node_modules/express/node_modules/debug/example/wildcards.js delete mode 100644 node_modules/express/node_modules/debug/example/worker.js delete mode 100644 node_modules/express/node_modules/debug/head.js delete mode 100644 node_modules/express/node_modules/debug/index.js delete mode 100644 node_modules/express/node_modules/debug/lib/debug.js delete mode 100644 node_modules/express/node_modules/debug/package.json delete mode 100644 node_modules/express/node_modules/debug/tail.js delete mode 100644 node_modules/express/node_modules/fresh/.npmignore delete mode 100644 node_modules/express/node_modules/fresh/Makefile delete mode 100644 node_modules/express/node_modules/fresh/Readme.md delete mode 100644 node_modules/express/node_modules/fresh/index.js delete mode 100644 node_modules/express/node_modules/fresh/package.json delete mode 100644 node_modules/express/node_modules/methods/index.js delete mode 100644 node_modules/express/node_modules/methods/package.json delete mode 100644 node_modules/express/node_modules/mkdirp/.gitignore.orig delete mode 100644 node_modules/express/node_modules/mkdirp/.gitignore.rej delete mode 100644 node_modules/express/node_modules/mkdirp/.npmignore delete mode 100644 node_modules/express/node_modules/mkdirp/.travis.yml delete mode 100644 node_modules/express/node_modules/mkdirp/LICENSE delete mode 100644 node_modules/express/node_modules/mkdirp/README.markdown delete mode 100644 node_modules/express/node_modules/mkdirp/examples/pow.js delete mode 100644 node_modules/express/node_modules/mkdirp/examples/pow.js.orig delete mode 100644 node_modules/express/node_modules/mkdirp/examples/pow.js.rej delete mode 100644 node_modules/express/node_modules/mkdirp/index.js delete mode 100644 node_modules/express/node_modules/mkdirp/package.json delete mode 100644 node_modules/express/node_modules/mkdirp/test/chmod.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/clobber.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/mkdirp.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/perm.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/perm_sync.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/race.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/rel.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/return.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/return_sync.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/root.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/sync.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/umask.js delete mode 100644 node_modules/express/node_modules/mkdirp/test/umask_sync.js delete mode 100644 node_modules/express/node_modules/range-parser/.npmignore delete mode 100644 node_modules/express/node_modules/range-parser/History.md delete mode 100644 node_modules/express/node_modules/range-parser/Makefile delete mode 100644 node_modules/express/node_modules/range-parser/Readme.md delete mode 100644 node_modules/express/node_modules/range-parser/index.js delete mode 100644 node_modules/express/node_modules/range-parser/package.json delete mode 100644 node_modules/express/node_modules/send/.npmignore delete mode 100644 node_modules/express/node_modules/send/History.md delete mode 100644 node_modules/express/node_modules/send/Makefile delete mode 100644 node_modules/express/node_modules/send/Readme.md delete mode 100644 node_modules/express/node_modules/send/index.js delete mode 100644 node_modules/express/node_modules/send/lib/send.js delete mode 100644 node_modules/express/node_modules/send/lib/utils.js delete mode 100644 node_modules/express/node_modules/send/node_modules/mime/LICENSE delete mode 100644 node_modules/express/node_modules/send/node_modules/mime/README.md delete mode 100644 node_modules/express/node_modules/send/node_modules/mime/mime.js delete mode 100644 node_modules/express/node_modules/send/node_modules/mime/package.json delete mode 100644 node_modules/express/node_modules/send/node_modules/mime/test.js delete mode 100644 node_modules/express/node_modules/send/node_modules/mime/types/mime.types delete mode 100644 node_modules/express/node_modules/send/node_modules/mime/types/node.types delete mode 100644 node_modules/express/node_modules/send/package.json delete mode 100644 node_modules/express/package.json delete mode 100644 node_modules/express/test.js delete mode 100644 node_modules/jade/.npmignore delete mode 100644 node_modules/jade/LICENSE delete mode 100644 node_modules/jade/Readme.md delete mode 100644 node_modules/jade/Readme_zh-cn.md delete mode 100755 node_modules/jade/bin/jade delete mode 100644 node_modules/jade/index.js delete mode 100644 node_modules/jade/jade.js delete mode 100644 node_modules/jade/jade.md delete mode 100644 node_modules/jade/jade.min.js delete mode 100644 node_modules/jade/lib/compiler.js delete mode 100644 node_modules/jade/lib/doctypes.js delete mode 100644 node_modules/jade/lib/filters.js delete mode 100644 node_modules/jade/lib/inline-tags.js delete mode 100644 node_modules/jade/lib/jade.js delete mode 100644 node_modules/jade/lib/lexer.js delete mode 100644 node_modules/jade/lib/nodes/attrs.js delete mode 100644 node_modules/jade/lib/nodes/block-comment.js delete mode 100644 node_modules/jade/lib/nodes/block.js delete mode 100644 node_modules/jade/lib/nodes/case.js delete mode 100644 node_modules/jade/lib/nodes/code.js delete mode 100644 node_modules/jade/lib/nodes/comment.js delete mode 100644 node_modules/jade/lib/nodes/doctype.js delete mode 100644 node_modules/jade/lib/nodes/each.js delete mode 100644 node_modules/jade/lib/nodes/filter.js delete mode 100644 node_modules/jade/lib/nodes/index.js delete mode 100644 node_modules/jade/lib/nodes/literal.js delete mode 100644 node_modules/jade/lib/nodes/mixin.js delete mode 100644 node_modules/jade/lib/nodes/node.js delete mode 100644 node_modules/jade/lib/nodes/tag.js delete mode 100644 node_modules/jade/lib/nodes/text.js delete mode 100644 node_modules/jade/lib/parser.js delete mode 100644 node_modules/jade/lib/runtime.js delete mode 100644 node_modules/jade/lib/self-closing.js delete mode 100644 node_modules/jade/lib/utils.js delete mode 100755 node_modules/jade/node_modules/.bin/cake delete mode 100755 node_modules/jade/node_modules/.bin/coffee delete mode 100644 node_modules/jade/node_modules/coffee-script/.npmignore delete mode 100644 node_modules/jade/node_modules/coffee-script/CNAME delete mode 100644 node_modules/jade/node_modules/coffee-script/CONTRIBUTING.md delete mode 100644 node_modules/jade/node_modules/coffee-script/LICENSE delete mode 100644 node_modules/jade/node_modules/coffee-script/README delete mode 100644 node_modules/jade/node_modules/coffee-script/Rakefile delete mode 100755 node_modules/jade/node_modules/coffee-script/bin/cake delete mode 100755 node_modules/jade/node_modules/coffee-script/bin/coffee delete mode 100644 node_modules/jade/node_modules/coffee-script/extras/jsl.conf delete mode 100644 node_modules/jade/node_modules/coffee-script/lib/coffee-script/browser.js delete mode 100644 node_modules/jade/node_modules/coffee-script/lib/coffee-script/cake.js delete mode 100644 node_modules/jade/node_modules/coffee-script/lib/coffee-script/coffee-script.js delete mode 100644 node_modules/jade/node_modules/coffee-script/lib/coffee-script/command.js delete mode 100644 node_modules/jade/node_modules/coffee-script/lib/coffee-script/grammar.js delete mode 100644 node_modules/jade/node_modules/coffee-script/lib/coffee-script/helpers.js delete mode 100644 node_modules/jade/node_modules/coffee-script/lib/coffee-script/index.js delete mode 100644 node_modules/jade/node_modules/coffee-script/lib/coffee-script/lexer.js delete mode 100644 node_modules/jade/node_modules/coffee-script/lib/coffee-script/nodes.js delete mode 100644 node_modules/jade/node_modules/coffee-script/lib/coffee-script/optparse.js delete mode 100755 node_modules/jade/node_modules/coffee-script/lib/coffee-script/parser.js delete mode 100644 node_modules/jade/node_modules/coffee-script/lib/coffee-script/repl.js delete mode 100644 node_modules/jade/node_modules/coffee-script/lib/coffee-script/rewriter.js delete mode 100644 node_modules/jade/node_modules/coffee-script/lib/coffee-script/scope.js delete mode 100644 node_modules/jade/node_modules/coffee-script/package.json delete mode 100644 node_modules/jade/node_modules/commander/.npmignore delete mode 100644 node_modules/jade/node_modules/commander/.travis.yml delete mode 100644 node_modules/jade/node_modules/commander/History.md delete mode 100644 node_modules/jade/node_modules/commander/Makefile delete mode 100644 node_modules/jade/node_modules/commander/Readme.md delete mode 100644 node_modules/jade/node_modules/commander/index.js delete mode 100644 node_modules/jade/node_modules/commander/lib/commander.js delete mode 100644 node_modules/jade/node_modules/commander/package.json delete mode 100644 node_modules/jade/node_modules/mkdirp/.npmignore delete mode 100644 node_modules/jade/node_modules/mkdirp/.travis.yml delete mode 100644 node_modules/jade/node_modules/mkdirp/LICENSE delete mode 100644 node_modules/jade/node_modules/mkdirp/README.markdown delete mode 100644 node_modules/jade/node_modules/mkdirp/examples/pow.js delete mode 100644 node_modules/jade/node_modules/mkdirp/index.js delete mode 100644 node_modules/jade/node_modules/mkdirp/package.json delete mode 100644 node_modules/jade/node_modules/mkdirp/test/chmod.js delete mode 100644 node_modules/jade/node_modules/mkdirp/test/clobber.js delete mode 100644 node_modules/jade/node_modules/mkdirp/test/mkdirp.js delete mode 100644 node_modules/jade/node_modules/mkdirp/test/perm.js delete mode 100644 node_modules/jade/node_modules/mkdirp/test/perm_sync.js delete mode 100644 node_modules/jade/node_modules/mkdirp/test/race.js delete mode 100644 node_modules/jade/node_modules/mkdirp/test/rel.js delete mode 100644 node_modules/jade/node_modules/mkdirp/test/return.js delete mode 100644 node_modules/jade/node_modules/mkdirp/test/return_sync.js delete mode 100644 node_modules/jade/node_modules/mkdirp/test/root.js delete mode 100644 node_modules/jade/node_modules/mkdirp/test/sync.js delete mode 100644 node_modules/jade/node_modules/mkdirp/test/umask.js delete mode 100644 node_modules/jade/node_modules/mkdirp/test/umask_sync.js delete mode 100644 node_modules/jade/package.json delete mode 100644 node_modules/jade/runtime.js delete mode 100644 node_modules/jade/runtime.min.js delete mode 100644 node_modules/jade/testing/index.html delete mode 100644 node_modules/jade/testing/index.jade delete mode 100644 node_modules/jade/testing/layout.html delete mode 100644 node_modules/jade/testing/layout.jade delete mode 100644 node_modules/jade/testing/mobile.html delete mode 100644 node_modules/jade/testing/mobile.jade delete mode 100644 node_modules/jade/testing/nested/something.html delete mode 100644 node_modules/jade/testing/nested/something.jade delete mode 100644 node_modules/jade/testing/some.js delete mode 100644 node_modules/jade/testing/test.md delete mode 100644 node_modules/jsdom/.travis.yml delete mode 100644 node_modules/jsdom/LICENSE.txt delete mode 100644 node_modules/jsdom/README.md delete mode 100644 node_modules/jsdom/lib/jsdom.js delete mode 100644 node_modules/jsdom/lib/jsdom/browser/documentfeatures.js delete mode 100644 node_modules/jsdom/lib/jsdom/browser/domtohtml.js delete mode 100644 node_modules/jsdom/lib/jsdom/browser/htmlencoding.js delete mode 100644 node_modules/jsdom/lib/jsdom/browser/htmltodom.js delete mode 100644 node_modules/jsdom/lib/jsdom/browser/index.js delete mode 100644 node_modules/jsdom/lib/jsdom/level1/core.js delete mode 100644 node_modules/jsdom/lib/jsdom/level2/core.js delete mode 100644 node_modules/jsdom/lib/jsdom/level2/events.js delete mode 100644 node_modules/jsdom/lib/jsdom/level2/html.js delete mode 100644 node_modules/jsdom/lib/jsdom/level2/index.js delete mode 100644 node_modules/jsdom/lib/jsdom/level2/languages/javascript.js delete mode 100644 node_modules/jsdom/lib/jsdom/level2/style.js delete mode 100644 node_modules/jsdom/lib/jsdom/level3/core.js delete mode 100644 node_modules/jsdom/lib/jsdom/level3/events.js delete mode 100644 node_modules/jsdom/lib/jsdom/level3/html.js delete mode 100644 node_modules/jsdom/lib/jsdom/level3/index.js delete mode 100644 node_modules/jsdom/lib/jsdom/level3/ls.js delete mode 100644 node_modules/jsdom/lib/jsdom/level3/xpath.js delete mode 100644 node_modules/jsdom/lib/jsdom/selectors/index.js delete mode 100644 node_modules/jsdom/lib/jsdom/utils.js delete mode 100644 node_modules/jsdom/node_modules/contextify/.npmignore delete mode 100644 node_modules/jsdom/node_modules/contextify/LICENSE.txt delete mode 100644 node_modules/jsdom/node_modules/contextify/README.md delete mode 100644 node_modules/jsdom/node_modules/contextify/binding.gyp delete mode 100644 node_modules/jsdom/node_modules/contextify/build/Makefile delete mode 100644 node_modules/jsdom/node_modules/contextify/build/Release/.deps/Release/contextify.node.d delete mode 100644 node_modules/jsdom/node_modules/contextify/build/Release/.deps/Release/obj.target/contextify/src/contextify.o.d delete mode 100755 node_modules/jsdom/node_modules/contextify/build/Release/contextify.node delete mode 100644 node_modules/jsdom/node_modules/contextify/build/Release/linker.lock delete mode 100644 node_modules/jsdom/node_modules/contextify/build/Release/obj.target/contextify/src/contextify.o delete mode 100644 node_modules/jsdom/node_modules/contextify/build/binding.Makefile delete mode 100644 node_modules/jsdom/node_modules/contextify/build/config.gypi delete mode 100644 node_modules/jsdom/node_modules/contextify/build/contextify.target.mk delete mode 100755 node_modules/jsdom/node_modules/contextify/build/gyp-mac-tool delete mode 100644 node_modules/jsdom/node_modules/contextify/changelog delete mode 100644 node_modules/jsdom/node_modules/contextify/lib/contextify.js delete mode 100644 node_modules/jsdom/node_modules/contextify/node_modules/bindings/README.md delete mode 100644 node_modules/jsdom/node_modules/contextify/node_modules/bindings/bindings.js delete mode 100644 node_modules/jsdom/node_modules/contextify/node_modules/bindings/package.json delete mode 100644 node_modules/jsdom/node_modules/contextify/package.json delete mode 100644 node_modules/jsdom/node_modules/contextify/src/contextify.cc delete mode 100644 node_modules/jsdom/node_modules/contextify/test/contextify.js delete mode 100644 node_modules/jsdom/node_modules/contextify/wscript delete mode 100644 node_modules/jsdom/node_modules/cssom/.gitmodules delete mode 100644 node_modules/jsdom/node_modules/cssom/.npmignore delete mode 100644 node_modules/jsdom/node_modules/cssom/README.mdown delete mode 100644 node_modules/jsdom/node_modules/cssom/lib/CSSFontFaceRule.js delete mode 100644 node_modules/jsdom/node_modules/cssom/lib/CSSImportRule.js delete mode 100644 node_modules/jsdom/node_modules/cssom/lib/CSSKeyframeRule.js delete mode 100644 node_modules/jsdom/node_modules/cssom/lib/CSSKeyframesRule.js delete mode 100644 node_modules/jsdom/node_modules/cssom/lib/CSSMediaRule.js delete mode 100644 node_modules/jsdom/node_modules/cssom/lib/CSSRule.js delete mode 100644 node_modules/jsdom/node_modules/cssom/lib/CSSStyleDeclaration.js delete mode 100644 node_modules/jsdom/node_modules/cssom/lib/CSSStyleRule.js delete mode 100644 node_modules/jsdom/node_modules/cssom/lib/CSSStyleSheet.js delete mode 100644 node_modules/jsdom/node_modules/cssom/lib/MediaList.js delete mode 100644 node_modules/jsdom/node_modules/cssom/lib/StyleSheet.js delete mode 100644 node_modules/jsdom/node_modules/cssom/lib/clone.js delete mode 100644 node_modules/jsdom/node_modules/cssom/lib/index.js delete mode 100644 node_modules/jsdom/node_modules/cssom/lib/parse.js delete mode 100644 node_modules/jsdom/node_modules/cssom/package.json delete mode 100644 node_modules/jsdom/node_modules/cssstyle/.npmignore delete mode 100644 node_modules/jsdom/node_modules/cssstyle/README.md delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/CSSStyleDeclaration.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/alignmentBaseline.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/azimuth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/background.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundAttachment.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundClip.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundImage.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundOrigin.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundPosition.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundPositionX.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundPositionY.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundRepeat.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundRepeatX.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundRepeatY.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/backgroundSize.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/baselineShift.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/border.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottom.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomLeftRadius.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomRightRadius.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomStyle.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderBottomWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderCollapse.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImage.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageOutset.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageRepeat.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageSlice.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageSource.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderImageWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderLeft.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderLeftColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderLeftStyle.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderLeftWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRadius.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRight.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRightColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRightStyle.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderRightWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderSpacing.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderStyle.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTop.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopLeftRadius.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopRightRadius.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopStyle.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderTopWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/borderWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/bottom.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/boxShadow.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/boxSizing.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/captionSide.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/clear.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/clip.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/clipPath.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/clipRule.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/color.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/colorInterpolation.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/colorInterpolationFilters.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/colorProfile.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/colorRendering.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/content.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/counterIncrement.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/counterReset.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/cssFloat.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/cue.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/cueAfter.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/cueBefore.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/cursor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/direction.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/display.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/dominantBaseline.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/elevation.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/emptyCells.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/enableBackground.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/fill.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/fillOpacity.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/fillRule.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/filter.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/floodColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/floodOpacity.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/font.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/fontFamily.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/fontSize.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/fontSizeAdjust.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/fontStretch.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/fontStyle.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/fontVariant.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/fontWeight.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/glyphOrientationHorizontal.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/glyphOrientationVertical.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/height.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/imageRendering.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/kerning.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/left.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/letterSpacing.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/lightingColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/lineHeight.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/listStyle.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/listStyleImage.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/listStylePosition.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/listStyleType.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/margin.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/marginBottom.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/marginLeft.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/marginRight.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/marginTop.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/marker.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/markerEnd.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/markerMid.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/markerOffset.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/markerStart.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/marks.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/mask.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/maxHeight.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/maxWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/minHeight.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/minWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/opacity.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/orphans.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/outline.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/outlineColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/outlineOffset.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/outlineStyle.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/outlineWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/overflow.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/overflowX.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/overflowY.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/padding.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/paddingBottom.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/paddingLeft.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/paddingRight.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/paddingTop.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/page.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/pageBreakAfter.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/pageBreakBefore.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/pageBreakInside.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/pause.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/pauseAfter.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/pauseBefore.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/pitch.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/pitchRange.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/playDuring.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/pointerEvents.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/position.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/quotes.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/resize.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/richness.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/right.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/shapeRendering.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/size.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/speak.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/speakHeader.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/speakNumeral.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/speakPunctuation.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/speechRate.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/src.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/stopColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/stopOpacity.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/stress.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/stroke.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeDasharray.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeDashoffset.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeLinecap.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeLinejoin.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeMiterlimit.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeOpacity.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/strokeWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/tableLayout.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textAlign.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textAnchor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textDecoration.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textIndent.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThrough.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThroughColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThroughMode.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThroughStyle.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textLineThroughWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverflow.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverline.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverlineColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverlineMode.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverlineStyle.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textOverlineWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textRendering.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textShadow.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textTransform.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderline.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderlineColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderlineMode.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderlineStyle.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/textUnderlineWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/top.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/unicodeBidi.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/unicodeRange.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/vectorEffect.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/verticalAlign.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/visibility.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/voiceFamily.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/volume.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimation.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationDelay.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationDirection.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationDuration.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationFillMode.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationIterationCount.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationName.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationPlayState.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAnimationTimingFunction.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAppearance.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitAspectRatio.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackfaceVisibility.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackgroundClip.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackgroundComposite.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackgroundOrigin.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBackgroundSize.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderAfter.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderAfterColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderAfterStyle.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderAfterWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderBefore.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderBeforeColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderBeforeStyle.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderBeforeWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderEnd.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderEndColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderEndStyle.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderEndWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderFit.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderHorizontalSpacing.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderImage.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderRadius.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderStart.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderStartColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderStartStyle.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderStartWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBorderVerticalSpacing.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxAlign.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxDirection.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxFlex.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxFlexGroup.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxLines.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxOrdinalGroup.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxOrient.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxPack.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxReflect.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitBoxShadow.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColorCorrection.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnAxis.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnBreakAfter.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnBreakBefore.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnBreakInside.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnCount.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnGap.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnRule.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnRuleColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnRuleStyle.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnRuleWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnSpan.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumnWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitColumns.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFilter.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexAlign.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexDirection.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexFlow.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexItemAlign.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexLinePack.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexOrder.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexPack.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlexWrap.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlowFrom.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFlowInto.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontFeatureSettings.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontKerning.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontSizeDelta.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontSmoothing.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitFontVariantLigatures.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHighlight.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphenateCharacter.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphenateLimitAfter.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphenateLimitBefore.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphenateLimitLines.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitHyphens.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineAlign.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineBoxContain.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineBreak.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineClamp.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineGrid.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLineSnap.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLocale.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLogicalHeight.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitLogicalWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginAfter.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginAfterCollapse.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginBefore.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginBeforeCollapse.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginBottomCollapse.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginCollapse.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginEnd.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginStart.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarginTopCollapse.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarquee.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeDirection.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeIncrement.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeRepetition.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeSpeed.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMarqueeStyle.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMask.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskAttachment.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImage.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageOutset.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageRepeat.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageSlice.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageSource.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskBoxImageWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskClip.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskComposite.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskImage.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskOrigin.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskPosition.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskPositionX.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskPositionY.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskRepeat.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskRepeatX.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskRepeatY.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaskSize.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMatchNearestMailBlockquoteColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaxLogicalHeight.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMaxLogicalWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMinLogicalHeight.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitMinLogicalWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitNbspMode.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitOverflowScrolling.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPaddingAfter.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPaddingBefore.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPaddingEnd.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPaddingStart.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPerspective.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPerspectiveOrigin.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPerspectiveOriginX.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPerspectiveOriginY.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitPrintColorAdjust.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRegionBreakAfter.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRegionBreakBefore.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRegionBreakInside.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRegionOverflow.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitRtlOrdering.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitSvgShadow.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTapHighlightColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextCombine.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextDecorationsInEffect.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextEmphasis.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextEmphasisColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextEmphasisPosition.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextEmphasisStyle.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextFillColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextOrientation.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextSecurity.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextSizeAdjust.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextStroke.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextStrokeColor.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTextStrokeWidth.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransform.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformOrigin.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformOriginX.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformOriginY.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformOriginZ.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransformStyle.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransition.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransitionDelay.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransitionDuration.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransitionProperty.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitTransitionTimingFunction.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitUserDrag.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitUserModify.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitUserSelect.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrap.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapFlow.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapMargin.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapPadding.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapShapeInside.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapShapeOutside.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWrapThrough.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/webkitWritingMode.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/whiteSpace.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/widows.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/width.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/wordBreak.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/wordSpacing.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/wordWrap.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/writingMode.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/zIndex.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/properties/zoom.js delete mode 100644 node_modules/jsdom/node_modules/cssstyle/lib/props delete mode 100755 node_modules/jsdom/node_modules/cssstyle/make_properties.pl delete mode 100644 node_modules/jsdom/node_modules/cssstyle/package.json delete mode 100644 node_modules/jsdom/node_modules/cssstyle/tests/tests.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/.project delete mode 100644 node_modules/jsdom/node_modules/htmlparser/.project.bak delete mode 100644 node_modules/jsdom/node_modules/htmlparser/.settings/.jsdtscope delete mode 100644 node_modules/jsdom/node_modules/htmlparser/.settings/org.eclipse.core.resources.prefs delete mode 100644 node_modules/jsdom/node_modules/htmlparser/.settings/org.eclipse.wst.jsdt.ui.superType.container delete mode 100644 node_modules/jsdom/node_modules/htmlparser/.settings/org.eclipse.wst.jsdt.ui.superType.name delete mode 100644 node_modules/jsdom/node_modules/htmlparser/CHANGELOG delete mode 100644 node_modules/jsdom/node_modules/htmlparser/LICENSE delete mode 100644 node_modules/jsdom/node_modules/htmlparser/README.md delete mode 100644 node_modules/jsdom/node_modules/htmlparser/a delete mode 100644 node_modules/jsdom/node_modules/htmlparser/b delete mode 100644 node_modules/jsdom/node_modules/htmlparser/c delete mode 100644 node_modules/jsdom/node_modules/htmlparser/json2.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/lib/htmlparser.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/lib/htmlparser.min.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/lib/node-htmlparser.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/lib/node-htmlparser.min.js delete mode 100755 node_modules/jsdom/node_modules/htmlparser/libxmljs.node delete mode 100644 node_modules/jsdom/node_modules/htmlparser/new/a delete mode 100644 node_modules/jsdom/node_modules/htmlparser/new/b delete mode 100644 node_modules/jsdom/node_modules/htmlparser/new/compat.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/new/htmlparser.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/new/parser.zip delete mode 100644 node_modules/jsdom/node_modules/htmlparser/new/test01.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/new/test02.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/newparser.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/node-htmlparser.old.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/package.json delete mode 100755 node_modules/jsdom/node_modules/htmlparser/profile delete mode 100644 node_modules/jsdom/node_modules/htmlparser/profile.getelement.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/profile.getelement.txt delete mode 100644 node_modules/jsdom/node_modules/htmlparser/profile.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/profileresults.txt delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/CHANGELOG delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/LICENSE delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/README.md delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/json2.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/lib/node-htmlparser.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/lib/node-htmlparser.min.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/package.json delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/profile.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/runtests.html delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/runtests.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/runtests.min.html delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/runtests.min.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/snippet.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/01-basic.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/02-single_tag_1.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/03-single_tag_2.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/04-unescaped_in_script.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/05-tags_in_comment.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/06-comment_in_script.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/07-unescaped_in_style.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/08-extra_spaces_in_tag.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/09-unquoted_attrib.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/10-singular_attribute.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/11-text_outside_tags.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/12-text_only.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/13-comment_in_text.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/14-comment_in_text_in_script.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/15-non-verbose.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/16-ignore_whitespace.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/17-xml_namespace.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/18-enforce_empty_tags.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/19-ignore_empty_tags.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/20-rss.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/21-atom.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/utils_example.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/rssbug.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/rssbug.rss delete mode 100644 node_modules/jsdom/node_modules/htmlparser/runtests.html delete mode 100644 node_modules/jsdom/node_modules/htmlparser/runtests.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/runtests.min.html delete mode 100644 node_modules/jsdom/node_modules/htmlparser/runtests.min.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/runtests_new.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/snippet.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/test01.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/testdata/.tmp_test.html.2854~ delete mode 100644 node_modules/jsdom/node_modules/htmlparser/testdata/.tmp_trackerchecker.html.65425~ delete mode 100644 node_modules/jsdom/node_modules/htmlparser/testdata/.tmp_trackerchecker.html.76922~ delete mode 100644 node_modules/jsdom/node_modules/htmlparser/testdata/.tmp_trackerchecker.html.80022~ delete mode 100644 node_modules/jsdom/node_modules/htmlparser/testdata/.tmp_trackerchecker2.html.51378~ delete mode 100644 node_modules/jsdom/node_modules/htmlparser/testdata/.tmp_trackerchecker2.html.75287~ delete mode 100644 node_modules/jsdom/node_modules/htmlparser/testdata/api.html delete mode 100644 node_modules/jsdom/node_modules/htmlparser/testdata/getelement.html delete mode 100644 node_modules/jsdom/node_modules/htmlparser/testdata/trackerchecker.html delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/01-basic.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/02-single_tag_1.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/03-single_tag_2.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/04-unescaped_in_script.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/05-tags_in_comment.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/06-comment_in_script.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/07-unescaped_in_style.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/08-extra_spaces_in_tag.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/09-unquoted_attrib.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/10-singular_attribute.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/11-text_outside_tags.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/12-text_only.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/13-comment_in_text.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/14-comment_in_text_in_script.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/15-non-verbose.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/16-ignore_whitespace.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/17-xml_namespace.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/18-enforce_empty_tags.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/19-ignore_empty_tags.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/20-rss.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/21-atom.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tests/22-position_data.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/tmp/snippet.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/utils_example.js delete mode 100644 node_modules/jsdom/node_modules/htmlparser/v8.log delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/.npmignore delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/LICENSE delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/README delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/dist/lint.log delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/dist/nwmatcher-min.js delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/dist/nwmatcher-pac.js delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/dist/nwmatcher-src.js delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/dist/nwmatcher-zip.js delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/dist/nwmatcher.js delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/lib/ender/bridge.js delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/lib/prototype/selector_engine.js delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/dom.js delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/headless-tests.js delete mode 100755 node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/js delete mode 100755 node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/libmozglue.dylib delete mode 100755 node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/libnspr4.dylib delete mode 100755 node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/libplc4.dylib delete mode 100755 node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/libplds4.dylib delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/nwmatcher.js delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/package.json delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/NEW/nwmatcher-base.js delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/NEW/nwmatcher.js delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/NEW2/nwmatcher-base.js.NEW delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/NEW2/nwmatcher.js.NEW delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/OLD/nwmatcher-GITHUB.js delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/OLD/nwmatcher-base-GITHUB.js delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/OLD2/nwmatcher-base.js.GITHUB delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/OLD2/nwmatcher-base.js.NEW delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/OLD2/nwmatcher-base.js.NEW2 delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/OLD2/nwmatcher-base.js.NEW3 delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/OLD2/nwmatcher-base.js.NEW4 delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-cache.js delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-jquery.js delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-pseudos.js delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-shortcuts.js delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-thin.js delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-traversal.js delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-webforms.js delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/nwmatcher-base.js delete mode 100644 node_modules/jsdom/node_modules/nwmatcher/src/nwmatcher.js delete mode 100644 node_modules/jsdom/node_modules/request/LICENSE delete mode 100644 node_modules/jsdom/node_modules/request/README.md delete mode 100644 node_modules/jsdom/node_modules/request/aws.js delete mode 100644 node_modules/jsdom/node_modules/request/forever.js delete mode 100644 node_modules/jsdom/node_modules/request/main.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/.npmignore delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/Makefile delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/Readme.md delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/lib/form_data.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node-form-data.sublime-project delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node-form-data.sublime-workspace delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/.gitmodules delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/LICENSE delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/Makefile delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/README.md delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/async.min.js.gzip delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.css delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/index.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/nodelint.cfg delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/package.json delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/test/.swp delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/test/test-async.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/test/test.html delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/.npmignore delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/License delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/Makefile delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js delete mode 100755 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/common.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file1.txt delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file2.txt delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-callback-streams.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-data-size.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-max-data-size.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-unpaused-streams.js delete mode 100755 node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/run.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/package.json delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/test/common.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/test/fixture/bacon.txt delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/test/fixture/unicycle.jpg delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/test/integration/test-form-get-length.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/test/integration/test-get-boundary.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/test/integration/test-http-response.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/test/integration/test-pipe.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/form-data/test/integration/test-submit.js delete mode 100755 node_modules/jsdom/node_modules/request/node_modules/form-data/test/run.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/mime/LICENSE delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/mime/README.md delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/mime/mime.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/mime/package.json delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/mime/test.js delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/mime/types/mime.types delete mode 100644 node_modules/jsdom/node_modules/request/node_modules/mime/types/node.types delete mode 100644 node_modules/jsdom/node_modules/request/oauth.js delete mode 100644 node_modules/jsdom/node_modules/request/package.json delete mode 100644 node_modules/jsdom/node_modules/request/tests/googledoodle.png delete mode 100644 node_modules/jsdom/node_modules/request/tests/run.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/server.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/squid.conf delete mode 100644 node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.cnf delete mode 100644 node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.crl delete mode 100644 node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.crt delete mode 100644 node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.csr delete mode 100644 node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.key delete mode 100644 node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.srl delete mode 100644 node_modules/jsdom/node_modules/request/tests/ssl/ca/server.cnf delete mode 100644 node_modules/jsdom/node_modules/request/tests/ssl/ca/server.crt delete mode 100644 node_modules/jsdom/node_modules/request/tests/ssl/ca/server.csr delete mode 100644 node_modules/jsdom/node_modules/request/tests/ssl/ca/server.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/ssl/ca/server.key delete mode 100644 node_modules/jsdom/node_modules/request/tests/ssl/npm-ca.crt delete mode 100644 node_modules/jsdom/node_modules/request/tests/ssl/test.crt delete mode 100644 node_modules/jsdom/node_modules/request/tests/ssl/test.key delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-body.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-cookie.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-cookiejar.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-defaults.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-errors.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-follow-all-303.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-follow-all.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-form.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-headers.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-httpModule.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-https-strict.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-https.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-oauth.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-params.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-piped-redirect.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-pipes.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-pool.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-protocol-changing-redirect.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-proxy.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-qs.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-redirect.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-s3.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-timeout.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-toJSON.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/test-tunnel.js delete mode 100644 node_modules/jsdom/node_modules/request/tests/unicycle.jpg delete mode 100644 node_modules/jsdom/node_modules/request/tunnel.js delete mode 100644 node_modules/jsdom/node_modules/request/uuid.js delete mode 100644 node_modules/jsdom/node_modules/request/vendor/cookie/index.js delete mode 100644 node_modules/jsdom/node_modules/request/vendor/cookie/jar.js delete mode 100644 node_modules/jsdom/package.json delete mode 100644 node_modules/jsdom/test.css delete mode 100644 node_modules/jsdom/test.js delete mode 100644 node_modules/request/LICENSE delete mode 100644 node_modules/request/README.md delete mode 100644 node_modules/request/aws.js delete mode 100644 node_modules/request/forever.js delete mode 100644 node_modules/request/main.js delete mode 100644 node_modules/request/node_modules/form-data/.npmignore delete mode 100644 node_modules/request/node_modules/form-data/Makefile delete mode 100644 node_modules/request/node_modules/form-data/Readme.md delete mode 100644 node_modules/request/node_modules/form-data/lib/form_data.js delete mode 100644 node_modules/request/node_modules/form-data/node-form-data.sublime-project delete mode 100644 node_modules/request/node_modules/form-data/node-form-data.sublime-workspace delete mode 100644 node_modules/request/node_modules/form-data/node_modules/async/.gitmodules delete mode 100644 node_modules/request/node_modules/form-data/node_modules/async/LICENSE delete mode 100644 node_modules/request/node_modules/form-data/node_modules/async/Makefile delete mode 100644 node_modules/request/node_modules/form-data/node_modules/async/README.md delete mode 100644 node_modules/request/node_modules/form-data/node_modules/async/async.min.js.gzip delete mode 100644 node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.css delete mode 100644 node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/async/index.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/async/lib/async.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/async/nodelint.cfg delete mode 100644 node_modules/request/node_modules/form-data/node_modules/async/package.json delete mode 100644 node_modules/request/node_modules/form-data/node_modules/async/test/.swp delete mode 100644 node_modules/request/node_modules/form-data/node_modules/async/test/test-async.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/async/test/test.html delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/.npmignore delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/License delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/Makefile delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js delete mode 100755 node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/test/common.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file1.txt delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file2.txt delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-callback-streams.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-data-size.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-max-data-size.js delete mode 100644 node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-unpaused-streams.js delete mode 100755 node_modules/request/node_modules/form-data/node_modules/combined-stream/test/run.js delete mode 100644 node_modules/request/node_modules/form-data/package.json delete mode 100644 node_modules/request/node_modules/form-data/test/common.js delete mode 100644 node_modules/request/node_modules/form-data/test/fixture/bacon.txt delete mode 100644 node_modules/request/node_modules/form-data/test/fixture/unicycle.jpg delete mode 100644 node_modules/request/node_modules/form-data/test/integration/test-form-get-length.js delete mode 100644 node_modules/request/node_modules/form-data/test/integration/test-get-boundary.js delete mode 100644 node_modules/request/node_modules/form-data/test/integration/test-http-response.js delete mode 100644 node_modules/request/node_modules/form-data/test/integration/test-pipe.js delete mode 100644 node_modules/request/node_modules/form-data/test/integration/test-submit.js delete mode 100755 node_modules/request/node_modules/form-data/test/run.js delete mode 100644 node_modules/request/node_modules/mime/LICENSE delete mode 100644 node_modules/request/node_modules/mime/README.md delete mode 100644 node_modules/request/node_modules/mime/mime.js delete mode 100644 node_modules/request/node_modules/mime/package.json delete mode 100644 node_modules/request/node_modules/mime/test.js delete mode 100644 node_modules/request/node_modules/mime/types/mime.types delete mode 100644 node_modules/request/node_modules/mime/types/node.types delete mode 100644 node_modules/request/oauth.js delete mode 100644 node_modules/request/package.json delete mode 100644 node_modules/request/tests/googledoodle.png delete mode 100644 node_modules/request/tests/run.js delete mode 100644 node_modules/request/tests/server.js delete mode 100644 node_modules/request/tests/squid.conf delete mode 100644 node_modules/request/tests/ssl/ca/ca.cnf delete mode 100644 node_modules/request/tests/ssl/ca/ca.crl delete mode 100644 node_modules/request/tests/ssl/ca/ca.crt delete mode 100644 node_modules/request/tests/ssl/ca/ca.csr delete mode 100644 node_modules/request/tests/ssl/ca/ca.key delete mode 100644 node_modules/request/tests/ssl/ca/ca.srl delete mode 100644 node_modules/request/tests/ssl/ca/server.cnf delete mode 100644 node_modules/request/tests/ssl/ca/server.crt delete mode 100644 node_modules/request/tests/ssl/ca/server.csr delete mode 100644 node_modules/request/tests/ssl/ca/server.js delete mode 100644 node_modules/request/tests/ssl/ca/server.key delete mode 100644 node_modules/request/tests/ssl/npm-ca.crt delete mode 100644 node_modules/request/tests/ssl/test.crt delete mode 100644 node_modules/request/tests/ssl/test.key delete mode 100644 node_modules/request/tests/test-body.js delete mode 100644 node_modules/request/tests/test-cookie.js delete mode 100644 node_modules/request/tests/test-cookiejar.js delete mode 100644 node_modules/request/tests/test-defaults.js delete mode 100644 node_modules/request/tests/test-errors.js delete mode 100644 node_modules/request/tests/test-follow-all-303.js delete mode 100644 node_modules/request/tests/test-follow-all.js delete mode 100644 node_modules/request/tests/test-form.js delete mode 100644 node_modules/request/tests/test-headers.js delete mode 100644 node_modules/request/tests/test-httpModule.js delete mode 100644 node_modules/request/tests/test-https-strict.js delete mode 100644 node_modules/request/tests/test-https.js delete mode 100644 node_modules/request/tests/test-oauth.js delete mode 100644 node_modules/request/tests/test-params.js delete mode 100644 node_modules/request/tests/test-piped-redirect.js delete mode 100644 node_modules/request/tests/test-pipes.js delete mode 100644 node_modules/request/tests/test-pool.js delete mode 100644 node_modules/request/tests/test-protocol-changing-redirect.js delete mode 100644 node_modules/request/tests/test-proxy.js delete mode 100644 node_modules/request/tests/test-qs.js delete mode 100644 node_modules/request/tests/test-redirect.js delete mode 100644 node_modules/request/tests/test-s3.js delete mode 100644 node_modules/request/tests/test-timeout.js delete mode 100644 node_modules/request/tests/test-toJSON.js delete mode 100644 node_modules/request/tests/test-tunnel.js delete mode 100644 node_modules/request/tests/unicycle.jpg delete mode 100644 node_modules/request/tunnel.js delete mode 100644 node_modules/request/uuid.js delete mode 100644 node_modules/request/vendor/cookie/index.js delete mode 100644 node_modules/request/vendor/cookie/jar.js delete mode 100644 node_modules/underscore/.npmignore delete mode 100644 node_modules/underscore/CNAME delete mode 100644 node_modules/underscore/CONTRIBUTING.md delete mode 100644 node_modules/underscore/LICENSE delete mode 100644 node_modules/underscore/README.md delete mode 100644 node_modules/underscore/favicon.ico delete mode 100644 node_modules/underscore/index.html delete mode 100644 node_modules/underscore/index.js delete mode 100644 node_modules/underscore/package.json delete mode 100644 node_modules/underscore/raw/underscore.psd delete mode 100644 node_modules/underscore/underscore-min.js delete mode 100644 node_modules/underscore/underscore.js diff --git a/.gitignore b/.gitignore index d54cf4f..6183182 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ #Mac OS X files -.DS_Store \ No newline at end of file +.DS_Store +.node_modules \ No newline at end of file diff --git a/node_modules/.bin/express b/node_modules/.bin/express deleted file mode 100755 index 3c0090c..0000000 --- a/node_modules/.bin/express +++ /dev/null @@ -1,422 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var exec = require('child_process').exec - , program = require('commander') - , mkdirp = require('mkdirp') - , pkg = require('../package.json') - , version = pkg.version - , os = require('os') - , fs = require('fs'); - -// CLI - -program - .version(version) - .option('-s, --sessions', 'add session support') - .option('-e, --ejs', 'add ejs engine support (defaults to jade)') - .option('-J, --jshtml', 'add jshtml engine support (defaults to jade)') - .option('-H, --hogan', 'add hogan.js engine support') - .option('-c, --css ', 'add stylesheet support (less|stylus) (defaults to plain css)') - .option('-f, --force', 'force on non-empty directory') - .parse(process.argv); - -// Path - -var path = program.args.shift() || '.'; - -// end-of-line code - -var eol = 'win32' == os.platform() ? '\r\n' : '\n' - -// Template engine - -program.template = 'jade'; -if (program.ejs) program.template = 'ejs'; -if (program.jshtml) program.template = 'jshtml'; -if (program.hogan) program.template = 'hjs'; - -/** - * Routes index template. - */ - -var index = [ - '' - , '/*' - , ' * GET home page.' - , ' */' - , '' - , 'exports.index = function(req, res){' - , ' res.render(\'index\', { title: \'Express\' });' - , '};' -].join(eol); - -/** - * Routes users template. - */ - -var users = [ - '' - , '/*' - , ' * GET users listing.' - , ' */' - , '' - , 'exports.list = function(req, res){' - , ' res.send("respond with a resource");' - , '};' -].join(eol); - -/** - * Jade layout template. - */ - -var jadeLayout = [ - 'doctype 5' - , 'html' - , ' head' - , ' title= title' - , ' link(rel=\'stylesheet\', href=\'/stylesheets/style.css\')' - , ' body' - , ' block content' -].join(eol); - -/** - * Jade index template. - */ - -var jadeIndex = [ - 'extends layout' - , '' - , 'block content' - , ' h1= title' - , ' p Welcome to #{title}' -].join(eol); - -/** - * EJS index template. - */ - -var ejsIndex = [ - '' - , '' - , ' ' - , ' <%= title %>' - , ' ' - , ' ' - , ' ' - , '

<%= title %>

' - , '

Welcome to <%= title %>

' - , ' ' - , '' -].join(eol); - -/** - * JSHTML layout template. - */ - -var jshtmlLayout = [ - '' - , '' - , ' ' - , ' @write(title) ' - , ' ' - , ' ' - , ' ' - , ' @write(body)' - , ' ' - , '' -].join(eol); - -/** - * JSHTML index template. - */ - -var jshtmlIndex = [ - '

@write(title)

' - , '

Welcome to @write(title)

' -].join(eol); - -/** - * Hogan.js index template. - */ -var hoganIndex = [ - '' - , '' - , ' ' - , ' {{ title }}' - , ' ' - , ' ' - , ' ' - , '

{{ title }}

' - , '

Welcome to {{ title }}

' - , ' ' - , '' -].join(eol); - -/** - * Default css template. - */ - -var css = [ - 'body {' - , ' padding: 50px;' - , ' font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;' - , '}' - , '' - , 'a {' - , ' color: #00B7FF;' - , '}' -].join(eol); - -/** - * Default less template. - */ - -var less = [ - 'body {' - , ' padding: 50px;' - , ' font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;' - , '}' - , '' - , 'a {' - , ' color: #00B7FF;' - , '}' -].join(eol); - -/** - * Default stylus template. - */ - -var stylus = [ - 'body' - , ' padding: 50px' - , ' font: 14px "Lucida Grande", Helvetica, Arial, sans-serif' - , 'a' - , ' color: #00B7FF' -].join(eol); - -/** - * App template. - */ - -var app = [ - '' - , '/**' - , ' * Module dependencies.' - , ' */' - , '' - , 'var express = require(\'express\')' - , ' , routes = require(\'./routes\')' - , ' , user = require(\'./routes/user\')' - , ' , http = require(\'http\')' - , ' , path = require(\'path\');' - , '' - , 'var app = express();' - , '' - , 'app.configure(function(){' - , ' app.set(\'port\', process.env.PORT || 3000);' - , ' app.set(\'views\', __dirname + \'/views\');' - , ' app.set(\'view engine\', \':TEMPLATE\');' - , ' app.use(express.favicon());' - , ' app.use(express.logger(\'dev\'));' - , ' app.use(express.bodyParser());' - , ' app.use(express.methodOverride());{sess}' - , ' app.use(app.router);{css}' - , ' app.use(express.static(path.join(__dirname, \'public\')));' - , '});' - , '' - , 'app.configure(\'development\', function(){' - , ' app.use(express.errorHandler());' - , '});' - , '' - , 'app.get(\'/\', routes.index);' - , 'app.get(\'/users\', user.list);' - , '' - , 'http.createServer(app).listen(app.get(\'port\'), function(){' - , ' console.log("Express server listening on port " + app.get(\'port\'));' - , '});' - , '' -].join(eol); - -// Generate application - -(function createApplication(path) { - emptyDirectory(path, function(empty){ - if (empty || program.force) { - createApplicationAt(path); - } else { - program.confirm('destination is not empty, continue? ', function(ok){ - if (ok) { - process.stdin.destroy(); - createApplicationAt(path); - } else { - abort('aborting'); - } - }); - } - }); -})(path); - -/** - * Create application at the given directory `path`. - * - * @param {String} path - */ - -function createApplicationAt(path) { - console.log(); - process.on('exit', function(){ - console.log(); - console.log(' install dependencies:'); - console.log(' $ cd %s && npm install', path); - console.log(); - console.log(' run the app:'); - console.log(' $ node app'); - console.log(); - }); - - mkdir(path, function(){ - mkdir(path + '/public'); - mkdir(path + '/public/javascripts'); - mkdir(path + '/public/images'); - mkdir(path + '/public/stylesheets', function(){ - switch (program.css) { - case 'less': - write(path + '/public/stylesheets/style.less', less); - break; - case 'stylus': - write(path + '/public/stylesheets/style.styl', stylus); - break; - default: - write(path + '/public/stylesheets/style.css', css); - } - }); - - mkdir(path + '/routes', function(){ - write(path + '/routes/index.js', index); - write(path + '/routes/user.js', users); - }); - - mkdir(path + '/views', function(){ - switch (program.template) { - case 'ejs': - write(path + '/views/index.ejs', ejsIndex); - break; - case 'jade': - write(path + '/views/layout.jade', jadeLayout); - write(path + '/views/index.jade', jadeIndex); - break; - case 'jshtml': - write(path + '/views/layout.jshtml', jshtmlLayout); - write(path + '/views/index.jshtml', jshtmlIndex); - break; - case 'hjs': - write(path + '/views/index.hjs', hoganIndex); - break; - - } - }); - - // CSS Engine support - switch (program.css) { - case 'less': - app = app.replace('{css}', eol + ' app.use(require(\'less-middleware\')({ src: __dirname + \'/public\' }));'); - break; - case 'stylus': - app = app.replace('{css}', eol + ' app.use(require(\'stylus\').middleware(__dirname + \'/public\'));'); - break; - default: - app = app.replace('{css}', ''); - } - - // Session support - app = app.replace('{sess}', program.sessions - ? eol + ' app.use(express.cookieParser(\'your secret here\'));' + eol + ' app.use(express.session());' - : ''); - - // Template support - app = app.replace(':TEMPLATE', program.template); - - // package.json - var pkg = { - name: 'application-name' - , version: '0.0.1' - , private: true - , scripts: { start: 'node app' } - , dependencies: { - express: version - } - } - - if (program.template) pkg.dependencies[program.template] = '*'; - - // CSS Engine support - switch (program.css) { - case 'less': - pkg.dependencies['less-middleware'] = '*'; - break; - default: - if (program.css) { - pkg.dependencies[program.css] = '*'; - } - } - - write(path + '/package.json', JSON.stringify(pkg, null, 2)); - write(path + '/app.js', app); - }); -} - -/** - * Check if the given directory `path` is empty. - * - * @param {String} path - * @param {Function} fn - */ - -function emptyDirectory(path, fn) { - fs.readdir(path, function(err, files){ - if (err && 'ENOENT' != err.code) throw err; - fn(!files || !files.length); - }); -} - -/** - * echo str > path. - * - * @param {String} path - * @param {String} str - */ - -function write(path, str) { - fs.writeFile(path, str); - console.log(' \x1b[36mcreate\x1b[0m : ' + path); -} - -/** - * Mkdir -p. - * - * @param {String} path - * @param {Function} fn - */ - -function mkdir(path, fn) { - mkdirp(path, 0755, function(err){ - if (err) throw err; - console.log(' \033[36mcreate\033[0m : ' + path); - fn && fn(); - }); -} - -/** - * Exit with the given `str`. - * - * @param {String} str - */ - -function abort(str) { - console.error(str); - process.exit(1); -} diff --git a/node_modules/.bin/jade b/node_modules/.bin/jade deleted file mode 100755 index 8f1c816..0000000 --- a/node_modules/.bin/jade +++ /dev/null @@ -1,168 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var fs = require('fs') - , program = require('commander') - , path = require('path') - , basename = path.basename - , dirname = path.dirname - , resolve = path.resolve - , exists = fs.existsSync || path.existsSync - , join = path.join - , mkdirp = require('mkdirp') - , jade = require('../'); - -// jade options - -var options = {}; - -// options - -program - .version(jade.version) - .usage('[options] [dir|file ...]') - .option('-o, --obj ', 'javascript options object') - .option('-O, --out ', 'output the compiled html to ') - .option('-p, --path ', 'filename used to resolve includes') - .option('-P, --pretty', 'compile pretty html output') - .option('-c, --client', 'compile function for client-side runtime.js') - .option('-D, --no-debug', 'compile without debugging (smaller functions)') - .option('-w, --watch', 'watch files for changes and automatically re-render') - -program.on('--help', function(){ - console.log(' Examples:'); - console.log(''); - console.log(' # translate jade the templates dir'); - console.log(' $ jade templates'); - console.log(''); - console.log(' # create {foo,bar}.html'); - console.log(' $ jade {foo,bar}.jade'); - console.log(''); - console.log(' # jade over stdio'); - console.log(' $ jade < my.jade > my.html'); - console.log(''); - console.log(' # jade over stdio'); - console.log(' $ echo "h1 Jade!" | jade'); - console.log(''); - console.log(' # foo, bar dirs rendering to /tmp'); - console.log(' $ jade foo bar --out /tmp '); - console.log(''); -}); - -program.parse(process.argv); - -// options given, parse them - -if (program.obj) { - if (exists(program.obj)) { - options = JSON.parse(fs.readFileSync(program.obj)); - } else { - options = eval('(' + program.obj + ')'); - } -} - -// --filename - -if (program.path) options.filename = program.path; - -// --no-debug - -options.compileDebug = program.debug; - -// --client - -options.client = program.client; - -// --pretty - -options.pretty = program.pretty; - -// --watch - -options.watch = program.watch; - -// left-over args are file paths - -var files = program.args; - -// compile files - -if (files.length) { - console.log(); - files.forEach(renderFile); - if (options.watch) { - files.forEach(function (file) { - fs.watchFile(file, {interval: 100}, function (curr, prev) { - if (curr.mtime > prev.mtime) renderFile(file); - }); - }); - } - process.on('exit', function () { - console.log(); - }); -// stdio -} else { - stdin(); -} - -/** - * Compile from stdin. - */ - -function stdin() { - var buf = ''; - process.stdin.setEncoding('utf8'); - process.stdin.on('data', function(chunk){ buf += chunk; }); - process.stdin.on('end', function(){ - var fn = jade.compile(buf, options); - var output = options.client - ? fn.toString() - : fn(options); - process.stdout.write(output); - }).resume(); -} - -/** - * Process the given path, compiling the jade files found. - * Always walk the subdirectories. - */ - -function renderFile(path) { - var re = /\.jade$/; - fs.lstat(path, function(err, stat) { - if (err) throw err; - // Found jade file - if (stat.isFile() && re.test(path)) { - fs.readFile(path, 'utf8', function(err, str){ - if (err) throw err; - options.filename = path; - var fn = jade.compile(str, options); - var extname = options.client ? '.js' : '.html'; - path = path.replace(re, extname); - if (program.out) path = join(program.out, basename(path)); - var dir = resolve(dirname(path)); - mkdirp(dir, 0755, function(err){ - if (err) throw err; - var output = options.client - ? fn.toString() - : fn(options); - fs.writeFile(path, output, function(err){ - if (err) throw err; - console.log(' \033[90mrendered \033[36m%s\033[0m', path); - }); - }); - }); - // Found directory - } else if (stat.isDirectory()) { - fs.readdir(path, function(err, files) { - if (err) throw err; - files.map(function(filename) { - return path + '/' + filename; - }).forEach(renderFile); - }); - } - }); -} diff --git a/node_modules/express/.npmignore b/node_modules/express/.npmignore deleted file mode 100644 index caf574d..0000000 --- a/node_modules/express/.npmignore +++ /dev/null @@ -1,9 +0,0 @@ -.git* -docs/ -examples/ -support/ -test/ -testing.js -.DS_Store -coverage.html -lib-cov diff --git a/node_modules/express/.travis.yml b/node_modules/express/.travis.yml deleted file mode 100644 index 895dbd3..0000000 --- a/node_modules/express/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 diff --git a/node_modules/express/History.md b/node_modules/express/History.md deleted file mode 100644 index 1a2b171..0000000 --- a/node_modules/express/History.md +++ /dev/null @@ -1,1091 +0,0 @@ - -3.1.0 / 2013-01-25 -================== - - * add support for leading "." in "view engine" setting - * add array support to `res.set()` - * add node 0.8.x to travis.yml - * add "subdomain offset" setting for tweaking `req.subdomains` - * add `res.location(url)` implementing `res.redirect()`-like setting of Location - * use app.get() for x-powered-by setting for inheritance - * fix colons in passwords for `req.auth` - -3.0.6 / 2013-01-04 -================== - - * add http verb methods to Router - * update connect - * fix mangling of the `res.cookie()` options object - * fix jsonp whitespace escape. Closes #1132 - -3.0.5 / 2012-12-19 -================== - - * add throwing when a non-function is passed to a route - * fix: explicitly remove Transfer-Encoding header from 204 and 304 responses - * revert "add 'etag' option" - -3.0.4 / 2012-12-05 -================== - - * add 'etag' option to disable `res.send()` Etags - * add escaping of urls in text/plain in `res.redirect()` - for old browsers interpreting as html - * change crc32 module for a more liberal license - * update connect - -3.0.3 / 2012-11-13 -================== - - * update connect - * update cookie module - * fix cookie max-age - -3.0.2 / 2012-11-08 -================== - - * add OPTIONS to cors example. Closes #1398 - * fix route chaining regression. Closes #1397 - -3.0.1 / 2012-11-01 -================== - - * update connect - -3.0.0 / 2012-10-23 -================== - - * add `make clean` - * add "Basic" check to req.auth - * add `req.auth` test coverage - * add cb && cb(payload) to `res.jsonp()`. Closes #1374 - * add backwards compat for `res.redirect()` status. Closes #1336 - * add support for `res.json()` to retain previously defined Content-Types. Closes #1349 - * update connect - * change `res.redirect()` to utilize a pathname-relative Location again. Closes #1382 - * remove non-primitive string support for `res.send()` - * fix view-locals example. Closes #1370 - * fix route-separation example - -3.0.0rc5 / 2012-09-18 -================== - - * update connect - * add redis search example - * add static-files example - * add "x-powered-by" setting (`app.disable('x-powered-by')`) - * add "application/octet-stream" redirect Accept test case. Closes #1317 - -3.0.0rc4 / 2012-08-30 -================== - - * add `res.jsonp()`. Closes #1307 - * add "verbose errors" option to error-pages example - * add another route example to express(1) so people are not so confused - * add redis online user activity tracking example - * update connect dep - * fix etag quoting. Closes #1310 - * fix error-pages 404 status - * fix jsonp callback char restrictions - * remove old OPTIONS default response - -3.0.0rc3 / 2012-08-13 -================== - - * update connect dep - * fix signed cookies to work with `connect.cookieParser()` ("s:" prefix was missing) [tnydwrds] - * fix `res.render()` clobbering of "locals" - -3.0.0rc2 / 2012-08-03 -================== - - * add CORS example - * update connect dep - * deprecate `.createServer()` & remove old stale examples - * fix: escape `res.redirect()` link - * fix vhost example - -3.0.0rc1 / 2012-07-24 -================== - - * add more examples to view-locals - * add scheme-relative redirects (`res.redirect("//foo.com")`) support - * update cookie dep - * update connect dep - * update send dep - * fix `express(1)` -h flag, use -H for hogan. Closes #1245 - * fix `res.sendfile()` socket error handling regression - -3.0.0beta7 / 2012-07-16 -================== - - * update connect dep for `send()` root normalization regression - -3.0.0beta6 / 2012-07-13 -================== - - * add `err.view` property for view errors. Closes #1226 - * add "jsonp callback name" setting - * add support for "/foo/:bar*" non-greedy matches - * change `res.sendfile()` to use `send()` module - * change `res.send` to use "response-send" module - * remove `app.locals.use` and `res.locals.use`, use regular middleware - -3.0.0beta5 / 2012-07-03 -================== - - * add "make check" support - * add route-map example - * add `res.json(obj, status)` support back for BC - * add "methods" dep, remove internal methods module - * update connect dep - * update auth example to utilize cores pbkdf2 - * updated tests to use "supertest" - -3.0.0beta4 / 2012-06-25 -================== - - * Added `req.auth` - * Added `req.range(size)` - * Added `res.links(obj)` - * Added `res.send(body, status)` support back for backwards compat - * Added `.default()` support to `res.format()` - * Added 2xx / 304 check to `req.fresh` - * Revert "Added + support to the router" - * Fixed `res.send()` freshness check, respect res.statusCode - -3.0.0beta3 / 2012-06-15 -================== - - * Added hogan `--hjs` to express(1) [nullfirm] - * Added another example to content-negotiation - * Added `fresh` dep - * Changed: `res.send()` always checks freshness - * Fixed: expose connects mime module. Cloases #1165 - -3.0.0beta2 / 2012-06-06 -================== - - * Added `+` support to the router - * Added `req.host` - * Changed `req.param()` to check route first - * Update connect dep - -3.0.0beta1 / 2012-06-01 -================== - - * Added `res.format()` callback to override default 406 behaviour - * Fixed `res.redirect()` 406. Closes #1154 - -3.0.0alpha5 / 2012-05-30 -================== - - * Added `req.ip` - * Added `{ signed: true }` option to `res.cookie()` - * Removed `res.signedCookie()` - * Changed: dont reverse `req.ips` - * Fixed "trust proxy" setting check for `req.ips` - -3.0.0alpha4 / 2012-05-09 -================== - - * Added: allow `[]` in jsonp callback. Closes #1128 - * Added `PORT` env var support in generated template. Closes #1118 [benatkin] - * Updated: connect 2.2.2 - -3.0.0alpha3 / 2012-05-04 -================== - - * Added public `app.routes`. Closes #887 - * Added _view-locals_ example - * Added _mvc_ example - * Added `res.locals.use()`. Closes #1120 - * Added conditional-GET support to `res.send()` - * Added: coerce `res.set()` values to strings - * Changed: moved `static()` in generated apps below router - * Changed: `res.send()` only set ETag when not previously set - * Changed connect 2.2.1 dep - * Changed: `make test` now runs unit / acceptance tests - * Fixed req/res proto inheritance - -3.0.0alpha2 / 2012-04-26 -================== - - * Added `make benchmark` back - * Added `res.send()` support for `String` objects - * Added client-side data exposing example - * Added `res.header()` and `req.header()` aliases for BC - * Added `express.createServer()` for BC - * Perf: memoize parsed urls - * Perf: connect 2.2.0 dep - * Changed: make `expressInit()` middleware self-aware - * Fixed: use app.get() for all core settings - * Fixed redis session example - * Fixed session example. Closes #1105 - * Fixed generated express dep. Closes #1078 - -3.0.0alpha1 / 2012-04-15 -================== - - * Added `app.locals.use(callback)` - * Added `app.locals` object - * Added `app.locals(obj)` - * Added `res.locals` object - * Added `res.locals(obj)` - * Added `res.format()` for content-negotiation - * Added `app.engine()` - * Added `res.cookie()` JSON cookie support - * Added "trust proxy" setting - * Added `req.subdomains` - * Added `req.protocol` - * Added `req.secure` - * Added `req.path` - * Added `req.ips` - * Added `req.fresh` - * Added `req.stale` - * Added comma-delmited / array support for `req.accepts()` - * Added debug instrumentation - * Added `res.set(obj)` - * Added `res.set(field, value)` - * Added `res.get(field)` - * Added `app.get(setting)`. Closes #842 - * Added `req.acceptsLanguage()` - * Added `req.acceptsCharset()` - * Added `req.accepted` - * Added `req.acceptedLanguages` - * Added `req.acceptedCharsets` - * Added "json replacer" setting - * Added "json spaces" setting - * Added X-Forwarded-Proto support to `res.redirect()`. Closes #92 - * Added `--less` support to express(1) - * Added `express.response` prototype - * Added `express.request` prototype - * Added `express.application` prototype - * Added `app.path()` - * Added `app.render()` - * Added `res.type()` to replace `res.contentType()` - * Changed: `res.redirect()` to add relative support - * Changed: enable "jsonp callback" by default - * Changed: renamed "case sensitive routes" to "case sensitive routing" - * Rewrite of all tests with mocha - * Removed "root" setting - * Removed `res.redirect('home')` support - * Removed `req.notify()` - * Removed `app.register()` - * Removed `app.redirect()` - * Removed `app.is()` - * Removed `app.helpers()` - * Removed `app.dynamicHelpers()` - * Fixed `res.sendfile()` with non-GET. Closes #723 - * Fixed express(1) public dir for windows. Closes #866 - -2.5.9/ 2012-04-02 -================== - - * Added support for PURGE request method [pbuyle] - * Fixed `express(1)` generated app `app.address()` before `listening` [mmalecki] - -2.5.8 / 2012-02-08 -================== - - * Update mkdirp dep. Closes #991 - -2.5.7 / 2012-02-06 -================== - - * Fixed `app.all` duplicate DELETE requests [mscdex] - -2.5.6 / 2012-01-13 -================== - - * Updated hamljs dev dep. Closes #953 - -2.5.5 / 2012-01-08 -================== - - * Fixed: set `filename` on cached templates [matthewleon] - -2.5.4 / 2012-01-02 -================== - - * Fixed `express(1)` eol on 0.4.x. Closes #947 - -2.5.3 / 2011-12-30 -================== - - * Fixed `req.is()` when a charset is present - -2.5.2 / 2011-12-10 -================== - - * Fixed: express(1) LF -> CRLF for windows - -2.5.1 / 2011-11-17 -================== - - * Changed: updated connect to 1.8.x - * Removed sass.js support from express(1) - -2.5.0 / 2011-10-24 -================== - - * Added ./routes dir for generated app by default - * Added npm install reminder to express(1) app gen - * Added 0.5.x support - * Removed `make test-cov` since it wont work with node 0.5.x - * Fixed express(1) public dir for windows. Closes #866 - -2.4.7 / 2011-10-05 -================== - - * Added mkdirp to express(1). Closes #795 - * Added simple _json-config_ example - * Added shorthand for the parsed request's pathname via `req.path` - * Changed connect dep to 1.7.x to fix npm issue... - * Fixed `res.redirect()` __HEAD__ support. [reported by xerox] - * Fixed `req.flash()`, only escape args - * Fixed absolute path checking on windows. Closes #829 [reported by andrewpmckenzie] - -2.4.6 / 2011-08-22 -================== - - * Fixed multiple param callback regression. Closes #824 [reported by TroyGoode] - -2.4.5 / 2011-08-19 -================== - - * Added support for routes to handle errors. Closes #809 - * Added `app.routes.all()`. Closes #803 - * Added "basepath" setting to work in conjunction with reverse proxies etc. - * Refactored `Route` to use a single array of callbacks - * Added support for multiple callbacks for `app.param()`. Closes #801 -Closes #805 - * Changed: removed .call(self) for route callbacks - * Dependency: `qs >= 0.3.1` - * Fixed `res.redirect()` on windows due to `join()` usage. Closes #808 - -2.4.4 / 2011-08-05 -================== - - * Fixed `res.header()` intention of a set, even when `undefined` - * Fixed `*`, value no longer required - * Fixed `res.send(204)` support. Closes #771 - -2.4.3 / 2011-07-14 -================== - - * Added docs for `status` option special-case. Closes #739 - * Fixed `options.filename`, exposing the view path to template engines - -2.4.2. / 2011-07-06 -================== - - * Revert "removed jsonp stripping" for XSS - -2.4.1 / 2011-07-06 -================== - - * Added `res.json()` JSONP support. Closes #737 - * Added _extending-templates_ example. Closes #730 - * Added "strict routing" setting for trailing slashes - * Added support for multiple envs in `app.configure()` calls. Closes #735 - * Changed: `res.send()` using `res.json()` - * Changed: when cookie `path === null` don't default it - * Changed; default cookie path to "home" setting. Closes #731 - * Removed _pids/logs_ creation from express(1) - -2.4.0 / 2011-06-28 -================== - - * Added chainable `res.status(code)` - * Added `res.json()`, an explicit version of `res.send(obj)` - * Added simple web-service example - -2.3.12 / 2011-06-22 -================== - - * \#express is now on freenode! come join! - * Added `req.get(field, param)` - * Added links to Japanese documentation, thanks @hideyukisaito! - * Added; the `express(1)` generated app outputs the env - * Added `content-negotiation` example - * Dependency: connect >= 1.5.1 < 2.0.0 - * Fixed view layout bug. Closes #720 - * Fixed; ignore body on 304. Closes #701 - -2.3.11 / 2011-06-04 -================== - - * Added `npm test` - * Removed generation of dummy test file from `express(1)` - * Fixed; `express(1)` adds express as a dep - * Fixed; prune on `prepublish` - -2.3.10 / 2011-05-27 -================== - - * Added `req.route`, exposing the current route - * Added _package.json_ generation support to `express(1)` - * Fixed call to `app.param()` function for optional params. Closes #682 - -2.3.9 / 2011-05-25 -================== - - * Fixed bug-ish with `../' in `res.partial()` calls - -2.3.8 / 2011-05-24 -================== - - * Fixed `app.options()` - -2.3.7 / 2011-05-23 -================== - - * Added route `Collection`, ex: `app.get('/user/:id').remove();` - * Added support for `app.param(fn)` to define param logic - * Removed `app.param()` support for callback with return value - * Removed module.parent check from express(1) generated app. Closes #670 - * Refactored router. Closes #639 - -2.3.6 / 2011-05-20 -================== - - * Changed; using devDependencies instead of git submodules - * Fixed redis session example - * Fixed markdown example - * Fixed view caching, should not be enabled in development - -2.3.5 / 2011-05-20 -================== - - * Added export `.view` as alias for `.View` - -2.3.4 / 2011-05-08 -================== - - * Added `./examples/say` - * Fixed `res.sendfile()` bug preventing the transfer of files with spaces - -2.3.3 / 2011-05-03 -================== - - * Added "case sensitive routes" option. - * Changed; split methods supported per rfc [slaskis] - * Fixed route-specific middleware when using the same callback function several times - -2.3.2 / 2011-04-27 -================== - - * Fixed view hints - -2.3.1 / 2011-04-26 -================== - - * Added `app.match()` as `app.match.all()` - * Added `app.lookup()` as `app.lookup.all()` - * Added `app.remove()` for `app.remove.all()` - * Added `app.remove.VERB()` - * Fixed template caching collision issue. Closes #644 - * Moved router over from connect and started refactor - -2.3.0 / 2011-04-25 -================== - - * Added options support to `res.clearCookie()` - * Added `res.helpers()` as alias of `res.locals()` - * Added; json defaults to UTF-8 with `res.send()`. Closes #632. [Daniel * Dependency `connect >= 1.4.0` - * Changed; auto set Content-Type in res.attachement [Aaron Heckmann] - * Renamed "cache views" to "view cache". Closes #628 - * Fixed caching of views when using several apps. Closes #637 - * Fixed gotcha invoking `app.param()` callbacks once per route middleware. -Closes #638 - * Fixed partial lookup precedence. Closes #631 -Shaw] - -2.2.2 / 2011-04-12 -================== - - * Added second callback support for `res.download()` connection errors - * Fixed `filename` option passing to template engine - -2.2.1 / 2011-04-04 -================== - - * Added `layout(path)` helper to change the layout within a view. Closes #610 - * Fixed `partial()` collection object support. - Previously only anything with `.length` would work. - When `.length` is present one must still be aware of holes, - however now `{ collection: {foo: 'bar'}}` is valid, exposes - `keyInCollection` and `keysInCollection`. - - * Performance improved with better view caching - * Removed `request` and `response` locals - * Changed; errorHandler page title is now `Express` instead of `Connect` - -2.2.0 / 2011-03-30 -================== - - * Added `app.lookup.VERB()`, ex `app.lookup.put('/user/:id')`. Closes #606 - * Added `app.match.VERB()`, ex `app.match.put('/user/12')`. Closes #606 - * Added `app.VERB(path)` as alias of `app.lookup.VERB()`. - * Dependency `connect >= 1.2.0` - -2.1.1 / 2011-03-29 -================== - - * Added; expose `err.view` object when failing to locate a view - * Fixed `res.partial()` call `next(err)` when no callback is given [reported by aheckmann] - * Fixed; `res.send(undefined)` responds with 204 [aheckmann] - -2.1.0 / 2011-03-24 -================== - - * Added `/_?` partial lookup support. Closes #447 - * Added `request`, `response`, and `app` local variables - * Added `settings` local variable, containing the app's settings - * Added `req.flash()` exception if `req.session` is not available - * Added `res.send(bool)` support (json response) - * Fixed stylus example for latest version - * Fixed; wrap try/catch around `res.render()` - -2.0.0 / 2011-03-17 -================== - - * Fixed up index view path alternative. - * Changed; `res.locals()` without object returns the locals - -2.0.0rc3 / 2011-03-17 -================== - - * Added `res.locals(obj)` to compliment `res.local(key, val)` - * Added `res.partial()` callback support - * Fixed recursive error reporting issue in `res.render()` - -2.0.0rc2 / 2011-03-17 -================== - - * Changed; `partial()` "locals" are now optional - * Fixed `SlowBuffer` support. Closes #584 [reported by tyrda01] - * Fixed .filename view engine option [reported by drudge] - * Fixed blog example - * Fixed `{req,res}.app` reference when mounting [Ben Weaver] - -2.0.0rc / 2011-03-14 -================== - - * Fixed; expose `HTTPSServer` constructor - * Fixed express(1) default test charset. Closes #579 [reported by secoif] - * Fixed; default charset to utf-8 instead of utf8 for lame IE [reported by NickP] - -2.0.0beta3 / 2011-03-09 -================== - - * Added support for `res.contentType()` literal - The original `res.contentType('.json')`, - `res.contentType('application/json')`, and `res.contentType('json')` - will work now. - * Added `res.render()` status option support back - * Added charset option for `res.render()` - * Added `.charset` support (via connect 1.0.4) - * Added view resolution hints when in development and a lookup fails - * Added layout lookup support relative to the page view. - For example while rendering `./views/user/index.jade` if you create - `./views/user/layout.jade` it will be used in favour of the root layout. - * Fixed `res.redirect()`. RFC states absolute url [reported by unlink] - * Fixed; default `res.send()` string charset to utf8 - * Removed `Partial` constructor (not currently used) - -2.0.0beta2 / 2011-03-07 -================== - - * Added res.render() `.locals` support back to aid in migration process - * Fixed flash example - -2.0.0beta / 2011-03-03 -================== - - * Added HTTPS support - * Added `res.cookie()` maxAge support - * Added `req.header()` _Referrer_ / _Referer_ special-case, either works - * Added mount support for `res.redirect()`, now respects the mount-point - * Added `union()` util, taking place of `merge(clone())` combo - * Added stylus support to express(1) generated app - * Added secret to session middleware used in examples and generated app - * Added `res.local(name, val)` for progressive view locals - * Added default param support to `req.param(name, default)` - * Added `app.disabled()` and `app.enabled()` - * Added `app.register()` support for omitting leading ".", either works - * Added `res.partial()`, using the same interface as `partial()` within a view. Closes #539 - * Added `app.param()` to map route params to async/sync logic - * Added; aliased `app.helpers()` as `app.locals()`. Closes #481 - * Added extname with no leading "." support to `res.contentType()` - * Added `cache views` setting, defaulting to enabled in "production" env - * Added index file partial resolution, eg: partial('user') may try _views/user/index.jade_. - * Added `req.accepts()` support for extensions - * Changed; `res.download()` and `res.sendfile()` now utilize Connect's - static file server `connect.static.send()`. - * Changed; replaced `connect.utils.mime()` with npm _mime_ module - * Changed; allow `req.query` to be pre-defined (via middleware or other parent - * Changed view partial resolution, now relative to parent view - * Changed view engine signature. no longer `engine.render(str, options, callback)`, now `engine.compile(str, options) -> Function`, the returned function accepts `fn(locals)`. - * Fixed `req.param()` bug returning Array.prototype methods. Closes #552 - * Fixed; using `Stream#pipe()` instead of `sys.pump()` in `res.sendfile()` - * Fixed; using _qs_ module instead of _querystring_ - * Fixed; strip unsafe chars from jsonp callbacks - * Removed "stream threshold" setting - -1.0.8 / 2011-03-01 -================== - - * Allow `req.query` to be pre-defined (via middleware or other parent app) - * "connect": ">= 0.5.0 < 1.0.0". Closes #547 - * Removed the long deprecated __EXPRESS_ENV__ support - -1.0.7 / 2011-02-07 -================== - - * Fixed `render()` setting inheritance. - Mounted apps would not inherit "view engine" - -1.0.6 / 2011-02-07 -================== - - * Fixed `view engine` setting bug when period is in dirname - -1.0.5 / 2011-02-05 -================== - - * Added secret to generated app `session()` call - -1.0.4 / 2011-02-05 -================== - - * Added `qs` dependency to _package.json_ - * Fixed namespaced `require()`s for latest connect support - -1.0.3 / 2011-01-13 -================== - - * Remove unsafe characters from JSONP callback names [Ryan Grove] - -1.0.2 / 2011-01-10 -================== - - * Removed nested require, using `connect.router` - -1.0.1 / 2010-12-29 -================== - - * Fixed for middleware stacked via `createServer()` - previously the `foo` middleware passed to `createServer(foo)` - would not have access to Express methods such as `res.send()` - or props like `req.query` etc. - -1.0.0 / 2010-11-16 -================== - - * Added; deduce partial object names from the last segment. - For example by default `partial('forum/post', postObject)` will - give you the _post_ object, providing a meaningful default. - * Added http status code string representation to `res.redirect()` body - * Added; `res.redirect()` supporting _text/plain_ and _text/html_ via __Accept__. - * Added `req.is()` to aid in content negotiation - * Added partial local inheritance [suggested by masylum]. Closes #102 - providing access to parent template locals. - * Added _-s, --session[s]_ flag to express(1) to add session related middleware - * Added _--template_ flag to express(1) to specify the - template engine to use. - * Added _--css_ flag to express(1) to specify the - stylesheet engine to use (or just plain css by default). - * Added `app.all()` support [thanks aheckmann] - * Added partial direct object support. - You may now `partial('user', user)` providing the "user" local, - vs previously `partial('user', { object: user })`. - * Added _route-separation_ example since many people question ways - to do this with CommonJS modules. Also view the _blog_ example for - an alternative. - * Performance; caching view path derived partial object names - * Fixed partial local inheritance precedence. [reported by Nick Poulden] Closes #454 - * Fixed jsonp support; _text/javascript_ as per mailinglist discussion - -1.0.0rc4 / 2010-10-14 -================== - - * Added _NODE_ENV_ support, _EXPRESS_ENV_ is deprecated and will be removed in 1.0.0 - * Added route-middleware support (very helpful, see the [docs](http://expressjs.com/guide.html#Route-Middleware)) - * Added _jsonp callback_ setting to enable/disable jsonp autowrapping [Dav Glass] - * Added callback query check on response.send to autowrap JSON objects for simple webservice implementations [Dav Glass] - * Added `partial()` support for array-like collections. Closes #434 - * Added support for swappable querystring parsers - * Added session usage docs. Closes #443 - * Added dynamic helper caching. Closes #439 [suggested by maritz] - * Added authentication example - * Added basic Range support to `res.sendfile()` (and `res.download()` etc) - * Changed; `express(1)` generated app using 2 spaces instead of 4 - * Default env to "development" again [aheckmann] - * Removed _context_ option is no more, use "scope" - * Fixed; exposing _./support_ libs to examples so they can run without installs - * Fixed mvc example - -1.0.0rc3 / 2010-09-20 -================== - - * Added confirmation for `express(1)` app generation. Closes #391 - * Added extending of flash formatters via `app.flashFormatters` - * Added flash formatter support. Closes #411 - * Added streaming support to `res.sendfile()` using `sys.pump()` when >= "stream threshold" - * Added _stream threshold_ setting for `res.sendfile()` - * Added `res.send()` __HEAD__ support - * Added `res.clearCookie()` - * Added `res.cookie()` - * Added `res.render()` headers option - * Added `res.redirect()` response bodies - * Added `res.render()` status option support. Closes #425 [thanks aheckmann] - * Fixed `res.sendfile()` responding with 403 on malicious path - * Fixed `res.download()` bug; when an error occurs remove _Content-Disposition_ - * Fixed; mounted apps settings now inherit from parent app [aheckmann] - * Fixed; stripping Content-Length / Content-Type when 204 - * Fixed `res.send()` 204. Closes #419 - * Fixed multiple _Set-Cookie_ headers via `res.header()`. Closes #402 - * Fixed bug messing with error handlers when `listenFD()` is called instead of `listen()`. [thanks guillermo] - - -1.0.0rc2 / 2010-08-17 -================== - - * Added `app.register()` for template engine mapping. Closes #390 - * Added `res.render()` callback support as second argument (no options) - * Added callback support to `res.download()` - * Added callback support for `res.sendfile()` - * Added support for middleware access via `express.middlewareName()` vs `connect.middlewareName()` - * Added "partials" setting to docs - * Added default expresso tests to `express(1)` generated app. Closes #384 - * Fixed `res.sendfile()` error handling, defer via `next()` - * Fixed `res.render()` callback when a layout is used [thanks guillermo] - * Fixed; `make install` creating ~/.node_libraries when not present - * Fixed issue preventing error handlers from being defined anywhere. Closes #387 - -1.0.0rc / 2010-07-28 -================== - - * Added mounted hook. Closes #369 - * Added connect dependency to _package.json_ - - * Removed "reload views" setting and support code - development env never caches, production always caches. - - * Removed _param_ in route callbacks, signature is now - simply (req, res, next), previously (req, res, params, next). - Use _req.params_ for path captures, _req.query_ for GET params. - - * Fixed "home" setting - * Fixed middleware/router precedence issue. Closes #366 - * Fixed; _configure()_ callbacks called immediately. Closes #368 - -1.0.0beta2 / 2010-07-23 -================== - - * Added more examples - * Added; exporting `Server` constructor - * Added `Server#helpers()` for view locals - * Added `Server#dynamicHelpers()` for dynamic view locals. Closes #349 - * Added support for absolute view paths - * Added; _home_ setting defaults to `Server#route` for mounted apps. Closes #363 - * Added Guillermo Rauch to the contributor list - * Added support for "as" for non-collection partials. Closes #341 - * Fixed _install.sh_, ensuring _~/.node_libraries_ exists. Closes #362 [thanks jf] - * Fixed `res.render()` exceptions, now passed to `next()` when no callback is given [thanks guillermo] - * Fixed instanceof `Array` checks, now `Array.isArray()` - * Fixed express(1) expansion of public dirs. Closes #348 - * Fixed middleware precedence. Closes #345 - * Fixed view watcher, now async [thanks aheckmann] - -1.0.0beta / 2010-07-15 -================== - - * Re-write - - much faster - - much lighter - - Check [ExpressJS.com](http://expressjs.com) for migration guide and updated docs - -0.14.0 / 2010-06-15 -================== - - * Utilize relative requires - * Added Static bufferSize option [aheckmann] - * Fixed caching of view and partial subdirectories [aheckmann] - * Fixed mime.type() comments now that ".ext" is not supported - * Updated haml submodule - * Updated class submodule - * Removed bin/express - -0.13.0 / 2010-06-01 -================== - - * Added node v0.1.97 compatibility - * Added support for deleting cookies via Request#cookie('key', null) - * Updated haml submodule - * Fixed not-found page, now using using charset utf-8 - * Fixed show-exceptions page, now using using charset utf-8 - * Fixed view support due to fs.readFile Buffers - * Changed; mime.type() no longer accepts ".type" due to node extname() changes - -0.12.0 / 2010-05-22 -================== - - * Added node v0.1.96 compatibility - * Added view `helpers` export which act as additional local variables - * Updated haml submodule - * Changed ETag; removed inode, modified time only - * Fixed LF to CRLF for setting multiple cookies - * Fixed cookie complation; values are now urlencoded - * Fixed cookies parsing; accepts quoted values and url escaped cookies - -0.11.0 / 2010-05-06 -================== - - * Added support for layouts using different engines - - this.render('page.html.haml', { layout: 'super-cool-layout.html.ejs' }) - - this.render('page.html.haml', { layout: 'foo' }) // assumes 'foo.html.haml' - - this.render('page.html.haml', { layout: false }) // no layout - * Updated ext submodule - * Updated haml submodule - * Fixed EJS partial support by passing along the context. Issue #307 - -0.10.1 / 2010-05-03 -================== - - * Fixed binary uploads. - -0.10.0 / 2010-04-30 -================== - - * Added charset support via Request#charset (automatically assigned to 'UTF-8' when respond()'s - encoding is set to 'utf8' or 'utf-8'. - * Added "encoding" option to Request#render(). Closes #299 - * Added "dump exceptions" setting, which is enabled by default. - * Added simple ejs template engine support - * Added error reponse support for text/plain, application/json. Closes #297 - * Added callback function param to Request#error() - * Added Request#sendHead() - * Added Request#stream() - * Added support for Request#respond(304, null) for empty response bodies - * Added ETag support to Request#sendfile() - * Added options to Request#sendfile(), passed to fs.createReadStream() - * Added filename arg to Request#download() - * Performance enhanced due to pre-reversing plugins so that plugins.reverse() is not called on each request - * Performance enhanced by preventing several calls to toLowerCase() in Router#match() - * Changed; Request#sendfile() now streams - * Changed; Renamed Request#halt() to Request#respond(). Closes #289 - * Changed; Using sys.inspect() instead of JSON.encode() for error output - * Changed; run() returns the http.Server instance. Closes #298 - * Changed; Defaulting Server#host to null (INADDR_ANY) - * Changed; Logger "common" format scale of 0.4f - * Removed Logger "request" format - * Fixed; Catching ENOENT in view caching, preventing error when "views/partials" is not found - * Fixed several issues with http client - * Fixed Logger Content-Length output - * Fixed bug preventing Opera from retaining the generated session id. Closes #292 - -0.9.0 / 2010-04-14 -================== - - * Added DSL level error() route support - * Added DSL level notFound() route support - * Added Request#error() - * Added Request#notFound() - * Added Request#render() callback function. Closes #258 - * Added "max upload size" setting - * Added "magic" variables to collection partials (\_\_index\_\_, \_\_length\_\_, \_\_isFirst\_\_, \_\_isLast\_\_). Closes #254 - * Added [haml.js](http://github.com/visionmedia/haml.js) submodule; removed haml-js - * Added callback function support to Request#halt() as 3rd/4th arg - * Added preprocessing of route param wildcards using param(). Closes #251 - * Added view partial support (with collections etc) - * Fixed bug preventing falsey params (such as ?page=0). Closes #286 - * Fixed setting of multiple cookies. Closes #199 - * Changed; view naming convention is now NAME.TYPE.ENGINE (for example page.html.haml) - * Changed; session cookie is now httpOnly - * Changed; Request is no longer global - * Changed; Event is no longer global - * Changed; "sys" module is no longer global - * Changed; moved Request#download to Static plugin where it belongs - * Changed; Request instance created before body parsing. Closes #262 - * Changed; Pre-caching views in memory when "cache view contents" is enabled. Closes #253 - * Changed; Pre-caching view partials in memory when "cache view partials" is enabled - * Updated support to node --version 0.1.90 - * Updated dependencies - * Removed set("session cookie") in favour of use(Session, { cookie: { ... }}) - * Removed utils.mixin(); use Object#mergeDeep() - -0.8.0 / 2010-03-19 -================== - - * Added coffeescript example app. Closes #242 - * Changed; cache api now async friendly. Closes #240 - * Removed deprecated 'express/static' support. Use 'express/plugins/static' - -0.7.6 / 2010-03-19 -================== - - * Added Request#isXHR. Closes #229 - * Added `make install` (for the executable) - * Added `express` executable for setting up simple app templates - * Added "GET /public/*" to Static plugin, defaulting to /public - * Added Static plugin - * Fixed; Request#render() only calls cache.get() once - * Fixed; Namespacing View caches with "view:" - * Fixed; Namespacing Static caches with "static:" - * Fixed; Both example apps now use the Static plugin - * Fixed set("views"). Closes #239 - * Fixed missing space for combined log format - * Deprecated Request#sendfile() and 'express/static' - * Removed Server#running - -0.7.5 / 2010-03-16 -================== - - * Added Request#flash() support without args, now returns all flashes - * Updated ext submodule - -0.7.4 / 2010-03-16 -================== - - * Fixed session reaper - * Changed; class.js replacing js-oo Class implementation (quite a bit faster, no browser cruft) - -0.7.3 / 2010-03-16 -================== - - * Added package.json - * Fixed requiring of haml / sass due to kiwi removal - -0.7.2 / 2010-03-16 -================== - - * Fixed GIT submodules (HAH!) - -0.7.1 / 2010-03-16 -================== - - * Changed; Express now using submodules again until a PM is adopted - * Changed; chat example using millisecond conversions from ext - -0.7.0 / 2010-03-15 -================== - - * Added Request#pass() support (finds the next matching route, or the given path) - * Added Logger plugin (default "common" format replaces CommonLogger) - * Removed Profiler plugin - * Removed CommonLogger plugin - -0.6.0 / 2010-03-11 -================== - - * Added seed.yml for kiwi package management support - * Added HTTP client query string support when method is GET. Closes #205 - - * Added support for arbitrary view engines. - For example "foo.engine.html" will now require('engine'), - the exports from this module are cached after the first require(). - - * Added async plugin support - - * Removed usage of RESTful route funcs as http client - get() etc, use http.get() and friends - - * Removed custom exceptions - -0.5.0 / 2010-03-10 -================== - - * Added ext dependency (library of js extensions) - * Removed extname() / basename() utils. Use path module - * Removed toArray() util. Use arguments.values - * Removed escapeRegexp() util. Use RegExp.escape() - * Removed process.mixin() dependency. Use utils.mixin() - * Removed Collection - * Removed ElementCollection - * Shameless self promotion of ebook "Advanced JavaScript" (http://dev-mag.com) ;) - -0.4.0 / 2010-02-11 -================== - - * Added flash() example to sample upload app - * Added high level restful http client module (express/http) - * Changed; RESTful route functions double as HTTP clients. Closes #69 - * Changed; throwing error when routes are added at runtime - * Changed; defaulting render() context to the current Request. Closes #197 - * Updated haml submodule - -0.3.0 / 2010-02-11 -================== - - * Updated haml / sass submodules. Closes #200 - * Added flash message support. Closes #64 - * Added accepts() now allows multiple args. fixes #117 - * Added support for plugins to halt. Closes #189 - * Added alternate layout support. Closes #119 - * Removed Route#run(). Closes #188 - * Fixed broken specs due to use(Cookie) missing - -0.2.1 / 2010-02-05 -================== - - * Added "plot" format option for Profiler (for gnuplot processing) - * Added request number to Profiler plugin - * Fixed binary encoding for multi-part file uploads, was previously defaulting to UTF8 - * Fixed issue with routes not firing when not files are present. Closes #184 - * Fixed process.Promise -> events.Promise - -0.2.0 / 2010-02-03 -================== - - * Added parseParam() support for name[] etc. (allows for file inputs with "multiple" attr) Closes #180 - * Added Both Cache and Session option "reapInterval" may be "reapEvery". Closes #174 - * Added expiration support to cache api with reaper. Closes #133 - * Added cache Store.Memory#reap() - * Added Cache; cache api now uses first class Cache instances - * Added abstract session Store. Closes #172 - * Changed; cache Memory.Store#get() utilizing Collection - * Renamed MemoryStore -> Store.Memory - * Fixed use() of the same plugin several time will always use latest options. Closes #176 - -0.1.0 / 2010-02-03 -================== - - * Changed; Hooks (before / after) pass request as arg as well as evaluated in their context - * Updated node support to 0.1.27 Closes #169 - * Updated dirname(__filename) -> __dirname - * Updated libxmljs support to v0.2.0 - * Added session support with memory store / reaping - * Added quick uid() helper - * Added multi-part upload support - * Added Sass.js support / submodule - * Added production env caching view contents and static files - * Added static file caching. Closes #136 - * Added cache plugin with memory stores - * Added support to StaticFile so that it works with non-textual files. - * Removed dirname() helper - * Removed several globals (now their modules must be required) - -0.0.2 / 2010-01-10 -================== - - * Added view benchmarks; currently haml vs ejs - * Added Request#attachment() specs. Closes #116 - * Added use of node's parseQuery() util. Closes #123 - * Added `make init` for submodules - * Updated Haml - * Updated sample chat app to show messages on load - * Updated libxmljs parseString -> parseHtmlString - * Fixed `make init` to work with older versions of git - * Fixed specs can now run independant specs for those who cant build deps. Closes #127 - * Fixed issues introduced by the node url module changes. Closes 126. - * Fixed two assertions failing due to Collection#keys() returning strings - * Fixed faulty Collection#toArray() spec due to keys() returning strings - * Fixed `make test` now builds libxmljs.node before testing - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/node_modules/express/LICENSE b/node_modules/express/LICENSE deleted file mode 100644 index 36075a3..0000000 --- a/node_modules/express/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2009-2011 TJ Holowaychuk - -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. \ No newline at end of file diff --git a/node_modules/express/Makefile b/node_modules/express/Makefile deleted file mode 100644 index e820e31..0000000 --- a/node_modules/express/Makefile +++ /dev/null @@ -1,33 +0,0 @@ - -MOCHA_OPTS= -REPORTER = dot - -check: test - -test: test-unit test-acceptance - -test-unit: - @NODE_ENV=test ./node_modules/.bin/mocha \ - --reporter $(REPORTER) \ - $(MOCHA_OPTS) - -test-acceptance: - @NODE_ENV=test ./node_modules/.bin/mocha \ - --reporter $(REPORTER) \ - --bail \ - test/acceptance/*.js - -test-cov: lib-cov - @EXPRESS_COV=1 $(MAKE) test REPORTER=html-cov > coverage.html - -lib-cov: - @jscoverage lib lib-cov - -benchmark: - @./support/bench - -clean: - rm -f coverage.html - rm -fr lib-cov - -.PHONY: test test-unit test-acceptance benchmark clean diff --git a/node_modules/express/Readme.md b/node_modules/express/Readme.md deleted file mode 100644 index 6bb8b95..0000000 --- a/node_modules/express/Readme.md +++ /dev/null @@ -1,179 +0,0 @@ -![express logo](http://f.cl.ly/items/0V2S1n0K1i3y1c122g04/Screen%20Shot%202012-04-11%20at%209.59.42%20AM.png) - - Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). [![Build Status](https://secure.travis-ci.org/visionmedia/express.png)](http://travis-ci.org/visionmedia/express) - -```js -var express = require('express'); -var app = express(); - -app.get('/', function(req, res){ - res.send('Hello World'); -}); - -app.listen(3000); -``` - -## Installation - - $ npm install -g express - -## Quick Start - - The quickest way to get started with express is to utilize the executable `express(1)` to generate an application as shown below: - - Create the app: - - $ npm install -g express - $ express /tmp/foo && cd /tmp/foo - - Install dependencies: - - $ npm install - - Start the server: - - $ node app - -## Features - - * Built on [Connect](http://github.com/senchalabs/connect) - * Robust routing - * HTTP helpers (redirection, caching, etc) - * View system supporting 14+ template engines - * Content negotiation - * Focus on high performance - * Environment based configuration - * Executable for generating applications quickly - * High test coverage - -## Philosophy - - The Express philosophy is to provide small, robust tooling for HTTP servers. Making - it a great solution for single page applications, web sites, hybrids, or public - HTTP APIs. - - Built on Connect you can use _only_ what you need, and nothing more, applications - can be as big or as small as you like, even a single file. Express does - not force you to use any specific ORM or template engine. With support for over - 14 template engines via [Consolidate.js](http://github.com/visionmedia/consolidate.js) - you can quickly craft your perfect framework. - -## More Information - - * Join #express on freenode - * [Google Group](http://groups.google.com/group/express-js) for discussion - * Follow [tjholowaychuk](http://twitter.com/tjholowaychuk) on twitter for updates - * Visit the [Wiki](http://github.com/visionmedia/express/wiki) - * [日本語ドキュメンテーション](http://hideyukisaito.com/doc/expressjs/) by [hideyukisaito](https://github.com/hideyukisaito) - * [Русскоязычная документация](http://express-js.ru/) - -## Viewing Examples - -Clone the Express repo, then install the dev dependencies to install all the example / test suite deps: - - $ git clone git://github.com/visionmedia/express.git --depth 1 - $ cd express - $ npm install - -then run whichever tests you want: - - $ node examples/content-negotiation - -## Running Tests - -To run the test suite first invoke the following command within the repo, installing the development dependencies: - - $ npm install - -then run the tests: - - $ make test - -## Contributors - -``` -project: express -commits: 3559 -active : 468 days -files : 237 -authors: - 1891 Tj Holowaychuk 53.1% - 1285 visionmedia 36.1% - 182 TJ Holowaychuk 5.1% - 54 Aaron Heckmann 1.5% - 34 csausdev 1.0% - 26 ciaranj 0.7% - 21 Robert Sköld 0.6% - 6 Guillermo Rauch 0.2% - 3 Dav Glass 0.1% - 3 Nick Poulden 0.1% - 2 Randy Merrill 0.1% - 2 Benny Wong 0.1% - 2 Hunter Loftis 0.1% - 2 Jake Gordon 0.1% - 2 Brian McKinney 0.1% - 2 Roman Shtylman 0.1% - 2 Ben Weaver 0.1% - 2 Dave Hoover 0.1% - 2 Eivind Fjeldstad 0.1% - 2 Daniel Shaw 0.1% - 1 Matt Colyer 0.0% - 1 Pau Ramon 0.0% - 1 Pero Pejovic 0.0% - 1 Peter Rekdal Sunde 0.0% - 1 Raynos 0.0% - 1 Teng Siong Ong 0.0% - 1 Viktor Kelemen 0.0% - 1 ctide 0.0% - 1 8bitDesigner 0.0% - 1 isaacs 0.0% - 1 mgutz 0.0% - 1 pikeas 0.0% - 1 shuwatto 0.0% - 1 tstrimple 0.0% - 1 ewoudj 0.0% - 1 Adam Sanderson 0.0% - 1 Andrii Kostenko 0.0% - 1 Andy Hiew 0.0% - 1 Arpad Borsos 0.0% - 1 Ashwin Purohit 0.0% - 1 Benjen 0.0% - 1 Darren Torpey 0.0% - 1 Greg Ritter 0.0% - 1 Gregory Ritter 0.0% - 1 James Herdman 0.0% - 1 Jim Snodgrass 0.0% - 1 Joe McCann 0.0% - 1 Jonathan Dumaine 0.0% - 1 Jonathan Palardy 0.0% - 1 Jonathan Zacsh 0.0% - 1 Justin Lilly 0.0% - 1 Ken Sato 0.0% - 1 Maciej Małecki 0.0% - 1 Masahiro Hayashi 0.0% -``` - -## License - -(The MIT License) - -Copyright (c) 2009-2012 TJ Holowaychuk <tj@vision-media.ca> - -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/node_modules/express/bin/express b/node_modules/express/bin/express deleted file mode 100755 index 3c0090c..0000000 --- a/node_modules/express/bin/express +++ /dev/null @@ -1,422 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var exec = require('child_process').exec - , program = require('commander') - , mkdirp = require('mkdirp') - , pkg = require('../package.json') - , version = pkg.version - , os = require('os') - , fs = require('fs'); - -// CLI - -program - .version(version) - .option('-s, --sessions', 'add session support') - .option('-e, --ejs', 'add ejs engine support (defaults to jade)') - .option('-J, --jshtml', 'add jshtml engine support (defaults to jade)') - .option('-H, --hogan', 'add hogan.js engine support') - .option('-c, --css ', 'add stylesheet support (less|stylus) (defaults to plain css)') - .option('-f, --force', 'force on non-empty directory') - .parse(process.argv); - -// Path - -var path = program.args.shift() || '.'; - -// end-of-line code - -var eol = 'win32' == os.platform() ? '\r\n' : '\n' - -// Template engine - -program.template = 'jade'; -if (program.ejs) program.template = 'ejs'; -if (program.jshtml) program.template = 'jshtml'; -if (program.hogan) program.template = 'hjs'; - -/** - * Routes index template. - */ - -var index = [ - '' - , '/*' - , ' * GET home page.' - , ' */' - , '' - , 'exports.index = function(req, res){' - , ' res.render(\'index\', { title: \'Express\' });' - , '};' -].join(eol); - -/** - * Routes users template. - */ - -var users = [ - '' - , '/*' - , ' * GET users listing.' - , ' */' - , '' - , 'exports.list = function(req, res){' - , ' res.send("respond with a resource");' - , '};' -].join(eol); - -/** - * Jade layout template. - */ - -var jadeLayout = [ - 'doctype 5' - , 'html' - , ' head' - , ' title= title' - , ' link(rel=\'stylesheet\', href=\'/stylesheets/style.css\')' - , ' body' - , ' block content' -].join(eol); - -/** - * Jade index template. - */ - -var jadeIndex = [ - 'extends layout' - , '' - , 'block content' - , ' h1= title' - , ' p Welcome to #{title}' -].join(eol); - -/** - * EJS index template. - */ - -var ejsIndex = [ - '' - , '' - , ' ' - , ' <%= title %>' - , ' ' - , ' ' - , ' ' - , '

<%= title %>

' - , '

Welcome to <%= title %>

' - , ' ' - , '' -].join(eol); - -/** - * JSHTML layout template. - */ - -var jshtmlLayout = [ - '' - , '' - , ' ' - , ' @write(title) ' - , ' ' - , ' ' - , ' ' - , ' @write(body)' - , ' ' - , '' -].join(eol); - -/** - * JSHTML index template. - */ - -var jshtmlIndex = [ - '

@write(title)

' - , '

Welcome to @write(title)

' -].join(eol); - -/** - * Hogan.js index template. - */ -var hoganIndex = [ - '' - , '' - , ' ' - , ' {{ title }}' - , ' ' - , ' ' - , ' ' - , '

{{ title }}

' - , '

Welcome to {{ title }}

' - , ' ' - , '' -].join(eol); - -/** - * Default css template. - */ - -var css = [ - 'body {' - , ' padding: 50px;' - , ' font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;' - , '}' - , '' - , 'a {' - , ' color: #00B7FF;' - , '}' -].join(eol); - -/** - * Default less template. - */ - -var less = [ - 'body {' - , ' padding: 50px;' - , ' font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;' - , '}' - , '' - , 'a {' - , ' color: #00B7FF;' - , '}' -].join(eol); - -/** - * Default stylus template. - */ - -var stylus = [ - 'body' - , ' padding: 50px' - , ' font: 14px "Lucida Grande", Helvetica, Arial, sans-serif' - , 'a' - , ' color: #00B7FF' -].join(eol); - -/** - * App template. - */ - -var app = [ - '' - , '/**' - , ' * Module dependencies.' - , ' */' - , '' - , 'var express = require(\'express\')' - , ' , routes = require(\'./routes\')' - , ' , user = require(\'./routes/user\')' - , ' , http = require(\'http\')' - , ' , path = require(\'path\');' - , '' - , 'var app = express();' - , '' - , 'app.configure(function(){' - , ' app.set(\'port\', process.env.PORT || 3000);' - , ' app.set(\'views\', __dirname + \'/views\');' - , ' app.set(\'view engine\', \':TEMPLATE\');' - , ' app.use(express.favicon());' - , ' app.use(express.logger(\'dev\'));' - , ' app.use(express.bodyParser());' - , ' app.use(express.methodOverride());{sess}' - , ' app.use(app.router);{css}' - , ' app.use(express.static(path.join(__dirname, \'public\')));' - , '});' - , '' - , 'app.configure(\'development\', function(){' - , ' app.use(express.errorHandler());' - , '});' - , '' - , 'app.get(\'/\', routes.index);' - , 'app.get(\'/users\', user.list);' - , '' - , 'http.createServer(app).listen(app.get(\'port\'), function(){' - , ' console.log("Express server listening on port " + app.get(\'port\'));' - , '});' - , '' -].join(eol); - -// Generate application - -(function createApplication(path) { - emptyDirectory(path, function(empty){ - if (empty || program.force) { - createApplicationAt(path); - } else { - program.confirm('destination is not empty, continue? ', function(ok){ - if (ok) { - process.stdin.destroy(); - createApplicationAt(path); - } else { - abort('aborting'); - } - }); - } - }); -})(path); - -/** - * Create application at the given directory `path`. - * - * @param {String} path - */ - -function createApplicationAt(path) { - console.log(); - process.on('exit', function(){ - console.log(); - console.log(' install dependencies:'); - console.log(' $ cd %s && npm install', path); - console.log(); - console.log(' run the app:'); - console.log(' $ node app'); - console.log(); - }); - - mkdir(path, function(){ - mkdir(path + '/public'); - mkdir(path + '/public/javascripts'); - mkdir(path + '/public/images'); - mkdir(path + '/public/stylesheets', function(){ - switch (program.css) { - case 'less': - write(path + '/public/stylesheets/style.less', less); - break; - case 'stylus': - write(path + '/public/stylesheets/style.styl', stylus); - break; - default: - write(path + '/public/stylesheets/style.css', css); - } - }); - - mkdir(path + '/routes', function(){ - write(path + '/routes/index.js', index); - write(path + '/routes/user.js', users); - }); - - mkdir(path + '/views', function(){ - switch (program.template) { - case 'ejs': - write(path + '/views/index.ejs', ejsIndex); - break; - case 'jade': - write(path + '/views/layout.jade', jadeLayout); - write(path + '/views/index.jade', jadeIndex); - break; - case 'jshtml': - write(path + '/views/layout.jshtml', jshtmlLayout); - write(path + '/views/index.jshtml', jshtmlIndex); - break; - case 'hjs': - write(path + '/views/index.hjs', hoganIndex); - break; - - } - }); - - // CSS Engine support - switch (program.css) { - case 'less': - app = app.replace('{css}', eol + ' app.use(require(\'less-middleware\')({ src: __dirname + \'/public\' }));'); - break; - case 'stylus': - app = app.replace('{css}', eol + ' app.use(require(\'stylus\').middleware(__dirname + \'/public\'));'); - break; - default: - app = app.replace('{css}', ''); - } - - // Session support - app = app.replace('{sess}', program.sessions - ? eol + ' app.use(express.cookieParser(\'your secret here\'));' + eol + ' app.use(express.session());' - : ''); - - // Template support - app = app.replace(':TEMPLATE', program.template); - - // package.json - var pkg = { - name: 'application-name' - , version: '0.0.1' - , private: true - , scripts: { start: 'node app' } - , dependencies: { - express: version - } - } - - if (program.template) pkg.dependencies[program.template] = '*'; - - // CSS Engine support - switch (program.css) { - case 'less': - pkg.dependencies['less-middleware'] = '*'; - break; - default: - if (program.css) { - pkg.dependencies[program.css] = '*'; - } - } - - write(path + '/package.json', JSON.stringify(pkg, null, 2)); - write(path + '/app.js', app); - }); -} - -/** - * Check if the given directory `path` is empty. - * - * @param {String} path - * @param {Function} fn - */ - -function emptyDirectory(path, fn) { - fs.readdir(path, function(err, files){ - if (err && 'ENOENT' != err.code) throw err; - fn(!files || !files.length); - }); -} - -/** - * echo str > path. - * - * @param {String} path - * @param {String} str - */ - -function write(path, str) { - fs.writeFile(path, str); - console.log(' \x1b[36mcreate\x1b[0m : ' + path); -} - -/** - * Mkdir -p. - * - * @param {String} path - * @param {Function} fn - */ - -function mkdir(path, fn) { - mkdirp(path, 0755, function(err){ - if (err) throw err; - console.log(' \033[36mcreate\033[0m : ' + path); - fn && fn(); - }); -} - -/** - * Exit with the given `str`. - * - * @param {String} str - */ - -function abort(str) { - console.error(str); - process.exit(1); -} diff --git a/node_modules/express/client.js b/node_modules/express/client.js deleted file mode 100644 index 8984c44..0000000 --- a/node_modules/express/client.js +++ /dev/null @@ -1,25 +0,0 @@ - -var http = require('http'); - -var times = 50; - -while (times--) { - var req = http.request({ - port: 3000 - , method: 'POST' - , headers: { 'Content-Type': 'application/x-www-form-urlencoded' } - }); - - req.on('response', function(res){ - console.log(res.statusCode); - }); - - var n = 500000; - while (n--) { - req.write('foo=bar&bar=baz&'); - } - - req.write('foo=bar&bar=baz'); - - req.end(); -} \ No newline at end of file diff --git a/node_modules/express/index.js b/node_modules/express/index.js deleted file mode 100644 index bfe9934..0000000 --- a/node_modules/express/index.js +++ /dev/null @@ -1,4 +0,0 @@ - -module.exports = process.env.EXPRESS_COV - ? require('./lib-cov/express') - : require('./lib/express'); \ No newline at end of file diff --git a/node_modules/express/lib/application.js b/node_modules/express/lib/application.js deleted file mode 100644 index 7ebc6f6..0000000 --- a/node_modules/express/lib/application.js +++ /dev/null @@ -1,534 +0,0 @@ -/** - * Module dependencies. - */ - -var connect = require('connect') - , Router = require('./router') - , methods = require('methods') - , middleware = require('./middleware') - , debug = require('debug')('express:application') - , locals = require('./utils').locals - , View = require('./view') - , utils = connect.utils - , path = require('path') - , http = require('http') - , join = path.join; - -/** - * Application prototype. - */ - -var app = exports = module.exports = {}; - -/** - * Initialize the server. - * - * - setup default configuration - * - setup default middleware - * - setup route reflection methods - * - * @api private - */ - -app.init = function(){ - this.cache = {}; - this.settings = {}; - this.engines = {}; - this.viewCallbacks = []; - this.defaultConfiguration(); -}; - -/** - * Initialize application configuration. - * - * @api private - */ - -app.defaultConfiguration = function(){ - // default settings - this.enable('x-powered-by'); - this.set('env', process.env.NODE_ENV || 'development'); - this.set('subdomain offset', 2); - debug('booting in %s mode', this.get('env')); - - // implicit middleware - this.use(connect.query()); - this.use(middleware.init(this)); - - // inherit protos - this.on('mount', function(parent){ - this.request.__proto__ = parent.request; - this.response.__proto__ = parent.response; - this.engines.__proto__ = parent.engines; - }); - - // router - this._router = new Router(this); - this.routes = this._router.map; - this.__defineGetter__('router', function(){ - this._usedRouter = true; - this._router.caseSensitive = this.enabled('case sensitive routing'); - this._router.strict = this.enabled('strict routing'); - return this._router.middleware; - }); - - // setup locals - this.locals = locals(this); - - // default locals - this.locals.settings = this.settings; - - // default configuration - this.set('views', process.cwd() + '/views'); - this.set('jsonp callback name', 'callback'); - - this.configure('development', function(){ - this.set('json spaces', 2); - }); - - this.configure('production', function(){ - this.enable('view cache'); - }); -}; - -/** - * Proxy `connect#use()` to apply settings to - * mounted applications. - * - * @param {String|Function|Server} route - * @param {Function|Server} fn - * @return {app} for chaining - * @api public - */ - -app.use = function(route, fn){ - var app; - - // default route to '/' - if ('string' != typeof route) fn = route, route = '/'; - - // express app - if (fn.handle && fn.set) app = fn; - - // restore .app property on req and res - if (app) { - app.route = route; - fn = function(req, res, next) { - var orig = req.app; - app.handle(req, res, function(err){ - req.app = res.app = orig; - req.__proto__ = orig.request; - res.__proto__ = orig.response; - next(err); - }); - }; - } - - connect.proto.use.call(this, route, fn); - - // mounted an app - if (app) { - app.parent = this; - app.emit('mount', this); - } - - return this; -}; - -/** - * Register the given template engine callback `fn` - * as `ext`. - * - * By default will `require()` the engine based on the - * file extension. For example if you try to render - * a "foo.jade" file Express will invoke the following internally: - * - * app.engine('jade', require('jade').__express); - * - * For engines that do not provide `.__express` out of the box, - * or if you wish to "map" a different extension to the template engine - * you may use this method. For example mapping the EJS template engine to - * ".html" files: - * - * app.engine('html', require('ejs').renderFile); - * - * In this case EJS provides a `.renderFile()` method with - * the same signature that Express expects: `(path, options, callback)`, - * though note that it aliases this method as `ejs.__express` internally - * so if you're using ".ejs" extensions you dont need to do anything. - * - * Some template engines do not follow this convention, the - * [Consolidate.js](https://github.com/visionmedia/consolidate.js) - * library was created to map all of node's popular template - * engines to follow this convention, thus allowing them to - * work seeessly within Express. - * - * @param {String} ext - * @param {Function} fn - * @return {app} for chaining - * @api public - */ - -app.engine = function(ext, fn){ - if ('function' != typeof fn) throw new Error('callback function required'); - if ('.' != ext[0]) ext = '.' + ext; - this.engines[ext] = fn; - return this; -}; - -/** - * Map the given param placeholder `name`(s) to the given callback(s). - * - * Parameter mapping is used to provide pre-conditions to routes - * which use normalized placeholders. For example a _:user_id_ parameter - * could automatically load a user's information from the database without - * any additional code, - * - * The callback uses the samesignature as middleware, the only differencing - * being that the value of the placeholder is passed, in this case the _id_ - * of the user. Once the `next()` function is invoked, just like middleware - * it will continue on to execute the route, or subsequent parameter functions. - * - * app.param('user_id', function(req, res, next, id){ - * User.find(id, function(err, user){ - * if (err) { - * next(err); - * } else if (user) { - * req.user = user; - * next(); - * } else { - * next(new Error('failed to load user')); - * } - * }); - * }); - * - * @param {String|Array} name - * @param {Function} fn - * @return {app} for chaining - * @api public - */ - -app.param = function(name, fn){ - var self = this - , fns = [].slice.call(arguments, 1); - - // array - if (Array.isArray(name)) { - name.forEach(function(name){ - fns.forEach(function(fn){ - self.param(name, fn); - }); - }); - // param logic - } else if ('function' == typeof name) { - this._router.param(name); - // single - } else { - if (':' == name[0]) name = name.substr(1); - fns.forEach(function(fn){ - self._router.param(name, fn); - }); - } - - return this; -}; - -/** - * Assign `setting` to `val`, or return `setting`'s value. - * - * app.set('foo', 'bar'); - * app.get('foo'); - * // => "bar" - * - * Mounted servers inherit their parent server's settings. - * - * @param {String} setting - * @param {String} val - * @return {Server} for chaining - * @api public - */ - -app.set = function(setting, val){ - if (1 == arguments.length) { - if (this.settings.hasOwnProperty(setting)) { - return this.settings[setting]; - } else if (this.parent) { - return this.parent.set(setting); - } - } else { - this.settings[setting] = val; - return this; - } -}; - -/** - * Return the app's absolute pathname - * based on the parent(s) that have - * mounted it. - * - * For example if the application was - * mounted as "/admin", which itself - * was mounted as "/blog" then the - * return value would be "/blog/admin". - * - * @return {String} - * @api private - */ - -app.path = function(){ - return this.parent - ? this.parent.path() + this.route - : ''; -}; - -/** - * Check if `setting` is enabled (truthy). - * - * app.enabled('foo') - * // => false - * - * app.enable('foo') - * app.enabled('foo') - * // => true - * - * @param {String} setting - * @return {Boolean} - * @api public - */ - -app.enabled = function(setting){ - return !!this.set(setting); -}; - -/** - * Check if `setting` is disabled. - * - * app.disabled('foo') - * // => true - * - * app.enable('foo') - * app.disabled('foo') - * // => false - * - * @param {String} setting - * @return {Boolean} - * @api public - */ - -app.disabled = function(setting){ - return !this.set(setting); -}; - -/** - * Enable `setting`. - * - * @param {String} setting - * @return {app} for chaining - * @api public - */ - -app.enable = function(setting){ - return this.set(setting, true); -}; - -/** - * Disable `setting`. - * - * @param {String} setting - * @return {app} for chaining - * @api public - */ - -app.disable = function(setting){ - return this.set(setting, false); -}; - -/** - * Configure callback for zero or more envs, - * when no `env` is specified that callback will - * be invoked for all environments. Any combination - * can be used multiple times, in any order desired. - * - * Examples: - * - * app.configure(function(){ - * // executed for all envs - * }); - * - * app.configure('stage', function(){ - * // executed staging env - * }); - * - * app.configure('stage', 'production', function(){ - * // executed for stage and production - * }); - * - * Note: - * - * These callbacks are invoked immediately, and - * are effectively sugar for the following: - * - * var env = process.env.NODE_ENV || 'development'; - * - * switch (env) { - * case 'development': - * ... - * break; - * case 'stage': - * ... - * break; - * case 'production': - * ... - * break; - * } - * - * @param {String} env... - * @param {Function} fn - * @return {app} for chaining - * @api public - */ - -app.configure = function(env, fn){ - var envs = 'all' - , args = [].slice.call(arguments); - fn = args.pop(); - if (args.length) envs = args; - if ('all' == envs || ~envs.indexOf(this.settings.env)) fn.call(this); - return this; -}; - -/** - * Delegate `.VERB(...)` calls to `router.VERB(...)`. - */ - -methods.forEach(function(method){ - app[method] = function(path){ - if ('get' == method && 1 == arguments.length) return this.set(path); - - // if no router attacked yet, attach the router - if (!this._usedRouter) this.use(this.router); - - // setup route - this._router[method].apply(this._router, arguments); - return this; - }; -}); - -/** - * Special-cased "all" method, applying the given route `path`, - * middleware, and callback to _every_ HTTP method. - * - * @param {String} path - * @param {Function} ... - * @return {app} for chaining - * @api public - */ - -app.all = function(path){ - var args = arguments; - methods.forEach(function(method){ - app[method].apply(this, args); - }, this); - return this; -}; - -// del -> delete alias - -app.del = app.delete; - -/** - * Render the given view `name` name with `options` - * and a callback accepting an error and the - * rendered template string. - * - * Example: - * - * app.render('email', { name: 'Tobi' }, function(err, html){ - * // ... - * }) - * - * @param {String} name - * @param {String|Function} options or fn - * @param {Function} fn - * @api public - */ - -app.render = function(name, options, fn){ - var opts = {} - , cache = this.cache - , engines = this.engines - , view; - - // support callback function as second arg - if ('function' == typeof options) { - fn = options, options = {}; - } - - // merge app.locals - utils.merge(opts, this.locals); - - // merge options._locals - if (options._locals) utils.merge(opts, options._locals); - - // merge options - utils.merge(opts, options); - - // set .cache unless explicitly provided - opts.cache = null == opts.cache - ? this.enabled('view cache') - : opts.cache; - - // primed cache - if (opts.cache) view = cache[name]; - - // view - if (!view) { - view = new View(name, { - defaultEngine: this.get('view engine'), - root: this.get('views'), - engines: engines - }); - - if (!view.path) { - var err = new Error('Failed to lookup view "' + name + '"'); - err.view = view; - return fn(err); - } - - // prime the cache - if (opts.cache) cache[name] = view; - } - - // render - try { - view.render(opts, fn); - } catch (err) { - fn(err); - } -}; - -/** - * Listen for connections. - * - * A node `http.Server` is returned, with this - * application (which is a `Function`) as its - * callback. If you wish to create both an HTTP - * and HTTPS server you may do so with the "http" - * and "https" modules as shown here: - * - * var http = require('http') - * , https = require('https') - * , express = require('express') - * , app = express(); - * - * http.createServer(app).listen(80); - * https.createServer({ ... }, app).listen(443); - * - * @return {http.Server} - * @api public - */ - -app.listen = function(){ - var server = http.createServer(this); - return server.listen.apply(server, arguments); -}; diff --git a/node_modules/express/lib/express.js b/node_modules/express/lib/express.js deleted file mode 100644 index 2a704b2..0000000 --- a/node_modules/express/lib/express.js +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Module dependencies. - */ - -var connect = require('connect') - , proto = require('./application') - , Route = require('./router/route') - , Router = require('./router') - , req = require('./request') - , res = require('./response') - , utils = connect.utils; - -/** - * Expose `createApplication()`. - */ - -exports = module.exports = createApplication; - -/** - * Framework version. - */ - -exports.version = '3.1.0'; - -/** - * Expose mime. - */ - -exports.mime = connect.mime; - -/** - * Create an express application. - * - * @return {Function} - * @api public - */ - -function createApplication() { - var app = connect(); - utils.merge(app, proto); - app.request = { __proto__: req }; - app.response = { __proto__: res }; - app.init(); - return app; -} - -/** - * Expose connect.middleware as express.* - * for example `express.logger` etc. - */ - -for (var key in connect.middleware) { - Object.defineProperty( - exports - , key - , Object.getOwnPropertyDescriptor(connect.middleware, key)); -} - -/** - * Error on createServer(). - */ - -exports.createServer = function(){ - console.warn('Warning: express.createServer() is deprecated, express'); - console.warn('applications no longer inherit from http.Server,'); - console.warn('please use:'); - console.warn(''); - console.warn(' var express = require("express");'); - console.warn(' var app = express();'); - console.warn(''); - return createApplication(); -}; - -/** - * Expose the prototypes. - */ - -exports.application = proto; -exports.request = req; -exports.response = res; - -/** - * Expose constructors. - */ - -exports.Route = Route; -exports.Router = Router; - -// Error handler title - -exports.errorHandler.title = 'Express'; - diff --git a/node_modules/express/lib/middleware.js b/node_modules/express/lib/middleware.js deleted file mode 100644 index 308c5bb..0000000 --- a/node_modules/express/lib/middleware.js +++ /dev/null @@ -1,33 +0,0 @@ - -/** - * Module dependencies. - */ - -var utils = require('./utils'); - -/** - * Initialization middleware, exposing the - * request and response to eachother, as well - * as defaulting the X-Powered-By header field. - * - * @param {Function} app - * @return {Function} - * @api private - */ - -exports.init = function(app){ - return function expressInit(req, res, next){ - req.app = res.app = app; - if (app.enabled('x-powered-by')) res.setHeader('X-Powered-By', 'Express'); - req.res = res; - res.req = req; - req.next = next; - - req.__proto__ = app.request; - res.__proto__ = app.response; - - res.locals = res.locals || utils.locals(res); - - next(); - } -}; diff --git a/node_modules/express/lib/request.js b/node_modules/express/lib/request.js deleted file mode 100644 index 1c6048d..0000000 --- a/node_modules/express/lib/request.js +++ /dev/null @@ -1,493 +0,0 @@ - -/** - * Module dependencies. - */ - -var http = require('http') - , utils = require('./utils') - , connect = require('connect') - , fresh = require('fresh') - , parseRange = require('range-parser') - , parse = connect.utils.parseUrl - , mime = connect.mime; - -/** - * Request prototype. - */ - -var req = exports = module.exports = { - __proto__: http.IncomingMessage.prototype -}; - -/** - * Return request header. - * - * The `Referrer` header field is special-cased, - * both `Referrer` and `Referer` are interchangeable. - * - * Examples: - * - * req.get('Content-Type'); - * // => "text/plain" - * - * req.get('content-type'); - * // => "text/plain" - * - * req.get('Something'); - * // => undefined - * - * Aliased as `req.header()`. - * - * @param {String} name - * @return {String} - * @api public - */ - -req.get = -req.header = function(name){ - switch (name = name.toLowerCase()) { - case 'referer': - case 'referrer': - return this.headers.referrer - || this.headers.referer; - default: - return this.headers[name]; - } -}; - -/** - * Check if the given `type(s)` is acceptable, returning - * the best match when true, otherwise `undefined`, in which - * case you should respond with 406 "Not Acceptable". - * - * The `type` value may be a single mime type string - * such as "application/json", the extension name - * such as "json", a comma-delimted list such as "json, html, text/plain", - * or an array `["json", "html", "text/plain"]`. When a list - * or array is given the _best_ match, if any is returned. - * - * Examples: - * - * // Accept: text/html - * req.accepts('html'); - * // => "html" - * - * // Accept: text/*, application/json - * req.accepts('html'); - * // => "html" - * req.accepts('text/html'); - * // => "text/html" - * req.accepts('json, text'); - * // => "json" - * req.accepts('application/json'); - * // => "application/json" - * - * // Accept: text/*, application/json - * req.accepts('image/png'); - * req.accepts('png'); - * // => undefined - * - * // Accept: text/*;q=.5, application/json - * req.accepts(['html', 'json']); - * req.accepts('html, json'); - * // => "json" - * - * @param {String|Array} type(s) - * @return {String} - * @api public - */ - -req.accepts = function(type){ - return utils.accepts(type, this.get('Accept')); -}; - -/** - * Check if the given `charset` is acceptable, - * otherwise you should respond with 406 "Not Acceptable". - * - * @param {String} charset - * @return {Boolean} - * @api public - */ - -req.acceptsCharset = function(charset){ - var accepted = this.acceptedCharsets; - return accepted.length - ? ~accepted.indexOf(charset) - : true; -}; - -/** - * Check if the given `lang` is acceptable, - * otherwise you should respond with 406 "Not Acceptable". - * - * @param {String} lang - * @return {Boolean} - * @api public - */ - -req.acceptsLanguage = function(lang){ - var accepted = this.acceptedLanguages; - return accepted.length - ? ~accepted.indexOf(lang) - : true; -}; - -/** - * Parse Range header field, - * capping to the given `size`. - * - * Unspecified ranges such as "0-" require - * knowledge of your resource length. In - * the case of a byte range this is of course - * the total number of bytes. If the Range - * header field is not given `null` is returned, - * `-1` when unsatisfiable, `-2` when syntactically invalid. - * - * NOTE: remember that ranges are inclusive, so - * for example "Range: users=0-3" should respond - * with 4 users when available, not 3. - * - * @param {Number} size - * @return {Array} - * @api public - */ - -req.range = function(size){ - var range = this.get('Range'); - if (!range) return; - return parseRange(size, range); -}; - -/** - * Return an array of Accepted media types - * ordered from highest quality to lowest. - * - * Examples: - * - * [ { value: 'application/json', - * quality: 1, - * type: 'application', - * subtype: 'json' }, - * { value: 'text/html', - * quality: 0.5, - * type: 'text', - * subtype: 'html' } ] - * - * @return {Array} - * @api public - */ - -req.__defineGetter__('accepted', function(){ - var accept = this.get('Accept'); - return accept - ? utils.parseAccept(accept) - : []; -}); - -/** - * Return an array of Accepted languages - * ordered from highest quality to lowest. - * - * Examples: - * - * Accept-Language: en;q=.5, en-us - * ['en-us', 'en'] - * - * @return {Array} - * @api public - */ - -req.__defineGetter__('acceptedLanguages', function(){ - var accept = this.get('Accept-Language'); - return accept - ? utils - .parseQuality(accept) - .map(function(obj){ - return obj.value; - }) - : []; -}); - -/** - * Return an array of Accepted charsets - * ordered from highest quality to lowest. - * - * Examples: - * - * Accept-Charset: iso-8859-5;q=.2, unicode-1-1;q=0.8 - * ['unicode-1-1', 'iso-8859-5'] - * - * @return {Array} - * @api public - */ - -req.__defineGetter__('acceptedCharsets', function(){ - var accept = this.get('Accept-Charset'); - return accept - ? utils - .parseQuality(accept) - .map(function(obj){ - return obj.value; - }) - : []; -}); - -/** - * Return the value of param `name` when present or `defaultValue`. - * - * - Checks route placeholders, ex: _/user/:id_ - * - Checks body params, ex: id=12, {"id":12} - * - Checks query string params, ex: ?id=12 - * - * To utilize request bodies, `req.body` - * should be an object. This can be done by using - * the `connect.bodyParser()` middleware. - * - * @param {String} name - * @param {Mixed} defaultValue - * @return {String} - * @api public - */ - -req.param = function(name, defaultValue){ - var params = this.params || {}; - var body = this.body || {}; - var query = this.query || {}; - if (null != params[name] && params.hasOwnProperty(name)) return params[name]; - if (null != body[name]) return body[name]; - if (null != query[name]) return query[name]; - return defaultValue; -}; - -/** - * Check if the incoming request contains the "Content-Type" - * header field, and it contains the give mime `type`. - * - * Examples: - * - * // With Content-Type: text/html; charset=utf-8 - * req.is('html'); - * req.is('text/html'); - * req.is('text/*'); - * // => true - * - * // When Content-Type is application/json - * req.is('json'); - * req.is('application/json'); - * req.is('application/*'); - * // => true - * - * req.is('html'); - * // => false - * - * @param {String} type - * @return {Boolean} - * @api public - */ - -req.is = function(type){ - var ct = this.get('Content-Type'); - if (!ct) return false; - ct = ct.split(';')[0]; - if (!~type.indexOf('/')) type = mime.lookup(type); - if (~type.indexOf('*')) { - type = type.split('/'); - ct = ct.split('/'); - if ('*' == type[0] && type[1] == ct[1]) return true; - if ('*' == type[1] && type[0] == ct[0]) return true; - return false; - } - return !! ~ct.indexOf(type); -}; - -/** - * Return the protocol string "http" or "https" - * when requested with TLS. When the "trust proxy" - * setting is enabled the "X-Forwarded-Proto" header - * field will be trusted. If you're running behind - * a reverse proxy that supplies https for you this - * may be enabled. - * - * @return {String} - * @api public - */ - -req.__defineGetter__('protocol', function(){ - var trustProxy = this.app.get('trust proxy'); - return this.connection.encrypted - ? 'https' - : trustProxy - ? (this.get('X-Forwarded-Proto') || 'http') - : 'http'; -}); - -/** - * Short-hand for: - * - * req.protocol == 'https' - * - * @return {Boolean} - * @api public - */ - -req.__defineGetter__('secure', function(){ - return 'https' == this.protocol; -}); - -/** - * Return the remote address, or when - * "trust proxy" is `true` return - * the upstream addr. - * - * @return {String} - * @api public - */ - -req.__defineGetter__('ip', function(){ - return this.ips[0] || this.connection.remoteAddress; -}); - -/** - * When "trust proxy" is `true`, parse - * the "X-Forwarded-For" ip address list. - * - * For example if the value were "client, proxy1, proxy2" - * you would receive the array `["client", "proxy1", "proxy2"]` - * where "proxy2" is the furthest down-stream. - * - * @return {Array} - * @api public - */ - -req.__defineGetter__('ips', function(){ - var trustProxy = this.app.get('trust proxy'); - var val = this.get('X-Forwarded-For'); - return trustProxy && val - ? val.split(/ *, */) - : []; -}); - -/** - * Return basic auth credentials. - * - * Examples: - * - * // http://tobi:hello@example.com - * req.auth - * // => { username: 'tobi', password: 'hello' } - * - * @return {Object} or undefined - * @api public - */ - -req.__defineGetter__('auth', function(){ - // missing - var auth = this.get('Authorization'); - if (!auth) return; - - // malformed - var parts = auth.split(' '); - if ('basic' != parts[0].toLowerCase()) return; - if (!parts[1]) return; - auth = parts[1]; - - // credentials - auth = new Buffer(auth, 'base64').toString().match(/^([^:]*):(.*)$/); - if (!auth) return; - return { username: auth[1], password: auth[2] }; -}); - -/** - * Return subdomains as an array. - * - * Subdomains are the dot-separated parts of the host before the main domain of - * the app. By default, the domain of the app is assumed to be the last two - * parts of the host. This can be changed by setting "subdomain offset". - * - * For example, if the domain is "tobi.ferrets.example.com": - * If "subdomain offset" is not set, req.subdomains is `["ferrets", "tobi"]`. - * If "subdomain offset" is 3, req.subdomains is `["tobi"]`. - * - * @return {Array} - * @api public - */ - -req.__defineGetter__('subdomains', function(){ - var offset = this.app.get('subdomain offset'); - return this.get('Host') - .split('.') - .reverse() - .slice(offset); -}); - -/** - * Short-hand for `url.parse(req.url).pathname`. - * - * @return {String} - * @api public - */ - -req.__defineGetter__('path', function(){ - return parse(this).pathname; -}); - -/** - * Parse the "Host" header field hostname. - * - * @return {String} - * @api public - */ - -req.__defineGetter__('host', function(){ - return this.get('Host').split(':')[0]; -}); - -/** - * Check if the request is fresh, aka - * Last-Modified and/or the ETag - * still match. - * - * @return {Boolean} - * @api public - */ - -req.__defineGetter__('fresh', function(){ - var method = this.method; - var s = this.res.statusCode; - - // GET or HEAD for weak freshness validation only - if ('GET' != method && 'HEAD' != method) return false; - - // 2xx or 304 as per rfc2616 14.26 - if ((s >= 200 && s < 300) || 304 == s) { - return fresh(this.headers, this.res._headers); - } - - return false; -}); - -/** - * Check if the request is stale, aka - * "Last-Modified" and / or the "ETag" for the - * resource has changed. - * - * @return {Boolean} - * @api public - */ - -req.__defineGetter__('stale', function(){ - return !this.fresh; -}); - -/** - * Check if the request was an _XMLHttpRequest_. - * - * @return {Boolean} - * @api public - */ - -req.__defineGetter__('xhr', function(){ - var val = this.get('X-Requested-With') || ''; - return 'xmlhttprequest' == val.toLowerCase(); -}); diff --git a/node_modules/express/lib/response.js b/node_modules/express/lib/response.js deleted file mode 100644 index 2b66c88..0000000 --- a/node_modules/express/lib/response.js +++ /dev/null @@ -1,754 +0,0 @@ -/** - * Module dependencies. - */ - -var http = require('http') - , path = require('path') - , connect = require('connect') - , utils = connect.utils - , sign = require('cookie-signature').sign - , normalizeType = require('./utils').normalizeType - , normalizeTypes = require('./utils').normalizeTypes - , etag = require('./utils').etag - , statusCodes = http.STATUS_CODES - , cookie = require('cookie') - , send = require('send') - , mime = connect.mime - , basename = path.basename - , extname = path.extname - , join = path.join; - -/** - * Response prototype. - */ - -var res = module.exports = { - __proto__: http.ServerResponse.prototype -}; - -/** - * Set status `code`. - * - * @param {Number} code - * @return {ServerResponse} - * @api public - */ - -res.status = function(code){ - this.statusCode = code; - return this; -}; - -/** - * Set Link header field with the given `links`. - * - * Examples: - * - * res.links({ - * next: 'http://api.example.com/users?page=2', - * last: 'http://api.example.com/users?page=5' - * }); - * - * @param {Object} links - * @return {ServerResponse} - * @api public - */ - -res.links = function(links){ - return this.set('Link', Object.keys(links).map(function(rel){ - return '<' + links[rel] + '>; rel="' + rel + '"'; - }).join(', ')); -}; - -/** - * Send a response. - * - * Examples: - * - * res.send(new Buffer('wahoo')); - * res.send({ some: 'json' }); - * res.send('

some html

'); - * res.send(404, 'Sorry, cant find that'); - * res.send(404); - * - * @param {Mixed} body or status - * @param {Mixed} body - * @return {ServerResponse} - * @api public - */ - -res.send = function(body){ - var req = this.req - , head = 'HEAD' == req.method - , len; - - // allow status / body - if (2 == arguments.length) { - // res.send(body, status) backwards compat - if ('number' != typeof body && 'number' == typeof arguments[1]) { - this.statusCode = arguments[1]; - } else { - this.statusCode = body; - body = arguments[1]; - } - } - - switch (typeof body) { - // response status - case 'number': - this.get('Content-Type') || this.type('txt'); - this.statusCode = body; - body = http.STATUS_CODES[body]; - break; - // string defaulting to html - case 'string': - if (!this.get('Content-Type')) { - this.charset = this.charset || 'utf-8'; - this.type('html'); - } - break; - case 'boolean': - case 'object': - if (null == body) { - body = ''; - } else if (Buffer.isBuffer(body)) { - this.get('Content-Type') || this.type('bin'); - } else { - return this.json(body); - } - break; - } - - // populate Content-Length - if (undefined !== body && !this.get('Content-Length')) { - this.set('Content-Length', len = Buffer.isBuffer(body) - ? body.length - : Buffer.byteLength(body)); - } - - // ETag support - // TODO: W/ support - if (len > 1024) { - if (!this.get('ETag')) { - this.set('ETag', etag(body)); - } - } - - // freshness - if (req.fresh) this.statusCode = 304; - - // strip irrelevant headers - if (204 == this.statusCode || 304 == this.statusCode) { - this.removeHeader('Content-Type'); - this.removeHeader('Content-Length'); - this.removeHeader('Transfer-Encoding'); - body = ''; - } - - // respond - this.end(head ? null : body); - return this; -}; - -/** - * Send JSON response. - * - * Examples: - * - * res.json(null); - * res.json({ user: 'tj' }); - * res.json(500, 'oh noes!'); - * res.json(404, 'I dont have that'); - * - * @param {Mixed} obj or status - * @param {Mixed} obj - * @return {ServerResponse} - * @api public - */ - -res.json = function(obj){ - // allow status / body - if (2 == arguments.length) { - // res.json(body, status) backwards compat - if ('number' == typeof arguments[1]) { - this.statusCode = arguments[1]; - } else { - this.statusCode = obj; - obj = arguments[1]; - } - } - - // settings - var app = this.app; - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = JSON.stringify(obj, replacer, spaces); - - // content-type - this.charset = this.charset || 'utf-8'; - this.get('Content-Type') || this.set('Content-Type', 'application/json'); - - return this.send(body); -}; - -/** - * Send JSON response with JSONP callback support. - * - * Examples: - * - * res.jsonp(null); - * res.jsonp({ user: 'tj' }); - * res.jsonp(500, 'oh noes!'); - * res.jsonp(404, 'I dont have that'); - * - * @param {Mixed} obj or status - * @param {Mixed} obj - * @return {ServerResponse} - * @api public - */ - -res.jsonp = function(obj){ - // allow status / body - if (2 == arguments.length) { - // res.json(body, status) backwards compat - if ('number' == typeof arguments[1]) { - this.statusCode = arguments[1]; - } else { - this.statusCode = obj; - obj = arguments[1]; - } - } - - // settings - var app = this.app; - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = JSON.stringify(obj, replacer, spaces) - .replace(/\u2028/g, '\\u2028') - .replace(/\u2029/g, '\\u2029'); - var callback = this.req.query[app.get('jsonp callback name')]; - - // content-type - this.charset = this.charset || 'utf-8'; - this.set('Content-Type', 'application/json'); - - // jsonp - if (callback) { - this.set('Content-Type', 'text/javascript'); - var cb = callback.replace(/[^\[\]\w$.]/g, ''); - body = cb + ' && ' + cb + '(' + body + ');'; - } - - return this.send(body); -}; - -/** - * Transfer the file at the given `path`. - * - * Automatically sets the _Content-Type_ response header field. - * The callback `fn(err)` is invoked when the transfer is complete - * or when an error occurs. Be sure to check `res.sentHeader` - * if you wish to attempt responding, as the header and some data - * may have already been transferred. - * - * Options: - * - * - `maxAge` defaulting to 0 - * - `root` root directory for relative filenames - * - * Examples: - * - * The following example illustrates how `res.sendfile()` may - * be used as an alternative for the `static()` middleware for - * dynamic situations. The code backing `res.sendfile()` is actually - * the same code, so HTTP cache support etc is identical. - * - * app.get('/user/:uid/photos/:file', function(req, res){ - * var uid = req.params.uid - * , file = req.params.file; - * - * req.user.mayViewFilesFrom(uid, function(yes){ - * if (yes) { - * res.sendfile('/uploads/' + uid + '/' + file); - * } else { - * res.send(403, 'Sorry! you cant see that.'); - * } - * }); - * }); - * - * @param {String} path - * @param {Object|Function} options or fn - * @param {Function} fn - * @api public - */ - -res.sendfile = function(path, options, fn){ - var self = this - , req = self.req - , next = this.req.next - , options = options || {} - , done; - - // support function as second arg - if ('function' == typeof options) { - fn = options; - options = {}; - } - - // socket errors - req.socket.on('error', error); - - // errors - function error(err) { - if (done) return; - done = true; - - // clean up - cleanup(); - if (!self.headerSent) self.removeHeader('Content-Disposition'); - - // callback available - if (fn) return fn(err); - - // list in limbo if there's no callback - if (self.headerSent) return; - - // delegate - next(err); - } - - // streaming - function stream() { - if (done) return; - cleanup(); - if (fn) self.on('finish', fn); - } - - // cleanup - function cleanup() { - req.socket.removeListener('error', error); - } - - // transfer - var file = send(req, path); - if (options.root) file.root(options.root); - file.maxage(options.maxAge || 0); - file.on('error', error); - file.on('directory', next); - file.on('stream', stream); - file.pipe(this); - this.on('finish', cleanup); -}; - -/** - * Transfer the file at the given `path` as an attachment. - * - * Optionally providing an alternate attachment `filename`, - * and optional callback `fn(err)`. The callback is invoked - * when the data transfer is complete, or when an error has - * ocurred. Be sure to check `res.headerSent` if you plan to respond. - * - * This method uses `res.sendfile()`. - * - * @param {String} path - * @param {String|Function} filename or fn - * @param {Function} fn - * @api public - */ - -res.download = function(path, filename, fn){ - // support function as second arg - if ('function' == typeof filename) { - fn = filename; - filename = null; - } - - filename = filename || path; - this.set('Content-Disposition', 'attachment; filename="' + basename(filename) + '"'); - return this.sendfile(path, fn); -}; - -/** - * Set _Content-Type_ response header with `type` through `mime.lookup()` - * when it does not contain "/", or set the Content-Type to `type` otherwise. - * - * Examples: - * - * res.type('.html'); - * res.type('html'); - * res.type('json'); - * res.type('application/json'); - * res.type('png'); - * - * @param {String} type - * @return {ServerResponse} for chaining - * @api public - */ - -res.contentType = -res.type = function(type){ - return this.set('Content-Type', ~type.indexOf('/') - ? type - : mime.lookup(type)); -}; - -/** - * Respond to the Acceptable formats using an `obj` - * of mime-type callbacks. - * - * This method uses `req.accepted`, an array of - * acceptable types ordered by their quality values. - * When "Accept" is not present the _first_ callback - * is invoked, otherwise the first match is used. When - * no match is performed the server responds with - * 406 "Not Acceptable". - * - * Content-Type is set for you, however if you choose - * you may alter this within the callback using `res.type()` - * or `res.set('Content-Type', ...)`. - * - * res.format({ - * 'text/plain': function(){ - * res.send('hey'); - * }, - * - * 'text/html': function(){ - * res.send('

hey

'); - * }, - * - * 'appliation/json': function(){ - * res.send({ message: 'hey' }); - * } - * }); - * - * In addition to canonicalized MIME types you may - * also use extnames mapped to these types: - * - * res.format({ - * text: function(){ - * res.send('hey'); - * }, - * - * html: function(){ - * res.send('

hey

'); - * }, - * - * json: function(){ - * res.send({ message: 'hey' }); - * } - * }); - * - * By default Express passes an `Error` - * with a `.status` of 406 to `next(err)` - * if a match is not made. If you provide - * a `.default` callback it will be invoked - * instead. - * - * @param {Object} obj - * @return {ServerResponse} for chaining - * @api public - */ - -res.format = function(obj){ - var req = this.req - , next = req.next; - - var fn = obj.default; - if (fn) delete obj.default; - var keys = Object.keys(obj); - - var key = req.accepts(keys); - - this.set('Vary', 'Accept'); - - if (key) { - this.set('Content-Type', normalizeType(key)); - obj[key](req, this, next); - } else if (fn) { - fn(); - } else { - var err = new Error('Not Acceptable'); - err.status = 406; - err.types = normalizeTypes(keys); - next(err); - } - - return this; -}; - -/** - * Set _Content-Disposition_ header to _attachment_ with optional `filename`. - * - * @param {String} filename - * @return {ServerResponse} - * @api public - */ - -res.attachment = function(filename){ - if (filename) this.type(extname(filename)); - this.set('Content-Disposition', filename - ? 'attachment; filename="' + basename(filename) + '"' - : 'attachment'); - return this; -}; - -/** - * Set header `field` to `val`, or pass - * an object of header fields. - * - * Examples: - * - * res.set('Foo', ['bar', 'baz']); - * res.set('Accept', 'application/json'); - * res.set({ Accept: 'text/plain', 'X-API-Key': 'tobi' }); - * - * Aliased as `res.header()`. - * - * @param {String|Object|Array} field - * @param {String} val - * @return {ServerResponse} for chaining - * @api public - */ - -res.set = -res.header = function(field, val){ - if (2 == arguments.length) { - if (Array.isArray(val)) val = val.map(String); - else val = String(val); - this.setHeader(field, val); - } else { - for (var key in field) { - this.set(key, field[key]); - } - } - return this; -}; - -/** - * Get value for header `field`. - * - * @param {String} field - * @return {String} - * @api public - */ - -res.get = function(field){ - return this.getHeader(field); -}; - -/** - * Clear cookie `name`. - * - * @param {String} name - * @param {Object} options - * @param {ServerResponse} for chaining - * @api public - */ - -res.clearCookie = function(name, options){ - var opts = { expires: new Date(1), path: '/' }; - return this.cookie(name, '', options - ? utils.merge(opts, options) - : opts); -}; - -/** - * Set cookie `name` to `val`, with the given `options`. - * - * Options: - * - * - `maxAge` max-age in milliseconds, converted to `expires` - * - `signed` sign the cookie - * - `path` defaults to "/" - * - * Examples: - * - * // "Remember Me" for 15 minutes - * res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true }); - * - * // save as above - * res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true }) - * - * @param {String} name - * @param {String|Object} val - * @param {Options} options - * @api public - */ - -res.cookie = function(name, val, options){ - options = utils.merge({}, options); - var secret = this.req.secret; - var signed = options.signed; - if (signed && !secret) throw new Error('connect.cookieParser("secret") required for signed cookies'); - if ('object' == typeof val) val = 'j:' + JSON.stringify(val); - if (signed) val = 's:' + sign(val, secret); - if ('maxAge' in options) { - options.expires = new Date(Date.now() + options.maxAge); - options.maxAge /= 1000; - } - if (null == options.path) options.path = '/'; - this.set('Set-Cookie', cookie.serialize(name, String(val), options)); - return this; -}; - - -/** - * Set the location header to `url`. - * - * The given `url` can also be the name of a mapped url, for - * example by default express supports "back" which redirects - * to the _Referrer_ or _Referer_ headers or "/". - * - * Examples: - * - * res.location('/foo/bar').; - * res.location('http://example.com'); - * res.location('../login'); // /blog/post/1 -> /blog/login - * - * Mounting: - * - * When an application is mounted and `res.location()` - * is given a path that does _not_ lead with "/" it becomes - * relative to the mount-point. For example if the application - * is mounted at "/blog", the following would become "/blog/login". - * - * res.location('login'); - * - * While the leading slash would result in a location of "/login": - * - * res.location('/login'); - * - * @param {String} url - * @api public - */ - -res.location = function(url){ - var app = this.app - , req = this.req; - - // setup redirect map - var map = { back: req.get('Referrer') || '/' }; - - // perform redirect - url = map[url] || url; - - // relative - if (!~url.indexOf('://') && 0 != url.indexOf('//')) { - var path = app.path(); - - // relative to path - if ('.' == url[0]) { - url = req.path + '/' + url; - // relative to mount-point - } else if ('/' != url[0]) { - url = path + '/' + url; - } - } - - // Respond - this.set('Location', url); - return this; -}; - -/** - * Redirect to the given `url` with optional response `status` - * defaulting to 302. - * - * The resulting `url` is determined by `res.location()`, so - * it will play nicely with mounted apps, relative paths, - * `"back"` etc. - * - * Examples: - * - * res.redirect('/foo/bar'); - * res.redirect('http://example.com'); - * res.redirect(301, 'http://example.com'); - * res.redirect('http://example.com', 301); - * res.redirect('../login'); // /blog/post/1 -> /blog/login - * - * @param {String} url - * @param {Number} code - * @api public - */ - -res.redirect = function(url){ - var app = this.app - , head = 'HEAD' == this.req.method - , status = 302 - , body; - - // allow status / url - if (2 == arguments.length) { - if ('number' == typeof url) { - status = url; - url = arguments[1]; - } else { - status = arguments[1]; - } - } - - // Set location header - this.location(url); - url = this.get('Location'); - - // Support text/{plain,html} by default - this.format({ - text: function(){ - body = statusCodes[status] + '. Redirecting to ' + encodeURI(url); - }, - - html: function(){ - var u = utils.escape(url); - body = '

' + statusCodes[status] + '. Redirecting to ' + u + '

'; - }, - - default: function(){ - body = ''; - } - }); - - // Respond - this.statusCode = status; - this.set('Content-Length', Buffer.byteLength(body)); - this.end(head ? null : body); -}; - -/** - * Render `view` with the given `options` and optional callback `fn`. - * When a callback function is given a response will _not_ be made - * automatically, otherwise a response of _200_ and _text/html_ is given. - * - * Options: - * - * - `cache` boolean hinting to the engine it should cache - * - `filename` filename of the view being rendered - * - * @param {String} view - * @param {Object|Function} options or callback function - * @param {Function} fn - * @api public - */ - -res.render = function(view, options, fn){ - var self = this - , options = options || {} - , req = this.req - , app = req.app; - - // support callback function as second arg - if ('function' == typeof options) { - fn = options, options = {}; - } - - // merge res.locals - options._locals = self.locals; - - // default callback to respond - fn = fn || function(err, str){ - if (err) return req.next(err); - self.send(str); - }; - - // render - app.render(view, options, fn); -}; diff --git a/node_modules/express/lib/router/index.js b/node_modules/express/lib/router/index.js deleted file mode 100644 index 662dc29..0000000 --- a/node_modules/express/lib/router/index.js +++ /dev/null @@ -1,273 +0,0 @@ -/** - * Module dependencies. - */ - -var Route = require('./route') - , utils = require('../utils') - , methods = require('methods') - , debug = require('debug')('express:router') - , parse = require('connect').utils.parseUrl; - -/** - * Expose `Router` constructor. - */ - -exports = module.exports = Router; - -/** - * Initialize a new `Router` with the given `options`. - * - * @param {Object} options - * @api private - */ - -function Router(options) { - options = options || {}; - var self = this; - this.map = {}; - this.params = {}; - this._params = []; - this.caseSensitive = options.caseSensitive; - this.strict = options.strict; - this.middleware = function router(req, res, next){ - self._dispatch(req, res, next); - }; -} - -/** - * Register a param callback `fn` for the given `name`. - * - * @param {String|Function} name - * @param {Function} fn - * @return {Router} for chaining - * @api public - */ - -Router.prototype.param = function(name, fn){ - // param logic - if ('function' == typeof name) { - this._params.push(name); - return; - } - - // apply param functions - var params = this._params - , len = params.length - , ret; - - for (var i = 0; i < len; ++i) { - if (ret = params[i](name, fn)) { - fn = ret; - } - } - - // ensure we end up with a - // middleware function - if ('function' != typeof fn) { - throw new Error('invalid param() call for ' + name + ', got ' + fn); - } - - (this.params[name] = this.params[name] || []).push(fn); - return this; -}; - -/** - * Route dispatcher aka the route "middleware". - * - * @param {IncomingMessage} req - * @param {ServerResponse} res - * @param {Function} next - * @api private - */ - -Router.prototype._dispatch = function(req, res, next){ - var params = this.params - , self = this; - - debug('dispatching %s %s (%s)', req.method, req.url, req.originalUrl); - - // route dispatch - (function pass(i, err){ - var paramCallbacks - , paramIndex = 0 - , paramVal - , route - , keys - , key; - - // match next route - function nextRoute(err) { - pass(req._route_index + 1, err); - } - - // match route - req.route = route = self.matchRequest(req, i); - - // no route - if (!route) return next(err); - debug('matched %s %s', route.method, route.path); - - // we have a route - // start at param 0 - req.params = route.params; - keys = route.keys; - i = 0; - - // param callbacks - function param(err) { - paramIndex = 0; - key = keys[i++]; - paramVal = key && req.params[key.name]; - paramCallbacks = key && params[key.name]; - - try { - if ('route' == err) { - nextRoute(); - } else if (err) { - i = 0; - callbacks(err); - } else if (paramCallbacks && undefined !== paramVal) { - paramCallback(); - } else if (key) { - param(); - } else { - i = 0; - callbacks(); - } - } catch (err) { - param(err); - } - }; - - param(err); - - // single param callbacks - function paramCallback(err) { - var fn = paramCallbacks[paramIndex++]; - if (err || !fn) return param(err); - fn(req, res, paramCallback, paramVal, key.name); - } - - // invoke route callbacks - function callbacks(err) { - var fn = route.callbacks[i++]; - try { - if ('route' == err) { - nextRoute(); - } else if (err && fn) { - if (fn.length < 4) return callbacks(err); - fn(err, req, res, callbacks); - } else if (fn) { - if (fn.length < 4) return fn(req, res, callbacks); - callbacks(); - } else { - nextRoute(err); - } - } catch (err) { - callbacks(err); - } - } - })(0); -}; - -/** - * Attempt to match a route for `req` - * with optional starting index of `i` - * defaulting to 0. - * - * @param {IncomingMessage} req - * @param {Number} i - * @return {Route} - * @api private - */ - -Router.prototype.matchRequest = function(req, i, head){ - var method = req.method.toLowerCase() - , url = parse(req) - , path = url.pathname - , routes = this.map - , i = i || 0 - , route; - - // HEAD support - if (!head && 'head' == method) { - route = this.matchRequest(req, i, true); - if (route) return route; - method = 'get'; - } - - // routes for this method - if (routes = routes[method]) { - - // matching routes - for (var len = routes.length; i < len; ++i) { - route = routes[i]; - if (route.match(path)) { - req._route_index = i; - return route; - } - } - } -}; - -/** - * Attempt to match a route for `method` - * and `url` with optional starting - * index of `i` defaulting to 0. - * - * @param {String} method - * @param {String} url - * @param {Number} i - * @return {Route} - * @api private - */ - -Router.prototype.match = function(method, url, i, head){ - var req = { method: method, url: url }; - return this.matchRequest(req, i, head); -}; - -/** - * Route `method`, `path`, and one or more callbacks. - * - * @param {String} method - * @param {String} path - * @param {Function} callback... - * @return {Router} for chaining - * @api private - */ - -Router.prototype.route = function(method, path, callbacks){ - var method = method.toLowerCase() - , callbacks = utils.flatten([].slice.call(arguments, 2)); - - // ensure path was given - if (!path) throw new Error('Router#' + method + '() requires a path'); - - // ensure all callbacks are functions - callbacks.forEach(function(fn, i){ - if ('function' == typeof fn) return; - var type = {}.toString.call(fn); - var msg = '.' + method + '() requires callback functions but got a ' + type; - throw new Error(msg); - }); - - // create the route - debug('defined %s %s', method, path); - var route = new Route(method, path, callbacks, { - sensitive: this.caseSensitive, - strict: this.strict - }); - - // add it - (this.map[method] = this.map[method] || []).push(route); - return this; -}; - -methods.forEach(function(method){ - Router.prototype[method] = function(path){ - var args = [method].concat([].slice.call(arguments)); - this.route.apply(this, args); - return this; - }; -}); diff --git a/node_modules/express/lib/router/route.js b/node_modules/express/lib/router/route.js deleted file mode 100644 index c1a0b5e..0000000 --- a/node_modules/express/lib/router/route.js +++ /dev/null @@ -1,72 +0,0 @@ - -/** - * Module dependencies. - */ - -var utils = require('../utils'); - -/** - * Expose `Route`. - */ - -module.exports = Route; - -/** - * Initialize `Route` with the given HTTP `method`, `path`, - * and an array of `callbacks` and `options`. - * - * Options: - * - * - `sensitive` enable case-sensitive routes - * - `strict` enable strict matching for trailing slashes - * - * @param {String} method - * @param {String} path - * @param {Array} callbacks - * @param {Object} options. - * @api private - */ - -function Route(method, path, callbacks, options) { - options = options || {}; - this.path = path; - this.method = method; - this.callbacks = callbacks; - this.regexp = utils.pathRegexp(path - , this.keys = [] - , options.sensitive - , options.strict); -} - -/** - * Check if this route matches `path`, if so - * populate `.params`. - * - * @param {String} path - * @return {Boolean} - * @api private - */ - -Route.prototype.match = function(path){ - var keys = this.keys - , params = this.params = [] - , m = this.regexp.exec(path); - - if (!m) return false; - - for (var i = 1, len = m.length; i < len; ++i) { - var key = keys[i - 1]; - - var val = 'string' == typeof m[i] - ? decodeURIComponent(m[i]) - : m[i]; - - if (key) { - params[key.name] = val; - } else { - params.push(val); - } - } - - return true; -}; diff --git a/node_modules/express/lib/utils.js b/node_modules/express/lib/utils.js deleted file mode 100644 index 8b1da1a..0000000 --- a/node_modules/express/lib/utils.js +++ /dev/null @@ -1,282 +0,0 @@ - -/** - * Module dependencies. - */ - -var mime = require('connect').mime - , crc32 = require('buffer-crc32'); - -/** - * Return ETag for `body`. - * - * @param {String|Buffer} body - * @return {String} - * @api private - */ - -exports.etag = function(body){ - return '"' + crc32.signed(body) + '"'; -}; - -/** - * Make `locals()` bound to the given `obj`. - * - * This is used for `app.locals` and `res.locals`. - * - * @param {Object} obj - * @return {Function} - * @api private - */ - -exports.locals = function(obj){ - obj.viewCallbacks = obj.viewCallbacks || []; - - function locals(obj){ - for (var key in obj) locals[key] = obj[key]; - return obj; - }; - - return locals; -}; - -/** - * Check if `path` looks absolute. - * - * @param {String} path - * @return {Boolean} - * @api private - */ - -exports.isAbsolute = function(path){ - if ('/' == path[0]) return true; - if (':' == path[1] && '\\' == path[2]) return true; -}; - -/** - * Flatten the given `arr`. - * - * @param {Array} arr - * @return {Array} - * @api private - */ - -exports.flatten = function(arr, ret){ - var ret = ret || [] - , len = arr.length; - for (var i = 0; i < len; ++i) { - if (Array.isArray(arr[i])) { - exports.flatten(arr[i], ret); - } else { - ret.push(arr[i]); - } - } - return ret; -}; - -/** - * Normalize the given `type`, for example "html" becomes "text/html". - * - * @param {String} type - * @return {String} - * @api private - */ - -exports.normalizeType = function(type){ - return ~type.indexOf('/') ? type : mime.lookup(type); -}; - -/** - * Normalize `types`, for example "html" becomes "text/html". - * - * @param {Array} types - * @return {Array} - * @api private - */ - -exports.normalizeTypes = function(types){ - var ret = []; - - for (var i = 0; i < types.length; ++i) { - ret.push(~types[i].indexOf('/') - ? types[i] - : mime.lookup(types[i])); - } - - return ret; -}; - -/** - * Return the acceptable type in `types`, if any. - * - * @param {Array} types - * @param {String} str - * @return {String} - * @api private - */ - -exports.acceptsArray = function(types, str){ - // accept anything when Accept is not present - if (!str) return types[0]; - - // parse - var accepted = exports.parseAccept(str) - , normalized = exports.normalizeTypes(types) - , len = accepted.length; - - for (var i = 0; i < len; ++i) { - for (var j = 0, jlen = types.length; j < jlen; ++j) { - if (exports.accept(normalized[j].split('/'), accepted[i])) { - return types[j]; - } - } - } -}; - -/** - * Check if `type(s)` are acceptable based on - * the given `str`. - * - * @param {String|Array} type(s) - * @param {String} str - * @return {Boolean|String} - * @api private - */ - -exports.accepts = function(type, str){ - if ('string' == typeof type) type = type.split(/ *, */); - return exports.acceptsArray(type, str); -}; - -/** - * Check if `type` array is acceptable for `other`. - * - * @param {Array} type - * @param {Object} other - * @return {Boolean} - * @api private - */ - -exports.accept = function(type, other){ - return (type[0] == other.type || '*' == other.type) - && (type[1] == other.subtype || '*' == other.subtype); -}; - -/** - * Parse accept `str`, returning - * an array objects containing - * `.type` and `.subtype` along - * with the values provided by - * `parseQuality()`. - * - * @param {Type} name - * @return {Type} - * @api private - */ - -exports.parseAccept = function(str){ - return exports - .parseQuality(str) - .map(function(obj){ - var parts = obj.value.split('/'); - obj.type = parts[0]; - obj.subtype = parts[1]; - return obj; - }); -}; - -/** - * Parse quality `str`, returning an - * array of objects with `.value` and - * `.quality`. - * - * @param {Type} name - * @return {Type} - * @api private - */ - -exports.parseQuality = function(str){ - return str - .split(/ *, */) - .map(quality) - .filter(function(obj){ - return obj.quality; - }) - .sort(function(a, b){ - return b.quality - a.quality; - }); -}; - -/** - * Parse quality `str` returning an - * object with `.value` and `.quality`. - * - * @param {String} str - * @return {Object} - * @api private - */ - -function quality(str) { - var parts = str.split(/ *; */) - , val = parts[0]; - - var q = parts[1] - ? parseFloat(parts[1].split(/ *= */)[1]) - : 1; - - return { value: val, quality: q }; -} - -/** - * Escape special characters in the given string of html. - * - * @param {String} html - * @return {String} - * @api private - */ - -exports.escape = function(html) { - return String(html) - .replace(/&/g, '&') - .replace(/"/g, '"') - .replace(//g, '>'); -}; - -/** - * Normalize the given path string, - * returning a regular expression. - * - * An empty array should be passed, - * which will contain the placeholder - * key names. For example "/user/:id" will - * then contain ["id"]. - * - * @param {String|RegExp|Array} path - * @param {Array} keys - * @param {Boolean} sensitive - * @param {Boolean} strict - * @return {RegExp} - * @api private - */ - -exports.pathRegexp = function(path, keys, sensitive, strict) { - if (path instanceof RegExp) return path; - if (Array.isArray(path)) path = '(' + path.join('|') + ')'; - path = path - .concat(strict ? '' : '/?') - .replace(/\/\(/g, '(?:/') - .replace(/(\/)?(\.)?:(\w+)(?:(\(.*?\)))?(\?)?(\*)?/g, function(_, slash, format, key, capture, optional, star){ - keys.push({ name: key, optional: !! optional }); - slash = slash || ''; - return '' - + (optional ? '' : slash) - + '(?:' - + (optional ? slash : '') - + (format || '') + (capture || (format && '([^/.]+?)' || '([^/]+?)')) + ')' - + (optional || '') - + (star ? '(/*)?' : ''); - }) - .replace(/([\/.])/g, '\\$1') - .replace(/\*/g, '(.*)'); - return new RegExp('^' + path + '$', sensitive ? '' : 'i'); -} \ No newline at end of file diff --git a/node_modules/express/lib/view.js b/node_modules/express/lib/view.js deleted file mode 100644 index c7399a4..0000000 --- a/node_modules/express/lib/view.js +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Module dependencies. - */ - -var path = require('path') - , fs = require('fs') - , utils = require('./utils') - , dirname = path.dirname - , basename = path.basename - , extname = path.extname - , exists = fs.existsSync || path.existsSync - , join = path.join; - -/** - * Expose `View`. - */ - -module.exports = View; - -/** - * Initialize a new `View` with the given `name`. - * - * Options: - * - * - `defaultEngine` the default template engine name - * - `engines` template engine require() cache - * - `root` root path for view lookup - * - * @param {String} name - * @param {Object} options - * @api private - */ - -function View(name, options) { - options = options || {}; - this.name = name; - this.root = options.root; - var engines = options.engines; - this.defaultEngine = options.defaultEngine; - var ext = this.ext = extname(name); - if (!ext) name += (ext = this.ext = ('.' != this.defaultEngine[0] ? '.' : '') + this.defaultEngine); - this.engine = engines[ext] || (engines[ext] = require(ext.slice(1)).__express); - this.path = this.lookup(name); -} - -/** - * Lookup view by the given `path` - * - * @param {String} path - * @return {String} - * @api private - */ - -View.prototype.lookup = function(path){ - var ext = this.ext; - - // . - if (!utils.isAbsolute(path)) path = join(this.root, path); - if (exists(path)) return path; - - // /index. - path = join(dirname(path), basename(path, ext), 'index' + ext); - if (exists(path)) return path; -}; - -/** - * Render with the given `options` and callback `fn(err, str)`. - * - * @param {Object} options - * @param {Function} fn - * @api private - */ - -View.prototype.render = function(options, fn){ - this.engine(this.path, options, fn); -}; diff --git a/node_modules/express/node_modules/buffer-crc32/.npmignore b/node_modules/express/node_modules/buffer-crc32/.npmignore deleted file mode 100644 index b512c09..0000000 --- a/node_modules/express/node_modules/buffer-crc32/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules \ No newline at end of file diff --git a/node_modules/express/node_modules/buffer-crc32/.travis.yml b/node_modules/express/node_modules/buffer-crc32/.travis.yml deleted file mode 100644 index 7a902e8..0000000 --- a/node_modules/express/node_modules/buffer-crc32/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 -notifications: - email: - recipients: - - brianloveswords@gmail.com \ No newline at end of file diff --git a/node_modules/express/node_modules/buffer-crc32/README.md b/node_modules/express/node_modules/buffer-crc32/README.md deleted file mode 100644 index 4ad5d64..0000000 --- a/node_modules/express/node_modules/buffer-crc32/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# buffer-crc32 - -[![Build Status](https://secure.travis-ci.org/brianloveswords/buffer-crc32.png?branch=master)](http://travis-ci.org/brianloveswords/buffer-crc32) - -crc32 that works with binary data and fancy character sets, outputs -buffer, signed or unsigned data and has tests. - -Derived from the sample CRC implementation in the PNG specification: http://www.w3.org/TR/PNG/#D-CRCAppendix - -# install -``` -npm install buffer-crc32 -``` - -# example -```js -var crc32 = require('buffer-crc32'); -// works with buffers -var buf = Buffer([[0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00]) -crc32(buf) // -> - -// has convenience methods for getting signed or unsigned ints -crc32.signed(buf) // -> -1805997238 -crc32.unsigned(buf) // -> 2488970058 - -// will cast to buffer if given a string, so you can -// directly use foreign characters safely -crc32('自動販売機') // -> -``` - -# tests -This was tested against the output of zlib's crc32 method. You can run -the tests with`npm test` (requires tap) diff --git a/node_modules/express/node_modules/buffer-crc32/index.js b/node_modules/express/node_modules/buffer-crc32/index.js deleted file mode 100644 index ab0e19e..0000000 --- a/node_modules/express/node_modules/buffer-crc32/index.js +++ /dev/null @@ -1,84 +0,0 @@ -var Buffer = require('buffer').Buffer; - -var CRC_TABLE = [ - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, - 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, - 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, - 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, - 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, - 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, - 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, - 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, - 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, - 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a, - 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, - 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, - 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, - 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, - 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, - 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, - 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, - 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, - 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, - 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, - 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, - 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010, - 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, - 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, - 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, - 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, - 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, - 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, - 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, - 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, - 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, - 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c, - 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, - 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, - 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, - 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, - 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, - 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, - 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, - 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, - 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, - 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278, - 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, - 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, - 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, - 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, - 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, - 0x2d02ef8d -]; - -function bufferizeInt(num) { - var tmp = Buffer(4); - tmp.writeInt32BE(num, 0); - return tmp; -} - -function _crc32(buf) { - if (!Buffer.isBuffer(buf)) - buf = Buffer(buf); - var crc = 0xffffffff; - for (var n = 0; n < buf.length; n++) { - crc = CRC_TABLE[(crc ^ buf[n]) & 0xff] ^ (crc >>> 8); - } - return (crc ^ 0xffffffff); -} - -function crc32() { - return bufferizeInt(_crc32.apply(null, arguments)); -} -crc32.signed = function () { - return _crc32.apply(null, arguments); -}; -crc32.unsigned = function () { - return crc32.apply(null, arguments).readUInt32BE(0); -}; - -module.exports = crc32; diff --git a/node_modules/express/node_modules/buffer-crc32/package.json b/node_modules/express/node_modules/buffer-crc32/package.json deleted file mode 100644 index d9b0b51..0000000 --- a/node_modules/express/node_modules/buffer-crc32/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "author": { - "name": "Brian J. Brennan", - "email": "brianloveswords@gmail.com", - "url": "http://bjb.io" - }, - "name": "buffer-crc32", - "description": "A pure javascript CRC32 algorithm that plays nice with binary data", - "version": "0.1.1", - "homepage": "https://github.com/brianloveswords/buffer-crc32", - "repository": { - "type": "git", - "url": "git://github.com/brianloveswords/buffer-crc32.git" - }, - "main": "index.js", - "scripts": { - "test": "./node_modules/.bin/tap tests/*.test.js" - }, - "dependencies": {}, - "devDependencies": { - "tap": "~0.2.5" - }, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "readme": "# buffer-crc32\n\n[![Build Status](https://secure.travis-ci.org/brianloveswords/buffer-crc32.png?branch=master)](http://travis-ci.org/brianloveswords/buffer-crc32)\n\ncrc32 that works with binary data and fancy character sets, outputs\nbuffer, signed or unsigned data and has tests.\n\nDerived from the sample CRC implementation in the PNG specification: http://www.w3.org/TR/PNG/#D-CRCAppendix\n\n# install\n```\nnpm install buffer-crc32\n```\n\n# example\n```js\nvar crc32 = require('buffer-crc32');\n// works with buffers\nvar buf = Buffer([[0x00, 0x73, 0x75, 0x70, 0x20, 0x62, 0x72, 0x6f, 0x00])\ncrc32(buf) // -> \n\n// has convenience methods for getting signed or unsigned ints\ncrc32.signed(buf) // -> -1805997238\ncrc32.unsigned(buf) // -> 2488970058\n\n// will cast to buffer if given a string, so you can\n// directly use foreign characters safely\ncrc32('自動販売機') // -> \n```\n\n# tests\nThis was tested against the output of zlib's crc32 method. You can run\nthe tests with`npm test` (requires tap)\n", - "_id": "buffer-crc32@0.1.1", - "_from": "buffer-crc32@0.1.1" -} diff --git a/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js b/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js deleted file mode 100644 index d4767e3..0000000 --- a/node_modules/express/node_modules/buffer-crc32/tests/crc.test.js +++ /dev/null @@ -1,52 +0,0 @@ -var crc32 = require('..'); -var test = require('tap').test; - -test('simple crc32 is no problem', function (t) { - var input = Buffer('hey sup bros'); - var expected = Buffer([0x47, 0xfa, 0x55, 0x70]); - t.same(crc32(input), expected); - t.end(); -}); - -test('another simple one', function (t) { - var input = Buffer('IEND'); - var expected = Buffer([0xae, 0x42, 0x60, 0x82]); - t.same(crc32(input), expected); - t.end(); -}); - -test('slightly more complex', function (t) { - var input = Buffer([0x00, 0x00, 0x00]); - var expected = Buffer([0xff, 0x41, 0xd9, 0x12]); - t.same(crc32(input), expected); - t.end(); -}); - -test('complex crc32 gets calculated like a champ', function (t) { - var input = Buffer('शीर्षक'); - var expected = Buffer([0x17, 0xb8, 0xaf, 0xf1]); - t.same(crc32(input), expected); - t.end(); -}); - -test('casts to buffer if necessary', function (t) { - var input = 'शीर्षक'; - var expected = Buffer([0x17, 0xb8, 0xaf, 0xf1]); - t.same(crc32(input), expected); - t.end(); -}); - -test('can do unsigned', function (t) { - var input = 'ham sandwich'; - var expected = -1891873021; - t.same(crc32.signed(input), expected); - t.end(); -}); - -test('can do signed', function (t) { - var input = 'bear sandwich'; - var expected = 3711466352; - t.same(crc32.unsigned(input), expected); - t.end(); -}); - diff --git a/node_modules/express/node_modules/commander/.npmignore b/node_modules/express/node_modules/commander/.npmignore deleted file mode 100644 index f1250e5..0000000 --- a/node_modules/express/node_modules/commander/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -support -test -examples -*.sock diff --git a/node_modules/express/node_modules/commander/.travis.yml b/node_modules/express/node_modules/commander/.travis.yml deleted file mode 100644 index f1d0f13..0000000 --- a/node_modules/express/node_modules/commander/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.4 - - 0.6 diff --git a/node_modules/express/node_modules/commander/History.md b/node_modules/express/node_modules/commander/History.md deleted file mode 100644 index 4961d2e..0000000 --- a/node_modules/express/node_modules/commander/History.md +++ /dev/null @@ -1,107 +0,0 @@ - -0.6.1 / 2012-06-01 -================== - - * Added: append (yes or no) on confirmation - * Added: allow node.js v0.7.x - -0.6.0 / 2012-04-10 -================== - - * Added `.prompt(obj, callback)` support. Closes #49 - * Added default support to .choose(). Closes #41 - * Fixed the choice example - -0.5.1 / 2011-12-20 -================== - - * Fixed `password()` for recent nodes. Closes #36 - -0.5.0 / 2011-12-04 -================== - - * Added sub-command option support [itay] - -0.4.3 / 2011-12-04 -================== - - * Fixed custom help ordering. Closes #32 - -0.4.2 / 2011-11-24 -================== - - * Added travis support - * Fixed: line-buffered input automatically trimmed. Closes #31 - -0.4.1 / 2011-11-18 -================== - - * Removed listening for "close" on --help - -0.4.0 / 2011-11-15 -================== - - * Added support for `--`. Closes #24 - -0.3.3 / 2011-11-14 -================== - - * Fixed: wait for close event when writing help info [Jerry Hamlet] - -0.3.2 / 2011-11-01 -================== - - * Fixed long flag definitions with values [felixge] - -0.3.1 / 2011-10-31 -================== - - * Changed `--version` short flag to `-V` from `-v` - * Changed `.version()` so it's configurable [felixge] - -0.3.0 / 2011-10-31 -================== - - * Added support for long flags only. Closes #18 - -0.2.1 / 2011-10-24 -================== - - * "node": ">= 0.4.x < 0.7.0". Closes #20 - -0.2.0 / 2011-09-26 -================== - - * Allow for defaults that are not just boolean. Default peassignment only occurs for --no-*, optional, and required arguments. [Jim Isaacs] - -0.1.0 / 2011-08-24 -================== - - * Added support for custom `--help` output - -0.0.5 / 2011-08-18 -================== - - * Changed: when the user enters nothing prompt for password again - * Fixed issue with passwords beginning with numbers [NuckChorris] - -0.0.4 / 2011-08-15 -================== - - * Fixed `Commander#args` - -0.0.3 / 2011-08-15 -================== - - * Added default option value support - -0.0.2 / 2011-08-15 -================== - - * Added mask support to `Command#password(str[, mask], fn)` - * Added `Command#password(str, fn)` - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/node_modules/express/node_modules/commander/Makefile b/node_modules/express/node_modules/commander/Makefile deleted file mode 100644 index 0074625..0000000 --- a/node_modules/express/node_modules/commander/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -TESTS = $(shell find test/test.*.js) - -test: - @./test/run $(TESTS) - -.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/commander/Readme.md b/node_modules/express/node_modules/commander/Readme.md deleted file mode 100644 index b8328c3..0000000 --- a/node_modules/express/node_modules/commander/Readme.md +++ /dev/null @@ -1,262 +0,0 @@ -# Commander.js - - The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander). - - [![Build Status](https://secure.travis-ci.org/visionmedia/commander.js.png)](http://travis-ci.org/visionmedia/commander.js) - -## Installation - - $ npm install commander - -## Option parsing - - Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options. - -```js -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var program = require('commander'); - -program - .version('0.0.1') - .option('-p, --peppers', 'Add peppers') - .option('-P, --pineapple', 'Add pineapple') - .option('-b, --bbq', 'Add bbq sauce') - .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble') - .parse(process.argv); - -console.log('you ordered a pizza with:'); -if (program.peppers) console.log(' - peppers'); -if (program.pineapple) console.log(' - pineappe'); -if (program.bbq) console.log(' - bbq'); -console.log(' - %s cheese', program.cheese); -``` - - Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc. - -## Automated --help - - The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free: - -``` - $ ./examples/pizza --help - - Usage: pizza [options] - - Options: - - -V, --version output the version number - -p, --peppers Add peppers - -P, --pineapple Add pineappe - -b, --bbq Add bbq sauce - -c, --cheese Add the specified type of cheese [marble] - -h, --help output usage information - -``` - -## Coercion - -```js -function range(val) { - return val.split('..').map(Number); -} - -function list(val) { - return val.split(','); -} - -program - .version('0.0.1') - .usage('[options] ') - .option('-i, --integer ', 'An integer argument', parseInt) - .option('-f, --float ', 'A float argument', parseFloat) - .option('-r, --range ..', 'A range', range) - .option('-l, --list ', 'A list', list) - .option('-o, --optional [value]', 'An optional value') - .parse(process.argv); - -console.log(' int: %j', program.integer); -console.log(' float: %j', program.float); -console.log(' optional: %j', program.optional); -program.range = program.range || []; -console.log(' range: %j..%j', program.range[0], program.range[1]); -console.log(' list: %j', program.list); -console.log(' args: %j', program.args); -``` - -## Custom help - - You can display arbitrary `-h, --help` information - by listening for "--help". Commander will automatically - exit once you are done so that the remainder of your program - does not execute causing undesired behaviours, for example - in the following executable "stuff" will not output when - `--help` is used. - -```js -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var program = require('../'); - -function list(val) { - return val.split(',').map(Number); -} - -program - .version('0.0.1') - .option('-f, --foo', 'enable some foo') - .option('-b, --bar', 'enable some bar') - .option('-B, --baz', 'enable some baz'); - -// must be before .parse() since -// node's emit() is immediate - -program.on('--help', function(){ - console.log(' Examples:'); - console.log(''); - console.log(' $ custom-help --help'); - console.log(' $ custom-help -h'); - console.log(''); -}); - -program.parse(process.argv); - -console.log('stuff'); -``` - -yielding the following help output: - -``` - -Usage: custom-help [options] - -Options: - - -h, --help output usage information - -V, --version output the version number - -f, --foo enable some foo - -b, --bar enable some bar - -B, --baz enable some baz - -Examples: - - $ custom-help --help - $ custom-help -h - -``` - -## .prompt(msg, fn) - - Single-line prompt: - -```js -program.prompt('name: ', function(name){ - console.log('hi %s', name); -}); -``` - - Multi-line prompt: - -```js -program.prompt('description:', function(name){ - console.log('hi %s', name); -}); -``` - - Coercion: - -```js -program.prompt('Age: ', Number, function(age){ - console.log('age: %j', age); -}); -``` - -```js -program.prompt('Birthdate: ', Date, function(date){ - console.log('date: %s', date); -}); -``` - -## .password(msg[, mask], fn) - -Prompt for password without echoing: - -```js -program.password('Password: ', function(pass){ - console.log('got "%s"', pass); - process.stdin.destroy(); -}); -``` - -Prompt for password with mask char "*": - -```js -program.password('Password: ', '*', function(pass){ - console.log('got "%s"', pass); - process.stdin.destroy(); -}); -``` - -## .confirm(msg, fn) - - Confirm with the given `msg`: - -```js -program.confirm('continue? ', function(ok){ - console.log(' got %j', ok); -}); -``` - -## .choose(list, fn) - - Let the user choose from a `list`: - -```js -var list = ['tobi', 'loki', 'jane', 'manny', 'luna']; - -console.log('Choose the coolest pet:'); -program.choose(list, function(i){ - console.log('you chose %d "%s"', i, list[i]); -}); -``` - -## Links - - - [API documentation](http://visionmedia.github.com/commander.js/) - - [ascii tables](https://github.com/LearnBoost/cli-table) - - [progress bars](https://github.com/visionmedia/node-progress) - - [more progress bars](https://github.com/substack/node-multimeter) - - [examples](https://github.com/visionmedia/commander.js/tree/master/examples) - -## License - -(The MIT License) - -Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca> - -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. \ No newline at end of file diff --git a/node_modules/express/node_modules/commander/index.js b/node_modules/express/node_modules/commander/index.js deleted file mode 100644 index 06ec1e4..0000000 --- a/node_modules/express/node_modules/commander/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/commander'); \ No newline at end of file diff --git a/node_modules/express/node_modules/commander/lib/commander.js b/node_modules/express/node_modules/commander/lib/commander.js deleted file mode 100644 index 5ba87eb..0000000 --- a/node_modules/express/node_modules/commander/lib/commander.js +++ /dev/null @@ -1,1026 +0,0 @@ - -/*! - * commander - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter - , path = require('path') - , tty = require('tty') - , basename = path.basename; - -/** - * Expose the root command. - */ - -exports = module.exports = new Command; - -/** - * Expose `Command`. - */ - -exports.Command = Command; - -/** - * Expose `Option`. - */ - -exports.Option = Option; - -/** - * Initialize a new `Option` with the given `flags` and `description`. - * - * @param {String} flags - * @param {String} description - * @api public - */ - -function Option(flags, description) { - this.flags = flags; - this.required = ~flags.indexOf('<'); - this.optional = ~flags.indexOf('['); - this.bool = !~flags.indexOf('-no-'); - flags = flags.split(/[ ,|]+/); - if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift(); - this.long = flags.shift(); - this.description = description; -} - -/** - * Return option name. - * - * @return {String} - * @api private - */ - -Option.prototype.name = function(){ - return this.long - .replace('--', '') - .replace('no-', ''); -}; - -/** - * Check if `arg` matches the short or long flag. - * - * @param {String} arg - * @return {Boolean} - * @api private - */ - -Option.prototype.is = function(arg){ - return arg == this.short - || arg == this.long; -}; - -/** - * Initialize a new `Command`. - * - * @param {String} name - * @api public - */ - -function Command(name) { - this.commands = []; - this.options = []; - this.args = []; - this.name = name; -} - -/** - * Inherit from `EventEmitter.prototype`. - */ - -Command.prototype.__proto__ = EventEmitter.prototype; - -/** - * Add command `name`. - * - * The `.action()` callback is invoked when the - * command `name` is specified via __ARGV__, - * and the remaining arguments are applied to the - * function for access. - * - * When the `name` is "*" an un-matched command - * will be passed as the first arg, followed by - * the rest of __ARGV__ remaining. - * - * Examples: - * - * program - * .version('0.0.1') - * .option('-C, --chdir ', 'change the working directory') - * .option('-c, --config ', 'set config path. defaults to ./deploy.conf') - * .option('-T, --no-tests', 'ignore test hook') - * - * program - * .command('setup') - * .description('run remote setup commands') - * .action(function(){ - * console.log('setup'); - * }); - * - * program - * .command('exec ') - * .description('run the given remote command') - * .action(function(cmd){ - * console.log('exec "%s"', cmd); - * }); - * - * program - * .command('*') - * .description('deploy the given env') - * .action(function(env){ - * console.log('deploying "%s"', env); - * }); - * - * program.parse(process.argv); - * - * @param {String} name - * @return {Command} the new command - * @api public - */ - -Command.prototype.command = function(name){ - var args = name.split(/ +/); - var cmd = new Command(args.shift()); - this.commands.push(cmd); - cmd.parseExpectedArgs(args); - cmd.parent = this; - return cmd; -}; - -/** - * Parse expected `args`. - * - * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`. - * - * @param {Array} args - * @return {Command} for chaining - * @api public - */ - -Command.prototype.parseExpectedArgs = function(args){ - if (!args.length) return; - var self = this; - args.forEach(function(arg){ - switch (arg[0]) { - case '<': - self.args.push({ required: true, name: arg.slice(1, -1) }); - break; - case '[': - self.args.push({ required: false, name: arg.slice(1, -1) }); - break; - } - }); - return this; -}; - -/** - * Register callback `fn` for the command. - * - * Examples: - * - * program - * .command('help') - * .description('display verbose help') - * .action(function(){ - * // output help here - * }); - * - * @param {Function} fn - * @return {Command} for chaining - * @api public - */ - -Command.prototype.action = function(fn){ - var self = this; - this.parent.on(this.name, function(args, unknown){ - // Parse any so-far unknown options - unknown = unknown || []; - var parsed = self.parseOptions(unknown); - - // Output help if necessary - outputHelpIfNecessary(self, parsed.unknown); - - // If there are still any unknown options, then we simply - // die, unless someone asked for help, in which case we give it - // to them, and then we die. - if (parsed.unknown.length > 0) { - self.unknownOption(parsed.unknown[0]); - } - - self.args.forEach(function(arg, i){ - if (arg.required && null == args[i]) { - self.missingArgument(arg.name); - } - }); - - // Always append ourselves to the end of the arguments, - // to make sure we match the number of arguments the user - // expects - if (self.args.length) { - args[self.args.length] = self; - } else { - args.push(self); - } - - fn.apply(this, args); - }); - return this; -}; - -/** - * Define option with `flags`, `description` and optional - * coercion `fn`. - * - * The `flags` string should contain both the short and long flags, - * separated by comma, a pipe or space. The following are all valid - * all will output this way when `--help` is used. - * - * "-p, --pepper" - * "-p|--pepper" - * "-p --pepper" - * - * Examples: - * - * // simple boolean defaulting to false - * program.option('-p, --pepper', 'add pepper'); - * - * --pepper - * program.pepper - * // => Boolean - * - * // simple boolean defaulting to false - * program.option('-C, --no-cheese', 'remove cheese'); - * - * program.cheese - * // => true - * - * --no-cheese - * program.cheese - * // => true - * - * // required argument - * program.option('-C, --chdir ', 'change the working directory'); - * - * --chdir /tmp - * program.chdir - * // => "/tmp" - * - * // optional argument - * program.option('-c, --cheese [type]', 'add cheese [marble]'); - * - * @param {String} flags - * @param {String} description - * @param {Function|Mixed} fn or default - * @param {Mixed} defaultValue - * @return {Command} for chaining - * @api public - */ - -Command.prototype.option = function(flags, description, fn, defaultValue){ - var self = this - , option = new Option(flags, description) - , oname = option.name() - , name = camelcase(oname); - - // default as 3rd arg - if ('function' != typeof fn) defaultValue = fn, fn = null; - - // preassign default value only for --no-*, [optional], or - if (false == option.bool || option.optional || option.required) { - // when --no-* we make sure default is true - if (false == option.bool) defaultValue = true; - // preassign only if we have a default - if (undefined !== defaultValue) self[name] = defaultValue; - } - - // register the option - this.options.push(option); - - // when it's passed assign the value - // and conditionally invoke the callback - this.on(oname, function(val){ - // coercion - if (null != val && fn) val = fn(val); - - // unassigned or bool - if ('boolean' == typeof self[name] || 'undefined' == typeof self[name]) { - // if no value, bool true, and we have a default, then use it! - if (null == val) { - self[name] = option.bool - ? defaultValue || true - : false; - } else { - self[name] = val; - } - } else if (null !== val) { - // reassign - self[name] = val; - } - }); - - return this; -}; - -/** - * Parse `argv`, settings options and invoking commands when defined. - * - * @param {Array} argv - * @return {Command} for chaining - * @api public - */ - -Command.prototype.parse = function(argv){ - // store raw args - this.rawArgs = argv; - - // guess name - if (!this.name) this.name = basename(argv[1]); - - // process argv - var parsed = this.parseOptions(this.normalize(argv.slice(2))); - this.args = parsed.args; - return this.parseArgs(this.args, parsed.unknown); -}; - -/** - * Normalize `args`, splitting joined short flags. For example - * the arg "-abc" is equivalent to "-a -b -c". - * - * @param {Array} args - * @return {Array} - * @api private - */ - -Command.prototype.normalize = function(args){ - var ret = [] - , arg; - - for (var i = 0, len = args.length; i < len; ++i) { - arg = args[i]; - if (arg.length > 1 && '-' == arg[0] && '-' != arg[1]) { - arg.slice(1).split('').forEach(function(c){ - ret.push('-' + c); - }); - } else { - ret.push(arg); - } - } - - return ret; -}; - -/** - * Parse command `args`. - * - * When listener(s) are available those - * callbacks are invoked, otherwise the "*" - * event is emitted and those actions are invoked. - * - * @param {Array} args - * @return {Command} for chaining - * @api private - */ - -Command.prototype.parseArgs = function(args, unknown){ - var cmds = this.commands - , len = cmds.length - , name; - - if (args.length) { - name = args[0]; - if (this.listeners(name).length) { - this.emit(args.shift(), args, unknown); - } else { - this.emit('*', args); - } - } else { - outputHelpIfNecessary(this, unknown); - - // If there were no args and we have unknown options, - // then they are extraneous and we need to error. - if (unknown.length > 0) { - this.unknownOption(unknown[0]); - } - } - - return this; -}; - -/** - * Return an option matching `arg` if any. - * - * @param {String} arg - * @return {Option} - * @api private - */ - -Command.prototype.optionFor = function(arg){ - for (var i = 0, len = this.options.length; i < len; ++i) { - if (this.options[i].is(arg)) { - return this.options[i]; - } - } -}; - -/** - * Parse options from `argv` returning `argv` - * void of these options. - * - * @param {Array} argv - * @return {Array} - * @api public - */ - -Command.prototype.parseOptions = function(argv){ - var args = [] - , len = argv.length - , literal - , option - , arg; - - var unknownOptions = []; - - // parse options - for (var i = 0; i < len; ++i) { - arg = argv[i]; - - // literal args after -- - if ('--' == arg) { - literal = true; - continue; - } - - if (literal) { - args.push(arg); - continue; - } - - // find matching Option - option = this.optionFor(arg); - - // option is defined - if (option) { - // requires arg - if (option.required) { - arg = argv[++i]; - if (null == arg) return this.optionMissingArgument(option); - if ('-' == arg[0]) return this.optionMissingArgument(option, arg); - this.emit(option.name(), arg); - // optional arg - } else if (option.optional) { - arg = argv[i+1]; - if (null == arg || '-' == arg[0]) { - arg = null; - } else { - ++i; - } - this.emit(option.name(), arg); - // bool - } else { - this.emit(option.name()); - } - continue; - } - - // looks like an option - if (arg.length > 1 && '-' == arg[0]) { - unknownOptions.push(arg); - - // If the next argument looks like it might be - // an argument for this option, we pass it on. - // If it isn't, then it'll simply be ignored - if (argv[i+1] && '-' != argv[i+1][0]) { - unknownOptions.push(argv[++i]); - } - continue; - } - - // arg - args.push(arg); - } - - return { args: args, unknown: unknownOptions }; -}; - -/** - * Argument `name` is missing. - * - * @param {String} name - * @api private - */ - -Command.prototype.missingArgument = function(name){ - console.error(); - console.error(" error: missing required argument `%s'", name); - console.error(); - process.exit(1); -}; - -/** - * `Option` is missing an argument, but received `flag` or nothing. - * - * @param {String} option - * @param {String} flag - * @api private - */ - -Command.prototype.optionMissingArgument = function(option, flag){ - console.error(); - if (flag) { - console.error(" error: option `%s' argument missing, got `%s'", option.flags, flag); - } else { - console.error(" error: option `%s' argument missing", option.flags); - } - console.error(); - process.exit(1); -}; - -/** - * Unknown option `flag`. - * - * @param {String} flag - * @api private - */ - -Command.prototype.unknownOption = function(flag){ - console.error(); - console.error(" error: unknown option `%s'", flag); - console.error(); - process.exit(1); -}; - -/** - * Set the program version to `str`. - * - * This method auto-registers the "-V, --version" flag - * which will print the version number when passed. - * - * @param {String} str - * @param {String} flags - * @return {Command} for chaining - * @api public - */ - -Command.prototype.version = function(str, flags){ - if (0 == arguments.length) return this._version; - this._version = str; - flags = flags || '-V, --version'; - this.option(flags, 'output the version number'); - this.on('version', function(){ - console.log(str); - process.exit(0); - }); - return this; -}; - -/** - * Set the description `str`. - * - * @param {String} str - * @return {String|Command} - * @api public - */ - -Command.prototype.description = function(str){ - if (0 == arguments.length) return this._description; - this._description = str; - return this; -}; - -/** - * Set / get the command usage `str`. - * - * @param {String} str - * @return {String|Command} - * @api public - */ - -Command.prototype.usage = function(str){ - var args = this.args.map(function(arg){ - return arg.required - ? '<' + arg.name + '>' - : '[' + arg.name + ']'; - }); - - var usage = '[options' - + (this.commands.length ? '] [command' : '') - + ']' - + (this.args.length ? ' ' + args : ''); - if (0 == arguments.length) return this._usage || usage; - this._usage = str; - - return this; -}; - -/** - * Return the largest option length. - * - * @return {Number} - * @api private - */ - -Command.prototype.largestOptionLength = function(){ - return this.options.reduce(function(max, option){ - return Math.max(max, option.flags.length); - }, 0); -}; - -/** - * Return help for options. - * - * @return {String} - * @api private - */ - -Command.prototype.optionHelp = function(){ - var width = this.largestOptionLength(); - - // Prepend the help information - return [pad('-h, --help', width) + ' ' + 'output usage information'] - .concat(this.options.map(function(option){ - return pad(option.flags, width) - + ' ' + option.description; - })) - .join('\n'); -}; - -/** - * Return command help documentation. - * - * @return {String} - * @api private - */ - -Command.prototype.commandHelp = function(){ - if (!this.commands.length) return ''; - return [ - '' - , ' Commands:' - , '' - , this.commands.map(function(cmd){ - var args = cmd.args.map(function(arg){ - return arg.required - ? '<' + arg.name + '>' - : '[' + arg.name + ']'; - }).join(' '); - - return cmd.name - + (cmd.options.length - ? ' [options]' - : '') + ' ' + args - + (cmd.description() - ? '\n' + cmd.description() - : ''); - }).join('\n\n').replace(/^/gm, ' ') - , '' - ].join('\n'); -}; - -/** - * Return program help documentation. - * - * @return {String} - * @api private - */ - -Command.prototype.helpInformation = function(){ - return [ - '' - , ' Usage: ' + this.name + ' ' + this.usage() - , '' + this.commandHelp() - , ' Options:' - , '' - , '' + this.optionHelp().replace(/^/gm, ' ') - , '' - , '' - ].join('\n'); -}; - -/** - * Prompt for a `Number`. - * - * @param {String} str - * @param {Function} fn - * @api private - */ - -Command.prototype.promptForNumber = function(str, fn){ - var self = this; - this.promptSingleLine(str, function parseNumber(val){ - val = Number(val); - if (isNaN(val)) return self.promptSingleLine(str + '(must be a number) ', parseNumber); - fn(val); - }); -}; - -/** - * Prompt for a `Date`. - * - * @param {String} str - * @param {Function} fn - * @api private - */ - -Command.prototype.promptForDate = function(str, fn){ - var self = this; - this.promptSingleLine(str, function parseDate(val){ - val = new Date(val); - if (isNaN(val.getTime())) return self.promptSingleLine(str + '(must be a date) ', parseDate); - fn(val); - }); -}; - -/** - * Single-line prompt. - * - * @param {String} str - * @param {Function} fn - * @api private - */ - -Command.prototype.promptSingleLine = function(str, fn){ - if ('function' == typeof arguments[2]) { - return this['promptFor' + (fn.name || fn)](str, arguments[2]); - } - - process.stdout.write(str); - process.stdin.setEncoding('utf8'); - process.stdin.once('data', function(val){ - fn(val.trim()); - }).resume(); -}; - -/** - * Multi-line prompt. - * - * @param {String} str - * @param {Function} fn - * @api private - */ - -Command.prototype.promptMultiLine = function(str, fn){ - var buf = []; - console.log(str); - process.stdin.setEncoding('utf8'); - process.stdin.on('data', function(val){ - if ('\n' == val || '\r\n' == val) { - process.stdin.removeAllListeners('data'); - fn(buf.join('\n')); - } else { - buf.push(val.trimRight()); - } - }).resume(); -}; - -/** - * Prompt `str` and callback `fn(val)` - * - * Commander supports single-line and multi-line prompts. - * To issue a single-line prompt simply add white-space - * to the end of `str`, something like "name: ", whereas - * for a multi-line prompt omit this "description:". - * - * - * Examples: - * - * program.prompt('Username: ', function(name){ - * console.log('hi %s', name); - * }); - * - * program.prompt('Description:', function(desc){ - * console.log('description was "%s"', desc.trim()); - * }); - * - * @param {String|Object} str - * @param {Function} fn - * @api public - */ - -Command.prototype.prompt = function(str, fn){ - var self = this; - - if ('string' == typeof str) { - if (/ $/.test(str)) return this.promptSingleLine.apply(this, arguments); - this.promptMultiLine(str, fn); - } else { - var keys = Object.keys(str) - , obj = {}; - - function next() { - var key = keys.shift() - , label = str[key]; - - if (!key) return fn(obj); - self.prompt(label, function(val){ - obj[key] = val; - next(); - }); - } - - next(); - } -}; - -/** - * Prompt for password with `str`, `mask` char and callback `fn(val)`. - * - * The mask string defaults to '', aka no output is - * written while typing, you may want to use "*" etc. - * - * Examples: - * - * program.password('Password: ', function(pass){ - * console.log('got "%s"', pass); - * process.stdin.destroy(); - * }); - * - * program.password('Password: ', '*', function(pass){ - * console.log('got "%s"', pass); - * process.stdin.destroy(); - * }); - * - * @param {String} str - * @param {String} mask - * @param {Function} fn - * @api public - */ - -Command.prototype.password = function(str, mask, fn){ - var self = this - , buf = ''; - - // default mask - if ('function' == typeof mask) { - fn = mask; - mask = ''; - } - - process.stdin.resume(); - tty.setRawMode(true); - process.stdout.write(str); - - // keypress - process.stdin.on('keypress', function(c, key){ - if (key && 'enter' == key.name) { - console.log(); - process.stdin.removeAllListeners('keypress'); - tty.setRawMode(false); - if (!buf.trim().length) return self.password(str, mask, fn); - fn(buf); - return; - } - - if (key && key.ctrl && 'c' == key.name) { - console.log('%s', buf); - process.exit(); - } - - process.stdout.write(mask); - buf += c; - }).resume(); -}; - -/** - * Confirmation prompt with `str` and callback `fn(bool)` - * - * Examples: - * - * program.confirm('continue? ', function(ok){ - * console.log(' got %j', ok); - * process.stdin.destroy(); - * }); - * - * @param {String} str - * @param {Function} fn - * @api public - */ - - -Command.prototype.confirm = function(str, fn, verbose){ - var self = this; - this.prompt(str, function(ok){ - if (!ok.trim()) { - if (!verbose) str += '(yes or no) '; - return self.confirm(str, fn, true); - } - fn(parseBool(ok)); - }); -}; - -/** - * Choice prompt with `list` of items and callback `fn(index, item)` - * - * Examples: - * - * var list = ['tobi', 'loki', 'jane', 'manny', 'luna']; - * - * console.log('Choose the coolest pet:'); - * program.choose(list, function(i){ - * console.log('you chose %d "%s"', i, list[i]); - * process.stdin.destroy(); - * }); - * - * @param {Array} list - * @param {Number|Function} index or fn - * @param {Function} fn - * @api public - */ - -Command.prototype.choose = function(list, index, fn){ - var self = this - , hasDefault = 'number' == typeof index; - - if (!hasDefault) { - fn = index; - index = null; - } - - list.forEach(function(item, i){ - if (hasDefault && i == index) { - console.log('* %d) %s', i + 1, item); - } else { - console.log(' %d) %s', i + 1, item); - } - }); - - function again() { - self.prompt(' : ', function(val){ - val = parseInt(val, 10) - 1; - if (hasDefault && isNaN(val)) val = index; - - if (null == list[val]) { - again(); - } else { - fn(val, list[val]); - } - }); - } - - again(); -}; - -/** - * Camel-case the given `flag` - * - * @param {String} flag - * @return {String} - * @api private - */ - -function camelcase(flag) { - return flag.split('-').reduce(function(str, word){ - return str + word[0].toUpperCase() + word.slice(1); - }); -} - -/** - * Parse a boolean `str`. - * - * @param {String} str - * @return {Boolean} - * @api private - */ - -function parseBool(str) { - return /^y|yes|ok|true$/i.test(str); -} - -/** - * Pad `str` to `width`. - * - * @param {String} str - * @param {Number} width - * @return {String} - * @api private - */ - -function pad(str, width) { - var len = Math.max(0, width - str.length); - return str + Array(len + 1).join(' '); -} - -/** - * Output help information if necessary - * - * @param {Command} command to output help for - * @param {Array} array of options to search for -h or --help - * @api private - */ - -function outputHelpIfNecessary(cmd, options) { - options = options || []; - for (var i = 0; i < options.length; i++) { - if (options[i] == '--help' || options[i] == '-h') { - process.stdout.write(cmd.helpInformation()); - cmd.emit('--help'); - process.exit(0); - } - } -} diff --git a/node_modules/express/node_modules/commander/package.json b/node_modules/express/node_modules/commander/package.json deleted file mode 100644 index 764dece..0000000 --- a/node_modules/express/node_modules/commander/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "commander", - "version": "0.6.1", - "description": "the complete solution for node.js command-line programs", - "keywords": [ - "command", - "option", - "parser", - "prompt", - "stdin" - ], - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "repository": { - "type": "git", - "url": "https://github.com/visionmedia/commander.js.git" - }, - "dependencies": {}, - "devDependencies": { - "should": ">= 0.0.1" - }, - "scripts": { - "test": "make test" - }, - "main": "index", - "engines": { - "node": ">= 0.4.x" - }, - "readme": "# Commander.js\n\n The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander).\n\n [![Build Status](https://secure.travis-ci.org/visionmedia/commander.js.png)](http://travis-ci.org/visionmedia/commander.js)\n\n## Installation\n\n $ npm install commander\n\n## Option parsing\n\n Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('commander');\n\nprogram\n .version('0.0.1')\n .option('-p, --peppers', 'Add peppers')\n .option('-P, --pineapple', 'Add pineapple')\n .option('-b, --bbq', 'Add bbq sauce')\n .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')\n .parse(process.argv);\n\nconsole.log('you ordered a pizza with:');\nif (program.peppers) console.log(' - peppers');\nif (program.pineapple) console.log(' - pineappe');\nif (program.bbq) console.log(' - bbq');\nconsole.log(' - %s cheese', program.cheese);\n```\n\n Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as \"--template-engine\" are camel-cased, becoming `program.templateEngine` etc.\n\n## Automated --help\n\n The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:\n\n``` \n $ ./examples/pizza --help\n\n Usage: pizza [options]\n\n Options:\n\n -V, --version output the version number\n -p, --peppers Add peppers\n -P, --pineapple Add pineappe\n -b, --bbq Add bbq sauce\n -c, --cheese Add the specified type of cheese [marble]\n -h, --help output usage information\n\n```\n\n## Coercion\n\n```js\nfunction range(val) {\n return val.split('..').map(Number);\n}\n\nfunction list(val) {\n return val.split(',');\n}\n\nprogram\n .version('0.0.1')\n .usage('[options] ')\n .option('-i, --integer ', 'An integer argument', parseInt)\n .option('-f, --float ', 'A float argument', parseFloat)\n .option('-r, --range ..', 'A range', range)\n .option('-l, --list ', 'A list', list)\n .option('-o, --optional [value]', 'An optional value')\n .parse(process.argv);\n\nconsole.log(' int: %j', program.integer);\nconsole.log(' float: %j', program.float);\nconsole.log(' optional: %j', program.optional);\nprogram.range = program.range || [];\nconsole.log(' range: %j..%j', program.range[0], program.range[1]);\nconsole.log(' list: %j', program.list);\nconsole.log(' args: %j', program.args);\n```\n\n## Custom help\n\n You can display arbitrary `-h, --help` information\n by listening for \"--help\". Commander will automatically\n exit once you are done so that the remainder of your program\n does not execute causing undesired behaviours, for example\n in the following executable \"stuff\" will not output when\n `--help` is used.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('../');\n\nfunction list(val) {\n return val.split(',').map(Number);\n}\n\nprogram\n .version('0.0.1')\n .option('-f, --foo', 'enable some foo')\n .option('-b, --bar', 'enable some bar')\n .option('-B, --baz', 'enable some baz');\n\n// must be before .parse() since\n// node's emit() is immediate\n\nprogram.on('--help', function(){\n console.log(' Examples:');\n console.log('');\n console.log(' $ custom-help --help');\n console.log(' $ custom-help -h');\n console.log('');\n});\n\nprogram.parse(process.argv);\n\nconsole.log('stuff');\n```\n\nyielding the following help output:\n\n```\n\nUsage: custom-help [options]\n\nOptions:\n\n -h, --help output usage information\n -V, --version output the version number\n -f, --foo enable some foo\n -b, --bar enable some bar\n -B, --baz enable some baz\n\nExamples:\n\n $ custom-help --help\n $ custom-help -h\n\n```\n\n## .prompt(msg, fn)\n\n Single-line prompt:\n\n```js\nprogram.prompt('name: ', function(name){\n console.log('hi %s', name);\n});\n```\n\n Multi-line prompt:\n\n```js\nprogram.prompt('description:', function(name){\n console.log('hi %s', name);\n});\n```\n\n Coercion:\n\n```js\nprogram.prompt('Age: ', Number, function(age){\n console.log('age: %j', age);\n});\n```\n\n```js\nprogram.prompt('Birthdate: ', Date, function(date){\n console.log('date: %s', date);\n});\n```\n\n## .password(msg[, mask], fn)\n\nPrompt for password without echoing:\n\n```js\nprogram.password('Password: ', function(pass){\n console.log('got \"%s\"', pass);\n process.stdin.destroy();\n});\n```\n\nPrompt for password with mask char \"*\":\n\n```js\nprogram.password('Password: ', '*', function(pass){\n console.log('got \"%s\"', pass);\n process.stdin.destroy();\n});\n```\n\n## .confirm(msg, fn)\n\n Confirm with the given `msg`:\n\n```js\nprogram.confirm('continue? ', function(ok){\n console.log(' got %j', ok);\n});\n```\n\n## .choose(list, fn)\n\n Let the user choose from a `list`:\n\n```js\nvar list = ['tobi', 'loki', 'jane', 'manny', 'luna'];\n\nconsole.log('Choose the coolest pet:');\nprogram.choose(list, function(i){\n console.log('you chose %d \"%s\"', i, list[i]);\n});\n```\n\n## Links\n\n - [API documentation](http://visionmedia.github.com/commander.js/)\n - [ascii tables](https://github.com/LearnBoost/cli-table)\n - [progress bars](https://github.com/visionmedia/node-progress)\n - [more progress bars](https://github.com/substack/node-multimeter)\n - [examples](https://github.com/visionmedia/commander.js/tree/master/examples)\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", - "_id": "commander@0.6.1", - "_from": "commander@0.6.1" -} diff --git a/node_modules/express/node_modules/connect/.npmignore b/node_modules/express/node_modules/connect/.npmignore deleted file mode 100644 index 9046dde..0000000 --- a/node_modules/express/node_modules/connect/.npmignore +++ /dev/null @@ -1,12 +0,0 @@ -*.markdown -*.md -.git* -Makefile -benchmarks/ -docs/ -examples/ -install.sh -support/ -test/ -.DS_Store -coverage.html diff --git a/node_modules/express/node_modules/connect/.travis.yml b/node_modules/express/node_modules/connect/.travis.yml deleted file mode 100644 index 3aeb3c5..0000000 --- a/node_modules/express/node_modules/connect/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.8 - - 0.9 \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/LICENSE b/node_modules/express/node_modules/connect/LICENSE deleted file mode 100644 index 0c5d22d..0000000 --- a/node_modules/express/node_modules/connect/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -(The MIT License) - -Copyright (c) 2010 Sencha Inc. -Copyright (c) 2011 LearnBoost -Copyright (c) 2011 TJ Holowaychuk - -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. \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/Readme.md b/node_modules/express/node_modules/connect/Readme.md deleted file mode 100644 index 7d65f9c..0000000 --- a/node_modules/express/node_modules/connect/Readme.md +++ /dev/null @@ -1,133 +0,0 @@ -[![build status](https://secure.travis-ci.org/senchalabs/connect.png)](http://travis-ci.org/senchalabs/connect) -# Connect - - Connect is an extensible HTTP server framework for [node](http://nodejs.org), providing high performance "plugins" known as _middleware_. - - Connect is bundled with over _20_ commonly used middleware, including - a logger, session support, cookie parser, and [more](http://senchalabs.github.com/connect). Be sure to view the 2.x [documentation](http://senchalabs.github.com/connect/). - -```js -var connect = require('connect') - , http = require('http'); - -var app = connect() - .use(connect.favicon()) - .use(connect.logger('dev')) - .use(connect.static('public')) - .use(connect.directory('public')) - .use(connect.cookieParser()) - .use(connect.session({ secret: 'my secret here' })) - .use(function(req, res){ - res.end('Hello from Connect!\n'); - }); - -http.createServer(app).listen(3000); -``` - -## Middleware - - - [csrf](http://www.senchalabs.org/connect/csrf.html) - - [basicAuth](http://www.senchalabs.org/connect/basicAuth.html) - - [bodyParser](http://www.senchalabs.org/connect/bodyParser.html) - - [json](http://www.senchalabs.org/connect/json.html) - - [multipart](http://www.senchalabs.org/connect/multipart.html) - - [urlencoded](http://www.senchalabs.org/connect/urlencoded.html) - - [cookieParser](http://www.senchalabs.org/connect/cookieParser.html) - - [directory](http://www.senchalabs.org/connect/directory.html) - - [compress](http://www.senchalabs.org/connect/compress.html) - - [errorHandler](http://www.senchalabs.org/connect/errorHandler.html) - - [favicon](http://www.senchalabs.org/connect/favicon.html) - - [limit](http://www.senchalabs.org/connect/limit.html) - - [logger](http://www.senchalabs.org/connect/logger.html) - - [methodOverride](http://www.senchalabs.org/connect/methodOverride.html) - - [query](http://www.senchalabs.org/connect/query.html) - - [responseTime](http://www.senchalabs.org/connect/responseTime.html) - - [session](http://www.senchalabs.org/connect/session.html) - - [static](http://www.senchalabs.org/connect/static.html) - - [staticCache](http://www.senchalabs.org/connect/staticCache.html) - - [vhost](http://www.senchalabs.org/connect/vhost.html) - - [subdomains](http://www.senchalabs.org/connect/subdomains.html) - - [cookieSession](http://www.senchalabs.org/connect/cookieSession.html) - -## Running Tests - -first: - - $ npm install -d - -then: - - $ make test - -## Authors - - Below is the output from [git-summary](http://github.com/visionmedia/git-extras). - - - project: connect - commits: 2033 - active : 301 days - files : 171 - authors: - 1414 Tj Holowaychuk 69.6% - 298 visionmedia 14.7% - 191 Tim Caswell 9.4% - 51 TJ Holowaychuk 2.5% - 10 Ryan Olds 0.5% - 8 Astro 0.4% - 5 Nathan Rajlich 0.2% - 5 Jakub Nešetřil 0.2% - 3 Daniel Dickison 0.1% - 3 David Rio Deiros 0.1% - 3 Alexander Simmerl 0.1% - 3 Andreas Lind Petersen 0.1% - 2 Aaron Heckmann 0.1% - 2 Jacques Crocker 0.1% - 2 Fabian Jakobs 0.1% - 2 Brian J Brennan 0.1% - 2 Adam Malcontenti-Wilson 0.1% - 2 Glen Mailer 0.1% - 2 James Campos 0.1% - 1 Trent Mick 0.0% - 1 Troy Kruthoff 0.0% - 1 Wei Zhu 0.0% - 1 comerc 0.0% - 1 darobin 0.0% - 1 nateps 0.0% - 1 Marco Sanson 0.0% - 1 Arthur Taylor 0.0% - 1 Aseem Kishore 0.0% - 1 Bart Teeuwisse 0.0% - 1 Cameron Howey 0.0% - 1 Chad Weider 0.0% - 1 Craig Barnes 0.0% - 1 Eran Hammer-Lahav 0.0% - 1 Gregory McWhirter 0.0% - 1 Guillermo Rauch 0.0% - 1 Jae Kwon 0.0% - 1 Jakub Nesetril 0.0% - 1 Joshua Peek 0.0% - 1 Jxck 0.0% - 1 AJ ONeal 0.0% - 1 Michael Hemesath 0.0% - 1 Morten Siebuhr 0.0% - 1 Samori Gorse 0.0% - 1 Tom Jensen 0.0% - -## Node Compatibility - - Connect `< 1.x` is compatible with node 0.2.x - - - Connect `1.x` is compatible with node 0.4.x - - - Connect (_master_) `2.x` is compatible with node 0.6.x - -## CLA - - [http://sencha.com/cla](http://sencha.com/cla) - -## License - -View the [LICENSE](https://github.com/senchalabs/connect/blob/master/LICENSE) file. The [Silk](http://www.famfamfam.com/lab/icons/silk/) icons used by the `directory` middleware created by/copyright of [FAMFAMFAM](http://www.famfamfam.com/). diff --git a/node_modules/express/node_modules/connect/index.js b/node_modules/express/node_modules/connect/index.js deleted file mode 100644 index 23240ee..0000000 --- a/node_modules/express/node_modules/connect/index.js +++ /dev/null @@ -1,4 +0,0 @@ - -module.exports = process.env.CONNECT_COV - ? require('./lib-cov/connect') - : require('./lib/connect'); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/lib-cov/cache.js b/node_modules/express/node_modules/connect/lib-cov/cache.js deleted file mode 100644 index af6cd2f..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/cache.js +++ /dev/null @@ -1,68 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['cache.js']) { - _$jscoverage['cache.js'] = []; - _$jscoverage['cache.js'][12] = 0; - _$jscoverage['cache.js'][21] = 0; - _$jscoverage['cache.js'][22] = 0; - _$jscoverage['cache.js'][23] = 0; - _$jscoverage['cache.js'][24] = 0; - _$jscoverage['cache.js'][35] = 0; - _$jscoverage['cache.js'][36] = 0; - _$jscoverage['cache.js'][37] = 0; - _$jscoverage['cache.js'][47] = 0; - _$jscoverage['cache.js'][48] = 0; - _$jscoverage['cache.js'][59] = 0; - _$jscoverage['cache.js'][60] = 0; - _$jscoverage['cache.js'][71] = 0; - _$jscoverage['cache.js'][73] = 0; - _$jscoverage['cache.js'][76] = 0; - _$jscoverage['cache.js'][78] = 0; - _$jscoverage['cache.js'][79] = 0; - _$jscoverage['cache.js'][80] = 0; -} -_$jscoverage['cache.js'][12]++; -module.exports = Cache; -_$jscoverage['cache.js'][21]++; -function Cache(limit) { - _$jscoverage['cache.js'][22]++; - this.store = {}; - _$jscoverage['cache.js'][23]++; - this.keys = []; - _$jscoverage['cache.js'][24]++; - this.limit = limit; -} -_$jscoverage['cache.js'][35]++; -Cache.prototype.touch = (function (key, i) { - _$jscoverage['cache.js'][36]++; - this.keys.splice(i, 1); - _$jscoverage['cache.js'][37]++; - this.keys.push(key); -}); -_$jscoverage['cache.js'][47]++; -Cache.prototype.remove = (function (key) { - _$jscoverage['cache.js'][48]++; - delete this.store[key]; -}); -_$jscoverage['cache.js'][59]++; -Cache.prototype.get = (function (key) { - _$jscoverage['cache.js'][60]++; - return this.store[key]; -}); -_$jscoverage['cache.js'][71]++; -Cache.prototype.add = (function (key) { - _$jscoverage['cache.js'][73]++; - var len = this.keys.push(key); - _$jscoverage['cache.js'][76]++; - if (len > this.limit) { - _$jscoverage['cache.js'][76]++; - this.remove(this.keys.shift()); - } - _$jscoverage['cache.js'][78]++; - var arr = this.store[key] = []; - _$jscoverage['cache.js'][79]++; - arr.createdAt = new Date(); - _$jscoverage['cache.js'][80]++; - return arr; -}); -_$jscoverage['cache.js'].source = ["","/*!"," * Connect - Cache"," * Copyright(c) 2011 Sencha Inc."," * MIT Licensed"," */","","/**"," * Expose `Cache`."," */","","module.exports = Cache;","","/**"," * LRU cache store."," *"," * @param {Number} limit"," * @api private"," */","","function Cache(limit) {"," this.store = {};"," this.keys = [];"," this.limit = limit;","}","","/**"," * Touch `key`, promoting the object."," *"," * @param {String} key"," * @param {Number} i"," * @api private"," */","","Cache.prototype.touch = function(key, i){"," this.keys.splice(i,1);"," this.keys.push(key);","};","","/**"," * Remove `key`."," *"," * @param {String} key"," * @api private"," */","","Cache.prototype.remove = function(key){"," delete this.store[key];","};","","/**"," * Get the object stored for `key`."," *"," * @param {String} key"," * @return {Array}"," * @api private"," */","","Cache.prototype.get = function(key){"," return this.store[key];","};","","/**"," * Add a cache `key`."," *"," * @param {String} key"," * @return {Array}"," * @api private"," */","","Cache.prototype.add = function(key){"," // initialize store"," var len = this.keys.push(key);",""," // limit reached, invalidate LRU"," if (len > this.limit) this.remove(this.keys.shift());",""," var arr = this.store[key] = [];"," arr.createdAt = new Date;"," return arr;","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/connect.js b/node_modules/express/node_modules/connect/lib-cov/connect.js deleted file mode 100644 index f811bb8..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/connect.js +++ /dev/null @@ -1,93 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['connect.js']) { - _$jscoverage['connect.js'] = []; - _$jscoverage['connect.js'][13] = 0; - _$jscoverage['connect.js'][22] = 0; - _$jscoverage['connect.js'][26] = 0; - _$jscoverage['connect.js'][32] = 0; - _$jscoverage['connect.js'][38] = 0; - _$jscoverage['connect.js'][44] = 0; - _$jscoverage['connect.js'][50] = 0; - _$jscoverage['connect.js'][56] = 0; - _$jscoverage['connect.js'][65] = 0; - _$jscoverage['connect.js'][66] = 0; - _$jscoverage['connect.js'][67] = 0; - _$jscoverage['connect.js'][68] = 0; - _$jscoverage['connect.js'][69] = 0; - _$jscoverage['connect.js'][70] = 0; - _$jscoverage['connect.js'][71] = 0; - _$jscoverage['connect.js'][72] = 0; - _$jscoverage['connect.js'][74] = 0; - _$jscoverage['connect.js'][75] = 0; - _$jscoverage['connect.js'][81] = 0; - _$jscoverage['connect.js'][87] = 0; - _$jscoverage['connect.js'][88] = 0; - _$jscoverage['connect.js'][89] = 0; - _$jscoverage['connect.js'][90] = 0; - _$jscoverage['connect.js'][91] = 0; - _$jscoverage['connect.js'][92] = 0; -} -_$jscoverage['connect.js'][13]++; -var EventEmitter = require("events").EventEmitter, proto = require("./proto"), utils = require("./utils"), path = require("path"), basename = path.basename, fs = require("fs"); -_$jscoverage['connect.js'][22]++; -require("./patch"); -_$jscoverage['connect.js'][26]++; -exports = module.exports = createServer; -_$jscoverage['connect.js'][32]++; -exports.version = "2.6.1"; -_$jscoverage['connect.js'][38]++; -exports.mime = require("./middleware/static").mime; -_$jscoverage['connect.js'][44]++; -exports.proto = proto; -_$jscoverage['connect.js'][50]++; -exports.middleware = {}; -_$jscoverage['connect.js'][56]++; -exports.utils = utils; -_$jscoverage['connect.js'][65]++; -function createServer() { - _$jscoverage['connect.js'][66]++; - function app(req, res) { - _$jscoverage['connect.js'][66]++; - app.handle(req, res); -} - _$jscoverage['connect.js'][67]++; - utils.merge(app, proto); - _$jscoverage['connect.js'][68]++; - utils.merge(app, EventEmitter.prototype); - _$jscoverage['connect.js'][69]++; - app.route = "/"; - _$jscoverage['connect.js'][70]++; - app.stack = []; - _$jscoverage['connect.js'][71]++; - for (var i = 0; i < arguments.length; ++i) { - _$jscoverage['connect.js'][72]++; - app.use(arguments[i]); -} - _$jscoverage['connect.js'][74]++; - return app; -} -_$jscoverage['connect.js'][75]++; -; -_$jscoverage['connect.js'][81]++; -createServer.createServer = createServer; -_$jscoverage['connect.js'][87]++; -fs.readdirSync(__dirname + "/middleware").forEach((function (filename) { - _$jscoverage['connect.js'][88]++; - if (! /\.js$/.test(filename)) { - _$jscoverage['connect.js'][88]++; - return; - } - _$jscoverage['connect.js'][89]++; - var name = basename(filename, ".js"); - _$jscoverage['connect.js'][90]++; - function load() { - _$jscoverage['connect.js'][90]++; - return require("./middleware/" + name); -} - _$jscoverage['connect.js'][91]++; - exports.middleware.__defineGetter__(name, load); - _$jscoverage['connect.js'][92]++; - exports.__defineGetter__(name, load); -})); -_$jscoverage['connect.js'].source = ["","/*!"," * Connect"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var EventEmitter = require('events').EventEmitter"," , proto = require('./proto')"," , utils = require('./utils')"," , path = require('path')"," , basename = path.basename"," , fs = require('fs');","","// node patches","","require('./patch');","","// expose createServer() as the module","","exports = module.exports = createServer;","","/**"," * Framework version."," */","","exports.version = '2.6.1';","","/**"," * Expose mime module."," */","","exports.mime = require('./middleware/static').mime;","","/**"," * Expose the prototype."," */","","exports.proto = proto;","","/**"," * Auto-load middleware getters."," */","","exports.middleware = {};","","/**"," * Expose utilities."," */","","exports.utils = utils;","","/**"," * Create a new connect server."," *"," * @return {Function}"," * @api public"," */","","function createServer() {"," function app(req, res){ app.handle(req, res); }"," utils.merge(app, proto);"," utils.merge(app, EventEmitter.prototype);"," app.route = '/';"," app.stack = [];"," for (var i = 0; i < arguments.length; ++i) {"," app.use(arguments[i]);"," }"," return app;","};","","/**"," * Support old `.createServer()` method."," */","","createServer.createServer = createServer;","","/**"," * Auto-load bundled middleware with getters."," */","","fs.readdirSync(__dirname + '/middleware').forEach(function(filename){"," if (!/\\.js$/.test(filename)) return;"," var name = basename(filename, '.js');"," function load(){ return require('./middleware/' + name); }"," exports.middleware.__defineGetter__(name, load);"," exports.__defineGetter__(name, load);","});"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/index.js b/node_modules/express/node_modules/connect/lib-cov/index.js deleted file mode 100644 index e6bb1c7..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/index.js +++ /dev/null @@ -1,6 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['index.js']) { - _$jscoverage['index.js'] = []; -} -_$jscoverage['index.js'].source = ["","/**"," * Connect is a middleware framework for node,"," * shipping with over 18 bundled middleware and a rich selection of"," * 3rd-party middleware."," *"," * var app = connect()"," * .use(connect.logger('dev'))"," * .use(connect.static('public'))"," * .use(function(req, res){"," * res.end('hello world\\n');"," * })"," * .listen(3000);"," * "," * Installation:"," * "," * $ npm install connect"," *"," * Middleware:"," *"," * - [logger](logger.html) request logger with custom format support"," * - [csrf](csrf.html) Cross-site request forgery protection"," * - [compress](compress.html) Gzip compression middleware"," * - [basicAuth](basicAuth.html) basic http authentication"," * - [bodyParser](bodyParser.html) extensible request body parser"," * - [json](json.html) application/json parser"," * - [urlencoded](urlencoded.html) application/x-www-form-urlencoded parser"," * - [multipart](multipart.html) multipart/form-data parser"," * - [timeout](timeout.html) request timeouts"," * - [cookieParser](cookieParser.html) cookie parser"," * - [session](session.html) session management support with bundled MemoryStore"," * - [cookieSession](cookieSession.html) cookie-based session support"," * - [methodOverride](methodOverride.html) faux HTTP method support"," * - [responseTime](responseTime.html) calculates response-time and exposes via X-Response-Time"," * - [staticCache](staticCache.html) memory cache layer for the static() middleware"," * - [static](static.html) streaming static file server supporting `Range` and more"," * - [directory](directory.html) directory listing middleware"," * - [vhost](vhost.html) virtual host sub-domain mapping middleware"," * - [favicon](favicon.html) efficient favicon server (with default icon)"," * - [limit](limit.html) limit the bytesize of request bodies"," * - [query](query.html) automatic querystring parser, populating `req.query`"," * - [errorHandler](errorHandler.html) flexible error handler"," *"," * Links:"," * "," * - list of [3rd-party](https://github.com/senchalabs/connect/wiki) middleware"," * - GitHub [repository](http://github.com/senchalabs/connect)"," * - [test documentation](https://github.com/senchalabs/connect/blob/gh-pages/tests.md)"," * "," */"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/basicAuth.js b/node_modules/express/node_modules/connect/lib-cov/middleware/basicAuth.js deleted file mode 100644 index c9e7d63..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/basicAuth.js +++ /dev/null @@ -1,128 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/basicAuth.js']) { - _$jscoverage['middleware/basicAuth.js'] = []; - _$jscoverage['middleware/basicAuth.js'][13] = 0; - _$jscoverage['middleware/basicAuth.js'][48] = 0; - _$jscoverage['middleware/basicAuth.js'][49] = 0; - _$jscoverage['middleware/basicAuth.js'][52] = 0; - _$jscoverage['middleware/basicAuth.js'][53] = 0; - _$jscoverage['middleware/basicAuth.js'][54] = 0; - _$jscoverage['middleware/basicAuth.js'][55] = 0; - _$jscoverage['middleware/basicAuth.js'][56] = 0; - _$jscoverage['middleware/basicAuth.js'][57] = 0; - _$jscoverage['middleware/basicAuth.js'][58] = 0; - _$jscoverage['middleware/basicAuth.js'][62] = 0; - _$jscoverage['middleware/basicAuth.js'][64] = 0; - _$jscoverage['middleware/basicAuth.js'][65] = 0; - _$jscoverage['middleware/basicAuth.js'][67] = 0; - _$jscoverage['middleware/basicAuth.js'][68] = 0; - _$jscoverage['middleware/basicAuth.js'][70] = 0; - _$jscoverage['middleware/basicAuth.js'][72] = 0; - _$jscoverage['middleware/basicAuth.js'][74] = 0; - _$jscoverage['middleware/basicAuth.js'][78] = 0; - _$jscoverage['middleware/basicAuth.js'][80] = 0; - _$jscoverage['middleware/basicAuth.js'][84] = 0; - _$jscoverage['middleware/basicAuth.js'][85] = 0; - _$jscoverage['middleware/basicAuth.js'][86] = 0; - _$jscoverage['middleware/basicAuth.js'][87] = 0; - _$jscoverage['middleware/basicAuth.js'][88] = 0; - _$jscoverage['middleware/basicAuth.js'][89] = 0; - _$jscoverage['middleware/basicAuth.js'][90] = 0; - _$jscoverage['middleware/basicAuth.js'][94] = 0; - _$jscoverage['middleware/basicAuth.js'][95] = 0; - _$jscoverage['middleware/basicAuth.js'][96] = 0; - _$jscoverage['middleware/basicAuth.js'][98] = 0; -} -_$jscoverage['middleware/basicAuth.js'][13]++; -var utils = require("../utils"), unauthorized = utils.unauthorized; -_$jscoverage['middleware/basicAuth.js'][48]++; -module.exports = (function basicAuth(callback, realm) { - _$jscoverage['middleware/basicAuth.js'][49]++; - var username, password; - _$jscoverage['middleware/basicAuth.js'][52]++; - if ("string" == typeof callback) { - _$jscoverage['middleware/basicAuth.js'][53]++; - username = callback; - _$jscoverage['middleware/basicAuth.js'][54]++; - password = realm; - _$jscoverage['middleware/basicAuth.js'][55]++; - if ("string" != typeof password) { - _$jscoverage['middleware/basicAuth.js'][55]++; - throw new Error("password argument required"); - } - _$jscoverage['middleware/basicAuth.js'][56]++; - realm = arguments[2]; - _$jscoverage['middleware/basicAuth.js'][57]++; - callback = (function (user, pass) { - _$jscoverage['middleware/basicAuth.js'][58]++; - return user == username && pass == password; -}); - } - _$jscoverage['middleware/basicAuth.js'][62]++; - realm = realm || "Authorization Required"; - _$jscoverage['middleware/basicAuth.js'][64]++; - return (function (req, res, next) { - _$jscoverage['middleware/basicAuth.js'][65]++; - var authorization = req.headers.authorization; - _$jscoverage['middleware/basicAuth.js'][67]++; - if (req.user) { - _$jscoverage['middleware/basicAuth.js'][67]++; - return next(); - } - _$jscoverage['middleware/basicAuth.js'][68]++; - if (! authorization) { - _$jscoverage['middleware/basicAuth.js'][68]++; - return unauthorized(res, realm); - } - _$jscoverage['middleware/basicAuth.js'][70]++; - var parts = authorization.split(" "); - _$jscoverage['middleware/basicAuth.js'][72]++; - if (parts.length !== 2) { - _$jscoverage['middleware/basicAuth.js'][72]++; - return next(utils.error(400)); - } - _$jscoverage['middleware/basicAuth.js'][74]++; - var scheme = parts[0], credentials = new Buffer(parts[1], "base64").toString(), index = credentials.indexOf(":"); - _$jscoverage['middleware/basicAuth.js'][78]++; - if ("Basic" != scheme || index < 0) { - _$jscoverage['middleware/basicAuth.js'][78]++; - return next(utils.error(400)); - } - _$jscoverage['middleware/basicAuth.js'][80]++; - var user = credentials.slice(0, index), pass = credentials.slice(index + 1); - _$jscoverage['middleware/basicAuth.js'][84]++; - if (callback.length >= 3) { - _$jscoverage['middleware/basicAuth.js'][85]++; - var pause = utils.pause(req); - _$jscoverage['middleware/basicAuth.js'][86]++; - callback(user, pass, (function (err, user) { - _$jscoverage['middleware/basicAuth.js'][87]++; - if (err || ! user) { - _$jscoverage['middleware/basicAuth.js'][87]++; - return unauthorized(res, realm); - } - _$jscoverage['middleware/basicAuth.js'][88]++; - req.user = req.remoteUser = user; - _$jscoverage['middleware/basicAuth.js'][89]++; - next(); - _$jscoverage['middleware/basicAuth.js'][90]++; - pause.resume(); -})); - } - else { - _$jscoverage['middleware/basicAuth.js'][94]++; - if (callback(user, pass)) { - _$jscoverage['middleware/basicAuth.js'][95]++; - req.user = req.remoteUser = user; - _$jscoverage['middleware/basicAuth.js'][96]++; - next(); - } - else { - _$jscoverage['middleware/basicAuth.js'][98]++; - unauthorized(res, realm); - } - } -}); -}); -_$jscoverage['middleware/basicAuth.js'].source = ["","/*!"," * Connect - basicAuth"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils')"," , unauthorized = utils.unauthorized;","","/**"," * Basic Auth:"," *"," * Enfore basic authentication by providing a `callback(user, pass)`,"," * which must return `true` in order to gain access. Alternatively an async"," * method is provided as well, invoking `callback(user, pass, callback)`. Populates"," * `req.user`. The final alternative is simply passing username / password"," * strings."," *"," * Simple username and password"," *"," * connect(connect.basicAuth('username', 'password'));"," *"," * Callback verification"," *"," * connect()"," * .use(connect.basicAuth(function(user, pass){"," * return 'tj' == user & 'wahoo' == pass;"," * }))"," *"," * Async callback verification, accepting `fn(err, user)`."," *"," * connect()"," * .use(connect.basicAuth(function(user, pass, fn){"," * User.authenticate({ user: user, pass: pass }, fn);"," * }))"," *"," * @param {Function|String} callback or username"," * @param {String} realm"," * @api public"," */","","module.exports = function basicAuth(callback, realm) {"," var username, password;",""," // user / pass strings"," if ('string' == typeof callback) {"," username = callback;"," password = realm;"," if ('string' != typeof password) throw new Error('password argument required');"," realm = arguments[2];"," callback = function(user, pass){"," return user == username && pass == password;"," }"," }",""," realm = realm || 'Authorization Required';",""," return function(req, res, next) {"," var authorization = req.headers.authorization;",""," if (req.user) return next();"," if (!authorization) return unauthorized(res, realm);",""," var parts = authorization.split(' ');",""," if (parts.length !== 2) return next(utils.error(400));",""," var scheme = parts[0]"," , credentials = new Buffer(parts[1], 'base64').toString()"," , index = credentials.indexOf(':');",""," if ('Basic' != scheme || index < 0) return next(utils.error(400));"," "," var user = credentials.slice(0, index)"," , pass = credentials.slice(index + 1);",""," // async"," if (callback.length >= 3) {"," var pause = utils.pause(req);"," callback(user, pass, function(err, user){"," if (err || !user) return unauthorized(res, realm);"," req.user = req.remoteUser = user;"," next();"," pause.resume();"," });"," // sync"," } else {"," if (callback(user, pass)) {"," req.user = req.remoteUser = user;"," next();"," } else {"," unauthorized(res, realm);"," }"," }"," }","};",""]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/bodyParser.js b/node_modules/express/node_modules/connect/lib-cov/middleware/bodyParser.js deleted file mode 100644 index a108b97..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/bodyParser.js +++ /dev/null @@ -1,43 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/bodyParser.js']) { - _$jscoverage['middleware/bodyParser.js'] = []; - _$jscoverage['middleware/bodyParser.js'][13] = 0; - _$jscoverage['middleware/bodyParser.js'][47] = 0; - _$jscoverage['middleware/bodyParser.js'][48] = 0; - _$jscoverage['middleware/bodyParser.js'][52] = 0; - _$jscoverage['middleware/bodyParser.js'][53] = 0; - _$jscoverage['middleware/bodyParser.js'][54] = 0; - _$jscoverage['middleware/bodyParser.js'][55] = 0; - _$jscoverage['middleware/bodyParser.js'][56] = 0; - _$jscoverage['middleware/bodyParser.js'][57] = 0; -} -_$jscoverage['middleware/bodyParser.js'][13]++; -var multipart = require("./multipart"), urlencoded = require("./urlencoded"), json = require("./json"); -_$jscoverage['middleware/bodyParser.js'][47]++; -exports = module.exports = (function bodyParser(options) { - _$jscoverage['middleware/bodyParser.js'][48]++; - var _urlencoded = urlencoded(options), _multipart = multipart(options), _json = json(options); - _$jscoverage['middleware/bodyParser.js'][52]++; - return (function bodyParser(req, res, next) { - _$jscoverage['middleware/bodyParser.js'][53]++; - _json(req, res, (function (err) { - _$jscoverage['middleware/bodyParser.js'][54]++; - if (err) { - _$jscoverage['middleware/bodyParser.js'][54]++; - return next(err); - } - _$jscoverage['middleware/bodyParser.js'][55]++; - _urlencoded(req, res, (function (err) { - _$jscoverage['middleware/bodyParser.js'][56]++; - if (err) { - _$jscoverage['middleware/bodyParser.js'][56]++; - return next(err); - } - _$jscoverage['middleware/bodyParser.js'][57]++; - _multipart(req, res, next); -})); -})); -}); -}); -_$jscoverage['middleware/bodyParser.js'].source = ["","/*!"," * Connect - bodyParser"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var multipart = require('./multipart')"," , urlencoded = require('./urlencoded')"," , json = require('./json');","","/**"," * Body parser:"," * "," * Parse request bodies, supports _application/json_,"," * _application/x-www-form-urlencoded_, and _multipart/form-data_."," *"," * This is equivalent to: "," *"," * app.use(connect.json());"," * app.use(connect.urlencoded());"," * app.use(connect.multipart());"," *"," * Examples:"," *"," * connect()"," * .use(connect.bodyParser())"," * .use(function(req, res) {"," * res.end('viewing user ' + req.body.user.name);"," * });"," *"," * $ curl -d 'user[name]=tj' http://local/"," * $ curl -d '{\"user\":{\"name\":\"tj\"}}' -H \"Content-Type: application/json\" http://local/"," *"," * View [json](json.html), [urlencoded](urlencoded.html), and [multipart](multipart.html) for more info."," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function bodyParser(options){"," var _urlencoded = urlencoded(options)"," , _multipart = multipart(options)"," , _json = json(options);",""," return function bodyParser(req, res, next) {"," _json(req, res, function(err){"," if (err) return next(err);"," _urlencoded(req, res, function(err){"," if (err) return next(err);"," _multipart(req, res, next);"," });"," });"," }","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/compress.js b/node_modules/express/node_modules/connect/lib-cov/middleware/compress.js deleted file mode 100644 index aebd5f1..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/compress.js +++ /dev/null @@ -1,159 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/compress.js']) { - _$jscoverage['middleware/compress.js'] = []; - _$jscoverage['middleware/compress.js'][12] = 0; - _$jscoverage['middleware/compress.js'][18] = 0; - _$jscoverage['middleware/compress.js'][27] = 0; - _$jscoverage['middleware/compress.js'][28] = 0; - _$jscoverage['middleware/compress.js'][61] = 0; - _$jscoverage['middleware/compress.js'][62] = 0; - _$jscoverage['middleware/compress.js'][63] = 0; - _$jscoverage['middleware/compress.js'][66] = 0; - _$jscoverage['middleware/compress.js'][67] = 0; - _$jscoverage['middleware/compress.js'][74] = 0; - _$jscoverage['middleware/compress.js'][78] = 0; - _$jscoverage['middleware/compress.js'][79] = 0; - _$jscoverage['middleware/compress.js'][80] = 0; - _$jscoverage['middleware/compress.js'][85] = 0; - _$jscoverage['middleware/compress.js'][86] = 0; - _$jscoverage['middleware/compress.js'][87] = 0; - _$jscoverage['middleware/compress.js'][92] = 0; - _$jscoverage['middleware/compress.js'][93] = 0; - _$jscoverage['middleware/compress.js'][96] = 0; - _$jscoverage['middleware/compress.js'][99] = 0; - _$jscoverage['middleware/compress.js'][102] = 0; - _$jscoverage['middleware/compress.js'][105] = 0; - _$jscoverage['middleware/compress.js'][108] = 0; - _$jscoverage['middleware/compress.js'][111] = 0; - _$jscoverage['middleware/compress.js'][112] = 0; - _$jscoverage['middleware/compress.js'][113] = 0; - _$jscoverage['middleware/compress.js'][114] = 0; - _$jscoverage['middleware/compress.js'][115] = 0; - _$jscoverage['middleware/compress.js'][121] = 0; - _$jscoverage['middleware/compress.js'][124] = 0; - _$jscoverage['middleware/compress.js'][127] = 0; - _$jscoverage['middleware/compress.js'][128] = 0; - _$jscoverage['middleware/compress.js'][132] = 0; - _$jscoverage['middleware/compress.js'][133] = 0; - _$jscoverage['middleware/compress.js'][136] = 0; - _$jscoverage['middleware/compress.js'][137] = 0; - _$jscoverage['middleware/compress.js'][140] = 0; - _$jscoverage['middleware/compress.js'][141] = 0; - _$jscoverage['middleware/compress.js'][145] = 0; -} -_$jscoverage['middleware/compress.js'][12]++; -var zlib = require("zlib"); -_$jscoverage['middleware/compress.js'][18]++; -exports.methods = {gzip: zlib.createGzip, deflate: zlib.createDeflate}; -_$jscoverage['middleware/compress.js'][27]++; -exports.filter = (function (req, res) { - _$jscoverage['middleware/compress.js'][28]++; - return /json|text|javascript/.test(res.getHeader("Content-Type")); -}); -_$jscoverage['middleware/compress.js'][61]++; -module.exports = (function compress(options) { - _$jscoverage['middleware/compress.js'][62]++; - options = options || {}; - _$jscoverage['middleware/compress.js'][63]++; - var names = Object.keys(exports.methods), filter = options.filter || exports.filter; - _$jscoverage['middleware/compress.js'][66]++; - return (function (req, res, next) { - _$jscoverage['middleware/compress.js'][67]++; - var accept = req.headers["accept-encoding"], write = res.write, end = res.end, stream, method; - _$jscoverage['middleware/compress.js'][74]++; - res.setHeader("Vary", "Accept-Encoding"); - _$jscoverage['middleware/compress.js'][78]++; - res.write = (function (chunk, encoding) { - _$jscoverage['middleware/compress.js'][79]++; - if (! this.headerSent) { - _$jscoverage['middleware/compress.js'][79]++; - this._implicitHeader(); - } - _$jscoverage['middleware/compress.js'][80]++; - return stream? stream.write(new Buffer(chunk, encoding)): write.call(res, chunk, encoding); -}); - _$jscoverage['middleware/compress.js'][85]++; - res.end = (function (chunk, encoding) { - _$jscoverage['middleware/compress.js'][86]++; - if (chunk) { - _$jscoverage['middleware/compress.js'][86]++; - this.write(chunk, encoding); - } - _$jscoverage['middleware/compress.js'][87]++; - return stream? stream.end(): end.call(res); -}); - _$jscoverage['middleware/compress.js'][92]++; - res.on("header", (function () { - _$jscoverage['middleware/compress.js'][93]++; - var encoding = res.getHeader("Content-Encoding") || "identity"; - _$jscoverage['middleware/compress.js'][96]++; - if ("identity" != encoding) { - _$jscoverage['middleware/compress.js'][96]++; - return; - } - _$jscoverage['middleware/compress.js'][99]++; - if (! filter(req, res)) { - _$jscoverage['middleware/compress.js'][99]++; - return; - } - _$jscoverage['middleware/compress.js'][102]++; - if (! accept) { - _$jscoverage['middleware/compress.js'][102]++; - return; - } - _$jscoverage['middleware/compress.js'][105]++; - if ("HEAD" == req.method) { - _$jscoverage['middleware/compress.js'][105]++; - return; - } - _$jscoverage['middleware/compress.js'][108]++; - if ("*" == accept.trim()) { - _$jscoverage['middleware/compress.js'][108]++; - method = "gzip"; - } - _$jscoverage['middleware/compress.js'][111]++; - if (! method) { - _$jscoverage['middleware/compress.js'][112]++; - for (var i = 0, len = names.length; i < len; ++i) { - _$jscoverage['middleware/compress.js'][113]++; - if (~ accept.indexOf(names[i])) { - _$jscoverage['middleware/compress.js'][114]++; - method = names[i]; - _$jscoverage['middleware/compress.js'][115]++; - break; - } -} - } - _$jscoverage['middleware/compress.js'][121]++; - if (! method) { - _$jscoverage['middleware/compress.js'][121]++; - return; - } - _$jscoverage['middleware/compress.js'][124]++; - stream = exports.methods[method](options); - _$jscoverage['middleware/compress.js'][127]++; - res.setHeader("Content-Encoding", method); - _$jscoverage['middleware/compress.js'][128]++; - res.removeHeader("Content-Length"); - _$jscoverage['middleware/compress.js'][132]++; - stream.on("data", (function (chunk) { - _$jscoverage['middleware/compress.js'][133]++; - write.call(res, chunk); -})); - _$jscoverage['middleware/compress.js'][136]++; - stream.on("end", (function () { - _$jscoverage['middleware/compress.js'][137]++; - end.call(res); -})); - _$jscoverage['middleware/compress.js'][140]++; - stream.on("drain", (function () { - _$jscoverage['middleware/compress.js'][141]++; - res.emit("drain"); -})); -})); - _$jscoverage['middleware/compress.js'][145]++; - next(); -}); -}); -_$jscoverage['middleware/compress.js'].source = ["/*!"," * Connect - compress"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var zlib = require('zlib');","","/**"," * Supported content-encoding methods."," */","","exports.methods = {"," gzip: zlib.createGzip"," , deflate: zlib.createDeflate","};","","/**"," * Default filter function."," */","","exports.filter = function(req, res){"," return /json|text|javascript/.test(res.getHeader('Content-Type'));","};","","/**"," * Compress:"," *"," * Compress response data with gzip/deflate."," *"," * Filter:"," *"," * A `filter` callback function may be passed to"," * replace the default logic of:"," *"," * exports.filter = function(req, res){"," * return /json|text|javascript/.test(res.getHeader('Content-Type'));"," * };"," *"," * Options:"," *"," * All remaining options are passed to the gzip/deflate"," * creation functions. Consult node's docs for additional details."," *"," * - `chunkSize` (default: 16*1024)"," * - `windowBits`"," * - `level`: 0-9 where 0 is no compression, and 9 is slow but best compression"," * - `memLevel`: 1-9 low is slower but uses less memory, high is fast but uses more"," * - `strategy`: compression strategy"," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","module.exports = function compress(options) {"," options = options || {};"," var names = Object.keys(exports.methods)"," , filter = options.filter || exports.filter;",""," return function(req, res, next){"," var accept = req.headers['accept-encoding']"," , write = res.write"," , end = res.end"," , stream"," , method;",""," // vary"," res.setHeader('Vary', 'Accept-Encoding');",""," // proxy",""," res.write = function(chunk, encoding){"," if (!this.headerSent) this._implicitHeader();"," return stream"," ? stream.write(new Buffer(chunk, encoding))"," : write.call(res, chunk, encoding);"," };",""," res.end = function(chunk, encoding){"," if (chunk) this.write(chunk, encoding);"," return stream"," ? stream.end()"," : end.call(res);"," };",""," res.on('header', function(){"," var encoding = res.getHeader('Content-Encoding') || 'identity';",""," // already encoded"," if ('identity' != encoding) return; ",""," // default request filter"," if (!filter(req, res)) return;",""," // SHOULD use identity"," if (!accept) return;",""," // head"," if ('HEAD' == req.method) return;",""," // default to gzip"," if ('*' == accept.trim()) method = 'gzip';",""," // compression method"," if (!method) {"," for (var i = 0, len = names.length; i < len; ++i) {"," if (~accept.indexOf(names[i])) {"," method = names[i];"," break;"," }"," }"," }",""," // compression method"," if (!method) return;",""," // compression stream"," stream = exports.methods[method](options);",""," // header fields"," res.setHeader('Content-Encoding', method);"," res.removeHeader('Content-Length');",""," // compression",""," stream.on('data', function(chunk){"," write.call(res, chunk);"," });",""," stream.on('end', function(){"," end.call(res);"," });",""," stream.on('drain', function() {"," res.emit('drain');"," });"," });",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/cookieParser.js b/node_modules/express/node_modules/connect/lib-cov/middleware/cookieParser.js deleted file mode 100644 index 7f462d1..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/cookieParser.js +++ /dev/null @@ -1,70 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/cookieParser.js']) { - _$jscoverage['middleware/cookieParser.js'] = []; - _$jscoverage['middleware/cookieParser.js'][13] = 0; - _$jscoverage['middleware/cookieParser.js'][38] = 0; - _$jscoverage['middleware/cookieParser.js'][39] = 0; - _$jscoverage['middleware/cookieParser.js'][40] = 0; - _$jscoverage['middleware/cookieParser.js'][41] = 0; - _$jscoverage['middleware/cookieParser.js'][43] = 0; - _$jscoverage['middleware/cookieParser.js'][44] = 0; - _$jscoverage['middleware/cookieParser.js'][45] = 0; - _$jscoverage['middleware/cookieParser.js'][47] = 0; - _$jscoverage['middleware/cookieParser.js'][48] = 0; - _$jscoverage['middleware/cookieParser.js'][49] = 0; - _$jscoverage['middleware/cookieParser.js'][50] = 0; - _$jscoverage['middleware/cookieParser.js'][51] = 0; - _$jscoverage['middleware/cookieParser.js'][52] = 0; - _$jscoverage['middleware/cookieParser.js'][54] = 0; - _$jscoverage['middleware/cookieParser.js'][56] = 0; - _$jscoverage['middleware/cookieParser.js'][57] = 0; - _$jscoverage['middleware/cookieParser.js'][60] = 0; -} -_$jscoverage['middleware/cookieParser.js'][13]++; -var utils = require("./../utils"), cookie = require("cookie"); -_$jscoverage['middleware/cookieParser.js'][38]++; -module.exports = (function cookieParser(secret) { - _$jscoverage['middleware/cookieParser.js'][39]++; - return (function cookieParser(req, res, next) { - _$jscoverage['middleware/cookieParser.js'][40]++; - if (req.cookies) { - _$jscoverage['middleware/cookieParser.js'][40]++; - return next(); - } - _$jscoverage['middleware/cookieParser.js'][41]++; - var cookies = req.headers.cookie; - _$jscoverage['middleware/cookieParser.js'][43]++; - req.secret = secret; - _$jscoverage['middleware/cookieParser.js'][44]++; - req.cookies = {}; - _$jscoverage['middleware/cookieParser.js'][45]++; - req.signedCookies = {}; - _$jscoverage['middleware/cookieParser.js'][47]++; - if (cookies) { - _$jscoverage['middleware/cookieParser.js'][48]++; - try { - _$jscoverage['middleware/cookieParser.js'][49]++; - req.cookies = cookie.parse(cookies); - _$jscoverage['middleware/cookieParser.js'][50]++; - if (secret) { - _$jscoverage['middleware/cookieParser.js'][51]++; - req.signedCookies = utils.parseSignedCookies(req.cookies, secret); - _$jscoverage['middleware/cookieParser.js'][52]++; - req.signedCookies = utils.parseJSONCookies(req.signedCookies); - } - _$jscoverage['middleware/cookieParser.js'][54]++; - req.cookies = utils.parseJSONCookies(req.cookies); - } - catch (err) { - _$jscoverage['middleware/cookieParser.js'][56]++; - err.status = 400; - _$jscoverage['middleware/cookieParser.js'][57]++; - return next(err); - } - } - _$jscoverage['middleware/cookieParser.js'][60]++; - next(); -}); -}); -_$jscoverage['middleware/cookieParser.js'].source = ["","/*!"," * Connect - cookieParser"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('./../utils')"," , cookie = require('cookie');","","/**"," * Cookie parser:"," *"," * Parse _Cookie_ header and populate `req.cookies`"," * with an object keyed by the cookie names. Optionally"," * you may enabled signed cookie support by passing"," * a `secret` string, which assigns `req.secret` so"," * it may be used by other middleware."," *"," * Examples:"," *"," * connect()"," * .use(connect.cookieParser('optional secret string'))"," * .use(function(req, res, next){"," * res.end(JSON.stringify(req.cookies));"," * })"," *"," * @param {String} secret"," * @return {Function}"," * @api public"," */","","module.exports = function cookieParser(secret){"," return function cookieParser(req, res, next) {"," if (req.cookies) return next();"," var cookies = req.headers.cookie;",""," req.secret = secret;"," req.cookies = {};"," req.signedCookies = {};",""," if (cookies) {"," try {"," req.cookies = cookie.parse(cookies);"," if (secret) {"," req.signedCookies = utils.parseSignedCookies(req.cookies, secret);"," req.signedCookies = utils.parseJSONCookies(req.signedCookies);"," }"," req.cookies = utils.parseJSONCookies(req.cookies);"," } catch (err) {"," err.status = 400;"," return next(err);"," }"," }"," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/cookieSession.js b/node_modules/express/node_modules/connect/lib-cov/middleware/cookieSession.js deleted file mode 100644 index e54fa47..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/cookieSession.js +++ /dev/null @@ -1,132 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/cookieSession.js']) { - _$jscoverage['middleware/cookieSession.js'] = []; - _$jscoverage['middleware/cookieSession.js'][12] = 0; - _$jscoverage['middleware/cookieSession.js'][46] = 0; - _$jscoverage['middleware/cookieSession.js'][48] = 0; - _$jscoverage['middleware/cookieSession.js'][49] = 0; - _$jscoverage['middleware/cookieSession.js'][52] = 0; - _$jscoverage['middleware/cookieSession.js'][55] = 0; - _$jscoverage['middleware/cookieSession.js'][56] = 0; - _$jscoverage['middleware/cookieSession.js'][59] = 0; - _$jscoverage['middleware/cookieSession.js'][60] = 0; - _$jscoverage['middleware/cookieSession.js'][63] = 0; - _$jscoverage['middleware/cookieSession.js'][66] = 0; - _$jscoverage['middleware/cookieSession.js'][67] = 0; - _$jscoverage['middleware/cookieSession.js'][70] = 0; - _$jscoverage['middleware/cookieSession.js'][71] = 0; - _$jscoverage['middleware/cookieSession.js'][72] = 0; - _$jscoverage['middleware/cookieSession.js'][73] = 0; - _$jscoverage['middleware/cookieSession.js'][74] = 0; - _$jscoverage['middleware/cookieSession.js'][75] = 0; - _$jscoverage['middleware/cookieSession.js'][80] = 0; - _$jscoverage['middleware/cookieSession.js'][82] = 0; - _$jscoverage['middleware/cookieSession.js'][83] = 0; - _$jscoverage['middleware/cookieSession.js'][84] = 0; - _$jscoverage['middleware/cookieSession.js'][85] = 0; - _$jscoverage['middleware/cookieSession.js'][86] = 0; - _$jscoverage['middleware/cookieSession.js'][89] = 0; - _$jscoverage['middleware/cookieSession.js'][92] = 0; - _$jscoverage['middleware/cookieSession.js'][97] = 0; - _$jscoverage['middleware/cookieSession.js'][100] = 0; - _$jscoverage['middleware/cookieSession.js'][101] = 0; - _$jscoverage['middleware/cookieSession.js'][104] = 0; - _$jscoverage['middleware/cookieSession.js'][107] = 0; - _$jscoverage['middleware/cookieSession.js'][108] = 0; - _$jscoverage['middleware/cookieSession.js'][109] = 0; - _$jscoverage['middleware/cookieSession.js'][110] = 0; - _$jscoverage['middleware/cookieSession.js'][113] = 0; -} -_$jscoverage['middleware/cookieSession.js'][12]++; -var utils = require("./../utils"), Cookie = require("./session/cookie"), debug = require("debug")("connect:cookieSession"), signature = require("cookie-signature"), crc16 = require("crc").crc16; -_$jscoverage['middleware/cookieSession.js'][46]++; -module.exports = (function cookieSession(options) { - _$jscoverage['middleware/cookieSession.js'][48]++; - options = options || {}; - _$jscoverage['middleware/cookieSession.js'][49]++; - var key = options.key || "connect.sess", trustProxy = options.proxy; - _$jscoverage['middleware/cookieSession.js'][52]++; - return (function cookieSession(req, res, next) { - _$jscoverage['middleware/cookieSession.js'][55]++; - var secret = options.secret || req.secret; - _$jscoverage['middleware/cookieSession.js'][56]++; - if (! secret) { - _$jscoverage['middleware/cookieSession.js'][56]++; - throw new Error("`secret` option required for cookie sessions"); - } - _$jscoverage['middleware/cookieSession.js'][59]++; - req.session = {}; - _$jscoverage['middleware/cookieSession.js'][60]++; - var cookie = req.session.cookie = new Cookie(options.cookie); - _$jscoverage['middleware/cookieSession.js'][63]++; - if (0 != req.originalUrl.indexOf(cookie.path)) { - _$jscoverage['middleware/cookieSession.js'][63]++; - return next(); - } - _$jscoverage['middleware/cookieSession.js'][66]++; - if (! options.secret && req.secret) { - _$jscoverage['middleware/cookieSession.js'][67]++; - req.session = req.signedCookies[key] || {}; - } - else { - _$jscoverage['middleware/cookieSession.js'][70]++; - var rawCookie = req.cookies[key]; - _$jscoverage['middleware/cookieSession.js'][71]++; - if (rawCookie) { - _$jscoverage['middleware/cookieSession.js'][72]++; - var unsigned = utils.parseSignedCookie(rawCookie, secret); - _$jscoverage['middleware/cookieSession.js'][73]++; - if (unsigned) { - _$jscoverage['middleware/cookieSession.js'][74]++; - var originalHash = crc16(unsigned); - _$jscoverage['middleware/cookieSession.js'][75]++; - req.session = utils.parseJSONCookie(unsigned) || {}; - } - } - } - _$jscoverage['middleware/cookieSession.js'][80]++; - res.on("header", (function () { - _$jscoverage['middleware/cookieSession.js'][82]++; - if (! req.session) { - _$jscoverage['middleware/cookieSession.js'][83]++; - debug("clear session"); - _$jscoverage['middleware/cookieSession.js'][84]++; - cookie.expires = new Date(0); - _$jscoverage['middleware/cookieSession.js'][85]++; - res.setHeader("Set-Cookie", cookie.serialize(key, "")); - _$jscoverage['middleware/cookieSession.js'][86]++; - return; - } - _$jscoverage['middleware/cookieSession.js'][89]++; - delete req.session.cookie; - _$jscoverage['middleware/cookieSession.js'][92]++; - var proto = (req.headers["x-forwarded-proto"] || "").toLowerCase(), tls = req.connection.encrypted || (trustProxy && "https" == proto), secured = cookie.secure && tls; - _$jscoverage['middleware/cookieSession.js'][97]++; - if (cookie.secure && ! secured) { - _$jscoverage['middleware/cookieSession.js'][97]++; - return debug("not secured"); - } - _$jscoverage['middleware/cookieSession.js'][100]++; - debug("serializing %j", req.session); - _$jscoverage['middleware/cookieSession.js'][101]++; - var val = "j:" + JSON.stringify(req.session); - _$jscoverage['middleware/cookieSession.js'][104]++; - if (originalHash == crc16(val)) { - _$jscoverage['middleware/cookieSession.js'][104]++; - return debug("unmodified session"); - } - _$jscoverage['middleware/cookieSession.js'][107]++; - val = "s:" + signature.sign(val, secret); - _$jscoverage['middleware/cookieSession.js'][108]++; - val = cookie.serialize(key, val); - _$jscoverage['middleware/cookieSession.js'][109]++; - debug("set-cookie %j", cookie); - _$jscoverage['middleware/cookieSession.js'][110]++; - res.setHeader("Set-Cookie", val); -})); - _$jscoverage['middleware/cookieSession.js'][113]++; - next(); -}); -}); -_$jscoverage['middleware/cookieSession.js'].source = ["","/*!"," * Connect - cookieSession"," * Copyright(c) 2011 Sencha Inc."," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('./../utils')"," , Cookie = require('./session/cookie')"," , debug = require('debug')('connect:cookieSession')"," , signature = require('cookie-signature')"," , crc16 = require('crc').crc16;","","/**"," * Cookie Session:"," *"," * Cookie session middleware."," *"," * var app = connect();"," * app.use(connect.cookieParser());"," * app.use(connect.cookieSession({ secret: 'tobo!', cookie: { maxAge: 60 * 60 * 1000 }}));"," *"," * Options:"," *"," * - `key` cookie name defaulting to `connect.sess`"," * - `secret` prevents cookie tampering"," * - `cookie` session cookie settings, defaulting to `{ path: '/', httpOnly: true, maxAge: null }`"," * - `proxy` trust the reverse proxy when setting secure cookies (via \"x-forwarded-proto\")"," *"," * Clearing sessions:"," *"," * To clear the session simply set its value to `null`,"," * `cookieSession()` will then respond with a 1970 Set-Cookie."," *"," * req.session = null;"," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","module.exports = function cookieSession(options){"," // TODO: utilize Session/Cookie to unify API"," options = options || {};"," var key = options.key || 'connect.sess'"," , trustProxy = options.proxy;",""," return function cookieSession(req, res, next) {",""," // req.secret is for backwards compatibility"," var secret = options.secret || req.secret;"," if (!secret) throw new Error('`secret` option required for cookie sessions');",""," // default session"," req.session = {};"," var cookie = req.session.cookie = new Cookie(options.cookie);",""," // pathname mismatch"," if (0 != req.originalUrl.indexOf(cookie.path)) return next();",""," // cookieParser secret"," if (!options.secret && req.secret) {"," req.session = req.signedCookies[key] || {};"," } else {"," // TODO: refactor"," var rawCookie = req.cookies[key];"," if (rawCookie) {"," var unsigned = utils.parseSignedCookie(rawCookie, secret);"," if (unsigned) {"," var originalHash = crc16(unsigned);"," req.session = utils.parseJSONCookie(unsigned) || {};"," }"," }"," }",""," res.on('header', function(){"," // removed"," if (!req.session) {"," debug('clear session');"," cookie.expires = new Date(0);"," res.setHeader('Set-Cookie', cookie.serialize(key, ''));"," return;"," }",""," delete req.session.cookie;",""," // check security"," var proto = (req.headers['x-forwarded-proto'] || '').toLowerCase()"," , tls = req.connection.encrypted || (trustProxy && 'https' == proto)"," , secured = cookie.secure && tls;",""," // only send secure cookies via https"," if (cookie.secure && !secured) return debug('not secured');",""," // serialize"," debug('serializing %j', req.session);"," var val = 'j:' + JSON.stringify(req.session);",""," // compare hashes, no need to set-cookie if unchanged"," if (originalHash == crc16(val)) return debug('unmodified session');",""," // set-cookie"," val = 's:' + signature.sign(val, secret);"," val = cookie.serialize(key, val);"," debug('set-cookie %j', cookie);"," res.setHeader('Set-Cookie', val);"," });",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/csrf.js b/node_modules/express/node_modules/connect/lib-cov/middleware/csrf.js deleted file mode 100644 index f3919ed..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/csrf.js +++ /dev/null @@ -1,51 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/csrf.js']) { - _$jscoverage['middleware/csrf.js'] = []; - _$jscoverage['middleware/csrf.js'][11] = 0; - _$jscoverage['middleware/csrf.js'][39] = 0; - _$jscoverage['middleware/csrf.js'][40] = 0; - _$jscoverage['middleware/csrf.js'][41] = 0; - _$jscoverage['middleware/csrf.js'][43] = 0; - _$jscoverage['middleware/csrf.js'][45] = 0; - _$jscoverage['middleware/csrf.js'][48] = 0; - _$jscoverage['middleware/csrf.js'][51] = 0; - _$jscoverage['middleware/csrf.js'][54] = 0; - _$jscoverage['middleware/csrf.js'][56] = 0; - _$jscoverage['middleware/csrf.js'][69] = 0; - _$jscoverage['middleware/csrf.js'][70] = 0; -} -_$jscoverage['middleware/csrf.js'][11]++; -var utils = require("../utils"); -_$jscoverage['middleware/csrf.js'][39]++; -module.exports = (function csrf(options) { - _$jscoverage['middleware/csrf.js'][40]++; - options = options || {}; - _$jscoverage['middleware/csrf.js'][41]++; - var value = options.value || defaultValue; - _$jscoverage['middleware/csrf.js'][43]++; - return (function (req, res, next) { - _$jscoverage['middleware/csrf.js'][45]++; - var token = req.session._csrf || (req.session._csrf = utils.uid(24)); - _$jscoverage['middleware/csrf.js'][48]++; - if ("GET" == req.method || "HEAD" == req.method || "OPTIONS" == req.method) { - _$jscoverage['middleware/csrf.js'][48]++; - return next(); - } - _$jscoverage['middleware/csrf.js'][51]++; - var val = value(req); - _$jscoverage['middleware/csrf.js'][54]++; - if (val != token) { - _$jscoverage['middleware/csrf.js'][54]++; - return next(utils.error(403)); - } - _$jscoverage['middleware/csrf.js'][56]++; - next(); -}); -}); -_$jscoverage['middleware/csrf.js'][69]++; -function defaultValue(req) { - _$jscoverage['middleware/csrf.js'][70]++; - return (req.body && req.body._csrf) || (req.query && req.query._csrf) || req.headers["x-csrf-token"]; -} -_$jscoverage['middleware/csrf.js'].source = ["/*!"," * Connect - csrf"," * Copyright(c) 2011 Sencha Inc."," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils');","","/**"," * Anti CSRF:"," *"," * CRSF protection middleware."," *"," * By default this middleware generates a token named \"_csrf\""," * which should be added to requests which mutate"," * state, within a hidden form field, query-string etc. This"," * token is validated against the visitor's `req.session._csrf`"," * property."," *"," * The default `value` function checks `req.body` generated"," * by the `bodyParser()` middleware, `req.query` generated"," * by `query()`, and the \"X-CSRF-Token\" header field."," *"," * This middleware requires session support, thus should be added"," * somewhere _below_ `session()` and `cookieParser()`."," *"," * Options:"," *"," * - `value` a function accepting the request, returning the token "," *"," * @param {Object} options"," * @api public"," */","","module.exports = function csrf(options) {"," options = options || {};"," var value = options.value || defaultValue;",""," return function(req, res, next){"," // generate CSRF token"," var token = req.session._csrf || (req.session._csrf = utils.uid(24));",""," // ignore these methods"," if ('GET' == req.method || 'HEAD' == req.method || 'OPTIONS' == req.method) return next();",""," // determine value"," var val = value(req);",""," // check"," if (val != token) return next(utils.error(403));"," "," next();"," }","};","","/**"," * Default value function, checking the `req.body`"," * and `req.query` for the CSRF token."," *"," * @param {IncomingMessage} req"," * @return {String}"," * @api private"," */","","function defaultValue(req) {"," return (req.body && req.body._csrf)"," || (req.query && req.query._csrf)"," || (req.headers['x-csrf-token']);","}"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/directory.js b/node_modules/express/node_modules/connect/lib-cov/middleware/directory.js deleted file mode 100644 index bc86b60..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/directory.js +++ /dev/null @@ -1,256 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/directory.js']) { - _$jscoverage['middleware/directory.js'] = []; - _$jscoverage['middleware/directory.js'][17] = 0; - _$jscoverage['middleware/directory.js'][29] = 0; - _$jscoverage['middleware/directory.js'][48] = 0; - _$jscoverage['middleware/directory.js'][49] = 0; - _$jscoverage['middleware/directory.js'][52] = 0; - _$jscoverage['middleware/directory.js'][53] = 0; - _$jscoverage['middleware/directory.js'][58] = 0; - _$jscoverage['middleware/directory.js'][59] = 0; - _$jscoverage['middleware/directory.js'][61] = 0; - _$jscoverage['middleware/directory.js'][70] = 0; - _$jscoverage['middleware/directory.js'][73] = 0; - _$jscoverage['middleware/directory.js'][76] = 0; - _$jscoverage['middleware/directory.js'][77] = 0; - _$jscoverage['middleware/directory.js'][81] = 0; - _$jscoverage['middleware/directory.js'][84] = 0; - _$jscoverage['middleware/directory.js'][85] = 0; - _$jscoverage['middleware/directory.js'][86] = 0; - _$jscoverage['middleware/directory.js'][87] = 0; - _$jscoverage['middleware/directory.js'][88] = 0; - _$jscoverage['middleware/directory.js'][91] = 0; - _$jscoverage['middleware/directory.js'][92] = 0; - _$jscoverage['middleware/directory.js'][93] = 0; - _$jscoverage['middleware/directory.js'][94] = 0; - _$jscoverage['middleware/directory.js'][99] = 0; - _$jscoverage['middleware/directory.js'][109] = 0; - _$jscoverage['middleware/directory.js'][110] = 0; - _$jscoverage['middleware/directory.js'][111] = 0; - _$jscoverage['middleware/directory.js'][112] = 0; - _$jscoverage['middleware/directory.js'][113] = 0; - _$jscoverage['middleware/directory.js'][114] = 0; - _$jscoverage['middleware/directory.js'][115] = 0; - _$jscoverage['middleware/directory.js'][120] = 0; - _$jscoverage['middleware/directory.js'][121] = 0; - _$jscoverage['middleware/directory.js'][122] = 0; - _$jscoverage['middleware/directory.js'][131] = 0; - _$jscoverage['middleware/directory.js'][132] = 0; - _$jscoverage['middleware/directory.js'][133] = 0; - _$jscoverage['middleware/directory.js'][134] = 0; - _$jscoverage['middleware/directory.js'][135] = 0; - _$jscoverage['middleware/directory.js'][142] = 0; - _$jscoverage['middleware/directory.js'][143] = 0; - _$jscoverage['middleware/directory.js'][144] = 0; - _$jscoverage['middleware/directory.js'][145] = 0; - _$jscoverage['middleware/directory.js'][146] = 0; - _$jscoverage['middleware/directory.js'][153] = 0; - _$jscoverage['middleware/directory.js'][154] = 0; - _$jscoverage['middleware/directory.js'][155] = 0; - _$jscoverage['middleware/directory.js'][156] = 0; - _$jscoverage['middleware/directory.js'][157] = 0; - _$jscoverage['middleware/directory.js'][165] = 0; - _$jscoverage['middleware/directory.js'][166] = 0; - _$jscoverage['middleware/directory.js'][167] = 0; - _$jscoverage['middleware/directory.js'][170] = 0; - _$jscoverage['middleware/directory.js'][171] = 0; - _$jscoverage['middleware/directory.js'][172] = 0; - _$jscoverage['middleware/directory.js'][173] = 0; - _$jscoverage['middleware/directory.js'][176] = 0; - _$jscoverage['middleware/directory.js'][194] = 0; - _$jscoverage['middleware/directory.js'][195] = 0; - _$jscoverage['middleware/directory.js'][196] = 0; - _$jscoverage['middleware/directory.js'][208] = 0; - _$jscoverage['middleware/directory.js'][209] = 0; - _$jscoverage['middleware/directory.js'][210] = 0; - _$jscoverage['middleware/directory.js'][218] = 0; -} -_$jscoverage['middleware/directory.js'][17]++; -var fs = require("fs"), parse = require("url").parse, utils = require("../utils"), path = require("path"), normalize = path.normalize, extname = path.extname, join = path.join; -_$jscoverage['middleware/directory.js'][29]++; -var cache = {}; -_$jscoverage['middleware/directory.js'][48]++; -exports = module.exports = (function directory(root, options) { - _$jscoverage['middleware/directory.js'][49]++; - options = options || {}; - _$jscoverage['middleware/directory.js'][52]++; - if (! root) { - _$jscoverage['middleware/directory.js'][52]++; - throw new Error("directory() root path required"); - } - _$jscoverage['middleware/directory.js'][53]++; - var hidden = options.hidden, icons = options.icons, filter = options.filter, root = normalize(root); - _$jscoverage['middleware/directory.js'][58]++; - return (function directory(req, res, next) { - _$jscoverage['middleware/directory.js'][59]++; - if ("GET" != req.method && "HEAD" != req.method) { - _$jscoverage['middleware/directory.js'][59]++; - return next(); - } - _$jscoverage['middleware/directory.js'][61]++; - var accept = req.headers.accept || "text/plain", url = parse(req.url), dir = decodeURIComponent(url.pathname), path = normalize(join(root, dir)), originalUrl = parse(req.originalUrl), originalDir = decodeURIComponent(originalUrl.pathname), showUp = path != root && path != root + "/"; - _$jscoverage['middleware/directory.js'][70]++; - if (~ path.indexOf("\u0000")) { - _$jscoverage['middleware/directory.js'][70]++; - return next(utils.error(400)); - } - _$jscoverage['middleware/directory.js'][73]++; - if (0 != path.indexOf(root)) { - _$jscoverage['middleware/directory.js'][73]++; - return next(utils.error(403)); - } - _$jscoverage['middleware/directory.js'][76]++; - fs.stat(path, (function (err, stat) { - _$jscoverage['middleware/directory.js'][77]++; - if (err) { - _$jscoverage['middleware/directory.js'][77]++; - return "ENOENT" == err.code? next(): next(err); - } - _$jscoverage['middleware/directory.js'][81]++; - if (! stat.isDirectory()) { - _$jscoverage['middleware/directory.js'][81]++; - return next(); - } - _$jscoverage['middleware/directory.js'][84]++; - fs.readdir(path, (function (err, files) { - _$jscoverage['middleware/directory.js'][85]++; - if (err) { - _$jscoverage['middleware/directory.js'][85]++; - return next(err); - } - _$jscoverage['middleware/directory.js'][86]++; - if (! hidden) { - _$jscoverage['middleware/directory.js'][86]++; - files = removeHidden(files); - } - _$jscoverage['middleware/directory.js'][87]++; - if (filter) { - _$jscoverage['middleware/directory.js'][87]++; - files = files.filter(filter); - } - _$jscoverage['middleware/directory.js'][88]++; - files.sort(); - _$jscoverage['middleware/directory.js'][91]++; - for (var key in exports) { - _$jscoverage['middleware/directory.js'][92]++; - if (~ accept.indexOf(key) || ~ accept.indexOf("*/*")) { - _$jscoverage['middleware/directory.js'][93]++; - exports[key](req, res, files, next, originalDir, showUp, icons); - _$jscoverage['middleware/directory.js'][94]++; - return; - } -} - _$jscoverage['middleware/directory.js'][99]++; - next(utils.error(406)); -})); -})); -}); -}); -_$jscoverage['middleware/directory.js'][109]++; -exports.html = (function (req, res, files, next, dir, showUp, icons) { - _$jscoverage['middleware/directory.js'][110]++; - fs.readFile(__dirname + "/../public/directory.html", "utf8", (function (err, str) { - _$jscoverage['middleware/directory.js'][111]++; - if (err) { - _$jscoverage['middleware/directory.js'][111]++; - return next(err); - } - _$jscoverage['middleware/directory.js'][112]++; - fs.readFile(__dirname + "/../public/style.css", "utf8", (function (err, style) { - _$jscoverage['middleware/directory.js'][113]++; - if (err) { - _$jscoverage['middleware/directory.js'][113]++; - return next(err); - } - _$jscoverage['middleware/directory.js'][114]++; - if (showUp) { - _$jscoverage['middleware/directory.js'][114]++; - files.unshift(".."); - } - _$jscoverage['middleware/directory.js'][115]++; - str = str.replace("{style}", style).replace("{files}", html(files, dir, icons)).replace("{directory}", dir).replace("{linked-path}", htmlPath(dir)); - _$jscoverage['middleware/directory.js'][120]++; - res.setHeader("Content-Type", "text/html"); - _$jscoverage['middleware/directory.js'][121]++; - res.setHeader("Content-Length", str.length); - _$jscoverage['middleware/directory.js'][122]++; - res.end(str); -})); -})); -}); -_$jscoverage['middleware/directory.js'][131]++; -exports.json = (function (req, res, files) { - _$jscoverage['middleware/directory.js'][132]++; - files = JSON.stringify(files); - _$jscoverage['middleware/directory.js'][133]++; - res.setHeader("Content-Type", "application/json"); - _$jscoverage['middleware/directory.js'][134]++; - res.setHeader("Content-Length", files.length); - _$jscoverage['middleware/directory.js'][135]++; - res.end(files); -}); -_$jscoverage['middleware/directory.js'][142]++; -exports.plain = (function (req, res, files) { - _$jscoverage['middleware/directory.js'][143]++; - files = files.join("\n") + "\n"; - _$jscoverage['middleware/directory.js'][144]++; - res.setHeader("Content-Type", "text/plain"); - _$jscoverage['middleware/directory.js'][145]++; - res.setHeader("Content-Length", files.length); - _$jscoverage['middleware/directory.js'][146]++; - res.end(files); -}); -_$jscoverage['middleware/directory.js'][153]++; -function htmlPath(dir) { - _$jscoverage['middleware/directory.js'][154]++; - var curr = []; - _$jscoverage['middleware/directory.js'][155]++; - return dir.split("/").map((function (part) { - _$jscoverage['middleware/directory.js'][156]++; - curr.push(part); - _$jscoverage['middleware/directory.js'][157]++; - return "" + part + ""; -})).join(" / "); -} -_$jscoverage['middleware/directory.js'][165]++; -function html(files, dir, useIcons) { - _$jscoverage['middleware/directory.js'][166]++; - return "
    " + files.map((function (file) { - _$jscoverage['middleware/directory.js'][167]++; - var icon = "", classes = []; - _$jscoverage['middleware/directory.js'][170]++; - if (useIcons && ".." != file) { - _$jscoverage['middleware/directory.js'][171]++; - icon = icons[extname(file)] || icons["default"]; - _$jscoverage['middleware/directory.js'][172]++; - icon = ""; - _$jscoverage['middleware/directory.js'][173]++; - classes.push("icon"); - } - _$jscoverage['middleware/directory.js'][176]++; - return "
  • " + icon + file + "
  • "; -})).join("\n") + "
"; -} -_$jscoverage['middleware/directory.js'][194]++; -function load(icon) { - _$jscoverage['middleware/directory.js'][195]++; - if (cache[icon]) { - _$jscoverage['middleware/directory.js'][195]++; - return cache[icon]; - } - _$jscoverage['middleware/directory.js'][196]++; - return cache[icon] = fs.readFileSync(__dirname + "/../public/icons/" + icon, "base64"); -} -_$jscoverage['middleware/directory.js'][208]++; -function removeHidden(files) { - _$jscoverage['middleware/directory.js'][209]++; - return files.filter((function (file) { - _$jscoverage['middleware/directory.js'][210]++; - return "." != file[0]; -})); -} -_$jscoverage['middleware/directory.js'][218]++; -var icons = {".js": "page_white_code_red.png", ".c": "page_white_c.png", ".h": "page_white_h.png", ".cc": "page_white_cplusplus.png", ".php": "page_white_php.png", ".rb": "page_white_ruby.png", ".cpp": "page_white_cplusplus.png", ".swf": "page_white_flash.png", ".pdf": "page_white_acrobat.png", "default": "page_white.png"}; -_$jscoverage['middleware/directory.js'].source = ["","/*!"," * Connect - directory"," * Copyright(c) 2011 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","// TODO: icon / style for directories","// TODO: arrow key navigation","// TODO: make icons extensible","","/**"," * Module dependencies."," */","","var fs = require('fs')"," , parse = require('url').parse"," , utils = require('../utils')"," , path = require('path')"," , normalize = path.normalize"," , extname = path.extname"," , join = path.join;","","/*!"," * Icon cache."," */","","var cache = {};","","/**"," * Directory:"," *"," * Serve directory listings with the given `root` path."," *"," * Options:"," *"," * - `hidden` display hidden (dot) files. Defaults to false."," * - `icons` display icons. Defaults to false."," * - `filter` Apply this filter function to files. Defaults to false."," *"," * @param {String} root"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function directory(root, options){"," options = options || {};",""," // root required"," if (!root) throw new Error('directory() root path required');"," var hidden = options.hidden"," , icons = options.icons"," , filter = options.filter"," , root = normalize(root);",""," return function directory(req, res, next) {"," if ('GET' != req.method && 'HEAD' != req.method) return next();",""," var accept = req.headers.accept || 'text/plain'"," , url = parse(req.url)"," , dir = decodeURIComponent(url.pathname)"," , path = normalize(join(root, dir))"," , originalUrl = parse(req.originalUrl)"," , originalDir = decodeURIComponent(originalUrl.pathname)"," , showUp = path != root && path != root + '/';",""," // null byte(s), bad request"," if (~path.indexOf('\\0')) return next(utils.error(400));",""," // malicious path, forbidden"," if (0 != path.indexOf(root)) return next(utils.error(403));",""," // check if we have a directory"," fs.stat(path, function(err, stat){"," if (err) return 'ENOENT' == err.code"," ? next()"," : next(err);",""," if (!stat.isDirectory()) return next();",""," // fetch files"," fs.readdir(path, function(err, files){"," if (err) return next(err);"," if (!hidden) files = removeHidden(files);"," if (filter) files = files.filter(filter);"," files.sort();",""," // content-negotiation"," for (var key in exports) {"," if (~accept.indexOf(key) || ~accept.indexOf('*/*')) {"," exports[key](req, res, files, next, originalDir, showUp, icons);"," return;"," }"," }",""," // not acceptable"," next(utils.error(406));"," });"," });"," };","};","","/**"," * Respond with text/html."," */","","exports.html = function(req, res, files, next, dir, showUp, icons){"," fs.readFile(__dirname + '/../public/directory.html', 'utf8', function(err, str){"," if (err) return next(err);"," fs.readFile(__dirname + '/../public/style.css', 'utf8', function(err, style){"," if (err) return next(err);"," if (showUp) files.unshift('..');"," str = str"," .replace('{style}', style)"," .replace('{files}', html(files, dir, icons))"," .replace('{directory}', dir)"," .replace('{linked-path}', htmlPath(dir));"," res.setHeader('Content-Type', 'text/html');"," res.setHeader('Content-Length', str.length);"," res.end(str);"," });"," });","};","","/**"," * Respond with application/json."," */","","exports.json = function(req, res, files){"," files = JSON.stringify(files);"," res.setHeader('Content-Type', 'application/json');"," res.setHeader('Content-Length', files.length);"," res.end(files);","};","","/**"," * Respond with text/plain."," */","","exports.plain = function(req, res, files){"," files = files.join('\\n') + '\\n';"," res.setHeader('Content-Type', 'text/plain');"," res.setHeader('Content-Length', files.length);"," res.end(files);","};","","/**"," * Map html `dir`, returning a linked path."," */","","function htmlPath(dir) {"," var curr = [];"," return dir.split('/').map(function(part){"," curr.push(part);"," return '<a href=\"' + curr.join('/') + '\">' + part + '</a>';"," }).join(' / ');","}","","/**"," * Map html `files`, returning an html unordered list."," */","","function html(files, dir, useIcons) {"," return '<ul id=\"files\">' + files.map(function(file){"," var icon = ''"," , classes = [];",""," if (useIcons && '..' != file) {"," icon = icons[extname(file)] || icons.default;"," icon = '<img src=\"data:image/png;base64,' + load(icon) + '\" />';"," classes.push('icon');"," }",""," return '<li><a href=\"'"," + join(dir, file)"," + '\" class=\"'"," + classes.join(' ') + '\"'"," + ' title=\"' + file + '\">'"," + icon + file + '</a></li>';",""," }).join('\\n') + '</ul>';","}","","/**"," * Load and cache the given `icon`."," *"," * @param {String} icon"," * @return {String}"," * @api private"," */","","function load(icon) {"," if (cache[icon]) return cache[icon];"," return cache[icon] = fs.readFileSync(__dirname + '/../public/icons/' + icon, 'base64');","}","","/**"," * Filter \"hidden\" `files`, aka files"," * beginning with a `.`."," *"," * @param {Array} files"," * @return {Array}"," * @api private"," */","","function removeHidden(files) {"," return files.filter(function(file){"," return '.' != file[0];"," });","}","","/**"," * Icon map."," */","","var icons = {"," '.js': 'page_white_code_red.png'"," , '.c': 'page_white_c.png'"," , '.h': 'page_white_h.png'"," , '.cc': 'page_white_cplusplus.png'"," , '.php': 'page_white_php.png'"," , '.rb': 'page_white_ruby.png'"," , '.cpp': 'page_white_cplusplus.png'"," , '.swf': 'page_white_flash.png'"," , '.pdf': 'page_white_acrobat.png'"," , 'default': 'page_white.png'","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/errorHandler.js b/node_modules/express/node_modules/connect/lib-cov/middleware/errorHandler.js deleted file mode 100644 index 9a87bfa..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/errorHandler.js +++ /dev/null @@ -1,104 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/errorHandler.js']) { - _$jscoverage['middleware/errorHandler.js'] = []; - _$jscoverage['middleware/errorHandler.js'][12] = 0; - _$jscoverage['middleware/errorHandler.js'][17] = 0; - _$jscoverage['middleware/errorHandler.js'][44] = 0; - _$jscoverage['middleware/errorHandler.js'][45] = 0; - _$jscoverage['middleware/errorHandler.js'][46] = 0; - _$jscoverage['middleware/errorHandler.js'][47] = 0; - _$jscoverage['middleware/errorHandler.js'][48] = 0; - _$jscoverage['middleware/errorHandler.js'][49] = 0; - _$jscoverage['middleware/errorHandler.js'][51] = 0; - _$jscoverage['middleware/errorHandler.js'][52] = 0; - _$jscoverage['middleware/errorHandler.js'][53] = 0; - _$jscoverage['middleware/errorHandler.js'][54] = 0; - _$jscoverage['middleware/errorHandler.js'][56] = 0; - _$jscoverage['middleware/errorHandler.js'][57] = 0; - _$jscoverage['middleware/errorHandler.js'][63] = 0; - _$jscoverage['middleware/errorHandler.js'][64] = 0; - _$jscoverage['middleware/errorHandler.js'][68] = 0; - _$jscoverage['middleware/errorHandler.js'][69] = 0; - _$jscoverage['middleware/errorHandler.js'][70] = 0; - _$jscoverage['middleware/errorHandler.js'][71] = 0; - _$jscoverage['middleware/errorHandler.js'][72] = 0; - _$jscoverage['middleware/errorHandler.js'][73] = 0; - _$jscoverage['middleware/errorHandler.js'][76] = 0; - _$jscoverage['middleware/errorHandler.js'][77] = 0; - _$jscoverage['middleware/errorHandler.js'][86] = 0; -} -_$jscoverage['middleware/errorHandler.js'][12]++; -var utils = require("../utils"), fs = require("fs"); -_$jscoverage['middleware/errorHandler.js'][17]++; -var env = process.env.NODE_ENV || "development"; -_$jscoverage['middleware/errorHandler.js'][44]++; -exports = module.exports = (function errorHandler() { - _$jscoverage['middleware/errorHandler.js'][45]++; - return (function errorHandler(err, req, res, next) { - _$jscoverage['middleware/errorHandler.js'][46]++; - if (err.status) { - _$jscoverage['middleware/errorHandler.js'][46]++; - res.statusCode = err.status; - } - _$jscoverage['middleware/errorHandler.js'][47]++; - if (res.statusCode < 400) { - _$jscoverage['middleware/errorHandler.js'][47]++; - res.statusCode = 500; - } - _$jscoverage['middleware/errorHandler.js'][48]++; - if ("test" != env) { - _$jscoverage['middleware/errorHandler.js'][48]++; - console.error(err.stack); - } - _$jscoverage['middleware/errorHandler.js'][49]++; - var accept = req.headers.accept || ""; - _$jscoverage['middleware/errorHandler.js'][51]++; - if (~ accept.indexOf("html")) { - _$jscoverage['middleware/errorHandler.js'][52]++; - fs.readFile(__dirname + "/../public/style.css", "utf8", (function (e, style) { - _$jscoverage['middleware/errorHandler.js'][53]++; - fs.readFile(__dirname + "/../public/error.html", "utf8", (function (e, html) { - _$jscoverage['middleware/errorHandler.js'][54]++; - var stack = (err.stack || "").split("\n").slice(1).map((function (v) { - _$jscoverage['middleware/errorHandler.js'][56]++; - return "
  • " + v + "
  • "; -})).join(""); - _$jscoverage['middleware/errorHandler.js'][57]++; - html = html.replace("{style}", style).replace("{stack}", stack).replace("{title}", exports.title).replace("{statusCode}", res.statusCode).replace(/\{error\}/g, utils.escape(err.toString())); - _$jscoverage['middleware/errorHandler.js'][63]++; - res.setHeader("Content-Type", "text/html; charset=utf-8"); - _$jscoverage['middleware/errorHandler.js'][64]++; - res.end(html); -})); -})); - } - else { - _$jscoverage['middleware/errorHandler.js'][68]++; - if (~ accept.indexOf("json")) { - _$jscoverage['middleware/errorHandler.js'][69]++; - var error = {message: err.message, stack: err.stack}; - _$jscoverage['middleware/errorHandler.js'][70]++; - for (var prop in err) { - _$jscoverage['middleware/errorHandler.js'][70]++; - error[prop] = err[prop]; -} - _$jscoverage['middleware/errorHandler.js'][71]++; - var json = JSON.stringify({error: error}); - _$jscoverage['middleware/errorHandler.js'][72]++; - res.setHeader("Content-Type", "application/json"); - _$jscoverage['middleware/errorHandler.js'][73]++; - res.end(json); - } - else { - _$jscoverage['middleware/errorHandler.js'][76]++; - res.writeHead(res.statusCode, {"Content-Type": "text/plain"}); - _$jscoverage['middleware/errorHandler.js'][77]++; - res.end(err.stack); - } - } -}); -}); -_$jscoverage['middleware/errorHandler.js'][86]++; -exports.title = "Connect"; -_$jscoverage['middleware/errorHandler.js'].source = ["/*!"," * Connect - errorHandler"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils')"," , fs = require('fs');","","// environment","","var env = process.env.NODE_ENV || 'development';","","/**"," * Error handler:"," *"," * Development error handler, providing stack traces"," * and error message responses for requests accepting text, html,"," * or json."," *"," * Text:"," *"," * By default, and when _text/plain_ is accepted a simple stack trace"," * or error message will be returned."," *"," * JSON:"," *"," * When _application/json_ is accepted, connect will respond with"," * an object in the form of `{ \"error\": error }`."," *"," * HTML:"," *"," * When accepted connect will output a nice html stack trace."," *"," * @return {Function}"," * @api public"," */","","exports = module.exports = function errorHandler(){"," return function errorHandler(err, req, res, next){"," if (err.status) res.statusCode = err.status;"," if (res.statusCode < 400) res.statusCode = 500;"," if ('test' != env) console.error(err.stack);"," var accept = req.headers.accept || '';"," // html"," if (~accept.indexOf('html')) {"," fs.readFile(__dirname + '/../public/style.css', 'utf8', function(e, style){"," fs.readFile(__dirname + '/../public/error.html', 'utf8', function(e, html){"," var stack = (err.stack || '')"," .split('\\n').slice(1)"," .map(function(v){ return '<li>' + v + '</li>'; }).join('');"," html = html"," .replace('{style}', style)"," .replace('{stack}', stack)"," .replace('{title}', exports.title)"," .replace('{statusCode}', res.statusCode)"," .replace(/\\{error\\}/g, utils.escape(err.toString()));"," res.setHeader('Content-Type', 'text/html; charset=utf-8');"," res.end(html);"," });"," });"," // json"," } else if (~accept.indexOf('json')) {"," var error = { message: err.message, stack: err.stack };"," for (var prop in err) error[prop] = err[prop];"," var json = JSON.stringify({ error: error });"," res.setHeader('Content-Type', 'application/json');"," res.end(json);"," // plain text"," } else {"," res.writeHead(res.statusCode, { 'Content-Type': 'text/plain' });"," res.end(err.stack);"," }"," };","};","","/**"," * Template title, framework authors may override this value."," */","","exports.title = 'Connect';"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/favicon.js b/node_modules/express/node_modules/connect/lib-cov/middleware/favicon.js deleted file mode 100644 index 6228079..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/favicon.js +++ /dev/null @@ -1,60 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/favicon.js']) { - _$jscoverage['middleware/favicon.js'] = []; - _$jscoverage['middleware/favicon.js'][13] = 0; - _$jscoverage['middleware/favicon.js'][50] = 0; - _$jscoverage['middleware/favicon.js'][51] = 0; - _$jscoverage['middleware/favicon.js'][56] = 0; - _$jscoverage['middleware/favicon.js'][57] = 0; - _$jscoverage['middleware/favicon.js'][58] = 0; - _$jscoverage['middleware/favicon.js'][59] = 0; - _$jscoverage['middleware/favicon.js'][60] = 0; - _$jscoverage['middleware/favicon.js'][62] = 0; - _$jscoverage['middleware/favicon.js'][63] = 0; - _$jscoverage['middleware/favicon.js'][64] = 0; - _$jscoverage['middleware/favicon.js'][73] = 0; - _$jscoverage['middleware/favicon.js'][74] = 0; - _$jscoverage['middleware/favicon.js'][78] = 0; -} -_$jscoverage['middleware/favicon.js'][13]++; -var fs = require("fs"), utils = require("../utils"); -_$jscoverage['middleware/favicon.js'][50]++; -module.exports = (function favicon(path, options) { - _$jscoverage['middleware/favicon.js'][51]++; - var options = options || {}, path = path || __dirname + "/../public/favicon.ico", maxAge = options.maxAge || 86400000, icon; - _$jscoverage['middleware/favicon.js'][56]++; - return (function favicon(req, res, next) { - _$jscoverage['middleware/favicon.js'][57]++; - if ("/favicon.ico" == req.url) { - _$jscoverage['middleware/favicon.js'][58]++; - if (icon) { - _$jscoverage['middleware/favicon.js'][59]++; - res.writeHead(200, icon.headers); - _$jscoverage['middleware/favicon.js'][60]++; - res.end(icon.body); - } - else { - _$jscoverage['middleware/favicon.js'][62]++; - fs.readFile(path, (function (err, buf) { - _$jscoverage['middleware/favicon.js'][63]++; - if (err) { - _$jscoverage['middleware/favicon.js'][63]++; - return next(err); - } - _$jscoverage['middleware/favicon.js'][64]++; - icon = {headers: {"Content-Type": "image/x-icon", "Content-Length": buf.length, "ETag": "\"" + utils.md5(buf) + "\"", "Cache-Control": "public, max-age=" + (maxAge / 1000)}, body: buf}; - _$jscoverage['middleware/favicon.js'][73]++; - res.writeHead(200, icon.headers); - _$jscoverage['middleware/favicon.js'][74]++; - res.end(icon.body); -})); - } - } - else { - _$jscoverage['middleware/favicon.js'][78]++; - next(); - } -}); -}); -_$jscoverage['middleware/favicon.js'].source = ["","/*!"," * Connect - favicon"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var fs = require('fs')"," , utils = require('../utils');","","/**"," * Favicon:"," *"," * By default serves the connect favicon, or the favicon"," * located by the given `path`."," *"," * Options:"," *"," * - `maxAge` cache-control max-age directive, defaulting to 1 day"," *"," * Examples:"," *"," * Serve default favicon:"," *"," * connect()"," * .use(connect.favicon())"," *"," * Serve favicon before logging for brevity:"," *"," * connect()"," * .use(connect.favicon())"," * .use(connect.logger('dev'))"," *"," * Serve custom favicon:"," *"," * connect()"," * .use(connect.favicon('public/favicon.ico))"," *"," * @param {String} path"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","module.exports = function favicon(path, options){"," var options = options || {}"," , path = path || __dirname + '/../public/favicon.ico'"," , maxAge = options.maxAge || 86400000"," , icon; // favicon cache",""," return function favicon(req, res, next){"," if ('/favicon.ico' == req.url) {"," if (icon) {"," res.writeHead(200, icon.headers);"," res.end(icon.body);"," } else {"," fs.readFile(path, function(err, buf){"," if (err) return next(err);"," icon = {"," headers: {"," 'Content-Type': 'image/x-icon'"," , 'Content-Length': buf.length"," , 'ETag': '\"' + utils.md5(buf) + '\"'"," , 'Cache-Control': 'public, max-age=' + (maxAge / 1000)"," },"," body: buf"," };"," res.writeHead(200, icon.headers);"," res.end(icon.body);"," });"," }"," } else {"," next();"," }"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/json.js b/node_modules/express/node_modules/connect/lib-cov/middleware/json.js deleted file mode 100644 index 87236cf..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/json.js +++ /dev/null @@ -1,117 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/json.js']) { - _$jscoverage['middleware/json.js'] = []; - _$jscoverage['middleware/json.js'][13] = 0; - _$jscoverage['middleware/json.js'][20] = 0; - _$jscoverage['middleware/json.js'][21] = 0; - _$jscoverage['middleware/json.js'][41] = 0; - _$jscoverage['middleware/json.js'][42] = 0; - _$jscoverage['middleware/json.js'][45] = 0; - _$jscoverage['middleware/json.js'][49] = 0; - _$jscoverage['middleware/json.js'][50] = 0; - _$jscoverage['middleware/json.js'][51] = 0; - _$jscoverage['middleware/json.js'][53] = 0; - _$jscoverage['middleware/json.js'][56] = 0; - _$jscoverage['middleware/json.js'][59] = 0; - _$jscoverage['middleware/json.js'][62] = 0; - _$jscoverage['middleware/json.js'][63] = 0; - _$jscoverage['middleware/json.js'][64] = 0; - _$jscoverage['middleware/json.js'][65] = 0; - _$jscoverage['middleware/json.js'][66] = 0; - _$jscoverage['middleware/json.js'][67] = 0; - _$jscoverage['middleware/json.js'][68] = 0; - _$jscoverage['middleware/json.js'][70] = 0; - _$jscoverage['middleware/json.js'][71] = 0; - _$jscoverage['middleware/json.js'][74] = 0; - _$jscoverage['middleware/json.js'][75] = 0; - _$jscoverage['middleware/json.js'][76] = 0; - _$jscoverage['middleware/json.js'][77] = 0; - _$jscoverage['middleware/json.js'][79] = 0; - _$jscoverage['middleware/json.js'][80] = 0; - _$jscoverage['middleware/json.js'][81] = 0; -} -_$jscoverage['middleware/json.js'][13]++; -var utils = require("../utils"), _limit = require("./limit"); -_$jscoverage['middleware/json.js'][20]++; -function noop(req, res, next) { - _$jscoverage['middleware/json.js'][21]++; - next(); -} -_$jscoverage['middleware/json.js'][41]++; -exports = module.exports = (function (options) { - _$jscoverage['middleware/json.js'][42]++; - var options = options || {}, strict = options.strict !== false; - _$jscoverage['middleware/json.js'][45]++; - var limit = options.limit? _limit(options.limit): noop; - _$jscoverage['middleware/json.js'][49]++; - return (function json(req, res, next) { - _$jscoverage['middleware/json.js'][50]++; - if (req._body) { - _$jscoverage['middleware/json.js'][50]++; - return next(); - } - _$jscoverage['middleware/json.js'][51]++; - req.body = req.body || {}; - _$jscoverage['middleware/json.js'][53]++; - if (! utils.hasBody(req)) { - _$jscoverage['middleware/json.js'][53]++; - return next(); - } - _$jscoverage['middleware/json.js'][56]++; - if ("application/json" != utils.mime(req)) { - _$jscoverage['middleware/json.js'][56]++; - return next(); - } - _$jscoverage['middleware/json.js'][59]++; - req._body = true; - _$jscoverage['middleware/json.js'][62]++; - limit(req, res, (function (err) { - _$jscoverage['middleware/json.js'][63]++; - if (err) { - _$jscoverage['middleware/json.js'][63]++; - return next(err); - } - _$jscoverage['middleware/json.js'][64]++; - var buf = ""; - _$jscoverage['middleware/json.js'][65]++; - req.setEncoding("utf8"); - _$jscoverage['middleware/json.js'][66]++; - req.on("data", (function (chunk) { - _$jscoverage['middleware/json.js'][66]++; - buf += chunk; -})); - _$jscoverage['middleware/json.js'][67]++; - req.on("end", (function () { - _$jscoverage['middleware/json.js'][68]++; - var first = buf.trim()[0]; - _$jscoverage['middleware/json.js'][70]++; - if (0 == buf.length) { - _$jscoverage['middleware/json.js'][71]++; - return next(utils.error(400, "invalid json, empty body")); - } - _$jscoverage['middleware/json.js'][74]++; - if (strict && "{" != first && "[" != first) { - _$jscoverage['middleware/json.js'][74]++; - return next(utils.error(400, "invalid json")); - } - _$jscoverage['middleware/json.js'][75]++; - try { - _$jscoverage['middleware/json.js'][76]++; - req.body = JSON.parse(buf, options.reviver); - _$jscoverage['middleware/json.js'][77]++; - next(); - } - catch (err) { - _$jscoverage['middleware/json.js'][79]++; - err.body = buf; - _$jscoverage['middleware/json.js'][80]++; - err.status = 400; - _$jscoverage['middleware/json.js'][81]++; - next(err); - } -})); -})); -}); -}); -_$jscoverage['middleware/json.js'].source = ["","/*!"," * Connect - json"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils')"," , _limit = require('./limit');","","/**"," * noop middleware."," */","","function noop(req, res, next) {"," next();","}","","/**"," * JSON:"," *"," * Parse JSON request bodies, providing the"," * parsed object as `req.body`."," *"," * Options:"," *"," * - `strict` when `false` anything `JSON.parse()` accepts will be parsed"," * - `reviver` used as the second \"reviver\" argument for JSON.parse"," * - `limit` byte limit disabled by default"," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function(options){"," var options = options || {}"," , strict = options.strict !== false;",""," var limit = options.limit"," ? _limit(options.limit)"," : noop;",""," return function json(req, res, next) {"," if (req._body) return next();"," req.body = req.body || {};",""," if (!utils.hasBody(req)) return next();",""," // check Content-Type"," if ('application/json' != utils.mime(req)) return next();",""," // flag as parsed"," req._body = true;",""," // parse"," limit(req, res, function(err){"," if (err) return next(err);"," var buf = '';"," req.setEncoding('utf8');"," req.on('data', function(chunk){ buf += chunk });"," req.on('end', function(){"," var first = buf.trim()[0];",""," if (0 == buf.length) {"," return next(utils.error(400, 'invalid json, empty body'));"," }"," "," if (strict && '{' != first && '[' != first) return next(utils.error(400, 'invalid json'));"," try {"," req.body = JSON.parse(buf, options.reviver);"," next();"," } catch (err){"," err.body = buf;"," err.status = 400;"," next(err);"," }"," });"," });"," }","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/limit.js b/node_modules/express/node_modules/connect/lib-cov/middleware/limit.js deleted file mode 100644 index fa8ea34..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/limit.js +++ /dev/null @@ -1,63 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/limit.js']) { - _$jscoverage['middleware/limit.js'] = []; - _$jscoverage['middleware/limit.js'][12] = 0; - _$jscoverage['middleware/limit.js'][31] = 0; - _$jscoverage['middleware/limit.js'][32] = 0; - _$jscoverage['middleware/limit.js'][33] = 0; - _$jscoverage['middleware/limit.js'][34] = 0; - _$jscoverage['middleware/limit.js'][35] = 0; - _$jscoverage['middleware/limit.js'][41] = 0; - _$jscoverage['middleware/limit.js'][42] = 0; - _$jscoverage['middleware/limit.js'][45] = 0; - _$jscoverage['middleware/limit.js'][48] = 0; - _$jscoverage['middleware/limit.js'][49] = 0; - _$jscoverage['middleware/limit.js'][50] = 0; - _$jscoverage['middleware/limit.js'][53] = 0; -} -_$jscoverage['middleware/limit.js'][12]++; -var utils = require("../utils"); -_$jscoverage['middleware/limit.js'][31]++; -module.exports = (function limit(bytes) { - _$jscoverage['middleware/limit.js'][32]++; - if ("string" == typeof bytes) { - _$jscoverage['middleware/limit.js'][32]++; - bytes = utils.parseBytes(bytes); - } - _$jscoverage['middleware/limit.js'][33]++; - if ("number" != typeof bytes) { - _$jscoverage['middleware/limit.js'][33]++; - throw new Error("limit() bytes required"); - } - _$jscoverage['middleware/limit.js'][34]++; - return (function limit(req, res, next) { - _$jscoverage['middleware/limit.js'][35]++; - var received = 0, len = req.headers["content-length"]? parseInt(req.headers["content-length"], 10): null; - _$jscoverage['middleware/limit.js'][41]++; - if (req._limit) { - _$jscoverage['middleware/limit.js'][41]++; - return next(); - } - _$jscoverage['middleware/limit.js'][42]++; - req._limit = true; - _$jscoverage['middleware/limit.js'][45]++; - if (len && len > bytes) { - _$jscoverage['middleware/limit.js'][45]++; - return next(utils.error(413)); - } - _$jscoverage['middleware/limit.js'][48]++; - req.on("data", (function (chunk) { - _$jscoverage['middleware/limit.js'][49]++; - received += chunk.length; - _$jscoverage['middleware/limit.js'][50]++; - if (received > bytes) { - _$jscoverage['middleware/limit.js'][50]++; - req.destroy(); - } -})); - _$jscoverage['middleware/limit.js'][53]++; - next(); -}); -}); -_$jscoverage['middleware/limit.js'].source = ["","/*!"," * Connect - limit"," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils');","","/**"," * Limit:"," *"," * Limit request bodies to the given size in `bytes`."," *"," * A string representation of the bytesize may also be passed,"," * for example \"5mb\", \"200kb\", \"1gb\", etc."," *"," * connect()"," * .use(connect.limit('5.5mb'))"," * .use(handleImageUpload)"," *"," * @param {Number|String} bytes"," * @return {Function}"," * @api public"," */","","module.exports = function limit(bytes){"," if ('string' == typeof bytes) bytes = utils.parseBytes(bytes);"," if ('number' != typeof bytes) throw new Error('limit() bytes required');"," return function limit(req, res, next){"," var received = 0"," , len = req.headers['content-length']"," ? parseInt(req.headers['content-length'], 10)"," : null;",""," // self-awareness"," if (req._limit) return next();"," req._limit = true;",""," // limit by content-length"," if (len && len > bytes) return next(utils.error(413));",""," // limit"," req.on('data', function(chunk){"," received += chunk.length;"," if (received > bytes) req.destroy();"," });",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/logger.js b/node_modules/express/node_modules/connect/lib-cov/middleware/logger.js deleted file mode 100644 index 75c7a00..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/logger.js +++ /dev/null @@ -1,312 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/logger.js']) { - _$jscoverage['middleware/logger.js'] = []; - _$jscoverage['middleware/logger.js'][12] = 0; - _$jscoverage['middleware/logger.js'][18] = 0; - _$jscoverage['middleware/logger.js'][24] = 0; - _$jscoverage['middleware/logger.js'][90] = 0; - _$jscoverage['middleware/logger.js'][91] = 0; - _$jscoverage['middleware/logger.js'][92] = 0; - _$jscoverage['middleware/logger.js'][93] = 0; - _$jscoverage['middleware/logger.js'][94] = 0; - _$jscoverage['middleware/logger.js'][96] = 0; - _$jscoverage['middleware/logger.js'][100] = 0; - _$jscoverage['middleware/logger.js'][103] = 0; - _$jscoverage['middleware/logger.js'][106] = 0; - _$jscoverage['middleware/logger.js'][109] = 0; - _$jscoverage['middleware/logger.js'][113] = 0; - _$jscoverage['middleware/logger.js'][114] = 0; - _$jscoverage['middleware/logger.js'][120] = 0; - _$jscoverage['middleware/logger.js'][121] = 0; - _$jscoverage['middleware/logger.js'][122] = 0; - _$jscoverage['middleware/logger.js'][123] = 0; - _$jscoverage['middleware/logger.js'][128] = 0; - _$jscoverage['middleware/logger.js'][130] = 0; - _$jscoverage['middleware/logger.js'][135] = 0; - _$jscoverage['middleware/logger.js'][136] = 0; - _$jscoverage['middleware/logger.js'][139] = 0; - _$jscoverage['middleware/logger.js'][140] = 0; - _$jscoverage['middleware/logger.js'][141] = 0; - _$jscoverage['middleware/logger.js'][142] = 0; - _$jscoverage['middleware/logger.js'][145] = 0; - _$jscoverage['middleware/logger.js'][146] = 0; - _$jscoverage['middleware/logger.js'][147] = 0; - _$jscoverage['middleware/logger.js'][148] = 0; - _$jscoverage['middleware/logger.js'][149] = 0; - _$jscoverage['middleware/logger.js'][150] = 0; - _$jscoverage['middleware/logger.js'][151] = 0; - _$jscoverage['middleware/logger.js'][156] = 0; - _$jscoverage['middleware/logger.js'][168] = 0; - _$jscoverage['middleware/logger.js'][169] = 0; - _$jscoverage['middleware/logger.js'][170] = 0; - _$jscoverage['middleware/logger.js'][171] = 0; - _$jscoverage['middleware/logger.js'][173] = 0; - _$jscoverage['middleware/logger.js'][174] = 0; - _$jscoverage['middleware/logger.js'][186] = 0; - _$jscoverage['middleware/logger.js'][187] = 0; - _$jscoverage['middleware/logger.js'][188] = 0; - _$jscoverage['middleware/logger.js'][200] = 0; - _$jscoverage['middleware/logger.js'][201] = 0; - _$jscoverage['middleware/logger.js'][202] = 0; - _$jscoverage['middleware/logger.js'][209] = 0; - _$jscoverage['middleware/logger.js'][215] = 0; - _$jscoverage['middleware/logger.js'][221] = 0; - _$jscoverage['middleware/logger.js'][227] = 0; - _$jscoverage['middleware/logger.js'][228] = 0; - _$jscoverage['middleware/logger.js'][232] = 0; - _$jscoverage['middleware/logger.js'][233] = 0; - _$jscoverage['middleware/logger.js'][234] = 0; - _$jscoverage['middleware/logger.js'][236] = 0; - _$jscoverage['middleware/logger.js'][240] = 0; - _$jscoverage['middleware/logger.js'][253] = 0; - _$jscoverage['middleware/logger.js'][254] = 0; - _$jscoverage['middleware/logger.js'][261] = 0; - _$jscoverage['middleware/logger.js'][262] = 0; - _$jscoverage['middleware/logger.js'][269] = 0; - _$jscoverage['middleware/logger.js'][270] = 0; - _$jscoverage['middleware/logger.js'][277] = 0; - _$jscoverage['middleware/logger.js'][278] = 0; - _$jscoverage['middleware/logger.js'][285] = 0; - _$jscoverage['middleware/logger.js'][286] = 0; - _$jscoverage['middleware/logger.js'][293] = 0; - _$jscoverage['middleware/logger.js'][294] = 0; - _$jscoverage['middleware/logger.js'][301] = 0; - _$jscoverage['middleware/logger.js'][302] = 0; - _$jscoverage['middleware/logger.js'][303] = 0; - _$jscoverage['middleware/logger.js'][304] = 0; - _$jscoverage['middleware/logger.js'][305] = 0; - _$jscoverage['middleware/logger.js'][312] = 0; - _$jscoverage['middleware/logger.js'][313] = 0; - _$jscoverage['middleware/logger.js'][320] = 0; - _$jscoverage['middleware/logger.js'][321] = 0; - _$jscoverage['middleware/logger.js'][328] = 0; - _$jscoverage['middleware/logger.js'][329] = 0; - _$jscoverage['middleware/logger.js'][336] = 0; - _$jscoverage['middleware/logger.js'][337] = 0; -} -_$jscoverage['middleware/logger.js'][12]++; -var bytes = require("bytes"); -_$jscoverage['middleware/logger.js'][18]++; -var buf = []; -_$jscoverage['middleware/logger.js'][24]++; -var defaultBufferDuration = 1000; -_$jscoverage['middleware/logger.js'][90]++; -exports = module.exports = (function logger(options) { - _$jscoverage['middleware/logger.js'][91]++; - if ("object" == typeof options) { - _$jscoverage['middleware/logger.js'][92]++; - options = options || {}; - } - else { - _$jscoverage['middleware/logger.js'][93]++; - if (options) { - _$jscoverage['middleware/logger.js'][94]++; - options = {format: options}; - } - else { - _$jscoverage['middleware/logger.js'][96]++; - options = {}; - } - } - _$jscoverage['middleware/logger.js'][100]++; - var immediate = options.immediate; - _$jscoverage['middleware/logger.js'][103]++; - var fmt = exports[options.format] || options.format || exports["default"]; - _$jscoverage['middleware/logger.js'][106]++; - if ("function" != typeof fmt) { - _$jscoverage['middleware/logger.js'][106]++; - fmt = compile(fmt); - } - _$jscoverage['middleware/logger.js'][109]++; - var stream = options.stream || process.stdout, buffer = options.buffer; - _$jscoverage['middleware/logger.js'][113]++; - if (buffer) { - _$jscoverage['middleware/logger.js'][114]++; - var realStream = stream, interval = "number" == typeof buffer? buffer: defaultBufferDuration; - _$jscoverage['middleware/logger.js'][120]++; - setInterval((function () { - _$jscoverage['middleware/logger.js'][121]++; - if (buf.length) { - _$jscoverage['middleware/logger.js'][122]++; - realStream.write(buf.join("")); - _$jscoverage['middleware/logger.js'][123]++; - buf.length = 0; - } -}), interval); - _$jscoverage['middleware/logger.js'][128]++; - stream = {write: (function (str) { - _$jscoverage['middleware/logger.js'][130]++; - buf.push(str); -})}; - } - _$jscoverage['middleware/logger.js'][135]++; - return (function logger(req, res, next) { - _$jscoverage['middleware/logger.js'][136]++; - req._startTime = new Date(); - _$jscoverage['middleware/logger.js'][139]++; - if (immediate) { - _$jscoverage['middleware/logger.js'][140]++; - var line = fmt(exports, req, res); - _$jscoverage['middleware/logger.js'][141]++; - if (null == line) { - _$jscoverage['middleware/logger.js'][141]++; - return; - } - _$jscoverage['middleware/logger.js'][142]++; - stream.write(line + "\n"); - } - else { - _$jscoverage['middleware/logger.js'][145]++; - var end = res.end; - _$jscoverage['middleware/logger.js'][146]++; - res.end = (function (chunk, encoding) { - _$jscoverage['middleware/logger.js'][147]++; - res.end = end; - _$jscoverage['middleware/logger.js'][148]++; - res.end(chunk, encoding); - _$jscoverage['middleware/logger.js'][149]++; - var line = fmt(exports, req, res); - _$jscoverage['middleware/logger.js'][150]++; - if (null == line) { - _$jscoverage['middleware/logger.js'][150]++; - return; - } - _$jscoverage['middleware/logger.js'][151]++; - stream.write(line + "\n"); -}); - } - _$jscoverage['middleware/logger.js'][156]++; - next(); -}); -}); -_$jscoverage['middleware/logger.js'][168]++; -function compile(fmt) { - _$jscoverage['middleware/logger.js'][169]++; - fmt = fmt.replace(/"/g, "\\\""); - _$jscoverage['middleware/logger.js'][170]++; - var js = " return \"" + fmt.replace(/:([-\w]{2,})(?:\[([^\]]+)\])?/g, (function (_, name, arg) { - _$jscoverage['middleware/logger.js'][171]++; - return "\"\n + (tokens[\"" + name + "\"](req, res, \"" + arg + "\") || \"-\") + \""; -})) + "\";"; - _$jscoverage['middleware/logger.js'][173]++; - return new Function("tokens, req, res", js); -} -_$jscoverage['middleware/logger.js'][174]++; -; -_$jscoverage['middleware/logger.js'][186]++; -exports.token = (function (name, fn) { - _$jscoverage['middleware/logger.js'][187]++; - exports[name] = fn; - _$jscoverage['middleware/logger.js'][188]++; - return this; -}); -_$jscoverage['middleware/logger.js'][200]++; -exports.format = (function (name, str) { - _$jscoverage['middleware/logger.js'][201]++; - exports[name] = str; - _$jscoverage['middleware/logger.js'][202]++; - return this; -}); -_$jscoverage['middleware/logger.js'][209]++; -exports.format("default", ":remote-addr - - [:date] \":method :url HTTP/:http-version\" :status :res[content-length] \":referrer\" \":user-agent\""); -_$jscoverage['middleware/logger.js'][215]++; -exports.format("short", ":remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms"); -_$jscoverage['middleware/logger.js'][221]++; -exports.format("tiny", ":method :url :status :res[content-length] - :response-time ms"); -_$jscoverage['middleware/logger.js'][227]++; -exports.format("dev", (function (tokens, req, res) { - _$jscoverage['middleware/logger.js'][228]++; - var status = res.statusCode, len = parseInt(res.getHeader("Content-Length"), 10), color = 32; - _$jscoverage['middleware/logger.js'][232]++; - if (status >= 500) { - _$jscoverage['middleware/logger.js'][232]++; - color = 31; - } - else { - _$jscoverage['middleware/logger.js'][233]++; - if (status >= 400) { - _$jscoverage['middleware/logger.js'][233]++; - color = 33; - } - else { - _$jscoverage['middleware/logger.js'][234]++; - if (status >= 300) { - _$jscoverage['middleware/logger.js'][234]++; - color = 36; - } - } - } - _$jscoverage['middleware/logger.js'][236]++; - len = isNaN(len)? "": len = " - " + bytes(len); - _$jscoverage['middleware/logger.js'][240]++; - return "\u001b[90m" + req.method + " " + req.originalUrl + " " + "\u001b[" + color + "m" + res.statusCode + " \u001b[90m" + (new Date() - req._startTime) + "ms" + len + "\u001b[0m"; -})); -_$jscoverage['middleware/logger.js'][253]++; -exports.token("url", (function (req) { - _$jscoverage['middleware/logger.js'][254]++; - return req.originalUrl || req.url; -})); -_$jscoverage['middleware/logger.js'][261]++; -exports.token("method", (function (req) { - _$jscoverage['middleware/logger.js'][262]++; - return req.method; -})); -_$jscoverage['middleware/logger.js'][269]++; -exports.token("response-time", (function (req) { - _$jscoverage['middleware/logger.js'][270]++; - return new Date() - req._startTime; -})); -_$jscoverage['middleware/logger.js'][277]++; -exports.token("date", (function () { - _$jscoverage['middleware/logger.js'][278]++; - return new Date().toUTCString(); -})); -_$jscoverage['middleware/logger.js'][285]++; -exports.token("status", (function (req, res) { - _$jscoverage['middleware/logger.js'][286]++; - return res.statusCode; -})); -_$jscoverage['middleware/logger.js'][293]++; -exports.token("referrer", (function (req) { - _$jscoverage['middleware/logger.js'][294]++; - return req.headers.referer || req.headers.referrer; -})); -_$jscoverage['middleware/logger.js'][301]++; -exports.token("remote-addr", (function (req) { - _$jscoverage['middleware/logger.js'][302]++; - if (req.ip) { - _$jscoverage['middleware/logger.js'][302]++; - return req.ip; - } - _$jscoverage['middleware/logger.js'][303]++; - var sock = req.socket; - _$jscoverage['middleware/logger.js'][304]++; - if (sock.socket) { - _$jscoverage['middleware/logger.js'][304]++; - return sock.socket.remoteAddress; - } - _$jscoverage['middleware/logger.js'][305]++; - return sock.remoteAddress; -})); -_$jscoverage['middleware/logger.js'][312]++; -exports.token("http-version", (function (req) { - _$jscoverage['middleware/logger.js'][313]++; - return req.httpVersionMajor + "." + req.httpVersionMinor; -})); -_$jscoverage['middleware/logger.js'][320]++; -exports.token("user-agent", (function (req) { - _$jscoverage['middleware/logger.js'][321]++; - return req.headers["user-agent"]; -})); -_$jscoverage['middleware/logger.js'][328]++; -exports.token("req", (function (req, res, field) { - _$jscoverage['middleware/logger.js'][329]++; - return req.headers[field.toLowerCase()]; -})); -_$jscoverage['middleware/logger.js'][336]++; -exports.token("res", (function (req, res, field) { - _$jscoverage['middleware/logger.js'][337]++; - return (res._headers || {})[field.toLowerCase()]; -})); -_$jscoverage['middleware/logger.js'].source = ["/*!"," * Connect - logger"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var bytes = require('bytes');","","/*!"," * Log buffer."," */","","var buf = [];","","/*!"," * Default log buffer duration."," */","","var defaultBufferDuration = 1000;","","/**"," * Logger:"," *"," * Log requests with the given `options` or a `format` string."," *"," * Options:"," *"," * - `format` Format string, see below for tokens"," * - `stream` Output stream, defaults to _stdout_"," * - `buffer` Buffer duration, defaults to 1000ms when _true_"," * - `immediate` Write log line on request instead of response (for response times)"," *"," * Tokens:"," *"," * - `:req[header]` ex: `:req[Accept]`"," * - `:res[header]` ex: `:res[Content-Length]`"," * - `:http-version`"," * - `:response-time`"," * - `:remote-addr`"," * - `:date`"," * - `:method`"," * - `:url`"," * - `:referrer`"," * - `:user-agent`"," * - `:status`"," *"," * Formats:"," *"," * Pre-defined formats that ship with connect:"," *"," * - `default` ':remote-addr - - [:date] \":method :url HTTP/:http-version\" :status :res[content-length] \":referrer\" \":user-agent\"'"," * - `short` ':remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms'"," * - `tiny` ':method :url :status :res[content-length] - :response-time ms'"," * - `dev` concise output colored by response status for development use"," *"," * Examples:"," *"," * connect.logger() // default"," * connect.logger('short')"," * connect.logger('tiny')"," * connect.logger({ immediate: true, format: 'dev' })"," * connect.logger(':method :url - :referrer')"," * connect.logger(':req[content-type] -> :res[content-type]')"," * connect.logger(function(tokens, req, res){ return 'some format string' })"," *"," * Defining Tokens:"," *"," * To define a token, simply invoke `connect.logger.token()` with the"," * name and a callback function. The value returned is then available"," * as \":type\" in this case."," *"," * connect.logger.token('type', function(req, res){ return req.headers['content-type']; })"," *"," * Defining Formats:"," *"," * All default formats are defined this way, however it's public API as well:"," *"," * connect.logger.format('name', 'string or function')"," *"," * @param {String|Function|Object} format or options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function logger(options) {"," if ('object' == typeof options) {"," options = options || {};"," } else if (options) {"," options = { format: options };"," } else {"," options = {};"," }",""," // output on request instead of response"," var immediate = options.immediate;",""," // format name"," var fmt = exports[options.format] || options.format || exports.default;",""," // compile format"," if ('function' != typeof fmt) fmt = compile(fmt);",""," // options"," var stream = options.stream || process.stdout"," , buffer = options.buffer;",""," // buffering support"," if (buffer) {"," var realStream = stream"," , interval = 'number' == typeof buffer"," ? buffer"," : defaultBufferDuration;",""," // flush interval"," setInterval(function(){"," if (buf.length) {"," realStream.write(buf.join(''));"," buf.length = 0;"," }"," }, interval); ",""," // swap the stream"," stream = {"," write: function(str){"," buf.push(str);"," }"," };"," }",""," return function logger(req, res, next) {"," req._startTime = new Date;",""," // immediate"," if (immediate) {"," var line = fmt(exports, req, res);"," if (null == line) return;"," stream.write(line + '\\n');"," // proxy end to output logging"," } else {"," var end = res.end;"," res.end = function(chunk, encoding){"," res.end = end;"," res.end(chunk, encoding);"," var line = fmt(exports, req, res);"," if (null == line) return;"," stream.write(line + '\\n');"," };"," }","",""," next();"," };","};","","/**"," * Compile `fmt` into a function."," *"," * @param {String} fmt"," * @return {Function}"," * @api private"," */","","function compile(fmt) {"," fmt = fmt.replace(/\"/g, '\\\\\"');"," var js = ' return \"' + fmt.replace(/:([-\\w]{2,})(?:\\[([^\\]]+)\\])?/g, function(_, name, arg){"," return '\"\\n + (tokens[\"' + name + '\"](req, res, \"' + arg + '\") || \"-\") + \"';"," }) + '\";'"," return new Function('tokens, req, res', js);","};","","/**"," * Define a token function with the given `name`,"," * and callback `fn(req, res)`."," *"," * @param {String} name"," * @param {Function} fn"," * @return {Object} exports for chaining"," * @api public"," */","","exports.token = function(name, fn) {"," exports[name] = fn;"," return this;","};","","/**"," * Define a `fmt` with the given `name`."," *"," * @param {String} name"," * @param {String|Function} fmt"," * @return {Object} exports for chaining"," * @api public"," */","","exports.format = function(name, str){"," exports[name] = str;"," return this;","};","","/**"," * Default format."," */","","exports.format('default', ':remote-addr - - [:date] \":method :url HTTP/:http-version\" :status :res[content-length] \":referrer\" \":user-agent\"');","","/**"," * Short format."," */","","exports.format('short', ':remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms');","","/**"," * Tiny format."," */","","exports.format('tiny', ':method :url :status :res[content-length] - :response-time ms');","","/**"," * dev (colored)"," */","","exports.format('dev', function(tokens, req, res){"," var status = res.statusCode"," , len = parseInt(res.getHeader('Content-Length'), 10)"," , color = 32;",""," if (status >= 500) color = 31"," else if (status >= 400) color = 33"," else if (status >= 300) color = 36;",""," len = isNaN(len)"," ? ''"," : len = ' - ' + bytes(len);",""," return '\\033[90m' + req.method"," + ' ' + req.originalUrl + ' '"," + '\\033[' + color + 'm' + res.statusCode"," + ' \\033[90m'"," + (new Date - req._startTime)"," + 'ms' + len"," + '\\033[0m';","});","","/**"," * request url"," */","","exports.token('url', function(req){"," return req.originalUrl || req.url;","});","","/**"," * request method"," */","","exports.token('method', function(req){"," return req.method;","});","","/**"," * response time in milliseconds"," */","","exports.token('response-time', function(req){"," return new Date - req._startTime;","});","","/**"," * UTC date"," */","","exports.token('date', function(){"," return new Date().toUTCString();","});","","/**"," * response status code"," */","","exports.token('status', function(req, res){"," return res.statusCode;","});","","/**"," * normalized referrer"," */","","exports.token('referrer', function(req){"," return req.headers['referer'] || req.headers['referrer'];","});","","/**"," * remote address"," */","","exports.token('remote-addr', function(req){"," if (req.ip) return req.ip;"," var sock = req.socket;"," if (sock.socket) return sock.socket.remoteAddress;"," return sock.remoteAddress;","});","","/**"," * HTTP version"," */","","exports.token('http-version', function(req){"," return req.httpVersionMajor + '.' + req.httpVersionMinor;","});","","/**"," * UA string"," */","","exports.token('user-agent', function(req){"," return req.headers['user-agent'];","});","","/**"," * request header"," */","","exports.token('req', function(req, res, field){"," return req.headers[field.toLowerCase()];","});","","/**"," * response header"," */","","exports.token('res', function(req, res, field){"," return (res._headers || {})[field.toLowerCase()];","});",""]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/methodOverride.js b/node_modules/express/node_modules/connect/lib-cov/middleware/methodOverride.js deleted file mode 100644 index 0a9118c..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/methodOverride.js +++ /dev/null @@ -1,42 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/methodOverride.js']) { - _$jscoverage['middleware/methodOverride.js'] = []; - _$jscoverage['middleware/methodOverride.js'][23] = 0; - _$jscoverage['middleware/methodOverride.js'][24] = 0; - _$jscoverage['middleware/methodOverride.js'][25] = 0; - _$jscoverage['middleware/methodOverride.js'][26] = 0; - _$jscoverage['middleware/methodOverride.js'][29] = 0; - _$jscoverage['middleware/methodOverride.js'][30] = 0; - _$jscoverage['middleware/methodOverride.js'][31] = 0; - _$jscoverage['middleware/methodOverride.js'][33] = 0; - _$jscoverage['middleware/methodOverride.js'][34] = 0; - _$jscoverage['middleware/methodOverride.js'][37] = 0; -} -_$jscoverage['middleware/methodOverride.js'][23]++; -module.exports = (function methodOverride(key) { - _$jscoverage['middleware/methodOverride.js'][24]++; - key = key || "_method"; - _$jscoverage['middleware/methodOverride.js'][25]++; - return (function methodOverride(req, res, next) { - _$jscoverage['middleware/methodOverride.js'][26]++; - req.originalMethod = req.originalMethod || req.method; - _$jscoverage['middleware/methodOverride.js'][29]++; - if (req.body && key in req.body) { - _$jscoverage['middleware/methodOverride.js'][30]++; - req.method = req.body[key].toUpperCase(); - _$jscoverage['middleware/methodOverride.js'][31]++; - delete req.body[key]; - } - else { - _$jscoverage['middleware/methodOverride.js'][33]++; - if (req.headers["x-http-method-override"]) { - _$jscoverage['middleware/methodOverride.js'][34]++; - req.method = req.headers["x-http-method-override"].toUpperCase(); - } - } - _$jscoverage['middleware/methodOverride.js'][37]++; - next(); -}); -}); -_$jscoverage['middleware/methodOverride.js'].source = ["","/*!"," * Connect - methodOverride"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Method Override:"," * "," * Provides faux HTTP method support."," * "," * Pass an optional `key` to use when checking for"," * a method override, othewise defaults to _\\_method_."," * The original method is available via `req.originalMethod`."," *"," * @param {String} key"," * @return {Function}"," * @api public"," */","","module.exports = function methodOverride(key){"," key = key || \"_method\";"," return function methodOverride(req, res, next) {"," req.originalMethod = req.originalMethod || req.method;",""," // req.body"," if (req.body && key in req.body) {"," req.method = req.body[key].toUpperCase();"," delete req.body[key];"," // check X-HTTP-Method-Override"," } else if (req.headers['x-http-method-override']) {"," req.method = req.headers['x-http-method-override'].toUpperCase();"," }"," "," next();"," };","};",""]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/multipart.js b/node_modules/express/node_modules/connect/lib-cov/middleware/multipart.js deleted file mode 100644 index dfcde09..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/multipart.js +++ /dev/null @@ -1,183 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/multipart.js']) { - _$jscoverage['middleware/multipart.js'] = []; - _$jscoverage['middleware/multipart.js'][12] = 0; - _$jscoverage['middleware/multipart.js'][21] = 0; - _$jscoverage['middleware/multipart.js'][22] = 0; - _$jscoverage['middleware/multipart.js'][52] = 0; - _$jscoverage['middleware/multipart.js'][53] = 0; - _$jscoverage['middleware/multipart.js'][55] = 0; - _$jscoverage['middleware/multipart.js'][59] = 0; - _$jscoverage['middleware/multipart.js'][60] = 0; - _$jscoverage['middleware/multipart.js'][61] = 0; - _$jscoverage['middleware/multipart.js'][62] = 0; - _$jscoverage['middleware/multipart.js'][64] = 0; - _$jscoverage['middleware/multipart.js'][67] = 0; - _$jscoverage['middleware/multipart.js'][70] = 0; - _$jscoverage['middleware/multipart.js'][73] = 0; - _$jscoverage['middleware/multipart.js'][76] = 0; - _$jscoverage['middleware/multipart.js'][77] = 0; - _$jscoverage['middleware/multipart.js'][79] = 0; - _$jscoverage['middleware/multipart.js'][84] = 0; - _$jscoverage['middleware/multipart.js'][85] = 0; - _$jscoverage['middleware/multipart.js'][88] = 0; - _$jscoverage['middleware/multipart.js'][89] = 0; - _$jscoverage['middleware/multipart.js'][90] = 0; - _$jscoverage['middleware/multipart.js'][91] = 0; - _$jscoverage['middleware/multipart.js'][92] = 0; - _$jscoverage['middleware/multipart.js'][94] = 0; - _$jscoverage['middleware/multipart.js'][98] = 0; - _$jscoverage['middleware/multipart.js'][99] = 0; - _$jscoverage['middleware/multipart.js'][102] = 0; - _$jscoverage['middleware/multipart.js'][103] = 0; - _$jscoverage['middleware/multipart.js'][106] = 0; - _$jscoverage['middleware/multipart.js'][107] = 0; - _$jscoverage['middleware/multipart.js'][108] = 0; - _$jscoverage['middleware/multipart.js'][109] = 0; - _$jscoverage['middleware/multipart.js'][111] = 0; - _$jscoverage['middleware/multipart.js'][114] = 0; - _$jscoverage['middleware/multipart.js'][115] = 0; - _$jscoverage['middleware/multipart.js'][116] = 0; - _$jscoverage['middleware/multipart.js'][117] = 0; - _$jscoverage['middleware/multipart.js'][118] = 0; - _$jscoverage['middleware/multipart.js'][119] = 0; - _$jscoverage['middleware/multipart.js'][121] = 0; - _$jscoverage['middleware/multipart.js'][125] = 0; - _$jscoverage['middleware/multipart.js'][127] = 0; - _$jscoverage['middleware/multipart.js'][128] = 0; - _$jscoverage['middleware/multipart.js'][129] = 0; -} -_$jscoverage['middleware/multipart.js'][12]++; -var formidable = require("formidable"), _limit = require("./limit"), utils = require("../utils"), qs = require("qs"); -_$jscoverage['middleware/multipart.js'][21]++; -function noop(req, res, next) { - _$jscoverage['middleware/multipart.js'][22]++; - next(); -} -_$jscoverage['middleware/multipart.js'][52]++; -exports = module.exports = (function (options) { - _$jscoverage['middleware/multipart.js'][53]++; - options = options || {}; - _$jscoverage['middleware/multipart.js'][55]++; - var limit = options.limit? _limit(options.limit): noop; - _$jscoverage['middleware/multipart.js'][59]++; - return (function multipart(req, res, next) { - _$jscoverage['middleware/multipart.js'][60]++; - if (req._body) { - _$jscoverage['middleware/multipart.js'][60]++; - return next(); - } - _$jscoverage['middleware/multipart.js'][61]++; - req.body = req.body || {}; - _$jscoverage['middleware/multipart.js'][62]++; - req.files = req.files || {}; - _$jscoverage['middleware/multipart.js'][64]++; - if (! utils.hasBody(req)) { - _$jscoverage['middleware/multipart.js'][64]++; - return next(); - } - _$jscoverage['middleware/multipart.js'][67]++; - if ("GET" == req.method || "HEAD" == req.method) { - _$jscoverage['middleware/multipart.js'][67]++; - return next(); - } - _$jscoverage['middleware/multipart.js'][70]++; - if ("multipart/form-data" != utils.mime(req)) { - _$jscoverage['middleware/multipart.js'][70]++; - return next(); - } - _$jscoverage['middleware/multipart.js'][73]++; - req._body = true; - _$jscoverage['middleware/multipart.js'][76]++; - limit(req, res, (function (err) { - _$jscoverage['middleware/multipart.js'][77]++; - if (err) { - _$jscoverage['middleware/multipart.js'][77]++; - return next(err); - } - _$jscoverage['middleware/multipart.js'][79]++; - var form = new formidable.IncomingForm(), data = {}, files = {}, done; - _$jscoverage['middleware/multipart.js'][84]++; - Object.keys(options).forEach((function (key) { - _$jscoverage['middleware/multipart.js'][85]++; - form[key] = options[key]; -})); - _$jscoverage['middleware/multipart.js'][88]++; - function ondata(name, val, data) { - _$jscoverage['middleware/multipart.js'][89]++; - if (Array.isArray(data[name])) { - _$jscoverage['middleware/multipart.js'][90]++; - data[name].push(val); - } - else { - _$jscoverage['middleware/multipart.js'][91]++; - if (data[name]) { - _$jscoverage['middleware/multipart.js'][92]++; - data[name] = [data[name], val]; - } - else { - _$jscoverage['middleware/multipart.js'][94]++; - data[name] = val; - } - } -} - _$jscoverage['middleware/multipart.js'][98]++; - form.on("field", (function (name, val) { - _$jscoverage['middleware/multipart.js'][99]++; - ondata(name, val, data); -})); - _$jscoverage['middleware/multipart.js'][102]++; - form.on("file", (function (name, val) { - _$jscoverage['middleware/multipart.js'][103]++; - ondata(name, val, files); -})); - _$jscoverage['middleware/multipart.js'][106]++; - form.on("error", (function (err) { - _$jscoverage['middleware/multipart.js'][107]++; - if (! options.defer) { - _$jscoverage['middleware/multipart.js'][108]++; - err.status = 400; - _$jscoverage['middleware/multipart.js'][109]++; - next(err); - } - _$jscoverage['middleware/multipart.js'][111]++; - done = true; -})); - _$jscoverage['middleware/multipart.js'][114]++; - form.on("end", (function () { - _$jscoverage['middleware/multipart.js'][115]++; - if (done) { - _$jscoverage['middleware/multipart.js'][115]++; - return; - } - _$jscoverage['middleware/multipart.js'][116]++; - try { - _$jscoverage['middleware/multipart.js'][117]++; - req.body = qs.parse(data); - _$jscoverage['middleware/multipart.js'][118]++; - req.files = qs.parse(files); - _$jscoverage['middleware/multipart.js'][119]++; - if (! options.defer) { - _$jscoverage['middleware/multipart.js'][119]++; - next(); - } - } - catch (err) { - _$jscoverage['middleware/multipart.js'][121]++; - form.emit("error", err); - } -})); - _$jscoverage['middleware/multipart.js'][125]++; - form.parse(req); - _$jscoverage['middleware/multipart.js'][127]++; - if (options.defer) { - _$jscoverage['middleware/multipart.js'][128]++; - req.form = form; - _$jscoverage['middleware/multipart.js'][129]++; - next(); - } -})); -}); -}); -_$jscoverage['middleware/multipart.js'].source = ["/*!"," * Connect - multipart"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var formidable = require('formidable')"," , _limit = require('./limit')"," , utils = require('../utils')"," , qs = require('qs');","","/**"," * noop middleware."," */","","function noop(req, res, next) {"," next();","}","","/**"," * Multipart:"," * "," * Parse multipart/form-data request bodies,"," * providing the parsed object as `req.body`"," * and `req.files`."," *"," * Configuration:"," *"," * The options passed are merged with [formidable](https://github.com/felixge/node-formidable)'s"," * `IncomingForm` object, allowing you to configure the upload directory,"," * size limits, etc. For example if you wish to change the upload dir do the following."," *"," * app.use(connect.multipart({ uploadDir: path }));"," *"," * Options:"," *"," * - `limit` byte limit defaulting to none"," * - `defer` defers processing and exposes the Formidable form object as `req.form`."," * `next()` is called without waiting for the form's \"end\" event."," * This option is useful if you need to bind to the \"progress\" event, for example."," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function(options){"," options = options || {};",""," var limit = options.limit"," ? _limit(options.limit)"," : noop;",""," return function multipart(req, res, next) {"," if (req._body) return next();"," req.body = req.body || {};"," req.files = req.files || {};",""," if (!utils.hasBody(req)) return next();",""," // ignore GET"," if ('GET' == req.method || 'HEAD' == req.method) return next();",""," // check Content-Type"," if ('multipart/form-data' != utils.mime(req)) return next();",""," // flag as parsed"," req._body = true;",""," // parse"," limit(req, res, function(err){"," if (err) return next(err);",""," var form = new formidable.IncomingForm"," , data = {}"," , files = {}"," , done;",""," Object.keys(options).forEach(function(key){"," form[key] = options[key];"," });",""," function ondata(name, val, data){"," if (Array.isArray(data[name])) {"," data[name].push(val);"," } else if (data[name]) {"," data[name] = [data[name], val];"," } else {"," data[name] = val;"," }"," }",""," form.on('field', function(name, val){"," ondata(name, val, data);"," });",""," form.on('file', function(name, val){"," ondata(name, val, files);"," });",""," form.on('error', function(err){"," if (!options.defer) {"," err.status = 400;"," next(err);"," }"," done = true;"," });",""," form.on('end', function(){"," if (done) return;"," try {"," req.body = qs.parse(data);"," req.files = qs.parse(files);"," if (!options.defer) next();"," } catch (err) {"," form.emit('error', err);"," }"," });",""," form.parse(req);",""," if (options.defer) {"," req.form = form;"," next();"," }"," });"," }","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/query.js b/node_modules/express/node_modules/connect/lib-cov/middleware/query.js deleted file mode 100644 index bd27ff6..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/query.js +++ /dev/null @@ -1,27 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/query.js']) { - _$jscoverage['middleware/query.js'] = []; - _$jscoverage['middleware/query.js'][12] = 0; - _$jscoverage['middleware/query.js'][36] = 0; - _$jscoverage['middleware/query.js'][37] = 0; - _$jscoverage['middleware/query.js'][38] = 0; - _$jscoverage['middleware/query.js'][39] = 0; - _$jscoverage['middleware/query.js'][44] = 0; -} -_$jscoverage['middleware/query.js'][12]++; -var qs = require("qs"), parse = require("../utils").parseUrl; -_$jscoverage['middleware/query.js'][36]++; -module.exports = (function query(options) { - _$jscoverage['middleware/query.js'][37]++; - return (function query(req, res, next) { - _$jscoverage['middleware/query.js'][38]++; - if (! req.query) { - _$jscoverage['middleware/query.js'][39]++; - req.query = ~ req.url.indexOf("?")? qs.parse(parse(req).query, options): {}; - } - _$jscoverage['middleware/query.js'][44]++; - next(); -}); -}); -_$jscoverage['middleware/query.js'].source = ["/*!"," * Connect - query"," * Copyright(c) 2011 TJ Holowaychuk"," * Copyright(c) 2011 Sencha Inc."," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var qs = require('qs')"," , parse = require('../utils').parseUrl;","","/**"," * Query:"," *"," * Automatically parse the query-string when available,"," * populating the `req.query` object."," *"," * Examples:"," *"," * connect()"," * .use(connect.query())"," * .use(function(req, res){"," * res.end(JSON.stringify(req.query));"," * });"," *"," * The `options` passed are provided to qs.parse function."," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","module.exports = function query(options){"," return function query(req, res, next){"," if (!req.query) {"," req.query = ~req.url.indexOf('?')"," ? qs.parse(parse(req).query, options)"," : {};"," }",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/responseTime.js b/node_modules/express/node_modules/connect/lib-cov/middleware/responseTime.js deleted file mode 100644 index 954e040..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/responseTime.js +++ /dev/null @@ -1,39 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/responseTime.js']) { - _$jscoverage['middleware/responseTime.js'] = []; - _$jscoverage['middleware/responseTime.js'][18] = 0; - _$jscoverage['middleware/responseTime.js'][19] = 0; - _$jscoverage['middleware/responseTime.js'][20] = 0; - _$jscoverage['middleware/responseTime.js'][22] = 0; - _$jscoverage['middleware/responseTime.js'][23] = 0; - _$jscoverage['middleware/responseTime.js'][25] = 0; - _$jscoverage['middleware/responseTime.js'][26] = 0; - _$jscoverage['middleware/responseTime.js'][27] = 0; - _$jscoverage['middleware/responseTime.js'][30] = 0; -} -_$jscoverage['middleware/responseTime.js'][18]++; -module.exports = (function responseTime() { - _$jscoverage['middleware/responseTime.js'][19]++; - return (function (req, res, next) { - _$jscoverage['middleware/responseTime.js'][20]++; - var start = new Date(); - _$jscoverage['middleware/responseTime.js'][22]++; - if (res._responseTime) { - _$jscoverage['middleware/responseTime.js'][22]++; - return next(); - } - _$jscoverage['middleware/responseTime.js'][23]++; - res._responseTime = true; - _$jscoverage['middleware/responseTime.js'][25]++; - res.on("header", (function () { - _$jscoverage['middleware/responseTime.js'][26]++; - var duration = new Date() - start; - _$jscoverage['middleware/responseTime.js'][27]++; - res.setHeader("X-Response-Time", duration + "ms"); -})); - _$jscoverage['middleware/responseTime.js'][30]++; - next(); -}); -}); -_$jscoverage['middleware/responseTime.js'].source = ["","/*!"," * Connect - responseTime"," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Reponse time:"," *"," * Adds the `X-Response-Time` header displaying the response"," * duration in milliseconds."," *"," * @return {Function}"," * @api public"," */","","module.exports = function responseTime(){"," return function(req, res, next){"," var start = new Date;",""," if (res._responseTime) return next();"," res._responseTime = true;",""," res.on('header', function(){"," var duration = new Date - start;"," res.setHeader('X-Response-Time', duration + 'ms');"," });",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/session.js b/node_modules/express/node_modules/connect/lib-cov/middleware/session.js deleted file mode 100644 index 5ff99f8..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/session.js +++ /dev/null @@ -1,321 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/session.js']) { - _$jscoverage['middleware/session.js'] = []; - _$jscoverage['middleware/session.js'][13] = 0; - _$jscoverage['middleware/session.js'][25] = 0; - _$jscoverage['middleware/session.js'][31] = 0; - _$jscoverage['middleware/session.js'][37] = 0; - _$jscoverage['middleware/session.js'][38] = 0; - _$jscoverage['middleware/session.js'][39] = 0; - _$jscoverage['middleware/session.js'][40] = 0; - _$jscoverage['middleware/session.js'][46] = 0; - _$jscoverage['middleware/session.js'][188] = 0; - _$jscoverage['middleware/session.js'][189] = 0; - _$jscoverage['middleware/session.js'][198] = 0; - _$jscoverage['middleware/session.js'][199] = 0; - _$jscoverage['middleware/session.js'][203] = 0; - _$jscoverage['middleware/session.js'][204] = 0; - _$jscoverage['middleware/session.js'][205] = 0; - _$jscoverage['middleware/session.js'][206] = 0; - _$jscoverage['middleware/session.js'][209] = 0; - _$jscoverage['middleware/session.js'][210] = 0; - _$jscoverage['middleware/session.js'][212] = 0; - _$jscoverage['middleware/session.js'][214] = 0; - _$jscoverage['middleware/session.js'][218] = 0; - _$jscoverage['middleware/session.js'][221] = 0; - _$jscoverage['middleware/session.js'][225] = 0; - _$jscoverage['middleware/session.js'][228] = 0; - _$jscoverage['middleware/session.js'][231] = 0; - _$jscoverage['middleware/session.js'][235] = 0; - _$jscoverage['middleware/session.js'][238] = 0; - _$jscoverage['middleware/session.js'][241] = 0; - _$jscoverage['middleware/session.js'][243] = 0; - _$jscoverage['middleware/session.js'][244] = 0; - _$jscoverage['middleware/session.js'][248] = 0; - _$jscoverage['middleware/session.js'][249] = 0; - _$jscoverage['middleware/session.js'][250] = 0; - _$jscoverage['middleware/session.js'][257] = 0; - _$jscoverage['middleware/session.js'][260] = 0; - _$jscoverage['middleware/session.js'][261] = 0; - _$jscoverage['middleware/session.js'][263] = 0; - _$jscoverage['middleware/session.js'][264] = 0; - _$jscoverage['middleware/session.js'][267] = 0; - _$jscoverage['middleware/session.js'][268] = 0; - _$jscoverage['middleware/session.js'][269] = 0; - _$jscoverage['middleware/session.js'][270] = 0; - _$jscoverage['middleware/session.js'][274] = 0; - _$jscoverage['middleware/session.js'][275] = 0; - _$jscoverage['middleware/session.js'][276] = 0; - _$jscoverage['middleware/session.js'][277] = 0; - _$jscoverage['middleware/session.js'][278] = 0; - _$jscoverage['middleware/session.js'][279] = 0; - _$jscoverage['middleware/session.js'][280] = 0; - _$jscoverage['middleware/session.js'][281] = 0; - _$jscoverage['middleware/session.js'][282] = 0; - _$jscoverage['middleware/session.js'][287] = 0; - _$jscoverage['middleware/session.js'][288] = 0; - _$jscoverage['middleware/session.js'][292] = 0; - _$jscoverage['middleware/session.js'][295] = 0; - _$jscoverage['middleware/session.js'][296] = 0; - _$jscoverage['middleware/session.js'][297] = 0; - _$jscoverage['middleware/session.js'][298] = 0; - _$jscoverage['middleware/session.js'][299] = 0; - _$jscoverage['middleware/session.js'][303] = 0; - _$jscoverage['middleware/session.js'][304] = 0; - _$jscoverage['middleware/session.js'][305] = 0; - _$jscoverage['middleware/session.js'][307] = 0; - _$jscoverage['middleware/session.js'][308] = 0; - _$jscoverage['middleware/session.js'][309] = 0; - _$jscoverage['middleware/session.js'][310] = 0; - _$jscoverage['middleware/session.js'][314] = 0; - _$jscoverage['middleware/session.js'][315] = 0; - _$jscoverage['middleware/session.js'][316] = 0; - _$jscoverage['middleware/session.js'][317] = 0; - _$jscoverage['middleware/session.js'][318] = 0; - _$jscoverage['middleware/session.js'][320] = 0; - _$jscoverage['middleware/session.js'][323] = 0; - _$jscoverage['middleware/session.js'][324] = 0; - _$jscoverage['middleware/session.js'][325] = 0; - _$jscoverage['middleware/session.js'][326] = 0; - _$jscoverage['middleware/session.js'][329] = 0; - _$jscoverage['middleware/session.js'][330] = 0; - _$jscoverage['middleware/session.js'][331] = 0; - _$jscoverage['middleware/session.js'][332] = 0; - _$jscoverage['middleware/session.js'][333] = 0; - _$jscoverage['middleware/session.js'][337] = 0; - _$jscoverage['middleware/session.js'][348] = 0; - _$jscoverage['middleware/session.js'][349] = 0; - _$jscoverage['middleware/session.js'][350] = 0; -} -_$jscoverage['middleware/session.js'][13]++; -var Session = require("./session/session"), debug = require("debug")("connect:session"), MemoryStore = require("./session/memory"), signature = require("cookie-signature"), Cookie = require("./session/cookie"), Store = require("./session/store"), utils = require("./../utils"), parse = utils.parseUrl, crc16 = require("crc").crc16; -_$jscoverage['middleware/session.js'][25]++; -var env = process.env.NODE_ENV; -_$jscoverage['middleware/session.js'][31]++; -exports = module.exports = session; -_$jscoverage['middleware/session.js'][37]++; -exports.Store = Store; -_$jscoverage['middleware/session.js'][38]++; -exports.Cookie = Cookie; -_$jscoverage['middleware/session.js'][39]++; -exports.Session = Session; -_$jscoverage['middleware/session.js'][40]++; -exports.MemoryStore = MemoryStore; -_$jscoverage['middleware/session.js'][46]++; -var warning = "Warning: connection.session() MemoryStore is not\ndesigned for a production environment, as it will leak\nmemory, and will not scale past a single process."; -_$jscoverage['middleware/session.js'][188]++; -function session(options) { - _$jscoverage['middleware/session.js'][189]++; - var options = options || {}, key = options.key || "connect.sid", store = options.store || new MemoryStore(), cookie = options.cookie || {}, trustProxy = options.proxy, storeReady = true; - _$jscoverage['middleware/session.js'][198]++; - if ("production" == env && store instanceof MemoryStore) { - _$jscoverage['middleware/session.js'][199]++; - console.warn(warning); - } - _$jscoverage['middleware/session.js'][203]++; - store.generate = (function (req) { - _$jscoverage['middleware/session.js'][204]++; - req.sessionID = utils.uid(24); - _$jscoverage['middleware/session.js'][205]++; - req.session = new Session(req); - _$jscoverage['middleware/session.js'][206]++; - req.session.cookie = new Cookie(cookie); -}); - _$jscoverage['middleware/session.js'][209]++; - store.on("disconnect", (function () { - _$jscoverage['middleware/session.js'][209]++; - storeReady = false; -})); - _$jscoverage['middleware/session.js'][210]++; - store.on("connect", (function () { - _$jscoverage['middleware/session.js'][210]++; - storeReady = true; -})); - _$jscoverage['middleware/session.js'][212]++; - return (function session(req, res, next) { - _$jscoverage['middleware/session.js'][214]++; - if (req.session) { - _$jscoverage['middleware/session.js'][214]++; - return next(); - } - _$jscoverage['middleware/session.js'][218]++; - if (! storeReady) { - _$jscoverage['middleware/session.js'][218]++; - return debug("store is disconnected"), next(); - } - _$jscoverage['middleware/session.js'][221]++; - if (0 != req.originalUrl.indexOf(cookie.path || "/")) { - _$jscoverage['middleware/session.js'][221]++; - return next(); - } - _$jscoverage['middleware/session.js'][225]++; - var secret = options.secret || req.secret; - _$jscoverage['middleware/session.js'][228]++; - if (! secret) { - _$jscoverage['middleware/session.js'][228]++; - throw new Error("`secret` option required for sessions"); - } - _$jscoverage['middleware/session.js'][231]++; - var originalHash, originalId; - _$jscoverage['middleware/session.js'][235]++; - req.sessionStore = store; - _$jscoverage['middleware/session.js'][238]++; - var rawCookie = req.cookies[key]; - _$jscoverage['middleware/session.js'][241]++; - var unsignedCookie = req.signedCookies[key]; - _$jscoverage['middleware/session.js'][243]++; - if (! unsignedCookie && rawCookie) { - _$jscoverage['middleware/session.js'][244]++; - unsignedCookie = utils.parseSignedCookie(rawCookie, secret); - } - _$jscoverage['middleware/session.js'][248]++; - res.on("header", (function () { - _$jscoverage['middleware/session.js'][249]++; - if (! req.session) { - _$jscoverage['middleware/session.js'][249]++; - return; - } - _$jscoverage['middleware/session.js'][250]++; - var cookie = req.session.cookie, proto = (req.headers["x-forwarded-proto"] || "").toLowerCase(), tls = req.connection.encrypted || (trustProxy && "https" == proto), secured = cookie.secure && tls, isNew = unsignedCookie != req.sessionID; - _$jscoverage['middleware/session.js'][257]++; - if (cookie.secure && ! secured) { - _$jscoverage['middleware/session.js'][257]++; - return debug("not secured"); - } - _$jscoverage['middleware/session.js'][260]++; - if (null == cookie.expires) { - _$jscoverage['middleware/session.js'][261]++; - if (! isNew) { - _$jscoverage['middleware/session.js'][261]++; - return debug("already set browser-session cookie"); - } - } - else { - _$jscoverage['middleware/session.js'][263]++; - if (originalHash == hash(req.session) && originalId == req.session.id) { - _$jscoverage['middleware/session.js'][264]++; - return debug("unmodified session"); - } - } - _$jscoverage['middleware/session.js'][267]++; - var val = "s:" + signature.sign(req.sessionID, secret); - _$jscoverage['middleware/session.js'][268]++; - val = cookie.serialize(key, val); - _$jscoverage['middleware/session.js'][269]++; - debug("set-cookie %s", val); - _$jscoverage['middleware/session.js'][270]++; - res.setHeader("Set-Cookie", val); -})); - _$jscoverage['middleware/session.js'][274]++; - var end = res.end; - _$jscoverage['middleware/session.js'][275]++; - res.end = (function (data, encoding) { - _$jscoverage['middleware/session.js'][276]++; - res.end = end; - _$jscoverage['middleware/session.js'][277]++; - if (! req.session) { - _$jscoverage['middleware/session.js'][277]++; - return res.end(data, encoding); - } - _$jscoverage['middleware/session.js'][278]++; - debug("saving"); - _$jscoverage['middleware/session.js'][279]++; - req.session.resetMaxAge(); - _$jscoverage['middleware/session.js'][280]++; - req.session.save((function () { - _$jscoverage['middleware/session.js'][281]++; - debug("saved"); - _$jscoverage['middleware/session.js'][282]++; - res.end(data, encoding); -})); -}); - _$jscoverage['middleware/session.js'][287]++; - function generate() { - _$jscoverage['middleware/session.js'][288]++; - store.generate(req); -} - _$jscoverage['middleware/session.js'][292]++; - req.sessionID = unsignedCookie; - _$jscoverage['middleware/session.js'][295]++; - if (! req.sessionID) { - _$jscoverage['middleware/session.js'][296]++; - debug("no SID sent, generating session"); - _$jscoverage['middleware/session.js'][297]++; - generate(); - _$jscoverage['middleware/session.js'][298]++; - next(); - _$jscoverage['middleware/session.js'][299]++; - return; - } - _$jscoverage['middleware/session.js'][303]++; - var pause = utils.pause(req); - _$jscoverage['middleware/session.js'][304]++; - debug("fetching %s", req.sessionID); - _$jscoverage['middleware/session.js'][305]++; - store.get(req.sessionID, (function (err, sess) { - _$jscoverage['middleware/session.js'][307]++; - var _next = next; - _$jscoverage['middleware/session.js'][308]++; - next = (function (err) { - _$jscoverage['middleware/session.js'][309]++; - _next(err); - _$jscoverage['middleware/session.js'][310]++; - pause.resume(); -}); - _$jscoverage['middleware/session.js'][314]++; - if (err) { - _$jscoverage['middleware/session.js'][315]++; - debug("error"); - _$jscoverage['middleware/session.js'][316]++; - if ("ENOENT" == err.code) { - _$jscoverage['middleware/session.js'][317]++; - generate(); - _$jscoverage['middleware/session.js'][318]++; - next(); - } - else { - _$jscoverage['middleware/session.js'][320]++; - next(err); - } - } - else { - _$jscoverage['middleware/session.js'][323]++; - if (! sess) { - _$jscoverage['middleware/session.js'][324]++; - debug("no session found"); - _$jscoverage['middleware/session.js'][325]++; - generate(); - _$jscoverage['middleware/session.js'][326]++; - next(); - } - else { - _$jscoverage['middleware/session.js'][329]++; - debug("session found"); - _$jscoverage['middleware/session.js'][330]++; - store.createSession(req, sess); - _$jscoverage['middleware/session.js'][331]++; - originalId = req.sessionID; - _$jscoverage['middleware/session.js'][332]++; - originalHash = hash(sess); - _$jscoverage['middleware/session.js'][333]++; - next(); - } - } -})); -}); -} -_$jscoverage['middleware/session.js'][337]++; -; -_$jscoverage['middleware/session.js'][348]++; -function hash(sess) { - _$jscoverage['middleware/session.js'][349]++; - return crc16(JSON.stringify(sess, (function (key, val) { - _$jscoverage['middleware/session.js'][350]++; - if ("cookie" != key) { - _$jscoverage['middleware/session.js'][350]++; - return val; - } -}))); -} -_$jscoverage['middleware/session.js'].source = ["","/*!"," * Connect - session"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var Session = require('./session/session')"," , debug = require('debug')('connect:session')"," , MemoryStore = require('./session/memory')"," , signature = require('cookie-signature')"," , Cookie = require('./session/cookie')"," , Store = require('./session/store')"," , utils = require('./../utils')"," , parse = utils.parseUrl"," , crc16 = require('crc').crc16;","","// environment","","var env = process.env.NODE_ENV;","","/**"," * Expose the middleware."," */","","exports = module.exports = session;","","/**"," * Expose constructors."," */","","exports.Store = Store;","exports.Cookie = Cookie;","exports.Session = Session;","exports.MemoryStore = MemoryStore;","","/**"," * Warning message for `MemoryStore` usage in production."," */","","var warning = 'Warning: connection.session() MemoryStore is not\\n'"," + 'designed for a production environment, as it will leak\\n'"," + 'memory, and will not scale past a single process.';","","/**"," * Session:"," * "," * Setup session store with the given `options`."," *"," * Session data is _not_ saved in the cookie itself, however"," * cookies are used, so we must use the [cookieParser()](cookieParser.html)"," * middleware _before_ `session()`."," *"," * Examples:"," *"," * connect()"," * .use(connect.cookieParser())"," * .use(connect.session({ secret: 'keyboard cat', key: 'sid', cookie: { secure: true }}))"," *"," * Options:"," *"," * - `key` cookie name defaulting to `connect.sid`"," * - `store` session store instance"," * - `secret` session cookie is signed with this secret to prevent tampering"," * - `cookie` session cookie settings, defaulting to `{ path: '/', httpOnly: true, maxAge: null }`"," * - `proxy` trust the reverse proxy when setting secure cookies (via \"x-forwarded-proto\")"," *"," * Cookie option:"," *"," * By default `cookie.maxAge` is `null`, meaning no \"expires\" parameter is set"," * so the cookie becomes a browser-session cookie. When the user closes the "," * browser the cookie (and session) will be removed."," *"," * ## req.session"," *"," * To store or access session data, simply use the request property `req.session`,"," * which is (generally) serialized as JSON by the store, so nested objects "," * are typically fine. For example below is a user-specific view counter:"," *"," * connect()"," * .use(connect.favicon())"," * .use(connect.cookieParser())"," * .use(connect.session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }}))"," * .use(function(req, res, next){"," * var sess = req.session;"," * if (sess.views) {"," * res.setHeader('Content-Type', 'text/html');"," * res.write('<p>views: ' + sess.views + '</p>');"," * res.write('<p>expires in: ' + (sess.cookie.maxAge / 1000) + 's</p>');"," * res.end();"," * sess.views++;"," * } else {"," * sess.views = 1;"," * res.end('welcome to the session demo. refresh!');"," * }"," * }"," * )).listen(3000);"," *"," * ## Session#regenerate()"," *"," * To regenerate the session simply invoke the method, once complete"," * a new SID and `Session` instance will be initialized at `req.session`."," *"," * req.session.regenerate(function(err){"," * // will have a new session here"," * });"," *"," * ## Session#destroy()"," *"," * Destroys the session, removing `req.session`, will be re-generated next request."," *"," * req.session.destroy(function(err){"," * // cannot access session here"," * });"," * "," * ## Session#reload()"," *"," * Reloads the session data."," *"," * req.session.reload(function(err){"," * // session updated"," * });"," *"," * ## Session#save()"," *"," * Save the session."," *"," * req.session.save(function(err){"," * // session saved"," * });"," *"," * ## Session#touch()"," *"," * Updates the `.maxAge` property. Typically this is"," * not necessary to call, as the session middleware does this for you."," *"," * ## Session#cookie"," *"," * Each session has a unique cookie object accompany it. This allows"," * you to alter the session cookie per visitor. For example we can"," * set `req.session.cookie.expires` to `false` to enable the cookie"," * to remain for only the duration of the user-agent."," *"," * ## Session#maxAge"," *"," * Alternatively `req.session.cookie.maxAge` will return the time"," * remaining in milliseconds, which we may also re-assign a new value"," * to adjust the `.expires` property appropriately. The following"," * are essentially equivalent"," *"," * var hour = 3600000;"," * req.session.cookie.expires = new Date(Date.now() + hour);"," * req.session.cookie.maxAge = hour;"," *"," * For example when `maxAge` is set to `60000` (one minute), and 30 seconds"," * has elapsed it will return `30000` until the current request has completed,"," * at which time `req.session.touch()` is called to reset `req.session.maxAge`"," * to its original value."," *"," * req.session.cookie.maxAge;"," * // => 30000"," *"," * Session Store Implementation:"," *"," * Every session store _must_ implement the following methods"," *"," * - `.get(sid, callback)`"," * - `.set(sid, session, callback)`"," * - `.destroy(sid, callback)`"," *"," * Recommended methods include, but are not limited to:"," *"," * - `.length(callback)`"," * - `.clear(callback)`"," *"," * For an example implementation view the [connect-redis](http://github.com/visionmedia/connect-redis) repo."," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","function session(options){"," var options = options || {}"," , key = options.key || 'connect.sid'"," , store = options.store || new MemoryStore"," , cookie = options.cookie || {}"," , trustProxy = options.proxy"," , storeReady = true;",""," // notify user that this store is not"," // meant for a production environment"," if ('production' == env && store instanceof MemoryStore) {"," console.warn(warning);"," }",""," // generates the new session"," store.generate = function(req){"," req.sessionID = utils.uid(24);"," req.session = new Session(req);"," req.session.cookie = new Cookie(cookie);"," };",""," store.on('disconnect', function(){ storeReady = false; });"," store.on('connect', function(){ storeReady = true; });",""," return function session(req, res, next) {"," // self-awareness"," if (req.session) return next();",""," // Handle connection as if there is no session if"," // the store has temporarily disconnected etc"," if (!storeReady) return debug('store is disconnected'), next();",""," // pathname mismatch"," if (0 != req.originalUrl.indexOf(cookie.path || '/')) return next();",""," // backwards compatibility for signed cookies"," // req.secret is passed from the cookie parser middleware"," var secret = options.secret || req.secret;",""," // ensure secret is available or bail"," if (!secret) throw new Error('`secret` option required for sessions');",""," // parse url"," var originalHash"," , originalId;",""," // expose store"," req.sessionStore = store;",""," // grab the session cookie value and check the signature"," var rawCookie = req.cookies[key];",""," // get signedCookies for backwards compat with signed cookies"," var unsignedCookie = req.signedCookies[key];",""," if (!unsignedCookie && rawCookie) {"," unsignedCookie = utils.parseSignedCookie(rawCookie, secret);"," }",""," // set-cookie"," res.on('header', function(){"," if (!req.session) return;"," var cookie = req.session.cookie"," , proto = (req.headers['x-forwarded-proto'] || '').toLowerCase()"," , tls = req.connection.encrypted || (trustProxy && 'https' == proto)"," , secured = cookie.secure && tls"," , isNew = unsignedCookie != req.sessionID;",""," // only send secure cookies via https"," if (cookie.secure && !secured) return debug('not secured');",""," // browser-session length cookie"," if (null == cookie.expires) {"," if (!isNew) return debug('already set browser-session cookie');"," // compare hashes and ids"," } else if (originalHash == hash(req.session) && originalId == req.session.id) {"," return debug('unmodified session');"," }",""," var val = 's:' + signature.sign(req.sessionID, secret);"," val = cookie.serialize(key, val);"," debug('set-cookie %s', val);"," res.setHeader('Set-Cookie', val);"," });",""," // proxy end() to commit the session"," var end = res.end;"," res.end = function(data, encoding){"," res.end = end;"," if (!req.session) return res.end(data, encoding);"," debug('saving');"," req.session.resetMaxAge();"," req.session.save(function(){"," debug('saved');"," res.end(data, encoding);"," });"," };",""," // generate the session"," function generate() {"," store.generate(req);"," }",""," // get the sessionID from the cookie"," req.sessionID = unsignedCookie;",""," // generate a session if the browser doesn't send a sessionID"," if (!req.sessionID) {"," debug('no SID sent, generating session');"," generate();"," next();"," return;"," }",""," // generate the session object"," var pause = utils.pause(req);"," debug('fetching %s', req.sessionID);"," store.get(req.sessionID, function(err, sess){"," // proxy to resume() events"," var _next = next;"," next = function(err){"," _next(err);"," pause.resume();"," };",""," // error handling"," if (err) {"," debug('error');"," if ('ENOENT' == err.code) {"," generate();"," next();"," } else {"," next(err);"," }"," // no session"," } else if (!sess) {"," debug('no session found');"," generate();"," next();"," // populate req.session"," } else {"," debug('session found');"," store.createSession(req, sess);"," originalId = req.sessionID;"," originalHash = hash(sess);"," next();"," }"," });"," };","};","","/**"," * Hash the given `sess` object omitting changes"," * to `.cookie`."," *"," * @param {Object} sess"," * @return {String}"," * @api private"," */","","function hash(sess) {"," return crc16(JSON.stringify(sess, function(key, val){"," if ('cookie' != key) return val;"," }));","}"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/session/cookie.js b/node_modules/express/node_modules/connect/lib-cov/middleware/session/cookie.js deleted file mode 100644 index 279afe5..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/session/cookie.js +++ /dev/null @@ -1,65 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/session/cookie.js']) { - _$jscoverage['middleware/session/cookie.js'] = []; - _$jscoverage['middleware/session/cookie.js'][13] = 0; - _$jscoverage['middleware/session/cookie.js'][24] = 0; - _$jscoverage['middleware/session/cookie.js'][25] = 0; - _$jscoverage['middleware/session/cookie.js'][26] = 0; - _$jscoverage['middleware/session/cookie.js'][27] = 0; - _$jscoverage['middleware/session/cookie.js'][28] = 0; - _$jscoverage['middleware/session/cookie.js'][29] = 0; - _$jscoverage['middleware/session/cookie.js'][38] = 0; - _$jscoverage['middleware/session/cookie.js'][48] = 0; - _$jscoverage['middleware/session/cookie.js'][49] = 0; - _$jscoverage['middleware/session/cookie.js'][60] = 0; - _$jscoverage['middleware/session/cookie.js'][71] = 0; - _$jscoverage['middleware/session/cookie.js'][84] = 0; - _$jscoverage['middleware/session/cookie.js'][97] = 0; - _$jscoverage['middleware/session/cookie.js'][115] = 0; - _$jscoverage['middleware/session/cookie.js'][126] = 0; -} -_$jscoverage['middleware/session/cookie.js'][13]++; -var utils = require("../../utils"), cookie = require("cookie"); -_$jscoverage['middleware/session/cookie.js'][24]++; -var Cookie = module.exports = (function Cookie(options) { - _$jscoverage['middleware/session/cookie.js'][25]++; - this.path = "/"; - _$jscoverage['middleware/session/cookie.js'][26]++; - this.maxAge = null; - _$jscoverage['middleware/session/cookie.js'][27]++; - this.httpOnly = true; - _$jscoverage['middleware/session/cookie.js'][28]++; - if (options) { - _$jscoverage['middleware/session/cookie.js'][28]++; - utils.merge(this, options); - } - _$jscoverage['middleware/session/cookie.js'][29]++; - this.originalMaxAge = undefined == this.originalMaxAge? this.maxAge: this.originalMaxAge; -}); -_$jscoverage['middleware/session/cookie.js'][38]++; -Cookie.prototype = {set expires (date) { - _$jscoverage['middleware/session/cookie.js'][48]++; - this._expires = date; - _$jscoverage['middleware/session/cookie.js'][49]++; - this.originalMaxAge = this.maxAge; -}, get expires () { - _$jscoverage['middleware/session/cookie.js'][60]++; - return this._expires; -}, set maxAge (ms) { - _$jscoverage['middleware/session/cookie.js'][71]++; - this.expires = "number" == typeof ms? new Date(Date.now() + ms): ms; -}, get maxAge () { - _$jscoverage['middleware/session/cookie.js'][84]++; - return this.expires instanceof Date? this.expires.valueOf() - Date.now(): this.expires; -}, get data () { - _$jscoverage['middleware/session/cookie.js'][97]++; - return ({originalMaxAge: this.originalMaxAge, expires: this._expires, secure: this.secure, httpOnly: this.httpOnly, domain: this.domain, path: this.path}); -}, serialize: (function (name, val) { - _$jscoverage['middleware/session/cookie.js'][115]++; - return cookie.serialize(name, val, this.data); -}), toJSON: (function () { - _$jscoverage['middleware/session/cookie.js'][126]++; - return this.data; -})}; -_$jscoverage['middleware/session/cookie.js'].source = ["","/*!"," * Connect - session - Cookie"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../../utils')"," , cookie = require('cookie');","","/**"," * Initialize a new `Cookie` with the given `options`."," *"," * @param {IncomingMessage} req"," * @param {Object} options"," * @api private"," */","","var Cookie = module.exports = function Cookie(options) {"," this.path = '/';"," this.maxAge = null;"," this.httpOnly = true;"," if (options) utils.merge(this, options);"," this.originalMaxAge = undefined == this.originalMaxAge"," ? this.maxAge"," : this.originalMaxAge;","};","","/*!"," * Prototype."," */","","Cookie.prototype = {",""," /**"," * Set expires `date`."," *"," * @param {Date} date"," * @api public"," */"," "," set expires(date) {"," this._expires = date;"," this.originalMaxAge = this.maxAge;"," },",""," /**"," * Get expires `date`."," *"," * @return {Date}"," * @api public"," */",""," get expires() {"," return this._expires;"," },"," "," /**"," * Set expires via max-age in `ms`."," *"," * @param {Number} ms"," * @api public"," */"," "," set maxAge(ms) {"," this.expires = 'number' == typeof ms"," ? new Date(Date.now() + ms)"," : ms;"," },",""," /**"," * Get expires max-age in `ms`."," *"," * @return {Number}"," * @api public"," */",""," get maxAge() {"," return this.expires instanceof Date"," ? this.expires.valueOf() - Date.now()"," : this.expires;"," },",""," /**"," * Return cookie data object."," *"," * @return {Object}"," * @api private"," */",""," get data() {"," return {"," originalMaxAge: this.originalMaxAge"," , expires: this._expires"," , secure: this.secure"," , httpOnly: this.httpOnly"," , domain: this.domain"," , path: this.path"," }"," },",""," /**"," * Return a serialized cookie string."," *"," * @return {String}"," * @api public"," */",""," serialize: function(name, val){"," return cookie.serialize(name, val, this.data);"," },",""," /**"," * Return JSON representation of this cookie."," *"," * @return {Object}"," * @api private"," */"," "," toJSON: function(){"," return this.data;"," }","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/session/memory.js b/node_modules/express/node_modules/connect/lib-cov/middleware/session/memory.js deleted file mode 100644 index f140187..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/session/memory.js +++ /dev/null @@ -1,128 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/session/memory.js']) { - _$jscoverage['middleware/session/memory.js'] = []; - _$jscoverage['middleware/session/memory.js'][13] = 0; - _$jscoverage['middleware/session/memory.js'][21] = 0; - _$jscoverage['middleware/session/memory.js'][22] = 0; - _$jscoverage['middleware/session/memory.js'][29] = 0; - _$jscoverage['middleware/session/memory.js'][39] = 0; - _$jscoverage['middleware/session/memory.js'][40] = 0; - _$jscoverage['middleware/session/memory.js'][41] = 0; - _$jscoverage['middleware/session/memory.js'][42] = 0; - _$jscoverage['middleware/session/memory.js'][44] = 0; - _$jscoverage['middleware/session/memory.js'][45] = 0; - _$jscoverage['middleware/session/memory.js'][46] = 0; - _$jscoverage['middleware/session/memory.js'][49] = 0; - _$jscoverage['middleware/session/memory.js'][50] = 0; - _$jscoverage['middleware/session/memory.js'][52] = 0; - _$jscoverage['middleware/session/memory.js'][55] = 0; - _$jscoverage['middleware/session/memory.js'][69] = 0; - _$jscoverage['middleware/session/memory.js'][70] = 0; - _$jscoverage['middleware/session/memory.js'][71] = 0; - _$jscoverage['middleware/session/memory.js'][72] = 0; - _$jscoverage['middleware/session/memory.js'][73] = 0; - _$jscoverage['middleware/session/memory.js'][84] = 0; - _$jscoverage['middleware/session/memory.js'][85] = 0; - _$jscoverage['middleware/session/memory.js'][86] = 0; - _$jscoverage['middleware/session/memory.js'][87] = 0; - _$jscoverage['middleware/session/memory.js'][88] = 0; - _$jscoverage['middleware/session/memory.js'][99] = 0; - _$jscoverage['middleware/session/memory.js'][100] = 0; - _$jscoverage['middleware/session/memory.js'][102] = 0; - _$jscoverage['middleware/session/memory.js'][103] = 0; - _$jscoverage['middleware/session/memory.js'][105] = 0; - _$jscoverage['middleware/session/memory.js'][115] = 0; - _$jscoverage['middleware/session/memory.js'][116] = 0; - _$jscoverage['middleware/session/memory.js'][117] = 0; - _$jscoverage['middleware/session/memory.js'][127] = 0; - _$jscoverage['middleware/session/memory.js'][128] = 0; -} -_$jscoverage['middleware/session/memory.js'][13]++; -var Store = require("./store"); -_$jscoverage['middleware/session/memory.js'][21]++; -var MemoryStore = module.exports = (function MemoryStore() { - _$jscoverage['middleware/session/memory.js'][22]++; - this.sessions = {}; -}); -_$jscoverage['middleware/session/memory.js'][29]++; -MemoryStore.prototype.__proto__ = Store.prototype; -_$jscoverage['middleware/session/memory.js'][39]++; -MemoryStore.prototype.get = (function (sid, fn) { - _$jscoverage['middleware/session/memory.js'][40]++; - var self = this; - _$jscoverage['middleware/session/memory.js'][41]++; - process.nextTick((function () { - _$jscoverage['middleware/session/memory.js'][42]++; - var expires, sess = self.sessions[sid]; - _$jscoverage['middleware/session/memory.js'][44]++; - if (sess) { - _$jscoverage['middleware/session/memory.js'][45]++; - sess = JSON.parse(sess); - _$jscoverage['middleware/session/memory.js'][46]++; - expires = "string" == typeof sess.cookie.expires? new Date(sess.cookie.expires): sess.cookie.expires; - _$jscoverage['middleware/session/memory.js'][49]++; - if (! expires || new Date() < expires) { - _$jscoverage['middleware/session/memory.js'][50]++; - fn(null, sess); - } - else { - _$jscoverage['middleware/session/memory.js'][52]++; - self.destroy(sid, fn); - } - } - else { - _$jscoverage['middleware/session/memory.js'][55]++; - fn(); - } -})); -}); -_$jscoverage['middleware/session/memory.js'][69]++; -MemoryStore.prototype.set = (function (sid, sess, fn) { - _$jscoverage['middleware/session/memory.js'][70]++; - var self = this; - _$jscoverage['middleware/session/memory.js'][71]++; - process.nextTick((function () { - _$jscoverage['middleware/session/memory.js'][72]++; - self.sessions[sid] = JSON.stringify(sess); - _$jscoverage['middleware/session/memory.js'][73]++; - fn && fn(); -})); -}); -_$jscoverage['middleware/session/memory.js'][84]++; -MemoryStore.prototype.destroy = (function (sid, fn) { - _$jscoverage['middleware/session/memory.js'][85]++; - var self = this; - _$jscoverage['middleware/session/memory.js'][86]++; - process.nextTick((function () { - _$jscoverage['middleware/session/memory.js'][87]++; - delete self.sessions[sid]; - _$jscoverage['middleware/session/memory.js'][88]++; - fn && fn(); -})); -}); -_$jscoverage['middleware/session/memory.js'][99]++; -MemoryStore.prototype.all = (function (fn) { - _$jscoverage['middleware/session/memory.js'][100]++; - var arr = [], keys = Object.keys(this.sessions); - _$jscoverage['middleware/session/memory.js'][102]++; - for (var i = 0, len = keys.length; i < len; ++i) { - _$jscoverage['middleware/session/memory.js'][103]++; - arr.push(this.sessions[keys[i]]); -} - _$jscoverage['middleware/session/memory.js'][105]++; - fn(null, arr); -}); -_$jscoverage['middleware/session/memory.js'][115]++; -MemoryStore.prototype.clear = (function (fn) { - _$jscoverage['middleware/session/memory.js'][116]++; - this.sessions = {}; - _$jscoverage['middleware/session/memory.js'][117]++; - fn && fn(); -}); -_$jscoverage['middleware/session/memory.js'][127]++; -MemoryStore.prototype.length = (function (fn) { - _$jscoverage['middleware/session/memory.js'][128]++; - fn(null, Object.keys(this.sessions).length); -}); -_$jscoverage['middleware/session/memory.js'].source = ["","/*!"," * Connect - session - MemoryStore"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var Store = require('./store');","","/**"," * Initialize a new `MemoryStore`."," *"," * @api public"," */","","var MemoryStore = module.exports = function MemoryStore() {"," this.sessions = {};","};","","/**"," * Inherit from `Store.prototype`."," */","","MemoryStore.prototype.__proto__ = Store.prototype;","","/**"," * Attempt to fetch session by the given `sid`."," *"," * @param {String} sid"," * @param {Function} fn"," * @api public"," */","","MemoryStore.prototype.get = function(sid, fn){"," var self = this;"," process.nextTick(function(){"," var expires"," , sess = self.sessions[sid];"," if (sess) {"," sess = JSON.parse(sess);"," expires = 'string' == typeof sess.cookie.expires"," ? new Date(sess.cookie.expires)"," : sess.cookie.expires;"," if (!expires || new Date < expires) {"," fn(null, sess);"," } else {"," self.destroy(sid, fn);"," }"," } else {"," fn();"," }"," });","};","","/**"," * Commit the given `sess` object associated with the given `sid`."," *"," * @param {String} sid"," * @param {Session} sess"," * @param {Function} fn"," * @api public"," */","","MemoryStore.prototype.set = function(sid, sess, fn){"," var self = this;"," process.nextTick(function(){"," self.sessions[sid] = JSON.stringify(sess);"," fn && fn();"," });","};","","/**"," * Destroy the session associated with the given `sid`."," *"," * @param {String} sid"," * @api public"," */","","MemoryStore.prototype.destroy = function(sid, fn){"," var self = this;"," process.nextTick(function(){"," delete self.sessions[sid];"," fn && fn();"," });","};","","/**"," * Invoke the given callback `fn` with all active sessions."," *"," * @param {Function} fn"," * @api public"," */","","MemoryStore.prototype.all = function(fn){"," var arr = []"," , keys = Object.keys(this.sessions);"," for (var i = 0, len = keys.length; i < len; ++i) {"," arr.push(this.sessions[keys[i]]);"," }"," fn(null, arr);","};","","/**"," * Clear all sessions."," *"," * @param {Function} fn"," * @api public"," */","","MemoryStore.prototype.clear = function(fn){"," this.sessions = {};"," fn && fn();","};","","/**"," * Fetch number of sessions."," *"," * @param {Function} fn"," * @api public"," */","","MemoryStore.prototype.length = function(fn){"," fn(null, Object.keys(this.sessions).length);","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/session/session.js b/node_modules/express/node_modules/connect/lib-cov/middleware/session/session.js deleted file mode 100644 index 73e85e0..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/session/session.js +++ /dev/null @@ -1,108 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/session/session.js']) { - _$jscoverage['middleware/session/session.js'] = []; - _$jscoverage['middleware/session/session.js'][13] = 0; - _$jscoverage['middleware/session/session.js'][23] = 0; - _$jscoverage['middleware/session/session.js'][24] = 0; - _$jscoverage['middleware/session/session.js'][25] = 0; - _$jscoverage['middleware/session/session.js'][26] = 0; - _$jscoverage['middleware/session/session.js'][38] = 0; - _$jscoverage['middleware/session/session.js'][39] = 0; - _$jscoverage['middleware/session/session.js'][49] = 0; - _$jscoverage['middleware/session/session.js'][50] = 0; - _$jscoverage['middleware/session/session.js'][51] = 0; - _$jscoverage['middleware/session/session.js'][62] = 0; - _$jscoverage['middleware/session/session.js'][63] = 0; - _$jscoverage['middleware/session/session.js'][64] = 0; - _$jscoverage['middleware/session/session.js'][79] = 0; - _$jscoverage['middleware/session/session.js'][80] = 0; - _$jscoverage['middleware/session/session.js'][82] = 0; - _$jscoverage['middleware/session/session.js'][83] = 0; - _$jscoverage['middleware/session/session.js'][84] = 0; - _$jscoverage['middleware/session/session.js'][85] = 0; - _$jscoverage['middleware/session/session.js'][86] = 0; - _$jscoverage['middleware/session/session.js'][88] = 0; - _$jscoverage['middleware/session/session.js'][99] = 0; - _$jscoverage['middleware/session/session.js'][100] = 0; - _$jscoverage['middleware/session/session.js'][101] = 0; - _$jscoverage['middleware/session/session.js'][102] = 0; - _$jscoverage['middleware/session/session.js'][113] = 0; - _$jscoverage['middleware/session/session.js'][114] = 0; - _$jscoverage['middleware/session/session.js'][115] = 0; -} -_$jscoverage['middleware/session/session.js'][13]++; -var utils = require("../../utils"); -_$jscoverage['middleware/session/session.js'][23]++; -var Session = module.exports = (function Session(req, data) { - _$jscoverage['middleware/session/session.js'][24]++; - Object.defineProperty(this, "req", {value: req}); - _$jscoverage['middleware/session/session.js'][25]++; - Object.defineProperty(this, "id", {value: req.sessionID}); - _$jscoverage['middleware/session/session.js'][26]++; - if ("object" == typeof data) { - _$jscoverage['middleware/session/session.js'][26]++; - utils.merge(this, data); - } -}); -_$jscoverage['middleware/session/session.js'][38]++; -Session.prototype.touch = (function () { - _$jscoverage['middleware/session/session.js'][39]++; - return this.resetMaxAge(); -}); -_$jscoverage['middleware/session/session.js'][49]++; -Session.prototype.resetMaxAge = (function () { - _$jscoverage['middleware/session/session.js'][50]++; - this.cookie.maxAge = this.cookie.originalMaxAge; - _$jscoverage['middleware/session/session.js'][51]++; - return this; -}); -_$jscoverage['middleware/session/session.js'][62]++; -Session.prototype.save = (function (fn) { - _$jscoverage['middleware/session/session.js'][63]++; - this.req.sessionStore.set(this.id, this, fn || (function () { -})); - _$jscoverage['middleware/session/session.js'][64]++; - return this; -}); -_$jscoverage['middleware/session/session.js'][79]++; -Session.prototype.reload = (function (fn) { - _$jscoverage['middleware/session/session.js'][80]++; - var req = this.req, store = this.req.sessionStore; - _$jscoverage['middleware/session/session.js'][82]++; - store.get(this.id, (function (err, sess) { - _$jscoverage['middleware/session/session.js'][83]++; - if (err) { - _$jscoverage['middleware/session/session.js'][83]++; - return fn(err); - } - _$jscoverage['middleware/session/session.js'][84]++; - if (! sess) { - _$jscoverage['middleware/session/session.js'][84]++; - return fn(new Error("failed to load session")); - } - _$jscoverage['middleware/session/session.js'][85]++; - store.createSession(req, sess); - _$jscoverage['middleware/session/session.js'][86]++; - fn(); -})); - _$jscoverage['middleware/session/session.js'][88]++; - return this; -}); -_$jscoverage['middleware/session/session.js'][99]++; -Session.prototype.destroy = (function (fn) { - _$jscoverage['middleware/session/session.js'][100]++; - delete this.req.session; - _$jscoverage['middleware/session/session.js'][101]++; - this.req.sessionStore.destroy(this.id, fn); - _$jscoverage['middleware/session/session.js'][102]++; - return this; -}); -_$jscoverage['middleware/session/session.js'][113]++; -Session.prototype.regenerate = (function (fn) { - _$jscoverage['middleware/session/session.js'][114]++; - this.req.sessionStore.regenerate(this.req, fn); - _$jscoverage['middleware/session/session.js'][115]++; - return this; -}); -_$jscoverage['middleware/session/session.js'].source = ["","/*!"," * Connect - session - Session"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../../utils');","","/**"," * Create a new `Session` with the given request and `data`."," *"," * @param {IncomingRequest} req"," * @param {Object} data"," * @api private"," */","","var Session = module.exports = function Session(req, data) {"," Object.defineProperty(this, 'req', { value: req });"," Object.defineProperty(this, 'id', { value: req.sessionID });"," if ('object' == typeof data) utils.merge(this, data);","};","","/**"," * Update reset `.cookie.maxAge` to prevent"," * the cookie from expiring when the"," * session is still active."," *"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.touch = function(){"," return this.resetMaxAge();","};","","/**"," * Reset `.maxAge` to `.originalMaxAge`."," *"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.resetMaxAge = function(){"," this.cookie.maxAge = this.cookie.originalMaxAge;"," return this;","};","","/**"," * Save the session data with optional callback `fn(err)`."," *"," * @param {Function} fn"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.save = function(fn){"," this.req.sessionStore.set(this.id, this, fn || function(){});"," return this;","};","","/**"," * Re-loads the session data _without_ altering"," * the maxAge properties. Invokes the callback `fn(err)`,"," * after which time if no exception has occurred the"," * `req.session` property will be a new `Session` object,"," * although representing the same session."," *"," * @param {Function} fn"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.reload = function(fn){"," var req = this.req"," , store = this.req.sessionStore;"," store.get(this.id, function(err, sess){"," if (err) return fn(err);"," if (!sess) return fn(new Error('failed to load session'));"," store.createSession(req, sess);"," fn();"," });"," return this;","};","","/**"," * Destroy `this` session."," *"," * @param {Function} fn"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.destroy = function(fn){"," delete this.req.session;"," this.req.sessionStore.destroy(this.id, fn);"," return this;","};","","/**"," * Regenerate this request's session."," *"," * @param {Function} fn"," * @return {Session} for chaining"," * @api public"," */","","Session.prototype.regenerate = function(fn){"," this.req.sessionStore.regenerate(this.req, fn);"," return this;","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/session/store.js b/node_modules/express/node_modules/connect/lib-cov/middleware/session/store.js deleted file mode 100644 index 2d79aa2..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/session/store.js +++ /dev/null @@ -1,90 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/session/store.js']) { - _$jscoverage['middleware/session/store.js'] = []; - _$jscoverage['middleware/session/store.js'][13] = 0; - _$jscoverage['middleware/session/store.js'][23] = 0; - _$jscoverage['middleware/session/store.js'][29] = 0; - _$jscoverage['middleware/session/store.js'][39] = 0; - _$jscoverage['middleware/session/store.js'][40] = 0; - _$jscoverage['middleware/session/store.js'][41] = 0; - _$jscoverage['middleware/session/store.js'][42] = 0; - _$jscoverage['middleware/session/store.js'][43] = 0; - _$jscoverage['middleware/session/store.js'][56] = 0; - _$jscoverage['middleware/session/store.js'][57] = 0; - _$jscoverage['middleware/session/store.js'][58] = 0; - _$jscoverage['middleware/session/store.js'][59] = 0; - _$jscoverage['middleware/session/store.js'][60] = 0; - _$jscoverage['middleware/session/store.js'][61] = 0; - _$jscoverage['middleware/session/store.js'][62] = 0; - _$jscoverage['middleware/session/store.js'][63] = 0; - _$jscoverage['middleware/session/store.js'][76] = 0; - _$jscoverage['middleware/session/store.js'][77] = 0; - _$jscoverage['middleware/session/store.js'][79] = 0; - _$jscoverage['middleware/session/store.js'][80] = 0; - _$jscoverage['middleware/session/store.js'][81] = 0; - _$jscoverage['middleware/session/store.js'][82] = 0; - _$jscoverage['middleware/session/store.js'][83] = 0; -} -_$jscoverage['middleware/session/store.js'][13]++; -var EventEmitter = require("events").EventEmitter, Session = require("./session"), Cookie = require("./cookie"); -_$jscoverage['middleware/session/store.js'][23]++; -var Store = module.exports = (function Store(options) { -}); -_$jscoverage['middleware/session/store.js'][29]++; -Store.prototype.__proto__ = EventEmitter.prototype; -_$jscoverage['middleware/session/store.js'][39]++; -Store.prototype.regenerate = (function (req, fn) { - _$jscoverage['middleware/session/store.js'][40]++; - var self = this; - _$jscoverage['middleware/session/store.js'][41]++; - this.destroy(req.sessionID, (function (err) { - _$jscoverage['middleware/session/store.js'][42]++; - self.generate(req); - _$jscoverage['middleware/session/store.js'][43]++; - fn(err); -})); -}); -_$jscoverage['middleware/session/store.js'][56]++; -Store.prototype.load = (function (sid, fn) { - _$jscoverage['middleware/session/store.js'][57]++; - var self = this; - _$jscoverage['middleware/session/store.js'][58]++; - this.get(sid, (function (err, sess) { - _$jscoverage['middleware/session/store.js'][59]++; - if (err) { - _$jscoverage['middleware/session/store.js'][59]++; - return fn(err); - } - _$jscoverage['middleware/session/store.js'][60]++; - if (! sess) { - _$jscoverage['middleware/session/store.js'][60]++; - return fn(); - } - _$jscoverage['middleware/session/store.js'][61]++; - var req = {sessionID: sid, sessionStore: self}; - _$jscoverage['middleware/session/store.js'][62]++; - sess = self.createSession(req, sess); - _$jscoverage['middleware/session/store.js'][63]++; - fn(null, sess); -})); -}); -_$jscoverage['middleware/session/store.js'][76]++; -Store.prototype.createSession = (function (req, sess) { - _$jscoverage['middleware/session/store.js'][77]++; - var expires = sess.cookie.expires, orig = sess.cookie.originalMaxAge; - _$jscoverage['middleware/session/store.js'][79]++; - sess.cookie = new Cookie(sess.cookie); - _$jscoverage['middleware/session/store.js'][80]++; - if ("string" == typeof expires) { - _$jscoverage['middleware/session/store.js'][80]++; - sess.cookie.expires = new Date(expires); - } - _$jscoverage['middleware/session/store.js'][81]++; - sess.cookie.originalMaxAge = orig; - _$jscoverage['middleware/session/store.js'][82]++; - req.session = new Session(req, sess); - _$jscoverage['middleware/session/store.js'][83]++; - return req.session; -}); -_$jscoverage['middleware/session/store.js'].source = ["","/*!"," * Connect - session - Store"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var EventEmitter = require('events').EventEmitter"," , Session = require('./session')"," , Cookie = require('./cookie');","","/**"," * Initialize abstract `Store`."," *"," * @api private"," */","","var Store = module.exports = function Store(options){};","","/**"," * Inherit from `EventEmitter.prototype`."," */","","Store.prototype.__proto__ = EventEmitter.prototype;","","/**"," * Re-generate the given requests's session."," *"," * @param {IncomingRequest} req"," * @return {Function} fn"," * @api public"," */","","Store.prototype.regenerate = function(req, fn){"," var self = this;"," this.destroy(req.sessionID, function(err){"," self.generate(req);"," fn(err);"," });","};","","/**"," * Load a `Session` instance via the given `sid`"," * and invoke the callback `fn(err, sess)`."," *"," * @param {String} sid"," * @param {Function} fn"," * @api public"," */","","Store.prototype.load = function(sid, fn){"," var self = this;"," this.get(sid, function(err, sess){"," if (err) return fn(err);"," if (!sess) return fn();"," var req = { sessionID: sid, sessionStore: self };"," sess = self.createSession(req, sess);"," fn(null, sess);"," });","};","","/**"," * Create session from JSON `sess` data."," *"," * @param {IncomingRequest} req"," * @param {Object} sess"," * @return {Session}"," * @api private"," */","","Store.prototype.createSession = function(req, sess){"," var expires = sess.cookie.expires"," , orig = sess.cookie.originalMaxAge;"," sess.cookie = new Cookie(sess.cookie);"," if ('string' == typeof expires) sess.cookie.expires = new Date(expires);"," sess.cookie.originalMaxAge = orig;"," req.session = new Session(req, sess);"," return req.session;","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/static.js b/node_modules/express/node_modules/connect/lib-cov/middleware/static.js deleted file mode 100644 index c52b1c0..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/static.js +++ /dev/null @@ -1,92 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/static.js']) { - _$jscoverage['middleware/static.js'] = []; - _$jscoverage['middleware/static.js'][13] = 0; - _$jscoverage['middleware/static.js'][45] = 0; - _$jscoverage['middleware/static.js'][46] = 0; - _$jscoverage['middleware/static.js'][49] = 0; - _$jscoverage['middleware/static.js'][52] = 0; - _$jscoverage['middleware/static.js'][54] = 0; - _$jscoverage['middleware/static.js'][55] = 0; - _$jscoverage['middleware/static.js'][56] = 0; - _$jscoverage['middleware/static.js'][57] = 0; - _$jscoverage['middleware/static.js'][59] = 0; - _$jscoverage['middleware/static.js'][60] = 0; - _$jscoverage['middleware/static.js'][61] = 0; - _$jscoverage['middleware/static.js'][64] = 0; - _$jscoverage['middleware/static.js'][65] = 0; - _$jscoverage['middleware/static.js'][66] = 0; - _$jscoverage['middleware/static.js'][67] = 0; - _$jscoverage['middleware/static.js'][68] = 0; - _$jscoverage['middleware/static.js'][69] = 0; - _$jscoverage['middleware/static.js'][72] = 0; - _$jscoverage['middleware/static.js'][73] = 0; - _$jscoverage['middleware/static.js'][74] = 0; - _$jscoverage['middleware/static.js'][77] = 0; - _$jscoverage['middleware/static.js'][94] = 0; -} -_$jscoverage['middleware/static.js'][13]++; -var send = require("send"), utils = require("../utils"), parse = utils.parseUrl, url = require("url"); -_$jscoverage['middleware/static.js'][45]++; -exports = module.exports = (function static(root, options) { - _$jscoverage['middleware/static.js'][46]++; - options = options || {}; - _$jscoverage['middleware/static.js'][49]++; - if (! root) { - _$jscoverage['middleware/static.js'][49]++; - throw new Error("static() root path required"); - } - _$jscoverage['middleware/static.js'][52]++; - var redirect = false !== options.redirect; - _$jscoverage['middleware/static.js'][54]++; - return (function static(req, res, next) { - _$jscoverage['middleware/static.js'][55]++; - if ("GET" != req.method && "HEAD" != req.method) { - _$jscoverage['middleware/static.js'][55]++; - return next(); - } - _$jscoverage['middleware/static.js'][56]++; - var path = parse(req).pathname; - _$jscoverage['middleware/static.js'][57]++; - var pause = utils.pause(req); - _$jscoverage['middleware/static.js'][59]++; - function resume() { - _$jscoverage['middleware/static.js'][60]++; - next(); - _$jscoverage['middleware/static.js'][61]++; - pause.resume(); -} - _$jscoverage['middleware/static.js'][64]++; - function directory() { - _$jscoverage['middleware/static.js'][65]++; - if (! redirect) { - _$jscoverage['middleware/static.js'][65]++; - return resume(); - } - _$jscoverage['middleware/static.js'][66]++; - var pathname = url.parse(req.originalUrl).pathname; - _$jscoverage['middleware/static.js'][67]++; - res.statusCode = 301; - _$jscoverage['middleware/static.js'][68]++; - res.setHeader("Location", pathname + "/"); - _$jscoverage['middleware/static.js'][69]++; - res.end("Redirecting to " + utils.escape(pathname) + "/"); -} - _$jscoverage['middleware/static.js'][72]++; - function error(err) { - _$jscoverage['middleware/static.js'][73]++; - if (404 == err.status) { - _$jscoverage['middleware/static.js'][73]++; - return resume(); - } - _$jscoverage['middleware/static.js'][74]++; - next(err); -} - _$jscoverage['middleware/static.js'][77]++; - send(req, path).maxage(options.maxAge || 0).root(root).hidden(options.hidden).on("error", error).on("directory", directory).pipe(res); -}); -}); -_$jscoverage['middleware/static.js'][94]++; -exports.mime = send.mime; -_$jscoverage['middleware/static.js'].source = ["","/*!"," * Connect - static"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var send = require('send')"," , utils = require('../utils')"," , parse = utils.parseUrl"," , url = require('url');","","/**"," * Static:"," *"," * Static file server with the given `root` path."," *"," * Examples:"," *"," * var oneDay = 86400000;"," *"," * connect()"," * .use(connect.static(__dirname + '/public'))"," *"," * connect()"," * .use(connect.static(__dirname + '/public', { maxAge: oneDay }))"," *"," * Options:"," *"," * - `maxAge` Browser cache maxAge in milliseconds. defaults to 0"," * - `hidden` Allow transfer of hidden files. defaults to false"," * - `redirect` Redirect to trailing \"/\" when the pathname is a dir. defaults to true"," *"," * @param {String} root"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function static(root, options){"," options = options || {};",""," // root required"," if (!root) throw new Error('static() root path required');",""," // default redirect"," var redirect = false !== options.redirect;",""," return function static(req, res, next) {"," if ('GET' != req.method && 'HEAD' != req.method) return next();"," var path = parse(req).pathname;"," var pause = utils.pause(req);",""," function resume() {"," next();"," pause.resume();"," }",""," function directory() {"," if (!redirect) return resume();"," var pathname = url.parse(req.originalUrl).pathname;"," res.statusCode = 301;"," res.setHeader('Location', pathname + '/');"," res.end('Redirecting to ' + utils.escape(pathname) + '/');"," }",""," function error(err) {"," if (404 == err.status) return resume();"," next(err);"," }",""," send(req, path)"," .maxage(options.maxAge || 0)"," .root(root)"," .hidden(options.hidden)"," .on('error', error)"," .on('directory', directory)"," .pipe(res);"," };","};","","/**"," * Expose mime module."," * "," * If you wish to extend the mime table use this"," * reference to the \"mime\" module in the npm registry."," */","","exports.mime = send.mime;"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/staticCache.js b/node_modules/express/node_modules/connect/lib-cov/middleware/staticCache.js deleted file mode 100644 index e8c2940..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/staticCache.js +++ /dev/null @@ -1,276 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/staticCache.js']) { - _$jscoverage['middleware/staticCache.js'] = []; - _$jscoverage['middleware/staticCache.js'][12] = 0; - _$jscoverage['middleware/staticCache.js'][51] = 0; - _$jscoverage['middleware/staticCache.js'][52] = 0; - _$jscoverage['middleware/staticCache.js'][56] = 0; - _$jscoverage['middleware/staticCache.js'][57] = 0; - _$jscoverage['middleware/staticCache.js'][59] = 0; - _$jscoverage['middleware/staticCache.js'][60] = 0; - _$jscoverage['middleware/staticCache.js'][68] = 0; - _$jscoverage['middleware/staticCache.js'][69] = 0; - _$jscoverage['middleware/staticCache.js'][75] = 0; - _$jscoverage['middleware/staticCache.js'][78] = 0; - _$jscoverage['middleware/staticCache.js'][81] = 0; - _$jscoverage['middleware/staticCache.js'][84] = 0; - _$jscoverage['middleware/staticCache.js'][88] = 0; - _$jscoverage['middleware/staticCache.js'][91] = 0; - _$jscoverage['middleware/staticCache.js'][94] = 0; - _$jscoverage['middleware/staticCache.js'][95] = 0; - _$jscoverage['middleware/staticCache.js'][96] = 0; - _$jscoverage['middleware/staticCache.js'][97] = 0; - _$jscoverage['middleware/staticCache.js'][99] = 0; - _$jscoverage['middleware/staticCache.js'][104] = 0; - _$jscoverage['middleware/staticCache.js'][107] = 0; - _$jscoverage['middleware/staticCache.js'][110] = 0; - _$jscoverage['middleware/staticCache.js'][111] = 0; - _$jscoverage['middleware/staticCache.js'][115] = 0; - _$jscoverage['middleware/staticCache.js'][116] = 0; - _$jscoverage['middleware/staticCache.js'][117] = 0; - _$jscoverage['middleware/staticCache.js'][118] = 0; - _$jscoverage['middleware/staticCache.js'][119] = 0; - _$jscoverage['middleware/staticCache.js'][120] = 0; - _$jscoverage['middleware/staticCache.js'][124] = 0; - _$jscoverage['middleware/staticCache.js'][125] = 0; - _$jscoverage['middleware/staticCache.js'][126] = 0; - _$jscoverage['middleware/staticCache.js'][127] = 0; - _$jscoverage['middleware/staticCache.js'][128] = 0; - _$jscoverage['middleware/staticCache.js'][129] = 0; - _$jscoverage['middleware/staticCache.js'][131] = 0; - _$jscoverage['middleware/staticCache.js'][132] = 0; - _$jscoverage['middleware/staticCache.js'][135] = 0; - _$jscoverage['middleware/staticCache.js'][151] = 0; - _$jscoverage['middleware/staticCache.js'][152] = 0; - _$jscoverage['middleware/staticCache.js'][156] = 0; - _$jscoverage['middleware/staticCache.js'][158] = 0; - _$jscoverage['middleware/staticCache.js'][160] = 0; - _$jscoverage['middleware/staticCache.js'][161] = 0; - _$jscoverage['middleware/staticCache.js'][162] = 0; - _$jscoverage['middleware/staticCache.js'][164] = 0; - _$jscoverage['middleware/staticCache.js'][165] = 0; - _$jscoverage['middleware/staticCache.js'][166] = 0; - _$jscoverage['middleware/staticCache.js'][167] = 0; - _$jscoverage['middleware/staticCache.js'][169] = 0; - _$jscoverage['middleware/staticCache.js'][171] = 0; - _$jscoverage['middleware/staticCache.js'][172] = 0; - _$jscoverage['middleware/staticCache.js'][173] = 0; - _$jscoverage['middleware/staticCache.js'][174] = 0; - _$jscoverage['middleware/staticCache.js'][175] = 0; - _$jscoverage['middleware/staticCache.js'][178] = 0; - _$jscoverage['middleware/staticCache.js'][181] = 0; - _$jscoverage['middleware/staticCache.js'][183] = 0; - _$jscoverage['middleware/staticCache.js'][186] = 0; - _$jscoverage['middleware/staticCache.js'][187] = 0; - _$jscoverage['middleware/staticCache.js'][200] = 0; - _$jscoverage['middleware/staticCache.js'][201] = 0; - _$jscoverage['middleware/staticCache.js'][206] = 0; - _$jscoverage['middleware/staticCache.js'][208] = 0; - _$jscoverage['middleware/staticCache.js'][210] = 0; - _$jscoverage['middleware/staticCache.js'][212] = 0; - _$jscoverage['middleware/staticCache.js'][214] = 0; - _$jscoverage['middleware/staticCache.js'][216] = 0; - _$jscoverage['middleware/staticCache.js'][229] = 0; - _$jscoverage['middleware/staticCache.js'][230] = 0; -} -_$jscoverage['middleware/staticCache.js'][12]++; -var utils = require("../utils"), Cache = require("../cache"), fresh = require("fresh"); -_$jscoverage['middleware/staticCache.js'][51]++; -module.exports = (function staticCache(options) { - _$jscoverage['middleware/staticCache.js'][52]++; - var options = options || {}, cache = new Cache(options.maxObjects || 128), maxlen = options.maxLength || 262144; - _$jscoverage['middleware/staticCache.js'][56]++; - console.warn("connect.staticCache() is deprecated and will be removed in 3.0"); - _$jscoverage['middleware/staticCache.js'][57]++; - console.warn("use varnish or similar reverse proxy caches."); - _$jscoverage['middleware/staticCache.js'][59]++; - return (function staticCache(req, res, next) { - _$jscoverage['middleware/staticCache.js'][60]++; - var key = cacheKey(req), ranges = req.headers.range, hasCookies = req.headers.cookie, hit = cache.get(key); - _$jscoverage['middleware/staticCache.js'][68]++; - req.on("static", (function (stream) { - _$jscoverage['middleware/staticCache.js'][69]++; - var headers = res._headers, cc = utils.parseCacheControl(headers["cache-control"] || ""), contentLength = headers["content-length"], hit; - _$jscoverage['middleware/staticCache.js'][75]++; - if (headers["set-cookie"]) { - _$jscoverage['middleware/staticCache.js'][75]++; - return hasCookies = true; - } - _$jscoverage['middleware/staticCache.js'][78]++; - if (hasCookies) { - _$jscoverage['middleware/staticCache.js'][78]++; - return; - } - _$jscoverage['middleware/staticCache.js'][81]++; - if (! contentLength || contentLength > maxlen) { - _$jscoverage['middleware/staticCache.js'][81]++; - return; - } - _$jscoverage['middleware/staticCache.js'][84]++; - if (headers["content-range"]) { - _$jscoverage['middleware/staticCache.js'][84]++; - return; - } - _$jscoverage['middleware/staticCache.js'][88]++; - if (cc["no-cache"] || cc["no-store"] || cc["private"] || cc["must-revalidate"]) { - _$jscoverage['middleware/staticCache.js'][91]++; - return; - } - _$jscoverage['middleware/staticCache.js'][94]++; - if (hit = cache.get(key)) { - _$jscoverage['middleware/staticCache.js'][95]++; - if (headers.etag == hit[0].etag) { - _$jscoverage['middleware/staticCache.js'][96]++; - hit[0].date = new Date(); - _$jscoverage['middleware/staticCache.js'][97]++; - return; - } - else { - _$jscoverage['middleware/staticCache.js'][99]++; - cache.remove(key); - } - } - _$jscoverage['middleware/staticCache.js'][104]++; - if (null == stream) { - _$jscoverage['middleware/staticCache.js'][104]++; - return; - } - _$jscoverage['middleware/staticCache.js'][107]++; - var arr = []; - _$jscoverage['middleware/staticCache.js'][110]++; - stream.on("data", (function (chunk) { - _$jscoverage['middleware/staticCache.js'][111]++; - arr.push(chunk); -})); - _$jscoverage['middleware/staticCache.js'][115]++; - stream.on("end", (function () { - _$jscoverage['middleware/staticCache.js'][116]++; - var cacheEntry = cache.add(key); - _$jscoverage['middleware/staticCache.js'][117]++; - delete headers["x-cache"]; - _$jscoverage['middleware/staticCache.js'][118]++; - cacheEntry.push(200); - _$jscoverage['middleware/staticCache.js'][119]++; - cacheEntry.push(headers); - _$jscoverage['middleware/staticCache.js'][120]++; - cacheEntry.push.apply(cacheEntry, arr); -})); -})); - _$jscoverage['middleware/staticCache.js'][124]++; - if (req.method == "GET" || req.method == "HEAD") { - _$jscoverage['middleware/staticCache.js'][125]++; - if (ranges) { - _$jscoverage['middleware/staticCache.js'][126]++; - next(); - } - else { - _$jscoverage['middleware/staticCache.js'][127]++; - if (! hasCookies && hit && ! mustRevalidate(req, hit)) { - _$jscoverage['middleware/staticCache.js'][128]++; - res.setHeader("X-Cache", "HIT"); - _$jscoverage['middleware/staticCache.js'][129]++; - respondFromCache(req, res, hit); - } - else { - _$jscoverage['middleware/staticCache.js'][131]++; - res.setHeader("X-Cache", "MISS"); - _$jscoverage['middleware/staticCache.js'][132]++; - next(); - } - } - } - else { - _$jscoverage['middleware/staticCache.js'][135]++; - next(); - } -}); -}); -_$jscoverage['middleware/staticCache.js'][151]++; -function respondFromCache(req, res, cacheEntry) { - _$jscoverage['middleware/staticCache.js'][152]++; - var status = cacheEntry[0], headers = utils.merge({}, cacheEntry[1]), content = cacheEntry.slice(2); - _$jscoverage['middleware/staticCache.js'][156]++; - headers.age = (new Date() - new Date(headers.date)) / 1000 || 0; - _$jscoverage['middleware/staticCache.js'][158]++; - switch (req.method) { - case "HEAD": - _$jscoverage['middleware/staticCache.js'][160]++; - res.writeHead(status, headers); - _$jscoverage['middleware/staticCache.js'][161]++; - res.end(); - _$jscoverage['middleware/staticCache.js'][162]++; - break; - case "GET": - _$jscoverage['middleware/staticCache.js'][164]++; - if (utils.conditionalGET(req) && fresh(req.headers, headers)) { - _$jscoverage['middleware/staticCache.js'][165]++; - headers["content-length"] = 0; - _$jscoverage['middleware/staticCache.js'][166]++; - res.writeHead(304, headers); - _$jscoverage['middleware/staticCache.js'][167]++; - res.end(); - } - else { - _$jscoverage['middleware/staticCache.js'][169]++; - res.writeHead(status, headers); - _$jscoverage['middleware/staticCache.js'][171]++; - function write() { - _$jscoverage['middleware/staticCache.js'][172]++; - while (content.length) { - _$jscoverage['middleware/staticCache.js'][173]++; - if (false === res.write(content.shift())) { - _$jscoverage['middleware/staticCache.js'][174]++; - res.once("drain", write); - _$jscoverage['middleware/staticCache.js'][175]++; - return; - } -} - _$jscoverage['middleware/staticCache.js'][178]++; - res.end(); -} - _$jscoverage['middleware/staticCache.js'][181]++; - write(); - } - _$jscoverage['middleware/staticCache.js'][183]++; - break; - default: - _$jscoverage['middleware/staticCache.js'][186]++; - res.writeHead(500, ""); - _$jscoverage['middleware/staticCache.js'][187]++; - res.end(); - } -} -_$jscoverage['middleware/staticCache.js'][200]++; -function mustRevalidate(req, cacheEntry) { - _$jscoverage['middleware/staticCache.js'][201]++; - var cacheHeaders = cacheEntry[1], reqCC = utils.parseCacheControl(req.headers["cache-control"] || ""), cacheCC = utils.parseCacheControl(cacheHeaders["cache-control"] || ""), cacheAge = (new Date() - new Date(cacheHeaders.date)) / 1000 || 0; - _$jscoverage['middleware/staticCache.js'][206]++; - if (cacheCC["no-cache"] || cacheCC["must-revalidate"] || cacheCC["proxy-revalidate"]) { - _$jscoverage['middleware/staticCache.js'][208]++; - return true; - } - _$jscoverage['middleware/staticCache.js'][210]++; - if (reqCC["no-cache"]) { - _$jscoverage['middleware/staticCache.js'][210]++; - return true; - } - _$jscoverage['middleware/staticCache.js'][212]++; - if (null != reqCC["max-age"]) { - _$jscoverage['middleware/staticCache.js'][212]++; - return reqCC["max-age"] < cacheAge; - } - _$jscoverage['middleware/staticCache.js'][214]++; - if (null != cacheCC["max-age"]) { - _$jscoverage['middleware/staticCache.js'][214]++; - return cacheCC["max-age"] < cacheAge; - } - _$jscoverage['middleware/staticCache.js'][216]++; - return false; -} -_$jscoverage['middleware/staticCache.js'][229]++; -function cacheKey(req) { - _$jscoverage['middleware/staticCache.js'][230]++; - return utils.parseUrl(req).path; -} -_$jscoverage['middleware/staticCache.js'].source = ["","/*!"," * Connect - staticCache"," * Copyright(c) 2011 Sencha Inc."," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils')"," , Cache = require('../cache')"," , fresh = require('fresh');","","/**"," * Static cache:"," *"," * Enables a memory cache layer on top of"," * the `static()` middleware, serving popular"," * static files."," *"," * By default a maximum of 128 objects are"," * held in cache, with a max of 256k each,"," * totalling ~32mb."," *"," * A Least-Recently-Used (LRU) cache algo"," * is implemented through the `Cache` object,"," * simply rotating cache objects as they are"," * hit. This means that increasingly popular"," * objects maintain their positions while"," * others get shoved out of the stack and"," * garbage collected."," *"," * Benchmarks:"," *"," * static(): 2700 rps"," * node-static: 5300 rps"," * static() + staticCache(): 7500 rps"," *"," * Options:"," *"," * - `maxObjects` max cache objects [128]"," * - `maxLength` max cache object length 256kb"," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","module.exports = function staticCache(options){"," var options = options || {}"," , cache = new Cache(options.maxObjects || 128)"," , maxlen = options.maxLength || 1024 * 256;",""," console.warn('connect.staticCache() is deprecated and will be removed in 3.0');"," console.warn('use varnish or similar reverse proxy caches.');",""," return function staticCache(req, res, next){"," var key = cacheKey(req)"," , ranges = req.headers.range"," , hasCookies = req.headers.cookie"," , hit = cache.get(key);",""," // cache static"," // TODO: change from staticCache() -> cache()"," // and make this work for any request"," req.on('static', function(stream){"," var headers = res._headers"," , cc = utils.parseCacheControl(headers['cache-control'] || '')"," , contentLength = headers['content-length']"," , hit;",""," // dont cache set-cookie responses"," if (headers['set-cookie']) return hasCookies = true;",""," // dont cache when cookies are present"," if (hasCookies) return;",""," // ignore larger files"," if (!contentLength || contentLength > maxlen) return;",""," // don't cache partial files"," if (headers['content-range']) return;",""," // dont cache items we shouldn't be"," // TODO: real support for must-revalidate / no-cache"," if ( cc['no-cache']"," || cc['no-store']"," || cc['private']"," || cc['must-revalidate']) return;",""," // if already in cache then validate"," if (hit = cache.get(key)){"," if (headers.etag == hit[0].etag) {"," hit[0].date = new Date;"," return;"," } else {"," cache.remove(key);"," }"," }",""," // validation notifiactions don't contain a steam"," if (null == stream) return;",""," // add the cache object"," var arr = [];",""," // store the chunks"," stream.on('data', function(chunk){"," arr.push(chunk);"," });",""," // flag it as complete"," stream.on('end', function(){"," var cacheEntry = cache.add(key);"," delete headers['x-cache']; // Clean up (TODO: others)"," cacheEntry.push(200);"," cacheEntry.push(headers);"," cacheEntry.push.apply(cacheEntry, arr);"," });"," });",""," if (req.method == 'GET' || req.method == 'HEAD') {"," if (ranges) {"," next();"," } else if (!hasCookies && hit && !mustRevalidate(req, hit)) {"," res.setHeader('X-Cache', 'HIT');"," respondFromCache(req, res, hit);"," } else {"," res.setHeader('X-Cache', 'MISS');"," next();"," }"," } else {"," next();"," }"," }","};","","/**"," * Respond with the provided cached value."," * TODO: Assume 200 code, that's iffy."," *"," * @param {Object} req"," * @param {Object} res"," * @param {Object} cacheEntry"," * @return {String}"," * @api private"," */","","function respondFromCache(req, res, cacheEntry) {"," var status = cacheEntry[0]"," , headers = utils.merge({}, cacheEntry[1])"," , content = cacheEntry.slice(2);",""," headers.age = (new Date - new Date(headers.date)) / 1000 || 0;",""," switch (req.method) {"," case 'HEAD':"," res.writeHead(status, headers);"," res.end();"," break;"," case 'GET':"," if (utils.conditionalGET(req) && fresh(req.headers, headers)) {"," headers['content-length'] = 0;"," res.writeHead(304, headers);"," res.end();"," } else {"," res.writeHead(status, headers);",""," function write() {"," while (content.length) {"," if (false === res.write(content.shift())) {"," res.once('drain', write);"," return;"," }"," }"," res.end();"," }",""," write();"," }"," break;"," default:"," // This should never happen."," res.writeHead(500, '');"," res.end();"," }","}","","/**"," * Determine whether or not a cached value must be revalidated."," *"," * @param {Object} req"," * @param {Object} cacheEntry"," * @return {String}"," * @api private"," */","","function mustRevalidate(req, cacheEntry) {"," var cacheHeaders = cacheEntry[1]"," , reqCC = utils.parseCacheControl(req.headers['cache-control'] || '')"," , cacheCC = utils.parseCacheControl(cacheHeaders['cache-control'] || '')"," , cacheAge = (new Date - new Date(cacheHeaders.date)) / 1000 || 0;",""," if ( cacheCC['no-cache']"," || cacheCC['must-revalidate']"," || cacheCC['proxy-revalidate']) return true;",""," if (reqCC['no-cache']) return true;",""," if (null != reqCC['max-age']) return reqCC['max-age'] < cacheAge;",""," if (null != cacheCC['max-age']) return cacheCC['max-age'] < cacheAge;",""," return false;","}","","/**"," * The key to use in the cache. For now, this is the URL path and query."," *"," * 'http://example.com?key=value' -> '/?key=value'"," *"," * @param {Object} req"," * @return {String}"," * @api private"," */","","function cacheKey(req) {"," return utils.parseUrl(req).path;","}"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/timeout.js b/node_modules/express/node_modules/connect/lib-cov/middleware/timeout.js deleted file mode 100644 index de0e573..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/timeout.js +++ /dev/null @@ -1,66 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/timeout.js']) { - _$jscoverage['middleware/timeout.js'] = []; - _$jscoverage['middleware/timeout.js'][12] = 0; - _$jscoverage['middleware/timeout.js'][30] = 0; - _$jscoverage['middleware/timeout.js'][31] = 0; - _$jscoverage['middleware/timeout.js'][33] = 0; - _$jscoverage['middleware/timeout.js'][34] = 0; - _$jscoverage['middleware/timeout.js'][35] = 0; - _$jscoverage['middleware/timeout.js'][38] = 0; - _$jscoverage['middleware/timeout.js'][39] = 0; - _$jscoverage['middleware/timeout.js'][40] = 0; - _$jscoverage['middleware/timeout.js'][41] = 0; - _$jscoverage['middleware/timeout.js'][42] = 0; - _$jscoverage['middleware/timeout.js'][43] = 0; - _$jscoverage['middleware/timeout.js'][46] = 0; - _$jscoverage['middleware/timeout.js'][47] = 0; - _$jscoverage['middleware/timeout.js'][50] = 0; - _$jscoverage['middleware/timeout.js'][51] = 0; - _$jscoverage['middleware/timeout.js'][54] = 0; -} -_$jscoverage['middleware/timeout.js'][12]++; -var debug = require("debug")("connect:timeout"); -_$jscoverage['middleware/timeout.js'][30]++; -module.exports = (function timeout(ms) { - _$jscoverage['middleware/timeout.js'][31]++; - ms = ms || 5000; - _$jscoverage['middleware/timeout.js'][33]++; - return (function (req, res, next) { - _$jscoverage['middleware/timeout.js'][34]++; - var id = setTimeout((function () { - _$jscoverage['middleware/timeout.js'][35]++; - req.emit("timeout", ms); -}), ms); - _$jscoverage['middleware/timeout.js'][38]++; - req.on("timeout", (function () { - _$jscoverage['middleware/timeout.js'][39]++; - if (req.headerSent) { - _$jscoverage['middleware/timeout.js'][39]++; - return debug("response started, cannot timeout"); - } - _$jscoverage['middleware/timeout.js'][40]++; - var err = new Error("Request timeout"); - _$jscoverage['middleware/timeout.js'][41]++; - err.timeout = ms; - _$jscoverage['middleware/timeout.js'][42]++; - err.status = 408; - _$jscoverage['middleware/timeout.js'][43]++; - next(err); -})); - _$jscoverage['middleware/timeout.js'][46]++; - req.clearTimeout = (function () { - _$jscoverage['middleware/timeout.js'][47]++; - clearTimeout(id); -}); - _$jscoverage['middleware/timeout.js'][50]++; - res.on("header", (function () { - _$jscoverage['middleware/timeout.js'][51]++; - clearTimeout(id); -})); - _$jscoverage['middleware/timeout.js'][54]++; - next(); -}); -}); -_$jscoverage['middleware/timeout.js'].source = ["","/*!"," * Connect - timeout"," * Ported from https://github.com/LearnBoost/connect-timeout"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var debug = require('debug')('connect:timeout');","","/**"," * Timeout:"," *"," * Times out the request in `ms`, defaulting to `5000`. The"," * method `req.clearTimeout()` is added to revert this behaviour"," * programmatically within your application's middleware, routes, etc."," *"," * The timeout error is passed to `next()` so that you may customize"," * the response behaviour. This error has the `.timeout` property as"," * well as `.status == 408`."," *"," * @param {Number} ms"," * @return {Function}"," * @api public"," */","","module.exports = function timeout(ms) {"," ms = ms || 5000;",""," return function(req, res, next) {"," var id = setTimeout(function(){"," req.emit('timeout', ms);"," }, ms);",""," req.on('timeout', function(){"," if (req.headerSent) return debug('response started, cannot timeout');"," var err = new Error('Request timeout');"," err.timeout = ms;"," err.status = 408;"," next(err);"," });",""," req.clearTimeout = function(){"," clearTimeout(id);"," };",""," res.on('header', function(){"," clearTimeout(id);"," });",""," next();"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/urlencoded.js b/node_modules/express/node_modules/connect/lib-cov/middleware/urlencoded.js deleted file mode 100644 index c8dbcef..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/urlencoded.js +++ /dev/null @@ -1,98 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/urlencoded.js']) { - _$jscoverage['middleware/urlencoded.js'] = []; - _$jscoverage['middleware/urlencoded.js'][13] = 0; - _$jscoverage['middleware/urlencoded.js'][21] = 0; - _$jscoverage['middleware/urlencoded.js'][22] = 0; - _$jscoverage['middleware/urlencoded.js'][40] = 0; - _$jscoverage['middleware/urlencoded.js'][41] = 0; - _$jscoverage['middleware/urlencoded.js'][43] = 0; - _$jscoverage['middleware/urlencoded.js'][47] = 0; - _$jscoverage['middleware/urlencoded.js'][48] = 0; - _$jscoverage['middleware/urlencoded.js'][49] = 0; - _$jscoverage['middleware/urlencoded.js'][51] = 0; - _$jscoverage['middleware/urlencoded.js'][54] = 0; - _$jscoverage['middleware/urlencoded.js'][57] = 0; - _$jscoverage['middleware/urlencoded.js'][60] = 0; - _$jscoverage['middleware/urlencoded.js'][61] = 0; - _$jscoverage['middleware/urlencoded.js'][62] = 0; - _$jscoverage['middleware/urlencoded.js'][63] = 0; - _$jscoverage['middleware/urlencoded.js'][64] = 0; - _$jscoverage['middleware/urlencoded.js'][65] = 0; - _$jscoverage['middleware/urlencoded.js'][66] = 0; - _$jscoverage['middleware/urlencoded.js'][67] = 0; - _$jscoverage['middleware/urlencoded.js'][70] = 0; - _$jscoverage['middleware/urlencoded.js'][72] = 0; - _$jscoverage['middleware/urlencoded.js'][73] = 0; -} -_$jscoverage['middleware/urlencoded.js'][13]++; -var utils = require("../utils"), _limit = require("./limit"), qs = require("qs"); -_$jscoverage['middleware/urlencoded.js'][21]++; -function noop(req, res, next) { - _$jscoverage['middleware/urlencoded.js'][22]++; - next(); -} -_$jscoverage['middleware/urlencoded.js'][40]++; -exports = module.exports = (function (options) { - _$jscoverage['middleware/urlencoded.js'][41]++; - options = options || {}; - _$jscoverage['middleware/urlencoded.js'][43]++; - var limit = options.limit? _limit(options.limit): noop; - _$jscoverage['middleware/urlencoded.js'][47]++; - return (function urlencoded(req, res, next) { - _$jscoverage['middleware/urlencoded.js'][48]++; - if (req._body) { - _$jscoverage['middleware/urlencoded.js'][48]++; - return next(); - } - _$jscoverage['middleware/urlencoded.js'][49]++; - req.body = req.body || {}; - _$jscoverage['middleware/urlencoded.js'][51]++; - if (! utils.hasBody(req)) { - _$jscoverage['middleware/urlencoded.js'][51]++; - return next(); - } - _$jscoverage['middleware/urlencoded.js'][54]++; - if ("application/x-www-form-urlencoded" != utils.mime(req)) { - _$jscoverage['middleware/urlencoded.js'][54]++; - return next(); - } - _$jscoverage['middleware/urlencoded.js'][57]++; - req._body = true; - _$jscoverage['middleware/urlencoded.js'][60]++; - limit(req, res, (function (err) { - _$jscoverage['middleware/urlencoded.js'][61]++; - if (err) { - _$jscoverage['middleware/urlencoded.js'][61]++; - return next(err); - } - _$jscoverage['middleware/urlencoded.js'][62]++; - var buf = ""; - _$jscoverage['middleware/urlencoded.js'][63]++; - req.setEncoding("utf8"); - _$jscoverage['middleware/urlencoded.js'][64]++; - req.on("data", (function (chunk) { - _$jscoverage['middleware/urlencoded.js'][64]++; - buf += chunk; -})); - _$jscoverage['middleware/urlencoded.js'][65]++; - req.on("end", (function () { - _$jscoverage['middleware/urlencoded.js'][66]++; - try { - _$jscoverage['middleware/urlencoded.js'][67]++; - req.body = buf.length? qs.parse(buf, options): {}; - _$jscoverage['middleware/urlencoded.js'][70]++; - next(); - } - catch (err) { - _$jscoverage['middleware/urlencoded.js'][72]++; - err.body = buf; - _$jscoverage['middleware/urlencoded.js'][73]++; - next(err); - } -})); -})); -}); -}); -_$jscoverage['middleware/urlencoded.js'].source = ["","/*!"," * Connect - urlencoded"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var utils = require('../utils')"," , _limit = require('./limit')"," , qs = require('qs');","","/**"," * noop middleware."," */","","function noop(req, res, next) {"," next();","}","","/**"," * Urlencoded:"," * "," * Parse x-ww-form-urlencoded request bodies,"," * providing the parsed object as `req.body`."," *"," * Options:"," *"," * - `limit` byte limit disabled by default"," *"," * @param {Object} options"," * @return {Function}"," * @api public"," */","","exports = module.exports = function(options){"," options = options || {};",""," var limit = options.limit"," ? _limit(options.limit)"," : noop;",""," return function urlencoded(req, res, next) {"," if (req._body) return next();"," req.body = req.body || {};",""," if (!utils.hasBody(req)) return next();",""," // check Content-Type"," if ('application/x-www-form-urlencoded' != utils.mime(req)) return next();",""," // flag as parsed"," req._body = true;",""," // parse"," limit(req, res, function(err){"," if (err) return next(err);"," var buf = '';"," req.setEncoding('utf8');"," req.on('data', function(chunk){ buf += chunk });"," req.on('end', function(){"," try {"," req.body = buf.length"," ? qs.parse(buf, options)"," : {};"," next();"," } catch (err){"," err.body = buf;"," next(err);"," }"," });"," });"," }","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/middleware/vhost.js b/node_modules/express/node_modules/connect/lib-cov/middleware/vhost.js deleted file mode 100644 index b069e5c..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/middleware/vhost.js +++ /dev/null @@ -1,59 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['middleware/vhost.js']) { - _$jscoverage['middleware/vhost.js'] = []; - _$jscoverage['middleware/vhost.js'][28] = 0; - _$jscoverage['middleware/vhost.js'][29] = 0; - _$jscoverage['middleware/vhost.js'][30] = 0; - _$jscoverage['middleware/vhost.js'][31] = 0; - _$jscoverage['middleware/vhost.js'][32] = 0; - _$jscoverage['middleware/vhost.js'][33] = 0; - _$jscoverage['middleware/vhost.js'][34] = 0; - _$jscoverage['middleware/vhost.js'][35] = 0; - _$jscoverage['middleware/vhost.js'][36] = 0; - _$jscoverage['middleware/vhost.js'][37] = 0; - _$jscoverage['middleware/vhost.js'][38] = 0; -} -_$jscoverage['middleware/vhost.js'][28]++; -module.exports = (function vhost(hostname, server) { - _$jscoverage['middleware/vhost.js'][29]++; - if (! hostname) { - _$jscoverage['middleware/vhost.js'][29]++; - throw new Error("vhost hostname required"); - } - _$jscoverage['middleware/vhost.js'][30]++; - if (! server) { - _$jscoverage['middleware/vhost.js'][30]++; - throw new Error("vhost server required"); - } - _$jscoverage['middleware/vhost.js'][31]++; - var regexp = new RegExp("^" + hostname.replace(/[*]/g, "(.*?)") + "$", "i"); - _$jscoverage['middleware/vhost.js'][32]++; - if (server.onvhost) { - _$jscoverage['middleware/vhost.js'][32]++; - server.onvhost(hostname); - } - _$jscoverage['middleware/vhost.js'][33]++; - return (function vhost(req, res, next) { - _$jscoverage['middleware/vhost.js'][34]++; - if (! req.headers.host) { - _$jscoverage['middleware/vhost.js'][34]++; - return next(); - } - _$jscoverage['middleware/vhost.js'][35]++; - var host = req.headers.host.split(":")[0]; - _$jscoverage['middleware/vhost.js'][36]++; - if (! regexp.test(host)) { - _$jscoverage['middleware/vhost.js'][36]++; - return next(); - } - _$jscoverage['middleware/vhost.js'][37]++; - if ("function" == typeof server) { - _$jscoverage['middleware/vhost.js'][37]++; - return server(req, res, next); - } - _$jscoverage['middleware/vhost.js'][38]++; - server.emit("request", req, res); -}); -}); -_$jscoverage['middleware/vhost.js'].source = ["","/*!"," * Connect - vhost"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Vhost:"," * "," * Setup vhost for the given `hostname` and `server`."," *"," * connect()"," * .use(connect.vhost('foo.com', fooApp))"," * .use(connect.vhost('bar.com', barApp))"," * .use(connect.vhost('*.com', mainApp))"," *"," * The `server` may be a Connect server or"," * a regular Node `http.Server`. "," *"," * @param {String} hostname"," * @param {Server} server"," * @return {Function}"," * @api public"," */","","module.exports = function vhost(hostname, server){"," if (!hostname) throw new Error('vhost hostname required');"," if (!server) throw new Error('vhost server required');"," var regexp = new RegExp('^' + hostname.replace(/[*]/g, '(.*?)') + '$', 'i');"," if (server.onvhost) server.onvhost(hostname);"," return function vhost(req, res, next){"," if (!req.headers.host) return next();"," var host = req.headers.host.split(':')[0];"," if (!regexp.test(host)) return next();"," if ('function' == typeof server) return server(req, res, next);"," server.emit('request', req, res);"," };","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/patch.js b/node_modules/express/node_modules/connect/lib-cov/patch.js deleted file mode 100644 index 7d59643..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/patch.js +++ /dev/null @@ -1,85 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['patch.js']) { - _$jscoverage['patch.js'] = []; - _$jscoverage['patch.js'][12] = 0; - _$jscoverage['patch.js'][20] = 0; - _$jscoverage['patch.js'][30] = 0; - _$jscoverage['patch.js'][31] = 0; - _$jscoverage['patch.js'][43] = 0; - _$jscoverage['patch.js'][44] = 0; - _$jscoverage['patch.js'][48] = 0; - _$jscoverage['patch.js'][49] = 0; - _$jscoverage['patch.js'][50] = 0; - _$jscoverage['patch.js'][55] = 0; - _$jscoverage['patch.js'][56] = 0; - _$jscoverage['patch.js'][59] = 0; - _$jscoverage['patch.js'][66] = 0; - _$jscoverage['patch.js'][67] = 0; - _$jscoverage['patch.js'][68] = 0; - _$jscoverage['patch.js'][69] = 0; - _$jscoverage['patch.js'][72] = 0; - _$jscoverage['patch.js'][73] = 0; - _$jscoverage['patch.js'][74] = 0; - _$jscoverage['patch.js'][75] = 0; - _$jscoverage['patch.js'][78] = 0; -} -_$jscoverage['patch.js'][12]++; -var http = require("http"), res = http.ServerResponse.prototype, setHeader = res.setHeader, _renderHeaders = res._renderHeaders, writeHead = res.writeHead; -_$jscoverage['patch.js'][20]++; -if (! res._hasConnectPatch) { - _$jscoverage['patch.js'][30]++; - res.__defineGetter__("headerSent", (function () { - _$jscoverage['patch.js'][31]++; - return this._header; -})); - _$jscoverage['patch.js'][43]++; - res.setHeader = (function (field, val) { - _$jscoverage['patch.js'][44]++; - var key = field.toLowerCase(), prev; - _$jscoverage['patch.js'][48]++; - if (this._headers && "set-cookie" == key) { - _$jscoverage['patch.js'][49]++; - if (prev = this.getHeader(field)) { - _$jscoverage['patch.js'][50]++; - val = Array.isArray(prev)? prev.concat(val): [prev, val]; - } - } - else { - _$jscoverage['patch.js'][55]++; - if ("content-type" == key && this.charset) { - _$jscoverage['patch.js'][56]++; - val += "; charset=" + this.charset; - } - } - _$jscoverage['patch.js'][59]++; - return setHeader.call(this, field, val); -}); - _$jscoverage['patch.js'][66]++; - res._renderHeaders = (function () { - _$jscoverage['patch.js'][67]++; - if (! this._emittedHeader) { - _$jscoverage['patch.js'][67]++; - this.emit("header"); - } - _$jscoverage['patch.js'][68]++; - this._emittedHeader = true; - _$jscoverage['patch.js'][69]++; - return _renderHeaders.call(this); -}); - _$jscoverage['patch.js'][72]++; - res.writeHead = (function () { - _$jscoverage['patch.js'][73]++; - if (! this._emittedHeader) { - _$jscoverage['patch.js'][73]++; - this.emit("header"); - } - _$jscoverage['patch.js'][74]++; - this._emittedHeader = true; - _$jscoverage['patch.js'][75]++; - return writeHead.apply(this, arguments); -}); - _$jscoverage['patch.js'][78]++; - res._hasConnectPatch = true; -} -_$jscoverage['patch.js'].source = ["","/*!"," * Connect"," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var http = require('http')"," , res = http.ServerResponse.prototype"," , setHeader = res.setHeader"," , _renderHeaders = res._renderHeaders"," , writeHead = res.writeHead;","","// apply only once","","if (!res._hasConnectPatch) {",""," /**"," * Provide a public \"header sent\" flag"," * until node does."," *"," * @return {Boolean}"," * @api public"," */",""," res.__defineGetter__('headerSent', function(){"," return this._header;"," });",""," /**"," * Set header `field` to `val`, special-casing"," * the `Set-Cookie` field for multiple support."," *"," * @param {String} field"," * @param {String} val"," * @api public"," */",""," res.setHeader = function(field, val){"," var key = field.toLowerCase()"," , prev;",""," // special-case Set-Cookie"," if (this._headers && 'set-cookie' == key) {"," if (prev = this.getHeader(field)) {"," val = Array.isArray(prev)"," ? prev.concat(val)"," : [prev, val];"," }"," // charset"," } else if ('content-type' == key && this.charset) {"," val += '; charset=' + this.charset;"," }",""," return setHeader.call(this, field, val);"," };",""," /**"," * Proxy to emit \"header\" event."," */",""," res._renderHeaders = function(){"," if (!this._emittedHeader) this.emit('header');"," this._emittedHeader = true;"," return _renderHeaders.call(this);"," };",""," res.writeHead = function(){"," if (!this._emittedHeader) this.emit('header');"," this._emittedHeader = true;"," return writeHead.apply(this, arguments);"," };",""," res._hasConnectPatch = true;","}"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/proto.js b/node_modules/express/node_modules/connect/lib-cov/proto.js deleted file mode 100644 index e8ecb99..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/proto.js +++ /dev/null @@ -1,285 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['proto.js']) { - _$jscoverage['proto.js'] = []; - _$jscoverage['proto.js'][13] = 0; - _$jscoverage['proto.js'][19] = 0; - _$jscoverage['proto.js'][23] = 0; - _$jscoverage['proto.js'][62] = 0; - _$jscoverage['proto.js'][64] = 0; - _$jscoverage['proto.js'][65] = 0; - _$jscoverage['proto.js'][66] = 0; - _$jscoverage['proto.js'][70] = 0; - _$jscoverage['proto.js'][71] = 0; - _$jscoverage['proto.js'][72] = 0; - _$jscoverage['proto.js'][73] = 0; - _$jscoverage['proto.js'][74] = 0; - _$jscoverage['proto.js'][79] = 0; - _$jscoverage['proto.js'][80] = 0; - _$jscoverage['proto.js'][84] = 0; - _$jscoverage['proto.js'][85] = 0; - _$jscoverage['proto.js'][89] = 0; - _$jscoverage['proto.js'][90] = 0; - _$jscoverage['proto.js'][92] = 0; - _$jscoverage['proto.js'][102] = 0; - _$jscoverage['proto.js'][103] = 0; - _$jscoverage['proto.js'][109] = 0; - _$jscoverage['proto.js'][110] = 0; - _$jscoverage['proto.js'][112] = 0; - _$jscoverage['proto.js'][113] = 0; - _$jscoverage['proto.js'][114] = 0; - _$jscoverage['proto.js'][117] = 0; - _$jscoverage['proto.js'][118] = 0; - _$jscoverage['proto.js'][119] = 0; - _$jscoverage['proto.js'][122] = 0; - _$jscoverage['proto.js'][125] = 0; - _$jscoverage['proto.js'][127] = 0; - _$jscoverage['proto.js'][130] = 0; - _$jscoverage['proto.js'][132] = 0; - _$jscoverage['proto.js'][133] = 0; - _$jscoverage['proto.js'][136] = 0; - _$jscoverage['proto.js'][139] = 0; - _$jscoverage['proto.js'][144] = 0; - _$jscoverage['proto.js'][145] = 0; - _$jscoverage['proto.js'][146] = 0; - _$jscoverage['proto.js'][147] = 0; - _$jscoverage['proto.js'][148] = 0; - _$jscoverage['proto.js'][149] = 0; - _$jscoverage['proto.js'][151] = 0; - _$jscoverage['proto.js'][152] = 0; - _$jscoverage['proto.js'][153] = 0; - _$jscoverage['proto.js'][154] = 0; - _$jscoverage['proto.js'][155] = 0; - _$jscoverage['proto.js'][157] = 0; - _$jscoverage['proto.js'][160] = 0; - _$jscoverage['proto.js'][161] = 0; - _$jscoverage['proto.js'][162] = 0; - _$jscoverage['proto.js'][165] = 0; - _$jscoverage['proto.js'][167] = 0; - _$jscoverage['proto.js'][168] = 0; - _$jscoverage['proto.js'][172] = 0; - _$jscoverage['proto.js'][173] = 0; - _$jscoverage['proto.js'][176] = 0; - _$jscoverage['proto.js'][177] = 0; - _$jscoverage['proto.js'][178] = 0; - _$jscoverage['proto.js'][181] = 0; - _$jscoverage['proto.js'][182] = 0; - _$jscoverage['proto.js'][183] = 0; - _$jscoverage['proto.js'][184] = 0; - _$jscoverage['proto.js'][185] = 0; - _$jscoverage['proto.js'][187] = 0; - _$jscoverage['proto.js'][189] = 0; - _$jscoverage['proto.js'][190] = 0; - _$jscoverage['proto.js'][192] = 0; - _$jscoverage['proto.js'][195] = 0; - _$jscoverage['proto.js'][198] = 0; - _$jscoverage['proto.js'][227] = 0; - _$jscoverage['proto.js'][228] = 0; - _$jscoverage['proto.js'][229] = 0; -} -_$jscoverage['proto.js'][13]++; -var http = require("http"), utils = require("./utils"), debug = require("debug")("connect:dispatcher"); -_$jscoverage['proto.js'][19]++; -var app = module.exports = {}; -_$jscoverage['proto.js'][23]++; -var env = process.env.NODE_ENV || "development"; -_$jscoverage['proto.js'][62]++; -app.use = (function (route, fn) { - _$jscoverage['proto.js'][64]++; - if ("string" != typeof route) { - _$jscoverage['proto.js'][65]++; - fn = route; - _$jscoverage['proto.js'][66]++; - route = "/"; - } - _$jscoverage['proto.js'][70]++; - if ("function" == typeof fn.handle) { - _$jscoverage['proto.js'][71]++; - var server = fn; - _$jscoverage['proto.js'][72]++; - fn.route = route; - _$jscoverage['proto.js'][73]++; - fn = (function (req, res, next) { - _$jscoverage['proto.js'][74]++; - server.handle(req, res, next); -}); - } - _$jscoverage['proto.js'][79]++; - if (fn instanceof http.Server) { - _$jscoverage['proto.js'][80]++; - fn = fn.listeners("request")[0]; - } - _$jscoverage['proto.js'][84]++; - if ("/" == route[route.length - 1]) { - _$jscoverage['proto.js'][85]++; - route = route.slice(0, -1); - } - _$jscoverage['proto.js'][89]++; - debug("use %s %s", route || "/", fn.name || "anonymous"); - _$jscoverage['proto.js'][90]++; - this.stack.push({route: route, handle: fn}); - _$jscoverage['proto.js'][92]++; - return this; -}); -_$jscoverage['proto.js'][102]++; -app.handle = (function (req, res, out) { - _$jscoverage['proto.js'][103]++; - var stack = this.stack, fqdn = ~ req.url.indexOf("://"), removed = "", slashAdded = false, index = 0; - _$jscoverage['proto.js'][109]++; - function next(err) { - _$jscoverage['proto.js'][110]++; - var layer, path, status, c; - _$jscoverage['proto.js'][112]++; - if (slashAdded) { - _$jscoverage['proto.js'][113]++; - req.url = req.url.substr(1); - _$jscoverage['proto.js'][114]++; - slashAdded = false; - } - _$jscoverage['proto.js'][117]++; - req.url = removed + req.url; - _$jscoverage['proto.js'][118]++; - req.originalUrl = req.originalUrl || req.url; - _$jscoverage['proto.js'][119]++; - removed = ""; - _$jscoverage['proto.js'][122]++; - layer = stack[index++]; - _$jscoverage['proto.js'][125]++; - if (! layer || res.headerSent) { - _$jscoverage['proto.js'][127]++; - if (out) { - _$jscoverage['proto.js'][127]++; - return out(err); - } - _$jscoverage['proto.js'][130]++; - if (err) { - _$jscoverage['proto.js'][132]++; - if (res.statusCode < 400) { - _$jscoverage['proto.js'][132]++; - res.statusCode = 500; - } - _$jscoverage['proto.js'][133]++; - debug("default %s", res.statusCode); - _$jscoverage['proto.js'][136]++; - if (err.status) { - _$jscoverage['proto.js'][136]++; - res.statusCode = err.status; - } - _$jscoverage['proto.js'][139]++; - var msg = "production" == env? http.STATUS_CODES[res.statusCode]: err.stack || err.toString(); - _$jscoverage['proto.js'][144]++; - if ("test" != env) { - _$jscoverage['proto.js'][144]++; - console.error(err.stack || err.toString()); - } - _$jscoverage['proto.js'][145]++; - if (res.headerSent) { - _$jscoverage['proto.js'][145]++; - return req.socket.destroy(); - } - _$jscoverage['proto.js'][146]++; - res.setHeader("Content-Type", "text/plain"); - _$jscoverage['proto.js'][147]++; - res.setHeader("Content-Length", Buffer.byteLength(msg)); - _$jscoverage['proto.js'][148]++; - if ("HEAD" == req.method) { - _$jscoverage['proto.js'][148]++; - return res.end(); - } - _$jscoverage['proto.js'][149]++; - res.end(msg); - } - else { - _$jscoverage['proto.js'][151]++; - debug("default 404"); - _$jscoverage['proto.js'][152]++; - res.statusCode = 404; - _$jscoverage['proto.js'][153]++; - res.setHeader("Content-Type", "text/plain"); - _$jscoverage['proto.js'][154]++; - if ("HEAD" == req.method) { - _$jscoverage['proto.js'][154]++; - return res.end(); - } - _$jscoverage['proto.js'][155]++; - res.end("Cannot " + req.method + " " + utils.escape(req.originalUrl)); - } - _$jscoverage['proto.js'][157]++; - return; - } - _$jscoverage['proto.js'][160]++; - try { - _$jscoverage['proto.js'][161]++; - path = utils.parseUrl(req).pathname; - _$jscoverage['proto.js'][162]++; - if (undefined == path) { - _$jscoverage['proto.js'][162]++; - path = "/"; - } - _$jscoverage['proto.js'][165]++; - if (0 != path.toLowerCase().indexOf(layer.route.toLowerCase())) { - _$jscoverage['proto.js'][165]++; - return next(err); - } - _$jscoverage['proto.js'][167]++; - c = path[layer.route.length]; - _$jscoverage['proto.js'][168]++; - if (c && "/" != c && "." != c) { - _$jscoverage['proto.js'][168]++; - return next(err); - } - _$jscoverage['proto.js'][172]++; - removed = layer.route; - _$jscoverage['proto.js'][173]++; - req.url = req.url.substr(removed.length); - _$jscoverage['proto.js'][176]++; - if (! fqdn && "/" != req.url[0]) { - _$jscoverage['proto.js'][177]++; - req.url = "/" + req.url; - _$jscoverage['proto.js'][178]++; - slashAdded = true; - } - _$jscoverage['proto.js'][181]++; - debug("%s", layer.handle.name || "anonymous"); - _$jscoverage['proto.js'][182]++; - var arity = layer.handle.length; - _$jscoverage['proto.js'][183]++; - if (err) { - _$jscoverage['proto.js'][184]++; - if (arity === 4) { - _$jscoverage['proto.js'][185]++; - layer.handle(err, req, res, next); - } - else { - _$jscoverage['proto.js'][187]++; - next(err); - } - } - else { - _$jscoverage['proto.js'][189]++; - if (arity < 4) { - _$jscoverage['proto.js'][190]++; - layer.handle(req, res, next); - } - else { - _$jscoverage['proto.js'][192]++; - next(); - } - } - } - catch (e) { - _$jscoverage['proto.js'][195]++; - next(e); - } -} - _$jscoverage['proto.js'][198]++; - next(); -}); -_$jscoverage['proto.js'][227]++; -app.listen = (function () { - _$jscoverage['proto.js'][228]++; - var server = http.createServer(this); - _$jscoverage['proto.js'][229]++; - return server.listen.apply(server, arguments); -}); -_$jscoverage['proto.js'].source = ["","/*!"," * Connect - HTTPServer"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var http = require('http')"," , utils = require('./utils')"," , debug = require('debug')('connect:dispatcher');","","// prototype","","var app = module.exports = {};","","// environment","","var env = process.env.NODE_ENV || 'development';","","/**"," * Utilize the given middleware `handle` to the given `route`,"," * defaulting to _/_. This \"route\" is the mount-point for the"," * middleware, when given a value other than _/_ the middleware"," * is only effective when that segment is present in the request's"," * pathname."," *"," * For example if we were to mount a function at _/admin_, it would"," * be invoked on _/admin_, and _/admin/settings_, however it would"," * not be invoked for _/_, or _/posts_."," *"," * Examples:"," *"," * var app = connect();"," * app.use(connect.favicon());"," * app.use(connect.logger());"," * app.use(connect.static(__dirname + '/public'));"," *"," * If we wanted to prefix static files with _/public_, we could"," * \"mount\" the `static()` middleware:"," *"," * app.use('/public', connect.static(__dirname + '/public'));"," *"," * This api is chainable, so the following is valid:"," *"," * connect()"," * .use(connect.favicon())"," * .use(connect.logger())"," * .use(connect.static(__dirname + '/public'))"," * .listen(3000);"," *"," * @param {String|Function|Server} route, callback or server"," * @param {Function|Server} callback or server"," * @return {Server} for chaining"," * @api public"," */","","app.use = function(route, fn){"," // default route to '/'"," if ('string' != typeof route) {"," fn = route;"," route = '/';"," }",""," // wrap sub-apps"," if ('function' == typeof fn.handle) {"," var server = fn;"," fn.route = route;"," fn = function(req, res, next){"," server.handle(req, res, next);"," };"," }",""," // wrap vanilla http.Servers"," if (fn instanceof http.Server) {"," fn = fn.listeners('request')[0];"," }",""," // strip trailing slash"," if ('/' == route[route.length - 1]) {"," route = route.slice(0, -1);"," }",""," // add the middleware"," debug('use %s %s', route || '/', fn.name || 'anonymous');"," this.stack.push({ route: route, handle: fn });",""," return this;","};","","/**"," * Handle server requests, punting them down"," * the middleware stack."," *"," * @api private"," */","","app.handle = function(req, res, out) {"," var stack = this.stack"," , fqdn = ~req.url.indexOf('://')"," , removed = ''"," , slashAdded = false"," , index = 0;",""," function next(err) {"," var layer, path, status, c;",""," if (slashAdded) {"," req.url = req.url.substr(1);"," slashAdded = false;"," }",""," req.url = removed + req.url;"," req.originalUrl = req.originalUrl || req.url;"," removed = '';",""," // next callback"," layer = stack[index++];",""," // all done"," if (!layer || res.headerSent) {"," // delegate to parent"," if (out) return out(err);",""," // unhandled error"," if (err) {"," // default to 500"," if (res.statusCode < 400) res.statusCode = 500;"," debug('default %s', res.statusCode);",""," // respect err.status"," if (err.status) res.statusCode = err.status;",""," // production gets a basic error message"," var msg = 'production' == env"," ? http.STATUS_CODES[res.statusCode]"," : err.stack || err.toString();",""," // log to stderr in a non-test env"," if ('test' != env) console.error(err.stack || err.toString());"," if (res.headerSent) return req.socket.destroy();"," res.setHeader('Content-Type', 'text/plain');"," res.setHeader('Content-Length', Buffer.byteLength(msg));"," if ('HEAD' == req.method) return res.end();"," res.end(msg);"," } else {"," debug('default 404');"," res.statusCode = 404;"," res.setHeader('Content-Type', 'text/plain');"," if ('HEAD' == req.method) return res.end();"," res.end('Cannot ' + req.method + ' ' + utils.escape(req.originalUrl));"," }"," return;"," }",""," try {"," path = utils.parseUrl(req).pathname;"," if (undefined == path) path = '/';",""," // skip this layer if the route doesn't match."," if (0 != path.toLowerCase().indexOf(layer.route.toLowerCase())) return next(err);",""," c = path[layer.route.length];"," if (c && '/' != c && '.' != c) return next(err);",""," // Call the layer handler"," // Trim off the part of the url that matches the route"," removed = layer.route;"," req.url = req.url.substr(removed.length);",""," // Ensure leading slash"," if (!fqdn && '/' != req.url[0]) {"," req.url = '/' + req.url;"," slashAdded = true;"," }",""," debug('%s', layer.handle.name || 'anonymous');"," var arity = layer.handle.length;"," if (err) {"," if (arity === 4) {"," layer.handle(err, req, res, next);"," } else {"," next(err);"," }"," } else if (arity < 4) {"," layer.handle(req, res, next);"," } else {"," next();"," }"," } catch (e) {"," next(e);"," }"," }"," next();","};","","/**"," * Listen for connections."," *"," * This method takes the same arguments"," * as node's `http.Server#listen()`. "," *"," * HTTP and HTTPS:"," *"," * If you run your application both as HTTP"," * and HTTPS you may wrap them individually,"," * since your Connect \"server\" is really just"," * a JavaScript `Function`."," *"," * var connect = require('connect')"," * , http = require('http')"," * , https = require('https');"," * "," * var app = connect();"," * "," * http.createServer(app).listen(80);"," * https.createServer(options, app).listen(443);"," *"," * @return {http.Server}"," * @api public"," */","","app.listen = function(){"," var server = http.createServer(this);"," return server.listen.apply(server, arguments);","};"]; diff --git a/node_modules/express/node_modules/connect/lib-cov/public/directory.html b/node_modules/express/node_modules/connect/lib-cov/public/directory.html deleted file mode 100644 index 15164bb..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/public/directory.html +++ /dev/null @@ -1,75 +0,0 @@ - - - listing directory {directory} - - - - - -
    -

    {linked-path}

    - {files} -
    - - \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/lib-cov/public/error.html b/node_modules/express/node_modules/connect/lib-cov/public/error.html deleted file mode 100644 index c5ae73a..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/public/error.html +++ /dev/null @@ -1,13 +0,0 @@ - - - {error} - - - -
    -

    {title}

    -

    {statusCode} {error}

    -
      {stack}
    -
    - - diff --git a/node_modules/express/node_modules/connect/lib-cov/public/favicon.ico b/node_modules/express/node_modules/connect/lib-cov/public/favicon.ico deleted file mode 100644 index 895fc96a76b68b4924f1c51d022e1b82fa0f461f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcmZQzU<5(|0R}M0U}azs1F|%L7$l?s#Ec9aKoZP=&}i&OouUjIY8@C}uZw4x5z5N2 zvEG^C^vXtt_xtJ?p3O32c(KTx;lsgZhW%5M85Sf}k-mf`L80)|7ga~M{a znlL=>m1Q`#uoPkbC~GtXMnhnDh5$DU1D6mx+;2QAKt3ZQFH}H~1y~00GcqzVg9QXw z_<%(a7y$V|wJgF=E>MgE#Aid|14}IyCM5MhEnxFF;pTzOK(>#80puP=gnOXwAd33` mpMe2}f66m3eB@_fcnmb^7!b1nO#opK8zcsj1F30)+jEP);68^d)m`eN0o>(5%D`Q(1;j>g@G;xlf`0VBQ`PFY?6)!N&f?*K}$p; zB!U=NBn{eB8${1}&-2_L*HuZp@ZP1@clS@cHp)4iM1ewzw59vko7eMM{e9z|%NNdX z0V;`?KKSzTCvTm5bc{L^CIKLUxc2X{i{ISz$8Sgf{q)1nXTP{`{s?9mQ$4&hPiKC- zY8q7(Y1Xu5iCf33=O4Vy(+|zQ?rW#gkKB0f%}?+6{G*qT22|DQB-73`YzA{N4W^=s zq0kQYcbtFfz zLz)H<&|z(Y4kBG67=JY6c|L1R-#TR>fC$3^Y%QEnYO1xHsf)+GU`3F<{J0kR(;pbF3)zyg$H+idfnl-wl5Wkh!vUH z4Z32YP=l_}1rZd1W_D&^$A($A+&a0e&P?xx0!ctY2}*<#p+qPVN*B(YzvAWXa*%bzq z7Fz41LKILT(GWohi9|LgIzSZBhb*Zf6R6O}WYQ4GOi&71s9lmll0x6;8&ILOl$j(c z0Z1T(6Tg09{?wd{moFHNN6PS?$|e>1MxSJ(0Z7o2)J-Zv|>acY@f`(Y@g7GwsEj5NLQo+q|HsxQ5}XSX_d@*^A9ZT9=A{W~j+$GyI1 zc4oqTHx@1FlRjw4XWyPN5i2~l_F3@aBk!0yu^aoRDvXy}8@HCjUVQUsuSH4$T5|r< zzZOn^?Wfa6y|Q($Hx4{ws+)wX6-HP4zo!S?4KJ@7PG@G3G{CjXs(p*kIrj6rHs7_y z+=<-=Q62s9FuWa^X~WKgJIAAZJR&XBB002ovPDHLkV1jCMPILeO diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_attach.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_attach.png deleted file mode 100644 index 89ee2da0753040d1ba0a3487473a715a8fe89322..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 794 zcmV+#1LgdQP)i_t#ewV_0K6;=bl;e_Jt7$~$sQ)q$+ia<4Ec+jeaGt9oWH@O|2`W6&O0t!k{B9sUvLWxkCaPsd9W(`fa z;j-|^ZI^2XnzhgZWYRW-kP&J>DWPo`%;JaBX}or79k=+Jo@h%4Eo72tqev+cB?PjP zO<|ByL#>Tehyq$jR74O$B9WDW1`tK`LzYyL3A9iAcRxLkJ`I)n}v%Od-3H>j$OTBtk>(k-9o?8PqI=0 zB&f-+KOXVnjyKJlf4iHOtnuiE_4+ZVJ$dHjU<^o^YCjQ-wt^!;rPpBv(@pFO{9rdw98 z_s@3+yta93oyfL>7AD5}r=|`zS3Gm$_|(iSl8XBd9k%=91J0j2=ivT5cJ18ZmDjh{ z$-RMd{jQ#X79#Sc diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_code.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_code.png deleted file mode 100644 index f7ea90419d950f9e69d977a1f5847456d96a5f0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 818 zcmV-21I_%2P)@LCln44|RX7Ti z0HI3&7jPq){odH{?_{%nYVq_;n_c4WbUpvU(&Cvnj!vq|kVC-vpF6vp^;;e0mm6HW z+WPzA`AZ|;pPp$&dNjzrc??4rt`k%Q1l*u-BPD0MQ}Fbm8jnsyezNt7+u{23>t7Em zJtETY?ja9KrVs^!LJ$xEMF3-bAZO;-IQJavE60KA7fO$VY_%N)R6s>g5mW>fL4&aR z*EVgKKTBXm!=L?S0?xM zYqL@C$|EDF2q*3zWW7;PDZ}SK*IE8;i!3U62=qn80C&*I1Le7WwNP5EcX;_oh2dJn zf#HgBe4@r$GcjHjmj2vAfT%(YN?}kK=(*+1*DkNNc1H5R++vfBMhACi<5uFUU+N4+ z<&U*CPmWi}REa7C6-t>2im1CWv5Jkefxa6>)dEj-CAW wWa{_}BJ!}~75?MkfaCnj>Dn=~vkLS70Pk`;z)@TQj{pDw07*qoM6N<$f@imYHUIzs diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_copy.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_copy.png deleted file mode 100644 index 195dc6d6c365d298e466026b37c1959d96119ea7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmV;I0%-k-P)^@R5;6Z z(>-WZK@^7J_sq=QY_e{46@P+~LNG}sRzZsxQHvCsN*h5ir6^j7pq-$xu$N#V1gx}9 zClV7;5)7zih-s3DB)G=7|99>ji@So7-P24n=VQ(@GctDX!^_@$bj%oviY6e4Dh;od zooe%Wvs8LEKQ&&bL&@bwi=STIAI@!-gB2jC5+?y?VR~VkrNxam-`6*8&po|RZ5LpS zNKdJ%c4bTX`XjKsnecf%W>1%6WT?pKNdLLq{=(f(Col?P1+oq@R>)W(n=x!|*BIIh z6DJGw_w`)u6yN|vAhMteYK5#b%r5^v+VCFl1IGssaclZZMS{vs-LJ2$)n7DAr6==K z<29#%AXsBsDoO}SBaXR#_Ap!JKx)(1)3O2pj0_dYWz5By*X74fRT01$Fk%P_RzOMDtV?GU{nsYq#K8iy zb6qzLYDj`_f5$BwC*WE(t0m#xYJ*=jC2|HQYHh=pf#QG7oowi`h!L!{DB$8|qY{~X zu8@sU1tWq;n$XThR0%;45mdqXM892|{CJ@0DS*}>?ami06Q_^tvM~Y3K(_-`#m!8f z8f!QIrH4y#61;0Ym0cCoLl8{IPombPHtnn7%SbTdI&G-d>ZQo!_wBMF9nzX!g8HVY xYTJPGciz9XMh3w2fmZ(7v{)r*QZD48?mrio{~IaoqP z|1Ep}yDQG09bP~E^Dk?@JiKQJ z6-pO(3~IOP)IYisL6D6;oAEd;E%zR}{U$rMRNuD6nQV7nesKS>)yLo7JuDCrD>Abi zbj3uW23?^GA}9jQ{M^8v?ejL?HaT7AX5WPZNkBmfN`w-jL?{tT7ykZt$%Yln?p_m~ z-?>&d(LD(jAd}h=LPltPQbO$*Wbyl@G-_k5jXbb#qffHY03>M1jfEqoPJQ6Mr=Byp=^jfzePZV1 zLjCmNi31hdIJHa%e;5g=1(`u3BRzfeExY%=VCu{loOr{`%2hUR*x>tL^W_TTaj);0 zpPR6CUD1+0>4TQ6zVfH3TQ;%l6#(_%yspK@3gcmG#Q4!WCPyLU93nMKk7E2pcA=l45({2jNho>sdF*A~bA zxX?-cp~y_z_kFf+yqu3m#QiB}03?Z&9vvR5TNgj<)($Vm)xq5G>|o2sFMag&6aNF+ WAT1?sQBYt20000iHtsh1EzPArg^Q zIZrOk#rNsfjaSbMAL;<4h;Z=jvu8dzyz8N&Nb7=z03ZUw?9z%8KQEa6yM5=kUnka& z3?FJk2}L7q>na=T#;<7U*P91xfF`;`6%pVgWgRy0?1ZryL@%z52=-!fGXWGEn4M351L4<+7eDgwo|moqXT+s1&Kmn>-uQQ8mL7XY)w5Zk*(g+<3Y3tmkR!bL zOUKaUtj_pX26sH+=Iorwu}MGd`_%O-_sS}8VpG#fJA)Fcs#ezwtZf?q?Ac70mDv`rVs{$od?VPKeqf<-kUjNtS6ecB*mq<&M97K^6IVsDO zt2$Ru!b+>2S<}_H>$RcInusU_8PMNdf(W{sNlJ3FkrwMJPeBPO#d}Y^a{9TH(#{Y) l0D?dWAV4eUJX#h`!2gmISk&ZKd4B)^002ovPDHLkV1g&sd|Lnj diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_error.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_error.png deleted file mode 100644 index f07f449a44ff2761bfc7b752db3d08d0e1238b02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 793 zcmV+!1LpjRP)lHwhvrAu0-@MQwt}+5~MQTtu}C0%;W( z1<{R?aHBz*g;pk%AyQVBR_Zu5m~;ES_vxI-O!vIF|H*|T{l`n#garr?$RMk>)?Y48 z(ZF2yTneKb};DNWF+jK)IF`6_IfJ{i|F3o%Q+l&4_HGBD|ACE8na_6>L z=s{^>-C(a7J$6=8A_%h5W!1K6dcL!D?XX+Ndk)oei?UundDpX_E&1Y&`)3P8#Ny0s z2Ag7_&ZPhyGj%)g&S6V2LNun1;iBQm#Fwlfv zgyESZR$X}2P;=RW!2zid1r$hBL{K7>2qi*f7>pT1=RdT3@-anEoH{ z={KFOO;Dh#bV*jaN>}M>RZqQd`S=6O9C3KpI~I>l%QFYfo;jqQYe5fcn`)+)zMm6P z4X&L(>gnN0!%J4^rhX->?$S5bY<=GEU%jc!KLL8sww-Eg;h z`H-yBHa)yfojYT}&G*GFc$<(Yja_q=lZvj66DC^O5%$B)|Z(CeD=n`|eM04SP; z>-=-l+xdJjA~vR6^xB#o{ehf~tSM`iwaQv$O<8NIHA}W_WOw*~ XD^gE}t;YAo00000NkvXXu0mjfl6ZQ> diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_excel.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_excel.png deleted file mode 100644 index eb6158eb5ca9c4b64c81e70e0fd894dbc8e2bed9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 817 zcmV-11J3-3P)hdKqhFO_H1|Vn1E?(=|cjAh_&P}y{{^`u< zcYD@PK?$)4i~7o9*6F_$F$4lR(d4AAvrez^(88Hk+)+B7E)M3jc=Ewl4$S^`_qwSF zA%qz@=c2EOsz@0qB1IqsqJU)HaG&+}%`-OM8YqW{K85hqj@4&V9vz!Cm_n0-W#f;# zeEpJde%vdgRn5?(+PY=W*z~|lT2-mtown({ll8&3S5+lWz5K}LTRW{k{eJn3Qz!SU zQ`@qI_n2;K?RG~pYJ9=dj-RWgG;P&wEuoAxL~Q)<>x0b=dED^Outj&xQ^rA;u3pw| zca_ClTh_d9cxXg_U!lLRl0`xU@$=UXO|_dRdtXfKwPawmnf(LC7u}-U>8k6}3u|{8 zs9LHr>MIJZGD^r9h|q2yF24Wuh+PM^yMN9GP1$khlDkdyCY}D{kg}jEf-(kW5jBY> z0rB29ZhG-r=i_R{;+1k0?A-sBM;AP6(k1i9ZuixR4?MqXOvphQgCYj~RnXKKL~J9Q zIDNz~XMfO{ZhUg&BTtMyXJqDVqc<x643?SvKHx004lTvR=0a5$dUw z>Xb470000$S;ka1sfH4I-R8njUol7M4dtApOahDylptpYswf1hD#CwFoz6oEA>(SIECU&IQ%a}GXdnC!9$70`0uH1B00000NkvXXu0mjf!8w72 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_find.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_find.png deleted file mode 100644 index 2f193889f7ea091c292acdd684c595dcb206b5c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 879 zcmV-#1CacQP)@+1&aazfGU7ezSm^v zpACwO+tu0su66!(dT=`e05DeeCnCFJW(8|RKtKa{4LGONnx2V85A4m%PEQ?MEtR-esdM$pB-`H542D0)N2zSC6Imf)4L8?>%ZrW+H>xCKi$unm zvGZq-*Q%Aahx;C*=l+K%-?>XB)6TB$-L$r*`RUvlA`xP1NG2?)ge8@TQ4EN|Jks0u zcDg;oFC#-#R`YbWB`D?Q`1#y7l$LXhjSLf8AvQuB84}i#j0^!#g{VE#(K7h@5pFHy zSenl=@XBEdxp`h2Ji>CR%=qXJ7!e|?paKet-~;#ok#jETyeB(5&Bkhp;!+;51~G=) zH?L7xmDUu_h+a$+xuWom;AWW!mS$%%+436Rjc@}y?l1134kgD0AOf$OmjOR zstUlshZk$ZC!bAyIg{Y29z#&@3SJ;6D4+_eFume9^#TmMccC5u0J!ZCTnO6m$lnD| z5JeFHf`Xs~1vP>RLKI1GKDY<~pjr2&bi(fX;6Nj-ss@Ds0CcoO0H{JsEQkm{q03skAA);_bv3q{k31qwVo&s-q`Z?_e+j^w(WL? zl+uETs5+~xBU2};OqEE9ETLGwsMGe1%iTRNue)9}|0~E4B*@5#oRXZ9oRXZ9TqRep zPrGZuoOON4n@=uPbyP1y4G=+HktC6l(gZoFD>@_lXDrN?wo+zozGt3P=Qh+3L7+}q z2!WK7geXLnO3Vw;o12Skp%_E#+N#9;DDWP?Q-VS3B$v~Ha)dDzWn0zG~O(^_1!n0HYp-( z+;wPIdoFgQlpYV!10V>5@a)1LyGBMvoa}miyp(bxbMTM-FYNyx;V@TfYddyT00000 LNkvXXu0mjf90!wr diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_go.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_go.png deleted file mode 100644 index 80fe1ed0cc75fbb67e9398ae686641f8fb287238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 779 zcmV+m1N8ifP)JNR2Ufr z!Apo%Wf%b9=l#x^8AolrB&K9H?Pg_|78WA8(M3toqE%3B#7*srcF`i*xhupr27%Nr ziguah1+mN)U5GNmyEfQ3-e%_i&-vb-Co#(>FJ+EhQEwjRYVQ(&UYy{U@%vbY||>@4x=B^vIqabI?L* z;-S&DS^V3-ni4^fl|HMkOEbgX)(390>A}|VIypb5Xee4g;7ck zwKh^A3Mi1Mh@eC$5lV!}Fw%sP623U`g3pd_Hr5sunLvTskx4}&Gm%Q6L}(l4x}jCe z*81q1_4-O*ffi~_nMslo?EQ8t*&Ec(pzEw$vc}pKn_Qp0>D7Jr>ATNC3w@9f|Y+U&+)#!t7l&wKp+nP{PQsb+fb=Yf!Fu&5j8vpRj{FT>jD z>d>$sx;A&+`n$HcF}&sYKSyR;=(=9tvvOj@hUG;~4qTYk^_@E=?$*^_pVh_bGnOt~ z;pEw)j{SK$XVc;qy181rT655gW9NG{(yeablViIL>cDI_ux8m>Pp{tY$J0lgo4#ax za?j0EA3s0S!f>{~ykN9h_RhM&g3K(E`q(dE(Rd49+%xMeR9{qlWnmd{s#(SQ>PmFtSQqUjAtB;_Vvt6}AS_5YgM`Uqu`yva+H8^=4U$e4gHb}u zAQ2N{V3A%pO|?Pv?tb6z=jC}SiRa$G^v3q?*6XcYz$p|cq{uLj@#~Fi`J(>5{@&&N zy%T^+;>8cXx%|o77anP?&W1?1A(>-T49z9pyeCl@7YI+Si zKti7=B~``}TImz(G{0PnlQA3P#MAd}sorMjkP!50B7$nAkU^%#nl{Q9lW0@}9fE-> zN(q7tRuiC_T1r|BBtVBTlQ2+70$Rf;eF`Z;lx46Cpu-rEgb)EBKq(b^W8l<^We(`D z43?0=01z<3G6+UUv6`CsWCk6^93!#+<;ws7007{zS3k2k9-zZKFO~(k`>s0y006+1 zgF_jyIhsL-`FMf~JL~C=cV75(CrJ|q;MVO961G=O zm9d)YpJg5g(4i_HKL75eSE}mq$Y}r}hyVdcV~p>6a}oXr80q`oj%+s700000NkvXX Hu0mjfPs|!l diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_key.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_key.png deleted file mode 100644 index d6626cb09eb11a298b90a8a27b0d8eab41f49a82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 801 zcmV++1K#|JP)$lC4gU2-`f*>nhR-;k6IP7e>YO!0^w)WK%3$w02v-#>5Ep64PCP| zJihT#O|N+nT7XR2h7dAB?UEAOhJF^mol1i`QtQB`HSY}RE7=r! z)zaVIHr5?>v2Gz&fdYw&2ug$!p+txby(aWZ7(4QT)l2`jX7eMQ{>)lG6ev(fWKxmH zOr%mM5$6B%u~qGtCf40#`mbGj3s!n+^%wnJ&#rl>g<4Z)lB5J6f!?|AP275)Zswr* z%T}4~{;_(?waU!#?JabbF3Cy-kf0{R{z}6$e=5yMQKt3BPcl2>zoTPMqMwF;3!_n|>sT?~bK_-2O_m+o>GJ6h zt=+g$4n7y%1qVJI7*5Yw(hqM=JusY{d}*?U(Oj*gT655eZ>Ksn(qrd7v3}DX1}C>` z+X+8@+4-pVq_fxG zlU}~Ye!0+%>J+pPk+0wV{GM$QaYM?5ux)w2z59=S&H2+K?;gH$bZGzL&g5>G ft+noNiyiPkP9r@8gT|RZ00000NkvXXu0mjfuqTIu diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_lightning.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_lightning.png deleted file mode 100644 index 7e568703d6432c530224e443771a04fc1e2e59c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 839 zcmV-N1GxN&P)73{`^;G#xwAtHz%LU)4b zqTRU=ve1RNa3QT=ZM7C`iJ~QFQ*9t7<~pX$d^7W%^M8FFCkcQj-~0ZRTBCB(J0^iD z-~e!d9LR`f3#|=(>$bPvx_D-~2jC%pJ=n_e_OK zeJ_2b-KdDDh@@UlzBSMC;EPygH_MwjWBnPGQegihBV73D?-x9PlHL9A=(Vg=8^d<4 z<9r=UkxuIm)*CO=9e###7PztDxUv}e?$0)rQicmYhV`pQ%S!g@;K(?TVfhM#E?bM| z=B0gfb6h@a8bf5FVT-SV~6}?X}9lK@@Yynoty&1zdZP@?RfODsl=2XzzU% zS8gIN43How+9%bK2S@Xbc`O>`z5`%^;pXGy8^4f>9^3!Sp@|O&)m;dOa3q6d;4P-l zca|=H_{G&m?D_+&-}r{u-J$5T=(X4R&)q|O^gN8cgv;s#@5sEPT5_Z)oFo9Ac>l+I zc4ng5zHpps|9)<_Rw>5bKzE(M1j)dFWI_%OH$BJSz0?T+02W0)_a>#vFqb!*d|5wB zzBUN|M&ty51O@=i?kiDrjQ{{}e|^rU?OS|RdxxP1p5mAw36cX72#`R6UsoeCQFI~! z0ATITp!vfeYyQ?Dr=^5BAshfEa0nB~JG?nUa2Aur006MC*<9`)86SPS(W^`H2n+xi ztOWohsFfVfVWrI7PSKW}BmkyPoj(-|J?ES|BGd-}fIxr{00@ANnO*ZR`#)pee4I5T Rmm>fG002ovPDHLkV1i|Hc$okI diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_link.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_link.png deleted file mode 100644 index 312eab0914ab59271384686255d1be913a6b3add..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 830 zcmV-E1Ht@>P)VWgGzD=Y79#JI$lhEn`|2MpRa?Bt#-nSD~P0P(mbVe{KrOBoKnSsk>m|ML{6l zBosu@om4j#WzNLRAk+{k1JRvL(MfE&vvbb->v>W{*z*1_uMP}0cIRX*?mz+wk%*#O z%0D-+$B*g1nRkvI+_3E8Pr1NC6@5M&4vWaLCnNlr;lNlr4i91z&)eBGqL{L{GNu;Fof}GS9{gM5BJuH;2QWk8yuOZdB3pGR#s8bd~ zAmt<>3Q=YH$t5YJ5;7@+8Uh6=ktBgY6#6Pa%2F?h910?U8cLT43KAj$Z1*==ra&gILO{WkHfs(--F=bly9l~${z@AT>V$oat!YAD@M zBE0v_F{`g#^wOSP-u~!wvlmXdd*uqFqoZ0^{&nEMDU+=!>({S0wrQhFmoB}Yq1)~0 z^{A)L8Xjzdr(W4_exYO6u3a{4*kIeXZMJUR>Q=ksjW_p!rAwDKYUs90>6Q|C>56o@ zbrSq^Xk7Gq#>dAsn@un`Hz$?w$;Ss`%jV7L%9ShgHFV~C)6M>B`Tp%|nqPc&G*A3| z)Qe+}vT4-x^t1~XE@(6wR;^lPWMo9n*~E!cy~)YRsT2{`?fqeIw-e7N@mOA%UcCIq z_kH(_EK7|>pM*1Wt2^DaDAp|cvp*@(ZZDKpYkKC^?97(`0sb&XTXy7N#sB~S07*qo IM6N<$f;YmCWB>pF diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_paintbrush.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_paintbrush.png deleted file mode 100644 index 246a2f0b426faa0c7f5ba009e32b1deaf88d1288..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 813 zcmV+|1JeA7P)otxGRZMDZ!_a~nK|b_-`n%VosaL{KDuPV10`(1LIen8kX2Xff$3BE zah#djvFGJ&eE^89Pk*-O^+&d>FC~^GjRYVQ(uuPJyS|-v?9lxA-+tM5>1Qu*n+Ir1 z6KhA>X4$XDH6?-|E5oe1E?pQ5-M;2xw_ex!x}I2+b=}mPFW$U%^;o(Zg*LP!K^1kP%8ynsD^= z1y^6xD1#GLjO{VLdh@0GKY7;d$+NGukV)GRLPn^=q=dF%B#XaJrNP`0E6=}e&Gj3d zKJbQre*WXt!60_DnIzgMQc6S#fvjXxsE1v7;T;njHkdy2miIqAS(nX~o%cO+q+b#h z5tIleLWvL=dQE8OC#{%y*Tnku&K`Tuub&_ELI0t_ea{@3f>Jv&sYqld(%}3_GY3Dm z;O{3*Y?v^A`a|D;^qrM=ykI)U6QHd%WhO~VF!SGjGn0GOZrc3mGZudNl9{Q#X5&-F zuGwVReFLBjE5jr!!^-5*L%!I%PkYH#Hs5rMrEBl^)9)9XTD;xjHFxVZMc3~Dw6#k$ z(-S}RE$bgMHv6Z`mS5|u$$78sp4G-8b@lVkl`HtEv+MGn!F&bKcHPi$$oP_;=BrPf z$(~b3&p3CsuQxhoV$%jIR;`lB-s7FDX)xCTXuJ7ZyIQk96uIR=HBt%-P?N*bp`)EF zq14c}QM+O70NTOa@V~_)&GMZ$^cQDlkyOCa(H3Mf+6xhCuZh`VSN{cQBl5Ys9{cp( rh`2H3A^=GuC6HjQ*7|*0>;m{7QlnX3z3MSD00000NkvXXu0mjfR5FYo diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_paste.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_paste.png deleted file mode 100644 index 968f073fdddc1cc0f0800b1ac4001cd9a55f053d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 703 zcmV;w0zmzVP)AVs!l4K}n~L(tL`6d4Up4iSWnZ3Qg~4n+_J zDGk-qQdogO5JUtO-d5pRp7Nd7_r1^a|M&Zq%mn9Oe((|e0sw%Ur!K7T1pojj=U#f? zQM`qbQrM^DPkwa?DK_be^~z<~RgSMIa<`xP_4P7gg2jCwJ{9^k!fsU=#Ti|%I3p;>90Qd+7|~0h&mIklA#nb>ATL2+v$&u)OBgB z;nsHb)I&QRKeX40H~~cIZxCd}5C} z=79lXoXK%6YlyLtsV$~bSm?Upq|DJh#{|*a7XMm`4QJWZ>s6nL2R1|&J z0VPEwJ9?!n`o5PKAjc->P1Gi8BY*%!5&FVp=#)$mMJYul1Jton}gujiUf??eOy!x&!tsjxy;=Q3_DdcXx=a^OBhW0N~`A@4xB0a*%F? l+@c^sQA%W+?pa#c`9H5UNfS6T{e=Jk002ovPDHLkV1grvM=byV diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_red.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_red.png deleted file mode 100644 index 0b18247da5850f3c2486373a3e179acd2772e8aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 641 zcmV-{0)G98P);68^@7JE5sw#jpE*579S@TLkU(6yap1yN*Zuy>-hV%Q_v4Ar&!63c8OBr(ZRhFu z_kWs36-AmgZCT>x!RqM;Zu9tqvoHI~k@UmYo_g(*J3c%2{N8}7I+|qKPQzv}7t>%W zsu&9G)UmCzkDYSw{fBnuW4j;1fKV_nicw`$8C6D=F_qu`zUiK$2Oc?5UVY+D(`I@R zW`KlwqLftWHH3Z2_XVNfKn>VgT~k=@- z+N>c>0|@A_HbI9Jn`v0~7cfIF(TS69zaomDS1QtgvaBBfGEPLHccO2~3jc>n^6}^HAEh-2#VxC7YYcDXv!L9X= z-R*SOUvIs;n`8(LxP4~^2|JsiN^hq6cU}5dn4v1~Kl{eT7pm&f$PoY`hyVe%y8G*S bxB&kH@RuR86sIAS00000NkvXXu0mjfZBi!% diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_refresh.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_refresh.png deleted file mode 100644 index cf347c7d4685128a4a447abb9fb8e939417644f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 858 zcmV-g1Eu_lP)`6pHR2Ufr z!EI=jWf;Km|8+n2IrHqe<9xxFVk)&(Nh?w$Xk`TAyvb=#e=0aySC z00NkRDM597_LiNIJ2M^qhuTvB004REvvU8@of{r?P8tmo3;+Pk0F0@*jAMhdOkS&1 zhJPPfQa;pP0|4+Yk%#j>X}o-s#EF1_DMV93FsfPP`G*>Ks>L&)Q}w2g%slu0kBfW1 z+*$*0BC^oTl6>OGIq(9BgG4|C90Dk-N_mPazGrQ7uHZ|>BLD!-KmZ)z1e^#?1Sf(M z!6m}K(^b|i%$TcA5bC}r$tAA?0C)g1@CgWliJ;NAk&ZF+-w#}$`-3nZ32C6IVKrHp zr+(!L2hRfF&AsTw>_@ z1y23;E%Oz}?q^Q2d($ayO;-sON2t7$w(Z|o0Pw1YnSp^}0PI+I5HnDNsFCA?oorkG z5sUIGIq=FSyxcj+xlhkm0en=52Bx3@02o12gdAU$_i?v6iyFMuc7P9#zQ-Hf; zVuV$t9P5`m)F2w1?t6{<8%wk{w-PP#Sj#%1MbsjrSI6n;D_@8q9`~W98dNQf$j=iI z6~hpgww&be%X_HI50Hhx@W==u4TLPB;ei-J-1}G8wH}|{i#Lk-WZAyfv}k4y0|fvU zZTy^$u6L>2nWo(NDSV2@MRD}JQ4(c%G%=dG@_vxH?>gcH#*Ue2HC}9sapf8X?R$Z;XEnm&g zW99mh)5jNw008mK8)r^`_{yH0rNn%u1|SpC(tjf#om=+r#lh+?Kb>DVb9`|C0Bvbv zN3U(>f4-tAC1hosRoA7p(b(hL*V}(j>ug<`&U)|l$6o$)!>PBQ9RQSwn9asj2p*|xhU*R^vq?*Twb0t!lm5}`yW5lRy-U0ZYK?8to!;o!r!XeOE$ z0HB3T+6EEoI4PlR=wonwqJ+TvCoWh&$?CAPVYcU= zD{DS0?AkOtb@-hh^ZLq~FMjxYf19X?pa_YqtgZGvv2TaxcF#KT?O%=_*a-kW_;N|D zakkWsOe!)HsT5WRBiC+p;N-c>0Qwy(1D2MDBC595oXSiR07)sKNk-%9*rDBOO^HUD zZW#;)R&EZpqha<(HK$(tZYU#V29<@0qCXgU{gXeGpc_|pTqQD-WO|}%yKZbeX7k*H z2W~CK$v8NBAq~czrc5A(v51g0Wma7`G8}f=ZcuAiYYxZan@gP(;Ku66M6?bquGiHe z3Q0ya)%Lvk@kLixZfZyU@#UFbv+>pYhcj8TRKSr_sWG8i^X~UA**LvbD3(_Lba3xm ziYcpup*A9qJ$?AA=Og05lndxfwr`!C+O~h|B~4 z01q8H`StcY);%&mId7_+)76ovRpeNWRp&4M?#jx@|E-)x%P*A6t^fc407*qoM6N<$ Ef@ddc(f|Me diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white.png deleted file mode 100644 index 8b8b1ca0000bc8fa8d0379926736029f8fabe364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-&H;pyTSqH(@-Vl>|&1p(LP>kg~E zYiz5X^`c$+%8#zC{u)yfe-5 zmgid={Z3k(ERKCKrE7DF;=x4^O+ pzO8rLO8p|Ip=x)jHOtWj`bJBmKdh_V<`47(gQu&X%Q~loCIFbEay|e6 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_acrobat.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_acrobat.png deleted file mode 100644 index 8f8095e46fa4965700afe1f9d065d8a37b101676..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 591 zcmV-V0~O9lw>B8WRlD)Gm}Jrz31u-X&&gn2lvjs=i{7nIaL6v2==uw+8Lcs(8j27 z;|c`rmSv@Lx!heopGP^^Ieb3f=R!%Lpp$}iMS-&P3EJ)s48wrJ_Ni0~k|c47D2nj= z{jS6bt|kFpFf|p5cM`_&0Zh|`rfEp0(}=}lT#(6RpzAsUfxv^LSYX>WlAaN$>)*J5 z0#sE+JRUD8iT9*fz{)_^7@6P&!sEjTcD+I9Z4YjT1`wH@fV{cEvneYGFU%maIEU2s55&K(LixD|{p-uiS@?KNj zk-Go8G$hH6g002ovPDHLkV1hVj1#|!a diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_actionscript.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_actionscript.png deleted file mode 100644 index 159b24075191fc259cfd80c797a1b0d74c168422..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 664 zcmV;J0%!e+P)7Z7t2}reCh0o`+ zAlt$F2tW%oO@m<=(B8a-_VgLl#~yUMUDWG!0qFPppd^03e+x1WpkO1NhIaKD2A)-@ z=Py8(Wi%R%JtYZG#sTKH@6Z+&!S3Edf8jFJJNKuva#KJQD3X^7;H^fd2di znEN&c58aUG>`>P{Vqq$kLb+TP{?I!d4(|o59X_%|nVEZq2Rk60n7072SWJ{64CV?3 zgS!EB=eYxwQ>P2&$}(iT6UMvuFgHHIEdNA29!EBtg=v~X!DxxEH~}L2zn|52%xalaq@DTdhh{EVwv0IaQ=!?daer zTKp4I`l8SDt;d{8Q`5Ko;BXUi&oAG1l4}59P-{|^S(Rmord5s6qsh<&m@Ab^wqCD) zHyRD}lKLDzpYN&@q5&*47mGzGiqcXpmqR9#K|CH8kXS4RNs`(iEF%HjP%f8ItyaZK z6$%Apvsok(2>~dTO5jTZfq;N?0ch4l01f$k9?4{~Youl-#x{UDMr#AFIkz@SDwPtQ z$gQ^$2|*(Ps9LQiav_8o8Ne<=Zx1*M*syo80sEO1tB%>5 zfdHB`1z+!R@?ghPRKmL)hWEvZE$=*54ose*0JiUNTM_)cMDXhxEKg(?-pD=y<)L4J zT0dSyD0&NhJ$^_8Ko9uom%-ZM4BTM{Tw$9qyPj=-9W;N(Wi@3*-Q4pq`Gcp}^vvNr zyd&PsmG>fpCSZz?K}UIEd;HGgG%0MG>ymxKPwy{>wy(m*Atq7)0000~7 zMNw2LQirBVQoa8G3P(rY+l;L4iy+JwSqmy$9JlSkk z&*$^Eg+c)@!R|v4gdc8+TTn&eWHO0VD&>$!B%o;;WLf4CNs=Inq9d`xA4otCWHK38 zmc{pkX`0Y=9g3oGK{}lVy~OYL|C5lQ&U^l;wrg|7w=BcA9L4-r411?K7f`@348&rw zXD#uW)DK;H`hxO}u%=@Cj{;#u#_;bb1_KgUOT2Hp6;)MvC6P$vQP3=g1O5#aU%I!K zZ1dc@f}YvG&*Spnplm2rIp^VdA^HydZ0X1axdms2!RKi5x-SFA4p@ zC@N|PI$ryHL@t-(!zBsf2-+sYAukhDHU7Lxm88-p zDk^c;sHj}OKUc4lGZU}6umlGVNAJx0%sKDOFwQx|V2pVvxhYKe|L9TNk!~md3BVrm zYPDL8Hk*yU-ER3~LGwJ7N`0ZV&nOhBI{~~A;@ND*=kxg?#^W&`4u`zk?Mg_e)8XlK z`T#M+OaR1!<#Nf_>$S`xrqd}OjYhoJ>q)?3vEX8pY&I()ERjfjrXM$k7e+-Qs3Ihj zNyOuEQ2EGYG7ro!o6VOBQEwuV2z)*tR8>WxP{616FY)p1Pn1d}#9}cxolZC$4n(6- z35hJq0;FlHC{ zp*iF(lgUK(E`($(s9pJ8Kn?(M734H_63WHtf}6SQQ_MXEP!#0|&@>J8dL5TfG&tBw z#tYn{TCGZvAr>cca%YYn^!t73tg8OOJ2FvJ(`YpCyVZi*?Ur+1uUA$hAg8-aK)c;e zQ<)!XwHh|n&ND=$@^)>aF-`~n}#*WMkD*M|f8r$i*z7+W! qF|A!t*4fE(R`<_YIkN&?Jng?3oQ|aAqClPi0000t>5xmo{nArfL4CJwMMm+N`pQ3p^Le$?rMud6Rbxz!-yG7bz2z$^USP5(;udf(gfQ zG~f68y^)EvcNWp#bUoDt2=h+^%o-?-|mo~iieWqLNP<0m@2PTB7ftyb= z@H`K$>v9Pr5X`L|rw&CEN2(9SB7A2SE;d|j9@*F}sd(@*2l|P*fWfK>1drZUrtUA7 zNXO~pKn1cjf~~TLbje1g>EPPzN2GH#UIBxJ{}S9=E`{zs-w#hO?vcH+hJxroI5v?j zD!4lP0WXq8zUx3RAP@|Gq$}6wXCjFLZY^YSWBxN9#&g)ro$%5}aYn#y=tJ_aIT%4d z5d4u`rlp!};XGmbZkJE*kYJoi&N0pd*yxY{0${xD;;Q1h^8f$<07*qoM6N<$f(}t7 Ae*gdg diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code.png deleted file mode 100644 index 0c76bd1297751b66230f74719504b2adb02b1615..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 603 zcmV-h0;K(kP)^~*-1fljz_B$LUvK}k?BNXe#Y!m=zM!!V#}8bncK5m;8VP zw86G*RI63?Cd%b9bX|ueNlZ|wR6rj|r_)VIP@r2imh3?SN+^{|kY%~8B{maJ@F*OK z&VH9LwOeGt#DRjj0~v~8`>iO7!Ybi;zE$va`A^T#yW`y44;k^#O~K5*jD=qcUhPSc zvyy~q;5H_1WT1l~cqje9yfa+l!hu6xjdOJ8s;8E^+=QQ$tw p?%p!Hy#YapB=@+^9(46X{{RQg%9y;OKjr`c002ovPDHLkV1g7l326WT diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code_red.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_code_red.png deleted file mode 100644 index 87a69145075afd8f8fd8b391c5da1249ec8b2889..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 587 zcmV-R0<`^!P)LWh{^|hy<@Q*xw+qo|KpY<+vaXbbW{L4q( zTsjXEJvb}e%bgb=o%W0h?4u1;^bWTqH8}5Th002ovPDHLkV1nrS0P+9; diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_coldfusion.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_coldfusion.png deleted file mode 100644 index c66011fb0fbdcbf210483d676b7131542a0e282b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 592 zcmV-W0k7R5;6x zlV4BMP#DI+Z{WQcKZBTk0lfkj5F$ztWhP#lcuyb@0@rA^#Kpu5KLA&Rgc}o#aSmis zrZC__xY^&#cI&!!{c|4Q_tcec*#b>|Y15wPcY2=o3;-Bl=(t4;6Ok*pL)-{*A;GX^ zS(@WGp6j~k1wBVR9)BB_gar`}HyRBXh7nM!)u5^>N~MyN6bc0-5{W?44iB<`2biXb zR;wk?jIQg@G!5l)SqhrXCU}x$GU-dY1sra}0uCq@153FUULT=jNwSk}0WBjKz}Jdu z<5gB*<^XtpAmp3m^ZEXQZWd1krhft}CoYaF4cSMvTJ01}X3X37KYdx-D0$c{doUe8 ztY{vlGr-e*;N!WAV%_hgUawyYrhegW>^F)pv%uUTFslHn; zvJ)l{%w(~{!O4`KTmK{Q{zCYltLfs&4?nz|6IdlqHCvX;|HGv~!QW?8P~_d#e0$v$ z)5XHEz{3>qMiH`1+qNYf?huS+@L`J9_$cjJF)Hf?@pu;)`9}BXwGUM{2!{y-4|Z{L zG>z?O%Cp8P5T#j1DID7u_*(Jg?7iss8AZQ+&;u_J{FmILf((9eoiL5nGUe>Fgq*U$z0000 zJ3A|*qoWOonz+4ZQ0KNhDB07SX1?#FrNy8%K)_l}y&kh`*KYdy`Y99&tgNgMLSSrc z?B?+B@HO@P-jS~z2Rgc6yy~Y~%>oJpBxsb$5<&nRLqiuR7K=@0SZj~jTs|sv_jWVX zGe?WflejOaq|Vec=s9+ahmXbyJ|T)Sl*?s82sr2H?Ce~HD5WI+Sz&tmWrN()wI2}+ zKqg92t*l^-#ae~;9%KFlWkmwnY=-UK`_|%ICZ#P1gdjK<2n38VXsuC7{WiU!fZFmm zW~Sda9(Qi@pxO}$ARY+;t##Ao27usOqNt7Hwq6K7G1il@xitj=LIM&{N&#SuX;x4x zmG6FhCg-$PI;hQ=;1iZ>F>^~@)IPi;l}fX?SZ!QiO=X<|pSVkNpJuLHzW(FT_~W-v z?vFpkyE>8ee4d=7wKauH5~dd_M7d2Aa=ICC{Nj7Blqv&DQEP#j_VeWV&WXL>c=LLK zsmYg^_JiDb;%U!UxO%qjFAvsDFj-kzT2$GbV(ZopPM$i$z`!7jvEk07BcC=6FMt4` z*0u3Sy`0b~%#(0000K diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_copy.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_copy.png deleted file mode 100644 index a9f31a278e17993d8d4e13beac2f9d5f7b42d08f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmV-50m}Y~P)sF~CC`eaI+m%Y8jfzomMvZQaNUIT3LIrJ$h)_W{ zwF|LDNlB-g`Hb_G$;>3F$9JF3WYR|3fy2C+_wH}*xp!_4fF2UN4lt#d26oXwru}hT z0+0%Vz-l&|Tdh_L-Ng1G2*RBtBncRx;99K)&+}s0whhxXp{go}$g&Jk6k|vfypI5M z!1sNGVaV?!*L7i87Bo%cfO@?S`bajL{R<($@$|PtgBRcCGIJ_2a|&kO>G-s2aR3E4 zjssoScUa;zIdOeGHBnH13G)W-zt$kUQgNfG;96b=v&4NzRt&@7nN%v3HsG`<<+F$cumMs448N!W3r&2Z*b~D5^$^d6Jxn@SFK5Q8*uKSR7x{I|H-_N1f+AD zSYC5@2K4OKL$==F9U@CH;ONNL(W}oZICHn;d?~pw?GRIsH*x-68Oy6SuK`)`{E)46 z9^3(-HXa#X89SBv?u_YP)WjsQrp;}0X?Bxrvf12IKW8>3t`e~W9|JS<{btTNbNT@EQIWBSNJTX8AMGXD z-SsH|s#>j9Xf~VMtyT-YMD}5^SWHTY5->o`k|d#AE_YQd79j`%GMS7FNvG3b7^Vy9 zn0HYCJy5MyQLoqKnW|JOp-?D*<2V^msZ>BOv0ANd2n7t@{=V;sZrQ>3c})5_%ms4z z7!qXwHHe~!QFj8aR~&*-3F?O|;#(ESIXP~Os%|~y^7c15*q5`gz2-5ol!fU92NIGT z_ves+>+Tf3gfcL?!nimYmR}cw*|BGULzI^7!;k#3K^YO#;!+vM@N~(99+<;fdqr zYPJm+pXYFYk;neQyXXEcTQDNQx57i`Okp9A#n?<7!{#tnKJdsF>utb@JH7dU01gfL zEK2hoPZAnO5+je3&^i*hWM`qCW^vLK!O*?U-#IvXV?#6koWqrwnD{j&K`7N>^tR3G z8zr1(qVOzcF#nF1&0MZ5C$l8*E^Uth0000zE0Ay_3@1Z_7#f-XWL#E{8Al7>L$ z0Rx7lnddoqAyfT%&#`$;v0@*5YdW3w z7mLNoa=FAshK% zDiy@zakyMAxr-H?iQDZi^!t5;Eno2A=?>mMx`Vg(Z!?<53LHLvfTPa`$mjDcX*Qdv zR;ylN4OH+m)fVX&Z#yZpUae;ss@a$K&})gHovkhr@w#xyPVlfVgXti1_357y%I-UHDvRWYvPEX+#g+j4Q9ayba zh7uQN1j%HQgA=Fp9DfODAU^*3*FCs^6IpO7xg`RUXyP)(;=d!ly=#I^l3e0Cub`{H Z`5PU3+D2e&<<>s`J(VpX#y^kqzQ;#=2x({YMw9Q&ndHT&`BD$#%Ql?{+)-OuSA`r}MWJ zVg+2Gc(GW}a=BERPNy^;kEz$|38dTYlFQ{%5S!g@|8f8D_!Nu9_Ni2glF1}xG8xi! zorc39&F6EPOeWOt_XS`W2H_Bo$MXugy}SEctJQj=(TLXTHL(jRXfzs>NF=0SHk;94 zF!&HjdZNX(3U3;LY64IMX__Xv%_wjLC!J2`0Jw?X=zPK$C$`&dYPDKaC={e16bcE@ zgun^<0k;ak*=xLE)@(Lqu~MmsFoMCLY&0Qog`NO(h@kyxaA%EbwJLy8sU*Vi`~52K zX0wrqW;_LmMq@evX4iAM9Od(Q0eHP$1%L|xAh@vrqB`HPQLon}f3aAka=9!3hr=O- z5F9`#J_7Jhah=U(4RjaRhkS4Xkk98kDz-`i!r|~~AQ1TFcDw(@<8g{aBE)l)PNxNE zI(RPyc>9e{@WGSMU%i7*v{!&P$WLz25)0oc=Dl-yy%xYZAm4b-rttL7UjR#%`#j_F R;_m(?iiXTHIMmcoLoO94I8;j@ zv^2DJ5#orqydFJX|Gm$_Bi_vyew+j6{r}$Qc@D1%fQqeAhJj)1!z4pP83k2MV2~s! zSt^w(<#HLFVBg_#xz1W8ioi(WY&Hu~6zil?DI^jJgu`K35(hkP)H%@Imesbg#5!Ps_$Ni*SiR8&sKb9?M`0-mH)gtg&YgRX#*TXz@Z+| z;|2H@xzE0TfuORhuO2k6#K8#sW^J`mQ0+E@$K`QkFV+DTlI$w{GJ;zid{*v9xeIe_ z$|Bp`@iKkgoFK3{4Z)#DWKV~W4K@5WZN+Ql_7%YxNqSx7%cWud&cX>)_PvD*UzxZg a%Kia9Rjz_59@~-t0000)l$0ECbfb-0$}>7z|u>IvuoHEmW&j4lzv=KA+EpIObc7e7{sGA)QVmnM@*^ z%|h38^m;wC+ilpk%>l#V5LCqP_y2_Cayd^XlX;j*r54R*lW!zbqtSpQNyz8(JVmWm zyV4S$2{Uhyc{Cb0QQbf{ZGT{Kr zvJi{K_&f+q^Pv4MK$hhS4TgFj_FD*rLOePdE-E^T7ZzTFCRUB`*?9&h(a#C!-v8lWG#k3AOJQaUey6Oasked^kDPe=Khg@7s584 zg`XfS1)&u*_c;I76#%`kkBfiZgKKo@0)9d6vZw=ExQUtV?eW{Y1Xv}=4X(2zy85d> Y0C^(qLv?Ui{{R3007*qoM6N<$f-gW7od5s; diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_edit.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_edit.png deleted file mode 100644 index b93e77600def75c9a144d3d0a5088a62c02cbb0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmV-w0+s!VP)$>5Y&axjp2O=VLu>*f>1L;s0)kkvKC!*u?s6CVL=HJ6oP~pNfZc; zsKr=bq;7MITw8NXw{SZm%59TId2x_9BQ zV86`NuvGI!>o^V!Na!=$7GJE{Cq`b+XwknM{UcGHFTTfmuS+ zm-zYC!P3+zmY;SG$?!fYkOih`QYaLxyF}A86h$GGN}kFj)_o*0e zjPMP%zTG7FYMAfO2Nn1D`D0Cj?Wl>5q%@CE10nX)KxpNmwk+!IWkzywiYD( zqUXiYYIq3qcRyMGJ;IY`(Gz~E$J$zu2+R{)xGlE*88b3WK6V*J>}2iPY1HH|tER0W z_+^^FdppY?o)Gt5M2`%xwRDH@R3G}^i1l4|6uchm0X0f!@&YdVLB5K&dd7Rv{)DXX zt^&vP;}kqj3f>94j+4xd93>s|Q!Ezi>?r8(Il$P}PFxSqu{d*!Y%*#cX(R0f|Juz# z3o0_xI14Al->1uky@W-rCI_%l&>PK^TXNSN{byMk2AI5vbwp!K-%-@!-vPR3iikL1L7HA!^!~ChCFU#lnGzp88=I z67V8PHBo4(l$u?-AKmT8?#_0rKW9dUNRbpLc`}piywAM9$xZ-3fR1C75T(BjCn-l* zjUcci2oXXo-}iqun@#)+`W@kL_-U&|2>MxZy~3IdmRm&8b)9!2%ksg3R)nNnT*TJOC=6{2hG86Dz+<^p6qfG5$i^UNUh+u)CD7O2 zK>Ioazn;U|+X0x$=feveYZL1W*Fm%e5P1sajd#eW#^5(ddx76*pt$^)b}$Q4oPabL zLc^HF>Z{8za;f$LtN0P$6C?1{X*jtXkRJ8IEeyiSzencvH3Ux_y>y^}wfJrRCQN#9 z?&e+C>sSAfrE%mZD5RfZ`gSndD)=P?+nG5Oq$zmY&-v+gc7R6c0u8^Ke#|XOq?gF@othF3zFpM8Il<8BJrWqBtF>b#_ye4{0)Xbu6j&@UIhRE002ov JPDHLkV1nWI9dZBw diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_excel.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_excel.png deleted file mode 100644 index b977d7e52e2446ea01201c5c7209ac3a05f12c9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmV;I0%-k-P)^@R5;6x zlTS!gQ5431_q{u#M2 zg&W%y6a}>qj1Z|7Vu&-DW6d~k-n;jnHsjb-q#u0C^W!_5^C=MlKq<8oNCQ6qS00!X z5eI;XP=g!^f}j{hku}E1zZ?XCjE;`p19k(Rh%^AQQ54xysU+ocx$c#f61Z4HnT#3u~FR(3>BnZniMIF4DouI8Hi4u>cAK%EN)5PO(ip3(% zIgBx+QYirR){Z8QwV$9Z(Mpt=L-Or3#bf-G@66}txq0yc*T(zNTBDT0T8rO^JeNbSI-Tzf5!pBioy4NwAN^?iN#{;fH1Jke4Xa`^fR8m z%h6dq%xX)S?7`zae))(Xst^Scp6B8FejQW?RLTM8@0=vnnntuRGBM2dpo>gbCnTD= z^<;=JuqdSf@O>Z8^XdR?s+KEfhDdB_#ahFj^giCtzT(s8kA$AViyTqaAR;KGaLzUU z<=GqA4bRwpX|IG~*x>pZ!@zLr`XQ`od>m(`;jz|M_*1GDO#$7;n74ppb8=eiqh760 x0yt}J1#p`gw$`o!R{d7zU9~!Un@nJV{4bstt4Au+Up@c;002ovPDHLkV1kWhGjjj{ diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_find.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_find.png deleted file mode 100644 index 581843637079359a6a58fcdccf0763690c67b063..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 676 zcmV;V0$crwP)_k3`4d{s8lK_6bi^@vq&To98fNoK}7)fx$e2^Y&@<^jR_Ee+8}KG;X`@ z@bCyiolqX>bb1ZIs%QGnjzFU~L8H~d?e;*XP(h(S262}XyZ3a0h07r{KV?E70l+e- zE`%3x|M5#q+;HOC(h@A^M)7Rn13dm0&>K$j%k_F4wOWlsNCIH+!c_#{eS&TL8v4yc zcpnPEY`cQzZ$ILq{U-MA6Z6Z|1p!FZjQ}tXSb25J@HphEqX-6Hqo?-_Zn@{d#>2Ml zJGhxTAd&emK$lV-QK&VM&ix0Xy{GyS3Wp(+E1^8BhD3T0a)m-Lw@Lu4zQRrP)9(3F z^>$hh@N>OAXrmPYunLi|fJ$_*5i`46;M>~*5D{bp>-OL3{+!MJa`3kv~Q#QfQ%c z)1s}QE<_XaYBG;IuRF=td#+}fi4h(6HgoUyJLi0t(*dA^B)%@8kkG&bdM5P5^Z5WF z%d%>m^SbN0XeV)wbUOXn5Ag#A$gJx+7-OCkMM1S%MWIlTkbFLmOeW(&n&wUd&;`>p zVcRy$Z{K0=?SpNnP^;BYEEXleFbq(UY&LrXX$6qkJ~)8+b{=jj3HEXds;Z(?D%}}L zX3`39&dy=Zyar!ehA}e>w)(*vrCct{PI9^2Jpj&OZS8<3-@{0(gNv%1{)zAiLY+_^ zl}e>Ofd4&#Irj#7>=o=Uhv5IJ@?sN0^J|(WL2Uun$4}si6}TG-s3T#p&6GE<<2W)O zf{^Y2HlO#*QDvTp3v&d@;8*}aUC4lisG9(w7@d5Y8y)}U#FwCkqp*Mcgme4{&gGRf zlBfd`nF9cQBKB2_L{F8G2)7pAf$i)Ds`|}-c>pc^LRW{w4SQ)3N^BbZx)6BlCZts! zKph%`(m#xg-q3I7=(us;9<)*2%iuQ1J`oV3gU6V~T}^JU5714JN33&GwEEru0d}Uo U{MPL+lmGw#07*qoM6N<$f^vibe*gdg diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_freehand.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_freehand.png deleted file mode 100644 index 8d719df5205f7415ce657e5c277db4533c82f346..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 639 zcmV-_0)YLAP)p{{sC7)XB-g4w*W1a1)XtvxrMYa1o?wn&v~3 zHnC|#(>B_M1d`_7gfzLiHy=0c<2kQQdXu*33(xYN_xYW39(cz9jEVT%VokB8|DoF~ z8u%Q5sdl@4VB7X#uh+v_;yOGY&pRi?378ghv)P1cngiAAb<}D#l*?rWDV0j_dc6Zk z-|P~AJZQCA=yWcQjG8fYnimzj*3KqTfN0Cy!G^$7)+bQ$+mHVd1J zvwOR^5Lm<|R+uyB1Nu4vL?d4qa3tn?9H7SZH@~u=fFHEDfSH|bHU6kh0O3%cLdyny z{`9S2Sw~WMy0MPy!64i`jdk4Z3>^+KIL_fN2V_d&ywBt`^IJpxUI$=YAph~5`;xCe Z{s%Y0vkUXDnO6V+002ovPDHLkV1loX8z=w( diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_gear.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_gear.png deleted file mode 100644 index 106f5aa3611a4807ec8c21701c631730275089a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 402 zcmV;D0d4+?P)<@FR}JvtGRKa0_WfK^c7uXaFH3q@Y!Hnl8VySc`OtkPN3;#l*y*l23+99h*9JzA00}rAC!#M1dZ#v9YOBH|eC*${MmzzYjBu!!-< zK8tujf&(6i)1biy*F>4{f*Kd(IU-JsG&#b_@NgTnx@40)2@2%c;*=?-2Za=}O}7&( w%_K#(S>e1j&gfY?mR})n>>0+8p`iTe2d1K2h8#$+)&Kwi07*qoM6N<$f(2cptN;K2 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_get.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_get.png deleted file mode 100644 index e4a1ecba1b60e54f3777717ed105cdde745b7184..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 516 zcmV+f0{i`mP)o)wchR-92qq~y6`XqbKmElbB3z{pkZs0VPF`CFvS?7jDn^mFo>d9Y&06* z&1MsS!M-CH3ee+h_sy)Ms%B*ec3R0RpVi9?*mU84yoq(Bw8 z<4(999dJJE!V%pWT~HGRIAb;(#O%2K3?uRpz}AfgE8e9q&OSdr^e^}lC$QXZz;S2A z)w>^oHy>?v)q--`!pmuBe96PxP0u*inQvyFW(llfv9 zXV1s*Jh`y2H%B3ZTA(AzpsQ?hb6_PyZ=c1?_B4fbl>G%!@ubJln=!)x0000#DY{xaiib^#X=YT4@yE_&2#eBulEdzjE`u&@G%2(&u{J-<}d(^uY4W_kMfEX z@!X)AR9F&FL?RJyJRUzvBoeqN{5kY`z3wcM0+du73~_0|*lac! z42Dw(Eg1o{Ash}P8jXrqN+1w`*XxDD;ShmPCZC7#4;wWbHoMvBl$=zF-`?*9j*Nbjd=v@OWt_BgKxP-3wd zy37?ATx&$b+&zRM!K;BD%Okw`Sb@&Pak8$KRX19jWZmC0&n*Ggv%j8nvSPDFw zEkV65AGOoBQ8kf`R|}Px*&INNS%osq9b{Fq2I(x6@xM>tg=vRLF?I`0rWzHyRc>}g~)F_Qn`A>)C_iwK%Z zrIJ;xR)UI1Y4Ozts|-Nho;q zVk9-bX)%F~!;63iu$Fk=VJn3~fmb5S@@)ZqjBT2{f`vT`b2}zxb0$o;EF@G3&BHK^ zc)`1kUzo^Qkk$?KFKHNBD?nP-MJ3b@&4fg;g5l2wMi^g?9qj+~@b;62o_U1_S1J`g z7m^UMg25FX1MJ5AQxAJ5F5WDt=$=-@JV-!LHA2vuxl9kN>PS8x??^AINH6LjF*#nbk4}=n3gfWp$kEX5IpHS zYiQ{@d7Nl&d$#+7-TckP&Q}N91e-C#5QQ<|d}62BjvZR2H60wE-&H<>}%WqH(_V;zPbB1rgSSSC(0? zWlQ#?N3UgnJ9m2C29w!SwoOo5_2Iq!<8vCyEoDoj@#oV($oJEg6Bj@;nD|2g8 s%L|>IZ381yx9RvPhV4J)*SeoEV4lyr#k*`nfWBbxboFyt=akR{0DpOPi2wiq diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_key.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_key.png deleted file mode 100644 index d61648452284da1bc28b10385f95b5d2bf027901..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 616 zcmV-u0+;=XP)-tZUVHjYHp;RjQ0M0pRlXN=mLv{hk9Ebp9&~+Wj-T9IkpzWPWd#fZ)d=zV^~S`;LE*!&u-?g42^wwN&Xr1~#d5ifl_2*B1OoS}CDno^8a50ArfE8;stQF>AP54J@H~%T zFz84s;dO!QJKD36(~!QOg!t_^gfFcSKDU4yK0+Ypg$NT^mIYcQ6bk*3P(lBLh7Df_ zTu=2xC#+-_%)|{Cv8zz0t|0y4D5M`xAc{gwOKc`ou<*&VjUREFHs1qd<_xSkKeTBt zgyCi=@jj;&Ns^GsWWaIUl0Y2azcDlF@u{(P*!+EH;lnU~b|Lv{4|4Hdkh!qoQHiE$ zY#y>KFA0QEw=4Z|uV{0A^`Y=D}hB$GP&<$bi8q(u;p^0(my3Rz7fP}|# zGZ&#uor4@c3q9r|f?H6-UZmfgKx(iV(MQ`MPWB>iC~SxnN5H*zb*A3#zWwgu&c|}3 zn^g87H{pdeasl%Lhmab&jC?lES}7C?4BFDNA<}20hoY@w_IU%i*T;}}wh!589}7~7 z#Ug`-R~4j&+K_y4kW@X7qLr-)S5qVKU)tO;+kXJ++{vPI@{hVK|PhMVVx_`)vx~zUs}c9O-Ok{00000NkvXXu0mjf DS5_-g diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_link.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_link.png deleted file mode 100644 index bf7bd1c9bfd78d689c73ba67cf914182933ee68c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 614 zcmV-s0-61ZP)OOAS;jTeL{ZSdz-%)SMH9tDF;N4B6%j=d15J&5qy`F#vB?Ar zqS1nH@%ny_XSI*Y>) z1f5QYdmzT>YciP<3WehS<{GovEaLGv27>{*-7f0&I$yJ^L%ZGPv1YT$V|u;*+ZCWz ztHI~CDVsuy($SfR6-`N~K?9GTB#l%%0h7 z-q`K-y~E)+s8lMyTrPL8^_pUo)9G|SluG5pPqw6!LJB_PzyJUM07*qoM6N<$f^=yZ AYybcN diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_magnify.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_magnify.png deleted file mode 100644 index f6b74cc40f82fc83e4dfa6e9647ccc1b34e6ed7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 554 zcmV+_0@eMAP)Vb2f>2}Fa82O3m(Ob=t*sniin`NpInLyMJgI`saru@YOPfh zy4g0#G*cV!#N%;Gq9_VH9?v%kjS3Rb1j8^;C={$Gp=lbj z*(?%?geA!5^Pok%UauwjA)v4g2`HedDw4_Mk4hhBQt?e7YJ5(hcj|3dNu^TOPGnjB zTTsqd3GIZ=Bb`n=7no)dflv&K(lsWw?lH6T1Yht0F9qgIuzh}ym0%n<3d3EBWB*pg z+G!I0lbAEXyd>k|QNuwr4=KX1D+tLPv)j@C1=N4sA4NF9A>HcO3G47*Y6!+SrUH-7 z1hb;^#S=r|`aMh>J#dWruAEf}gcR(DRUC`ZUev&$Sbh0SgLiTXeeHEU<$_YV;9281 zym`igIE%Sm8DpDw7@71Tv^EB5xSdUR*0$Mqp+Wq8OoaZtOg52&)zZ;;M=7#C1Yd6x svjx>8ad4e2x|*xHHwRjcjs6zA0XLDUqKT6dS^xk507*qoM6N<$f*wetruo^Ag2=LamM1T#~4RmC^m`_ zs}H7d&XJ}mg+hU?tu0noRvyjI&o2SRAeYZFesYkts79I^jJ7!A7%6nJwq8O?iT55M z1OQ` zbL{!Cp5o*IRmE9PInMCSPjTwfT~J+EYkz}tjxY=fg5Yf6EQ@DG$0kMJ9h^&$W}9BU zP1oj2;?MWVkKIEl)r=Y;L^Cx2q|>!)qJJ8zE7-V*-Cf7V8_2#1c0N975t~+&QUpQJ z5(uo(-O_`%Rj@U@t>JYAgd!>L?0Idxtd#oW2gc!jinsAEva8|kF4#Ic**mmml_{d^$s}Q5Q)KCys4sfck5bP1SyeHwh2`A<@N&t2j0^lgHC_^(pAAPCNjwl+>AN%C4Ll>_8Hjda%9 oS~i=#*e)>KsPlg0=2)Qg6BCqJ=F8HdGXMYp07*qoM6N<$f@i)wr~m)} diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_office.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_office.png deleted file mode 100644 index a65bcb3e1e9613cd9e4950850db43d7025a5fdf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 779 zcmV+m1N8ifP)JNR5;6x zll@CmQ5eTZ^k*a#RQf}fVOdd`5NJh6S(>6Cf$wEW#f&JyAR#GAn9>Gml;nOf3WCDa z5({5&UB$(IF?G#$x4X@Ickg!Y-HU!Z_rzX=qAq-XI_LS^=lOCT0|0{#{kBkYDS7{3 zD`iu%E=`cDX_^#^#n$5SIQ|4Zhsk8>N|zXHXG@*41$i-7`Jr{8`3S_OEcmY|RF48wXkk?WpdVM4OePBSbfh z#4_=eXJg@3epx~gi>QbUmO}Bm(ENN3+@c?jWiKvSrm(o|W}Ud*?vy~fn1!V~Cl4kB zI-;c!8f~-v)jX82%EG($>?;KSD$64f2&4qQ#=Yyrcpy$57RAVuV#vKMP)0hT$r6m# zc^F^XaJ8R9Q|}x^NoJYIvYZkq-z}Tnj@UJK2l2H zG}p+VvtjP2Z%bsb$~7QLJ9#pC0dKi`ppOd^_V;ME6tdzC0PtV|r=@e@37O`%0k^=5^`%cf$eu00N17Ro!{^30krz>a%3j34C?*{Mt2^a4~ zK=P+Qq%|f;Tc&+9ps;@Mw`EE%rgs&#y=j6BUGg96oIqdwj9-fiy*N(|@o)eD002ov JPDHLkV1j#pUPb@_ diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_paint.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_paint.png deleted file mode 100644 index 23a37b891c2f5faa3b8128d45373ceab794ca609..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 688 zcmV;h0#E&kP)PK^TXt2QS_@2qt2T|9~baC-vaPn=ziepcfAwB$0!O2Q)E}1e8!q+9)KT5JVKU z7HNY}h##OS-BxWHWjD0wrPDeEfUClHs%Q6&2u@FTOJkKMQN|_Rlw6rQz$gPzqGNtj z#ruSeFeh835JJFiM6vp@6M5bXj%k7CMt%SIwfbF_fD-3*Os`9Ly_Q3WQ_SX33E{pX z9_WIeeTCGQ3wYALpBcK+P-iuw;3i&7xCua37k5# z`>c`M@sGeC7cdsdz`aE9lOz!hPholbyz%T85LYf6O*@SA+9&+^7k>+4M8$A8iNQq{ zQvn8k?-+dU`Z@gK0z$EtPV#+`^OH`R@cE-cuE&_!D)SZGxmQxeobP_Zwq zMEgi6ePN45N`|V1so0uE8^}1xw8s;VM%Ai@7} z2-&Cyvez_-O4?6uv{zTaj|YeYEk34i~K@`8YW2g{x* zc;7z3lItpVy_et{Z-ZZ)<@*%{l7Ao8mu@V7*gz<_1##mwW*%LEwCdzNsVLYx2*T-J z#HeQ*_a=R~KDdVNk$EVgAIRl$oQi_(`_IrdJciDpH|Xe{K-YsMtc!cRnFi$qzsr4z z5*$;ecov%3->1{YNy6-Gf(Ecy&_I$CjI#laeuE+S120^|Vjsf)W&i*H07*qoM6N<$ Ef)^4A_ab^avY?n0hpS-#mn_4{O$e%cm-@NH=3`90Wq+3`~HKArSdfX`&Z12 z(CY$VW-MNtXX4xy%yUeE?}*~0-|iByA@ZrwXgph4S*bhcc5{HB!DFVm_v}P*g7+Q~K}7K0lcp(^N@X>U zV`{ZpeIf${R6Hgg4FL^`X$Eu75k(PE6ycl$AW0Ic)#@rR7Z(7;V?i-dR1K935Jgcx zPfkwK>2wGokf!Nih^ARp6-6arYFG#(9Ta!x93nFEjoA==z(g?#sDg?Owk?Mg7K+>l zWYsf(<`#+$h9Sp6gFOg_dd+80SkUpk&xM7h0`Sov9W73spU;GP073|VfZ&Gd$J$*0<~TV5aPS|qWH57|VJz+d0000vYep8SaFV10Q$h+;hIUPX_=v5b}%>Tm<(&j1&5;I!55C)oN0s(P%ZB zP3Q#ahfpXKWF@S?jm4U#fv)QovMhrriclyNs6-G12#3R##4PSZ0VY(dRWJ;Lwuq{# zAW0Gwi$yA^R4RZ!;W+L`f&%x{=D^VK#BBWL4Ys{;*!A7Q;!=dN<&D8*GzGaF4`hV4 zDbY0{NrMX>ZqF=0((gR5-zL$kC*b)!fwu{Euru|XrG<$^n#@)7i_>rCmRxnDq>$Y%gJaCkRd|tE*a2x05Pe!I^e13o69#&RQZ36s0 zB=O|K2Yi(jsMqThn}9t?f5E-)L^naZ+db$&%M$!bCdm=jv7?t_lB?3&%Ltq(>ESw? c;MI421LCcoDG!2@;{X5v07*qoM6N<$f`UZt7XSbN diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_picture.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_picture.png deleted file mode 100644 index 134b6693687b2fa5fe36d48a9c0b8001f937c741..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 650 zcmV;50(Jd~P)VHAd+bMNh~)LLRqN>D)-jd9UvB%+hyKX5U|&4t0)fzgD-MPpQ$nHU%yoz=vI zMGb>1Xu!6Hw$NT~@Au<4P-+{9;Uw?&oj31uzH>xX0T7Xkz!(tn|Ed9-s_FqyReC13 z(ll)vW1O{Ck5ihay12Ob2ABc@RUI;zHpaMiyRDs0r>|D4rHw{ItJSJnYjt~jTbGuW z`X(~}?!&86q40R8<4zYw;$qi0^3ec=c&<&H;r`8W%H=Xymf^i;Wo6~<+}zx2UMzpC z*6MZN?(FMv`n|KO3(KFiUaucP0;Z!@LcUNa%8#vGK5aZ>wDgB0Gi=t*argWJcdlMQ z2#MpEX0wU+9&0U?N(F#OgpviU_Y{jYMsj65U3|PjwUOY}lUYj?MTiK_Il}NCVx-Eh zDx-TzMk7se+M#W_>?A1-x}ZXw3kkyz5kW)_hkjsi@RhKadN#H$Hq)$07*qoM6N<$f}lhwPXGV_ diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_powerpoint.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_powerpoint.png deleted file mode 100644 index c4eff0387d5888c638ba09473ba6d2369f7b56f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 588 zcmV-S0<-;zP)HU2HvUSp%6 z*n}iP63IK?dpo;h@sj9~pcxo;VVTc-XLiP@DgefqE#NE=@oyUd-&HjLpsLIuSFXV-EMck)oQ(A`s%*^&wf0(rNiNHsU%=0Rw;WC z(kbc37l6fo`-0uR!pYkYv8U^3?nsh^@pw!K0TH3uYyx1_2>|JbXPmfskJ|1YAw9w! z9`N)1^Aesr;y5Nr5-ODn)oOL|CGi}f9!&iVwpK$khlIX10X$H6^A_stBJqvLhU$?V`QXqKme*s~gVDJ4A;LTs_e15jhc1;By a82kqHEPVYFAD2!50000JNR5;6( zlS@kiVHAe7MZY2;Xi-5)WxDDgv@tCUl*&p14T@Z~3ThM5LP4tuQfLu@EnG;nXc<8S z6&3BN?fx-cv-Kp6>HRiNTHE>$X( zD&=w+?GWC>?RLAGC6Yix;an~UmSt)tSf}1VS6N1N2ONORdD? zaj}w6DAZZdOud9Ep?M?{iQWbE5^9HLLZZF|1kdy0Tu4InEuboP9@nvbZ-P0n4AZTy zyMRIxRDmUE#LdqYuD=-Qz4N^bC`_#S7vcLn1M}{J(Wl3#c4VWczu&)AjUlh(11>gp>f`wv{KnjF%!aA*Jk N002ovPDHLkV1kkt*XsZP diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_ruby.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_ruby.png deleted file mode 100644 index f59b7c4365fa1720af1aa04eb47167ddaa6eeed4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 626 zcmV-&0*(ENP)ZS(e|#C2>JN4>y}l*tQ*E7zP@R2CCJnkW?xa6bgk%(hgtZ z0=~d?U3i`+Mvi4!&~+WPT1^NX#{u6&QIx+DE(oR{&T5&-ovF?@wGw)P&AtpHZa|G%V*GUUqL@@!d4V$`8=##4)ytY959JG zdc&Kho)&AL70^i z!PEmeeDWCB-UbK(*4JST44^tV2z_J(dn~+vBMJT97_7rzFio=~XczIv?PQ5$v%u~y zu(bteXb5I1h2zCV{Jc2~V{{yzZipgsP6;k264$*#5q?GzCm|CPa9CKqm4b116h3Pu z?+%Cm52plC8|5P0@igf2GV1KkCfk{Zecu=G@VNrf>s%g9c5D%@cfxVb6$nY`1IW=4 zt10QqSps_2JLp0f3I0j0u>#qA;v!+T))KEbCg|mo3q0pG{OR}p0fPds8+K~d>Hq)$ M07*qoM6N<$g1S2e3jhEB diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_stack.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_stack.png deleted file mode 100644 index 44084add79b9a0fc3354d16bbd4b4b5ff8095da7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$R@9E+gqH(@-qA%AW0|7U8+xDRI z0k`B18}ImRw2g{jTGP$Pmx3yI6F_2s&$|`cJ!i0UN zB3H;=r{#{FwLaNVJ&hZl9+MTHGx1T^-A=Q0?hRb#8a~x50X%;`b6ik3cw=#XdxWy= zgrpBoDjpwP&g9<9h3x!k_B!?vuTJVkmIJ-U N;OXk;vd$@?2>|rNdMN+^ diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_star.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_star.png deleted file mode 100644 index 3a1441c9a12062a4bb3d706000d3ca14399aebca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?Pe~P)SCZIX8XZzY2l?gCw6LlgWJ5Avz#QX4|&mI8LN)w~J1vgL=KLAhlWz*=#m~gyvxa z&;iC6gb?aZvMdXxX`<0+D1hs_pqJ!wxqlEH;CJ)je~uL(gpi@v>!I0f_Kl=E(E+Tq z26na*9gribxx-Oft(HnstyXUUy!39&E-cI%J5Rsy;(PGZH{g{ty!HVC&yGPT3H8x# zw{^gBPW)O0FMoh{k%l<`1a|To_Wl&u&-GXm8izU|&<&utILc4wc6s@u1bmTz6x{qg zTw@7=FQRcg&r`h+gcR$*Jbv+*DPk7v)B@e0o2 z6IlBXW&8xh@9)YKiV~2>+z&XKd24JT55YWz&JtfvCg4r^~bLP79-yS@n$OW00000NkvXXu0mjf DStt2z diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_swoosh.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_swoosh.png deleted file mode 100644 index e7708292adabf4821612bfca032cbd019c63180b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 634 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 diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_width.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_width.png deleted file mode 100644 index 1eb880947ddf3e745c29e8d9dc90f09c7e6e323c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$R?&;zfqH(@;q9b3Efq-lM(nr^( z=EYR73-9e)UYMWsXy%?aZsD68Yyv^2$~6QgEcljw%kx>O(f-gQ?@fOOx3A-0+Qw?O zRx~W)kn~Qe2d6f9nMG#g9Q04Mk==M~N!Dglvxk!fgVh#w@ZV$IY1+Xc`d{d2UcaP~ zfWp)_Ivqj}l2SPy^9ZWy6rG9Yx4v67_uA&&9|XA~5-#3)W3%em1peD8RWH^#O%XoM zxMPud%}GTj#~*+7JMxTd!`{^Q+>(D3*|@KV`*G2;{QnANOxu1$r2xIe;OXk;vd$@? F2>@zac~<}c diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_word.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_word.png deleted file mode 100644 index ae8ecbf47672a874c0958d0d113a56162c2bd364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 651 zcmV;60(AX}P)hkjP zNW|QGv-YFNLN^qH@tJycPNG5ti6B7;r4mEr#lr@*T8*M85D`{ZR^BWwF23T<%MYIh zdC)S*p=|xk^!~H=+HSZ183~y8v4|mYmZxt&)5{{~>J`>E223Q5>T$=~mtA71q-jdG z+eJhOAyBW^0k9Gk1+rX8)zFx((CG^&tDY>6XaS~Fy!WJON|Gdujg5^~Vzt@o%BcYLiNiTQSD`zL^ociBz_>bDlpw3kriQ@Z`bVsGz-_6N>$&gTDiKDTKR^ z-hB*tHa^>!oD~5TK^0UK5rZ}RBm50Bv}S-yA%s=Ha5RYb{)!z2N&$&64gfhybBu8p lh~_|?8^bu;BRYt{<}Yrwd83Y=s?Goa002ovPDHLkV1l%3CP4rI diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_world.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_world.png deleted file mode 100644 index 6ed2490ed1432d5d667a76235360824a1088e928..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 734 zcmV<40wMj0P)JT{hN;C#tgf#9krG=I>5!<*aE1_(spcgF}<`n4i zJi-}^6UUeU4jUFwdCiVPDm%`Zx^UBa8J(mnR6wEgz^}o8;)M*Y(@l_!Kfv)}4+NuM zaPXE50z)r)9=D=SR|RIqfQ^j}Hu!fzMeQBo+@PZk1G8hOw|vBTvkx`HM)Xe9q3xao z@`p0`NO!2904FHSLA6E@Y-O6zH$DQzvq@aHsz}}<(!v(Z_+EodX%R&NZW75g+nENo zV0020rxE^;7d!067AN>6*+&YLp$9uH6F-=In`XC{Cn%+o|5)b&boEPr02w@|P*oGm QmjD0&07*qoM6N<$g78X0Q~&?~ diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_wrench.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_wrench.png deleted file mode 100644 index fecadd08afed92536be91ab12d8e37b6bf410d5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 613 zcmV-r0-F7aP)wK%m(L+9IV|s|#(WRl-O^4GvaQsnHq|OstfO zIJ3}3<01}YGARE4m!7=)QisvlHUo!Qymx-@-t*p_129Ko-#pVI)6#!*kLj-AGXWNR zyA_{wKii_amK7^YT-v z6#plaNm#8`-kz@OvjIt^4%IN{@J3bR zRI}ME1Mv85p|%;RK>ViR>APPLB4;;BpCtqE@P+*7!G>I4UjNx~e>r3HA^tWCQ@S)l z{BslcSwL-CxQ&_ZZSv_g0Tu{yi*X){Mt|W7)lbE`SQxFP00000NkvXXu0mjf;)M*S diff --git a/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_zip.png b/node_modules/express/node_modules/connect/lib-cov/public/icons/page_white_zip.png deleted file mode 100644 index fd4bbccdf1643f4ff5022fbc59b82546e259317e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 386 zcmV-|0e$|7P)_QM!1S$Bhw4w+iRuFWf;tfR6D%SMJrb+tx zC9R6{2>Ou6#juIy6u(I?|;&Owi$sRB4^20apB5xE2 z#B9XekY66S6lzfCL!eEQRgo0LokTA55@Y#%_wN!TXPw^Q4IIXsG~v#u_4t;x_HM16EQ@QRY+rut&97&UefsPmLrQ5P zBC2kcbux9L%2bJz$P$XV$*zSxb2e@6_3O#;&!FD<&hLjGn%~%en;7)djE^d6!t$lW7GyIOKlQ46hr`Z zjLNuRDP_53dNoN?wd&HMgL^m1DXFU<5dQsrceN>fSz00000)O9XRTN^$%%`*Fg>ryDtc(lF@?b>dE!20r+y z#Q*>(wbV5H`-E4Do={CJp7=ERhw15hgZi)?jRG88 zzVz(5;g?Td1izJyO33bhjg2Qc7FVY@f9!o)Gu?DII~vm-Dc?}3M!fsgjP?F(7`rgg z+xOk8XD)e?Zl=5+un`5!7kr?F=eq)K-5uqr%yU$1hLv){Vlm=)*5~`lwMciiXFu*g z)*Jkz6AF>#zb(Vx`Iv{bdGZHtlW)v(y5k^|xgSUc9%0}S20nrYrO}78ofk?bV!5)4 z=Ngz@+$9N1>>mA%IWx`Fqa240bWkiW;2TZgd8CZS0U}@mknC;!2;wi$eI@`h0y2JS`Eae0CW}q(2(%!m8 zWq$`PDU>LT1_y*bBv#P5<@q0@ttz$hIH}YMDvAigCc=y*)jY-VOpTd;A8@3t7Xh4r z0KTWOk;N2Ox4!&&^4B*no$WtTX!BXB)rg!y8dvGgKBQKLJNXRRp0}Bsjd1|LNQX~c zbC~fjrk2iL@4dYF*vt;}dFn(%h)n_-vzEIHMOKRkdF%3Lq|zBgKm_h>TEq!))nWjq zzn;B!?!(dQcHu$#=JF`cS&W~C`WHFW^B!~MI#k)>1Vk&eQy8P1O`J6V04{D@|7d6^ zyBABnh-d^H0FX&L07M||E0n_dp4v&Q%PSE9p#R#Hq)`5I_(B5CE#q dxjPz0{s-<+c#AC!i7@~G002ovPDHLkV1iPlpuqqD diff --git a/node_modules/express/node_modules/connect/lib-cov/public/style.css b/node_modules/express/node_modules/connect/lib-cov/public/style.css deleted file mode 100644 index 32b6507..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/public/style.css +++ /dev/null @@ -1,141 +0,0 @@ -body { - margin: 0; - padding: 80px 100px; - font: 13px "Helvetica Neue", "Lucida Grande", "Arial"; - background: #ECE9E9 -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#ECE9E9)); - background: #ECE9E9 -moz-linear-gradient(top, #fff, #ECE9E9); - background-repeat: no-repeat; - color: #555; - -webkit-font-smoothing: antialiased; -} -h1, h2, h3 { - margin: 0; - font-size: 22px; - color: #343434; -} -h1 em, h2 em { - padding: 0 5px; - font-weight: normal; -} -h1 { - font-size: 60px; -} -h2 { - margin-top: 10px; -} -h3 { - margin: 5px 0 10px 0; - padding-bottom: 5px; - border-bottom: 1px solid #eee; - font-size: 18px; -} -ul { - margin: 0; - padding: 0; -} -ul li { - margin: 5px 0; - padding: 3px 8px; - list-style: none; -} -ul li:hover { - cursor: pointer; - color: #2e2e2e; -} -ul li .path { - padding-left: 5px; - font-weight: bold; -} -ul li .line { - padding-right: 5px; - font-style: italic; -} -ul li:first-child .path { - padding-left: 0; -} -p { - line-height: 1.5; -} -a { - color: #555; - text-decoration: none; -} -a:hover { - color: #303030; -} -#stacktrace { - margin-top: 15px; -} -.directory h1 { - margin-bottom: 15px; - font-size: 18px; -} -ul#files { - width: 100%; - height: 500px; -} -ul#files li { - padding: 0; -} -ul#files li img { - position: absolute; - top: 5px; - left: 5px; -} -ul#files li a { - position: relative; - display: block; - margin: 1px; - width: 30%; - height: 25px; - line-height: 25px; - text-indent: 8px; - float: left; - border: 1px solid transparent; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - overflow: hidden; - text-overflow: ellipsis; -} -ul#files li a.icon { - text-indent: 25px; -} -ul#files li a:focus, -ul#files li a:hover { - outline: none; - background: rgba(255,255,255,0.65); - border: 1px solid #ececec; -} -ul#files li a.highlight { - -webkit-transition: background .4s ease-in-out; - background: #ffff4f; - border-color: #E9DC51; -} -#search { - display: block; - position: fixed; - top: 20px; - right: 20px; - width: 90px; - -webkit-transition: width ease 0.2s, opacity ease 0.4s; - -moz-transition: width ease 0.2s, opacity ease 0.4s; - -webkit-border-radius: 32px; - -moz-border-radius: 32px; - -webkit-box-shadow: inset 0px 0px 3px rgba(0, 0, 0, 0.25), inset 0px 1px 3px rgba(0, 0, 0, 0.7), 0px 1px 0px rgba(255, 255, 255, 0.03); - -moz-box-shadow: inset 0px 0px 3px rgba(0, 0, 0, 0.25), inset 0px 1px 3px rgba(0, 0, 0, 0.7), 0px 1px 0px rgba(255, 255, 255, 0.03); - -webkit-font-smoothing: antialiased; - text-align: left; - font: 13px "Helvetica Neue", Arial, sans-serif; - padding: 4px 10px; - border: none; - background: transparent; - margin-bottom: 0; - outline: none; - opacity: 0.7; - color: #888; -} -#search:focus { - width: 120px; - opacity: 1.0; -} diff --git a/node_modules/express/node_modules/connect/lib-cov/utils.js b/node_modules/express/node_modules/connect/lib-cov/utils.js deleted file mode 100644 index 2200dce..0000000 --- a/node_modules/express/node_modules/connect/lib-cov/utils.js +++ /dev/null @@ -1,282 +0,0 @@ -/* automatically generated by JSCoverage - do not edit */ -if (typeof _$jscoverage === 'undefined') _$jscoverage = {}; -if (! _$jscoverage['utils.js']) { - _$jscoverage['utils.js'] = []; - _$jscoverage['utils.js'][13] = 0; - _$jscoverage['utils.js'][26] = 0; - _$jscoverage['utils.js'][27] = 0; - _$jscoverage['utils.js'][39] = 0; - _$jscoverage['utils.js'][40] = 0; - _$jscoverage['utils.js'][41] = 0; - _$jscoverage['utils.js'][54] = 0; - _$jscoverage['utils.js'][55] = 0; - _$jscoverage['utils.js'][56] = 0; - _$jscoverage['utils.js'][57] = 0; - _$jscoverage['utils.js'][73] = 0; - _$jscoverage['utils.js'][74] = 0; - _$jscoverage['utils.js'][95] = 0; - _$jscoverage['utils.js'][96] = 0; - _$jscoverage['utils.js'][97] = 0; - _$jscoverage['utils.js'][98] = 0; - _$jscoverage['utils.js'][101] = 0; - _$jscoverage['utils.js'][112] = 0; - _$jscoverage['utils.js'][113] = 0; - _$jscoverage['utils.js'][132] = 0; - _$jscoverage['utils.js'][133] = 0; - _$jscoverage['utils.js'][147] = 0; - _$jscoverage['utils.js'][148] = 0; - _$jscoverage['utils.js'][149] = 0; - _$jscoverage['utils.js'][166] = 0; - _$jscoverage['utils.js'][167] = 0; - _$jscoverage['utils.js'][168] = 0; - _$jscoverage['utils.js'][169] = 0; - _$jscoverage['utils.js'][184] = 0; - _$jscoverage['utils.js'][185] = 0; - _$jscoverage['utils.js'][186] = 0; - _$jscoverage['utils.js'][187] = 0; - _$jscoverage['utils.js'][188] = 0; - _$jscoverage['utils.js'][189] = 0; - _$jscoverage['utils.js'][190] = 0; - _$jscoverage['utils.js'][191] = 0; - _$jscoverage['utils.js'][192] = 0; - _$jscoverage['utils.js'][196] = 0; - _$jscoverage['utils.js'][208] = 0; - _$jscoverage['utils.js'][209] = 0; - _$jscoverage['utils.js'][222] = 0; - _$jscoverage['utils.js'][223] = 0; - _$jscoverage['utils.js'][224] = 0; - _$jscoverage['utils.js'][225] = 0; - _$jscoverage['utils.js'][226] = 0; - _$jscoverage['utils.js'][228] = 0; - _$jscoverage['utils.js'][239] = 0; - _$jscoverage['utils.js'][240] = 0; - _$jscoverage['utils.js'][241] = 0; - _$jscoverage['utils.js'][242] = 0; - _$jscoverage['utils.js'][267] = 0; - _$jscoverage['utils.js'][276] = 0; - _$jscoverage['utils.js'][277] = 0; - _$jscoverage['utils.js'][278] = 0; - _$jscoverage['utils.js'][279] = 0; - _$jscoverage['utils.js'][292] = 0; - _$jscoverage['utils.js'][293] = 0; - _$jscoverage['utils.js'][305] = 0; - _$jscoverage['utils.js'][306] = 0; - _$jscoverage['utils.js'][307] = 0; - _$jscoverage['utils.js'][308] = 0; - _$jscoverage['utils.js'][319] = 0; - _$jscoverage['utils.js'][320] = 0; - _$jscoverage['utils.js'][321] = 0; - _$jscoverage['utils.js'][322] = 0; - _$jscoverage['utils.js'][334] = 0; - _$jscoverage['utils.js'][335] = 0; - _$jscoverage['utils.js'][346] = 0; - _$jscoverage['utils.js'][347] = 0; - _$jscoverage['utils.js'][350] = 0; - _$jscoverage['utils.js'][351] = 0; - _$jscoverage['utils.js'][355] = 0; - _$jscoverage['utils.js'][358] = 0; - _$jscoverage['utils.js'][369] = 0; - _$jscoverage['utils.js'][370] = 0; - _$jscoverage['utils.js'][371] = 0; - _$jscoverage['utils.js'][372] = 0; - _$jscoverage['utils.js'][374] = 0; - _$jscoverage['utils.js'][386] = 0; -} -_$jscoverage['utils.js'][13]++; -var http = require("http"), crypto = require("crypto"), parse = require("url").parse, signature = require("cookie-signature"); -_$jscoverage['utils.js'][26]++; -exports.hasBody = (function (req) { - _$jscoverage['utils.js'][27]++; - return "transfer-encoding" in req.headers || "content-length" in req.headers; -}); -_$jscoverage['utils.js'][39]++; -exports.mime = (function (req) { - _$jscoverage['utils.js'][40]++; - var str = req.headers["content-type"] || ""; - _$jscoverage['utils.js'][41]++; - return str.split(";")[0]; -}); -_$jscoverage['utils.js'][54]++; -exports.error = (function (code, msg) { - _$jscoverage['utils.js'][55]++; - var err = new Error(msg || http.STATUS_CODES[code]); - _$jscoverage['utils.js'][56]++; - err.status = code; - _$jscoverage['utils.js'][57]++; - return err; -}); -_$jscoverage['utils.js'][73]++; -exports.md5 = (function (str, encoding) { - _$jscoverage['utils.js'][74]++; - return crypto.createHash("md5").update(str).digest(encoding || "hex"); -}); -_$jscoverage['utils.js'][95]++; -exports.merge = (function (a, b) { - _$jscoverage['utils.js'][96]++; - if (a && b) { - _$jscoverage['utils.js'][97]++; - for (var key in b) { - _$jscoverage['utils.js'][98]++; - a[key] = b[key]; -} - } - _$jscoverage['utils.js'][101]++; - return a; -}); -_$jscoverage['utils.js'][112]++; -exports.escape = (function (html) { - _$jscoverage['utils.js'][113]++; - return String(html).replace(/&(?!\w+;)/g, "&").replace(//g, ">").replace(/"/g, """); -}); -_$jscoverage['utils.js'][132]++; -exports.uid = (function (len) { - _$jscoverage['utils.js'][133]++; - return crypto.randomBytes(Math.ceil(len * 3 / 4)).toString("base64").slice(0, len); -}); -_$jscoverage['utils.js'][147]++; -exports.sign = (function (val, secret) { - _$jscoverage['utils.js'][148]++; - console.warn("do not use utils.sign(), use https://github.com/visionmedia/node-cookie-signature"); - _$jscoverage['utils.js'][149]++; - return val + "." + crypto.createHmac("sha256", secret).update(val).digest("base64").replace(/=+$/, ""); -}); -_$jscoverage['utils.js'][166]++; -exports.unsign = (function (val, secret) { - _$jscoverage['utils.js'][167]++; - console.warn("do not use utils.unsign(), use https://github.com/visionmedia/node-cookie-signature"); - _$jscoverage['utils.js'][168]++; - var str = val.slice(0, val.lastIndexOf(".")); - _$jscoverage['utils.js'][169]++; - return exports.sign(str, secret) == val? str: false; -}); -_$jscoverage['utils.js'][184]++; -exports.parseSignedCookies = (function (obj, secret) { - _$jscoverage['utils.js'][185]++; - var ret = {}; - _$jscoverage['utils.js'][186]++; - Object.keys(obj).forEach((function (key) { - _$jscoverage['utils.js'][187]++; - var val = obj[key]; - _$jscoverage['utils.js'][188]++; - if (0 == val.indexOf("s:")) { - _$jscoverage['utils.js'][189]++; - val = signature.unsign(val.slice(2), secret); - _$jscoverage['utils.js'][190]++; - if (val) { - _$jscoverage['utils.js'][191]++; - ret[key] = val; - _$jscoverage['utils.js'][192]++; - delete obj[key]; - } - } -})); - _$jscoverage['utils.js'][196]++; - return ret; -}); -_$jscoverage['utils.js'][208]++; -exports.parseSignedCookie = (function (str, secret) { - _$jscoverage['utils.js'][209]++; - return 0 == str.indexOf("s:")? signature.unsign(str.slice(2), secret): str; -}); -_$jscoverage['utils.js'][222]++; -exports.parseJSONCookies = (function (obj) { - _$jscoverage['utils.js'][223]++; - Object.keys(obj).forEach((function (key) { - _$jscoverage['utils.js'][224]++; - var val = obj[key]; - _$jscoverage['utils.js'][225]++; - var res = exports.parseJSONCookie(val); - _$jscoverage['utils.js'][226]++; - if (res) { - _$jscoverage['utils.js'][226]++; - obj[key] = res; - } -})); - _$jscoverage['utils.js'][228]++; - return obj; -}); -_$jscoverage['utils.js'][239]++; -exports.parseJSONCookie = (function (str) { - _$jscoverage['utils.js'][240]++; - if (0 == str.indexOf("j:")) { - _$jscoverage['utils.js'][241]++; - try { - _$jscoverage['utils.js'][242]++; - return JSON.parse(str.slice(2)); - } - catch (err) { - } - } -}); -_$jscoverage['utils.js'][267]++; -exports.pause = require("pause"); -_$jscoverage['utils.js'][276]++; -exports.removeContentHeaders = (function (res) { - _$jscoverage['utils.js'][277]++; - Object.keys(res._headers).forEach((function (field) { - _$jscoverage['utils.js'][278]++; - if (0 == field.indexOf("content")) { - _$jscoverage['utils.js'][279]++; - res.removeHeader(field); - } -})); -}); -_$jscoverage['utils.js'][292]++; -exports.conditionalGET = (function (req) { - _$jscoverage['utils.js'][293]++; - return req.headers["if-modified-since"] || req.headers["if-none-match"]; -}); -_$jscoverage['utils.js'][305]++; -exports.unauthorized = (function (res, realm) { - _$jscoverage['utils.js'][306]++; - res.statusCode = 401; - _$jscoverage['utils.js'][307]++; - res.setHeader("WWW-Authenticate", "Basic realm=\"" + realm + "\""); - _$jscoverage['utils.js'][308]++; - res.end("Unauthorized"); -}); -_$jscoverage['utils.js'][319]++; -exports.notModified = (function (res) { - _$jscoverage['utils.js'][320]++; - exports.removeContentHeaders(res); - _$jscoverage['utils.js'][321]++; - res.statusCode = 304; - _$jscoverage['utils.js'][322]++; - res.end(); -}); -_$jscoverage['utils.js'][334]++; -exports.etag = (function (stat) { - _$jscoverage['utils.js'][335]++; - return "\"" + stat.size + "-" + Number(stat.mtime) + "\""; -}); -_$jscoverage['utils.js'][346]++; -exports.parseCacheControl = (function (str) { - _$jscoverage['utils.js'][347]++; - var directives = str.split(","), obj = {}; - _$jscoverage['utils.js'][350]++; - for (var i = 0, len = directives.length; i < len; i++) { - _$jscoverage['utils.js'][351]++; - var parts = directives[i].split("="), key = parts.shift().trim(), val = parseInt(parts.shift(), 10); - _$jscoverage['utils.js'][355]++; - obj[key] = isNaN(val)? true: val; -} - _$jscoverage['utils.js'][358]++; - return obj; -}); -_$jscoverage['utils.js'][369]++; -exports.parseUrl = (function (req) { - _$jscoverage['utils.js'][370]++; - var parsed = req._parsedUrl; - _$jscoverage['utils.js'][371]++; - if (parsed && parsed.href == req.url) { - _$jscoverage['utils.js'][372]++; - return parsed; - } - else { - _$jscoverage['utils.js'][374]++; - return req._parsedUrl = parse(req.url); - } -}); -_$jscoverage['utils.js'][386]++; -exports.parseBytes = require("bytes"); -_$jscoverage['utils.js'].source = ["","/*!"," * Connect - utils"," * Copyright(c) 2010 Sencha Inc."," * Copyright(c) 2011 TJ Holowaychuk"," * MIT Licensed"," */","","/**"," * Module dependencies."," */","","var http = require('http')"," , crypto = require('crypto')"," , parse = require('url').parse"," , signature = require('cookie-signature');","","/**"," * Return `true` if the request has a body, otherwise return `false`."," *"," * @param {IncomingMessage} req"," * @return {Boolean}"," * @api private"," */","","exports.hasBody = function(req) {"," return 'transfer-encoding' in req.headers || 'content-length' in req.headers;","};","","/**"," * Extract the mime type from the given request's"," * _Content-Type_ header."," *"," * @param {IncomingMessage} req"," * @return {String}"," * @api private"," */","","exports.mime = function(req) {"," var str = req.headers['content-type'] || '';"," return str.split(';')[0];","};","","/**"," * Generate an `Error` from the given status `code`"," * and optional `msg`."," *"," * @param {Number} code"," * @param {String} msg"," * @return {Error}"," * @api private"," */","","exports.error = function(code, msg){"," var err = new Error(msg || http.STATUS_CODES[code]);"," err.status = code;"," return err;","};","","/**"," * Return md5 hash of the given string and optional encoding,"," * defaulting to hex."," *"," * utils.md5('wahoo');"," * // => \"e493298061761236c96b02ea6aa8a2ad\""," *"," * @param {String} str"," * @param {String} encoding"," * @return {String}"," * @api private"," */","","exports.md5 = function(str, encoding){"," return crypto"," .createHash('md5')"," .update(str)"," .digest(encoding || 'hex');","};","","/**"," * Merge object b with object a."," *"," * var a = { foo: 'bar' }"," * , b = { bar: 'baz' };"," * "," * utils.merge(a, b);"," * // => { foo: 'bar', bar: 'baz' }"," *"," * @param {Object} a"," * @param {Object} b"," * @return {Object}"," * @api private"," */","","exports.merge = function(a, b){"," if (a && b) {"," for (var key in b) {"," a[key] = b[key];"," }"," }"," return a;","};","","/**"," * Escape the given string of `html`."," *"," * @param {String} html"," * @return {String}"," * @api private"," */","","exports.escape = function(html){"," return String(html)"," .replace(/&(?!\\w+;)/g, '&amp;')"," .replace(/</g, '&lt;')"," .replace(/>/g, '&gt;')"," .replace(/\"/g, '&quot;');","};","","","/**"," * Return a unique identifier with the given `len`."," *"," * utils.uid(10);"," * // => \"FDaS435D2z\""," *"," * @param {Number} len"," * @return {String}"," * @api private"," */","","exports.uid = function(len) {"," return crypto.randomBytes(Math.ceil(len * 3 / 4))"," .toString('base64')"," .slice(0, len);","};","","/**"," * Sign the given `val` with `secret`."," *"," * @param {String} val"," * @param {String} secret"," * @return {String}"," * @api private"," */","","exports.sign = function(val, secret){"," console.warn('do not use utils.sign(), use https://github.com/visionmedia/node-cookie-signature')"," return val + '.' + crypto"," .createHmac('sha256', secret)"," .update(val)"," .digest('base64')"," .replace(/=+$/, '');","};","","/**"," * Unsign and decode the given `val` with `secret`,"," * returning `false` if the signature is invalid."," *"," * @param {String} val"," * @param {String} secret"," * @return {String|Boolean}"," * @api private"," */","","exports.unsign = function(val, secret){"," console.warn('do not use utils.unsign(), use https://github.com/visionmedia/node-cookie-signature')"," var str = val.slice(0, val.lastIndexOf('.'));"," return exports.sign(str, secret) == val"," ? str"," : false;","};","","/**"," * Parse signed cookies, returning an object"," * containing the decoded key/value pairs,"," * while removing the signed key from `obj`."," *"," * @param {Object} obj"," * @return {Object}"," * @api private"," */","","exports.parseSignedCookies = function(obj, secret){"," var ret = {};"," Object.keys(obj).forEach(function(key){"," var val = obj[key];"," if (0 == val.indexOf('s:')) {"," val = signature.unsign(val.slice(2), secret);"," if (val) {"," ret[key] = val;"," delete obj[key];"," }"," }"," });"," return ret;","};","","/**"," * Parse a signed cookie string, return the decoded value"," *"," * @param {String} str signed cookie string"," * @param {String} secret"," * @return {String} decoded value"," * @api private"," */","","exports.parseSignedCookie = function(str, secret){"," return 0 == str.indexOf('s:')"," ? signature.unsign(str.slice(2), secret)"," : str;","};","","/**"," * Parse JSON cookies."," *"," * @param {Object} obj"," * @return {Object}"," * @api private"," */","","exports.parseJSONCookies = function(obj){"," Object.keys(obj).forEach(function(key){"," var val = obj[key];"," var res = exports.parseJSONCookie(val);"," if (res) obj[key] = res;"," });"," return obj;","};","","/**"," * Parse JSON cookie string"," *"," * @param {String} str"," * @return {Object} Parsed object or null if not json cookie"," * @api private"," */","","exports.parseJSONCookie = function(str) {"," if (0 == str.indexOf('j:')) {"," try {"," return JSON.parse(str.slice(2));"," } catch (err) {"," // no op"," }"," }","};","","/**"," * Pause `data` and `end` events on the given `obj`."," * Middleware performing async tasks _should_ utilize"," * this utility (or similar), to re-emit data once"," * the async operation has completed, otherwise these"," * events may be lost."," *"," * var pause = utils.pause(req);"," * fs.readFile(path, function(){"," * next();"," * pause.resume();"," * });"," *"," * @param {Object} obj"," * @return {Object}"," * @api private"," */","","exports.pause = require('pause');","","/**"," * Strip `Content-*` headers from `res`."," *"," * @param {ServerResponse} res"," * @api private"," */","","exports.removeContentHeaders = function(res){"," Object.keys(res._headers).forEach(function(field){"," if (0 == field.indexOf('content')) {"," res.removeHeader(field);"," }"," });","};","","/**"," * Check if `req` is a conditional GET request."," *"," * @param {IncomingMessage} req"," * @return {Boolean}"," * @api private"," */","","exports.conditionalGET = function(req) {"," return req.headers['if-modified-since']"," || req.headers['if-none-match'];","};","","/**"," * Respond with 401 \"Unauthorized\"."," *"," * @param {ServerResponse} res"," * @param {String} realm"," * @api private"," */","","exports.unauthorized = function(res, realm) {"," res.statusCode = 401;"," res.setHeader('WWW-Authenticate', 'Basic realm=\"' + realm + '\"');"," res.end('Unauthorized');","};","","/**"," * Respond with 304 \"Not Modified\"."," *"," * @param {ServerResponse} res"," * @param {Object} headers"," * @api private"," */","","exports.notModified = function(res) {"," exports.removeContentHeaders(res);"," res.statusCode = 304;"," res.end();","};","","/**"," * Return an ETag in the form of `\"<size>-<mtime>\"`"," * from the given `stat`."," *"," * @param {Object} stat"," * @return {String}"," * @api private"," */","","exports.etag = function(stat) {"," return '\"' + stat.size + '-' + Number(stat.mtime) + '\"';","};","","/**"," * Parse the given Cache-Control `str`."," *"," * @param {String} str"," * @return {Object}"," * @api private"," */","","exports.parseCacheControl = function(str){"," var directives = str.split(',')"," , obj = {};",""," for(var i = 0, len = directives.length; i < len; i++) {"," var parts = directives[i].split('=')"," , key = parts.shift().trim()"," , val = parseInt(parts.shift(), 10);",""," obj[key] = isNaN(val) ? true : val;"," }",""," return obj;","};","","/**"," * Parse the `req` url with memoization."," *"," * @param {ServerRequest} req"," * @return {Object}"," * @api private"," */","","exports.parseUrl = function(req){"," var parsed = req._parsedUrl;"," if (parsed && parsed.href == req.url) {"," return parsed;"," } else {"," return req._parsedUrl = parse(req.url);"," }","};","","/**"," * Parse byte `size` string."," *"," * @param {String} size"," * @return {Number}"," * @api private"," */","","exports.parseBytes = require('bytes');"]; diff --git a/node_modules/express/node_modules/connect/lib/cache.js b/node_modules/express/node_modules/connect/lib/cache.js deleted file mode 100644 index 052fcdb..0000000 --- a/node_modules/express/node_modules/connect/lib/cache.js +++ /dev/null @@ -1,81 +0,0 @@ - -/*! - * Connect - Cache - * Copyright(c) 2011 Sencha Inc. - * MIT Licensed - */ - -/** - * Expose `Cache`. - */ - -module.exports = Cache; - -/** - * LRU cache store. - * - * @param {Number} limit - * @api private - */ - -function Cache(limit) { - this.store = {}; - this.keys = []; - this.limit = limit; -} - -/** - * Touch `key`, promoting the object. - * - * @param {String} key - * @param {Number} i - * @api private - */ - -Cache.prototype.touch = function(key, i){ - this.keys.splice(i,1); - this.keys.push(key); -}; - -/** - * Remove `key`. - * - * @param {String} key - * @api private - */ - -Cache.prototype.remove = function(key){ - delete this.store[key]; -}; - -/** - * Get the object stored for `key`. - * - * @param {String} key - * @return {Array} - * @api private - */ - -Cache.prototype.get = function(key){ - return this.store[key]; -}; - -/** - * Add a cache `key`. - * - * @param {String} key - * @return {Array} - * @api private - */ - -Cache.prototype.add = function(key){ - // initialize store - var len = this.keys.push(key); - - // limit reached, invalidate LRU - if (len > this.limit) this.remove(this.keys.shift()); - - var arr = this.store[key] = []; - arr.createdAt = new Date; - return arr; -}; diff --git a/node_modules/express/node_modules/connect/lib/connect.js b/node_modules/express/node_modules/connect/lib/connect.js deleted file mode 100644 index a067e24..0000000 --- a/node_modules/express/node_modules/connect/lib/connect.js +++ /dev/null @@ -1,93 +0,0 @@ - -/*! - * Connect - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter - , proto = require('./proto') - , utils = require('./utils') - , path = require('path') - , basename = path.basename - , fs = require('fs'); - -// node patches - -require('./patch'); - -// expose createServer() as the module - -exports = module.exports = createServer; - -/** - * Framework version. - */ - -exports.version = '2.7.2'; - -/** - * Expose mime module. - */ - -exports.mime = require('./middleware/static').mime; - -/** - * Expose the prototype. - */ - -exports.proto = proto; - -/** - * Auto-load middleware getters. - */ - -exports.middleware = {}; - -/** - * Expose utilities. - */ - -exports.utils = utils; - -/** - * Create a new connect server. - * - * @return {Function} - * @api public - */ - -function createServer() { - function app(req, res){ app.handle(req, res); } - utils.merge(app, proto); - utils.merge(app, EventEmitter.prototype); - app.route = '/'; - app.stack = []; - for (var i = 0; i < arguments.length; ++i) { - app.use(arguments[i]); - } - return app; -}; - -/** - * Support old `.createServer()` method. - */ - -createServer.createServer = createServer; - -/** - * Auto-load bundled middleware with getters. - */ - -fs.readdirSync(__dirname + '/middleware').forEach(function(filename){ - if (!/\.js$/.test(filename)) return; - var name = basename(filename, '.js'); - function load(){ return require('./middleware/' + name); } - exports.middleware.__defineGetter__(name, load); - exports.__defineGetter__(name, load); -}); diff --git a/node_modules/express/node_modules/connect/lib/index.js b/node_modules/express/node_modules/connect/lib/index.js deleted file mode 100644 index 2618ddc..0000000 --- a/node_modules/express/node_modules/connect/lib/index.js +++ /dev/null @@ -1,50 +0,0 @@ - -/** - * Connect is a middleware framework for node, - * shipping with over 18 bundled middleware and a rich selection of - * 3rd-party middleware. - * - * var app = connect() - * .use(connect.logger('dev')) - * .use(connect.static('public')) - * .use(function(req, res){ - * res.end('hello world\n'); - * }) - * .listen(3000); - * - * Installation: - * - * $ npm install connect - * - * Middleware: - * - * - [logger](logger.html) request logger with custom format support - * - [csrf](csrf.html) Cross-site request forgery protection - * - [compress](compress.html) Gzip compression middleware - * - [basicAuth](basicAuth.html) basic http authentication - * - [bodyParser](bodyParser.html) extensible request body parser - * - [json](json.html) application/json parser - * - [urlencoded](urlencoded.html) application/x-www-form-urlencoded parser - * - [multipart](multipart.html) multipart/form-data parser - * - [timeout](timeout.html) request timeouts - * - [cookieParser](cookieParser.html) cookie parser - * - [session](session.html) session management support with bundled MemoryStore - * - [cookieSession](cookieSession.html) cookie-based session support - * - [methodOverride](methodOverride.html) faux HTTP method support - * - [responseTime](responseTime.html) calculates response-time and exposes via X-Response-Time - * - [staticCache](staticCache.html) memory cache layer for the static() middleware - * - [static](static.html) streaming static file server supporting `Range` and more - * - [directory](directory.html) directory listing middleware - * - [vhost](vhost.html) virtual host sub-domain mapping middleware - * - [favicon](favicon.html) efficient favicon server (with default icon) - * - [limit](limit.html) limit the bytesize of request bodies - * - [query](query.html) automatic querystring parser, populating `req.query` - * - [errorHandler](errorHandler.html) flexible error handler - * - * Links: - * - * - list of [3rd-party](https://github.com/senchalabs/connect/wiki) middleware - * - GitHub [repository](http://github.com/senchalabs/connect) - * - [test documentation](https://github.com/senchalabs/connect/blob/gh-pages/tests.md) - * - */ \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/lib/middleware/basicAuth.js b/node_modules/express/node_modules/connect/lib/middleware/basicAuth.js deleted file mode 100644 index 0205812..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/basicAuth.js +++ /dev/null @@ -1,103 +0,0 @@ - -/*! - * Connect - basicAuth - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('../utils') - , unauthorized = utils.unauthorized; - -/** - * Basic Auth: - * - * Enfore basic authentication by providing a `callback(user, pass)`, - * which must return `true` in order to gain access. Alternatively an async - * method is provided as well, invoking `callback(user, pass, callback)`. Populates - * `req.user`. The final alternative is simply passing username / password - * strings. - * - * Simple username and password - * - * connect(connect.basicAuth('username', 'password')); - * - * Callback verification - * - * connect() - * .use(connect.basicAuth(function(user, pass){ - * return 'tj' == user & 'wahoo' == pass; - * })) - * - * Async callback verification, accepting `fn(err, user)`. - * - * connect() - * .use(connect.basicAuth(function(user, pass, fn){ - * User.authenticate({ user: user, pass: pass }, fn); - * })) - * - * @param {Function|String} callback or username - * @param {String} realm - * @api public - */ - -module.exports = function basicAuth(callback, realm) { - var username, password; - - // user / pass strings - if ('string' == typeof callback) { - username = callback; - password = realm; - if ('string' != typeof password) throw new Error('password argument required'); - realm = arguments[2]; - callback = function(user, pass){ - return user == username && pass == password; - } - } - - realm = realm || 'Authorization Required'; - - return function(req, res, next) { - var authorization = req.headers.authorization; - - if (req.user) return next(); - if (!authorization) return unauthorized(res, realm); - - var parts = authorization.split(' '); - - if (parts.length !== 2) return next(400); - - var scheme = parts[0] - , credentials = new Buffer(parts[1], 'base64').toString() - , index = credentials.indexOf(':'); - - if ('Basic' != scheme || index < 0) return next(400); - - var user = credentials.slice(0, index) - , pass = credentials.slice(index + 1); - - // async - if (callback.length >= 3) { - var pause = utils.pause(req); - callback(user, pass, function(err, user){ - if (err || !user) return unauthorized(res, realm); - req.user = req.remoteUser = user; - next(); - pause.resume(); - }); - // sync - } else { - if (callback(user, pass)) { - req.user = req.remoteUser = user; - next(); - } else { - unauthorized(res, realm); - } - } - } -}; - diff --git a/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js b/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js deleted file mode 100644 index 9f692cd..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/bodyParser.js +++ /dev/null @@ -1,61 +0,0 @@ - -/*! - * Connect - bodyParser - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var multipart = require('./multipart') - , urlencoded = require('./urlencoded') - , json = require('./json'); - -/** - * Body parser: - * - * Parse request bodies, supports _application/json_, - * _application/x-www-form-urlencoded_, and _multipart/form-data_. - * - * This is equivalent to: - * - * app.use(connect.json()); - * app.use(connect.urlencoded()); - * app.use(connect.multipart()); - * - * Examples: - * - * connect() - * .use(connect.bodyParser()) - * .use(function(req, res) { - * res.end('viewing user ' + req.body.user.name); - * }); - * - * $ curl -d 'user[name]=tj' http://local/ - * $ curl -d '{"user":{"name":"tj"}}' -H "Content-Type: application/json" http://local/ - * - * View [json](json.html), [urlencoded](urlencoded.html), and [multipart](multipart.html) for more info. - * - * @param {Object} options - * @return {Function} - * @api public - */ - -exports = module.exports = function bodyParser(options){ - var _urlencoded = urlencoded(options) - , _multipart = multipart(options) - , _json = json(options); - - return function bodyParser(req, res, next) { - _json(req, res, function(err){ - if (err) return next(err); - _urlencoded(req, res, function(err){ - if (err) return next(err); - _multipart(req, res, next); - }); - }); - } -}; \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/lib/middleware/compress.js b/node_modules/express/node_modules/connect/lib/middleware/compress.js deleted file mode 100644 index 2dc6437..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/compress.js +++ /dev/null @@ -1,147 +0,0 @@ -/*! - * Connect - compress - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var zlib = require('zlib'); - -/** - * Supported content-encoding methods. - */ - -exports.methods = { - gzip: zlib.createGzip - , deflate: zlib.createDeflate -}; - -/** - * Default filter function. - */ - -exports.filter = function(req, res){ - return /json|text|javascript/.test(res.getHeader('Content-Type')); -}; - -/** - * Compress: - * - * Compress response data with gzip/deflate. - * - * Filter: - * - * A `filter` callback function may be passed to - * replace the default logic of: - * - * exports.filter = function(req, res){ - * return /json|text|javascript/.test(res.getHeader('Content-Type')); - * }; - * - * Options: - * - * All remaining options are passed to the gzip/deflate - * creation functions. Consult node's docs for additional details. - * - * - `chunkSize` (default: 16*1024) - * - `windowBits` - * - `level`: 0-9 where 0 is no compression, and 9 is slow but best compression - * - `memLevel`: 1-9 low is slower but uses less memory, high is fast but uses more - * - `strategy`: compression strategy - * - * @param {Object} options - * @return {Function} - * @api public - */ - -module.exports = function compress(options) { - options = options || {}; - var names = Object.keys(exports.methods) - , filter = options.filter || exports.filter; - - return function(req, res, next){ - var accept = req.headers['accept-encoding'] - , write = res.write - , end = res.end - , stream - , method; - - // vary - res.setHeader('Vary', 'Accept-Encoding'); - - // proxy - - res.write = function(chunk, encoding){ - if (!this.headerSent) this._implicitHeader(); - return stream - ? stream.write(new Buffer(chunk, encoding)) - : write.call(res, chunk, encoding); - }; - - res.end = function(chunk, encoding){ - if (chunk) this.write(chunk, encoding); - return stream - ? stream.end() - : end.call(res); - }; - - res.on('header', function(){ - var encoding = res.getHeader('Content-Encoding') || 'identity'; - - // already encoded - if ('identity' != encoding) return; - - // default request filter - if (!filter(req, res)) return; - - // SHOULD use identity - if (!accept) return; - - // head - if ('HEAD' == req.method) return; - - // default to gzip - if ('*' == accept.trim()) method = 'gzip'; - - // compression method - if (!method) { - for (var i = 0, len = names.length; i < len; ++i) { - if (~accept.indexOf(names[i])) { - method = names[i]; - break; - } - } - } - - // compression method - if (!method) return; - - // compression stream - stream = exports.methods[method](options); - - // header fields - res.setHeader('Content-Encoding', method); - res.removeHeader('Content-Length'); - - // compression - - stream.on('data', function(chunk){ - write.call(res, chunk); - }); - - stream.on('end', function(){ - end.call(res); - }); - - stream.on('drain', function() { - res.emit('drain'); - }); - }); - - next(); - }; -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/cookieParser.js b/node_modules/express/node_modules/connect/lib/middleware/cookieParser.js deleted file mode 100644 index 5da23f2..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/cookieParser.js +++ /dev/null @@ -1,62 +0,0 @@ - -/*! - * Connect - cookieParser - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('./../utils') - , cookie = require('cookie'); - -/** - * Cookie parser: - * - * Parse _Cookie_ header and populate `req.cookies` - * with an object keyed by the cookie names. Optionally - * you may enabled signed cookie support by passing - * a `secret` string, which assigns `req.secret` so - * it may be used by other middleware. - * - * Examples: - * - * connect() - * .use(connect.cookieParser('optional secret string')) - * .use(function(req, res, next){ - * res.end(JSON.stringify(req.cookies)); - * }) - * - * @param {String} secret - * @return {Function} - * @api public - */ - -module.exports = function cookieParser(secret){ - return function cookieParser(req, res, next) { - if (req.cookies) return next(); - var cookies = req.headers.cookie; - - req.secret = secret; - req.cookies = {}; - req.signedCookies = {}; - - if (cookies) { - try { - req.cookies = cookie.parse(cookies); - if (secret) { - req.signedCookies = utils.parseSignedCookies(req.cookies, secret); - req.signedCookies = utils.parseJSONCookies(req.signedCookies); - } - req.cookies = utils.parseJSONCookies(req.cookies); - } catch (err) { - err.status = 400; - return next(err); - } - } - next(); - }; -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/cookieSession.js b/node_modules/express/node_modules/connect/lib/middleware/cookieSession.js deleted file mode 100644 index 1a23d57..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/cookieSession.js +++ /dev/null @@ -1,115 +0,0 @@ - -/*! - * Connect - cookieSession - * Copyright(c) 2011 Sencha Inc. - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('./../utils') - , Cookie = require('./session/cookie') - , debug = require('debug')('connect:cookieSession') - , signature = require('cookie-signature') - , crc32 = require('buffer-crc32'); - -/** - * Cookie Session: - * - * Cookie session middleware. - * - * var app = connect(); - * app.use(connect.cookieParser()); - * app.use(connect.cookieSession({ secret: 'tobo!', cookie: { maxAge: 60 * 60 * 1000 }})); - * - * Options: - * - * - `key` cookie name defaulting to `connect.sess` - * - `secret` prevents cookie tampering - * - `cookie` session cookie settings, defaulting to `{ path: '/', httpOnly: true, maxAge: null }` - * - `proxy` trust the reverse proxy when setting secure cookies (via "x-forwarded-proto") - * - * Clearing sessions: - * - * To clear the session simply set its value to `null`, - * `cookieSession()` will then respond with a 1970 Set-Cookie. - * - * req.session = null; - * - * @param {Object} options - * @return {Function} - * @api public - */ - -module.exports = function cookieSession(options){ - // TODO: utilize Session/Cookie to unify API - options = options || {}; - var key = options.key || 'connect.sess' - , trustProxy = options.proxy; - - return function cookieSession(req, res, next) { - - // req.secret is for backwards compatibility - var secret = options.secret || req.secret; - if (!secret) throw new Error('`secret` option required for cookie sessions'); - - // default session - req.session = {}; - var cookie = req.session.cookie = new Cookie(options.cookie); - - // pathname mismatch - if (0 != req.originalUrl.indexOf(cookie.path)) return next(); - - // cookieParser secret - if (!options.secret && req.secret) { - req.session = req.signedCookies[key] || {}; - } else { - // TODO: refactor - var rawCookie = req.cookies[key]; - if (rawCookie) { - var unsigned = utils.parseSignedCookie(rawCookie, secret); - if (unsigned) { - var originalHash = crc32.signed(unsigned); - req.session = utils.parseJSONCookie(unsigned) || {}; - } - } - } - - res.on('header', function(){ - // removed - if (!req.session) { - debug('clear session'); - cookie.expires = new Date(0); - res.setHeader('Set-Cookie', cookie.serialize(key, '')); - return; - } - - delete req.session.cookie; - - // check security - var proto = (req.headers['x-forwarded-proto'] || '').toLowerCase() - , tls = req.connection.encrypted || (trustProxy && 'https' == proto) - , secured = cookie.secure && tls; - - // only send secure cookies via https - if (cookie.secure && !secured) return debug('not secured'); - - // serialize - debug('serializing %j', req.session); - var val = 'j:' + JSON.stringify(req.session); - - // compare hashes, no need to set-cookie if unchanged - if (originalHash == crc32.signed(val)) return debug('unmodified session'); - - // set-cookie - val = 's:' + signature.sign(val, secret); - val = cookie.serialize(key, val); - debug('set-cookie %j', cookie); - res.setHeader('Set-Cookie', val); - }); - - next(); - }; -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/csrf.js b/node_modules/express/node_modules/connect/lib/middleware/csrf.js deleted file mode 100644 index 5d5e7c6..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/csrf.js +++ /dev/null @@ -1,73 +0,0 @@ -/*! - * Connect - csrf - * Copyright(c) 2011 Sencha Inc. - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('../utils'); - -/** - * Anti CSRF: - * - * CRSF protection middleware. - * - * By default this middleware generates a token named "_csrf" - * which should be added to requests which mutate - * state, within a hidden form field, query-string etc. This - * token is validated against the visitor's `req.session._csrf` - * property. - * - * The default `value` function checks `req.body` generated - * by the `bodyParser()` middleware, `req.query` generated - * by `query()`, and the "X-CSRF-Token" header field. - * - * This middleware requires session support, thus should be added - * somewhere _below_ `session()` and `cookieParser()`. - * - * Options: - * - * - `value` a function accepting the request, returning the token - * - * @param {Object} options - * @api public - */ - -module.exports = function csrf(options) { - options = options || {}; - var value = options.value || defaultValue; - - return function(req, res, next){ - // generate CSRF token - var token = req.session._csrf || (req.session._csrf = utils.uid(24)); - - // ignore these methods - if ('GET' == req.method || 'HEAD' == req.method || 'OPTIONS' == req.method) return next(); - - // determine value - var val = value(req); - - // check - if (val != token) return next(403); - - next(); - } -}; - -/** - * Default value function, checking the `req.body` - * and `req.query` for the CSRF token. - * - * @param {IncomingMessage} req - * @return {String} - * @api private - */ - -function defaultValue(req) { - return (req.body && req.body._csrf) - || (req.query && req.query._csrf) - || (req.headers['x-csrf-token']); -} diff --git a/node_modules/express/node_modules/connect/lib/middleware/directory.js b/node_modules/express/node_modules/connect/lib/middleware/directory.js deleted file mode 100644 index 8fa008c..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/directory.js +++ /dev/null @@ -1,228 +0,0 @@ - -/*! - * Connect - directory - * Copyright(c) 2011 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -// TODO: icon / style for directories -// TODO: arrow key navigation -// TODO: make icons extensible - -/** - * Module dependencies. - */ - -var fs = require('fs') - , parse = require('url').parse - , path = require('path') - , normalize = path.normalize - , extname = path.extname - , join = path.join; - -/*! - * Icon cache. - */ - -var cache = {}; - -/** - * Directory: - * - * Serve directory listings with the given `root` path. - * - * Options: - * - * - `hidden` display hidden (dot) files. Defaults to false. - * - `icons` display icons. Defaults to false. - * - `filter` Apply this filter function to files. Defaults to false. - * - * @param {String} root - * @param {Object} options - * @return {Function} - * @api public - */ - -exports = module.exports = function directory(root, options){ - options = options || {}; - - // root required - if (!root) throw new Error('directory() root path required'); - var hidden = options.hidden - , icons = options.icons - , filter = options.filter - , root = normalize(root); - - return function directory(req, res, next) { - if ('GET' != req.method && 'HEAD' != req.method) return next(); - - var accept = req.headers.accept || 'text/plain' - , url = parse(req.url) - , dir = decodeURIComponent(url.pathname) - , path = normalize(join(root, dir)) - , originalUrl = parse(req.originalUrl) - , originalDir = decodeURIComponent(originalUrl.pathname) - , showUp = path != root && path != root + '/'; - - // null byte(s), bad request - if (~path.indexOf('\0')) return next(400); - - // malicious path, forbidden - if (0 != path.indexOf(root)) return next(403); - - // check if we have a directory - fs.stat(path, function(err, stat){ - if (err) return 'ENOENT' == err.code - ? next() - : next(err); - - if (!stat.isDirectory()) return next(); - - // fetch files - fs.readdir(path, function(err, files){ - if (err) return next(err); - if (!hidden) files = removeHidden(files); - if (filter) files = files.filter(filter); - files.sort(); - - // content-negotiation - for (var key in exports) { - if (~accept.indexOf(key) || ~accept.indexOf('*/*')) { - exports[key](req, res, files, next, originalDir, showUp, icons); - return; - } - } - - // not acceptable - next(406); - }); - }); - }; -}; - -/** - * Respond with text/html. - */ - -exports.html = function(req, res, files, next, dir, showUp, icons){ - fs.readFile(__dirname + '/../public/directory.html', 'utf8', function(err, str){ - if (err) return next(err); - fs.readFile(__dirname + '/../public/style.css', 'utf8', function(err, style){ - if (err) return next(err); - if (showUp) files.unshift('..'); - str = str - .replace('{style}', style) - .replace('{files}', html(files, dir, icons)) - .replace('{directory}', dir) - .replace('{linked-path}', htmlPath(dir)); - res.setHeader('Content-Type', 'text/html'); - res.setHeader('Content-Length', str.length); - res.end(str); - }); - }); -}; - -/** - * Respond with application/json. - */ - -exports.json = function(req, res, files){ - files = JSON.stringify(files); - res.setHeader('Content-Type', 'application/json'); - res.setHeader('Content-Length', files.length); - res.end(files); -}; - -/** - * Respond with text/plain. - */ - -exports.plain = function(req, res, files){ - files = files.join('\n') + '\n'; - res.setHeader('Content-Type', 'text/plain'); - res.setHeader('Content-Length', files.length); - res.end(files); -}; - -/** - * Map html `dir`, returning a linked path. - */ - -function htmlPath(dir) { - var curr = []; - return dir.split('/').map(function(part){ - curr.push(part); - return '' + part + ''; - }).join(' / '); -} - -/** - * Map html `files`, returning an html unordered list. - */ - -function html(files, dir, useIcons) { - return '
      ' + files.map(function(file){ - var icon = '' - , classes = []; - - if (useIcons && '..' != file) { - icon = icons[extname(file)] || icons.default; - icon = ''; - classes.push('icon'); - } - - return '
    • ' - + icon + file + '
    • '; - - }).join('\n') + '
    '; -} - -/** - * Load and cache the given `icon`. - * - * @param {String} icon - * @return {String} - * @api private - */ - -function load(icon) { - if (cache[icon]) return cache[icon]; - return cache[icon] = fs.readFileSync(__dirname + '/../public/icons/' + icon, 'base64'); -} - -/** - * Filter "hidden" `files`, aka files - * beginning with a `.`. - * - * @param {Array} files - * @return {Array} - * @api private - */ - -function removeHidden(files) { - return files.filter(function(file){ - return '.' != file[0]; - }); -} - -/** - * Icon map. - */ - -var icons = { - '.js': 'page_white_code_red.png' - , '.c': 'page_white_c.png' - , '.h': 'page_white_h.png' - , '.cc': 'page_white_cplusplus.png' - , '.php': 'page_white_php.png' - , '.rb': 'page_white_ruby.png' - , '.cpp': 'page_white_cplusplus.png' - , '.swf': 'page_white_flash.png' - , '.pdf': 'page_white_acrobat.png' - , 'default': 'page_white.png' -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/errorHandler.js b/node_modules/express/node_modules/connect/lib/middleware/errorHandler.js deleted file mode 100644 index 4a84edc..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/errorHandler.js +++ /dev/null @@ -1,86 +0,0 @@ -/*! - * Connect - errorHandler - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('../utils') - , fs = require('fs'); - -// environment - -var env = process.env.NODE_ENV || 'development'; - -/** - * Error handler: - * - * Development error handler, providing stack traces - * and error message responses for requests accepting text, html, - * or json. - * - * Text: - * - * By default, and when _text/plain_ is accepted a simple stack trace - * or error message will be returned. - * - * JSON: - * - * When _application/json_ is accepted, connect will respond with - * an object in the form of `{ "error": error }`. - * - * HTML: - * - * When accepted connect will output a nice html stack trace. - * - * @return {Function} - * @api public - */ - -exports = module.exports = function errorHandler(){ - return function errorHandler(err, req, res, next){ - if (err.status) res.statusCode = err.status; - if (res.statusCode < 400) res.statusCode = 500; - if ('test' != env) console.error(err.stack); - var accept = req.headers.accept || ''; - // html - if (~accept.indexOf('html')) { - fs.readFile(__dirname + '/../public/style.css', 'utf8', function(e, style){ - fs.readFile(__dirname + '/../public/error.html', 'utf8', function(e, html){ - var stack = (err.stack || '') - .split('\n').slice(1) - .map(function(v){ return '
  • ' + v + '
  • '; }).join(''); - html = html - .replace('{style}', style) - .replace('{stack}', stack) - .replace('{title}', exports.title) - .replace('{statusCode}', res.statusCode) - .replace(/\{error\}/g, utils.escape(err.toString())); - res.setHeader('Content-Type', 'text/html; charset=utf-8'); - res.end(html); - }); - }); - // json - } else if (~accept.indexOf('json')) { - var error = { message: err.message, stack: err.stack }; - for (var prop in err) error[prop] = err[prop]; - var json = JSON.stringify({ error: error }); - res.setHeader('Content-Type', 'application/json'); - res.end(json); - // plain text - } else { - res.writeHead(res.statusCode, { 'Content-Type': 'text/plain' }); - res.end(err.stack); - } - }; -}; - -/** - * Template title, framework authors may override this value. - */ - -exports.title = 'Connect'; diff --git a/node_modules/express/node_modules/connect/lib/middleware/favicon.js b/node_modules/express/node_modules/connect/lib/middleware/favicon.js deleted file mode 100644 index c57bf34..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/favicon.js +++ /dev/null @@ -1,81 +0,0 @@ - -/*! - * Connect - favicon - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var fs = require('fs') - , utils = require('../utils'); - -/** - * Favicon: - * - * By default serves the connect favicon, or the favicon - * located by the given `path`. - * - * Options: - * - * - `maxAge` cache-control max-age directive, defaulting to 1 day - * - * Examples: - * - * Serve default favicon: - * - * connect() - * .use(connect.favicon()) - * - * Serve favicon before logging for brevity: - * - * connect() - * .use(connect.favicon()) - * .use(connect.logger('dev')) - * - * Serve custom favicon: - * - * connect() - * .use(connect.favicon('public/favicon.ico)) - * - * @param {String} path - * @param {Object} options - * @return {Function} - * @api public - */ - -module.exports = function favicon(path, options){ - var options = options || {} - , path = path || __dirname + '/../public/favicon.ico' - , maxAge = options.maxAge || 86400000 - , icon; // favicon cache - - return function favicon(req, res, next){ - if ('/favicon.ico' == req.url) { - if (icon) { - res.writeHead(200, icon.headers); - res.end(icon.body); - } else { - fs.readFile(path, function(err, buf){ - if (err) return next(err); - icon = { - headers: { - 'Content-Type': 'image/x-icon' - , 'Content-Length': buf.length - , 'ETag': '"' + utils.md5(buf) + '"' - , 'Cache-Control': 'public, max-age=' + (maxAge / 1000) - }, - body: buf - }; - res.writeHead(200, icon.headers); - res.end(icon.body); - }); - } - } else { - next(); - } - }; -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/json.js b/node_modules/express/node_modules/connect/lib/middleware/json.js deleted file mode 100644 index 200006b..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/json.js +++ /dev/null @@ -1,86 +0,0 @@ - -/*! - * Connect - json - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('../utils') - , _limit = require('./limit'); - -/** - * noop middleware. - */ - -function noop(req, res, next) { - next(); -} - -/** - * JSON: - * - * Parse JSON request bodies, providing the - * parsed object as `req.body`. - * - * Options: - * - * - `strict` when `false` anything `JSON.parse()` accepts will be parsed - * - `reviver` used as the second "reviver" argument for JSON.parse - * - `limit` byte limit disabled by default - * - * @param {Object} options - * @return {Function} - * @api public - */ - -exports = module.exports = function(options){ - var options = options || {} - , strict = options.strict !== false; - - var limit = options.limit - ? _limit(options.limit) - : noop; - - return function json(req, res, next) { - if (req._body) return next(); - req.body = req.body || {}; - - if (!utils.hasBody(req)) return next(); - - // check Content-Type - if ('application/json' != utils.mime(req)) return next(); - - // flag as parsed - req._body = true; - - // parse - limit(req, res, function(err){ - if (err) return next(err); - var buf = ''; - req.setEncoding('utf8'); - req.on('data', function(chunk){ buf += chunk }); - req.on('end', function(){ - var first = buf.trim()[0]; - - if (0 == buf.length) { - return next(400, 'invalid json, empty body'); - } - - if (strict && '{' != first && '[' != first) return next(400, 'invalid json'); - try { - req.body = JSON.parse(buf, options.reviver); - next(); - } catch (err){ - err.body = buf; - err.status = 400; - next(err); - } - }); - }); - } -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/limit.js b/node_modules/express/node_modules/connect/lib/middleware/limit.js deleted file mode 100644 index 614787d..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/limit.js +++ /dev/null @@ -1,55 +0,0 @@ - -/*! - * Connect - limit - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('../utils'); - -/** - * Limit: - * - * Limit request bodies to the given size in `bytes`. - * - * A string representation of the bytesize may also be passed, - * for example "5mb", "200kb", "1gb", etc. - * - * connect() - * .use(connect.limit('5.5mb')) - * .use(handleImageUpload) - * - * @param {Number|String} bytes - * @return {Function} - * @api public - */ - -module.exports = function limit(bytes){ - if ('string' == typeof bytes) bytes = utils.parseBytes(bytes); - if ('number' != typeof bytes) throw new Error('limit() bytes required'); - return function limit(req, res, next){ - var received = 0 - , len = req.headers['content-length'] - ? parseInt(req.headers['content-length'], 10) - : null; - - // self-awareness - if (req._limit) return next(); - req._limit = true; - - // limit by content-length - if (len && len > bytes) return next(413); - - // limit - req.on('data', function(chunk){ - received += chunk.length; - if (received > bytes) req.destroy(); - }); - - next(); - }; -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/logger.js b/node_modules/express/node_modules/connect/lib/middleware/logger.js deleted file mode 100644 index de72244..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/logger.js +++ /dev/null @@ -1,339 +0,0 @@ -/*! - * Connect - logger - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var bytes = require('bytes'); - -/*! - * Log buffer. - */ - -var buf = []; - -/*! - * Default log buffer duration. - */ - -var defaultBufferDuration = 1000; - -/** - * Logger: - * - * Log requests with the given `options` or a `format` string. - * - * Options: - * - * - `format` Format string, see below for tokens - * - `stream` Output stream, defaults to _stdout_ - * - `buffer` Buffer duration, defaults to 1000ms when _true_ - * - `immediate` Write log line on request instead of response (for response times) - * - * Tokens: - * - * - `:req[header]` ex: `:req[Accept]` - * - `:res[header]` ex: `:res[Content-Length]` - * - `:http-version` - * - `:response-time` - * - `:remote-addr` - * - `:date` - * - `:method` - * - `:url` - * - `:referrer` - * - `:user-agent` - * - `:status` - * - * Formats: - * - * Pre-defined formats that ship with connect: - * - * - `default` ':remote-addr - - [:date] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"' - * - `short` ':remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms' - * - `tiny` ':method :url :status :res[content-length] - :response-time ms' - * - `dev` concise output colored by response status for development use - * - * Examples: - * - * connect.logger() // default - * connect.logger('short') - * connect.logger('tiny') - * connect.logger({ immediate: true, format: 'dev' }) - * connect.logger(':method :url - :referrer') - * connect.logger(':req[content-type] -> :res[content-type]') - * connect.logger(function(tokens, req, res){ return 'some format string' }) - * - * Defining Tokens: - * - * To define a token, simply invoke `connect.logger.token()` with the - * name and a callback function. The value returned is then available - * as ":type" in this case. - * - * connect.logger.token('type', function(req, res){ return req.headers['content-type']; }) - * - * Defining Formats: - * - * All default formats are defined this way, however it's public API as well: - * - * connect.logger.format('name', 'string or function') - * - * @param {String|Function|Object} format or options - * @return {Function} - * @api public - */ - -exports = module.exports = function logger(options) { - if ('object' == typeof options) { - options = options || {}; - } else if (options) { - options = { format: options }; - } else { - options = {}; - } - - // output on request instead of response - var immediate = options.immediate; - - // format name - var fmt = exports[options.format] || options.format || exports.default; - - // compile format - if ('function' != typeof fmt) fmt = compile(fmt); - - // options - var stream = options.stream || process.stdout - , buffer = options.buffer; - - // buffering support - if (buffer) { - var realStream = stream - , interval = 'number' == typeof buffer - ? buffer - : defaultBufferDuration; - - // flush interval - setInterval(function(){ - if (buf.length) { - realStream.write(buf.join('')); - buf.length = 0; - } - }, interval); - - // swap the stream - stream = { - write: function(str){ - buf.push(str); - } - }; - } - - return function logger(req, res, next) { - req._startTime = new Date; - - // immediate - if (immediate) { - var line = fmt(exports, req, res); - if (null == line) return; - stream.write(line + '\n'); - // proxy end to output logging - } else { - var end = res.end; - res.end = function(chunk, encoding){ - res.end = end; - res.end(chunk, encoding); - var line = fmt(exports, req, res); - if (null == line) return; - stream.write(line + '\n'); - }; - } - - - next(); - }; -}; - -/** - * Compile `fmt` into a function. - * - * @param {String} fmt - * @return {Function} - * @api private - */ - -function compile(fmt) { - fmt = fmt.replace(/"/g, '\\"'); - var js = ' return "' + fmt.replace(/:([-\w]{2,})(?:\[([^\]]+)\])?/g, function(_, name, arg){ - return '"\n + (tokens["' + name + '"](req, res, "' + arg + '") || "-") + "'; - }) + '";' - return new Function('tokens, req, res', js); -}; - -/** - * Define a token function with the given `name`, - * and callback `fn(req, res)`. - * - * @param {String} name - * @param {Function} fn - * @return {Object} exports for chaining - * @api public - */ - -exports.token = function(name, fn) { - exports[name] = fn; - return this; -}; - -/** - * Define a `fmt` with the given `name`. - * - * @param {String} name - * @param {String|Function} fmt - * @return {Object} exports for chaining - * @api public - */ - -exports.format = function(name, str){ - exports[name] = str; - return this; -}; - -/** - * Default format. - */ - -exports.format('default', ':remote-addr - - [:date] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"'); - -/** - * Short format. - */ - -exports.format('short', ':remote-addr - :method :url HTTP/:http-version :status :res[content-length] - :response-time ms'); - -/** - * Tiny format. - */ - -exports.format('tiny', ':method :url :status :res[content-length] - :response-time ms'); - -/** - * dev (colored) - */ - -exports.format('dev', function(tokens, req, res){ - var status = res.statusCode - , len = parseInt(res.getHeader('Content-Length'), 10) - , color = 32; - - if (status >= 500) color = 31 - else if (status >= 400) color = 33 - else if (status >= 300) color = 36; - - len = isNaN(len) - ? '' - : len = ' - ' + bytes(len); - - return '\033[90m' + req.method - + ' ' + req.originalUrl + ' ' - + '\033[' + color + 'm' + res.statusCode - + ' \033[90m' - + (new Date - req._startTime) - + 'ms' + len - + '\033[0m'; -}); - -/** - * request url - */ - -exports.token('url', function(req){ - return req.originalUrl || req.url; -}); - -/** - * request method - */ - -exports.token('method', function(req){ - return req.method; -}); - -/** - * response time in milliseconds - */ - -exports.token('response-time', function(req){ - return new Date - req._startTime; -}); - -/** - * UTC date - */ - -exports.token('date', function(){ - return new Date().toUTCString(); -}); - -/** - * response status code - */ - -exports.token('status', function(req, res){ - return res.statusCode; -}); - -/** - * normalized referrer - */ - -exports.token('referrer', function(req){ - return req.headers['referer'] || req.headers['referrer']; -}); - -/** - * remote address - */ - -exports.token('remote-addr', function(req){ - if (req.ip) return req.ip; - var sock = req.socket; - if (sock.socket) return sock.socket.remoteAddress; - return sock.remoteAddress; -}); - -/** - * HTTP version - */ - -exports.token('http-version', function(req){ - return req.httpVersionMajor + '.' + req.httpVersionMinor; -}); - -/** - * UA string - */ - -exports.token('user-agent', function(req){ - return req.headers['user-agent']; -}); - -/** - * request header - */ - -exports.token('req', function(req, res, field){ - return req.headers[field.toLowerCase()]; -}); - -/** - * response header - */ - -exports.token('res', function(req, res, field){ - return (res._headers || {})[field.toLowerCase()]; -}); - diff --git a/node_modules/express/node_modules/connect/lib/middleware/methodOverride.js b/node_modules/express/node_modules/connect/lib/middleware/methodOverride.js deleted file mode 100644 index aaf4014..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/methodOverride.js +++ /dev/null @@ -1,40 +0,0 @@ - -/*! - * Connect - methodOverride - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Method Override: - * - * Provides faux HTTP method support. - * - * Pass an optional `key` to use when checking for - * a method override, othewise defaults to _\_method_. - * The original method is available via `req.originalMethod`. - * - * @param {String} key - * @return {Function} - * @api public - */ - -module.exports = function methodOverride(key){ - key = key || "_method"; - return function methodOverride(req, res, next) { - req.originalMethod = req.originalMethod || req.method; - - // req.body - if (req.body && key in req.body) { - req.method = req.body[key].toUpperCase(); - delete req.body[key]; - // check X-HTTP-Method-Override - } else if (req.headers['x-http-method-override']) { - req.method = req.headers['x-http-method-override'].toUpperCase(); - } - - next(); - }; -}; - diff --git a/node_modules/express/node_modules/connect/lib/middleware/multipart.js b/node_modules/express/node_modules/connect/lib/middleware/multipart.js deleted file mode 100644 index 7b26fae..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/multipart.js +++ /dev/null @@ -1,133 +0,0 @@ -/*! - * Connect - multipart - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var formidable = require('formidable') - , _limit = require('./limit') - , utils = require('../utils') - , qs = require('qs'); - -/** - * noop middleware. - */ - -function noop(req, res, next) { - next(); -} - -/** - * Multipart: - * - * Parse multipart/form-data request bodies, - * providing the parsed object as `req.body` - * and `req.files`. - * - * Configuration: - * - * The options passed are merged with [formidable](https://github.com/felixge/node-formidable)'s - * `IncomingForm` object, allowing you to configure the upload directory, - * size limits, etc. For example if you wish to change the upload dir do the following. - * - * app.use(connect.multipart({ uploadDir: path })); - * - * Options: - * - * - `limit` byte limit defaulting to none - * - `defer` defers processing and exposes the Formidable form object as `req.form`. - * `next()` is called without waiting for the form's "end" event. - * This option is useful if you need to bind to the "progress" event, for example. - * - * @param {Object} options - * @return {Function} - * @api public - */ - -exports = module.exports = function(options){ - options = options || {}; - - var limit = options.limit - ? _limit(options.limit) - : noop; - - return function multipart(req, res, next) { - if (req._body) return next(); - req.body = req.body || {}; - req.files = req.files || {}; - - if (!utils.hasBody(req)) return next(); - - // ignore GET - if ('GET' == req.method || 'HEAD' == req.method) return next(); - - // check Content-Type - if ('multipart/form-data' != utils.mime(req)) return next(); - - // flag as parsed - req._body = true; - - // parse - limit(req, res, function(err){ - if (err) return next(err); - - var form = new formidable.IncomingForm - , data = {} - , files = {} - , done; - - Object.keys(options).forEach(function(key){ - form[key] = options[key]; - }); - - function ondata(name, val, data){ - if (Array.isArray(data[name])) { - data[name].push(val); - } else if (data[name]) { - data[name] = [data[name], val]; - } else { - data[name] = val; - } - } - - form.on('field', function(name, val){ - ondata(name, val, data); - }); - - form.on('file', function(name, val){ - ondata(name, val, files); - }); - - form.on('error', function(err){ - if (!options.defer) { - err.status = 400; - next(err); - } - done = true; - }); - - form.on('end', function(){ - if (done) return; - try { - req.body = qs.parse(data); - req.files = qs.parse(files); - if (!options.defer) next(); - } catch (err) { - form.emit('error', err); - } - }); - - form.parse(req); - - if (options.defer) { - req.form = form; - next(); - } - }); - } -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/query.js b/node_modules/express/node_modules/connect/lib/middleware/query.js deleted file mode 100644 index 93fc5d3..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/query.js +++ /dev/null @@ -1,46 +0,0 @@ -/*! - * Connect - query - * Copyright(c) 2011 TJ Holowaychuk - * Copyright(c) 2011 Sencha Inc. - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var qs = require('qs') - , parse = require('../utils').parseUrl; - -/** - * Query: - * - * Automatically parse the query-string when available, - * populating the `req.query` object. - * - * Examples: - * - * connect() - * .use(connect.query()) - * .use(function(req, res){ - * res.end(JSON.stringify(req.query)); - * }); - * - * The `options` passed are provided to qs.parse function. - * - * @param {Object} options - * @return {Function} - * @api public - */ - -module.exports = function query(options){ - return function query(req, res, next){ - if (!req.query) { - req.query = ~req.url.indexOf('?') - ? qs.parse(parse(req).query, options) - : {}; - } - - next(); - }; -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/responseTime.js b/node_modules/express/node_modules/connect/lib/middleware/responseTime.js deleted file mode 100644 index 62abc04..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/responseTime.js +++ /dev/null @@ -1,32 +0,0 @@ - -/*! - * Connect - responseTime - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Reponse time: - * - * Adds the `X-Response-Time` header displaying the response - * duration in milliseconds. - * - * @return {Function} - * @api public - */ - -module.exports = function responseTime(){ - return function(req, res, next){ - var start = new Date; - - if (res._responseTime) return next(); - res._responseTime = true; - - res.on('header', function(){ - var duration = new Date - start; - res.setHeader('X-Response-Time', duration + 'ms'); - }); - - next(); - }; -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/session.js b/node_modules/express/node_modules/connect/lib/middleware/session.js deleted file mode 100644 index f97b8d6..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/session.js +++ /dev/null @@ -1,352 +0,0 @@ - -/*! - * Connect - session - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Session = require('./session/session') - , debug = require('debug')('connect:session') - , MemoryStore = require('./session/memory') - , signature = require('cookie-signature') - , Cookie = require('./session/cookie') - , Store = require('./session/store') - , utils = require('./../utils') - , parse = utils.parseUrl - , crc32 = require('buffer-crc32'); - -// environment - -var env = process.env.NODE_ENV; - -/** - * Expose the middleware. - */ - -exports = module.exports = session; - -/** - * Expose constructors. - */ - -exports.Store = Store; -exports.Cookie = Cookie; -exports.Session = Session; -exports.MemoryStore = MemoryStore; - -/** - * Warning message for `MemoryStore` usage in production. - */ - -var warning = 'Warning: connection.session() MemoryStore is not\n' - + 'designed for a production environment, as it will leak\n' - + 'memory, and will not scale past a single process.'; - -/** - * Session: - * - * Setup session store with the given `options`. - * - * Session data is _not_ saved in the cookie itself, however - * cookies are used, so we must use the [cookieParser()](cookieParser.html) - * middleware _before_ `session()`. - * - * Examples: - * - * connect() - * .use(connect.cookieParser()) - * .use(connect.session({ secret: 'keyboard cat', key: 'sid', cookie: { secure: true }})) - * - * Options: - * - * - `key` cookie name defaulting to `connect.sid` - * - `store` session store instance - * - `secret` session cookie is signed with this secret to prevent tampering - * - `cookie` session cookie settings, defaulting to `{ path: '/', httpOnly: true, maxAge: null }` - * - `proxy` trust the reverse proxy when setting secure cookies (via "x-forwarded-proto") - * - * Cookie option: - * - * By default `cookie.maxAge` is `null`, meaning no "expires" parameter is set - * so the cookie becomes a browser-session cookie. When the user closes the - * browser the cookie (and session) will be removed. - * - * ## req.session - * - * To store or access session data, simply use the request property `req.session`, - * which is (generally) serialized as JSON by the store, so nested objects - * are typically fine. For example below is a user-specific view counter: - * - * connect() - * .use(connect.favicon()) - * .use(connect.cookieParser()) - * .use(connect.session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }})) - * .use(function(req, res, next){ - * var sess = req.session; - * if (sess.views) { - * res.setHeader('Content-Type', 'text/html'); - * res.write('

    views: ' + sess.views + '

    '); - * res.write('

    expires in: ' + (sess.cookie.maxAge / 1000) + 's

    '); - * res.end(); - * sess.views++; - * } else { - * sess.views = 1; - * res.end('welcome to the session demo. refresh!'); - * } - * } - * )).listen(3000); - * - * ## Session#regenerate() - * - * To regenerate the session simply invoke the method, once complete - * a new SID and `Session` instance will be initialized at `req.session`. - * - * req.session.regenerate(function(err){ - * // will have a new session here - * }); - * - * ## Session#destroy() - * - * Destroys the session, removing `req.session`, will be re-generated next request. - * - * req.session.destroy(function(err){ - * // cannot access session here - * }); - * - * ## Session#reload() - * - * Reloads the session data. - * - * req.session.reload(function(err){ - * // session updated - * }); - * - * ## Session#save() - * - * Save the session. - * - * req.session.save(function(err){ - * // session saved - * }); - * - * ## Session#touch() - * - * Updates the `.maxAge` property. Typically this is - * not necessary to call, as the session middleware does this for you. - * - * ## Session#cookie - * - * Each session has a unique cookie object accompany it. This allows - * you to alter the session cookie per visitor. For example we can - * set `req.session.cookie.expires` to `false` to enable the cookie - * to remain for only the duration of the user-agent. - * - * ## Session#maxAge - * - * Alternatively `req.session.cookie.maxAge` will return the time - * remaining in milliseconds, which we may also re-assign a new value - * to adjust the `.expires` property appropriately. The following - * are essentially equivalent - * - * var hour = 3600000; - * req.session.cookie.expires = new Date(Date.now() + hour); - * req.session.cookie.maxAge = hour; - * - * For example when `maxAge` is set to `60000` (one minute), and 30 seconds - * has elapsed it will return `30000` until the current request has completed, - * at which time `req.session.touch()` is called to reset `req.session.maxAge` - * to its original value. - * - * req.session.cookie.maxAge; - * // => 30000 - * - * Session Store Implementation: - * - * Every session store _must_ implement the following methods - * - * - `.get(sid, callback)` - * - `.set(sid, session, callback)` - * - `.destroy(sid, callback)` - * - * Recommended methods include, but are not limited to: - * - * - `.length(callback)` - * - `.clear(callback)` - * - * For an example implementation view the [connect-redis](http://github.com/visionmedia/connect-redis) repo. - * - * @param {Object} options - * @return {Function} - * @api public - */ - -function session(options){ - var options = options || {} - , key = options.key || 'connect.sid' - , store = options.store || new MemoryStore - , cookie = options.cookie || {} - , trustProxy = options.proxy - , storeReady = true; - - // notify user that this store is not - // meant for a production environment - if ('production' == env && store instanceof MemoryStore) { - console.warn(warning); - } - - // generates the new session - store.generate = function(req){ - req.sessionID = utils.uid(24); - req.session = new Session(req); - req.session.cookie = new Cookie(cookie); - }; - - store.on('disconnect', function(){ storeReady = false; }); - store.on('connect', function(){ storeReady = true; }); - - return function session(req, res, next) { - // self-awareness - if (req.session) return next(); - - // Handle connection as if there is no session if - // the store has temporarily disconnected etc - if (!storeReady) return debug('store is disconnected'), next(); - - // pathname mismatch - if (0 != req.originalUrl.indexOf(cookie.path || '/')) return next(); - - // backwards compatibility for signed cookies - // req.secret is passed from the cookie parser middleware - var secret = options.secret || req.secret; - - // ensure secret is available or bail - if (!secret) throw new Error('`secret` option required for sessions'); - - // parse url - var originalHash - , originalId; - - // expose store - req.sessionStore = store; - - // grab the session cookie value and check the signature - var rawCookie = req.cookies[key]; - - // get signedCookies for backwards compat with signed cookies - var unsignedCookie = req.signedCookies[key]; - - if (!unsignedCookie && rawCookie) { - unsignedCookie = utils.parseSignedCookie(rawCookie, secret); - } - - // set-cookie - res.on('header', function(){ - if (!req.session) return; - var cookie = req.session.cookie - , proto = (req.headers['x-forwarded-proto'] || '').toLowerCase() - , tls = req.connection.encrypted || (trustProxy && 'https' == proto) - , secured = cookie.secure && tls - , isNew = unsignedCookie != req.sessionID; - - // only send secure cookies via https - if (cookie.secure && !secured) return debug('not secured'); - - // browser-session length cookie - if (null == cookie.expires) { - if (!isNew) return debug('already set browser-session cookie'); - // compare hashes and ids - } else if (originalHash == hash(req.session) && originalId == req.session.id) { - return debug('unmodified session'); - } - - var val = 's:' + signature.sign(req.sessionID, secret); - val = cookie.serialize(key, val); - debug('set-cookie %s', val); - res.setHeader('Set-Cookie', val); - }); - - // proxy end() to commit the session - var end = res.end; - res.end = function(data, encoding){ - res.end = end; - if (!req.session) return res.end(data, encoding); - debug('saving'); - req.session.resetMaxAge(); - req.session.save(function(){ - debug('saved'); - res.end(data, encoding); - }); - }; - - // generate the session - function generate() { - store.generate(req); - } - - // get the sessionID from the cookie - req.sessionID = unsignedCookie; - - // generate a session if the browser doesn't send a sessionID - if (!req.sessionID) { - debug('no SID sent, generating session'); - generate(); - next(); - return; - } - - // generate the session object - var pause = utils.pause(req); - debug('fetching %s', req.sessionID); - store.get(req.sessionID, function(err, sess){ - // proxy to resume() events - var _next = next; - next = function(err){ - _next(err); - pause.resume(); - }; - - // error handling - if (err) { - debug('error'); - if ('ENOENT' == err.code) { - generate(); - next(); - } else { - next(err); - } - // no session - } else if (!sess) { - debug('no session found'); - generate(); - next(); - // populate req.session - } else { - debug('session found'); - store.createSession(req, sess); - originalId = req.sessionID; - originalHash = hash(sess); - next(); - } - }); - }; -}; - -/** - * Hash the given `sess` object omitting changes - * to `.cookie`. - * - * @param {Object} sess - * @return {String} - * @api private - */ - -function hash(sess) { - return crc32.signed(JSON.stringify(sess, function(key, val){ - if ('cookie' != key) return val; - })); -} diff --git a/node_modules/express/node_modules/connect/lib/middleware/session/cookie.js b/node_modules/express/node_modules/connect/lib/middleware/session/cookie.js deleted file mode 100644 index e8ff862..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/session/cookie.js +++ /dev/null @@ -1,128 +0,0 @@ - -/*! - * Connect - session - Cookie - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('../../utils') - , cookie = require('cookie'); - -/** - * Initialize a new `Cookie` with the given `options`. - * - * @param {IncomingMessage} req - * @param {Object} options - * @api private - */ - -var Cookie = module.exports = function Cookie(options) { - this.path = '/'; - this.maxAge = null; - this.httpOnly = true; - if (options) utils.merge(this, options); - this.originalMaxAge = undefined == this.originalMaxAge - ? this.maxAge - : this.originalMaxAge; -}; - -/*! - * Prototype. - */ - -Cookie.prototype = { - - /** - * Set expires `date`. - * - * @param {Date} date - * @api public - */ - - set expires(date) { - this._expires = date; - this.originalMaxAge = this.maxAge; - }, - - /** - * Get expires `date`. - * - * @return {Date} - * @api public - */ - - get expires() { - return this._expires; - }, - - /** - * Set expires via max-age in `ms`. - * - * @param {Number} ms - * @api public - */ - - set maxAge(ms) { - this.expires = 'number' == typeof ms - ? new Date(Date.now() + ms) - : ms; - }, - - /** - * Get expires max-age in `ms`. - * - * @return {Number} - * @api public - */ - - get maxAge() { - return this.expires instanceof Date - ? this.expires.valueOf() - Date.now() - : this.expires; - }, - - /** - * Return cookie data object. - * - * @return {Object} - * @api private - */ - - get data() { - return { - originalMaxAge: this.originalMaxAge - , expires: this._expires - , secure: this.secure - , httpOnly: this.httpOnly - , domain: this.domain - , path: this.path - } - }, - - /** - * Return a serialized cookie string. - * - * @return {String} - * @api public - */ - - serialize: function(name, val){ - return cookie.serialize(name, val, this.data); - }, - - /** - * Return JSON representation of this cookie. - * - * @return {Object} - * @api private - */ - - toJSON: function(){ - return this.data; - } -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/session/memory.js b/node_modules/express/node_modules/connect/lib/middleware/session/memory.js deleted file mode 100644 index fb93939..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/session/memory.js +++ /dev/null @@ -1,129 +0,0 @@ - -/*! - * Connect - session - MemoryStore - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Store = require('./store'); - -/** - * Initialize a new `MemoryStore`. - * - * @api public - */ - -var MemoryStore = module.exports = function MemoryStore() { - this.sessions = {}; -}; - -/** - * Inherit from `Store.prototype`. - */ - -MemoryStore.prototype.__proto__ = Store.prototype; - -/** - * Attempt to fetch session by the given `sid`. - * - * @param {String} sid - * @param {Function} fn - * @api public - */ - -MemoryStore.prototype.get = function(sid, fn){ - var self = this; - process.nextTick(function(){ - var expires - , sess = self.sessions[sid]; - if (sess) { - sess = JSON.parse(sess); - expires = 'string' == typeof sess.cookie.expires - ? new Date(sess.cookie.expires) - : sess.cookie.expires; - if (!expires || new Date < expires) { - fn(null, sess); - } else { - self.destroy(sid, fn); - } - } else { - fn(); - } - }); -}; - -/** - * Commit the given `sess` object associated with the given `sid`. - * - * @param {String} sid - * @param {Session} sess - * @param {Function} fn - * @api public - */ - -MemoryStore.prototype.set = function(sid, sess, fn){ - var self = this; - process.nextTick(function(){ - self.sessions[sid] = JSON.stringify(sess); - fn && fn(); - }); -}; - -/** - * Destroy the session associated with the given `sid`. - * - * @param {String} sid - * @api public - */ - -MemoryStore.prototype.destroy = function(sid, fn){ - var self = this; - process.nextTick(function(){ - delete self.sessions[sid]; - fn && fn(); - }); -}; - -/** - * Invoke the given callback `fn` with all active sessions. - * - * @param {Function} fn - * @api public - */ - -MemoryStore.prototype.all = function(fn){ - var arr = [] - , keys = Object.keys(this.sessions); - for (var i = 0, len = keys.length; i < len; ++i) { - arr.push(this.sessions[keys[i]]); - } - fn(null, arr); -}; - -/** - * Clear all sessions. - * - * @param {Function} fn - * @api public - */ - -MemoryStore.prototype.clear = function(fn){ - this.sessions = {}; - fn && fn(); -}; - -/** - * Fetch number of sessions. - * - * @param {Function} fn - * @api public - */ - -MemoryStore.prototype.length = function(fn){ - fn(null, Object.keys(this.sessions).length); -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/session/session.js b/node_modules/express/node_modules/connect/lib/middleware/session/session.js deleted file mode 100644 index 0dd4b40..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/session/session.js +++ /dev/null @@ -1,116 +0,0 @@ - -/*! - * Connect - session - Session - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('../../utils'); - -/** - * Create a new `Session` with the given request and `data`. - * - * @param {IncomingRequest} req - * @param {Object} data - * @api private - */ - -var Session = module.exports = function Session(req, data) { - Object.defineProperty(this, 'req', { value: req }); - Object.defineProperty(this, 'id', { value: req.sessionID }); - if ('object' == typeof data) utils.merge(this, data); -}; - -/** - * Update reset `.cookie.maxAge` to prevent - * the cookie from expiring when the - * session is still active. - * - * @return {Session} for chaining - * @api public - */ - -Session.prototype.touch = function(){ - return this.resetMaxAge(); -}; - -/** - * Reset `.maxAge` to `.originalMaxAge`. - * - * @return {Session} for chaining - * @api public - */ - -Session.prototype.resetMaxAge = function(){ - this.cookie.maxAge = this.cookie.originalMaxAge; - return this; -}; - -/** - * Save the session data with optional callback `fn(err)`. - * - * @param {Function} fn - * @return {Session} for chaining - * @api public - */ - -Session.prototype.save = function(fn){ - this.req.sessionStore.set(this.id, this, fn || function(){}); - return this; -}; - -/** - * Re-loads the session data _without_ altering - * the maxAge properties. Invokes the callback `fn(err)`, - * after which time if no exception has occurred the - * `req.session` property will be a new `Session` object, - * although representing the same session. - * - * @param {Function} fn - * @return {Session} for chaining - * @api public - */ - -Session.prototype.reload = function(fn){ - var req = this.req - , store = this.req.sessionStore; - store.get(this.id, function(err, sess){ - if (err) return fn(err); - if (!sess) return fn(new Error('failed to load session')); - store.createSession(req, sess); - fn(); - }); - return this; -}; - -/** - * Destroy `this` session. - * - * @param {Function} fn - * @return {Session} for chaining - * @api public - */ - -Session.prototype.destroy = function(fn){ - delete this.req.session; - this.req.sessionStore.destroy(this.id, fn); - return this; -}; - -/** - * Regenerate this request's session. - * - * @param {Function} fn - * @return {Session} for chaining - * @api public - */ - -Session.prototype.regenerate = function(fn){ - this.req.sessionStore.regenerate(this.req, fn); - return this; -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/session/store.js b/node_modules/express/node_modules/connect/lib/middleware/session/store.js deleted file mode 100644 index 54294cb..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/session/store.js +++ /dev/null @@ -1,84 +0,0 @@ - -/*! - * Connect - session - Store - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter - , Session = require('./session') - , Cookie = require('./cookie'); - -/** - * Initialize abstract `Store`. - * - * @api private - */ - -var Store = module.exports = function Store(options){}; - -/** - * Inherit from `EventEmitter.prototype`. - */ - -Store.prototype.__proto__ = EventEmitter.prototype; - -/** - * Re-generate the given requests's session. - * - * @param {IncomingRequest} req - * @return {Function} fn - * @api public - */ - -Store.prototype.regenerate = function(req, fn){ - var self = this; - this.destroy(req.sessionID, function(err){ - self.generate(req); - fn(err); - }); -}; - -/** - * Load a `Session` instance via the given `sid` - * and invoke the callback `fn(err, sess)`. - * - * @param {String} sid - * @param {Function} fn - * @api public - */ - -Store.prototype.load = function(sid, fn){ - var self = this; - this.get(sid, function(err, sess){ - if (err) return fn(err); - if (!sess) return fn(); - var req = { sessionID: sid, sessionStore: self }; - sess = self.createSession(req, sess); - fn(null, sess); - }); -}; - -/** - * Create session from JSON `sess` data. - * - * @param {IncomingRequest} req - * @param {Object} sess - * @return {Session} - * @api private - */ - -Store.prototype.createSession = function(req, sess){ - var expires = sess.cookie.expires - , orig = sess.cookie.originalMaxAge; - sess.cookie = new Cookie(sess.cookie); - if ('string' == typeof expires) sess.cookie.expires = new Date(expires); - sess.cookie.originalMaxAge = orig; - req.session = new Session(req, sess); - return req.session; -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/static.js b/node_modules/express/node_modules/connect/lib/middleware/static.js deleted file mode 100644 index bb29d07..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/static.js +++ /dev/null @@ -1,94 +0,0 @@ - -/*! - * Connect - static - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var send = require('send') - , utils = require('../utils') - , parse = utils.parseUrl - , url = require('url'); - -/** - * Static: - * - * Static file server with the given `root` path. - * - * Examples: - * - * var oneDay = 86400000; - * - * connect() - * .use(connect.static(__dirname + '/public')) - * - * connect() - * .use(connect.static(__dirname + '/public', { maxAge: oneDay })) - * - * Options: - * - * - `maxAge` Browser cache maxAge in milliseconds. defaults to 0 - * - `hidden` Allow transfer of hidden files. defaults to false - * - `redirect` Redirect to trailing "/" when the pathname is a dir. defaults to true - * - * @param {String} root - * @param {Object} options - * @return {Function} - * @api public - */ - -exports = module.exports = function static(root, options){ - options = options || {}; - - // root required - if (!root) throw new Error('static() root path required'); - - // default redirect - var redirect = false !== options.redirect; - - return function static(req, res, next) { - if ('GET' != req.method && 'HEAD' != req.method) return next(); - var path = parse(req).pathname; - var pause = utils.pause(req); - - function resume() { - next(); - pause.resume(); - } - - function directory() { - if (!redirect) return resume(); - var pathname = url.parse(req.originalUrl).pathname; - res.statusCode = 301; - res.setHeader('Location', pathname + '/'); - res.end('Redirecting to ' + utils.escape(pathname) + '/'); - } - - function error(err) { - if (404 == err.status) return resume(); - next(err); - } - - send(req, path) - .maxage(options.maxAge || 0) - .root(root) - .hidden(options.hidden) - .on('error', error) - .on('directory', directory) - .pipe(res); - }; -}; - -/** - * Expose mime module. - * - * If you wish to extend the mime table use this - * reference to the "mime" module in the npm registry. - */ - -exports.mime = send.mime; diff --git a/node_modules/express/node_modules/connect/lib/middleware/staticCache.js b/node_modules/express/node_modules/connect/lib/middleware/staticCache.js deleted file mode 100644 index 7354a8f..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/staticCache.js +++ /dev/null @@ -1,231 +0,0 @@ - -/*! - * Connect - staticCache - * Copyright(c) 2011 Sencha Inc. - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('../utils') - , Cache = require('../cache') - , fresh = require('fresh'); - -/** - * Static cache: - * - * Enables a memory cache layer on top of - * the `static()` middleware, serving popular - * static files. - * - * By default a maximum of 128 objects are - * held in cache, with a max of 256k each, - * totalling ~32mb. - * - * A Least-Recently-Used (LRU) cache algo - * is implemented through the `Cache` object, - * simply rotating cache objects as they are - * hit. This means that increasingly popular - * objects maintain their positions while - * others get shoved out of the stack and - * garbage collected. - * - * Benchmarks: - * - * static(): 2700 rps - * node-static: 5300 rps - * static() + staticCache(): 7500 rps - * - * Options: - * - * - `maxObjects` max cache objects [128] - * - `maxLength` max cache object length 256kb - * - * @param {Object} options - * @return {Function} - * @api public - */ - -module.exports = function staticCache(options){ - var options = options || {} - , cache = new Cache(options.maxObjects || 128) - , maxlen = options.maxLength || 1024 * 256; - - console.warn('connect.staticCache() is deprecated and will be removed in 3.0'); - console.warn('use varnish or similar reverse proxy caches.'); - - return function staticCache(req, res, next){ - var key = cacheKey(req) - , ranges = req.headers.range - , hasCookies = req.headers.cookie - , hit = cache.get(key); - - // cache static - // TODO: change from staticCache() -> cache() - // and make this work for any request - req.on('static', function(stream){ - var headers = res._headers - , cc = utils.parseCacheControl(headers['cache-control'] || '') - , contentLength = headers['content-length'] - , hit; - - // dont cache set-cookie responses - if (headers['set-cookie']) return hasCookies = true; - - // dont cache when cookies are present - if (hasCookies) return; - - // ignore larger files - if (!contentLength || contentLength > maxlen) return; - - // don't cache partial files - if (headers['content-range']) return; - - // dont cache items we shouldn't be - // TODO: real support for must-revalidate / no-cache - if ( cc['no-cache'] - || cc['no-store'] - || cc['private'] - || cc['must-revalidate']) return; - - // if already in cache then validate - if (hit = cache.get(key)){ - if (headers.etag == hit[0].etag) { - hit[0].date = new Date; - return; - } else { - cache.remove(key); - } - } - - // validation notifiactions don't contain a steam - if (null == stream) return; - - // add the cache object - var arr = []; - - // store the chunks - stream.on('data', function(chunk){ - arr.push(chunk); - }); - - // flag it as complete - stream.on('end', function(){ - var cacheEntry = cache.add(key); - delete headers['x-cache']; // Clean up (TODO: others) - cacheEntry.push(200); - cacheEntry.push(headers); - cacheEntry.push.apply(cacheEntry, arr); - }); - }); - - if (req.method == 'GET' || req.method == 'HEAD') { - if (ranges) { - next(); - } else if (!hasCookies && hit && !mustRevalidate(req, hit)) { - res.setHeader('X-Cache', 'HIT'); - respondFromCache(req, res, hit); - } else { - res.setHeader('X-Cache', 'MISS'); - next(); - } - } else { - next(); - } - } -}; - -/** - * Respond with the provided cached value. - * TODO: Assume 200 code, that's iffy. - * - * @param {Object} req - * @param {Object} res - * @param {Object} cacheEntry - * @return {String} - * @api private - */ - -function respondFromCache(req, res, cacheEntry) { - var status = cacheEntry[0] - , headers = utils.merge({}, cacheEntry[1]) - , content = cacheEntry.slice(2); - - headers.age = (new Date - new Date(headers.date)) / 1000 || 0; - - switch (req.method) { - case 'HEAD': - res.writeHead(status, headers); - res.end(); - break; - case 'GET': - if (utils.conditionalGET(req) && fresh(req.headers, headers)) { - headers['content-length'] = 0; - res.writeHead(304, headers); - res.end(); - } else { - res.writeHead(status, headers); - - function write() { - while (content.length) { - if (false === res.write(content.shift())) { - res.once('drain', write); - return; - } - } - res.end(); - } - - write(); - } - break; - default: - // This should never happen. - res.writeHead(500, ''); - res.end(); - } -} - -/** - * Determine whether or not a cached value must be revalidated. - * - * @param {Object} req - * @param {Object} cacheEntry - * @return {String} - * @api private - */ - -function mustRevalidate(req, cacheEntry) { - var cacheHeaders = cacheEntry[1] - , reqCC = utils.parseCacheControl(req.headers['cache-control'] || '') - , cacheCC = utils.parseCacheControl(cacheHeaders['cache-control'] || '') - , cacheAge = (new Date - new Date(cacheHeaders.date)) / 1000 || 0; - - if ( cacheCC['no-cache'] - || cacheCC['must-revalidate'] - || cacheCC['proxy-revalidate']) return true; - - if (reqCC['no-cache']) return true; - - if (null != reqCC['max-age']) return reqCC['max-age'] < cacheAge; - - if (null != cacheCC['max-age']) return cacheCC['max-age'] < cacheAge; - - return false; -} - -/** - * The key to use in the cache. For now, this is the URL path and query. - * - * 'http://example.com?key=value' -> '/?key=value' - * - * @param {Object} req - * @return {String} - * @api private - */ - -function cacheKey(req) { - return utils.parseUrl(req).path; -} diff --git a/node_modules/express/node_modules/connect/lib/middleware/timeout.js b/node_modules/express/node_modules/connect/lib/middleware/timeout.js deleted file mode 100644 index a6dc087..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/timeout.js +++ /dev/null @@ -1,56 +0,0 @@ - -/*! - * Connect - timeout - * Ported from https://github.com/LearnBoost/connect-timeout - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var debug = require('debug')('connect:timeout'); - -/** - * Timeout: - * - * Times out the request in `ms`, defaulting to `5000`. The - * method `req.clearTimeout()` is added to revert this behaviour - * programmatically within your application's middleware, routes, etc. - * - * The timeout error is passed to `next()` so that you may customize - * the response behaviour. This error has the `.timeout` property as - * well as `.status == 408`. - * - * @param {Number} ms - * @return {Function} - * @api public - */ - -module.exports = function timeout(ms) { - ms = ms || 5000; - - return function(req, res, next) { - var id = setTimeout(function(){ - req.emit('timeout', ms); - }, ms); - - req.on('timeout', function(){ - if (req.headerSent) return debug('response started, cannot timeout'); - var err = new Error('Response timeout'); - err.timeout = ms; - err.status = 503; - next(err); - }); - - req.clearTimeout = function(){ - clearTimeout(id); - }; - - res.on('header', function(){ - clearTimeout(id); - }); - - next(); - }; -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/urlencoded.js b/node_modules/express/node_modules/connect/lib/middleware/urlencoded.js deleted file mode 100644 index cceafc0..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/urlencoded.js +++ /dev/null @@ -1,78 +0,0 @@ - -/*! - * Connect - urlencoded - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var utils = require('../utils') - , _limit = require('./limit') - , qs = require('qs'); - -/** - * noop middleware. - */ - -function noop(req, res, next) { - next(); -} - -/** - * Urlencoded: - * - * Parse x-ww-form-urlencoded request bodies, - * providing the parsed object as `req.body`. - * - * Options: - * - * - `limit` byte limit disabled by default - * - * @param {Object} options - * @return {Function} - * @api public - */ - -exports = module.exports = function(options){ - options = options || {}; - - var limit = options.limit - ? _limit(options.limit) - : noop; - - return function urlencoded(req, res, next) { - if (req._body) return next(); - req.body = req.body || {}; - - if (!utils.hasBody(req)) return next(); - - // check Content-Type - if ('application/x-www-form-urlencoded' != utils.mime(req)) return next(); - - // flag as parsed - req._body = true; - - // parse - limit(req, res, function(err){ - if (err) return next(err); - var buf = ''; - req.setEncoding('utf8'); - req.on('data', function(chunk){ buf += chunk }); - req.on('end', function(){ - try { - req.body = buf.length - ? qs.parse(buf, options) - : {}; - next(); - } catch (err){ - err.body = buf; - next(err); - } - }); - }); - } -}; diff --git a/node_modules/express/node_modules/connect/lib/middleware/vhost.js b/node_modules/express/node_modules/connect/lib/middleware/vhost.js deleted file mode 100644 index 897a9d8..0000000 --- a/node_modules/express/node_modules/connect/lib/middleware/vhost.js +++ /dev/null @@ -1,40 +0,0 @@ - -/*! - * Connect - vhost - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Vhost: - * - * Setup vhost for the given `hostname` and `server`. - * - * connect() - * .use(connect.vhost('foo.com', fooApp)) - * .use(connect.vhost('bar.com', barApp)) - * .use(connect.vhost('*.com', mainApp)) - * - * The `server` may be a Connect server or - * a regular Node `http.Server`. - * - * @param {String} hostname - * @param {Server} server - * @return {Function} - * @api public - */ - -module.exports = function vhost(hostname, server){ - if (!hostname) throw new Error('vhost hostname required'); - if (!server) throw new Error('vhost server required'); - var regexp = new RegExp('^' + hostname.replace(/[*]/g, '(.*?)') + '$', 'i'); - if (server.onvhost) server.onvhost(hostname); - return function vhost(req, res, next){ - if (!req.headers.host) return next(); - var host = req.headers.host.split(':')[0]; - if (!regexp.test(host)) return next(); - if ('function' == typeof server) return server(req, res, next); - server.emit('request', req, res); - }; -}; diff --git a/node_modules/express/node_modules/connect/lib/patch.js b/node_modules/express/node_modules/connect/lib/patch.js deleted file mode 100644 index 7cf0012..0000000 --- a/node_modules/express/node_modules/connect/lib/patch.js +++ /dev/null @@ -1,79 +0,0 @@ - -/*! - * Connect - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var http = require('http') - , res = http.ServerResponse.prototype - , setHeader = res.setHeader - , _renderHeaders = res._renderHeaders - , writeHead = res.writeHead; - -// apply only once - -if (!res._hasConnectPatch) { - - /** - * Provide a public "header sent" flag - * until node does. - * - * @return {Boolean} - * @api public - */ - - res.__defineGetter__('headerSent', function(){ - return this._header; - }); - - /** - * Set header `field` to `val`, special-casing - * the `Set-Cookie` field for multiple support. - * - * @param {String} field - * @param {String} val - * @api public - */ - - res.setHeader = function(field, val){ - var key = field.toLowerCase() - , prev; - - // special-case Set-Cookie - if (this._headers && 'set-cookie' == key) { - if (prev = this.getHeader(field)) { - val = Array.isArray(prev) - ? prev.concat(val) - : [prev, val]; - } - // charset - } else if ('content-type' == key && this.charset) { - val += '; charset=' + this.charset; - } - - return setHeader.call(this, field, val); - }; - - /** - * Proxy to emit "header" event. - */ - - res._renderHeaders = function(){ - if (!this._emittedHeader) this.emit('header'); - this._emittedHeader = true; - return _renderHeaders.call(this); - }; - - res.writeHead = function(){ - if (!this._emittedHeader) this.emit('header'); - this._emittedHeader = true; - return writeHead.apply(this, arguments); - }; - - res._hasConnectPatch = true; -} diff --git a/node_modules/express/node_modules/connect/lib/proto.js b/node_modules/express/node_modules/connect/lib/proto.js deleted file mode 100644 index 889c237..0000000 --- a/node_modules/express/node_modules/connect/lib/proto.js +++ /dev/null @@ -1,239 +0,0 @@ - -/*! - * Connect - HTTPServer - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var http = require('http') - , utils = require('./utils') - , debug = require('debug')('connect:dispatcher'); - -// prototype - -var app = module.exports = {}; - -// environment - -var env = process.env.NODE_ENV || 'development'; - -/** - * Utilize the given middleware `handle` to the given `route`, - * defaulting to _/_. This "route" is the mount-point for the - * middleware, when given a value other than _/_ the middleware - * is only effective when that segment is present in the request's - * pathname. - * - * For example if we were to mount a function at _/admin_, it would - * be invoked on _/admin_, and _/admin/settings_, however it would - * not be invoked for _/_, or _/posts_. - * - * Examples: - * - * var app = connect(); - * app.use(connect.favicon()); - * app.use(connect.logger()); - * app.use(connect.static(__dirname + '/public')); - * - * If we wanted to prefix static files with _/public_, we could - * "mount" the `static()` middleware: - * - * app.use('/public', connect.static(__dirname + '/public')); - * - * This api is chainable, so the following is valid: - * - * connect() - * .use(connect.favicon()) - * .use(connect.logger()) - * .use(connect.static(__dirname + '/public')) - * .listen(3000); - * - * @param {String|Function|Server} route, callback or server - * @param {Function|Server} callback or server - * @return {Server} for chaining - * @api public - */ - -app.use = function(route, fn){ - // default route to '/' - if ('string' != typeof route) { - fn = route; - route = '/'; - } - - // wrap sub-apps - if ('function' == typeof fn.handle) { - var server = fn; - fn.route = route; - fn = function(req, res, next){ - server.handle(req, res, next); - }; - } - - // wrap vanilla http.Servers - if (fn instanceof http.Server) { - fn = fn.listeners('request')[0]; - } - - // strip trailing slash - if ('/' == route[route.length - 1]) { - route = route.slice(0, -1); - } - - // add the middleware - debug('use %s %s', route || '/', fn.name || 'anonymous'); - this.stack.push({ route: route, handle: fn }); - - return this; -}; - -/** - * Handle server requests, punting them down - * the middleware stack. - * - * @api private - */ - -app.handle = function(req, res, out) { - var stack = this.stack - , fqdn = ~req.url.indexOf('://') - , removed = '' - , slashAdded = false - , index = 0; - - function next(err, msg) { - var layer, path, status, c; - - if (slashAdded) { - req.url = req.url.substr(1); - slashAdded = false; - } - - req.url = removed + req.url; - req.originalUrl = req.originalUrl || req.url; - removed = ''; - - // next(status, msg) support - if (typeof err === 'number') { - var status = err; - var name = http.STATUS_CODES[status]; - err = new Error(msg || name); - err.name = name; - err.status = status; - } - - // next callback - layer = stack[index++]; - - // all done - if (!layer || res.headerSent) { - // delegate to parent - if (out) return out(err); - - // unhandled error - if (err) { - // default to 500 - if (res.statusCode < 400) res.statusCode = 500; - debug('default %s', res.statusCode); - - // respect err.status - if (err.status) res.statusCode = err.status; - - // production gets a basic error message - var msg = 'production' == env - ? http.STATUS_CODES[res.statusCode] - : err.stack || err.toString(); - - // log to stderr in a non-test env - if ('test' != env) console.error(err.stack || err.toString()); - if (res.headerSent) return req.socket.destroy(); - res.setHeader('Content-Type', 'text/plain'); - res.setHeader('Content-Length', Buffer.byteLength(msg)); - if ('HEAD' == req.method) return res.end(); - res.end(msg); - } else { - debug('default 404'); - res.statusCode = 404; - res.setHeader('Content-Type', 'text/plain'); - if ('HEAD' == req.method) return res.end(); - res.end('Cannot ' + req.method + ' ' + utils.escape(req.originalUrl)); - } - return; - } - - try { - path = utils.parseUrl(req).pathname; - if (undefined == path) path = '/'; - - // skip this layer if the route doesn't match. - if (0 != path.toLowerCase().indexOf(layer.route.toLowerCase())) return next(err); - - c = path[layer.route.length]; - if (c && '/' != c && '.' != c) return next(err); - - // Call the layer handler - // Trim off the part of the url that matches the route - removed = layer.route; - req.url = req.url.substr(removed.length); - - // Ensure leading slash - if (!fqdn && '/' != req.url[0]) { - req.url = '/' + req.url; - slashAdded = true; - } - - debug('%s', layer.handle.name || 'anonymous'); - var arity = layer.handle.length; - if (err) { - if (arity === 4) { - layer.handle(err, req, res, next); - } else { - next(err); - } - } else if (arity < 4) { - layer.handle(req, res, next); - } else { - next(); - } - } catch (e) { - next(e); - } - } - next(); -}; - -/** - * Listen for connections. - * - * This method takes the same arguments - * as node's `http.Server#listen()`. - * - * HTTP and HTTPS: - * - * If you run your application both as HTTP - * and HTTPS you may wrap them individually, - * since your Connect "server" is really just - * a JavaScript `Function`. - * - * var connect = require('connect') - * , http = require('http') - * , https = require('https'); - * - * var app = connect(); - * - * http.createServer(app).listen(80); - * https.createServer(options, app).listen(443); - * - * @return {http.Server} - * @api public - */ - -app.listen = function(){ - var server = http.createServer(this); - return server.listen.apply(server, arguments); -}; diff --git a/node_modules/express/node_modules/connect/lib/public/directory.html b/node_modules/express/node_modules/connect/lib/public/directory.html deleted file mode 100644 index 2d63704..0000000 --- a/node_modules/express/node_modules/connect/lib/public/directory.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - listing directory {directory} - - - - - -
    -

    {linked-path}

    - {files} -
    - - \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/lib/public/error.html b/node_modules/express/node_modules/connect/lib/public/error.html deleted file mode 100644 index a6d3faf..0000000 --- a/node_modules/express/node_modules/connect/lib/public/error.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - {error} - - - -
    -

    {title}

    -

    {statusCode} {error}

    -
      {stack}
    -
    - - diff --git a/node_modules/express/node_modules/connect/lib/public/favicon.ico b/node_modules/express/node_modules/connect/lib/public/favicon.ico deleted file mode 100644 index 895fc96a76b68b4924f1c51d022e1b82fa0f461f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcmZQzU<5(|0R}M0U}azs1F|%L7$l?s#Ec9aKoZP=&}i&OouUjIY8@C}uZw4x5z5N2 zvEG^C^vXtt_xtJ?p3O32c(KTx;lsgZhW%5M85Sf}k-mf`L80)|7ga~M{a znlL=>m1Q`#uoPkbC~GtXMnhnDh5$DU1D6mx+;2QAKt3ZQFH}H~1y~00GcqzVg9QXw z_<%(a7y$V|wJgF=E>MgE#Aid|14}IyCM5MhEnxFF;pTzOK(>#80puP=gnOXwAd33` mpMe2}f66m3eB@_fcnmb^7!b1nO#opK8zcsj1F30)+jEP);68^d)m`eN0o>(5%D`Q(1;j>g@G;xlf`0VBQ`PFY?6)!N&f?*K}$p; zB!U=NBn{eB8${1}&-2_L*HuZp@ZP1@clS@cHp)4iM1ewzw59vko7eMM{e9z|%NNdX z0V;`?KKSzTCvTm5bc{L^CIKLUxc2X{i{ISz$8Sgf{q)1nXTP{`{s?9mQ$4&hPiKC- zY8q7(Y1Xu5iCf33=O4Vy(+|zQ?rW#gkKB0f%}?+6{G*qT22|DQB-73`YzA{N4W^=s zq0kQYcbtFfz zLz)H<&|z(Y4kBG67=JY6c|L1R-#TR>fC$3^Y%QEnYO1xHsf)+GU`3F<{J0kR(;pbF3)zyg$H+idfnl-wl5Wkh!vUH z4Z32YP=l_}1rZd1W_D&^$A($A+&a0e&P?xx0!ctY2}*<#p+qPVN*B(YzvAWXa*%bzq z7Fz41LKILT(GWohi9|LgIzSZBhb*Zf6R6O}WYQ4GOi&71s9lmll0x6;8&ILOl$j(c z0Z1T(6Tg09{?wd{moFHNN6PS?$|e>1MxSJ(0Z7o2)J-Zv|>acY@f`(Y@g7GwsEj5NLQo+q|HsxQ5}XSX_d@*^A9ZT9=A{W~j+$GyI1 zc4oqTHx@1FlRjw4XWyPN5i2~l_F3@aBk!0yu^aoRDvXy}8@HCjUVQUsuSH4$T5|r< zzZOn^?Wfa6y|Q($Hx4{ws+)wX6-HP4zo!S?4KJ@7PG@G3G{CjXs(p*kIrj6rHs7_y z+=<-=Q62s9FuWa^X~WKgJIAAZJR&XBB002ovPDHLkV1jCMPILeO diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_attach.png b/node_modules/express/node_modules/connect/lib/public/icons/page_attach.png deleted file mode 100644 index 89ee2da0753040d1ba0a3487473a715a8fe89322..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 794 zcmV+#1LgdQP)i_t#ewV_0K6;=bl;e_Jt7$~$sQ)q$+ia<4Ec+jeaGt9oWH@O|2`W6&O0t!k{B9sUvLWxkCaPsd9W(`fa z;j-|^ZI^2XnzhgZWYRW-kP&J>DWPo`%;JaBX}or79k=+Jo@h%4Eo72tqev+cB?PjP zO<|ByL#>Tehyq$jR74O$B9WDW1`tK`LzYyL3A9iAcRxLkJ`I)n}v%Od-3H>j$OTBtk>(k-9o?8PqI=0 zB&f-+KOXVnjyKJlf4iHOtnuiE_4+ZVJ$dHjU<^o^YCjQ-wt^!;rPpBv(@pFO{9rdw98 z_s@3+yta93oyfL>7AD5}r=|`zS3Gm$_|(iSl8XBd9k%=91J0j2=ivT5cJ18ZmDjh{ z$-RMd{jQ#X79#Sc diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_code.png b/node_modules/express/node_modules/connect/lib/public/icons/page_code.png deleted file mode 100644 index f7ea90419d950f9e69d977a1f5847456d96a5f0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 818 zcmV-21I_%2P)@LCln44|RX7Ti z0HI3&7jPq){odH{?_{%nYVq_;n_c4WbUpvU(&Cvnj!vq|kVC-vpF6vp^;;e0mm6HW z+WPzA`AZ|;pPp$&dNjzrc??4rt`k%Q1l*u-BPD0MQ}Fbm8jnsyezNt7+u{23>t7Em zJtETY?ja9KrVs^!LJ$xEMF3-bAZO;-IQJavE60KA7fO$VY_%N)R6s>g5mW>fL4&aR z*EVgKKTBXm!=L?S0?xM zYqL@C$|EDF2q*3zWW7;PDZ}SK*IE8;i!3U62=qn80C&*I1Le7WwNP5EcX;_oh2dJn zf#HgBe4@r$GcjHjmj2vAfT%(YN?}kK=(*+1*DkNNc1H5R++vfBMhACi<5uFUU+N4+ z<&U*CPmWi}REa7C6-t>2im1CWv5Jkefxa6>)dEj-CAW wWa{_}BJ!}~75?MkfaCnj>Dn=~vkLS70Pk`;z)@TQj{pDw07*qoM6N<$f@imYHUIzs diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_copy.png b/node_modules/express/node_modules/connect/lib/public/icons/page_copy.png deleted file mode 100644 index 195dc6d6c365d298e466026b37c1959d96119ea7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmV;I0%-k-P)^@R5;6Z z(>-WZK@^7J_sq=QY_e{46@P+~LNG}sRzZsxQHvCsN*h5ir6^j7pq-$xu$N#V1gx}9 zClV7;5)7zih-s3DB)G=7|99>ji@So7-P24n=VQ(@GctDX!^_@$bj%oviY6e4Dh;od zooe%Wvs8LEKQ&&bL&@bwi=STIAI@!-gB2jC5+?y?VR~VkrNxam-`6*8&po|RZ5LpS zNKdJ%c4bTX`XjKsnecf%W>1%6WT?pKNdLLq{=(f(Col?P1+oq@R>)W(n=x!|*BIIh z6DJGw_w`)u6yN|vAhMteYK5#b%r5^v+VCFl1IGssaclZZMS{vs-LJ2$)n7DAr6==K z<29#%AXsBsDoO}SBaXR#_Ap!JKx)(1)3O2pj0_dYWz5By*X74fRT01$Fk%P_RzOMDtV?GU{nsYq#K8iy zb6qzLYDj`_f5$BwC*WE(t0m#xYJ*=jC2|HQYHh=pf#QG7oowi`h!L!{DB$8|qY{~X zu8@sU1tWq;n$XThR0%;45mdqXM892|{CJ@0DS*}>?ami06Q_^tvM~Y3K(_-`#m!8f z8f!QIrH4y#61;0Ym0cCoLl8{IPombPHtnn7%SbTdI&G-d>ZQo!_wBMF9nzX!g8HVY xYTJPGciz9XMh3w2fmZ(7v{)r*QZD48?mrio{~IaoqP z|1Ep}yDQG09bP~E^Dk?@JiKQJ z6-pO(3~IOP)IYisL6D6;oAEd;E%zR}{U$rMRNuD6nQV7nesKS>)yLo7JuDCrD>Abi zbj3uW23?^GA}9jQ{M^8v?ejL?HaT7AX5WPZNkBmfN`w-jL?{tT7ykZt$%Yln?p_m~ z-?>&d(LD(jAd}h=LPltPQbO$*Wbyl@G-_k5jXbb#qffHY03>M1jfEqoPJQ6Mr=Byp=^jfzePZV1 zLjCmNi31hdIJHa%e;5g=1(`u3BRzfeExY%=VCu{loOr{`%2hUR*x>tL^W_TTaj);0 zpPR6CUD1+0>4TQ6zVfH3TQ;%l6#(_%yspK@3gcmG#Q4!WCPyLU93nMKk7E2pcA=l45({2jNho>sdF*A~bA zxX?-cp~y_z_kFf+yqu3m#QiB}03?Z&9vvR5TNgj<)($Vm)xq5G>|o2sFMag&6aNF+ WAT1?sQBYt20000iHtsh1EzPArg^Q zIZrOk#rNsfjaSbMAL;<4h;Z=jvu8dzyz8N&Nb7=z03ZUw?9z%8KQEa6yM5=kUnka& z3?FJk2}L7q>na=T#;<7U*P91xfF`;`6%pVgWgRy0?1ZryL@%z52=-!fGXWGEn4M351L4<+7eDgwo|moqXT+s1&Kmn>-uQQ8mL7XY)w5Zk*(g+<3Y3tmkR!bL zOUKaUtj_pX26sH+=Iorwu}MGd`_%O-_sS}8VpG#fJA)Fcs#ezwtZf?q?Ac70mDv`rVs{$od?VPKeqf<-kUjNtS6ecB*mq<&M97K^6IVsDO zt2$Ru!b+>2S<}_H>$RcInusU_8PMNdf(W{sNlJ3FkrwMJPeBPO#d}Y^a{9TH(#{Y) l0D?dWAV4eUJX#h`!2gmISk&ZKd4B)^002ovPDHLkV1g&sd|Lnj diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_error.png b/node_modules/express/node_modules/connect/lib/public/icons/page_error.png deleted file mode 100644 index f07f449a44ff2761bfc7b752db3d08d0e1238b02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 793 zcmV+!1LpjRP)lHwhvrAu0-@MQwt}+5~MQTtu}C0%;W( z1<{R?aHBz*g;pk%AyQVBR_Zu5m~;ES_vxI-O!vIF|H*|T{l`n#garr?$RMk>)?Y48 z(ZF2yTneKb};DNWF+jK)IF`6_IfJ{i|F3o%Q+l&4_HGBD|ACE8na_6>L z=s{^>-C(a7J$6=8A_%h5W!1K6dcL!D?XX+Ndk)oei?UundDpX_E&1Y&`)3P8#Ny0s z2Ag7_&ZPhyGj%)g&S6V2LNun1;iBQm#Fwlfv zgyESZR$X}2P;=RW!2zid1r$hBL{K7>2qi*f7>pT1=RdT3@-anEoH{ z={KFOO;Dh#bV*jaN>}M>RZqQd`S=6O9C3KpI~I>l%QFYfo;jqQYe5fcn`)+)zMm6P z4X&L(>gnN0!%J4^rhX->?$S5bY<=GEU%jc!KLL8sww-Eg;h z`H-yBHa)yfojYT}&G*GFc$<(Yja_q=lZvj66DC^O5%$B)|Z(CeD=n`|eM04SP; z>-=-l+xdJjA~vR6^xB#o{ehf~tSM`iwaQv$O<8NIHA}W_WOw*~ XD^gE}t;YAo00000NkvXXu0mjfl6ZQ> diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_excel.png b/node_modules/express/node_modules/connect/lib/public/icons/page_excel.png deleted file mode 100644 index eb6158eb5ca9c4b64c81e70e0fd894dbc8e2bed9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 817 zcmV-11J3-3P)hdKqhFO_H1|Vn1E?(=|cjAh_&P}y{{^`u< zcYD@PK?$)4i~7o9*6F_$F$4lR(d4AAvrez^(88Hk+)+B7E)M3jc=Ewl4$S^`_qwSF zA%qz@=c2EOsz@0qB1IqsqJU)HaG&+}%`-OM8YqW{K85hqj@4&V9vz!Cm_n0-W#f;# zeEpJde%vdgRn5?(+PY=W*z~|lT2-mtown({ll8&3S5+lWz5K}LTRW{k{eJn3Qz!SU zQ`@qI_n2;K?RG~pYJ9=dj-RWgG;P&wEuoAxL~Q)<>x0b=dED^Outj&xQ^rA;u3pw| zca_ClTh_d9cxXg_U!lLRl0`xU@$=UXO|_dRdtXfKwPawmnf(LC7u}-U>8k6}3u|{8 zs9LHr>MIJZGD^r9h|q2yF24Wuh+PM^yMN9GP1$khlDkdyCY}D{kg}jEf-(kW5jBY> z0rB29ZhG-r=i_R{;+1k0?A-sBM;AP6(k1i9ZuixR4?MqXOvphQgCYj~RnXKKL~J9Q zIDNz~XMfO{ZhUg&BTtMyXJqDVqc<x643?SvKHx004lTvR=0a5$dUw z>Xb470000$S;ka1sfH4I-R8njUol7M4dtApOahDylptpYswf1hD#CwFoz6oEA>(SIECU&IQ%a}GXdnC!9$70`0uH1B00000NkvXXu0mjf!8w72 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_find.png b/node_modules/express/node_modules/connect/lib/public/icons/page_find.png deleted file mode 100644 index 2f193889f7ea091c292acdd684c595dcb206b5c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 879 zcmV-#1CacQP)@+1&aazfGU7ezSm^v zpACwO+tu0su66!(dT=`e05DeeCnCFJW(8|RKtKa{4LGONnx2V85A4m%PEQ?MEtR-esdM$pB-`H542D0)N2zSC6Imf)4L8?>%ZrW+H>xCKi$unm zvGZq-*Q%Aahx;C*=l+K%-?>XB)6TB$-L$r*`RUvlA`xP1NG2?)ge8@TQ4EN|Jks0u zcDg;oFC#-#R`YbWB`D?Q`1#y7l$LXhjSLf8AvQuB84}i#j0^!#g{VE#(K7h@5pFHy zSenl=@XBEdxp`h2Ji>CR%=qXJ7!e|?paKet-~;#ok#jETyeB(5&Bkhp;!+;51~G=) zH?L7xmDUu_h+a$+xuWom;AWW!mS$%%+436Rjc@}y?l1134kgD0AOf$OmjOR zstUlshZk$ZC!bAyIg{Y29z#&@3SJ;6D4+_eFume9^#TmMccC5u0J!ZCTnO6m$lnD| z5JeFHf`Xs~1vP>RLKI1GKDY<~pjr2&bi(fX;6Nj-ss@Ds0CcoO0H{JsEQkm{q03skAA);_bv3q{k31qwVo&s-q`Z?_e+j^w(WL? zl+uETs5+~xBU2};OqEE9ETLGwsMGe1%iTRNue)9}|0~E4B*@5#oRXZ9oRXZ9TqRep zPrGZuoOON4n@=uPbyP1y4G=+HktC6l(gZoFD>@_lXDrN?wo+zozGt3P=Qh+3L7+}q z2!WK7geXLnO3Vw;o12Skp%_E#+N#9;DDWP?Q-VS3B$v~Ha)dDzWn0zG~O(^_1!n0HYp-( z+;wPIdoFgQlpYV!10V>5@a)1LyGBMvoa}miyp(bxbMTM-FYNyx;V@TfYddyT00000 LNkvXXu0mjf90!wr diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_go.png b/node_modules/express/node_modules/connect/lib/public/icons/page_go.png deleted file mode 100644 index 80fe1ed0cc75fbb67e9398ae686641f8fb287238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 779 zcmV+m1N8ifP)JNR2Ufr z!Apo%Wf%b9=l#x^8AolrB&K9H?Pg_|78WA8(M3toqE%3B#7*srcF`i*xhupr27%Nr ziguah1+mN)U5GNmyEfQ3-e%_i&-vb-Co#(>FJ+EhQEwjRYVQ(&UYy{U@%vbY||>@4x=B^vIqabI?L* z;-S&DS^V3-ni4^fl|HMkOEbgX)(390>A}|VIypb5Xee4g;7ck zwKh^A3Mi1Mh@eC$5lV!}Fw%sP623U`g3pd_Hr5sunLvTskx4}&Gm%Q6L}(l4x}jCe z*81q1_4-O*ffi~_nMslo?EQ8t*&Ec(pzEw$vc}pKn_Qp0>D7Jr>ATNC3w@9f|Y+U&+)#!t7l&wKp+nP{PQsb+fb=Yf!Fu&5j8vpRj{FT>jD z>d>$sx;A&+`n$HcF}&sYKSyR;=(=9tvvOj@hUG;~4qTYk^_@E=?$*^_pVh_bGnOt~ z;pEw)j{SK$XVc;qy181rT655gW9NG{(yeablViIL>cDI_ux8m>Pp{tY$J0lgo4#ax za?j0EA3s0S!f>{~ykN9h_RhM&g3K(E`q(dE(Rd49+%xMeR9{qlWnmd{s#(SQ>PmFtSQqUjAtB;_Vvt6}AS_5YgM`Uqu`yva+H8^=4U$e4gHb}u zAQ2N{V3A%pO|?Pv?tb6z=jC}SiRa$G^v3q?*6XcYz$p|cq{uLj@#~Fi`J(>5{@&&N zy%T^+;>8cXx%|o77anP?&W1?1A(>-T49z9pyeCl@7YI+Si zKti7=B~``}TImz(G{0PnlQA3P#MAd}sorMjkP!50B7$nAkU^%#nl{Q9lW0@}9fE-> zN(q7tRuiC_T1r|BBtVBTlQ2+70$Rf;eF`Z;lx46Cpu-rEgb)EBKq(b^W8l<^We(`D z43?0=01z<3G6+UUv6`CsWCk6^93!#+<;ws7007{zS3k2k9-zZKFO~(k`>s0y006+1 zgF_jyIhsL-`FMf~JL~C=cV75(CrJ|q;MVO961G=O zm9d)YpJg5g(4i_HKL75eSE}mq$Y}r}hyVdcV~p>6a}oXr80q`oj%+s700000NkvXX Hu0mjfPs|!l diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_key.png b/node_modules/express/node_modules/connect/lib/public/icons/page_key.png deleted file mode 100644 index d6626cb09eb11a298b90a8a27b0d8eab41f49a82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 801 zcmV++1K#|JP)$lC4gU2-`f*>nhR-;k6IP7e>YO!0^w)WK%3$w02v-#>5Ep64PCP| zJihT#O|N+nT7XR2h7dAB?UEAOhJF^mol1i`QtQB`HSY}RE7=r! z)zaVIHr5?>v2Gz&fdYw&2ug$!p+txby(aWZ7(4QT)l2`jX7eMQ{>)lG6ev(fWKxmH zOr%mM5$6B%u~qGtCf40#`mbGj3s!n+^%wnJ&#rl>g<4Z)lB5J6f!?|AP275)Zswr* z%T}4~{;_(?waU!#?JabbF3Cy-kf0{R{z}6$e=5yMQKt3BPcl2>zoTPMqMwF;3!_n|>sT?~bK_-2O_m+o>GJ6h zt=+g$4n7y%1qVJI7*5Yw(hqM=JusY{d}*?U(Oj*gT655eZ>Ksn(qrd7v3}DX1}C>` z+X+8@+4-pVq_fxG zlU}~Ye!0+%>J+pPk+0wV{GM$QaYM?5ux)w2z59=S&H2+K?;gH$bZGzL&g5>G ft+noNiyiPkP9r@8gT|RZ00000NkvXXu0mjfuqTIu diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_lightning.png b/node_modules/express/node_modules/connect/lib/public/icons/page_lightning.png deleted file mode 100644 index 7e568703d6432c530224e443771a04fc1e2e59c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 839 zcmV-N1GxN&P)73{`^;G#xwAtHz%LU)4b zqTRU=ve1RNa3QT=ZM7C`iJ~QFQ*9t7<~pX$d^7W%^M8FFCkcQj-~0ZRTBCB(J0^iD z-~e!d9LR`f3#|=(>$bPvx_D-~2jC%pJ=n_e_OK zeJ_2b-KdDDh@@UlzBSMC;EPygH_MwjWBnPGQegihBV73D?-x9PlHL9A=(Vg=8^d<4 z<9r=UkxuIm)*CO=9e###7PztDxUv}e?$0)rQicmYhV`pQ%S!g@;K(?TVfhM#E?bM| z=B0gfb6h@a8bf5FVT-SV~6}?X}9lK@@Yynoty&1zdZP@?RfODsl=2XzzU% zS8gIN43How+9%bK2S@Xbc`O>`z5`%^;pXGy8^4f>9^3!Sp@|O&)m;dOa3q6d;4P-l zca|=H_{G&m?D_+&-}r{u-J$5T=(X4R&)q|O^gN8cgv;s#@5sEPT5_Z)oFo9Ac>l+I zc4ng5zHpps|9)<_Rw>5bKzE(M1j)dFWI_%OH$BJSz0?T+02W0)_a>#vFqb!*d|5wB zzBUN|M&ty51O@=i?kiDrjQ{{}e|^rU?OS|RdxxP1p5mAw36cX72#`R6UsoeCQFI~! z0ATITp!vfeYyQ?Dr=^5BAshfEa0nB~JG?nUa2Aur006MC*<9`)86SPS(W^`H2n+xi ztOWohsFfVfVWrI7PSKW}BmkyPoj(-|J?ES|BGd-}fIxr{00@ANnO*ZR`#)pee4I5T Rmm>fG002ovPDHLkV1i|Hc$okI diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_link.png b/node_modules/express/node_modules/connect/lib/public/icons/page_link.png deleted file mode 100644 index 312eab0914ab59271384686255d1be913a6b3add..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 830 zcmV-E1Ht@>P)VWgGzD=Y79#JI$lhEn`|2MpRa?Bt#-nSD~P0P(mbVe{KrOBoKnSsk>m|ML{6l zBosu@om4j#WzNLRAk+{k1JRvL(MfE&vvbb->v>W{*z*1_uMP}0cIRX*?mz+wk%*#O z%0D-+$B*g1nRkvI+_3E8Pr1NC6@5M&4vWaLCnNlr;lNlr4i91z&)eBGqL{L{GNu;Fof}GS9{gM5BJuH;2QWk8yuOZdB3pGR#s8bd~ zAmt<>3Q=YH$t5YJ5;7@+8Uh6=ktBgY6#6Pa%2F?h910?U8cLT43KAj$Z1*==ra&gILO{WkHfs(--F=bly9l~${z@AT>V$oat!YAD@M zBE0v_F{`g#^wOSP-u~!wvlmXdd*uqFqoZ0^{&nEMDU+=!>({S0wrQhFmoB}Yq1)~0 z^{A)L8Xjzdr(W4_exYO6u3a{4*kIeXZMJUR>Q=ksjW_p!rAwDKYUs90>6Q|C>56o@ zbrSq^Xk7Gq#>dAsn@un`Hz$?w$;Ss`%jV7L%9ShgHFV~C)6M>B`Tp%|nqPc&G*A3| z)Qe+}vT4-x^t1~XE@(6wR;^lPWMo9n*~E!cy~)YRsT2{`?fqeIw-e7N@mOA%UcCIq z_kH(_EK7|>pM*1Wt2^DaDAp|cvp*@(ZZDKpYkKC^?97(`0sb&XTXy7N#sB~S07*qo IM6N<$f;YmCWB>pF diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_paintbrush.png b/node_modules/express/node_modules/connect/lib/public/icons/page_paintbrush.png deleted file mode 100644 index 246a2f0b426faa0c7f5ba009e32b1deaf88d1288..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 813 zcmV+|1JeA7P)otxGRZMDZ!_a~nK|b_-`n%VosaL{KDuPV10`(1LIen8kX2Xff$3BE zah#djvFGJ&eE^89Pk*-O^+&d>FC~^GjRYVQ(uuPJyS|-v?9lxA-+tM5>1Qu*n+Ir1 z6KhA>X4$XDH6?-|E5oe1E?pQ5-M;2xw_ex!x}I2+b=}mPFW$U%^;o(Zg*LP!K^1kP%8ynsD^= z1y^6xD1#GLjO{VLdh@0GKY7;d$+NGukV)GRLPn^=q=dF%B#XaJrNP`0E6=}e&Gj3d zKJbQre*WXt!60_DnIzgMQc6S#fvjXxsE1v7;T;njHkdy2miIqAS(nX~o%cO+q+b#h z5tIleLWvL=dQE8OC#{%y*Tnku&K`Tuub&_ELI0t_ea{@3f>Jv&sYqld(%}3_GY3Dm z;O{3*Y?v^A`a|D;^qrM=ykI)U6QHd%WhO~VF!SGjGn0GOZrc3mGZudNl9{Q#X5&-F zuGwVReFLBjE5jr!!^-5*L%!I%PkYH#Hs5rMrEBl^)9)9XTD;xjHFxVZMc3~Dw6#k$ z(-S}RE$bgMHv6Z`mS5|u$$78sp4G-8b@lVkl`HtEv+MGn!F&bKcHPi$$oP_;=BrPf z$(~b3&p3CsuQxhoV$%jIR;`lB-s7FDX)xCTXuJ7ZyIQk96uIR=HBt%-P?N*bp`)EF zq14c}QM+O70NTOa@V~_)&GMZ$^cQDlkyOCa(H3Mf+6xhCuZh`VSN{cQBl5Ys9{cp( rh`2H3A^=GuC6HjQ*7|*0>;m{7QlnX3z3MSD00000NkvXXu0mjfR5FYo diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_paste.png b/node_modules/express/node_modules/connect/lib/public/icons/page_paste.png deleted file mode 100644 index 968f073fdddc1cc0f0800b1ac4001cd9a55f053d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 703 zcmV;w0zmzVP)AVs!l4K}n~L(tL`6d4Up4iSWnZ3Qg~4n+_J zDGk-qQdogO5JUtO-d5pRp7Nd7_r1^a|M&Zq%mn9Oe((|e0sw%Ur!K7T1pojj=U#f? zQM`qbQrM^DPkwa?DK_be^~z<~RgSMIa<`xP_4P7gg2jCwJ{9^k!fsU=#Ti|%I3p;>90Qd+7|~0h&mIklA#nb>ATL2+v$&u)OBgB z;nsHb)I&QRKeX40H~~cIZxCd}5C} z=79lXoXK%6YlyLtsV$~bSm?Upq|DJh#{|*a7XMm`4QJWZ>s6nL2R1|&J z0VPEwJ9?!n`o5PKAjc->P1Gi8BY*%!5&FVp=#)$mMJYul1Jton}gujiUf??eOy!x&!tsjxy;=Q3_DdcXx=a^OBhW0N~`A@4xB0a*%F? l+@c^sQA%W+?pa#c`9H5UNfS6T{e=Jk002ovPDHLkV1grvM=byV diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_red.png b/node_modules/express/node_modules/connect/lib/public/icons/page_red.png deleted file mode 100644 index 0b18247da5850f3c2486373a3e179acd2772e8aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 641 zcmV-{0)G98P);68^@7JE5sw#jpE*579S@TLkU(6yap1yN*Zuy>-hV%Q_v4Ar&!63c8OBr(ZRhFu z_kWs36-AmgZCT>x!RqM;Zu9tqvoHI~k@UmYo_g(*J3c%2{N8}7I+|qKPQzv}7t>%W zsu&9G)UmCzkDYSw{fBnuW4j;1fKV_nicw`$8C6D=F_qu`zUiK$2Oc?5UVY+D(`I@R zW`KlwqLftWHH3Z2_XVNfKn>VgT~k=@- z+N>c>0|@A_HbI9Jn`v0~7cfIF(TS69zaomDS1QtgvaBBfGEPLHccO2~3jc>n^6}^HAEh-2#VxC7YYcDXv!L9X= z-R*SOUvIs;n`8(LxP4~^2|JsiN^hq6cU}5dn4v1~Kl{eT7pm&f$PoY`hyVe%y8G*S bxB&kH@RuR86sIAS00000NkvXXu0mjfZBi!% diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_refresh.png b/node_modules/express/node_modules/connect/lib/public/icons/page_refresh.png deleted file mode 100644 index cf347c7d4685128a4a447abb9fb8e939417644f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 858 zcmV-g1Eu_lP)`6pHR2Ufr z!EI=jWf;Km|8+n2IrHqe<9xxFVk)&(Nh?w$Xk`TAyvb=#e=0aySC z00NkRDM597_LiNIJ2M^qhuTvB004REvvU8@of{r?P8tmo3;+Pk0F0@*jAMhdOkS&1 zhJPPfQa;pP0|4+Yk%#j>X}o-s#EF1_DMV93FsfPP`G*>Ks>L&)Q}w2g%slu0kBfW1 z+*$*0BC^oTl6>OGIq(9BgG4|C90Dk-N_mPazGrQ7uHZ|>BLD!-KmZ)z1e^#?1Sf(M z!6m}K(^b|i%$TcA5bC}r$tAA?0C)g1@CgWliJ;NAk&ZF+-w#}$`-3nZ32C6IVKrHp zr+(!L2hRfF&AsTw>_@ z1y23;E%Oz}?q^Q2d($ayO;-sON2t7$w(Z|o0Pw1YnSp^}0PI+I5HnDNsFCA?oorkG z5sUIGIq=FSyxcj+xlhkm0en=52Bx3@02o12gdAU$_i?v6iyFMuc7P9#zQ-Hf; zVuV$t9P5`m)F2w1?t6{<8%wk{w-PP#Sj#%1MbsjrSI6n;D_@8q9`~W98dNQf$j=iI z6~hpgww&be%X_HI50Hhx@W==u4TLPB;ei-J-1}G8wH}|{i#Lk-WZAyfv}k4y0|fvU zZTy^$u6L>2nWo(NDSV2@MRD}JQ4(c%G%=dG@_vxH?>gcH#*Ue2HC}9sapf8X?R$Z;XEnm&g zW99mh)5jNw008mK8)r^`_{yH0rNn%u1|SpC(tjf#om=+r#lh+?Kb>DVb9`|C0Bvbv zN3U(>f4-tAC1hosRoA7p(b(hL*V}(j>ug<`&U)|l$6o$)!>PBQ9RQSwn9asj2p*|xhU*R^vq?*Twb0t!lm5}`yW5lRy-U0ZYK?8to!;o!r!XeOE$ z0HB3T+6EEoI4PlR=wonwqJ+TvCoWh&$?CAPVYcU= zD{DS0?AkOtb@-hh^ZLq~FMjxYf19X?pa_YqtgZGvv2TaxcF#KT?O%=_*a-kW_;N|D zakkWsOe!)HsT5WRBiC+p;N-c>0Qwy(1D2MDBC595oXSiR07)sKNk-%9*rDBOO^HUD zZW#;)R&EZpqha<(HK$(tZYU#V29<@0qCXgU{gXeGpc_|pTqQD-WO|}%yKZbeX7k*H z2W~CK$v8NBAq~czrc5A(v51g0Wma7`G8}f=ZcuAiYYxZan@gP(;Ku66M6?bquGiHe z3Q0ya)%Lvk@kLixZfZyU@#UFbv+>pYhcj8TRKSr_sWG8i^X~UA**LvbD3(_Lba3xm ziYcpup*A9qJ$?AA=Og05lndxfwr`!C+O~h|B~4 z01q8H`StcY);%&mId7_+)76ovRpeNWRp&4M?#jx@|E-)x%P*A6t^fc407*qoM6N<$ Ef@ddc(f|Me diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white.png deleted file mode 100644 index 8b8b1ca0000bc8fa8d0379926736029f8fabe364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-&H;pyTSqH(@-Vl>|&1p(LP>kg~E zYiz5X^`c$+%8#zC{u)yfe-5 zmgid={Z3k(ERKCKrE7DF;=x4^O+ pzO8rLO8p|Ip=x)jHOtWj`bJBmKdh_V<`47(gQu&X%Q~loCIFbEay|e6 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_acrobat.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_acrobat.png deleted file mode 100644 index 8f8095e46fa4965700afe1f9d065d8a37b101676..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 591 zcmV-V0~O9lw>B8WRlD)Gm}Jrz31u-X&&gn2lvjs=i{7nIaL6v2==uw+8Lcs(8j27 z;|c`rmSv@Lx!heopGP^^Ieb3f=R!%Lpp$}iMS-&P3EJ)s48wrJ_Ni0~k|c47D2nj= z{jS6bt|kFpFf|p5cM`_&0Zh|`rfEp0(}=}lT#(6RpzAsUfxv^LSYX>WlAaN$>)*J5 z0#sE+JRUD8iT9*fz{)_^7@6P&!sEjTcD+I9Z4YjT1`wH@fV{cEvneYGFU%maIEU2s55&K(LixD|{p-uiS@?KNj zk-Go8G$hH6g002ovPDHLkV1hVj1#|!a diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_actionscript.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_actionscript.png deleted file mode 100644 index 159b24075191fc259cfd80c797a1b0d74c168422..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 664 zcmV;J0%!e+P)7Z7t2}reCh0o`+ zAlt$F2tW%oO@m<=(B8a-_VgLl#~yUMUDWG!0qFPppd^03e+x1WpkO1NhIaKD2A)-@ z=Py8(Wi%R%JtYZG#sTKH@6Z+&!S3Edf8jFJJNKuva#KJQD3X^7;H^fd2di znEN&c58aUG>`>P{Vqq$kLb+TP{?I!d4(|o59X_%|nVEZq2Rk60n7072SWJ{64CV?3 zgS!EB=eYxwQ>P2&$}(iT6UMvuFgHHIEdNA29!EBtg=v~X!DxxEH~}L2zn|52%xalaq@DTdhh{EVwv0IaQ=!?daer zTKp4I`l8SDt;d{8Q`5Ko;BXUi&oAG1l4}59P-{|^S(Rmord5s6qsh<&m@Ab^wqCD) zHyRD}lKLDzpYN&@q5&*47mGzGiqcXpmqR9#K|CH8kXS4RNs`(iEF%HjP%f8ItyaZK z6$%Apvsok(2>~dTO5jTZfq;N?0ch4l01f$k9?4{~Youl-#x{UDMr#AFIkz@SDwPtQ z$gQ^$2|*(Ps9LQiav_8o8Ne<=Zx1*M*syo80sEO1tB%>5 zfdHB`1z+!R@?ghPRKmL)hWEvZE$=*54ose*0JiUNTM_)cMDXhxEKg(?-pD=y<)L4J zT0dSyD0&NhJ$^_8Ko9uom%-ZM4BTM{Tw$9qyPj=-9W;N(Wi@3*-Q4pq`Gcp}^vvNr zyd&PsmG>fpCSZz?K}UIEd;HGgG%0MG>ymxKPwy{>wy(m*Atq7)0000~7 zMNw2LQirBVQoa8G3P(rY+l;L4iy+JwSqmy$9JlSkk z&*$^Eg+c)@!R|v4gdc8+TTn&eWHO0VD&>$!B%o;;WLf4CNs=Inq9d`xA4otCWHK38 zmc{pkX`0Y=9g3oGK{}lVy~OYL|C5lQ&U^l;wrg|7w=BcA9L4-r411?K7f`@348&rw zXD#uW)DK;H`hxO}u%=@Cj{;#u#_;bb1_KgUOT2Hp6;)MvC6P$vQP3=g1O5#aU%I!K zZ1dc@f}YvG&*Spnplm2rIp^VdA^HydZ0X1axdms2!RKi5x-SFA4p@ zC@N|PI$ryHL@t-(!zBsf2-+sYAukhDHU7Lxm88-p zDk^c;sHj}OKUc4lGZU}6umlGVNAJx0%sKDOFwQx|V2pVvxhYKe|L9TNk!~md3BVrm zYPDL8Hk*yU-ER3~LGwJ7N`0ZV&nOhBI{~~A;@ND*=kxg?#^W&`4u`zk?Mg_e)8XlK z`T#M+OaR1!<#Nf_>$S`xrqd}OjYhoJ>q)?3vEX8pY&I()ERjfjrXM$k7e+-Qs3Ihj zNyOuEQ2EGYG7ro!o6VOBQEwuV2z)*tR8>WxP{616FY)p1Pn1d}#9}cxolZC$4n(6- z35hJq0;FlHC{ zp*iF(lgUK(E`($(s9pJ8Kn?(M734H_63WHtf}6SQQ_MXEP!#0|&@>J8dL5TfG&tBw z#tYn{TCGZvAr>cca%YYn^!t73tg8OOJ2FvJ(`YpCyVZi*?Ur+1uUA$hAg8-aK)c;e zQ<)!XwHh|n&ND=$@^)>aF-`~n}#*WMkD*M|f8r$i*z7+W! qF|A!t*4fE(R`<_YIkN&?Jng?3oQ|aAqClPi0000t>5xmo{nArfL4CJwMMm+N`pQ3p^Le$?rMud6Rbxz!-yG7bz2z$^USP5(;udf(gfQ zG~f68y^)EvcNWp#bUoDt2=h+^%o-?-|mo~iieWqLNP<0m@2PTB7ftyb= z@H`K$>v9Pr5X`L|rw&CEN2(9SB7A2SE;d|j9@*F}sd(@*2l|P*fWfK>1drZUrtUA7 zNXO~pKn1cjf~~TLbje1g>EPPzN2GH#UIBxJ{}S9=E`{zs-w#hO?vcH+hJxroI5v?j zD!4lP0WXq8zUx3RAP@|Gq$}6wXCjFLZY^YSWBxN9#&g)ro$%5}aYn#y=tJ_aIT%4d z5d4u`rlp!};XGmbZkJE*kYJoi&N0pd*yxY{0${xD;;Q1h^8f$<07*qoM6N<$f(}t7 Ae*gdg diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_code.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_code.png deleted file mode 100644 index 0c76bd1297751b66230f74719504b2adb02b1615..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 603 zcmV-h0;K(kP)^~*-1fljz_B$LUvK}k?BNXe#Y!m=zM!!V#}8bncK5m;8VP zw86G*RI63?Cd%b9bX|ueNlZ|wR6rj|r_)VIP@r2imh3?SN+^{|kY%~8B{maJ@F*OK z&VH9LwOeGt#DRjj0~v~8`>iO7!Ybi;zE$va`A^T#yW`y44;k^#O~K5*jD=qcUhPSc zvyy~q;5H_1WT1l~cqje9yfa+l!hu6xjdOJ8s;8E^+=QQ$tw p?%p!Hy#YapB=@+^9(46X{{RQg%9y;OKjr`c002ovPDHLkV1g7l326WT diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_code_red.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_code_red.png deleted file mode 100644 index 87a69145075afd8f8fd8b391c5da1249ec8b2889..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 587 zcmV-R0<`^!P)LWh{^|hy<@Q*xw+qo|KpY<+vaXbbW{L4q( zTsjXEJvb}e%bgb=o%W0h?4u1;^bWTqH8}5Th002ovPDHLkV1nrS0P+9; diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_coldfusion.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_coldfusion.png deleted file mode 100644 index c66011fb0fbdcbf210483d676b7131542a0e282b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 592 zcmV-W0k7R5;6x zlV4BMP#DI+Z{WQcKZBTk0lfkj5F$ztWhP#lcuyb@0@rA^#Kpu5KLA&Rgc}o#aSmis zrZC__xY^&#cI&!!{c|4Q_tcec*#b>|Y15wPcY2=o3;-Bl=(t4;6Ok*pL)-{*A;GX^ zS(@WGp6j~k1wBVR9)BB_gar`}HyRBXh7nM!)u5^>N~MyN6bc0-5{W?44iB<`2biXb zR;wk?jIQg@G!5l)SqhrXCU}x$GU-dY1sra}0uCq@153FUULT=jNwSk}0WBjKz}Jdu z<5gB*<^XtpAmp3m^ZEXQZWd1krhft}CoYaF4cSMvTJ01}X3X37KYdx-D0$c{doUe8 ztY{vlGr-e*;N!WAV%_hgUawyYrhegW>^F)pv%uUTFslHn; zvJ)l{%w(~{!O4`KTmK{Q{zCYltLfs&4?nz|6IdlqHCvX;|HGv~!QW?8P~_d#e0$v$ z)5XHEz{3>qMiH`1+qNYf?huS+@L`J9_$cjJF)Hf?@pu;)`9}BXwGUM{2!{y-4|Z{L zG>z?O%Cp8P5T#j1DID7u_*(Jg?7iss8AZQ+&;u_J{FmILf((9eoiL5nGUe>Fgq*U$z0000 zJ3A|*qoWOonz+4ZQ0KNhDB07SX1?#FrNy8%K)_l}y&kh`*KYdy`Y99&tgNgMLSSrc z?B?+B@HO@P-jS~z2Rgc6yy~Y~%>oJpBxsb$5<&nRLqiuR7K=@0SZj~jTs|sv_jWVX zGe?WflejOaq|Vec=s9+ahmXbyJ|T)Sl*?s82sr2H?Ce~HD5WI+Sz&tmWrN()wI2}+ zKqg92t*l^-#ae~;9%KFlWkmwnY=-UK`_|%ICZ#P1gdjK<2n38VXsuC7{WiU!fZFmm zW~Sda9(Qi@pxO}$ARY+;t##Ao27usOqNt7Hwq6K7G1il@xitj=LIM&{N&#SuX;x4x zmG6FhCg-$PI;hQ=;1iZ>F>^~@)IPi;l}fX?SZ!QiO=X<|pSVkNpJuLHzW(FT_~W-v z?vFpkyE>8ee4d=7wKauH5~dd_M7d2Aa=ICC{Nj7Blqv&DQEP#j_VeWV&WXL>c=LLK zsmYg^_JiDb;%U!UxO%qjFAvsDFj-kzT2$GbV(ZopPM$i$z`!7jvEk07BcC=6FMt4` z*0u3Sy`0b~%#(0000K diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_copy.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_copy.png deleted file mode 100644 index a9f31a278e17993d8d4e13beac2f9d5f7b42d08f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmV-50m}Y~P)sF~CC`eaI+m%Y8jfzomMvZQaNUIT3LIrJ$h)_W{ zwF|LDNlB-g`Hb_G$;>3F$9JF3WYR|3fy2C+_wH}*xp!_4fF2UN4lt#d26oXwru}hT z0+0%Vz-l&|Tdh_L-Ng1G2*RBtBncRx;99K)&+}s0whhxXp{go}$g&Jk6k|vfypI5M z!1sNGVaV?!*L7i87Bo%cfO@?S`bajL{R<($@$|PtgBRcCGIJ_2a|&kO>G-s2aR3E4 zjssoScUa;zIdOeGHBnH13G)W-zt$kUQgNfG;96b=v&4NzRt&@7nN%v3HsG`<<+F$cumMs448N!W3r&2Z*b~D5^$^d6Jxn@SFK5Q8*uKSR7x{I|H-_N1f+AD zSYC5@2K4OKL$==F9U@CH;ONNL(W}oZICHn;d?~pw?GRIsH*x-68Oy6SuK`)`{E)46 z9^3(-HXa#X89SBv?u_YP)WjsQrp;}0X?Bxrvf12IKW8>3t`e~W9|JS<{btTNbNT@EQIWBSNJTX8AMGXD z-SsH|s#>j9Xf~VMtyT-YMD}5^SWHTY5->o`k|d#AE_YQd79j`%GMS7FNvG3b7^Vy9 zn0HYCJy5MyQLoqKnW|JOp-?D*<2V^msZ>BOv0ANd2n7t@{=V;sZrQ>3c})5_%ms4z z7!qXwHHe~!QFj8aR~&*-3F?O|;#(ESIXP~Os%|~y^7c15*q5`gz2-5ol!fU92NIGT z_ves+>+Tf3gfcL?!nimYmR}cw*|BGULzI^7!;k#3K^YO#;!+vM@N~(99+<;fdqr zYPJm+pXYFYk;neQyXXEcTQDNQx57i`Okp9A#n?<7!{#tnKJdsF>utb@JH7dU01gfL zEK2hoPZAnO5+je3&^i*hWM`qCW^vLK!O*?U-#IvXV?#6koWqrwnD{j&K`7N>^tR3G z8zr1(qVOzcF#nF1&0MZ5C$l8*E^Uth0000zE0Ay_3@1Z_7#f-XWL#E{8Al7>L$ z0Rx7lnddoqAyfT%&#`$;v0@*5YdW3w z7mLNoa=FAshK% zDiy@zakyMAxr-H?iQDZi^!t5;Eno2A=?>mMx`Vg(Z!?<53LHLvfTPa`$mjDcX*Qdv zR;ylN4OH+m)fVX&Z#yZpUae;ss@a$K&})gHovkhr@w#xyPVlfVgXti1_357y%I-UHDvRWYvPEX+#g+j4Q9ayba zh7uQN1j%HQgA=Fp9DfODAU^*3*FCs^6IpO7xg`RUXyP)(;=d!ly=#I^l3e0Cub`{H Z`5PU3+D2e&<<>s`J(VpX#y^kqzQ;#=2x({YMw9Q&ndHT&`BD$#%Ql?{+)-OuSA`r}MWJ zVg+2Gc(GW}a=BERPNy^;kEz$|38dTYlFQ{%5S!g@|8f8D_!Nu9_Ni2glF1}xG8xi! zorc39&F6EPOeWOt_XS`W2H_Bo$MXugy}SEctJQj=(TLXTHL(jRXfzs>NF=0SHk;94 zF!&HjdZNX(3U3;LY64IMX__Xv%_wjLC!J2`0Jw?X=zPK$C$`&dYPDKaC={e16bcE@ zgun^<0k;ak*=xLE)@(Lqu~MmsFoMCLY&0Qog`NO(h@kyxaA%EbwJLy8sU*Vi`~52K zX0wrqW;_LmMq@evX4iAM9Od(Q0eHP$1%L|xAh@vrqB`HPQLon}f3aAka=9!3hr=O- z5F9`#J_7Jhah=U(4RjaRhkS4Xkk98kDz-`i!r|~~AQ1TFcDw(@<8g{aBE)l)PNxNE zI(RPyc>9e{@WGSMU%i7*v{!&P$WLz25)0oc=Dl-yy%xYZAm4b-rttL7UjR#%`#j_F R;_m(?iiXTHIMmcoLoO94I8;j@ zv^2DJ5#orqydFJX|Gm$_Bi_vyew+j6{r}$Qc@D1%fQqeAhJj)1!z4pP83k2MV2~s! zSt^w(<#HLFVBg_#xz1W8ioi(WY&Hu~6zil?DI^jJgu`K35(hkP)H%@Imesbg#5!Ps_$Ni*SiR8&sKb9?M`0-mH)gtg&YgRX#*TXz@Z+| z;|2H@xzE0TfuORhuO2k6#K8#sW^J`mQ0+E@$K`QkFV+DTlI$w{GJ;zid{*v9xeIe_ z$|Bp`@iKkgoFK3{4Z)#DWKV~W4K@5WZN+Ql_7%YxNqSx7%cWud&cX>)_PvD*UzxZg a%Kia9Rjz_59@~-t0000)l$0ECbfb-0$}>7z|u>IvuoHEmW&j4lzv=KA+EpIObc7e7{sGA)QVmnM@*^ z%|h38^m;wC+ilpk%>l#V5LCqP_y2_Cayd^XlX;j*r54R*lW!zbqtSpQNyz8(JVmWm zyV4S$2{Uhyc{Cb0QQbf{ZGT{Kr zvJi{K_&f+q^Pv4MK$hhS4TgFj_FD*rLOePdE-E^T7ZzTFCRUB`*?9&h(a#C!-v8lWG#k3AOJQaUey6Oasked^kDPe=Khg@7s584 zg`XfS1)&u*_c;I76#%`kkBfiZgKKo@0)9d6vZw=ExQUtV?eW{Y1Xv}=4X(2zy85d> Y0C^(qLv?Ui{{R3007*qoM6N<$f-gW7od5s; diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_edit.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_edit.png deleted file mode 100644 index b93e77600def75c9a144d3d0a5088a62c02cbb0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmV-w0+s!VP)$>5Y&axjp2O=VLu>*f>1L;s0)kkvKC!*u?s6CVL=HJ6oP~pNfZc; zsKr=bq;7MITw8NXw{SZm%59TId2x_9BQ zV86`NuvGI!>o^V!Na!=$7GJE{Cq`b+XwknM{UcGHFTTfmuS+ zm-zYC!P3+zmY;SG$?!fYkOih`QYaLxyF}A86h$GGN}kFj)_o*0e zjPMP%zTG7FYMAfO2Nn1D`D0Cj?Wl>5q%@CE10nX)KxpNmwk+!IWkzywiYD( zqUXiYYIq3qcRyMGJ;IY`(Gz~E$J$zu2+R{)xGlE*88b3WK6V*J>}2iPY1HH|tER0W z_+^^FdppY?o)Gt5M2`%xwRDH@R3G}^i1l4|6uchm0X0f!@&YdVLB5K&dd7Rv{)DXX zt^&vP;}kqj3f>94j+4xd93>s|Q!Ezi>?r8(Il$P}PFxSqu{d*!Y%*#cX(R0f|Juz# z3o0_xI14Al->1uky@W-rCI_%l&>PK^TXNSN{byMk2AI5vbwp!K-%-@!-vPR3iikL1L7HA!^!~ChCFU#lnGzp88=I z67V8PHBo4(l$u?-AKmT8?#_0rKW9dUNRbpLc`}piywAM9$xZ-3fR1C75T(BjCn-l* zjUcci2oXXo-}iqun@#)+`W@kL_-U&|2>MxZy~3IdmRm&8b)9!2%ksg3R)nNnT*TJOC=6{2hG86Dz+<^p6qfG5$i^UNUh+u)CD7O2 zK>Ioazn;U|+X0x$=feveYZL1W*Fm%e5P1sajd#eW#^5(ddx76*pt$^)b}$Q4oPabL zLc^HF>Z{8za;f$LtN0P$6C?1{X*jtXkRJ8IEeyiSzencvH3Ux_y>y^}wfJrRCQN#9 z?&e+C>sSAfrE%mZD5RfZ`gSndD)=P?+nG5Oq$zmY&-v+gc7R6c0u8^Ke#|XOq?gF@othF3zFpM8Il<8BJrWqBtF>b#_ye4{0)Xbu6j&@UIhRE002ov JPDHLkV1nWI9dZBw diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_excel.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_excel.png deleted file mode 100644 index b977d7e52e2446ea01201c5c7209ac3a05f12c9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmV;I0%-k-P)^@R5;6x zlTS!gQ5431_q{u#M2 zg&W%y6a}>qj1Z|7Vu&-DW6d~k-n;jnHsjb-q#u0C^W!_5^C=MlKq<8oNCQ6qS00!X z5eI;XP=g!^f}j{hku}E1zZ?XCjE;`p19k(Rh%^AQQ54xysU+ocx$c#f61Z4HnT#3u~FR(3>BnZniMIF4DouI8Hi4u>cAK%EN)5PO(ip3(% zIgBx+QYirR){Z8QwV$9Z(Mpt=L-Or3#bf-G@66}txq0yc*T(zNTBDT0T8rO^JeNbSI-Tzf5!pBioy4NwAN^?iN#{;fH1Jke4Xa`^fR8m z%h6dq%xX)S?7`zae))(Xst^Scp6B8FejQW?RLTM8@0=vnnntuRGBM2dpo>gbCnTD= z^<;=JuqdSf@O>Z8^XdR?s+KEfhDdB_#ahFj^giCtzT(s8kA$AViyTqaAR;KGaLzUU z<=GqA4bRwpX|IG~*x>pZ!@zLr`XQ`od>m(`;jz|M_*1GDO#$7;n74ppb8=eiqh760 x0yt}J1#p`gw$`o!R{d7zU9~!Un@nJV{4bstt4Au+Up@c;002ovPDHLkV1kWhGjjj{ diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_find.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_find.png deleted file mode 100644 index 581843637079359a6a58fcdccf0763690c67b063..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 676 zcmV;V0$crwP)_k3`4d{s8lK_6bi^@vq&To98fNoK}7)fx$e2^Y&@<^jR_Ee+8}KG;X`@ z@bCyiolqX>bb1ZIs%QGnjzFU~L8H~d?e;*XP(h(S262}XyZ3a0h07r{KV?E70l+e- zE`%3x|M5#q+;HOC(h@A^M)7Rn13dm0&>K$j%k_F4wOWlsNCIH+!c_#{eS&TL8v4yc zcpnPEY`cQzZ$ILq{U-MA6Z6Z|1p!FZjQ}tXSb25J@HphEqX-6Hqo?-_Zn@{d#>2Ml zJGhxTAd&emK$lV-QK&VM&ix0Xy{GyS3Wp(+E1^8BhD3T0a)m-Lw@Lu4zQRrP)9(3F z^>$hh@N>OAXrmPYunLi|fJ$_*5i`46;M>~*5D{bp>-OL3{+!MJa`3kv~Q#QfQ%c z)1s}QE<_XaYBG;IuRF=td#+}fi4h(6HgoUyJLi0t(*dA^B)%@8kkG&bdM5P5^Z5WF z%d%>m^SbN0XeV)wbUOXn5Ag#A$gJx+7-OCkMM1S%MWIlTkbFLmOeW(&n&wUd&;`>p zVcRy$Z{K0=?SpNnP^;BYEEXleFbq(UY&LrXX$6qkJ~)8+b{=jj3HEXds;Z(?D%}}L zX3`39&dy=Zyar!ehA}e>w)(*vrCct{PI9^2Jpj&OZS8<3-@{0(gNv%1{)zAiLY+_^ zl}e>Ofd4&#Irj#7>=o=Uhv5IJ@?sN0^J|(WL2Uun$4}si6}TG-s3T#p&6GE<<2W)O zf{^Y2HlO#*QDvTp3v&d@;8*}aUC4lisG9(w7@d5Y8y)}U#FwCkqp*Mcgme4{&gGRf zlBfd`nF9cQBKB2_L{F8G2)7pAf$i)Ds`|}-c>pc^LRW{w4SQ)3N^BbZx)6BlCZts! zKph%`(m#xg-q3I7=(us;9<)*2%iuQ1J`oV3gU6V~T}^JU5714JN33&GwEEru0d}Uo U{MPL+lmGw#07*qoM6N<$f^vibe*gdg diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_freehand.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_freehand.png deleted file mode 100644 index 8d719df5205f7415ce657e5c277db4533c82f346..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 639 zcmV-_0)YLAP)p{{sC7)XB-g4w*W1a1)XtvxrMYa1o?wn&v~3 zHnC|#(>B_M1d`_7gfzLiHy=0c<2kQQdXu*33(xYN_xYW39(cz9jEVT%VokB8|DoF~ z8u%Q5sdl@4VB7X#uh+v_;yOGY&pRi?378ghv)P1cngiAAb<}D#l*?rWDV0j_dc6Zk z-|P~AJZQCA=yWcQjG8fYnimzj*3KqTfN0Cy!G^$7)+bQ$+mHVd1J zvwOR^5Lm<|R+uyB1Nu4vL?d4qa3tn?9H7SZH@~u=fFHEDfSH|bHU6kh0O3%cLdyny z{`9S2Sw~WMy0MPy!64i`jdk4Z3>^+KIL_fN2V_d&ywBt`^IJpxUI$=YAph~5`;xCe Z{s%Y0vkUXDnO6V+002ovPDHLkV1loX8z=w( diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_gear.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_gear.png deleted file mode 100644 index 106f5aa3611a4807ec8c21701c631730275089a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 402 zcmV;D0d4+?P)<@FR}JvtGRKa0_WfK^c7uXaFH3q@Y!Hnl8VySc`OtkPN3;#l*y*l23+99h*9JzA00}rAC!#M1dZ#v9YOBH|eC*${MmzzYjBu!!-< zK8tujf&(6i)1biy*F>4{f*Kd(IU-JsG&#b_@NgTnx@40)2@2%c;*=?-2Za=}O}7&( w%_K#(S>e1j&gfY?mR})n>>0+8p`iTe2d1K2h8#$+)&Kwi07*qoM6N<$f(2cptN;K2 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_get.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_get.png deleted file mode 100644 index e4a1ecba1b60e54f3777717ed105cdde745b7184..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 516 zcmV+f0{i`mP)o)wchR-92qq~y6`XqbKmElbB3z{pkZs0VPF`CFvS?7jDn^mFo>d9Y&06* z&1MsS!M-CH3ee+h_sy)Ms%B*ec3R0RpVi9?*mU84yoq(Bw8 z<4(999dJJE!V%pWT~HGRIAb;(#O%2K3?uRpz}AfgE8e9q&OSdr^e^}lC$QXZz;S2A z)w>^oHy>?v)q--`!pmuBe96PxP0u*inQvyFW(llfv9 zXV1s*Jh`y2H%B3ZTA(AzpsQ?hb6_PyZ=c1?_B4fbl>G%!@ubJln=!)x0000#DY{xaiib^#X=YT4@yE_&2#eBulEdzjE`u&@G%2(&u{J-<}d(^uY4W_kMfEX z@!X)AR9F&FL?RJyJRUzvBoeqN{5kY`z3wcM0+du73~_0|*lac! z42Dw(Eg1o{Ash}P8jXrqN+1w`*XxDD;ShmPCZC7#4;wWbHoMvBl$=zF-`?*9j*Nbjd=v@OWt_BgKxP-3wd zy37?ATx&$b+&zRM!K;BD%Okw`Sb@&Pak8$KRX19jWZmC0&n*Ggv%j8nvSPDFw zEkV65AGOoBQ8kf`R|}Px*&INNS%osq9b{Fq2I(x6@xM>tg=vRLF?I`0rWzHyRc>}g~)F_Qn`A>)C_iwK%Z zrIJ;xR)UI1Y4Ozts|-Nho;q zVk9-bX)%F~!;63iu$Fk=VJn3~fmb5S@@)ZqjBT2{f`vT`b2}zxb0$o;EF@G3&BHK^ zc)`1kUzo^Qkk$?KFKHNBD?nP-MJ3b@&4fg;g5l2wMi^g?9qj+~@b;62o_U1_S1J`g z7m^UMg25FX1MJ5AQxAJ5F5WDt=$=-@JV-!LHA2vuxl9kN>PS8x??^AINH6LjF*#nbk4}=n3gfWp$kEX5IpHS zYiQ{@d7Nl&d$#+7-TckP&Q}N91e-C#5QQ<|d}62BjvZR2H60wE-&H<>}%WqH(_V;zPbB1rgSSSC(0? zWlQ#?N3UgnJ9m2C29w!SwoOo5_2Iq!<8vCyEoDoj@#oV($oJEg6Bj@;nD|2g8 s%L|>IZ381yx9RvPhV4J)*SeoEV4lyr#k*`nfWBbxboFyt=akR{0DpOPi2wiq diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_key.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_key.png deleted file mode 100644 index d61648452284da1bc28b10385f95b5d2bf027901..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 616 zcmV-u0+;=XP)-tZUVHjYHp;RjQ0M0pRlXN=mLv{hk9Ebp9&~+Wj-T9IkpzWPWd#fZ)d=zV^~S`;LE*!&u-?g42^wwN&Xr1~#d5ifl_2*B1OoS}CDno^8a50ArfE8;stQF>AP54J@H~%T zFz84s;dO!QJKD36(~!QOg!t_^gfFcSKDU4yK0+Ypg$NT^mIYcQ6bk*3P(lBLh7Df_ zTu=2xC#+-_%)|{Cv8zz0t|0y4D5M`xAc{gwOKc`ou<*&VjUREFHs1qd<_xSkKeTBt zgyCi=@jj;&Ns^GsWWaIUl0Y2azcDlF@u{(P*!+EH;lnU~b|Lv{4|4Hdkh!qoQHiE$ zY#y>KFA0QEw=4Z|uV{0A^`Y=D}hB$GP&<$bi8q(u;p^0(my3Rz7fP}|# zGZ&#uor4@c3q9r|f?H6-UZmfgKx(iV(MQ`MPWB>iC~SxnN5H*zb*A3#zWwgu&c|}3 zn^g87H{pdeasl%Lhmab&jC?lES}7C?4BFDNA<}20hoY@w_IU%i*T;}}wh!589}7~7 z#Ug`-R~4j&+K_y4kW@X7qLr-)S5qVKU)tO;+kXJ++{vPI@{hVK|PhMVVx_`)vx~zUs}c9O-Ok{00000NkvXXu0mjf DS5_-g diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_link.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_link.png deleted file mode 100644 index bf7bd1c9bfd78d689c73ba67cf914182933ee68c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 614 zcmV-s0-61ZP)OOAS;jTeL{ZSdz-%)SMH9tDF;N4B6%j=d15J&5qy`F#vB?Ar zqS1nH@%ny_XSI*Y>) z1f5QYdmzT>YciP<3WehS<{GovEaLGv27>{*-7f0&I$yJ^L%ZGPv1YT$V|u;*+ZCWz ztHI~CDVsuy($SfR6-`N~K?9GTB#l%%0h7 z-q`K-y~E)+s8lMyTrPL8^_pUo)9G|SluG5pPqw6!LJB_PzyJUM07*qoM6N<$f^=yZ AYybcN diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_magnify.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_magnify.png deleted file mode 100644 index f6b74cc40f82fc83e4dfa6e9647ccc1b34e6ed7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 554 zcmV+_0@eMAP)Vb2f>2}Fa82O3m(Ob=t*sniin`NpInLyMJgI`saru@YOPfh zy4g0#G*cV!#N%;Gq9_VH9?v%kjS3Rb1j8^;C={$Gp=lbj z*(?%?geA!5^Pok%UauwjA)v4g2`HedDw4_Mk4hhBQt?e7YJ5(hcj|3dNu^TOPGnjB zTTsqd3GIZ=Bb`n=7no)dflv&K(lsWw?lH6T1Yht0F9qgIuzh}ym0%n<3d3EBWB*pg z+G!I0lbAEXyd>k|QNuwr4=KX1D+tLPv)j@C1=N4sA4NF9A>HcO3G47*Y6!+SrUH-7 z1hb;^#S=r|`aMh>J#dWruAEf}gcR(DRUC`ZUev&$Sbh0SgLiTXeeHEU<$_YV;9281 zym`igIE%Sm8DpDw7@71Tv^EB5xSdUR*0$Mqp+Wq8OoaZtOg52&)zZ;;M=7#C1Yd6x svjx>8ad4e2x|*xHHwRjcjs6zA0XLDUqKT6dS^xk507*qoM6N<$f*wetruo^Ag2=LamM1T#~4RmC^m`_ zs}H7d&XJ}mg+hU?tu0noRvyjI&o2SRAeYZFesYkts79I^jJ7!A7%6nJwq8O?iT55M z1OQ` zbL{!Cp5o*IRmE9PInMCSPjTwfT~J+EYkz}tjxY=fg5Yf6EQ@DG$0kMJ9h^&$W}9BU zP1oj2;?MWVkKIEl)r=Y;L^Cx2q|>!)qJJ8zE7-V*-Cf7V8_2#1c0N975t~+&QUpQJ z5(uo(-O_`%Rj@U@t>JYAgd!>L?0Idxtd#oW2gc!jinsAEva8|kF4#Ic**mmml_{d^$s}Q5Q)KCys4sfck5bP1SyeHwh2`A<@N&t2j0^lgHC_^(pAAPCNjwl+>AN%C4Ll>_8Hjda%9 oS~i=#*e)>KsPlg0=2)Qg6BCqJ=F8HdGXMYp07*qoM6N<$f@i)wr~m)} diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_office.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_office.png deleted file mode 100644 index a65bcb3e1e9613cd9e4950850db43d7025a5fdf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 779 zcmV+m1N8ifP)JNR5;6x zll@CmQ5eTZ^k*a#RQf}fVOdd`5NJh6S(>6Cf$wEW#f&JyAR#GAn9>Gml;nOf3WCDa z5({5&UB$(IF?G#$x4X@Ickg!Y-HU!Z_rzX=qAq-XI_LS^=lOCT0|0{#{kBkYDS7{3 zD`iu%E=`cDX_^#^#n$5SIQ|4Zhsk8>N|zXHXG@*41$i-7`Jr{8`3S_OEcmY|RF48wXkk?WpdVM4OePBSbfh z#4_=eXJg@3epx~gi>QbUmO}Bm(ENN3+@c?jWiKvSrm(o|W}Ud*?vy~fn1!V~Cl4kB zI-;c!8f~-v)jX82%EG($>?;KSD$64f2&4qQ#=Yyrcpy$57RAVuV#vKMP)0hT$r6m# zc^F^XaJ8R9Q|}x^NoJYIvYZkq-z}Tnj@UJK2l2H zG}p+VvtjP2Z%bsb$~7QLJ9#pC0dKi`ppOd^_V;ME6tdzC0PtV|r=@e@37O`%0k^=5^`%cf$eu00N17Ro!{^30krz>a%3j34C?*{Mt2^a4~ zK=P+Qq%|f;Tc&+9ps;@Mw`EE%rgs&#y=j6BUGg96oIqdwj9-fiy*N(|@o)eD002ov JPDHLkV1j#pUPb@_ diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_paint.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_paint.png deleted file mode 100644 index 23a37b891c2f5faa3b8128d45373ceab794ca609..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 688 zcmV;h0#E&kP)PK^TXt2QS_@2qt2T|9~baC-vaPn=ziepcfAwB$0!O2Q)E}1e8!q+9)KT5JVKU z7HNY}h##OS-BxWHWjD0wrPDeEfUClHs%Q6&2u@FTOJkKMQN|_Rlw6rQz$gPzqGNtj z#ruSeFeh835JJFiM6vp@6M5bXj%k7CMt%SIwfbF_fD-3*Os`9Ly_Q3WQ_SX33E{pX z9_WIeeTCGQ3wYALpBcK+P-iuw;3i&7xCua37k5# z`>c`M@sGeC7cdsdz`aE9lOz!hPholbyz%T85LYf6O*@SA+9&+^7k>+4M8$A8iNQq{ zQvn8k?-+dU`Z@gK0z$EtPV#+`^OH`R@cE-cuE&_!D)SZGxmQxeobP_Zwq zMEgi6ePN45N`|V1so0uE8^}1xw8s;VM%Ai@7} z2-&Cyvez_-O4?6uv{zTaj|YeYEk34i~K@`8YW2g{x* zc;7z3lItpVy_et{Z-ZZ)<@*%{l7Ao8mu@V7*gz<_1##mwW*%LEwCdzNsVLYx2*T-J z#HeQ*_a=R~KDdVNk$EVgAIRl$oQi_(`_IrdJciDpH|Xe{K-YsMtc!cRnFi$qzsr4z z5*$;ecov%3->1{YNy6-Gf(Ecy&_I$CjI#laeuE+S120^|Vjsf)W&i*H07*qoM6N<$ Ef)^4A_ab^avY?n0hpS-#mn_4{O$e%cm-@NH=3`90Wq+3`~HKArSdfX`&Z12 z(CY$VW-MNtXX4xy%yUeE?}*~0-|iByA@ZrwXgph4S*bhcc5{HB!DFVm_v}P*g7+Q~K}7K0lcp(^N@X>U zV`{ZpeIf${R6Hgg4FL^`X$Eu75k(PE6ycl$AW0Ic)#@rR7Z(7;V?i-dR1K935Jgcx zPfkwK>2wGokf!Nih^ARp6-6arYFG#(9Ta!x93nFEjoA==z(g?#sDg?Owk?Mg7K+>l zWYsf(<`#+$h9Sp6gFOg_dd+80SkUpk&xM7h0`Sov9W73spU;GP073|VfZ&Gd$J$*0<~TV5aPS|qWH57|VJz+d0000vYep8SaFV10Q$h+;hIUPX_=v5b}%>Tm<(&j1&5;I!55C)oN0s(P%ZB zP3Q#ahfpXKWF@S?jm4U#fv)QovMhrriclyNs6-G12#3R##4PSZ0VY(dRWJ;Lwuq{# zAW0Gwi$yA^R4RZ!;W+L`f&%x{=D^VK#BBWL4Ys{;*!A7Q;!=dN<&D8*GzGaF4`hV4 zDbY0{NrMX>ZqF=0((gR5-zL$kC*b)!fwu{Euru|XrG<$^n#@)7i_>rCmRxnDq>$Y%gJaCkRd|tE*a2x05Pe!I^e13o69#&RQZ36s0 zB=O|K2Yi(jsMqThn}9t?f5E-)L^naZ+db$&%M$!bCdm=jv7?t_lB?3&%Ltq(>ESw? c;MI421LCcoDG!2@;{X5v07*qoM6N<$f`UZt7XSbN diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_picture.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_picture.png deleted file mode 100644 index 134b6693687b2fa5fe36d48a9c0b8001f937c741..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 650 zcmV;50(Jd~P)VHAd+bMNh~)LLRqN>D)-jd9UvB%+hyKX5U|&4t0)fzgD-MPpQ$nHU%yoz=vI zMGb>1Xu!6Hw$NT~@Au<4P-+{9;Uw?&oj31uzH>xX0T7Xkz!(tn|Ed9-s_FqyReC13 z(ll)vW1O{Ck5ihay12Ob2ABc@RUI;zHpaMiyRDs0r>|D4rHw{ItJSJnYjt~jTbGuW z`X(~}?!&86q40R8<4zYw;$qi0^3ec=c&<&H;r`8W%H=Xymf^i;Wo6~<+}zx2UMzpC z*6MZN?(FMv`n|KO3(KFiUaucP0;Z!@LcUNa%8#vGK5aZ>wDgB0Gi=t*argWJcdlMQ z2#MpEX0wU+9&0U?N(F#OgpviU_Y{jYMsj65U3|PjwUOY}lUYj?MTiK_Il}NCVx-Eh zDx-TzMk7se+M#W_>?A1-x}ZXw3kkyz5kW)_hkjsi@RhKadN#H$Hq)$07*qoM6N<$f}lhwPXGV_ diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_powerpoint.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_powerpoint.png deleted file mode 100644 index c4eff0387d5888c638ba09473ba6d2369f7b56f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 588 zcmV-S0<-;zP)HU2HvUSp%6 z*n}iP63IK?dpo;h@sj9~pcxo;VVTc-XLiP@DgefqE#NE=@oyUd-&HjLpsLIuSFXV-EMck)oQ(A`s%*^&wf0(rNiNHsU%=0Rw;WC z(kbc37l6fo`-0uR!pYkYv8U^3?nsh^@pw!K0TH3uYyx1_2>|JbXPmfskJ|1YAw9w! z9`N)1^Aesr;y5Nr5-ODn)oOL|CGi}f9!&iVwpK$khlIX10X$H6^A_stBJqvLhU$?V`QXqKme*s~gVDJ4A;LTs_e15jhc1;By a82kqHEPVYFAD2!50000JNR5;6( zlS@kiVHAe7MZY2;Xi-5)WxDDgv@tCUl*&p14T@Z~3ThM5LP4tuQfLu@EnG;nXc<8S z6&3BN?fx-cv-Kp6>HRiNTHE>$X( zD&=w+?GWC>?RLAGC6Yix;an~UmSt)tSf}1VS6N1N2ONORdD? zaj}w6DAZZdOud9Ep?M?{iQWbE5^9HLLZZF|1kdy0Tu4InEuboP9@nvbZ-P0n4AZTy zyMRIxRDmUE#LdqYuD=-Qz4N^bC`_#S7vcLn1M}{J(Wl3#c4VWczu&)AjUlh(11>gp>f`wv{KnjF%!aA*Jk N002ovPDHLkV1kkt*XsZP diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_ruby.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_ruby.png deleted file mode 100644 index f59b7c4365fa1720af1aa04eb47167ddaa6eeed4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 626 zcmV-&0*(ENP)ZS(e|#C2>JN4>y}l*tQ*E7zP@R2CCJnkW?xa6bgk%(hgtZ z0=~d?U3i`+Mvi4!&~+WPT1^NX#{u6&QIx+DE(oR{&T5&-ovF?@wGw)P&AtpHZa|G%V*GUUqL@@!d4V$`8=##4)ytY959JG zdc&Kho)&AL70^i z!PEmeeDWCB-UbK(*4JST44^tV2z_J(dn~+vBMJT97_7rzFio=~XczIv?PQ5$v%u~y zu(bteXb5I1h2zCV{Jc2~V{{yzZipgsP6;k264$*#5q?GzCm|CPa9CKqm4b116h3Pu z?+%Cm52plC8|5P0@igf2GV1KkCfk{Zecu=G@VNrf>s%g9c5D%@cfxVb6$nY`1IW=4 zt10QqSps_2JLp0f3I0j0u>#qA;v!+T))KEbCg|mo3q0pG{OR}p0fPds8+K~d>Hq)$ M07*qoM6N<$g1S2e3jhEB diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_stack.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_stack.png deleted file mode 100644 index 44084add79b9a0fc3354d16bbd4b4b5ff8095da7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$R@9E+gqH(@-qA%AW0|7U8+xDRI z0k`B18}ImRw2g{jTGP$Pmx3yI6F_2s&$|`cJ!i0UN zB3H;=r{#{FwLaNVJ&hZl9+MTHGx1T^-A=Q0?hRb#8a~x50X%;`b6ik3cw=#XdxWy= zgrpBoDjpwP&g9<9h3x!k_B!?vuTJVkmIJ-U N;OXk;vd$@?2>|rNdMN+^ diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_star.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_star.png deleted file mode 100644 index 3a1441c9a12062a4bb3d706000d3ca14399aebca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 565 zcmV-50?Pe~P)SCZIX8XZzY2l?gCw6LlgWJ5Avz#QX4|&mI8LN)w~J1vgL=KLAhlWz*=#m~gyvxa z&;iC6gb?aZvMdXxX`<0+D1hs_pqJ!wxqlEH;CJ)je~uL(gpi@v>!I0f_Kl=E(E+Tq z26na*9gribxx-Oft(HnstyXUUy!39&E-cI%J5Rsy;(PGZH{g{ty!HVC&yGPT3H8x# zw{^gBPW)O0FMoh{k%l<`1a|To_Wl&u&-GXm8izU|&<&utILc4wc6s@u1bmTz6x{qg zTw@7=FQRcg&r`h+gcR$*Jbv+*DPk7v)B@e0o2 z6IlBXW&8xh@9)YKiV~2>+z&XKd24JT55YWz&JtfvCg4r^~bLP79-yS@n$OW00000NkvXXu0mjf DStt2z diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_swoosh.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_swoosh.png deleted file mode 100644 index e7708292adabf4821612bfca032cbd019c63180b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 634 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 diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_width.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_width.png deleted file mode 100644 index 1eb880947ddf3e745c29e8d9dc90f09c7e6e323c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-$R?&;zfqH(@;q9b3Efq-lM(nr^( z=EYR73-9e)UYMWsXy%?aZsD68Yyv^2$~6QgEcljw%kx>O(f-gQ?@fOOx3A-0+Qw?O zRx~W)kn~Qe2d6f9nMG#g9Q04Mk==M~N!Dglvxk!fgVh#w@ZV$IY1+Xc`d{d2UcaP~ zfWp)_Ivqj}l2SPy^9ZWy6rG9Yx4v67_uA&&9|XA~5-#3)W3%em1peD8RWH^#O%XoM zxMPud%}GTj#~*+7JMxTd!`{^Q+>(D3*|@KV`*G2;{QnANOxu1$r2xIe;OXk;vd$@? F2>@zac~<}c diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_word.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_word.png deleted file mode 100644 index ae8ecbf47672a874c0958d0d113a56162c2bd364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 651 zcmV;60(AX}P)hkjP zNW|QGv-YFNLN^qH@tJycPNG5ti6B7;r4mEr#lr@*T8*M85D`{ZR^BWwF23T<%MYIh zdC)S*p=|xk^!~H=+HSZ183~y8v4|mYmZxt&)5{{~>J`>E223Q5>T$=~mtA71q-jdG z+eJhOAyBW^0k9Gk1+rX8)zFx((CG^&tDY>6XaS~Fy!WJON|Gdujg5^~Vzt@o%BcYLiNiTQSD`zL^ociBz_>bDlpw3kriQ@Z`bVsGz-_6N>$&gTDiKDTKR^ z-hB*tHa^>!oD~5TK^0UK5rZ}RBm50Bv}S-yA%s=Ha5RYb{)!z2N&$&64gfhybBu8p lh~_|?8^bu;BRYt{<}Yrwd83Y=s?Goa002ovPDHLkV1l%3CP4rI diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_world.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_world.png deleted file mode 100644 index 6ed2490ed1432d5d667a76235360824a1088e928..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 734 zcmV<40wMj0P)JT{hN;C#tgf#9krG=I>5!<*aE1_(spcgF}<`n4i zJi-}^6UUeU4jUFwdCiVPDm%`Zx^UBa8J(mnR6wEgz^}o8;)M*Y(@l_!Kfv)}4+NuM zaPXE50z)r)9=D=SR|RIqfQ^j}Hu!fzMeQBo+@PZk1G8hOw|vBTvkx`HM)Xe9q3xao z@`p0`NO!2904FHSLA6E@Y-O6zH$DQzvq@aHsz}}<(!v(Z_+EodX%R&NZW75g+nENo zV0020rxE^;7d!067AN>6*+&YLp$9uH6F-=In`XC{Cn%+o|5)b&boEPr02w@|P*oGm QmjD0&07*qoM6N<$g78X0Q~&?~ diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_wrench.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_wrench.png deleted file mode 100644 index fecadd08afed92536be91ab12d8e37b6bf410d5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 613 zcmV-r0-F7aP)wK%m(L+9IV|s|#(WRl-O^4GvaQsnHq|OstfO zIJ3}3<01}YGARE4m!7=)QisvlHUo!Qymx-@-t*p_129Ko-#pVI)6#!*kLj-AGXWNR zyA_{wKii_amK7^YT-v z6#plaNm#8`-kz@OvjIt^4%IN{@J3bR zRI}ME1Mv85p|%;RK>ViR>APPLB4;;BpCtqE@P+*7!G>I4UjNx~e>r3HA^tWCQ@S)l z{BslcSwL-CxQ&_ZZSv_g0Tu{yi*X){Mt|W7)lbE`SQxFP00000NkvXXu0mjf;)M*S diff --git a/node_modules/express/node_modules/connect/lib/public/icons/page_white_zip.png b/node_modules/express/node_modules/connect/lib/public/icons/page_white_zip.png deleted file mode 100644 index fd4bbccdf1643f4ff5022fbc59b82546e259317e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 386 zcmV-|0e$|7P)_QM!1S$Bhw4w+iRuFWf;tfR6D%SMJrb+tx zC9R6{2>Ou6#juIy6u(I?|;&Owi$sRB4^20apB5xE2 z#B9XekY66S6lzfCL!eEQRgo0LokTA55@Y#%_wN!TXPw^Q4IIXsG~v#u_4t;x_HM16EQ@QRY+rut&97&UefsPmLrQ5P zBC2kcbux9L%2bJz$P$XV$*zSxb2e@6_3O#;&!FD<&hLjGn%~%en;7)djE^d6!t$lW7GyIOKlQ46hr`Z zjLNuRDP_53dNoN?wd&HMgL^m1DXFU<5dQsrceN>fSz00000)O9XRTN^$%%`*Fg>ryDtc(lF@?b>dE!20r+y z#Q*>(wbV5H`-E4Do={CJp7=ERhw15hgZi)?jRG88 zzVz(5;g?Td1izJyO33bhjg2Qc7FVY@f9!o)Gu?DII~vm-Dc?}3M!fsgjP?F(7`rgg z+xOk8XD)e?Zl=5+un`5!7kr?F=eq)K-5uqr%yU$1hLv){Vlm=)*5~`lwMciiXFu*g z)*Jkz6AF>#zb(Vx`Iv{bdGZHtlW)v(y5k^|xgSUc9%0}S20nrYrO}78ofk?bV!5)4 z=Ngz@+$9N1>>mA%IWx`Fqa240bWkiW;2TZgd8CZS0U}@mknC;!2;wi$eI@`h0y2JS`Eae0CW}q(2(%!m8 zWq$`PDU>LT1_y*bBv#P5<@q0@ttz$hIH}YMDvAigCc=y*)jY-VOpTd;A8@3t7Xh4r z0KTWOk;N2Ox4!&&^4B*no$WtTX!BXB)rg!y8dvGgKBQKLJNXRRp0}Bsjd1|LNQX~c zbC~fjrk2iL@4dYF*vt;}dFn(%h)n_-vzEIHMOKRkdF%3Lq|zBgKm_h>TEq!))nWjq zzn;B!?!(dQcHu$#=JF`cS&W~C`WHFW^B!~MI#k)>1Vk&eQy8P1O`J6V04{D@|7d6^ zyBABnh-d^H0FX&L07M||E0n_dp4v&Q%PSE9p#R#Hq)`5I_(B5CE#q dxjPz0{s-<+c#AC!i7@~G002ovPDHLkV1iPlpuqqD diff --git a/node_modules/express/node_modules/connect/lib/public/style.css b/node_modules/express/node_modules/connect/lib/public/style.css deleted file mode 100644 index 32b6507..0000000 --- a/node_modules/express/node_modules/connect/lib/public/style.css +++ /dev/null @@ -1,141 +0,0 @@ -body { - margin: 0; - padding: 80px 100px; - font: 13px "Helvetica Neue", "Lucida Grande", "Arial"; - background: #ECE9E9 -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#ECE9E9)); - background: #ECE9E9 -moz-linear-gradient(top, #fff, #ECE9E9); - background-repeat: no-repeat; - color: #555; - -webkit-font-smoothing: antialiased; -} -h1, h2, h3 { - margin: 0; - font-size: 22px; - color: #343434; -} -h1 em, h2 em { - padding: 0 5px; - font-weight: normal; -} -h1 { - font-size: 60px; -} -h2 { - margin-top: 10px; -} -h3 { - margin: 5px 0 10px 0; - padding-bottom: 5px; - border-bottom: 1px solid #eee; - font-size: 18px; -} -ul { - margin: 0; - padding: 0; -} -ul li { - margin: 5px 0; - padding: 3px 8px; - list-style: none; -} -ul li:hover { - cursor: pointer; - color: #2e2e2e; -} -ul li .path { - padding-left: 5px; - font-weight: bold; -} -ul li .line { - padding-right: 5px; - font-style: italic; -} -ul li:first-child .path { - padding-left: 0; -} -p { - line-height: 1.5; -} -a { - color: #555; - text-decoration: none; -} -a:hover { - color: #303030; -} -#stacktrace { - margin-top: 15px; -} -.directory h1 { - margin-bottom: 15px; - font-size: 18px; -} -ul#files { - width: 100%; - height: 500px; -} -ul#files li { - padding: 0; -} -ul#files li img { - position: absolute; - top: 5px; - left: 5px; -} -ul#files li a { - position: relative; - display: block; - margin: 1px; - width: 30%; - height: 25px; - line-height: 25px; - text-indent: 8px; - float: left; - border: 1px solid transparent; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - overflow: hidden; - text-overflow: ellipsis; -} -ul#files li a.icon { - text-indent: 25px; -} -ul#files li a:focus, -ul#files li a:hover { - outline: none; - background: rgba(255,255,255,0.65); - border: 1px solid #ececec; -} -ul#files li a.highlight { - -webkit-transition: background .4s ease-in-out; - background: #ffff4f; - border-color: #E9DC51; -} -#search { - display: block; - position: fixed; - top: 20px; - right: 20px; - width: 90px; - -webkit-transition: width ease 0.2s, opacity ease 0.4s; - -moz-transition: width ease 0.2s, opacity ease 0.4s; - -webkit-border-radius: 32px; - -moz-border-radius: 32px; - -webkit-box-shadow: inset 0px 0px 3px rgba(0, 0, 0, 0.25), inset 0px 1px 3px rgba(0, 0, 0, 0.7), 0px 1px 0px rgba(255, 255, 255, 0.03); - -moz-box-shadow: inset 0px 0px 3px rgba(0, 0, 0, 0.25), inset 0px 1px 3px rgba(0, 0, 0, 0.7), 0px 1px 0px rgba(255, 255, 255, 0.03); - -webkit-font-smoothing: antialiased; - text-align: left; - font: 13px "Helvetica Neue", Arial, sans-serif; - padding: 4px 10px; - border: none; - background: transparent; - margin-bottom: 0; - outline: none; - opacity: 0.7; - color: #888; -} -#search:focus { - width: 120px; - opacity: 1.0; -} diff --git a/node_modules/express/node_modules/connect/lib/utils.js b/node_modules/express/node_modules/connect/lib/utils.js deleted file mode 100644 index 47b30e0..0000000 --- a/node_modules/express/node_modules/connect/lib/utils.js +++ /dev/null @@ -1,370 +0,0 @@ - -/*! - * Connect - utils - * Copyright(c) 2010 Sencha Inc. - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var http = require('http') - , crypto = require('crypto') - , parse = require('url').parse - , signature = require('cookie-signature'); - -/** - * Return `true` if the request has a body, otherwise return `false`. - * - * @param {IncomingMessage} req - * @return {Boolean} - * @api private - */ - -exports.hasBody = function(req) { - return 'transfer-encoding' in req.headers || 'content-length' in req.headers; -}; - -/** - * Extract the mime type from the given request's - * _Content-Type_ header. - * - * @param {IncomingMessage} req - * @return {String} - * @api private - */ - -exports.mime = function(req) { - var str = req.headers['content-type'] || ''; - return str.split(';')[0]; -}; - -/** - * Return md5 hash of the given string and optional encoding, - * defaulting to hex. - * - * utils.md5('wahoo'); - * // => "e493298061761236c96b02ea6aa8a2ad" - * - * @param {String} str - * @param {String} encoding - * @return {String} - * @api private - */ - -exports.md5 = function(str, encoding){ - return crypto - .createHash('md5') - .update(str) - .digest(encoding || 'hex'); -}; - -/** - * Merge object b with object a. - * - * var a = { foo: 'bar' } - * , b = { bar: 'baz' }; - * - * utils.merge(a, b); - * // => { foo: 'bar', bar: 'baz' } - * - * @param {Object} a - * @param {Object} b - * @return {Object} - * @api private - */ - -exports.merge = function(a, b){ - if (a && b) { - for (var key in b) { - a[key] = b[key]; - } - } - return a; -}; - -/** - * Escape the given string of `html`. - * - * @param {String} html - * @return {String} - * @api private - */ - -exports.escape = function(html){ - return String(html) - .replace(/&(?!\w+;)/g, '&') - .replace(//g, '>') - .replace(/"/g, '"'); -}; - - -/** - * Return a unique identifier with the given `len`. - * - * utils.uid(10); - * // => "FDaS435D2z" - * - * @param {Number} len - * @return {String} - * @api private - */ - -exports.uid = function(len) { - return crypto.randomBytes(Math.ceil(len * 3 / 4)) - .toString('base64') - .slice(0, len); -}; - -/** - * Sign the given `val` with `secret`. - * - * @param {String} val - * @param {String} secret - * @return {String} - * @api private - */ - -exports.sign = function(val, secret){ - console.warn('do not use utils.sign(), use https://github.com/visionmedia/node-cookie-signature') - return val + '.' + crypto - .createHmac('sha256', secret) - .update(val) - .digest('base64') - .replace(/=+$/, ''); -}; - -/** - * Unsign and decode the given `val` with `secret`, - * returning `false` if the signature is invalid. - * - * @param {String} val - * @param {String} secret - * @return {String|Boolean} - * @api private - */ - -exports.unsign = function(val, secret){ - console.warn('do not use utils.unsign(), use https://github.com/visionmedia/node-cookie-signature') - var str = val.slice(0, val.lastIndexOf('.')); - return exports.sign(str, secret) == val - ? str - : false; -}; - -/** - * Parse signed cookies, returning an object - * containing the decoded key/value pairs, - * while removing the signed key from `obj`. - * - * @param {Object} obj - * @return {Object} - * @api private - */ - -exports.parseSignedCookies = function(obj, secret){ - var ret = {}; - Object.keys(obj).forEach(function(key){ - var val = obj[key]; - if (0 == val.indexOf('s:')) { - val = signature.unsign(val.slice(2), secret); - if (val) { - ret[key] = val; - delete obj[key]; - } - } - }); - return ret; -}; - -/** - * Parse a signed cookie string, return the decoded value - * - * @param {String} str signed cookie string - * @param {String} secret - * @return {String} decoded value - * @api private - */ - -exports.parseSignedCookie = function(str, secret){ - return 0 == str.indexOf('s:') - ? signature.unsign(str.slice(2), secret) - : str; -}; - -/** - * Parse JSON cookies. - * - * @param {Object} obj - * @return {Object} - * @api private - */ - -exports.parseJSONCookies = function(obj){ - Object.keys(obj).forEach(function(key){ - var val = obj[key]; - var res = exports.parseJSONCookie(val); - if (res) obj[key] = res; - }); - return obj; -}; - -/** - * Parse JSON cookie string - * - * @param {String} str - * @return {Object} Parsed object or null if not json cookie - * @api private - */ - -exports.parseJSONCookie = function(str) { - if (0 == str.indexOf('j:')) { - try { - return JSON.parse(str.slice(2)); - } catch (err) { - // no op - } - } -}; - -/** - * Pause `data` and `end` events on the given `obj`. - * Middleware performing async tasks _should_ utilize - * this utility (or similar), to re-emit data once - * the async operation has completed, otherwise these - * events may be lost. - * - * var pause = utils.pause(req); - * fs.readFile(path, function(){ - * next(); - * pause.resume(); - * }); - * - * @param {Object} obj - * @return {Object} - * @api private - */ - -exports.pause = require('pause'); - -/** - * Strip `Content-*` headers from `res`. - * - * @param {ServerResponse} res - * @api private - */ - -exports.removeContentHeaders = function(res){ - Object.keys(res._headers).forEach(function(field){ - if (0 == field.indexOf('content')) { - res.removeHeader(field); - } - }); -}; - -/** - * Check if `req` is a conditional GET request. - * - * @param {IncomingMessage} req - * @return {Boolean} - * @api private - */ - -exports.conditionalGET = function(req) { - return req.headers['if-modified-since'] - || req.headers['if-none-match']; -}; - -/** - * Respond with 401 "Unauthorized". - * - * @param {ServerResponse} res - * @param {String} realm - * @api private - */ - -exports.unauthorized = function(res, realm) { - res.statusCode = 401; - res.setHeader('WWW-Authenticate', 'Basic realm="' + realm + '"'); - res.end('Unauthorized'); -}; - -/** - * Respond with 304 "Not Modified". - * - * @param {ServerResponse} res - * @param {Object} headers - * @api private - */ - -exports.notModified = function(res) { - exports.removeContentHeaders(res); - res.statusCode = 304; - res.end(); -}; - -/** - * Return an ETag in the form of `"-"` - * from the given `stat`. - * - * @param {Object} stat - * @return {String} - * @api private - */ - -exports.etag = function(stat) { - return '"' + stat.size + '-' + Number(stat.mtime) + '"'; -}; - -/** - * Parse the given Cache-Control `str`. - * - * @param {String} str - * @return {Object} - * @api private - */ - -exports.parseCacheControl = function(str){ - var directives = str.split(',') - , obj = {}; - - for(var i = 0, len = directives.length; i < len; i++) { - var parts = directives[i].split('=') - , key = parts.shift().trim() - , val = parseInt(parts.shift(), 10); - - obj[key] = isNaN(val) ? true : val; - } - - return obj; -}; - -/** - * Parse the `req` url with memoization. - * - * @param {ServerRequest} req - * @return {Object} - * @api private - */ - -exports.parseUrl = function(req){ - var parsed = req._parsedUrl; - if (parsed && parsed.href == req.url) { - return parsed; - } else { - return req._parsedUrl = parse(req.url); - } -}; - -/** - * Parse byte `size` string. - * - * @param {String} size - * @return {Number} - * @api private - */ - -exports.parseBytes = require('bytes'); diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/.npmignore b/node_modules/express/node_modules/connect/node_modules/bytes/.npmignore deleted file mode 100644 index 9daeafb..0000000 --- a/node_modules/express/node_modules/connect/node_modules/bytes/.npmignore +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/History.md b/node_modules/express/node_modules/connect/node_modules/bytes/History.md deleted file mode 100644 index db1f759..0000000 --- a/node_modules/express/node_modules/connect/node_modules/bytes/History.md +++ /dev/null @@ -1,5 +0,0 @@ - -0.1.0 / 2012-07-04 -================== - - * add bytes to string conversion [yields] diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/Makefile b/node_modules/express/node_modules/connect/node_modules/bytes/Makefile deleted file mode 100644 index 8e8640f..0000000 --- a/node_modules/express/node_modules/connect/node_modules/bytes/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --reporter spec \ - --require should - -.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/Readme.md b/node_modules/express/node_modules/connect/node_modules/bytes/Readme.md deleted file mode 100644 index 9325d5b..0000000 --- a/node_modules/express/node_modules/connect/node_modules/bytes/Readme.md +++ /dev/null @@ -1,51 +0,0 @@ -# node-bytes - - Byte string parser / formatter. - -## Example: - -```js -bytes('1kb') -// => 1024 - -bytes('2mb') -// => 2097152 - -bytes('1gb') -// => 1073741824 - -bytes(1073741824) -// => 1gb -``` - -## Installation - -``` -$ npm install bytes -$ component install visionmedia/bytes.js -``` - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -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/node_modules/express/node_modules/connect/node_modules/bytes/component.json b/node_modules/express/node_modules/connect/node_modules/bytes/component.json deleted file mode 100644 index 76a6057..0000000 --- a/node_modules/express/node_modules/connect/node_modules/bytes/component.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "bytes", - "description": "byte size string parser / serializer", - "keywords": ["bytes", "utility"], - "version": "0.1.0", - "scripts": ["index.js"] -} diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/index.js b/node_modules/express/node_modules/connect/node_modules/bytes/index.js deleted file mode 100644 index 3eaafc7..0000000 --- a/node_modules/express/node_modules/connect/node_modules/bytes/index.js +++ /dev/null @@ -1,39 +0,0 @@ - -/** - * Parse byte `size` string. - * - * @param {String} size - * @return {Number} - * @api public - */ - -module.exports = function(size) { - if ('number' == typeof size) return convert(size); - var parts = size.match(/^(\d+(?:\.\d+)?) *(kb|mb|gb)$/) - , n = parseFloat(parts[1]) - , type = parts[2]; - - var map = { - kb: 1 << 10 - , mb: 1 << 20 - , gb: 1 << 30 - }; - - return map[type] * n; -}; - -/** - * convert bytes into string. - * - * @param {Number} b - bytes to convert - * @return {String}i - * @api public - */ - -function convert (b) { - var gb = 1 << 30, mb = 1 << 20, kb = 1 << 10; - if (b >= gb) return (Math.round(b / gb * 100) / 100) + 'gb'; - if (b >= mb) return (Math.round(b / mb * 100) / 100) + 'mb'; - if (b >= kb) return (Math.round(b / kb * 100) / 100) + 'kb'; - return b; -} \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/bytes/package.json b/node_modules/express/node_modules/connect/node_modules/bytes/package.json deleted file mode 100644 index 05f17ec..0000000 --- a/node_modules/express/node_modules/connect/node_modules/bytes/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "bytes", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "description": "byte size string parser / serializer", - "version": "0.1.0", - "main": "index.js", - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "component": { - "scripts": { - "bytes": "index.js" - } - }, - "readme": "# node-bytes\n\n Byte string parser / formatter.\n\n## Example:\n\n```js\nbytes('1kb')\n// => 1024\n\nbytes('2mb')\n// => 2097152\n\nbytes('1gb')\n// => 1073741824\n\nbytes(1073741824)\n// => 1gb\n```\n\n## Installation\n\n```\n$ npm install bytes\n$ component install visionmedia/bytes.js\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", - "_id": "bytes@0.1.0", - "_from": "bytes@0.1.0" -} diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/.npmignore b/node_modules/express/node_modules/connect/node_modules/formidable/.npmignore deleted file mode 100644 index 4fbabb3..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -/test/tmp/ -*.upload -*.un~ -*.http diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/.travis.yml b/node_modules/express/node_modules/connect/node_modules/formidable/.travis.yml deleted file mode 100644 index f1d0f13..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.4 - - 0.6 diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/Makefile b/node_modules/express/node_modules/connect/node_modules/formidable/Makefile deleted file mode 100644 index 8945872..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -SHELL := /bin/bash - -test: - @./test/run.js - -build: npm test - -npm: - npm install . - -clean: - rm test/tmp/* - -.PHONY: test clean build diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/Readme.md b/node_modules/express/node_modules/connect/node_modules/formidable/Readme.md deleted file mode 100644 index a5ca104..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/Readme.md +++ /dev/null @@ -1,311 +0,0 @@ -# Formidable - -[![Build Status](https://secure.travis-ci.org/felixge/node-formidable.png?branch=master)](http://travis-ci.org/felixge/node-formidable) - -## Purpose - -A node.js module for parsing form data, especially file uploads. - -## Current status - -This module was developed for [Transloadit](http://transloadit.com/), a service focused on uploading -and encoding images and videos. It has been battle-tested against hundreds of GB of file uploads from -a large variety of clients and is considered production-ready. - -## Features - -* Fast (~500mb/sec), non-buffering multipart parser -* Automatically writing file uploads to disk -* Low memory footprint -* Graceful error handling -* Very high test coverage - -## Changelog - -### v1.0.9 - -* Emit progress when content length header parsed (Tim Koschützki) -* Fix Readme syntax due to GitHub changes (goob) -* Replace references to old 'sys' module in Readme with 'util' (Peter Sugihara) - -### v1.0.8 - -* Strip potentially unsafe characters when using `keepExtensions: true`. -* Switch to utest / urun for testing -* Add travis build - -### v1.0.7 - -* Remove file from package that was causing problems when installing on windows. (#102) -* Fix typos in Readme (Jason Davies). - -### v1.0.6 - -* Do not default to the default to the field name for file uploads where - filename="". - -### v1.0.5 - -* Support filename="" in multipart parts -* Explain unexpected end() errors in parser better - -**Note:** Starting with this version, formidable emits 'file' events for empty -file input fields. Previously those were incorrectly emitted as regular file -input fields with value = "". - -### v1.0.4 - -* Detect a good default tmp directory regardless of platform. (#88) - -### v1.0.3 - -* Fix problems with utf8 characters (#84) / semicolons in filenames (#58) -* Small performance improvements -* New test suite and fixture system - -### v1.0.2 - -* Exclude node\_modules folder from git -* Implement new `'aborted'` event -* Fix files in example folder to work with recent node versions -* Make gently a devDependency - -[See Commits](https://github.com/felixge/node-formidable/compare/v1.0.1...v1.0.2) - -### v1.0.1 - -* Fix package.json to refer to proper main directory. (#68, Dean Landolt) - -[See Commits](https://github.com/felixge/node-formidable/compare/v1.0.0...v1.0.1) - -### v1.0.0 - -* Add support for multipart boundaries that are quoted strings. (Jeff Craig) - -This marks the beginning of development on version 2.0 which will include -several architectural improvements. - -[See Commits](https://github.com/felixge/node-formidable/compare/v0.9.11...v1.0.0) - -### v0.9.11 - -* Emit `'progress'` event when receiving data, regardless of parsing it. (Tim Koschützki) -* Use [W3C FileAPI Draft](http://dev.w3.org/2006/webapi/FileAPI/) properties for File class - -**Important:** The old property names of the File class will be removed in a -future release. - -[See Commits](https://github.com/felixge/node-formidable/compare/v0.9.10...v0.9.11) - -### Older releases - -These releases were done before starting to maintain the above Changelog: - -* [v0.9.10](https://github.com/felixge/node-formidable/compare/v0.9.9...v0.9.10) -* [v0.9.9](https://github.com/felixge/node-formidable/compare/v0.9.8...v0.9.9) -* [v0.9.8](https://github.com/felixge/node-formidable/compare/v0.9.7...v0.9.8) -* [v0.9.7](https://github.com/felixge/node-formidable/compare/v0.9.6...v0.9.7) -* [v0.9.6](https://github.com/felixge/node-formidable/compare/v0.9.5...v0.9.6) -* [v0.9.5](https://github.com/felixge/node-formidable/compare/v0.9.4...v0.9.5) -* [v0.9.4](https://github.com/felixge/node-formidable/compare/v0.9.3...v0.9.4) -* [v0.9.3](https://github.com/felixge/node-formidable/compare/v0.9.2...v0.9.3) -* [v0.9.2](https://github.com/felixge/node-formidable/compare/v0.9.1...v0.9.2) -* [v0.9.1](https://github.com/felixge/node-formidable/compare/v0.9.0...v0.9.1) -* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) -* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) -* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) -* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) -* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) -* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) -* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) -* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0) -* [v0.1.0](https://github.com/felixge/node-formidable/commits/v0.1.0) - -## Installation - -Via [npm](http://github.com/isaacs/npm): - - npm install formidable@latest - -Manually: - - git clone git://github.com/felixge/node-formidable.git formidable - vim my.js - # var formidable = require('./formidable'); - -Note: Formidable requires [gently](http://github.com/felixge/node-gently) to run the unit tests, but you won't need it for just using the library. - -## Example - -Parse an incoming file upload. - - var formidable = require('formidable'), - http = require('http'), - - util = require('util'); - - http.createServer(function(req, res) { - if (req.url == '/upload' && req.method.toLowerCase() == 'post') { - // parse a file upload - var form = new formidable.IncomingForm(); - form.parse(req, function(err, fields, files) { - res.writeHead(200, {'content-type': 'text/plain'}); - res.write('received upload:\n\n'); - res.end(util.inspect({fields: fields, files: files})); - }); - return; - } - - // show a file upload form - res.writeHead(200, {'content-type': 'text/html'}); - res.end( - '
    '+ - '
    '+ - '
    '+ - ''+ - '
    ' - ); - }).listen(80); - -## API - -### formidable.IncomingForm - -__new formidable.IncomingForm()__ - -Creates a new incoming form. - -__incomingForm.encoding = 'utf-8'__ - -The encoding to use for incoming form fields. - -__incomingForm.uploadDir = process.env.TMP || '/tmp' || process.cwd()__ - -The directory for placing file uploads in. You can move them later on using -`fs.rename()`. The default directory is picked at module load time depending on -the first existing directory from those listed above. - -__incomingForm.keepExtensions = false__ - -If you want the files written to `incomingForm.uploadDir` to include the extensions of the original files, set this property to `true`. - -__incomingForm.type__ - -Either 'multipart' or 'urlencoded' depending on the incoming request. - -__incomingForm.maxFieldsSize = 2 * 1024 * 1024__ - -Limits the amount of memory a field (not file) can allocate in bytes. -If this value is exceeded, an `'error'` event is emitted. The default -size is 2MB. - -__incomingForm.hash = false__ - -If you want checksums calculated for incoming files, set this to either `'sha1'` or `'md5'`. - -__incomingForm.bytesReceived__ - -The amount of bytes received for this form so far. - -__incomingForm.bytesExpected__ - -The expected number of bytes in this form. - -__incomingForm.parse(request, [cb])__ - -Parses an incoming node.js `request` containing form data. If `cb` is provided, all fields an files are collected and passed to the callback: - - incomingForm.parse(req, function(err, fields, files) { - // ... - }); - -__incomingForm.onPart(part)__ - -You may overwrite this method if you are interested in directly accessing the multipart stream. Doing so will disable any `'field'` / `'file'` events processing which would occur otherwise, making you fully responsible for handling the processing. - - incomingForm.onPart = function(part) { - part.addListener('data', function() { - // ... - }); - } - -If you want to use formidable to only handle certain parts for you, you can do so: - - incomingForm.onPart = function(part) { - if (!part.filename) { - // let formidable handle all non-file parts - incomingForm.handlePart(part); - } - } - -Check the code in this method for further inspiration. - -__Event: 'progress' (bytesReceived, bytesExpected)__ - -Emitted after each incoming chunk of data that has been parsed. Can be used to roll your own progress bar. - -__Event: 'field' (name, value)__ - -Emitted whenever a field / value pair has been received. - -__Event: 'fileBegin' (name, file)__ - -Emitted whenever a new file is detected in the upload stream. Use this even if -you want to stream the file to somewhere else while buffering the upload on -the file system. - -__Event: 'file' (name, file)__ - -Emitted whenever a field / file pair has been received. `file` is an instance of `File`. - -__Event: 'error' (err)__ - -Emitted when there is an error processing the incoming form. A request that experiences an error is automatically paused, you will have to manually call `request.resume()` if you want the request to continue firing `'data'` events. - -__Event: 'aborted'__ - -Emitted when the request was aborted by the user. Right now this can be due to a 'timeout' or 'close' event on the socket. In the future there will be a separate 'timeout' event (needs a change in the node core). - -__Event: 'end' ()__ - -Emitted when the entire request has been received, and all contained files have finished flushing to disk. This is a great place for you to send your response. - -### formidable.File - -__file.size = 0__ - -The size of the uploaded file in bytes. If the file is still being uploaded (see `'fileBegin'` event), this property says how many bytes of the file have been written to disk yet. - -__file.path = null__ - -The path this file is being written to. You can modify this in the `'fileBegin'` event in -case you are unhappy with the way formidable generates a temporary path for your files. - -__file.name = null__ - -The name this file had according to the uploading client. - -__file.type = null__ - -The mime type of this file, according to the uploading client. - -__file.lastModifiedDate = null__ - -A date object (or `null`) containing the time this file was last written to. Mostly -here for compatibility with the [W3C File API Draft](http://dev.w3.org/2006/webapi/FileAPI/). - -__file.hash = null__ - -If hash calculation was set, you can read the hex digest out of this var. - -## License - -Formidable is licensed under the MIT license. - -## Ports - -* [multipart-parser](http://github.com/FooBarWidget/multipart-parser): a C++ parser based on formidable - -## Credits - -* [Ryan Dahl](http://twitter.com/ryah) for his work on [http-parser](http://github.com/ry/http-parser) which heavily inspired multipart_parser.js diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/TODO b/node_modules/express/node_modules/connect/node_modules/formidable/TODO deleted file mode 100644 index e1107f2..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/TODO +++ /dev/null @@ -1,3 +0,0 @@ -- Better bufferMaxSize handling approach -- Add tests for JSON parser pull request and merge it -- Implement QuerystringParser the same way as MultipartParser diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/benchmark/bench-multipart-parser.js b/node_modules/express/node_modules/connect/node_modules/formidable/benchmark/bench-multipart-parser.js deleted file mode 100644 index bff41f1..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/benchmark/bench-multipart-parser.js +++ /dev/null @@ -1,70 +0,0 @@ -require('../test/common'); -var multipartParser = require('../lib/multipart_parser'), - MultipartParser = multipartParser.MultipartParser, - parser = new MultipartParser(), - Buffer = require('buffer').Buffer, - boundary = '-----------------------------168072824752491622650073', - mb = 100, - buffer = createMultipartBuffer(boundary, mb * 1024 * 1024), - callbacks = - { partBegin: -1, - partEnd: -1, - headerField: -1, - headerValue: -1, - partData: -1, - end: -1, - }; - - -parser.initWithBoundary(boundary); -parser.onHeaderField = function() { - callbacks.headerField++; -}; - -parser.onHeaderValue = function() { - callbacks.headerValue++; -}; - -parser.onPartBegin = function() { - callbacks.partBegin++; -}; - -parser.onPartData = function() { - callbacks.partData++; -}; - -parser.onPartEnd = function() { - callbacks.partEnd++; -}; - -parser.onEnd = function() { - callbacks.end++; -}; - -var start = +new Date(), - nparsed = parser.write(buffer), - duration = +new Date - start, - mbPerSec = (mb / (duration / 1000)).toFixed(2); - -console.log(mbPerSec+' mb/sec'); - -assert.equal(nparsed, buffer.length); - -function createMultipartBuffer(boundary, size) { - var head = - '--'+boundary+'\r\n' - + 'content-disposition: form-data; name="field1"\r\n' - + '\r\n' - , tail = '\r\n--'+boundary+'--\r\n' - , buffer = new Buffer(size); - - buffer.write(head, 'ascii', 0); - buffer.write(tail, 'ascii', buffer.length - tail.length); - return buffer; -} - -process.on('exit', function() { - for (var k in callbacks) { - assert.equal(0, callbacks[k], k+' count off by '+callbacks[k]); - } -}); diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/example/post.js b/node_modules/express/node_modules/connect/node_modules/formidable/example/post.js deleted file mode 100644 index f6c15a6..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/example/post.js +++ /dev/null @@ -1,43 +0,0 @@ -require('../test/common'); -var http = require('http'), - util = require('util'), - formidable = require('formidable'), - server; - -server = http.createServer(function(req, res) { - if (req.url == '/') { - res.writeHead(200, {'content-type': 'text/html'}); - res.end( - '
    '+ - '
    '+ - '
    '+ - ''+ - '
    ' - ); - } else if (req.url == '/post') { - var form = new formidable.IncomingForm(), - fields = []; - - form - .on('error', function(err) { - res.writeHead(200, {'content-type': 'text/plain'}); - res.end('error:\n\n'+util.inspect(err)); - }) - .on('field', function(field, value) { - console.log(field, value); - fields.push([field, value]); - }) - .on('end', function() { - console.log('-> post done'); - res.writeHead(200, {'content-type': 'text/plain'}); - res.end('received fields:\n\n '+util.inspect(fields)); - }); - form.parse(req); - } else { - res.writeHead(404, {'content-type': 'text/plain'}); - res.end('404'); - } -}); -server.listen(TEST_PORT); - -console.log('listening on http://localhost:'+TEST_PORT+'/'); diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/example/upload.js b/node_modules/express/node_modules/connect/node_modules/formidable/example/upload.js deleted file mode 100644 index 050cdd9..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/example/upload.js +++ /dev/null @@ -1,48 +0,0 @@ -require('../test/common'); -var http = require('http'), - util = require('util'), - formidable = require('formidable'), - server; - -server = http.createServer(function(req, res) { - if (req.url == '/') { - res.writeHead(200, {'content-type': 'text/html'}); - res.end( - '
    '+ - '
    '+ - '
    '+ - ''+ - '
    ' - ); - } else if (req.url == '/upload') { - var form = new formidable.IncomingForm(), - files = [], - fields = []; - - form.uploadDir = TEST_TMP; - - form - .on('field', function(field, value) { - console.log(field, value); - fields.push([field, value]); - }) - .on('file', function(field, file) { - console.log(field, file); - files.push([field, file]); - }) - .on('end', function() { - console.log('-> upload done'); - res.writeHead(200, {'content-type': 'text/plain'}); - res.write('received fields:\n\n '+util.inspect(fields)); - res.write('\n\n'); - res.end('received files:\n\n '+util.inspect(files)); - }); - form.parse(req); - } else { - res.writeHead(404, {'content-type': 'text/plain'}); - res.end('404'); - } -}); -server.listen(TEST_PORT); - -console.log('listening on http://localhost:'+TEST_PORT+'/'); diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/index.js b/node_modules/express/node_modules/connect/node_modules/formidable/index.js deleted file mode 100644 index be41032..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/formidable'); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/lib/file.js b/node_modules/express/node_modules/connect/node_modules/formidable/lib/file.js deleted file mode 100644 index dad8d5f..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/lib/file.js +++ /dev/null @@ -1,73 +0,0 @@ -if (global.GENTLY) require = GENTLY.hijack(require); - -var util = require('./util'), - WriteStream = require('fs').WriteStream, - EventEmitter = require('events').EventEmitter, - crypto = require('crypto'); - -function File(properties) { - EventEmitter.call(this); - - this.size = 0; - this.path = null; - this.name = null; - this.type = null; - this.hash = null; - this.lastModifiedDate = null; - - this._writeStream = null; - - for (var key in properties) { - this[key] = properties[key]; - } - - if(typeof this.hash === 'string') { - this.hash = crypto.createHash(properties.hash); - } - - this._backwardsCompatibility(); -} -module.exports = File; -util.inherits(File, EventEmitter); - -// @todo Next release: Show error messages when accessing these -File.prototype._backwardsCompatibility = function() { - var self = this; - this.__defineGetter__('length', function() { - return self.size; - }); - this.__defineGetter__('filename', function() { - return self.name; - }); - this.__defineGetter__('mime', function() { - return self.type; - }); -}; - -File.prototype.open = function() { - this._writeStream = new WriteStream(this.path); -}; - -File.prototype.write = function(buffer, cb) { - var self = this; - this._writeStream.write(buffer, function() { - if(self.hash) { - self.hash.update(buffer); - } - self.lastModifiedDate = new Date(); - self.size += buffer.length; - self.emit('progress', self.size); - cb(); - }); -}; - -File.prototype.end = function(cb) { - var self = this; - this._writeStream.end(function() { - if(self.hash) { - self.hash = self.hash.digest('hex'); - } - self.emit('end'); - cb(); - }); -}; diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/lib/incoming_form.js b/node_modules/express/node_modules/connect/node_modules/formidable/lib/incoming_form.js deleted file mode 100644 index 060eac2..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/lib/incoming_form.js +++ /dev/null @@ -1,384 +0,0 @@ -if (global.GENTLY) require = GENTLY.hijack(require); - -var fs = require('fs'); -var util = require('./util'), - path = require('path'), - File = require('./file'), - MultipartParser = require('./multipart_parser').MultipartParser, - QuerystringParser = require('./querystring_parser').QuerystringParser, - StringDecoder = require('string_decoder').StringDecoder, - EventEmitter = require('events').EventEmitter, - Stream = require('stream').Stream; - -function IncomingForm(opts) { - if (!(this instanceof IncomingForm)) return new IncomingForm; - EventEmitter.call(this); - - opts=opts||{}; - - this.error = null; - this.ended = false; - - this.maxFieldsSize = opts.maxFieldsSize || 2 * 1024 * 1024; - this.keepExtensions = opts.keepExtensions || false; - this.uploadDir = opts.uploadDir || IncomingForm.UPLOAD_DIR; - this.encoding = opts.encoding || 'utf-8'; - this.headers = null; - this.type = null; - this.hash = false; - - this.bytesReceived = null; - this.bytesExpected = null; - - this._parser = null; - this._flushing = 0; - this._fieldsSize = 0; -}; -util.inherits(IncomingForm, EventEmitter); -exports.IncomingForm = IncomingForm; - -IncomingForm.UPLOAD_DIR = (function() { - var dirs = [process.env.TMP, '/tmp', process.cwd()]; - for (var i = 0; i < dirs.length; i++) { - var dir = dirs[i]; - var isDirectory = false; - - try { - isDirectory = fs.statSync(dir).isDirectory(); - } catch (e) {} - - if (isDirectory) return dir; - } -})(); - -IncomingForm.prototype.parse = function(req, cb) { - this.pause = function() { - try { - req.pause(); - } catch (err) { - // the stream was destroyed - if (!this.ended) { - // before it was completed, crash & burn - this._error(err); - } - return false; - } - return true; - }; - - this.resume = function() { - try { - req.resume(); - } catch (err) { - // the stream was destroyed - if (!this.ended) { - // before it was completed, crash & burn - this._error(err); - } - return false; - } - - return true; - }; - - this.writeHeaders(req.headers); - - var self = this; - req - .on('error', function(err) { - self._error(err); - }) - .on('aborted', function() { - self.emit('aborted'); - }) - .on('data', function(buffer) { - self.write(buffer); - }) - .on('end', function() { - if (self.error) { - return; - } - - var err = self._parser.end(); - if (err) { - self._error(err); - } - }); - - if (cb) { - var fields = {}, files = {}; - this - .on('field', function(name, value) { - fields[name] = value; - }) - .on('file', function(name, file) { - files[name] = file; - }) - .on('error', function(err) { - cb(err, fields, files); - }) - .on('end', function() { - cb(null, fields, files); - }); - } - - return this; -}; - -IncomingForm.prototype.writeHeaders = function(headers) { - this.headers = headers; - this._parseContentLength(); - this._parseContentType(); -}; - -IncomingForm.prototype.write = function(buffer) { - if (!this._parser) { - this._error(new Error('unintialized parser')); - return; - } - - this.bytesReceived += buffer.length; - this.emit('progress', this.bytesReceived, this.bytesExpected); - - var bytesParsed = this._parser.write(buffer); - if (bytesParsed !== buffer.length) { - this._error(new Error('parser error, '+bytesParsed+' of '+buffer.length+' bytes parsed')); - } - - return bytesParsed; -}; - -IncomingForm.prototype.pause = function() { - // this does nothing, unless overwritten in IncomingForm.parse - return false; -}; - -IncomingForm.prototype.resume = function() { - // this does nothing, unless overwritten in IncomingForm.parse - return false; -}; - -IncomingForm.prototype.onPart = function(part) { - // this method can be overwritten by the user - this.handlePart(part); -}; - -IncomingForm.prototype.handlePart = function(part) { - var self = this; - - if (part.filename === undefined) { - var value = '' - , decoder = new StringDecoder(this.encoding); - - part.on('data', function(buffer) { - self._fieldsSize += buffer.length; - if (self._fieldsSize > self.maxFieldsSize) { - self._error(new Error('maxFieldsSize exceeded, received '+self._fieldsSize+' bytes of field data')); - return; - } - value += decoder.write(buffer); - }); - - part.on('end', function() { - self.emit('field', part.name, value); - }); - return; - } - - this._flushing++; - - var file = new File({ - path: this._uploadPath(part.filename), - name: part.filename, - type: part.mime, - hash: self.hash - }); - - this.emit('fileBegin', part.name, file); - - file.open(); - - part.on('data', function(buffer) { - self.pause(); - file.write(buffer, function() { - self.resume(); - }); - }); - - part.on('end', function() { - file.end(function() { - self._flushing--; - self.emit('file', part.name, file); - self._maybeEnd(); - }); - }); -}; - -IncomingForm.prototype._parseContentType = function() { - if (!this.headers['content-type']) { - this._error(new Error('bad content-type header, no content-type')); - return; - } - - if (this.headers['content-type'].match(/urlencoded/i)) { - this._initUrlencoded(); - return; - } - - if (this.headers['content-type'].match(/multipart/i)) { - var m; - if (m = this.headers['content-type'].match(/boundary=(?:"([^"]+)"|([^;]+))/i)) { - this._initMultipart(m[1] || m[2]); - } else { - this._error(new Error('bad content-type header, no multipart boundary')); - } - return; - } - - this._error(new Error('bad content-type header, unknown content-type: '+this.headers['content-type'])); -}; - -IncomingForm.prototype._error = function(err) { - if (this.error) { - return; - } - - this.error = err; - this.pause(); - this.emit('error', err); -}; - -IncomingForm.prototype._parseContentLength = function() { - if (this.headers['content-length']) { - this.bytesReceived = 0; - this.bytesExpected = parseInt(this.headers['content-length'], 10); - this.emit('progress', this.bytesReceived, this.bytesExpected); - } -}; - -IncomingForm.prototype._newParser = function() { - return new MultipartParser(); -}; - -IncomingForm.prototype._initMultipart = function(boundary) { - this.type = 'multipart'; - - var parser = new MultipartParser(), - self = this, - headerField, - headerValue, - part; - - parser.initWithBoundary(boundary); - - parser.onPartBegin = function() { - part = new Stream(); - part.readable = true; - part.headers = {}; - part.name = null; - part.filename = null; - part.mime = null; - headerField = ''; - headerValue = ''; - }; - - parser.onHeaderField = function(b, start, end) { - headerField += b.toString(self.encoding, start, end); - }; - - parser.onHeaderValue = function(b, start, end) { - headerValue += b.toString(self.encoding, start, end); - }; - - parser.onHeaderEnd = function() { - headerField = headerField.toLowerCase(); - part.headers[headerField] = headerValue; - - var m; - if (headerField == 'content-disposition') { - if (m = headerValue.match(/name="([^"]+)"/i)) { - part.name = m[1]; - } - - part.filename = self._fileName(headerValue); - } else if (headerField == 'content-type') { - part.mime = headerValue; - } - - headerField = ''; - headerValue = ''; - }; - - parser.onHeadersEnd = function() { - self.onPart(part); - }; - - parser.onPartData = function(b, start, end) { - part.emit('data', b.slice(start, end)); - }; - - parser.onPartEnd = function() { - part.emit('end'); - }; - - parser.onEnd = function() { - self.ended = true; - self._maybeEnd(); - }; - - this._parser = parser; -}; - -IncomingForm.prototype._fileName = function(headerValue) { - var m = headerValue.match(/filename="(.*?)"($|; )/i) - if (!m) return; - - var filename = m[1].substr(m[1].lastIndexOf('\\') + 1); - filename = filename.replace(/%22/g, '"'); - filename = filename.replace(/&#([\d]{4});/g, function(m, code) { - return String.fromCharCode(code); - }); - return filename; -}; - -IncomingForm.prototype._initUrlencoded = function() { - this.type = 'urlencoded'; - - var parser = new QuerystringParser() - , self = this; - - parser.onField = function(key, val) { - self.emit('field', key, val); - }; - - parser.onEnd = function() { - self.ended = true; - self._maybeEnd(); - }; - - this._parser = parser; -}; - -IncomingForm.prototype._uploadPath = function(filename) { - var name = ''; - for (var i = 0; i < 32; i++) { - name += Math.floor(Math.random() * 16).toString(16); - } - - if (this.keepExtensions) { - var ext = path.extname(filename); - ext = ext.replace(/(\.[a-z0-9]+).*/, '$1') - - name += ext; - } - - return path.join(this.uploadDir, name); -}; - -IncomingForm.prototype._maybeEnd = function() { - if (!this.ended || this._flushing) { - return; - } - - this.emit('end'); -}; diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/lib/index.js b/node_modules/express/node_modules/connect/node_modules/formidable/lib/index.js deleted file mode 100644 index 7a6e3e1..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/lib/index.js +++ /dev/null @@ -1,3 +0,0 @@ -var IncomingForm = require('./incoming_form').IncomingForm; -IncomingForm.IncomingForm = IncomingForm; -module.exports = IncomingForm; diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/lib/multipart_parser.js b/node_modules/express/node_modules/connect/node_modules/formidable/lib/multipart_parser.js deleted file mode 100644 index 9ca567c..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/lib/multipart_parser.js +++ /dev/null @@ -1,312 +0,0 @@ -var Buffer = require('buffer').Buffer, - s = 0, - S = - { PARSER_UNINITIALIZED: s++, - START: s++, - START_BOUNDARY: s++, - HEADER_FIELD_START: s++, - HEADER_FIELD: s++, - HEADER_VALUE_START: s++, - HEADER_VALUE: s++, - HEADER_VALUE_ALMOST_DONE: s++, - HEADERS_ALMOST_DONE: s++, - PART_DATA_START: s++, - PART_DATA: s++, - PART_END: s++, - END: s++, - }, - - f = 1, - F = - { PART_BOUNDARY: f, - LAST_BOUNDARY: f *= 2, - }, - - LF = 10, - CR = 13, - SPACE = 32, - HYPHEN = 45, - COLON = 58, - A = 97, - Z = 122, - - lower = function(c) { - return c | 0x20; - }; - -for (var s in S) { - exports[s] = S[s]; -} - -function MultipartParser() { - this.boundary = null; - this.boundaryChars = null; - this.lookbehind = null; - this.state = S.PARSER_UNINITIALIZED; - - this.index = null; - this.flags = 0; -}; -exports.MultipartParser = MultipartParser; - -MultipartParser.stateToString = function(stateNumber) { - for (var state in S) { - var number = S[state]; - if (number === stateNumber) return state; - } -}; - -MultipartParser.prototype.initWithBoundary = function(str) { - this.boundary = new Buffer(str.length+4); - this.boundary.write('\r\n--', 'ascii', 0); - this.boundary.write(str, 'ascii', 4); - this.lookbehind = new Buffer(this.boundary.length+8); - this.state = S.START; - - this.boundaryChars = {}; - for (var i = 0; i < this.boundary.length; i++) { - this.boundaryChars[this.boundary[i]] = true; - } -}; - -MultipartParser.prototype.write = function(buffer) { - var self = this, - i = 0, - len = buffer.length, - prevIndex = this.index, - index = this.index, - state = this.state, - flags = this.flags, - lookbehind = this.lookbehind, - boundary = this.boundary, - boundaryChars = this.boundaryChars, - boundaryLength = this.boundary.length, - boundaryEnd = boundaryLength - 1, - bufferLength = buffer.length, - c, - cl, - - mark = function(name) { - self[name+'Mark'] = i; - }, - clear = function(name) { - delete self[name+'Mark']; - }, - callback = function(name, buffer, start, end) { - if (start !== undefined && start === end) { - return; - } - - var callbackSymbol = 'on'+name.substr(0, 1).toUpperCase()+name.substr(1); - if (callbackSymbol in self) { - self[callbackSymbol](buffer, start, end); - } - }, - dataCallback = function(name, clear) { - var markSymbol = name+'Mark'; - if (!(markSymbol in self)) { - return; - } - - if (!clear) { - callback(name, buffer, self[markSymbol], buffer.length); - self[markSymbol] = 0; - } else { - callback(name, buffer, self[markSymbol], i); - delete self[markSymbol]; - } - }; - - for (i = 0; i < len; i++) { - c = buffer[i]; - switch (state) { - case S.PARSER_UNINITIALIZED: - return i; - case S.START: - index = 0; - state = S.START_BOUNDARY; - case S.START_BOUNDARY: - if (index == boundary.length - 2) { - if (c != CR) { - return i; - } - index++; - break; - } else if (index - 1 == boundary.length - 2) { - if (c != LF) { - return i; - } - index = 0; - callback('partBegin'); - state = S.HEADER_FIELD_START; - break; - } - - if (c != boundary[index+2]) { - return i; - } - index++; - break; - case S.HEADER_FIELD_START: - state = S.HEADER_FIELD; - mark('headerField'); - index = 0; - case S.HEADER_FIELD: - if (c == CR) { - clear('headerField'); - state = S.HEADERS_ALMOST_DONE; - break; - } - - index++; - if (c == HYPHEN) { - break; - } - - if (c == COLON) { - if (index == 1) { - // empty header field - return i; - } - dataCallback('headerField', true); - state = S.HEADER_VALUE_START; - break; - } - - cl = lower(c); - if (cl < A || cl > Z) { - return i; - } - break; - case S.HEADER_VALUE_START: - if (c == SPACE) { - break; - } - - mark('headerValue'); - state = S.HEADER_VALUE; - case S.HEADER_VALUE: - if (c == CR) { - dataCallback('headerValue', true); - callback('headerEnd'); - state = S.HEADER_VALUE_ALMOST_DONE; - } - break; - case S.HEADER_VALUE_ALMOST_DONE: - if (c != LF) { - return i; - } - state = S.HEADER_FIELD_START; - break; - case S.HEADERS_ALMOST_DONE: - if (c != LF) { - return i; - } - - callback('headersEnd'); - state = S.PART_DATA_START; - break; - case S.PART_DATA_START: - state = S.PART_DATA - mark('partData'); - case S.PART_DATA: - prevIndex = index; - - if (index == 0) { - // boyer-moore derrived algorithm to safely skip non-boundary data - i += boundaryEnd; - while (i < bufferLength && !(buffer[i] in boundaryChars)) { - i += boundaryLength; - } - i -= boundaryEnd; - c = buffer[i]; - } - - if (index < boundary.length) { - if (boundary[index] == c) { - if (index == 0) { - dataCallback('partData', true); - } - index++; - } else { - index = 0; - } - } else if (index == boundary.length) { - index++; - if (c == CR) { - // CR = part boundary - flags |= F.PART_BOUNDARY; - } else if (c == HYPHEN) { - // HYPHEN = end boundary - flags |= F.LAST_BOUNDARY; - } else { - index = 0; - } - } else if (index - 1 == boundary.length) { - if (flags & F.PART_BOUNDARY) { - index = 0; - if (c == LF) { - // unset the PART_BOUNDARY flag - flags &= ~F.PART_BOUNDARY; - callback('partEnd'); - callback('partBegin'); - state = S.HEADER_FIELD_START; - break; - } - } else if (flags & F.LAST_BOUNDARY) { - if (c == HYPHEN) { - callback('partEnd'); - callback('end'); - state = S.END; - } else { - index = 0; - } - } else { - index = 0; - } - } - - if (index > 0) { - // when matching a possible boundary, keep a lookbehind reference - // in case it turns out to be a false lead - lookbehind[index-1] = c; - } else if (prevIndex > 0) { - // if our boundary turned out to be rubbish, the captured lookbehind - // belongs to partData - callback('partData', lookbehind, 0, prevIndex); - prevIndex = 0; - mark('partData'); - - // reconsider the current character even so it interrupted the sequence - // it could be the beginning of a new sequence - i--; - } - - break; - case S.END: - break; - default: - return i; - } - } - - dataCallback('headerField'); - dataCallback('headerValue'); - dataCallback('partData'); - - this.index = index; - this.state = state; - this.flags = flags; - - return len; -}; - -MultipartParser.prototype.end = function() { - if (this.state != S.END) { - return new Error('MultipartParser.end(): stream ended unexpectedly: ' + this.explain()); - } -}; - -MultipartParser.prototype.explain = function() { - return 'state = ' + MultipartParser.stateToString(this.state); -}; diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/lib/querystring_parser.js b/node_modules/express/node_modules/connect/node_modules/formidable/lib/querystring_parser.js deleted file mode 100644 index 63f109e..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/lib/querystring_parser.js +++ /dev/null @@ -1,25 +0,0 @@ -if (global.GENTLY) require = GENTLY.hijack(require); - -// This is a buffering parser, not quite as nice as the multipart one. -// If I find time I'll rewrite this to be fully streaming as well -var querystring = require('querystring'); - -function QuerystringParser() { - this.buffer = ''; -}; -exports.QuerystringParser = QuerystringParser; - -QuerystringParser.prototype.write = function(buffer) { - this.buffer += buffer.toString('ascii'); - return buffer.length; -}; - -QuerystringParser.prototype.end = function() { - var fields = querystring.parse(this.buffer); - for (var field in fields) { - this.onField(field, fields[field]); - } - this.buffer = ''; - - this.onEnd(); -}; \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/lib/util.js b/node_modules/express/node_modules/connect/node_modules/formidable/lib/util.js deleted file mode 100644 index e9493e9..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/lib/util.js +++ /dev/null @@ -1,6 +0,0 @@ -// Backwards compatibility ... -try { - module.exports = require('util'); -} catch (e) { - module.exports = require('sys'); -} diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/Makefile b/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/Makefile deleted file mode 100644 index 01f7140..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -test: - @find test/simple/test-*.js | xargs -n 1 -t node - -.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/Readme.md b/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/Readme.md deleted file mode 100644 index f8f0c66..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/Readme.md +++ /dev/null @@ -1,167 +0,0 @@ -# Gently - -## Purpose - -A node.js module that helps with stubbing and behavior verification. It allows you to test the most remote and nested corners of your code while keeping being fully unobtrusive. - -## Features - -* Overwrite and stub individual object functions -* Verify that all expected calls have been made in the expected order -* Restore stubbed functions to their original behavior -* Detect object / class names from obj.constructor.name and obj.toString() -* Hijack any required module function or class constructor - -## Installation - -Via [npm](http://github.com/isaacs/npm): - - npm install gently@latest - -## Example - -Make sure your dog is working properly: - - function Dog() {} - - Dog.prototype.seeCat = function() { - this.bark('whuf, whuf'); - this.run(); - } - - Dog.prototype.bark = function(bark) { - require('sys').puts(bark); - } - - var gently = new (require('gently')) - , assert = require('assert') - , dog = new Dog(); - - gently.expect(dog, 'bark', function(bark) { - assert.equal(bark, 'whuf, whuf'); - }); - gently.expect(dog, 'run'); - - dog.seeCat(); - -You can also easily test event emitters with this, for example a simple sequence of 2 events emitted by `fs.WriteStream`: - - var gently = new (require('gently')) - , stream = new (require('fs').WriteStream)('my_file.txt'); - - gently.expect(stream, 'emit', function(event) { - assert.equal(event, 'open'); - }); - - gently.expect(stream, 'emit', function(event) { - assert.equal(event, 'drain'); - }); - -For a full read world example, check out this test case: [test-incoming-form.js](http://github.com/felixge/node-formidable/blob/master/test/simple/test-incoming-form.js) (in [node-formdiable](http://github.com/felixge/node-formidable)). - -## API - -### Gently - -#### new Gently() - -Creates a new gently instance. It listens to the process `'exit'` event to make sure all expectations have been verified. - -#### gently.expect(obj, method, [[count], stubFn]) - -Creates an expectation for an objects method to be called. You can optionally specify the call `count` you are expecting, as well as `stubFn` function that will run instead of the original function. - -Returns a reference to the function that is getting overwritten. - -#### gently.expect([count], stubFn) - -Returns a function that is supposed to be executed `count` times, delegating any calls to the provided `stubFn` function. Naming your stubFn closure will help to properly diagnose errors that are being thrown: - - childProcess.exec('ls', gently.expect(function lsCallback(code) { - assert.equal(0, code); - })); - -#### gently.restore(obj, method) - -Restores an object method that has been previously overwritten using `gently.expect()`. - -#### gently.hijack(realRequire) - -Returns a new require functions that catches a reference to all required modules into `gently.hijacked`. - -To use this function, include a line like this in your `'my-module.js'`. - - if (global.GENTLY) require = GENTLY.hijack(require); - - var sys = require('sys'); - exports.hello = function() { - sys.log('world'); - }; - -Now you can write a test for the module above: - - var gently = global.GENTLY = new (require('gently')) - , myModule = require('./my-module'); - - gently.expect(gently.hijacked.sys, 'log', function(str) { - assert.equal(str, 'world'); - }); - - myModule.hello(); - -#### gently.stub(location, [exportsName]) - -Returns a stub class that will be used instead of the real class from the module at `location` with the given `exportsName`. - -This allows to test an OOP version of the previous example, where `'my-module.js'`. - - if (global.GENTLY) require = GENTLY.hijack(require); - - var World = require('./world'); - - exports.hello = function() { - var world = new World(); - world.hello(); - } - -And `world.js` looks like this: - - var sys = require('sys'); - - function World() { - - } - module.exports = World; - - World.prototype.hello = function() { - sys.log('world'); - }; - -Testing `'my-module.js'` can now easily be accomplished: - - var gently = global.GENTLY = new (require('gently')) - , WorldStub = gently.stub('./world') - , myModule = require('./my-module') - , WORLD; - - gently.expect(WorldStub, 'new', function() { - WORLD = this; - }); - - gently.expect(WORLD, 'hello'); - - myModule.hello(); - -#### gently.hijacked - -An object that holds the references to all hijacked modules. - -#### gently.verify([msg]) - -Verifies that all expectations of this gently instance have been satisfied. If not called manually, this method is called when the process `'exit'` event is fired. - -If `msg` is given, it will appear in any error that might be thrown. - -## License - -Gently is licensed under the MIT license. \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/example/dog.js b/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/example/dog.js deleted file mode 100644 index 022fae0..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/example/dog.js +++ /dev/null @@ -1,22 +0,0 @@ -require('../test/common'); -function Dog() {} - -Dog.prototype.seeCat = function() { - this.bark('whuf, whuf'); - this.run(); -} - -Dog.prototype.bark = function(bark) { - require('sys').puts(bark); -} - -var gently = new (require('gently')) - , assert = require('assert') - , dog = new Dog(); - -gently.expect(dog, 'bark', function(bark) { - assert.equal(bark, 'whuf, whuf'); -}); -gently.expect(dog, 'run'); - -dog.seeCat(); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/example/event_emitter.js b/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/example/event_emitter.js deleted file mode 100644 index 7def134..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/example/event_emitter.js +++ /dev/null @@ -1,11 +0,0 @@ -require('../test/common'); -var gently = new (require('gently')) - , stream = new (require('fs').WriteStream)('my_file.txt'); - -gently.expect(stream, 'emit', function(event) { - assert.equal(event, 'open'); -}); - -gently.expect(stream, 'emit', function(event) { - assert.equal(event, 'drain'); -}); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/index.js b/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/index.js deleted file mode 100644 index 69122bd..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./lib/gently'); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/lib/gently/gently.js b/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/lib/gently/gently.js deleted file mode 100644 index 8af0e1e..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/lib/gently/gently.js +++ /dev/null @@ -1,184 +0,0 @@ -var path = require('path'); - -function Gently() { - this.expectations = []; - this.hijacked = {}; - - var self = this; - process.addListener('exit', function() { - self.verify('process exit'); - }); -}; -module.exports = Gently; - -Gently.prototype.stub = function(location, exportsName) { - function Stub() { - return Stub['new'].apply(this, arguments); - }; - - Stub['new'] = function () {}; - - var stubName = 'require('+JSON.stringify(location)+')'; - if (exportsName) { - stubName += '.'+exportsName; - } - - Stub.prototype.toString = Stub.toString = function() { - return stubName; - }; - - var exports = this.hijacked[location] || {}; - if (exportsName) { - exports[exportsName] = Stub; - } else { - exports = Stub; - } - - this.hijacked[location] = exports; - return Stub; -}; - -Gently.prototype.hijack = function(realRequire) { - var self = this; - return function(location) { - return self.hijacked[location] = (self.hijacked[location]) - ? self.hijacked[location] - : realRequire(location); - }; -}; - -Gently.prototype.expect = function(obj, method, count, stubFn) { - if (typeof obj != 'function' && typeof obj != 'object' && typeof obj != 'number') { - throw new Error - ( 'Bad 1st argument for gently.expect(), ' - + 'object, function, or number expected, got: '+(typeof obj) - ); - } else if (typeof obj == 'function' && (typeof method != 'string')) { - // expect(stubFn) interface - stubFn = obj; - obj = null; - method = null; - count = 1; - } else if (typeof method == 'function') { - // expect(count, stubFn) interface - count = obj; - stubFn = method; - obj = null; - method = null; - } else if (typeof count == 'function') { - // expect(obj, method, stubFn) interface - stubFn = count; - count = 1; - } else if (count === undefined) { - // expect(obj, method) interface - count = 1; - } - - var name = this._name(obj, method, stubFn); - this.expectations.push({obj: obj, method: method, stubFn: stubFn, name: name, count: count}); - - var self = this; - function delegate() { - return self._stubFn(this, obj, method, name, Array.prototype.slice.call(arguments)); - } - - if (!obj) { - return delegate; - } - - var original = (obj[method]) - ? obj[method]._original || obj[method] - : undefined; - - obj[method] = delegate; - return obj[method]._original = original; -}; - -Gently.prototype.restore = function(obj, method) { - if (!obj[method] || !obj[method]._original) { - throw new Error(this._name(obj, method)+' is not gently stubbed'); - } - obj[method] = obj[method]._original; -}; - -Gently.prototype.verify = function(msg) { - if (!this.expectations.length) { - return; - } - - var validExpectations = []; - for (var i = 0, l = this.expectations.length; i < l; i++) { - var expectation = this.expectations[i]; - - if (expectation.count > 0) { - validExpectations.push(expectation); - } - } - - this.expectations = []; // reset so that no duplicate verification attempts are made - - if (!validExpectations.length) { - return; - } - - var expectation = validExpectations[0]; - - throw new Error - ( 'Expected call to '+expectation.name+' did not happen' - + ( (msg) - ? ' ('+msg+')' - : '' - ) - ); -}; - -Gently.prototype._stubFn = function(self, obj, method, name, args) { - var expectation = this.expectations[0], obj, method; - - if (!expectation) { - throw new Error('Unexpected call to '+name+', no call was expected'); - } - - if (expectation.obj !== obj || expectation.method !== method) { - throw new Error('Unexpected call to '+name+', expected call to '+ expectation.name); - } - - expectation.count -= 1; - if (expectation.count === 0) { - this.expectations.shift(); - - // autorestore original if its not a closure - // and no more expectations on that object - var has_more_expectations = this.expectations.reduce(function (memo, expectation) { - return memo || (expectation.obj === obj && expectation.method === method); - }, false); - if (obj !== null && method !== null && !has_more_expectations) { - if (typeof obj[method]._original !== 'undefined') { - obj[method] = obj[method]._original; - delete obj[method]._original; - } else { - delete obj[method]; - } - } - } - - if (expectation.stubFn) { - return expectation.stubFn.apply(self, args); - } -}; - -Gently.prototype._name = function(obj, method, stubFn) { - if (obj) { - var objectName = obj.toString(); - if (objectName == '[object Object]' && obj.constructor.name) { - objectName = '['+obj.constructor.name+']'; - } - return (objectName)+'.'+method+'()'; - } - - if (stubFn.name) { - return stubFn.name+'()'; - } - - return '>> '+stubFn.toString()+' <<'; -}; diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/lib/gently/index.js b/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/lib/gently/index.js deleted file mode 100644 index 64c1977..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/lib/gently/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./gently'); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/package.json b/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/package.json deleted file mode 100644 index 9c1b7a0..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "gently", - "version": "0.9.2", - "directories": { - "lib": "./lib/gently" - }, - "main": "./lib/gently/index", - "dependencies": {}, - "devDependencies": {}, - "engines": { - "node": "*" - }, - "optionalDependencies": {} -} diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/test/common.js b/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/test/common.js deleted file mode 100644 index 978b5c5..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/test/common.js +++ /dev/null @@ -1,8 +0,0 @@ -var path = require('path') - , sys = require('sys'); - -require.paths.unshift(path.dirname(__dirname)+'/lib'); - -global.puts = sys.puts; -global.p = function() {sys.error(sys.inspect.apply(null, arguments))};; -global.assert = require('assert'); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/test/simple/test-gently.js b/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/test/simple/test-gently.js deleted file mode 100644 index 4f8fe2d..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/node-gently/test/simple/test-gently.js +++ /dev/null @@ -1,348 +0,0 @@ -require('../common'); -var Gently = require('gently') - , gently; - -function test(test) { - process.removeAllListeners('exit'); - gently = new Gently(); - test(); -} - -test(function constructor() { - assert.deepEqual(gently.expectations, []); - assert.deepEqual(gently.hijacked, {}); - assert.equal(gently.constructor.name, 'Gently'); -}); - -test(function expectBadArgs() { - var BAD_ARG = 'oh no'; - try { - gently.expect(BAD_ARG); - assert.ok(false, 'throw needs to happen'); - } catch (e) { - assert.equal(e.message, 'Bad 1st argument for gently.expect(), object, function, or number expected, got: '+(typeof BAD_ARG)); - } -}); - -test(function expectObjMethod() { - var OBJ = {}, NAME = 'foobar'; - OBJ.foo = function(x) { - return x; - }; - - gently._name = function() { - return NAME; - }; - - var original = OBJ.foo - , stubFn = function() {}; - - (function testAddOne() { - assert.strictEqual(gently.expect(OBJ, 'foo', stubFn), original); - - assert.equal(gently.expectations.length, 1); - var expectation = gently.expectations[0]; - assert.strictEqual(expectation.obj, OBJ); - assert.strictEqual(expectation.method, 'foo'); - assert.strictEqual(expectation.stubFn, stubFn); - assert.strictEqual(expectation.name, NAME); - assert.strictEqual(OBJ.foo._original, original); - })(); - - (function testAddTwo() { - gently.expect(OBJ, 'foo', 2, stubFn); - assert.equal(gently.expectations.length, 2); - assert.strictEqual(OBJ.foo._original, original); - })(); - - (function testAddOneWithoutMock() { - gently.expect(OBJ, 'foo'); - assert.equal(gently.expectations.length, 3); - })(); - - var stubFnCalled = 0, SELF = {}; - gently._stubFn = function(self, obj, method, name, args) { - stubFnCalled++; - assert.strictEqual(self, SELF); - assert.strictEqual(obj, OBJ); - assert.strictEqual(method, 'foo'); - assert.strictEqual(name, NAME); - assert.deepEqual(args, [1, 2]); - return 23; - }; - assert.equal(OBJ.foo.apply(SELF, [1, 2]), 23); - assert.equal(stubFnCalled, 1); -}); - -test(function expectClosure() { - var NAME = 'MY CLOSURE'; - function closureFn() {}; - - gently._name = function() { - return NAME; - }; - - var fn = gently.expect(closureFn); - assert.equal(gently.expectations.length, 1); - var expectation = gently.expectations[0]; - assert.strictEqual(expectation.obj, null); - assert.strictEqual(expectation.method, null); - assert.strictEqual(expectation.stubFn, closureFn); - assert.strictEqual(expectation.name, NAME); - - var stubFnCalled = 0, SELF = {}; - gently._stubFn = function(self, obj, method, name, args) { - stubFnCalled++; - assert.strictEqual(self, SELF); - assert.strictEqual(obj, null); - assert.strictEqual(method, null); - assert.strictEqual(name, NAME); - assert.deepEqual(args, [1, 2]); - return 23; - }; - assert.equal(fn.apply(SELF, [1, 2]), 23); - assert.equal(stubFnCalled, 1); -}); - -test(function expectClosureCount() { - var stubFnCalled = 0; - function closureFn() {stubFnCalled++}; - - var fn = gently.expect(2, closureFn); - assert.equal(gently.expectations.length, 1); - fn(); - assert.equal(gently.expectations.length, 1); - fn(); - assert.equal(stubFnCalled, 2); -}); - -test(function restore() { - var OBJ = {}, NAME = '[my object].myFn()'; - OBJ.foo = function(x) { - return x; - }; - - gently._name = function() { - return NAME; - }; - - var original = OBJ.foo; - gently.expect(OBJ, 'foo'); - gently.restore(OBJ, 'foo'); - assert.strictEqual(OBJ.foo, original); - - (function testError() { - try { - gently.restore(OBJ, 'foo'); - assert.ok(false, 'throw needs to happen'); - } catch (e) { - assert.equal(e.message, NAME+' is not gently stubbed'); - } - })(); -}); - -test(function _stubFn() { - var OBJ1 = {toString: function() {return '[OBJ 1]'}} - , OBJ2 = {toString: function() {return '[OBJ 2]'}, foo: function () {return 'bar';}} - , SELF = {}; - - gently.expect(OBJ1, 'foo', function(x) { - assert.strictEqual(this, SELF); - return x * 2; - }); - - assert.equal(gently._stubFn(SELF, OBJ1, 'foo', 'dummy_name', [5]), 10); - - (function testAutorestore() { - assert.equal(OBJ2.foo(), 'bar'); - - gently.expect(OBJ2, 'foo', function() { - return 'stubbed foo'; - }); - - gently.expect(OBJ2, 'foo', function() { - return "didn't restore yet"; - }); - - assert.equal(gently._stubFn(SELF, OBJ2, 'foo', 'dummy_name', []), 'stubbed foo'); - assert.equal(gently._stubFn(SELF, OBJ2, 'foo', 'dummy_name', []), "didn't restore yet"); - assert.equal(OBJ2.foo(), 'bar'); - assert.deepEqual(gently.expectations, []); - })(); - - (function testNoMoreCallExpected() { - try { - gently._stubFn(SELF, OBJ1, 'foo', 'dummy_name', [5]); - assert.ok(false, 'throw needs to happen'); - } catch (e) { - assert.equal(e.message, 'Unexpected call to dummy_name, no call was expected'); - } - })(); - - (function testDifferentCallExpected() { - gently.expect(OBJ2, 'bar'); - try { - gently._stubFn(SELF, OBJ1, 'foo', 'dummy_name', [5]); - assert.ok(false, 'throw needs to happen'); - } catch (e) { - assert.equal(e.message, 'Unexpected call to dummy_name, expected call to '+gently._name(OBJ2, 'bar')); - } - - assert.equal(gently.expectations.length, 1); - })(); - - (function testNoMockCallback() { - OBJ2.bar(); - assert.equal(gently.expectations.length, 0); - })(); -}); - -test(function stub() { - var LOCATION = './my_class'; - - (function testRegular() { - var Stub = gently.stub(LOCATION); - assert.ok(Stub instanceof Function); - assert.strictEqual(gently.hijacked[LOCATION], Stub); - assert.ok(Stub['new'] instanceof Function); - assert.equal(Stub.toString(), 'require('+JSON.stringify(LOCATION)+')'); - - (function testConstructor() { - var newCalled = 0 - , STUB - , ARGS = ['foo', 'bar']; - - Stub['new'] = function(a, b) { - assert.equal(a, ARGS[0]); - assert.equal(b, ARGS[1]); - newCalled++; - STUB = this; - }; - - var stub = new Stub(ARGS[0], ARGS[1]); - assert.strictEqual(stub, STUB); - assert.equal(newCalled, 1); - assert.equal(stub.toString(), 'require('+JSON.stringify(LOCATION)+')'); - })(); - - (function testUseReturnValueAsInstance() { - var R = {}; - - Stub['new'] = function() { - return R; - }; - - var stub = new Stub(); - assert.strictEqual(stub, R); - - })(); - })(); - - var EXPORTS_NAME = 'MyClass'; - test(function testExportsName() { - var Stub = gently.stub(LOCATION, EXPORTS_NAME); - assert.strictEqual(gently.hijacked[LOCATION][EXPORTS_NAME], Stub); - assert.equal(Stub.toString(), 'require('+JSON.stringify(LOCATION)+').'+EXPORTS_NAME); - - (function testConstructor() { - var stub = new Stub(); - assert.equal(Stub.toString(), 'require('+JSON.stringify(LOCATION)+').'+EXPORTS_NAME); - })(); - }); -}); - -test(function hijack() { - var LOCATION = './foo' - , REQUIRE_CALLS = 0 - , EXPORTS = {} - , REQUIRE = function() { - REQUIRE_CALLS++; - return EXPORTS; - }; - - var hijackedRequire = gently.hijack(REQUIRE); - hijackedRequire(LOCATION); - assert.strictEqual(gently.hijacked[LOCATION], EXPORTS); - - assert.equal(REQUIRE_CALLS, 1); - - // make sure we are caching the hijacked module - hijackedRequire(LOCATION); - assert.equal(REQUIRE_CALLS, 1); -}); - -test(function verify() { - var OBJ = {toString: function() {return '[OBJ]'}}; - gently.verify(); - - gently.expect(OBJ, 'foo'); - try { - gently.verify(); - assert.ok(false, 'throw needs to happen'); - } catch (e) { - assert.equal(e.message, 'Expected call to [OBJ].foo() did not happen'); - } - - try { - gently.verify('foo'); - assert.ok(false, 'throw needs to happen'); - } catch (e) { - assert.equal(e.message, 'Expected call to [OBJ].foo() did not happen (foo)'); - } -}); - -test(function processExit() { - var verifyCalled = 0; - gently.verify = function(msg) { - verifyCalled++; - assert.equal(msg, 'process exit'); - }; - - process.emit('exit'); - assert.equal(verifyCalled, 1); -}); - -test(function _name() { - (function testNamedClass() { - function Foo() {}; - var foo = new Foo(); - assert.equal(gently._name(foo, 'bar'), '[Foo].bar()'); - })(); - - (function testToStringPreference() { - function Foo() {}; - Foo.prototype.toString = function() { - return '[Superman 123]'; - }; - var foo = new Foo(); - assert.equal(gently._name(foo, 'bar'), '[Superman 123].bar()'); - })(); - - (function testUnamedClass() { - var Foo = function() {}; - var foo = new Foo(); - assert.equal(gently._name(foo, 'bar'), foo.toString()+'.bar()'); - })(); - - (function testNamedClosure() { - function myClosure() {}; - assert.equal(gently._name(null, null, myClosure), myClosure.name+'()'); - })(); - - (function testUnamedClosure() { - var myClosure = function() {2+2 == 5}; - assert.equal(gently._name(null, null, myClosure), '>> '+myClosure.toString()+' <<'); - })(); -}); - -test(function verifyExpectNone() { - var OBJ = {toString: function() {return '[OBJ]'}}; - gently.verify(); - - gently.expect(OBJ, 'foo', 0); - try { - gently.verify(); - } catch (e) { - assert.fail('Exception should not have been thrown'); - } -}); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/package.json b/node_modules/express/node_modules/connect/node_modules/formidable/package.json deleted file mode 100644 index 6d368f3..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "formidable", - "version": "1.0.11", - "dependencies": {}, - "devDependencies": { - "gently": "0.8.0", - "findit": "0.1.1", - "hashish": "0.0.4", - "urun": "0.0.4", - "utest": "0.0.3" - }, - "directories": { - "lib": "./lib" - }, - "main": "./lib/index", - "scripts": { - "test": "make test" - }, - "engines": { - "node": "*" - }, - "optionalDependencies": {}, - "readme": "# Formidable\n\n[![Build Status](https://secure.travis-ci.org/felixge/node-formidable.png?branch=master)](http://travis-ci.org/felixge/node-formidable)\n\n## Purpose\n\nA node.js module for parsing form data, especially file uploads.\n\n## Current status\n\nThis module was developed for [Transloadit](http://transloadit.com/), a service focused on uploading\nand encoding images and videos. It has been battle-tested against hundreds of GB of file uploads from\na large variety of clients and is considered production-ready.\n\n## Features\n\n* Fast (~500mb/sec), non-buffering multipart parser\n* Automatically writing file uploads to disk\n* Low memory footprint\n* Graceful error handling\n* Very high test coverage\n\n## Changelog\n\n### v1.0.9\n\n* Emit progress when content length header parsed (Tim Koschützki)\n* Fix Readme syntax due to GitHub changes (goob)\n* Replace references to old 'sys' module in Readme with 'util' (Peter Sugihara)\n\n### v1.0.8\n\n* Strip potentially unsafe characters when using `keepExtensions: true`.\n* Switch to utest / urun for testing\n* Add travis build\n\n### v1.0.7\n\n* Remove file from package that was causing problems when installing on windows. (#102)\n* Fix typos in Readme (Jason Davies).\n\n### v1.0.6\n\n* Do not default to the default to the field name for file uploads where\n filename=\"\".\n\n### v1.0.5\n\n* Support filename=\"\" in multipart parts\n* Explain unexpected end() errors in parser better\n\n**Note:** Starting with this version, formidable emits 'file' events for empty\nfile input fields. Previously those were incorrectly emitted as regular file\ninput fields with value = \"\".\n\n### v1.0.4\n\n* Detect a good default tmp directory regardless of platform. (#88)\n\n### v1.0.3\n\n* Fix problems with utf8 characters (#84) / semicolons in filenames (#58)\n* Small performance improvements\n* New test suite and fixture system\n\n### v1.0.2\n\n* Exclude node\\_modules folder from git\n* Implement new `'aborted'` event\n* Fix files in example folder to work with recent node versions\n* Make gently a devDependency\n\n[See Commits](https://github.com/felixge/node-formidable/compare/v1.0.1...v1.0.2)\n\n### v1.0.1\n\n* Fix package.json to refer to proper main directory. (#68, Dean Landolt)\n\n[See Commits](https://github.com/felixge/node-formidable/compare/v1.0.0...v1.0.1)\n\n### v1.0.0\n\n* Add support for multipart boundaries that are quoted strings. (Jeff Craig)\n\nThis marks the beginning of development on version 2.0 which will include\nseveral architectural improvements.\n\n[See Commits](https://github.com/felixge/node-formidable/compare/v0.9.11...v1.0.0)\n\n### v0.9.11\n\n* Emit `'progress'` event when receiving data, regardless of parsing it. (Tim Koschützki)\n* Use [W3C FileAPI Draft](http://dev.w3.org/2006/webapi/FileAPI/) properties for File class\n\n**Important:** The old property names of the File class will be removed in a\nfuture release.\n\n[See Commits](https://github.com/felixge/node-formidable/compare/v0.9.10...v0.9.11)\n\n### Older releases\n\nThese releases were done before starting to maintain the above Changelog:\n\n* [v0.9.10](https://github.com/felixge/node-formidable/compare/v0.9.9...v0.9.10)\n* [v0.9.9](https://github.com/felixge/node-formidable/compare/v0.9.8...v0.9.9)\n* [v0.9.8](https://github.com/felixge/node-formidable/compare/v0.9.7...v0.9.8)\n* [v0.9.7](https://github.com/felixge/node-formidable/compare/v0.9.6...v0.9.7)\n* [v0.9.6](https://github.com/felixge/node-formidable/compare/v0.9.5...v0.9.6)\n* [v0.9.5](https://github.com/felixge/node-formidable/compare/v0.9.4...v0.9.5)\n* [v0.9.4](https://github.com/felixge/node-formidable/compare/v0.9.3...v0.9.4)\n* [v0.9.3](https://github.com/felixge/node-formidable/compare/v0.9.2...v0.9.3)\n* [v0.9.2](https://github.com/felixge/node-formidable/compare/v0.9.1...v0.9.2)\n* [v0.9.1](https://github.com/felixge/node-formidable/compare/v0.9.0...v0.9.1)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.9.0](https://github.com/felixge/node-formidable/compare/v0.8.0...v0.9.0)\n* [v0.1.0](https://github.com/felixge/node-formidable/commits/v0.1.0)\n\n## Installation\n\nVia [npm](http://github.com/isaacs/npm):\n\n npm install formidable@latest\n\nManually:\n\n git clone git://github.com/felixge/node-formidable.git formidable\n vim my.js\n # var formidable = require('./formidable');\n\nNote: Formidable requires [gently](http://github.com/felixge/node-gently) to run the unit tests, but you won't need it for just using the library.\n\n## Example\n\nParse an incoming file upload.\n\n var formidable = require('formidable'),\n http = require('http'),\n\n util = require('util');\n\n http.createServer(function(req, res) {\n if (req.url == '/upload' && req.method.toLowerCase() == 'post') {\n // parse a file upload\n var form = new formidable.IncomingForm();\n form.parse(req, function(err, fields, files) {\n res.writeHead(200, {'content-type': 'text/plain'});\n res.write('received upload:\\n\\n');\n res.end(util.inspect({fields: fields, files: files}));\n });\n return;\n }\n\n // show a file upload form\n res.writeHead(200, {'content-type': 'text/html'});\n res.end(\n '
    '+\n '
    '+\n '
    '+\n ''+\n '
    '\n );\n }).listen(80);\n\n## API\n\n### formidable.IncomingForm\n\n__new formidable.IncomingForm()__\n\nCreates a new incoming form.\n\n__incomingForm.encoding = 'utf-8'__\n\nThe encoding to use for incoming form fields.\n\n__incomingForm.uploadDir = process.env.TMP || '/tmp' || process.cwd()__\n\nThe directory for placing file uploads in. You can move them later on using\n`fs.rename()`. The default directory is picked at module load time depending on\nthe first existing directory from those listed above.\n\n__incomingForm.keepExtensions = false__\n\nIf you want the files written to `incomingForm.uploadDir` to include the extensions of the original files, set this property to `true`.\n\n__incomingForm.type__\n\nEither 'multipart' or 'urlencoded' depending on the incoming request.\n\n__incomingForm.maxFieldsSize = 2 * 1024 * 1024__\n\nLimits the amount of memory a field (not file) can allocate in bytes.\nIf this value is exceeded, an `'error'` event is emitted. The default\nsize is 2MB.\n\n__incomingForm.hash = false__\n\nIf you want checksums calculated for incoming files, set this to either `'sha1'` or `'md5'`.\n\n__incomingForm.bytesReceived__\n\nThe amount of bytes received for this form so far.\n\n__incomingForm.bytesExpected__\n\nThe expected number of bytes in this form.\n\n__incomingForm.parse(request, [cb])__\n\nParses an incoming node.js `request` containing form data. If `cb` is provided, all fields an files are collected and passed to the callback:\n\n incomingForm.parse(req, function(err, fields, files) {\n // ...\n });\n\n__incomingForm.onPart(part)__\n\nYou may overwrite this method if you are interested in directly accessing the multipart stream. Doing so will disable any `'field'` / `'file'` events processing which would occur otherwise, making you fully responsible for handling the processing.\n\n incomingForm.onPart = function(part) {\n part.addListener('data', function() {\n // ...\n });\n }\n\nIf you want to use formidable to only handle certain parts for you, you can do so:\n\n incomingForm.onPart = function(part) {\n if (!part.filename) {\n // let formidable handle all non-file parts\n incomingForm.handlePart(part);\n }\n }\n\nCheck the code in this method for further inspiration.\n\n__Event: 'progress' (bytesReceived, bytesExpected)__\n\nEmitted after each incoming chunk of data that has been parsed. Can be used to roll your own progress bar.\n\n__Event: 'field' (name, value)__\n\nEmitted whenever a field / value pair has been received.\n\n__Event: 'fileBegin' (name, file)__\n\nEmitted whenever a new file is detected in the upload stream. Use this even if\nyou want to stream the file to somewhere else while buffering the upload on\nthe file system.\n\n__Event: 'file' (name, file)__\n\nEmitted whenever a field / file pair has been received. `file` is an instance of `File`.\n\n__Event: 'error' (err)__\n\nEmitted when there is an error processing the incoming form. A request that experiences an error is automatically paused, you will have to manually call `request.resume()` if you want the request to continue firing `'data'` events.\n\n__Event: 'aborted'__\n\nEmitted when the request was aborted by the user. Right now this can be due to a 'timeout' or 'close' event on the socket. In the future there will be a separate 'timeout' event (needs a change in the node core).\n\n__Event: 'end' ()__\n\nEmitted when the entire request has been received, and all contained files have finished flushing to disk. This is a great place for you to send your response.\n\n### formidable.File\n\n__file.size = 0__\n\nThe size of the uploaded file in bytes. If the file is still being uploaded (see `'fileBegin'` event), this property says how many bytes of the file have been written to disk yet.\n\n__file.path = null__\n\nThe path this file is being written to. You can modify this in the `'fileBegin'` event in\ncase you are unhappy with the way formidable generates a temporary path for your files.\n\n__file.name = null__\n\nThe name this file had according to the uploading client.\n\n__file.type = null__\n\nThe mime type of this file, according to the uploading client.\n\n__file.lastModifiedDate = null__\n\nA date object (or `null`) containing the time this file was last written to. Mostly\nhere for compatibility with the [W3C File API Draft](http://dev.w3.org/2006/webapi/FileAPI/).\n\n__file.hash = null__\n\nIf hash calculation was set, you can read the hex digest out of this var.\n\n## License\n\nFormidable is licensed under the MIT license.\n\n## Ports\n\n* [multipart-parser](http://github.com/FooBarWidget/multipart-parser): a C++ parser based on formidable\n\n## Credits\n\n* [Ryan Dahl](http://twitter.com/ryah) for his work on [http-parser](http://github.com/ry/http-parser) which heavily inspired multipart_parser.js\n", - "_id": "formidable@1.0.11", - "description": "[![Build Status](https://secure.travis-ci.org/felixge/node-formidable.png?branch=master)](http://travis-ci.org/felixge/node-formidable)", - "_from": "formidable@1.0.11" -} diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/common.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/common.js deleted file mode 100644 index eb432ad..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/common.js +++ /dev/null @@ -1,19 +0,0 @@ -var mysql = require('..'); -var path = require('path'); - -var root = path.join(__dirname, '../'); -exports.dir = { - root : root, - lib : root + '/lib', - fixture : root + '/test/fixture', - tmp : root + '/test/tmp', -}; - -exports.port = 13532; - -exports.formidable = require('..'); -exports.assert = require('assert'); - -exports.require = function(lib) { - return require(exports.dir.lib + '/' + lib); -}; diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/funkyfilename.txt b/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/funkyfilename.txt deleted file mode 100644 index e7a4785..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/funkyfilename.txt +++ /dev/null @@ -1 +0,0 @@ -I am a text file with a funky name! diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/plain.txt b/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/plain.txt deleted file mode 100644 index 9b6903e..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/file/plain.txt +++ /dev/null @@ -1 +0,0 @@ -I am a plain text file diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/info.md b/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/info.md deleted file mode 100644 index 3c9dbe3..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/http/special-chars-in-filename/info.md +++ /dev/null @@ -1,3 +0,0 @@ -* Opera does not allow submitting this file, it shows a warning to the - user that the file could not be found instead. Tested in 9.8, 11.51 on OSX. - Reported to Opera on 08.09.2011 (tracking email DSK-346009@bugs.opera.com). diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/no-filename.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/no-filename.js deleted file mode 100644 index 0bae449..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/no-filename.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports['generic.http'] = [ - {type: 'file', name: 'upload', filename: '', fixture: 'plain.txt'}, -]; diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/special-chars-in-filename.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/special-chars-in-filename.js deleted file mode 100644 index eb76fdc..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/js/special-chars-in-filename.js +++ /dev/null @@ -1,21 +0,0 @@ -var properFilename = 'funkyfilename.txt'; - -function expect(filename) { - return [ - {type: 'field', name: 'title', value: 'Weird filename'}, - {type: 'file', name: 'upload', filename: filename, fixture: properFilename}, - ]; -}; - -var webkit = " ? % * | \" < > . ? ; ' @ # $ ^ & ( ) - _ = + { } [ ] ` ~.txt"; -var ffOrIe = " ? % * | \" < > . ☃ ; ' @ # $ ^ & ( ) - _ = + { } [ ] ` ~.txt"; - -module.exports = { - 'osx-chrome-13.http' : expect(webkit), - 'osx-firefox-3.6.http' : expect(ffOrIe), - 'osx-safari-5.http' : expect(webkit), - 'xp-chrome-12.http' : expect(webkit), - 'xp-ie-7.http' : expect(ffOrIe), - 'xp-ie-8.http' : expect(ffOrIe), - 'xp-safari-5.http' : expect(webkit), -}; diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/multipart.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/multipart.js deleted file mode 100644 index a476169..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/fixture/multipart.js +++ /dev/null @@ -1,72 +0,0 @@ -exports['rfc1867'] = - { boundary: 'AaB03x', - raw: - '--AaB03x\r\n'+ - 'content-disposition: form-data; name="field1"\r\n'+ - '\r\n'+ - 'Joe Blow\r\nalmost tricked you!\r\n'+ - '--AaB03x\r\n'+ - 'content-disposition: form-data; name="pics"; filename="file1.txt"\r\n'+ - 'Content-Type: text/plain\r\n'+ - '\r\n'+ - '... contents of file1.txt ...\r\r\n'+ - '--AaB03x--\r\n', - parts: - [ { headers: { - 'content-disposition': 'form-data; name="field1"', - }, - data: 'Joe Blow\r\nalmost tricked you!', - }, - { headers: { - 'content-disposition': 'form-data; name="pics"; filename="file1.txt"', - 'Content-Type': 'text/plain', - }, - data: '... contents of file1.txt ...\r', - } - ] - }; - -exports['noTrailing\r\n'] = - { boundary: 'AaB03x', - raw: - '--AaB03x\r\n'+ - 'content-disposition: form-data; name="field1"\r\n'+ - '\r\n'+ - 'Joe Blow\r\nalmost tricked you!\r\n'+ - '--AaB03x\r\n'+ - 'content-disposition: form-data; name="pics"; filename="file1.txt"\r\n'+ - 'Content-Type: text/plain\r\n'+ - '\r\n'+ - '... contents of file1.txt ...\r\r\n'+ - '--AaB03x--', - parts: - [ { headers: { - 'content-disposition': 'form-data; name="field1"', - }, - data: 'Joe Blow\r\nalmost tricked you!', - }, - { headers: { - 'content-disposition': 'form-data; name="pics"; filename="file1.txt"', - 'Content-Type': 'text/plain', - }, - data: '... contents of file1.txt ...\r', - } - ] - }; - -exports['emptyHeader'] = - { boundary: 'AaB03x', - raw: - '--AaB03x\r\n'+ - 'content-disposition: form-data; name="field1"\r\n'+ - ': foo\r\n'+ - '\r\n'+ - 'Joe Blow\r\nalmost tricked you!\r\n'+ - '--AaB03x\r\n'+ - 'content-disposition: form-data; name="pics"; filename="file1.txt"\r\n'+ - 'Content-Type: text/plain\r\n'+ - '\r\n'+ - '... contents of file1.txt ...\r\r\n'+ - '--AaB03x--\r\n', - expectError: true, - }; diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/integration/test-fixtures.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/integration/test-fixtures.js deleted file mode 100644 index 66ad259..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/integration/test-fixtures.js +++ /dev/null @@ -1,89 +0,0 @@ -var hashish = require('hashish'); -var fs = require('fs'); -var findit = require('findit'); -var path = require('path'); -var http = require('http'); -var net = require('net'); -var assert = require('assert'); - -var common = require('../common'); -var formidable = common.formidable; - -var server = http.createServer(); -server.listen(common.port, findFixtures); - -function findFixtures() { - var fixtures = []; - findit - .sync(common.dir.fixture + '/js') - .forEach(function(jsPath) { - if (!/\.js$/.test(jsPath)) return; - - var group = path.basename(jsPath, '.js'); - hashish.forEach(require(jsPath), function(fixture, name) { - fixtures.push({ - name : group + '/' + name, - fixture : fixture, - }); - }); - }); - - testNext(fixtures); -} - -function testNext(fixtures) { - var fixture = fixtures.shift(); - if (!fixture) return server.close(); - - var name = fixture.name; - var fixture = fixture.fixture; - - uploadFixture(name, function(err, parts) { - if (err) throw err; - - fixture.forEach(function(expectedPart, i) { - var parsedPart = parts[i]; - assert.equal(parsedPart.type, expectedPart.type); - assert.equal(parsedPart.name, expectedPart.name); - - if (parsedPart.type === 'file') { - var filename = parsedPart.value.name; - assert.equal(filename, expectedPart.filename); - } - }); - - testNext(fixtures); - }); -}; - -function uploadFixture(name, cb) { - server.once('request', function(req, res) { - var form = new formidable.IncomingForm(); - form.uploadDir = common.dir.tmp; - form.parse(req); - - function callback() { - var realCallback = cb; - cb = function() {}; - realCallback.apply(null, arguments); - } - - var parts = []; - form - .on('error', callback) - .on('fileBegin', function(name, value) { - parts.push({type: 'file', name: name, value: value}); - }) - .on('field', function(name, value) { - parts.push({type: 'field', name: name, value: value}); - }) - .on('end', function() { - callback(null, parts); - }); - }); - - var socket = net.createConnection(common.port); - var file = fs.createReadStream(common.dir.fixture + '/http/' + name); - - file.pipe(socket); -} diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/common.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/common.js deleted file mode 100644 index 2b98598..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/common.js +++ /dev/null @@ -1,24 +0,0 @@ -var path = require('path'), - fs = require('fs'); - -try { - global.Gently = require('gently'); -} catch (e) { - throw new Error('this test suite requires node-gently'); -} - -exports.lib = path.join(__dirname, '../../lib'); - -global.GENTLY = new Gently(); - -global.assert = require('assert'); -global.TEST_PORT = 13532; -global.TEST_FIXTURES = path.join(__dirname, '../fixture'); -global.TEST_TMP = path.join(__dirname, '../tmp'); - -// Stupid new feature in node that complains about gently attaching too many -// listeners to process 'exit'. This is a workaround until I can think of a -// better way to deal with this. -if (process.setMaxListeners) { - process.setMaxListeners(10000); -} diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/integration/test-multipart-parser.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/integration/test-multipart-parser.js deleted file mode 100644 index 75232aa..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/integration/test-multipart-parser.js +++ /dev/null @@ -1,80 +0,0 @@ -var common = require('../common'); -var CHUNK_LENGTH = 10, - multipartParser = require(common.lib + '/multipart_parser'), - MultipartParser = multipartParser.MultipartParser, - parser = new MultipartParser(), - fixtures = require(TEST_FIXTURES + '/multipart'), - Buffer = require('buffer').Buffer; - -Object.keys(fixtures).forEach(function(name) { - var fixture = fixtures[name], - buffer = new Buffer(Buffer.byteLength(fixture.raw, 'binary')), - offset = 0, - chunk, - nparsed, - - parts = [], - part = null, - headerField, - headerValue, - endCalled = ''; - - parser.initWithBoundary(fixture.boundary); - parser.onPartBegin = function() { - part = {headers: {}, data: ''}; - parts.push(part); - headerField = ''; - headerValue = ''; - }; - - parser.onHeaderField = function(b, start, end) { - headerField += b.toString('ascii', start, end); - }; - - parser.onHeaderValue = function(b, start, end) { - headerValue += b.toString('ascii', start, end); - } - - parser.onHeaderEnd = function() { - part.headers[headerField] = headerValue; - headerField = ''; - headerValue = ''; - }; - - parser.onPartData = function(b, start, end) { - var str = b.toString('ascii', start, end); - part.data += b.slice(start, end); - } - - parser.onEnd = function() { - endCalled = true; - } - - buffer.write(fixture.raw, 'binary', 0); - - while (offset < buffer.length) { - if (offset + CHUNK_LENGTH < buffer.length) { - chunk = buffer.slice(offset, offset+CHUNK_LENGTH); - } else { - chunk = buffer.slice(offset, buffer.length); - } - offset = offset + CHUNK_LENGTH; - - nparsed = parser.write(chunk); - if (nparsed != chunk.length) { - if (fixture.expectError) { - return; - } - puts('-- ERROR --'); - p(chunk.toString('ascii')); - throw new Error(chunk.length+' bytes written, but only '+nparsed+' bytes parsed!'); - } - } - - if (fixture.expectError) { - throw new Error('expected parse error did not happen'); - } - - assert.ok(endCalled); - assert.deepEqual(parts, fixture.parts); -}); diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-file.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-file.js deleted file mode 100644 index 52ceedb..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-file.js +++ /dev/null @@ -1,104 +0,0 @@ -var common = require('../common'); -var WriteStreamStub = GENTLY.stub('fs', 'WriteStream'); - -var File = require(common.lib + '/file'), - EventEmitter = require('events').EventEmitter, - file, - gently; - -function test(test) { - gently = new Gently(); - file = new File(); - test(); - gently.verify(test.name); -} - -test(function constructor() { - assert.ok(file instanceof EventEmitter); - assert.strictEqual(file.size, 0); - assert.strictEqual(file.path, null); - assert.strictEqual(file.name, null); - assert.strictEqual(file.type, null); - assert.strictEqual(file.lastModifiedDate, null); - - assert.strictEqual(file._writeStream, null); - - (function testSetProperties() { - var file2 = new File({foo: 'bar'}); - assert.equal(file2.foo, 'bar'); - })(); -}); - -test(function open() { - var WRITE_STREAM; - file.path = '/foo'; - - gently.expect(WriteStreamStub, 'new', function (path) { - WRITE_STREAM = this; - assert.strictEqual(path, file.path); - }); - - file.open(); - assert.strictEqual(file._writeStream, WRITE_STREAM); -}); - -test(function write() { - var BUFFER = {length: 10}, - CB_STUB, - CB = function() { - CB_STUB.apply(this, arguments); - }; - - file._writeStream = {}; - - gently.expect(file._writeStream, 'write', function (buffer, cb) { - assert.strictEqual(buffer, BUFFER); - - gently.expect(file, 'emit', function (event, bytesWritten) { - assert.ok(file.lastModifiedDate instanceof Date); - assert.equal(event, 'progress'); - assert.equal(bytesWritten, file.size); - }); - - CB_STUB = gently.expect(function writeCb() { - assert.equal(file.size, 10); - }); - - cb(); - - gently.expect(file, 'emit', function (event, bytesWritten) { - assert.equal(event, 'progress'); - assert.equal(bytesWritten, file.size); - }); - - CB_STUB = gently.expect(function writeCb() { - assert.equal(file.size, 20); - }); - - cb(); - }); - - file.write(BUFFER, CB); -}); - -test(function end() { - var CB_STUB, - CB = function() { - CB_STUB.apply(this, arguments); - }; - - file._writeStream = {}; - - gently.expect(file._writeStream, 'end', function (cb) { - gently.expect(file, 'emit', function (event) { - assert.equal(event, 'end'); - }); - - CB_STUB = gently.expect(function endCb() { - }); - - cb(); - }); - - file.end(CB); -}); diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-incoming-form.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-incoming-form.js deleted file mode 100644 index 84de439..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-incoming-form.js +++ /dev/null @@ -1,727 +0,0 @@ -var common = require('../common'); -var MultipartParserStub = GENTLY.stub('./multipart_parser', 'MultipartParser'), - QuerystringParserStub = GENTLY.stub('./querystring_parser', 'QuerystringParser'), - EventEmitterStub = GENTLY.stub('events', 'EventEmitter'), - StreamStub = GENTLY.stub('stream', 'Stream'), - FileStub = GENTLY.stub('./file'); - -var formidable = require(common.lib + '/index'), - IncomingForm = formidable.IncomingForm, - events = require('events'), - fs = require('fs'), - path = require('path'), - Buffer = require('buffer').Buffer, - fixtures = require(TEST_FIXTURES + '/multipart'), - form, - gently; - -function test(test) { - gently = new Gently(); - gently.expect(EventEmitterStub, 'call'); - form = new IncomingForm(); - test(); - gently.verify(test.name); -} - -test(function constructor() { - assert.strictEqual(form.error, null); - assert.strictEqual(form.ended, false); - assert.strictEqual(form.type, null); - assert.strictEqual(form.headers, null); - assert.strictEqual(form.keepExtensions, false); - assert.strictEqual(form.uploadDir, '/tmp'); - assert.strictEqual(form.encoding, 'utf-8'); - assert.strictEqual(form.bytesReceived, null); - assert.strictEqual(form.bytesExpected, null); - assert.strictEqual(form.maxFieldsSize, 2 * 1024 * 1024); - assert.strictEqual(form._parser, null); - assert.strictEqual(form._flushing, 0); - assert.strictEqual(form._fieldsSize, 0); - assert.ok(form instanceof EventEmitterStub); - assert.equal(form.constructor.name, 'IncomingForm'); - - (function testSimpleConstructor() { - gently.expect(EventEmitterStub, 'call'); - var form = IncomingForm(); - assert.ok(form instanceof IncomingForm); - })(); - - (function testSimpleConstructorShortcut() { - gently.expect(EventEmitterStub, 'call'); - var form = formidable(); - assert.ok(form instanceof IncomingForm); - })(); -}); - -test(function parse() { - var REQ = {headers: {}} - , emit = {}; - - gently.expect(form, 'writeHeaders', function(headers) { - assert.strictEqual(headers, REQ.headers); - }); - - var events = ['error', 'aborted', 'data', 'end']; - gently.expect(REQ, 'on', events.length, function(event, fn) { - assert.equal(event, events.shift()); - emit[event] = fn; - return this; - }); - - form.parse(REQ); - - (function testPause() { - gently.expect(REQ, 'pause'); - assert.strictEqual(form.pause(), true); - })(); - - (function testPauseCriticalException() { - form.ended = false; - - var ERR = new Error('dasdsa'); - gently.expect(REQ, 'pause', function() { - throw ERR; - }); - - gently.expect(form, '_error', function(err) { - assert.strictEqual(err, ERR); - }); - - assert.strictEqual(form.pause(), false); - })(); - - (function testPauseHarmlessException() { - form.ended = true; - - var ERR = new Error('dasdsa'); - gently.expect(REQ, 'pause', function() { - throw ERR; - }); - - assert.strictEqual(form.pause(), false); - })(); - - (function testResume() { - gently.expect(REQ, 'resume'); - assert.strictEqual(form.resume(), true); - })(); - - (function testResumeCriticalException() { - form.ended = false; - - var ERR = new Error('dasdsa'); - gently.expect(REQ, 'resume', function() { - throw ERR; - }); - - gently.expect(form, '_error', function(err) { - assert.strictEqual(err, ERR); - }); - - assert.strictEqual(form.resume(), false); - })(); - - (function testResumeHarmlessException() { - form.ended = true; - - var ERR = new Error('dasdsa'); - gently.expect(REQ, 'resume', function() { - throw ERR; - }); - - assert.strictEqual(form.resume(), false); - })(); - - (function testEmitError() { - var ERR = new Error('something bad happened'); - gently.expect(form, '_error',function(err) { - assert.strictEqual(err, ERR); - }); - emit.error(ERR); - })(); - - (function testEmitAborted() { - gently.expect(form, 'emit',function(event) { - assert.equal(event, 'aborted'); - }); - - emit.aborted(); - })(); - - - (function testEmitData() { - var BUFFER = [1, 2, 3]; - gently.expect(form, 'write', function(buffer) { - assert.strictEqual(buffer, BUFFER); - }); - emit.data(BUFFER); - })(); - - (function testEmitEnd() { - form._parser = {}; - - (function testWithError() { - var ERR = new Error('haha'); - gently.expect(form._parser, 'end', function() { - return ERR; - }); - - gently.expect(form, '_error', function(err) { - assert.strictEqual(err, ERR); - }); - - emit.end(); - })(); - - (function testWithoutError() { - gently.expect(form._parser, 'end'); - emit.end(); - })(); - - (function testAfterError() { - form.error = true; - emit.end(); - })(); - })(); - - (function testWithCallback() { - gently.expect(EventEmitterStub, 'call'); - var form = new IncomingForm(), - REQ = {headers: {}}, - parseCalled = 0; - - gently.expect(form, 'writeHeaders'); - gently.expect(REQ, 'on', 4, function() { - return this; - }); - - gently.expect(form, 'on', 4, function(event, fn) { - if (event == 'field') { - fn('field1', 'foo'); - fn('field1', 'bar'); - fn('field2', 'nice'); - } - - if (event == 'file') { - fn('file1', '1'); - fn('file1', '2'); - fn('file2', '3'); - } - - if (event == 'end') { - fn(); - } - return this; - }); - - form.parse(REQ, gently.expect(function parseCbOk(err, fields, files) { - assert.deepEqual(fields, {field1: 'bar', field2: 'nice'}); - assert.deepEqual(files, {file1: '2', file2: '3'}); - })); - - gently.expect(form, 'writeHeaders'); - gently.expect(REQ, 'on', 4, function() { - return this; - }); - - var ERR = new Error('test'); - gently.expect(form, 'on', 3, function(event, fn) { - if (event == 'field') { - fn('foo', 'bar'); - } - - if (event == 'error') { - fn(ERR); - gently.expect(form, 'on'); - } - return this; - }); - - form.parse(REQ, gently.expect(function parseCbErr(err, fields, files) { - assert.strictEqual(err, ERR); - assert.deepEqual(fields, {foo: 'bar'}); - })); - })(); -}); - -test(function pause() { - assert.strictEqual(form.pause(), false); -}); - -test(function resume() { - assert.strictEqual(form.resume(), false); -}); - - -test(function writeHeaders() { - var HEADERS = {}; - gently.expect(form, '_parseContentLength'); - gently.expect(form, '_parseContentType'); - - form.writeHeaders(HEADERS); - assert.strictEqual(form.headers, HEADERS); -}); - -test(function write() { - var parser = {}, - BUFFER = [1, 2, 3]; - - form._parser = parser; - form.bytesExpected = 523423; - - (function testBasic() { - gently.expect(form, 'emit', function(event, bytesReceived, bytesExpected) { - assert.equal(event, 'progress'); - assert.equal(bytesReceived, BUFFER.length); - assert.equal(bytesExpected, form.bytesExpected); - }); - - gently.expect(parser, 'write', function(buffer) { - assert.strictEqual(buffer, BUFFER); - return buffer.length; - }); - - assert.equal(form.write(BUFFER), BUFFER.length); - assert.equal(form.bytesReceived, BUFFER.length); - })(); - - (function testParserError() { - gently.expect(form, 'emit'); - - gently.expect(parser, 'write', function(buffer) { - assert.strictEqual(buffer, BUFFER); - return buffer.length - 1; - }); - - gently.expect(form, '_error', function(err) { - assert.ok(err.message.match(/parser error/i)); - }); - - assert.equal(form.write(BUFFER), BUFFER.length - 1); - assert.equal(form.bytesReceived, BUFFER.length + BUFFER.length); - })(); - - (function testUninitialized() { - delete form._parser; - - gently.expect(form, '_error', function(err) { - assert.ok(err.message.match(/unintialized parser/i)); - }); - form.write(BUFFER); - })(); -}); - -test(function parseContentType() { - var HEADERS = {}; - - form.headers = {'content-type': 'application/x-www-form-urlencoded'}; - gently.expect(form, '_initUrlencoded'); - form._parseContentType(); - - // accept anything that has 'urlencoded' in it - form.headers = {'content-type': 'broken-client/urlencoded-stupid'}; - gently.expect(form, '_initUrlencoded'); - form._parseContentType(); - - var BOUNDARY = '---------------------------57814261102167618332366269'; - form.headers = {'content-type': 'multipart/form-data; boundary='+BOUNDARY}; - - gently.expect(form, '_initMultipart', function(boundary) { - assert.equal(boundary, BOUNDARY); - }); - form._parseContentType(); - - (function testQuotedBoundary() { - form.headers = {'content-type': 'multipart/form-data; boundary="' + BOUNDARY + '"'}; - - gently.expect(form, '_initMultipart', function(boundary) { - assert.equal(boundary, BOUNDARY); - }); - form._parseContentType(); - })(); - - (function testNoBoundary() { - form.headers = {'content-type': 'multipart/form-data'}; - - gently.expect(form, '_error', function(err) { - assert.ok(err.message.match(/no multipart boundary/i)); - }); - form._parseContentType(); - })(); - - (function testNoContentType() { - form.headers = {}; - - gently.expect(form, '_error', function(err) { - assert.ok(err.message.match(/no content-type/i)); - }); - form._parseContentType(); - })(); - - (function testUnknownContentType() { - form.headers = {'content-type': 'invalid'}; - - gently.expect(form, '_error', function(err) { - assert.ok(err.message.match(/unknown content-type/i)); - }); - form._parseContentType(); - })(); -}); - -test(function parseContentLength() { - var HEADERS = {}; - - form.headers = {}; - form._parseContentLength(); - assert.strictEqual(form.bytesReceived, null); - assert.strictEqual(form.bytesExpected, null); - - form.headers['content-length'] = '8'; - gently.expect(form, 'emit', function(event, bytesReceived, bytesExpected) { - assert.equal(event, 'progress'); - assert.equal(bytesReceived, 0); - assert.equal(bytesExpected, 8); - }); - form._parseContentLength(); - assert.strictEqual(form.bytesReceived, 0); - assert.strictEqual(form.bytesExpected, 8); - - // JS can be evil, lets make sure we are not - form.headers['content-length'] = '08'; - gently.expect(form, 'emit', function(event, bytesReceived, bytesExpected) { - assert.equal(event, 'progress'); - assert.equal(bytesReceived, 0); - assert.equal(bytesExpected, 8); - }); - form._parseContentLength(); - assert.strictEqual(form.bytesExpected, 8); -}); - -test(function _initMultipart() { - var BOUNDARY = '123', - PARSER; - - gently.expect(MultipartParserStub, 'new', function() { - PARSER = this; - }); - - gently.expect(MultipartParserStub.prototype, 'initWithBoundary', function(boundary) { - assert.equal(boundary, BOUNDARY); - }); - - form._initMultipart(BOUNDARY); - assert.equal(form.type, 'multipart'); - assert.strictEqual(form._parser, PARSER); - - (function testRegularField() { - var PART; - gently.expect(StreamStub, 'new', function() { - PART = this; - }); - - gently.expect(form, 'onPart', function(part) { - assert.strictEqual(part, PART); - assert.deepEqual - ( part.headers - , { 'content-disposition': 'form-data; name="field1"' - , 'foo': 'bar' - } - ); - assert.equal(part.name, 'field1'); - - var strings = ['hello', ' world']; - gently.expect(part, 'emit', 2, function(event, b) { - assert.equal(event, 'data'); - assert.equal(b.toString(), strings.shift()); - }); - - gently.expect(part, 'emit', function(event, b) { - assert.equal(event, 'end'); - }); - }); - - PARSER.onPartBegin(); - PARSER.onHeaderField(new Buffer('content-disposition'), 0, 10); - PARSER.onHeaderField(new Buffer('content-disposition'), 10, 19); - PARSER.onHeaderValue(new Buffer('form-data; name="field1"'), 0, 14); - PARSER.onHeaderValue(new Buffer('form-data; name="field1"'), 14, 24); - PARSER.onHeaderEnd(); - PARSER.onHeaderField(new Buffer('foo'), 0, 3); - PARSER.onHeaderValue(new Buffer('bar'), 0, 3); - PARSER.onHeaderEnd(); - PARSER.onHeadersEnd(); - PARSER.onPartData(new Buffer('hello world'), 0, 5); - PARSER.onPartData(new Buffer('hello world'), 5, 11); - PARSER.onPartEnd(); - })(); - - (function testFileField() { - var PART; - gently.expect(StreamStub, 'new', function() { - PART = this; - }); - - gently.expect(form, 'onPart', function(part) { - assert.deepEqual - ( part.headers - , { 'content-disposition': 'form-data; name="field2"; filename="C:\\Documents and Settings\\IE\\Must\\Die\\Sun"et.jpg"' - , 'content-type': 'text/plain' - } - ); - assert.equal(part.name, 'field2'); - assert.equal(part.filename, 'Sun"et.jpg'); - assert.equal(part.mime, 'text/plain'); - - gently.expect(part, 'emit', function(event, b) { - assert.equal(event, 'data'); - assert.equal(b.toString(), '... contents of file1.txt ...'); - }); - - gently.expect(part, 'emit', function(event, b) { - assert.equal(event, 'end'); - }); - }); - - PARSER.onPartBegin(); - PARSER.onHeaderField(new Buffer('content-disposition'), 0, 19); - PARSER.onHeaderValue(new Buffer('form-data; name="field2"; filename="C:\\Documents and Settings\\IE\\Must\\Die\\Sun"et.jpg"'), 0, 85); - PARSER.onHeaderEnd(); - PARSER.onHeaderField(new Buffer('Content-Type'), 0, 12); - PARSER.onHeaderValue(new Buffer('text/plain'), 0, 10); - PARSER.onHeaderEnd(); - PARSER.onHeadersEnd(); - PARSER.onPartData(new Buffer('... contents of file1.txt ...'), 0, 29); - PARSER.onPartEnd(); - })(); - - (function testEnd() { - gently.expect(form, '_maybeEnd'); - PARSER.onEnd(); - assert.ok(form.ended); - })(); -}); - -test(function _fileName() { - // TODO - return; -}); - -test(function _initUrlencoded() { - var PARSER; - - gently.expect(QuerystringParserStub, 'new', function() { - PARSER = this; - }); - - form._initUrlencoded(); - assert.equal(form.type, 'urlencoded'); - assert.strictEqual(form._parser, PARSER); - - (function testOnField() { - var KEY = 'KEY', VAL = 'VAL'; - gently.expect(form, 'emit', function(field, key, val) { - assert.equal(field, 'field'); - assert.equal(key, KEY); - assert.equal(val, VAL); - }); - - PARSER.onField(KEY, VAL); - })(); - - (function testOnEnd() { - gently.expect(form, '_maybeEnd'); - - PARSER.onEnd(); - assert.equal(form.ended, true); - })(); -}); - -test(function _error() { - var ERR = new Error('bla'); - - gently.expect(form, 'pause'); - gently.expect(form, 'emit', function(event, err) { - assert.equal(event, 'error'); - assert.strictEqual(err, ERR); - }); - - form._error(ERR); - assert.strictEqual(form.error, ERR); - - // make sure _error only does its thing once - form._error(ERR); -}); - -test(function onPart() { - var PART = {}; - gently.expect(form, 'handlePart', function(part) { - assert.strictEqual(part, PART); - }); - - form.onPart(PART); -}); - -test(function handlePart() { - (function testUtf8Field() { - var PART = new events.EventEmitter(); - PART.name = 'my_field'; - - gently.expect(form, 'emit', function(event, field, value) { - assert.equal(event, 'field'); - assert.equal(field, 'my_field'); - assert.equal(value, 'hello world: €'); - }); - - form.handlePart(PART); - PART.emit('data', new Buffer('hello')); - PART.emit('data', new Buffer(' world: ')); - PART.emit('data', new Buffer([0xE2])); - PART.emit('data', new Buffer([0x82, 0xAC])); - PART.emit('end'); - })(); - - (function testBinaryField() { - var PART = new events.EventEmitter(); - PART.name = 'my_field2'; - - gently.expect(form, 'emit', function(event, field, value) { - assert.equal(event, 'field'); - assert.equal(field, 'my_field2'); - assert.equal(value, 'hello world: '+new Buffer([0xE2, 0x82, 0xAC]).toString('binary')); - }); - - form.encoding = 'binary'; - form.handlePart(PART); - PART.emit('data', new Buffer('hello')); - PART.emit('data', new Buffer(' world: ')); - PART.emit('data', new Buffer([0xE2])); - PART.emit('data', new Buffer([0x82, 0xAC])); - PART.emit('end'); - })(); - - (function testFieldSize() { - form.maxFieldsSize = 8; - var PART = new events.EventEmitter(); - PART.name = 'my_field'; - - gently.expect(form, '_error', function(err) { - assert.equal(err.message, 'maxFieldsSize exceeded, received 9 bytes of field data'); - }); - - form.handlePart(PART); - form._fieldsSize = 1; - PART.emit('data', new Buffer(7)); - PART.emit('data', new Buffer(1)); - })(); - - (function testFilePart() { - var PART = new events.EventEmitter(), - FILE = new events.EventEmitter(), - PATH = '/foo/bar'; - - PART.name = 'my_file'; - PART.filename = 'sweet.txt'; - PART.mime = 'sweet.txt'; - - gently.expect(form, '_uploadPath', function(filename) { - assert.equal(filename, PART.filename); - return PATH; - }); - - gently.expect(FileStub, 'new', function(properties) { - assert.equal(properties.path, PATH); - assert.equal(properties.name, PART.filename); - assert.equal(properties.type, PART.mime); - FILE = this; - - gently.expect(form, 'emit', function (event, field, file) { - assert.equal(event, 'fileBegin'); - assert.strictEqual(field, PART.name); - assert.strictEqual(file, FILE); - }); - - gently.expect(FILE, 'open'); - }); - - form.handlePart(PART); - assert.equal(form._flushing, 1); - - var BUFFER; - gently.expect(form, 'pause'); - gently.expect(FILE, 'write', function(buffer, cb) { - assert.strictEqual(buffer, BUFFER); - gently.expect(form, 'resume'); - // @todo handle cb(new Err) - cb(); - }); - - PART.emit('data', BUFFER = new Buffer('test')); - - gently.expect(FILE, 'end', function(cb) { - gently.expect(form, 'emit', function(event, field, file) { - assert.equal(event, 'file'); - assert.strictEqual(file, FILE); - }); - - gently.expect(form, '_maybeEnd'); - - cb(); - assert.equal(form._flushing, 0); - }); - - PART.emit('end'); - })(); -}); - -test(function _uploadPath() { - (function testUniqueId() { - var UUID_A, UUID_B; - gently.expect(GENTLY.hijacked.path, 'join', function(uploadDir, uuid) { - assert.equal(uploadDir, form.uploadDir); - UUID_A = uuid; - }); - form._uploadPath(); - - gently.expect(GENTLY.hijacked.path, 'join', function(uploadDir, uuid) { - UUID_B = uuid; - }); - form._uploadPath(); - - assert.notEqual(UUID_A, UUID_B); - })(); - - (function testFileExtension() { - form.keepExtensions = true; - var FILENAME = 'foo.jpg', - EXT = '.bar'; - - gently.expect(GENTLY.hijacked.path, 'extname', function(filename) { - assert.equal(filename, FILENAME); - gently.restore(path, 'extname'); - - return EXT; - }); - - gently.expect(GENTLY.hijacked.path, 'join', function(uploadDir, name) { - assert.equal(path.extname(name), EXT); - }); - form._uploadPath(FILENAME); - })(); -}); - -test(function _maybeEnd() { - gently.expect(form, 'emit', 0); - form._maybeEnd(); - - form.ended = true; - form._flushing = 1; - form._maybeEnd(); - - gently.expect(form, 'emit', function(event) { - assert.equal(event, 'end'); - }); - - form.ended = true; - form._flushing = 0; - form._maybeEnd(); -}); diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-multipart-parser.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-multipart-parser.js deleted file mode 100644 index d8dc968..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-multipart-parser.js +++ /dev/null @@ -1,50 +0,0 @@ -var common = require('../common'); -var multipartParser = require(common.lib + '/multipart_parser'), - MultipartParser = multipartParser.MultipartParser, - events = require('events'), - Buffer = require('buffer').Buffer, - parser; - -function test(test) { - parser = new MultipartParser(); - test(); -} - -test(function constructor() { - assert.equal(parser.boundary, null); - assert.equal(parser.state, 0); - assert.equal(parser.flags, 0); - assert.equal(parser.boundaryChars, null); - assert.equal(parser.index, null); - assert.equal(parser.lookbehind, null); - assert.equal(parser.constructor.name, 'MultipartParser'); -}); - -test(function initWithBoundary() { - var boundary = 'abc'; - parser.initWithBoundary(boundary); - assert.deepEqual(Array.prototype.slice.call(parser.boundary), [13, 10, 45, 45, 97, 98, 99]); - assert.equal(parser.state, multipartParser.START); - - assert.deepEqual(parser.boundaryChars, {10: true, 13: true, 45: true, 97: true, 98: true, 99: true}); -}); - -test(function parserError() { - var boundary = 'abc', - buffer = new Buffer(5); - - parser.initWithBoundary(boundary); - buffer.write('--ad', 'ascii', 0); - assert.equal(parser.write(buffer), 3); -}); - -test(function end() { - (function testError() { - assert.equal(parser.end().message, 'MultipartParser.end(): stream ended unexpectedly: ' + parser.explain()); - })(); - - (function testRegular() { - parser.state = multipartParser.END; - assert.strictEqual(parser.end(), undefined); - })(); -}); diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-querystring-parser.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-querystring-parser.js deleted file mode 100644 index 54d3e2d..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/simple/test-querystring-parser.js +++ /dev/null @@ -1,45 +0,0 @@ -var common = require('../common'); -var QuerystringParser = require(common.lib + '/querystring_parser').QuerystringParser, - Buffer = require('buffer').Buffer, - gently, - parser; - -function test(test) { - gently = new Gently(); - parser = new QuerystringParser(); - test(); - gently.verify(test.name); -} - -test(function constructor() { - assert.equal(parser.buffer, ''); - assert.equal(parser.constructor.name, 'QuerystringParser'); -}); - -test(function write() { - var a = new Buffer('a=1'); - assert.equal(parser.write(a), a.length); - - var b = new Buffer('&b=2'); - parser.write(b); - assert.equal(parser.buffer, a + b); -}); - -test(function end() { - var FIELDS = {a: ['b', {c: 'd'}], e: 'f'}; - - gently.expect(GENTLY.hijacked.querystring, 'parse', function(str) { - assert.equal(str, parser.buffer); - return FIELDS; - }); - - gently.expect(parser, 'onField', Object.keys(FIELDS).length, function(key, val) { - assert.deepEqual(FIELDS[key], val); - }); - - gently.expect(parser, 'onEnd'); - - parser.buffer = 'my buffer'; - parser.end(); - assert.equal(parser.buffer, ''); -}); diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/system/test-multi-video-upload.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/system/test-multi-video-upload.js deleted file mode 100644 index 479e46d..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/legacy/system/test-multi-video-upload.js +++ /dev/null @@ -1,75 +0,0 @@ -var common = require('../common'); -var BOUNDARY = '---------------------------10102754414578508781458777923', - FIXTURE = TEST_FIXTURES+'/multi_video.upload', - fs = require('fs'), - util = require(common.lib + '/util'), - http = require('http'), - formidable = require(common.lib + '/index'), - server = http.createServer(); - -server.on('request', function(req, res) { - var form = new formidable.IncomingForm(), - uploads = {}; - - form.uploadDir = TEST_TMP; - form.hash = 'sha1'; - form.parse(req); - - form - .on('fileBegin', function(field, file) { - assert.equal(field, 'upload'); - - var tracker = {file: file, progress: [], ended: false}; - uploads[file.filename] = tracker; - file - .on('progress', function(bytesReceived) { - tracker.progress.push(bytesReceived); - assert.equal(bytesReceived, file.length); - }) - .on('end', function() { - tracker.ended = true; - }); - }) - .on('field', function(field, value) { - assert.equal(field, 'title'); - assert.equal(value, ''); - }) - .on('file', function(field, file) { - assert.equal(field, 'upload'); - assert.strictEqual(uploads[file.filename].file, file); - }) - .on('end', function() { - assert.ok(uploads['shortest_video.flv']); - assert.ok(uploads['shortest_video.flv'].ended); - assert.ok(uploads['shortest_video.flv'].progress.length > 3); - assert.equal(uploads['shortest_video.flv'].file.hash, 'd6a17616c7143d1b1438ceeef6836d1a09186b3a'); - assert.equal(uploads['shortest_video.flv'].progress.slice(-1), uploads['shortest_video.flv'].file.length); - assert.ok(uploads['shortest_video.mp4']); - assert.ok(uploads['shortest_video.mp4'].ended); - assert.ok(uploads['shortest_video.mp4'].progress.length > 3); - assert.equal(uploads['shortest_video.mp4'].file.hash, '937dfd4db263f4887ceae19341dcc8d63bcd557f'); - - server.close(); - res.writeHead(200); - res.end('good'); - }); -}); - -server.listen(TEST_PORT, function() { - var client = http.createClient(TEST_PORT), - stat = fs.statSync(FIXTURE), - headers = { - 'content-type': 'multipart/form-data; boundary='+BOUNDARY, - 'content-length': stat.size, - } - request = client.request('POST', '/', headers), - fixture = new fs.ReadStream(FIXTURE); - - fixture - .on('data', function(b) { - request.write(b); - }) - .on('end', function() { - request.end(); - }); -}); diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/run.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/run.js deleted file mode 100755 index 50b2361..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/run.js +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -require('urun')(__dirname) diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/test/unit/test-incoming-form.js b/node_modules/express/node_modules/connect/node_modules/formidable/test/unit/test-incoming-form.js deleted file mode 100644 index fe2ac1c..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/test/unit/test-incoming-form.js +++ /dev/null @@ -1,63 +0,0 @@ -var common = require('../common'); -var test = require('utest'); -var assert = common.assert; -var IncomingForm = common.require('incoming_form').IncomingForm; -var path = require('path'); - -var form; -test('IncomingForm', { - before: function() { - form = new IncomingForm(); - }, - - '#_fileName with regular characters': function() { - var filename = 'foo.txt'; - assert.equal(form._fileName(makeHeader(filename)), 'foo.txt'); - }, - - '#_fileName with unescaped quote': function() { - var filename = 'my".txt'; - assert.equal(form._fileName(makeHeader(filename)), 'my".txt'); - }, - - '#_fileName with escaped quote': function() { - var filename = 'my%22.txt'; - assert.equal(form._fileName(makeHeader(filename)), 'my".txt'); - }, - - '#_fileName with bad quote and additional sub-header': function() { - var filename = 'my".txt'; - var header = makeHeader(filename) + '; foo="bar"'; - assert.equal(form._fileName(header), filename); - }, - - '#_fileName with semicolon': function() { - var filename = 'my;.txt'; - assert.equal(form._fileName(makeHeader(filename)), 'my;.txt'); - }, - - '#_fileName with utf8 character': function() { - var filename = 'my☃.txt'; - assert.equal(form._fileName(makeHeader(filename)), 'my☃.txt'); - }, - - '#_uploadPath strips harmful characters from extension when keepExtensions': function() { - form.keepExtensions = true; - - var ext = path.extname(form._uploadPath('fine.jpg?foo=bar')); - assert.equal(ext, '.jpg'); - - var ext = path.extname(form._uploadPath('fine?foo=bar')); - assert.equal(ext, ''); - - var ext = path.extname(form._uploadPath('super.cr2+dsad')); - assert.equal(ext, '.cr2'); - - var ext = path.extname(form._uploadPath('super.bar')); - assert.equal(ext, '.bar'); - }, -}); - -function makeHeader(filename) { - return 'Content-Disposition: form-data; name="upload"; filename="' + filename + '"'; -} diff --git a/node_modules/express/node_modules/connect/node_modules/formidable/tool/record.js b/node_modules/express/node_modules/connect/node_modules/formidable/tool/record.js deleted file mode 100644 index 9f1cef8..0000000 --- a/node_modules/express/node_modules/connect/node_modules/formidable/tool/record.js +++ /dev/null @@ -1,47 +0,0 @@ -var http = require('http'); -var fs = require('fs'); -var connections = 0; - -var server = http.createServer(function(req, res) { - var socket = req.socket; - console.log('Request: %s %s -> %s', req.method, req.url, socket.filename); - - req.on('end', function() { - if (req.url !== '/') { - res.end(JSON.stringify({ - method: req.method, - url: req.url, - filename: socket.filename, - })); - return; - } - - res.writeHead(200, {'content-type': 'text/html'}); - res.end( - '
    '+ - '
    '+ - '
    '+ - ''+ - '
    ' - ); - }); -}); - -server.on('connection', function(socket) { - connections++; - - socket.id = connections; - socket.filename = 'connection-' + socket.id + '.http'; - socket.file = fs.createWriteStream(socket.filename); - socket.pipe(socket.file); - - console.log('--> %s', socket.filename); - socket.on('close', function() { - console.log('<-- %s', socket.filename); - }); -}); - -var port = process.env.PORT || 8080; -server.listen(port, function() { - console.log('Recording connections on port %s', port); -}); diff --git a/node_modules/express/node_modules/connect/node_modules/pause/.npmignore b/node_modules/express/node_modules/connect/node_modules/pause/.npmignore deleted file mode 100644 index f1250e5..0000000 --- a/node_modules/express/node_modules/connect/node_modules/pause/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -support -test -examples -*.sock diff --git a/node_modules/express/node_modules/connect/node_modules/pause/History.md b/node_modules/express/node_modules/connect/node_modules/pause/History.md deleted file mode 100644 index c8aa68f..0000000 --- a/node_modules/express/node_modules/connect/node_modules/pause/History.md +++ /dev/null @@ -1,5 +0,0 @@ - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/node_modules/express/node_modules/connect/node_modules/pause/Makefile b/node_modules/express/node_modules/connect/node_modules/pause/Makefile deleted file mode 100644 index 4e9c8d3..0000000 --- a/node_modules/express/node_modules/connect/node_modules/pause/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --require should \ - --reporter spec - -.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/pause/Readme.md b/node_modules/express/node_modules/connect/node_modules/pause/Readme.md deleted file mode 100644 index 1cdd68a..0000000 --- a/node_modules/express/node_modules/connect/node_modules/pause/Readme.md +++ /dev/null @@ -1,29 +0,0 @@ - -# pause - - Pause streams... - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -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. \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/pause/index.js b/node_modules/express/node_modules/connect/node_modules/pause/index.js deleted file mode 100644 index 1b7b379..0000000 --- a/node_modules/express/node_modules/connect/node_modules/pause/index.js +++ /dev/null @@ -1,29 +0,0 @@ - -module.exports = function(obj){ - var onData - , onEnd - , events = []; - - // buffer data - obj.on('data', onData = function(data, encoding){ - events.push(['data', data, encoding]); - }); - - // buffer end - obj.on('end', onEnd = function(data, encoding){ - events.push(['end', data, encoding]); - }); - - return { - end: function(){ - obj.removeListener('data', onData); - obj.removeListener('end', onEnd); - }, - resume: function(){ - this.end(); - for (var i = 0, len = events.length; i < len; ++i) { - obj.emit.apply(obj, events[i]); - } - } - }; -}; \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/pause/package.json b/node_modules/express/node_modules/connect/node_modules/pause/package.json deleted file mode 100644 index 1b66942..0000000 --- a/node_modules/express/node_modules/connect/node_modules/pause/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "pause", - "version": "0.0.1", - "description": "Pause streams...", - "keywords": [], - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "main": "index", - "readme": "\n# pause\n\n Pause streams...\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", - "_id": "pause@0.0.1", - "_from": "pause@0.0.1" -} diff --git a/node_modules/express/node_modules/connect/node_modules/qs/.gitmodules b/node_modules/express/node_modules/connect/node_modules/qs/.gitmodules deleted file mode 100644 index 49e31da..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/.gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -[submodule "support/expresso"] - path = support/expresso - url = git://github.com/visionmedia/expresso.git -[submodule "support/should"] - path = support/should - url = git://github.com/visionmedia/should.js.git diff --git a/node_modules/express/node_modules/connect/node_modules/qs/.npmignore b/node_modules/express/node_modules/connect/node_modules/qs/.npmignore deleted file mode 100644 index 3c3629e..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/.npmignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/node_modules/express/node_modules/connect/node_modules/qs/.travis.yml b/node_modules/express/node_modules/connect/node_modules/qs/.travis.yml deleted file mode 100644 index 2c0a8f6..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.6 - - 0.4 \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/History.md b/node_modules/express/node_modules/connect/node_modules/qs/History.md deleted file mode 100644 index 1feef45..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/History.md +++ /dev/null @@ -1,83 +0,0 @@ - -0.5.1 / 2012-09-18 -================== - - * fix encoded `=`. Closes #43 - -0.5.0 / 2012-05-04 -================== - - * Added component support - -0.4.2 / 2012-02-08 -================== - - * Fixed: ensure objects are created when appropriate not arrays [aheckmann] - -0.4.1 / 2012-01-26 -================== - - * Fixed stringify()ing numbers. Closes #23 - -0.4.0 / 2011-11-21 -================== - - * Allow parsing of an existing object (for `bodyParser()`) [jackyz] - * Replaced expresso with mocha - -0.3.2 / 2011-11-08 -================== - - * Fixed global variable leak - -0.3.1 / 2011-08-17 -================== - - * Added `try/catch` around malformed uri components - * Add test coverage for Array native method bleed-though - -0.3.0 / 2011-07-19 -================== - - * Allow `array[index]` and `object[property]` syntaxes [Aria Stewart] - -0.2.0 / 2011-06-29 -================== - - * Added `qs.stringify()` [Cory Forsyth] - -0.1.0 / 2011-04-13 -================== - - * Added jQuery-ish array support - -0.0.7 / 2011-03-13 -================== - - * Fixed; handle empty string and `== null` in `qs.parse()` [dmit] - allows for convenient `qs.parse(url.parse(str).query)` - -0.0.6 / 2011-02-14 -================== - - * Fixed; support for implicit arrays - -0.0.4 / 2011-02-09 -================== - - * Fixed `+` as a space - -0.0.3 / 2011-02-08 -================== - - * Fixed case when right-hand value contains "]" - -0.0.2 / 2011-02-07 -================== - - * Fixed "=" presence in key - -0.0.1 / 2011-02-07 -================== - - * Initial release \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/Makefile b/node_modules/express/node_modules/connect/node_modules/qs/Makefile deleted file mode 100644 index 0a21cf7..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/Makefile +++ /dev/null @@ -1,12 +0,0 @@ - -test/browser/qs.js: querystring.js - component build package.json test/browser/qs - -querystring.js: lib/head.js lib/querystring.js lib/tail.js - cat $^ > $@ - -test: - @./node_modules/.bin/mocha \ - --ui bdd - -.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/Readme.md b/node_modules/express/node_modules/connect/node_modules/qs/Readme.md deleted file mode 100644 index 27e54a4..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/Readme.md +++ /dev/null @@ -1,58 +0,0 @@ -# node-querystring - - query string parser for node and the browser supporting nesting, as it was removed from `0.3.x`, so this library provides the previous and commonly desired behaviour (and twice as fast). Used by [express](http://expressjs.com), [connect](http://senchalabs.github.com/connect) and others. - -## Installation - - $ npm install qs - -## Examples - -```js -var qs = require('qs'); - -qs.parse('user[name][first]=Tobi&user[email]=tobi@learnboost.com'); -// => { user: { name: { first: 'Tobi' }, email: 'tobi@learnboost.com' } } - -qs.stringify({ user: { name: 'Tobi', email: 'tobi@learnboost.com' }}) -// => user[name]=Tobi&user[email]=tobi%40learnboost.com -``` - -## Testing - -Install dev dependencies: - - $ npm install -d - -and execute: - - $ make test - -browser: - - $ open test/browser/index.html - -## License - -(The MIT License) - -Copyright (c) 2010 TJ Holowaychuk <tj@vision-media.ca> - -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. \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/benchmark.js b/node_modules/express/node_modules/connect/node_modules/qs/benchmark.js deleted file mode 100644 index 97e2c93..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/benchmark.js +++ /dev/null @@ -1,17 +0,0 @@ - -var qs = require('./'); - -var times = 100000 - , start = new Date - , n = times; - -console.log('times: %d', times); - -while (n--) qs.parse('foo=bar'); -console.log('simple: %dms', new Date - start); - -var start = new Date - , n = times; - -while (n--) qs.parse('user[name][first]=tj&user[name][last]=holowaychuk'); -console.log('nested: %dms', new Date - start); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/component.json b/node_modules/express/node_modules/connect/node_modules/qs/component.json deleted file mode 100644 index ba34ead..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/component.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "querystring", - "description": "Querystring parser / stringifier with nesting support", - "keywords": ["querystring", "query", "parser"], - "main": "lib/querystring.js" -} \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/examples.js b/node_modules/express/node_modules/connect/node_modules/qs/examples.js deleted file mode 100644 index 27617b7..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/examples.js +++ /dev/null @@ -1,51 +0,0 @@ - -/** - * Module dependencies. - */ - -var qs = require('./'); - -var obj = qs.parse('foo'); -console.log(obj) - -var obj = qs.parse('foo=bar=baz'); -console.log(obj) - -var obj = qs.parse('users[]'); -console.log(obj) - -var obj = qs.parse('name=tj&email=tj@vision-media.ca'); -console.log(obj) - -var obj = qs.parse('users[]=tj&users[]=tobi&users[]=jane'); -console.log(obj) - -var obj = qs.parse('user[name][first]=tj&user[name][last]=holowaychuk'); -console.log(obj) - -var obj = qs.parse('users[][name][first]=tj&users[][name][last]=holowaychuk'); -console.log(obj) - -var obj = qs.parse('a=a&a=b&a=c'); -console.log(obj) - -var obj = qs.parse('user[tj]=tj&user[tj]=TJ'); -console.log(obj) - -var obj = qs.parse('user[names]=tj&user[names]=TJ&user[names]=Tyler'); -console.log(obj) - -var obj = qs.parse('user[name][first]=tj&user[name][first]=TJ'); -console.log(obj) - -var obj = qs.parse('user[0]=tj&user[1]=TJ'); -console.log(obj) - -var obj = qs.parse('user[0]=tj&user[]=TJ'); -console.log(obj) - -var obj = qs.parse('user[0]=tj&user[foo]=TJ'); -console.log(obj) - -var str = qs.stringify({ user: { name: 'Tobi', email: 'tobi@learnboost.com' }}); -console.log(str); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/index.js b/node_modules/express/node_modules/connect/node_modules/qs/index.js deleted file mode 100644 index d177d20..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/querystring'); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/lib/head.js b/node_modules/express/node_modules/connect/node_modules/qs/lib/head.js deleted file mode 100644 index 55d3817..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/lib/head.js +++ /dev/null @@ -1 +0,0 @@ -;(function(){ diff --git a/node_modules/express/node_modules/connect/node_modules/qs/lib/querystring.js b/node_modules/express/node_modules/connect/node_modules/qs/lib/querystring.js deleted file mode 100644 index d3689bb..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/lib/querystring.js +++ /dev/null @@ -1,262 +0,0 @@ - -/** - * Object#toString() ref for stringify(). - */ - -var toString = Object.prototype.toString; - -/** - * Cache non-integer test regexp. - */ - -var isint = /^[0-9]+$/; - -function promote(parent, key) { - if (parent[key].length == 0) return parent[key] = {}; - var t = {}; - for (var i in parent[key]) t[i] = parent[key][i]; - parent[key] = t; - return t; -} - -function parse(parts, parent, key, val) { - var part = parts.shift(); - // end - if (!part) { - if (Array.isArray(parent[key])) { - parent[key].push(val); - } else if ('object' == typeof parent[key]) { - parent[key] = val; - } else if ('undefined' == typeof parent[key]) { - parent[key] = val; - } else { - parent[key] = [parent[key], val]; - } - // array - } else { - var obj = parent[key] = parent[key] || []; - if (']' == part) { - if (Array.isArray(obj)) { - if ('' != val) obj.push(val); - } else if ('object' == typeof obj) { - obj[Object.keys(obj).length] = val; - } else { - obj = parent[key] = [parent[key], val]; - } - // prop - } else if (~part.indexOf(']')) { - part = part.substr(0, part.length - 1); - if (!isint.test(part) && Array.isArray(obj)) obj = promote(parent, key); - parse(parts, obj, part, val); - // key - } else { - if (!isint.test(part) && Array.isArray(obj)) obj = promote(parent, key); - parse(parts, obj, part, val); - } - } -} - -/** - * Merge parent key/val pair. - */ - -function merge(parent, key, val){ - if (~key.indexOf(']')) { - var parts = key.split('[') - , len = parts.length - , last = len - 1; - parse(parts, parent, 'base', val); - // optimize - } else { - if (!isint.test(key) && Array.isArray(parent.base)) { - var t = {}; - for (var k in parent.base) t[k] = parent.base[k]; - parent.base = t; - } - set(parent.base, key, val); - } - - return parent; -} - -/** - * Parse the given obj. - */ - -function parseObject(obj){ - var ret = { base: {} }; - Object.keys(obj).forEach(function(name){ - merge(ret, name, obj[name]); - }); - return ret.base; -} - -/** - * Parse the given str. - */ - -function parseString(str){ - return String(str) - .split('&') - .reduce(function(ret, pair){ - var eql = pair.indexOf('=') - , brace = lastBraceInKey(pair) - , key = pair.substr(0, brace || eql) - , val = pair.substr(brace || eql, pair.length) - , val = val.substr(val.indexOf('=') + 1, val.length); - - // ?foo - if ('' == key) key = pair, val = ''; - - return merge(ret, decode(key), decode(val)); - }, { base: {} }).base; -} - -/** - * Parse the given query `str` or `obj`, returning an object. - * - * @param {String} str | {Object} obj - * @return {Object} - * @api public - */ - -exports.parse = function(str){ - if (null == str || '' == str) return {}; - return 'object' == typeof str - ? parseObject(str) - : parseString(str); -}; - -/** - * Turn the given `obj` into a query string - * - * @param {Object} obj - * @return {String} - * @api public - */ - -var stringify = exports.stringify = function(obj, prefix) { - if (Array.isArray(obj)) { - return stringifyArray(obj, prefix); - } else if ('[object Object]' == toString.call(obj)) { - return stringifyObject(obj, prefix); - } else if ('string' == typeof obj) { - return stringifyString(obj, prefix); - } else { - return prefix + '=' + obj; - } -}; - -/** - * Stringify the given `str`. - * - * @param {String} str - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyString(str, prefix) { - if (!prefix) throw new TypeError('stringify expects an object'); - return prefix + '=' + encodeURIComponent(str); -} - -/** - * Stringify the given `arr`. - * - * @param {Array} arr - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyArray(arr, prefix) { - var ret = []; - if (!prefix) throw new TypeError('stringify expects an object'); - for (var i = 0; i < arr.length; i++) { - ret.push(stringify(arr[i], prefix + '['+i+']')); - } - return ret.join('&'); -} - -/** - * Stringify the given `obj`. - * - * @param {Object} obj - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyObject(obj, prefix) { - var ret = [] - , keys = Object.keys(obj) - , key; - - for (var i = 0, len = keys.length; i < len; ++i) { - key = keys[i]; - ret.push(stringify(obj[key], prefix - ? prefix + '[' + encodeURIComponent(key) + ']' - : encodeURIComponent(key))); - } - - return ret.join('&'); -} - -/** - * Set `obj`'s `key` to `val` respecting - * the weird and wonderful syntax of a qs, - * where "foo=bar&foo=baz" becomes an array. - * - * @param {Object} obj - * @param {String} key - * @param {String} val - * @api private - */ - -function set(obj, key, val) { - var v = obj[key]; - if (undefined === v) { - obj[key] = val; - } else if (Array.isArray(v)) { - v.push(val); - } else { - obj[key] = [v, val]; - } -} - -/** - * Locate last brace in `str` within the key. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function lastBraceInKey(str) { - var len = str.length - , brace - , c; - for (var i = 0; i < len; ++i) { - c = str[i]; - if (']' == c) brace = false; - if ('[' == c) brace = true; - if ('=' == c && !brace) return i; - } -} - -/** - * Decode `str`. - * - * @param {String} str - * @return {String} - * @api private - */ - -function decode(str) { - try { - return decodeURIComponent(str.replace(/\+/g, ' ')); - } catch (err) { - return str; - } -} diff --git a/node_modules/express/node_modules/connect/node_modules/qs/lib/tail.js b/node_modules/express/node_modules/connect/node_modules/qs/lib/tail.js deleted file mode 100644 index 158693a..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/lib/tail.js +++ /dev/null @@ -1 +0,0 @@ -})(); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/package.json b/node_modules/express/node_modules/connect/node_modules/qs/package.json deleted file mode 100644 index ebf4cc3..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "qs", - "description": "querystring parser", - "version": "0.5.1", - "keywords": [ - "query string", - "parser", - "component" - ], - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/node-querystring.git" - }, - "devDependencies": { - "mocha": "*", - "expect.js": "*" - }, - "component": { - "scripts": { - "querystring": "querystring.js" - } - }, - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "main": "index", - "engines": { - "node": "*" - }, - "readme": "# node-querystring\n\n query string parser for node and the browser supporting nesting, as it was removed from `0.3.x`, so this library provides the previous and commonly desired behaviour (and twice as fast). Used by [express](http://expressjs.com), [connect](http://senchalabs.github.com/connect) and others.\n\n## Installation\n\n $ npm install qs\n\n## Examples\n\n```js\nvar qs = require('qs');\n\nqs.parse('user[name][first]=Tobi&user[email]=tobi@learnboost.com');\n// => { user: { name: { first: 'Tobi' }, email: 'tobi@learnboost.com' } }\n\nqs.stringify({ user: { name: 'Tobi', email: 'tobi@learnboost.com' }})\n// => user[name]=Tobi&user[email]=tobi%40learnboost.com\n```\n\n## Testing\n\nInstall dev dependencies:\n\n $ npm install -d\n\nand execute:\n\n $ make test\n\nbrowser:\n\n $ open test/browser/index.html\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2010 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", - "_id": "qs@0.5.1", - "_from": "qs@0.5.1" -} diff --git a/node_modules/express/node_modules/connect/node_modules/qs/querystring.js b/node_modules/express/node_modules/connect/node_modules/qs/querystring.js deleted file mode 100644 index 7466b06..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/querystring.js +++ /dev/null @@ -1,254 +0,0 @@ -;(function(){ - -/** - * Object#toString() ref for stringify(). - */ - -var toString = Object.prototype.toString; - -/** - * Cache non-integer test regexp. - */ - -var isint = /^[0-9]+$/; - -function promote(parent, key) { - if (parent[key].length == 0) return parent[key] = {}; - var t = {}; - for (var i in parent[key]) t[i] = parent[key][i]; - parent[key] = t; - return t; -} - -function parse(parts, parent, key, val) { - var part = parts.shift(); - // end - if (!part) { - if (Array.isArray(parent[key])) { - parent[key].push(val); - } else if ('object' == typeof parent[key]) { - parent[key] = val; - } else if ('undefined' == typeof parent[key]) { - parent[key] = val; - } else { - parent[key] = [parent[key], val]; - } - // array - } else { - var obj = parent[key] = parent[key] || []; - if (']' == part) { - if (Array.isArray(obj)) { - if ('' != val) obj.push(val); - } else if ('object' == typeof obj) { - obj[Object.keys(obj).length] = val; - } else { - obj = parent[key] = [parent[key], val]; - } - // prop - } else if (~part.indexOf(']')) { - part = part.substr(0, part.length - 1); - if (!isint.test(part) && Array.isArray(obj)) obj = promote(parent, key); - parse(parts, obj, part, val); - // key - } else { - if (!isint.test(part) && Array.isArray(obj)) obj = promote(parent, key); - parse(parts, obj, part, val); - } - } -} - -/** - * Merge parent key/val pair. - */ - -function merge(parent, key, val){ - if (~key.indexOf(']')) { - var parts = key.split('[') - , len = parts.length - , last = len - 1; - parse(parts, parent, 'base', val); - // optimize - } else { - if (!isint.test(key) && Array.isArray(parent.base)) { - var t = {}; - for (var k in parent.base) t[k] = parent.base[k]; - parent.base = t; - } - set(parent.base, key, val); - } - - return parent; -} - -/** - * Parse the given obj. - */ - -function parseObject(obj){ - var ret = { base: {} }; - Object.keys(obj).forEach(function(name){ - merge(ret, name, obj[name]); - }); - return ret.base; -} - -/** - * Parse the given str. - */ - -function parseString(str){ - return String(str) - .split('&') - .reduce(function(ret, pair){ - try{ - pair = decodeURIComponent(pair.replace(/\+/g, ' ')); - } catch(e) { - // ignore - } - - var eql = pair.indexOf('=') - , brace = lastBraceInKey(pair) - , key = pair.substr(0, brace || eql) - , val = pair.substr(brace || eql, pair.length) - , val = val.substr(val.indexOf('=') + 1, val.length); - - // ?foo - if ('' == key) key = pair, val = ''; - - return merge(ret, key, val); - }, { base: {} }).base; -} - -/** - * Parse the given query `str` or `obj`, returning an object. - * - * @param {String} str | {Object} obj - * @return {Object} - * @api public - */ - -exports.parse = function(str){ - if (null == str || '' == str) return {}; - return 'object' == typeof str - ? parseObject(str) - : parseString(str); -}; - -/** - * Turn the given `obj` into a query string - * - * @param {Object} obj - * @return {String} - * @api public - */ - -var stringify = exports.stringify = function(obj, prefix) { - if (Array.isArray(obj)) { - return stringifyArray(obj, prefix); - } else if ('[object Object]' == toString.call(obj)) { - return stringifyObject(obj, prefix); - } else if ('string' == typeof obj) { - return stringifyString(obj, prefix); - } else { - return prefix + '=' + obj; - } -}; - -/** - * Stringify the given `str`. - * - * @param {String} str - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyString(str, prefix) { - if (!prefix) throw new TypeError('stringify expects an object'); - return prefix + '=' + encodeURIComponent(str); -} - -/** - * Stringify the given `arr`. - * - * @param {Array} arr - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyArray(arr, prefix) { - var ret = []; - if (!prefix) throw new TypeError('stringify expects an object'); - for (var i = 0; i < arr.length; i++) { - ret.push(stringify(arr[i], prefix + '['+i+']')); - } - return ret.join('&'); -} - -/** - * Stringify the given `obj`. - * - * @param {Object} obj - * @param {String} prefix - * @return {String} - * @api private - */ - -function stringifyObject(obj, prefix) { - var ret = [] - , keys = Object.keys(obj) - , key; - - for (var i = 0, len = keys.length; i < len; ++i) { - key = keys[i]; - ret.push(stringify(obj[key], prefix - ? prefix + '[' + encodeURIComponent(key) + ']' - : encodeURIComponent(key))); - } - - return ret.join('&'); -} - -/** - * Set `obj`'s `key` to `val` respecting - * the weird and wonderful syntax of a qs, - * where "foo=bar&foo=baz" becomes an array. - * - * @param {Object} obj - * @param {String} key - * @param {String} val - * @api private - */ - -function set(obj, key, val) { - var v = obj[key]; - if (undefined === v) { - obj[key] = val; - } else if (Array.isArray(v)) { - v.push(val); - } else { - obj[key] = [v, val]; - } -} - -/** - * Locate last brace in `str` within the key. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function lastBraceInKey(str) { - var len = str.length - , brace - , c; - for (var i = 0; i < len; ++i) { - c = str[i]; - if (']' == c) brace = false; - if ('[' == c) brace = true; - if ('=' == c && !brace) return i; - } -} -})(); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/test/browser/expect.js b/node_modules/express/node_modules/connect/node_modules/qs/test/browser/expect.js deleted file mode 100644 index 76aa4e8..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/test/browser/expect.js +++ /dev/null @@ -1,1202 +0,0 @@ - -(function (global, module) { - - if ('undefined' == typeof module) { - var module = { exports: {} } - , exports = module.exports - } - - /** - * Exports. - */ - - module.exports = expect; - expect.Assertion = Assertion; - - /** - * Exports version. - */ - - expect.version = '0.1.2'; - - /** - * Possible assertion flags. - */ - - var flags = { - not: ['to', 'be', 'have', 'include', 'only'] - , to: ['be', 'have', 'include', 'only', 'not'] - , only: ['have'] - , have: ['own'] - , be: ['an'] - }; - - function expect (obj) { - return new Assertion(obj); - } - - /** - * Constructor - * - * @api private - */ - - function Assertion (obj, flag, parent) { - this.obj = obj; - this.flags = {}; - - if (undefined != parent) { - this.flags[flag] = true; - - for (var i in parent.flags) { - if (parent.flags.hasOwnProperty(i)) { - this.flags[i] = true; - } - } - } - - var $flags = flag ? flags[flag] : keys(flags) - , self = this - - if ($flags) { - for (var i = 0, l = $flags.length; i < l; i++) { - // avoid recursion - if (this.flags[$flags[i]]) continue; - - var name = $flags[i] - , assertion = new Assertion(this.obj, name, this) - - if ('function' == typeof Assertion.prototype[name]) { - // clone the function, make sure we dont touch the prot reference - var old = this[name]; - this[name] = function () { - return old.apply(self, arguments); - } - - for (var fn in Assertion.prototype) { - if (Assertion.prototype.hasOwnProperty(fn) && fn != name) { - this[name][fn] = bind(assertion[fn], assertion); - } - } - } else { - this[name] = assertion; - } - } - } - }; - - /** - * Performs an assertion - * - * @api private - */ - - Assertion.prototype.assert = function (truth, msg, error) { - var msg = this.flags.not ? error : msg - , ok = this.flags.not ? !truth : truth; - - if (!ok) { - throw new Error(msg); - } - - this.and = new Assertion(this.obj); - }; - - /** - * Check if the value is truthy - * - * @api public - */ - - Assertion.prototype.ok = function () { - this.assert( - !!this.obj - , 'expected ' + i(this.obj) + ' to be truthy' - , 'expected ' + i(this.obj) + ' to be falsy'); - }; - - /** - * Assert that the function throws. - * - * @param {Function|RegExp} callback, or regexp to match error string against - * @api public - */ - - Assertion.prototype.throwError = - Assertion.prototype.throwException = function (fn) { - expect(this.obj).to.be.a('function'); - - var thrown = false - , not = this.flags.not - - try { - this.obj(); - } catch (e) { - if ('function' == typeof fn) { - fn(e); - } else if ('object' == typeof fn) { - var subject = 'string' == typeof e ? e : e.message; - if (not) { - expect(subject).to.not.match(fn); - } else { - expect(subject).to.match(fn); - } - } - thrown = true; - } - - if ('object' == typeof fn && not) { - // in the presence of a matcher, ensure the `not` only applies to - // the matching. - this.flags.not = false; - } - - var name = this.obj.name || 'fn'; - this.assert( - thrown - , 'expected ' + name + ' to throw an exception' - , 'expected ' + name + ' not to throw an exception'); - }; - - /** - * Checks if the array is empty. - * - * @api public - */ - - Assertion.prototype.empty = function () { - var expectation; - - if ('object' == typeof this.obj && null !== this.obj && !isArray(this.obj)) { - if ('number' == typeof this.obj.length) { - expectation = !this.obj.length; - } else { - expectation = !keys(this.obj).length; - } - } else { - if ('string' != typeof this.obj) { - expect(this.obj).to.be.an('object'); - } - - expect(this.obj).to.have.property('length'); - expectation = !this.obj.length; - } - - this.assert( - expectation - , 'expected ' + i(this.obj) + ' to be empty' - , 'expected ' + i(this.obj) + ' to not be empty'); - return this; - }; - - /** - * Checks if the obj exactly equals another. - * - * @api public - */ - - Assertion.prototype.be = - Assertion.prototype.equal = function (obj) { - this.assert( - obj === this.obj - , 'expected ' + i(this.obj) + ' to equal ' + i(obj) - , 'expected ' + i(this.obj) + ' to not equal ' + i(obj)); - return this; - }; - - /** - * Checks if the obj sortof equals another. - * - * @api public - */ - - Assertion.prototype.eql = function (obj) { - this.assert( - expect.eql(obj, this.obj) - , 'expected ' + i(this.obj) + ' to sort of equal ' + i(obj) - , 'expected ' + i(this.obj) + ' to sort of not equal ' + i(obj)); - return this; - }; - - /** - * Assert within start to finish (inclusive). - * - * @param {Number} start - * @param {Number} finish - * @api public - */ - - Assertion.prototype.within = function (start, finish) { - var range = start + '..' + finish; - this.assert( - this.obj >= start && this.obj <= finish - , 'expected ' + i(this.obj) + ' to be within ' + range - , 'expected ' + i(this.obj) + ' to not be within ' + range); - return this; - }; - - /** - * Assert typeof / instance of - * - * @api public - */ - - Assertion.prototype.a = - Assertion.prototype.an = function (type) { - if ('string' == typeof type) { - // proper english in error msg - var n = /^[aeiou]/.test(type) ? 'n' : ''; - - // typeof with support for 'array' - this.assert( - 'array' == type ? isArray(this.obj) : - 'object' == type - ? 'object' == typeof this.obj && null !== this.obj - : type == typeof this.obj - , 'expected ' + i(this.obj) + ' to be a' + n + ' ' + type - , 'expected ' + i(this.obj) + ' not to be a' + n + ' ' + type); - } else { - // instanceof - var name = type.name || 'supplied constructor'; - this.assert( - this.obj instanceof type - , 'expected ' + i(this.obj) + ' to be an instance of ' + name - , 'expected ' + i(this.obj) + ' not to be an instance of ' + name); - } - - return this; - }; - - /** - * Assert numeric value above _n_. - * - * @param {Number} n - * @api public - */ - - Assertion.prototype.greaterThan = - Assertion.prototype.above = function (n) { - this.assert( - this.obj > n - , 'expected ' + i(this.obj) + ' to be above ' + n - , 'expected ' + i(this.obj) + ' to be below ' + n); - return this; - }; - - /** - * Assert numeric value below _n_. - * - * @param {Number} n - * @api public - */ - - Assertion.prototype.lessThan = - Assertion.prototype.below = function (n) { - this.assert( - this.obj < n - , 'expected ' + i(this.obj) + ' to be below ' + n - , 'expected ' + i(this.obj) + ' to be above ' + n); - return this; - }; - - /** - * Assert string value matches _regexp_. - * - * @param {RegExp} regexp - * @api public - */ - - Assertion.prototype.match = function (regexp) { - this.assert( - regexp.exec(this.obj) - , 'expected ' + i(this.obj) + ' to match ' + regexp - , 'expected ' + i(this.obj) + ' not to match ' + regexp); - return this; - }; - - /** - * Assert property "length" exists and has value of _n_. - * - * @param {Number} n - * @api public - */ - - Assertion.prototype.length = function (n) { - expect(this.obj).to.have.property('length'); - var len = this.obj.length; - this.assert( - n == len - , 'expected ' + i(this.obj) + ' to have a length of ' + n + ' but got ' + len - , 'expected ' + i(this.obj) + ' to not have a length of ' + len); - return this; - }; - - /** - * Assert property _name_ exists, with optional _val_. - * - * @param {String} name - * @param {Mixed} val - * @api public - */ - - Assertion.prototype.property = function (name, val) { - if (this.flags.own) { - this.assert( - Object.prototype.hasOwnProperty.call(this.obj, name) - , 'expected ' + i(this.obj) + ' to have own property ' + i(name) - , 'expected ' + i(this.obj) + ' to not have own property ' + i(name)); - return this; - } - - if (this.flags.not && undefined !== val) { - if (undefined === this.obj[name]) { - throw new Error(i(this.obj) + ' has no property ' + i(name)); - } - } else { - var hasProp; - try { - hasProp = name in this.obj - } catch (e) { - hasProp = undefined !== this.obj[name] - } - - this.assert( - hasProp - , 'expected ' + i(this.obj) + ' to have a property ' + i(name) - , 'expected ' + i(this.obj) + ' to not have a property ' + i(name)); - } - - if (undefined !== val) { - this.assert( - val === this.obj[name] - , 'expected ' + i(this.obj) + ' to have a property ' + i(name) - + ' of ' + i(val) + ', but got ' + i(this.obj[name]) - , 'expected ' + i(this.obj) + ' to not have a property ' + i(name) - + ' of ' + i(val)); - } - - this.obj = this.obj[name]; - return this; - }; - - /** - * Assert that the array contains _obj_ or string contains _obj_. - * - * @param {Mixed} obj|string - * @api public - */ - - Assertion.prototype.string = - Assertion.prototype.contain = function (obj) { - if ('string' == typeof this.obj) { - this.assert( - ~this.obj.indexOf(obj) - , 'expected ' + i(this.obj) + ' to contain ' + i(obj) - , 'expected ' + i(this.obj) + ' to not contain ' + i(obj)); - } else { - this.assert( - ~indexOf(this.obj, obj) - , 'expected ' + i(this.obj) + ' to contain ' + i(obj) - , 'expected ' + i(this.obj) + ' to not contain ' + i(obj)); - } - return this; - }; - - /** - * Assert exact keys or inclusion of keys by using - * the `.own` modifier. - * - * @param {Array|String ...} keys - * @api public - */ - - Assertion.prototype.key = - Assertion.prototype.keys = function ($keys) { - var str - , ok = true; - - $keys = isArray($keys) - ? $keys - : Array.prototype.slice.call(arguments); - - if (!$keys.length) throw new Error('keys required'); - - var actual = keys(this.obj) - , len = $keys.length; - - // Inclusion - ok = every($keys, function (key) { - return ~indexOf(actual, key); - }); - - // Strict - if (!this.flags.not && this.flags.only) { - ok = ok && $keys.length == actual.length; - } - - // Key string - if (len > 1) { - $keys = map($keys, function (key) { - return i(key); - }); - var last = $keys.pop(); - str = $keys.join(', ') + ', and ' + last; - } else { - str = i($keys[0]); - } - - // Form - str = (len > 1 ? 'keys ' : 'key ') + str; - - // Have / include - str = (!this.flags.only ? 'include ' : 'only have ') + str; - - // Assertion - this.assert( - ok - , 'expected ' + i(this.obj) + ' to ' + str - , 'expected ' + i(this.obj) + ' to not ' + str); - - return this; - }; - - /** - * Function bind implementation. - */ - - function bind (fn, scope) { - return function () { - return fn.apply(scope, arguments); - } - } - - /** - * Array every compatibility - * - * @see bit.ly/5Fq1N2 - * @api public - */ - - function every (arr, fn, thisObj) { - var scope = thisObj || global; - for (var i = 0, j = arr.length; i < j; ++i) { - if (!fn.call(scope, arr[i], i, arr)) { - return false; - } - } - return true; - }; - - /** - * Array indexOf compatibility. - * - * @see bit.ly/a5Dxa2 - * @api public - */ - - function indexOf (arr, o, i) { - if (Array.prototype.indexOf) { - return Array.prototype.indexOf.call(arr, o, i); - } - - if (arr.length === undefined) { - return -1; - } - - for (var j = arr.length, i = i < 0 ? i + j < 0 ? 0 : i + j : i || 0 - ; i < j && arr[i] !== o; i++); - - return j <= i ? -1 : i; - }; - - /** - * Inspects an object. - * - * @see taken from node.js `util` module (copyright Joyent, MIT license) - * @api private - */ - - function i (obj, showHidden, depth) { - var seen = []; - - function stylize (str) { - return str; - }; - - function format (value, recurseTimes) { - // Provide a hook for user-specified inspect functions. - // Check that value is an object with an inspect function on it - if (value && typeof value.inspect === 'function' && - // Filter out the util module, it's inspect function is special - value !== exports && - // Also filter out any prototype objects using the circular check. - !(value.constructor && value.constructor.prototype === value)) { - return value.inspect(recurseTimes); - } - - // Primitive types cannot have properties - switch (typeof value) { - case 'undefined': - return stylize('undefined', 'undefined'); - - case 'string': - var simple = '\'' + json.stringify(value).replace(/^"|"$/g, '') - .replace(/'/g, "\\'") - .replace(/\\"/g, '"') + '\''; - return stylize(simple, 'string'); - - case 'number': - return stylize('' + value, 'number'); - - case 'boolean': - return stylize('' + value, 'boolean'); - } - // For some reason typeof null is "object", so special case here. - if (value === null) { - return stylize('null', 'null'); - } - - // Look up the keys of the object. - var visible_keys = keys(value); - var $keys = showHidden ? Object.getOwnPropertyNames(value) : visible_keys; - - // Functions without properties can be shortcutted. - if (typeof value === 'function' && $keys.length === 0) { - if (isRegExp(value)) { - return stylize('' + value, 'regexp'); - } else { - var name = value.name ? ': ' + value.name : ''; - return stylize('[Function' + name + ']', 'special'); - } - } - - // Dates without properties can be shortcutted - if (isDate(value) && $keys.length === 0) { - return stylize(value.toUTCString(), 'date'); - } - - var base, type, braces; - // Determine the object type - if (isArray(value)) { - type = 'Array'; - braces = ['[', ']']; - } else { - type = 'Object'; - braces = ['{', '}']; - } - - // Make functions say that they are functions - if (typeof value === 'function') { - var n = value.name ? ': ' + value.name : ''; - base = (isRegExp(value)) ? ' ' + value : ' [Function' + n + ']'; - } else { - base = ''; - } - - // Make dates with properties first say the date - if (isDate(value)) { - base = ' ' + value.toUTCString(); - } - - if ($keys.length === 0) { - return braces[0] + base + braces[1]; - } - - if (recurseTimes < 0) { - if (isRegExp(value)) { - return stylize('' + value, 'regexp'); - } else { - return stylize('[Object]', 'special'); - } - } - - seen.push(value); - - var output = map($keys, function (key) { - var name, str; - if (value.__lookupGetter__) { - if (value.__lookupGetter__(key)) { - if (value.__lookupSetter__(key)) { - str = stylize('[Getter/Setter]', 'special'); - } else { - str = stylize('[Getter]', 'special'); - } - } else { - if (value.__lookupSetter__(key)) { - str = stylize('[Setter]', 'special'); - } - } - } - if (indexOf(visible_keys, key) < 0) { - name = '[' + key + ']'; - } - if (!str) { - if (indexOf(seen, value[key]) < 0) { - if (recurseTimes === null) { - str = format(value[key]); - } else { - str = format(value[key], recurseTimes - 1); - } - if (str.indexOf('\n') > -1) { - if (isArray(value)) { - str = map(str.split('\n'), function (line) { - return ' ' + line; - }).join('\n').substr(2); - } else { - str = '\n' + map(str.split('\n'), function (line) { - return ' ' + line; - }).join('\n'); - } - } - } else { - str = stylize('[Circular]', 'special'); - } - } - if (typeof name === 'undefined') { - if (type === 'Array' && key.match(/^\d+$/)) { - return str; - } - name = json.stringify('' + key); - if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { - name = name.substr(1, name.length - 2); - name = stylize(name, 'name'); - } else { - name = name.replace(/'/g, "\\'") - .replace(/\\"/g, '"') - .replace(/(^"|"$)/g, "'"); - name = stylize(name, 'string'); - } - } - - return name + ': ' + str; - }); - - seen.pop(); - - var numLinesEst = 0; - var length = reduce(output, function (prev, cur) { - numLinesEst++; - if (indexOf(cur, '\n') >= 0) numLinesEst++; - return prev + cur.length + 1; - }, 0); - - if (length > 50) { - output = braces[0] + - (base === '' ? '' : base + '\n ') + - ' ' + - output.join(',\n ') + - ' ' + - braces[1]; - - } else { - output = braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; - } - - return output; - } - return format(obj, (typeof depth === 'undefined' ? 2 : depth)); - }; - - function isArray (ar) { - return Object.prototype.toString.call(ar) == '[object Array]'; - }; - - function isRegExp(re) { - var s = '' + re; - return re instanceof RegExp || // easy case - // duck-type for context-switching evalcx case - typeof(re) === 'function' && - re.constructor.name === 'RegExp' && - re.compile && - re.test && - re.exec && - s.match(/^\/.*\/[gim]{0,3}$/); - }; - - function isDate(d) { - if (d instanceof Date) return true; - return false; - }; - - function keys (obj) { - if (Object.keys) { - return Object.keys(obj); - } - - var keys = []; - - for (var i in obj) { - if (Object.prototype.hasOwnProperty.call(obj, i)) { - keys.push(i); - } - } - - return keys; - } - - function map (arr, mapper, that) { - if (Array.prototype.map) { - return Array.prototype.map.call(arr, mapper, that); - } - - var other= new Array(arr.length); - - for (var i= 0, n = arr.length; i= 2) { - var rv = arguments[1]; - } else { - do { - if (i in this) { - rv = this[i++]; - break; - } - - // if array contains no values, no initial value to return - if (++i >= len) - throw new TypeError(); - } while (true); - } - - for (; i < len; i++) { - if (i in this) - rv = fun.call(null, rv, this[i], i, this); - } - - return rv; - }; - - /** - * Asserts deep equality - * - * @see taken from node.js `assert` module (copyright Joyent, MIT license) - * @api private - */ - - expect.eql = function eql (actual, expected) { - // 7.1. All identical values are equivalent, as determined by ===. - if (actual === expected) { - return true; - } else if ('undefined' != typeof Buffer - && Buffer.isBuffer(actual) && Buffer.isBuffer(expected)) { - if (actual.length != expected.length) return false; - - for (var i = 0; i < actual.length; i++) { - if (actual[i] !== expected[i]) return false; - } - - return true; - - // 7.2. If the expected value is a Date object, the actual value is - // equivalent if it is also a Date object that refers to the same time. - } else if (actual instanceof Date && expected instanceof Date) { - return actual.getTime() === expected.getTime(); - - // 7.3. Other pairs that do not both pass typeof value == "object", - // equivalence is determined by ==. - } else if (typeof actual != 'object' && typeof expected != 'object') { - return actual == expected; - - // 7.4. For all other Object pairs, including Array objects, equivalence is - // determined by having the same number of owned properties (as verified - // with Object.prototype.hasOwnProperty.call), the same set of keys - // (although not necessarily the same order), equivalent values for every - // corresponding key, and an identical "prototype" property. Note: this - // accounts for both named and indexed properties on Arrays. - } else { - return objEquiv(actual, expected); - } - } - - function isUndefinedOrNull (value) { - return value === null || value === undefined; - } - - function isArguments (object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; - } - - function objEquiv (a, b) { - if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) - return false; - // an identical "prototype" property. - if (a.prototype !== b.prototype) return false; - //~~~I've managed to break Object.keys through screwy arguments passing. - // Converting to array solves the problem. - if (isArguments(a)) { - if (!isArguments(b)) { - return false; - } - a = pSlice.call(a); - b = pSlice.call(b); - return expect.eql(a, b); - } - try{ - var ka = keys(a), - kb = keys(b), - key, i; - } catch (e) {//happens when one is a string literal and the other isn't - return false; - } - // having the same number of owned properties (keys incorporates hasOwnProperty) - if (ka.length != kb.length) - return false; - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] != kb[i]) - return false; - } - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!expect.eql(a[key], b[key])) - return false; - } - return true; - } - - var json = (function () { - "use strict"; - - if ('object' == typeof JSON && JSON.parse && JSON.stringify) { - return { - parse: nativeJSON.parse - , stringify: nativeJSON.stringify - } - } - - var JSON = {}; - - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - function date(d, key) { - return isFinite(d.valueOf()) ? - d.getUTCFullYear() + '-' + - f(d.getUTCMonth() + 1) + '-' + - f(d.getUTCDate()) + 'T' + - f(d.getUTCHours()) + ':' + - f(d.getUTCMinutes()) + ':' + - f(d.getUTCSeconds()) + 'Z' : null; - }; - - var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - gap, - indent, - meta = { // table of character substitutions - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '"' : '\\"', - '\\': '\\\\' - }, - rep; - - - function quote(string) { - - // If the string contains no control characters, no quote characters, and no - // backslash characters, then we can safely slap some quotes around it. - // Otherwise we must also replace the offending characters with safe escape - // sequences. - - escapable.lastIndex = 0; - return escapable.test(string) ? '"' + string.replace(escapable, function (a) { - var c = meta[a]; - return typeof c === 'string' ? c : - '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }) + '"' : '"' + string + '"'; - } - - - function str(key, holder) { - - // Produce a string from holder[key]. - - var i, // The loop counter. - k, // The member key. - v, // The member value. - length, - mind = gap, - partial, - value = holder[key]; - - // If the value has a toJSON method, call it to obtain a replacement value. - - if (value instanceof Date) { - value = date(key); - } - - // If we were called with a replacer function, then call the replacer to - // obtain a replacement value. - - if (typeof rep === 'function') { - value = rep.call(holder, key, value); - } - - // What happens next depends on the value's type. - - switch (typeof value) { - case 'string': - return quote(value); - - case 'number': - - // JSON numbers must be finite. Encode non-finite numbers as null. - - return isFinite(value) ? String(value) : 'null'; - - case 'boolean': - case 'null': - - // If the value is a boolean or null, convert it to a string. Note: - // typeof null does not produce 'null'. The case is included here in - // the remote chance that this gets fixed someday. - - return String(value); - - // If the type is 'object', we might be dealing with an object or an array or - // null. - - case 'object': - - // Due to a specification blunder in ECMAScript, typeof null is 'object', - // so watch out for that case. - - if (!value) { - return 'null'; - } - - // Make an array to hold the partial results of stringifying this object value. - - gap += indent; - partial = []; - - // Is the value an array? - - if (Object.prototype.toString.apply(value) === '[object Array]') { - - // The value is an array. Stringify every element. Use null as a placeholder - // for non-JSON values. - - length = value.length; - for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || 'null'; - } - - // Join all of the elements together, separated with commas, and wrap them in - // brackets. - - v = partial.length === 0 ? '[]' : gap ? - '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : - '[' + partial.join(',') + ']'; - gap = mind; - return v; - } - - // If the replacer is an array, use it to select the members to be stringified. - - if (rep && typeof rep === 'object') { - length = rep.length; - for (i = 0; i < length; i += 1) { - if (typeof rep[i] === 'string') { - k = rep[i]; - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } else { - - // Otherwise, iterate through all of the keys in the object. - - for (k in value) { - if (Object.prototype.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } - - // Join all of the member texts together, separated with commas, - // and wrap them in braces. - - v = partial.length === 0 ? '{}' : gap ? - '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : - '{' + partial.join(',') + '}'; - gap = mind; - return v; - } - } - - // If the JSON object does not yet have a stringify method, give it one. - - JSON.stringify = function (value, replacer, space) { - - // The stringify method takes a value and an optional replacer, and an optional - // space parameter, and returns a JSON text. The replacer can be a function - // that can replace values, or an array of strings that will select the keys. - // A default replacer method can be provided. Use of the space parameter can - // produce text that is more easily readable. - - var i; - gap = ''; - indent = ''; - - // If the space parameter is a number, make an indent string containing that - // many spaces. - - if (typeof space === 'number') { - for (i = 0; i < space; i += 1) { - indent += ' '; - } - - // If the space parameter is a string, it will be used as the indent string. - - } else if (typeof space === 'string') { - indent = space; - } - - // If there is a replacer, it must be a function or an array. - // Otherwise, throw an error. - - rep = replacer; - if (replacer && typeof replacer !== 'function' && - (typeof replacer !== 'object' || - typeof replacer.length !== 'number')) { - throw new Error('JSON.stringify'); - } - - // Make a fake root object containing our value under the key of ''. - // Return the result of stringifying the value. - - return str('', {'': value}); - }; - - // If the JSON object does not yet have a parse method, give it one. - - JSON.parse = function (text, reviver) { - // The parse method takes a text and an optional reviver function, and returns - // a JavaScript value if the text is a valid JSON text. - - var j; - - function walk(holder, key) { - - // The walk method is used to recursively walk the resulting structure so - // that modifications can be made. - - var k, v, value = holder[key]; - if (value && typeof value === 'object') { - for (k in value) { - if (Object.prototype.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== undefined) { - value[k] = v; - } else { - delete value[k]; - } - } - } - } - return reviver.call(holder, key, value); - } - - - // Parsing happens in four stages. In the first stage, we replace certain - // Unicode characters with escape sequences. JavaScript handles many characters - // incorrectly, either silently deleting them, or treating them as line endings. - - text = String(text); - cx.lastIndex = 0; - if (cx.test(text)) { - text = text.replace(cx, function (a) { - return '\\u' + - ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }); - } - - // In the second stage, we run the text against regular expressions that look - // for non-JSON patterns. We are especially concerned with '()' and 'new' - // because they can cause invocation, and '=' because it can cause mutation. - // But just to be safe, we want to reject all unexpected forms. - - // We split the second stage into 4 regexp operations in order to work around - // crippling inefficiencies in IE's and Safari's regexp engines. First we - // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we - // replace all simple value tokens with ']' characters. Third, we delete all - // open brackets that follow a colon or comma or that begin the text. Finally, - // we look to see that the remaining characters are only whitespace or ']' or - // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. - - if (/^[\],:{}\s]*$/ - .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') - .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') - .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { - - // In the third stage we use the eval function to compile the text into a - // JavaScript structure. The '{' operator is subject to a syntactic ambiguity - // in JavaScript: it can begin a block or an object literal. We wrap the text - // in parens to eliminate the ambiguity. - - j = eval('(' + text + ')'); - - // In the optional fourth stage, we recursively walk the new structure, passing - // each name/value pair to a reviver function for possible transformation. - - return typeof reviver === 'function' ? - walk({'': j}, '') : j; - } - - // If the text is not JSON parseable, then a SyntaxError is thrown. - - throw new SyntaxError('JSON.parse'); - }; - - return JSON; - })(); - - if ('undefined' != typeof window) { - window.expect = module.exports; - } - -})( - this - , 'undefined' != typeof module ? module : {} - , 'undefined' != typeof exports ? exports : {} -); \ No newline at end of file diff --git a/node_modules/express/node_modules/connect/node_modules/qs/test/browser/index.html b/node_modules/express/node_modules/connect/node_modules/qs/test/browser/index.html deleted file mode 100644 index c73147a..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/test/browser/index.html +++ /dev/null @@ -1,18 +0,0 @@ - - - Mocha - - - - - - - - - - - - -
    - - diff --git a/node_modules/express/node_modules/connect/node_modules/qs/test/browser/jquery.js b/node_modules/express/node_modules/connect/node_modules/qs/test/browser/jquery.js deleted file mode 100644 index f3201aa..0000000 --- a/node_modules/express/node_modules/connect/node_modules/qs/test/browser/jquery.js +++ /dev/null @@ -1,8981 +0,0 @@ -/*! - * jQuery JavaScript Library v1.6.2 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Thu Jun 30 14:16:56 2011 -0400 - */ -(function( window, undefined ) { - -// Use the correct document accordingly with window argument (sandbox) -var document = window.document, - navigator = window.navigator, - location = window.location; -var jQuery = (function() { - -// Define a local copy of jQuery -var jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context, rootjQuery ); - }, - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$, - - // A central reference to the root jQuery(document) - rootjQuery, - - // A simple way to check for HTML strings or ID strings - // (both of which we optimize for) - quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, - - // Check if a string has a non-whitespace character in it - rnotwhite = /\S/, - - // Used for trimming whitespace - trimLeft = /^\s+/, - trimRight = /\s+$/, - - // Check for digits - rdigit = /\d/, - - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, - - // JSON RegExp - rvalidchars = /^[\],:{}\s]*$/, - rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, - rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, - rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, - - // Useragent RegExp - rwebkit = /(webkit)[ \/]([\w.]+)/, - ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, - rmsie = /(msie) ([\w.]+)/, - rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, - - // Matches dashed string for camelizing - rdashAlpha = /-([a-z])/ig, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }, - - // Keep a UserAgent string for use with jQuery.browser - userAgent = navigator.userAgent, - - // For matching the engine and version of the browser - browserMatch, - - // The deferred used on DOM ready - readyList, - - // The ready event handler - DOMContentLoaded, - - // Save a reference to some core methods - toString = Object.prototype.toString, - hasOwn = Object.prototype.hasOwnProperty, - push = Array.prototype.push, - slice = Array.prototype.slice, - trim = String.prototype.trim, - indexOf = Array.prototype.indexOf, - - // [[Class]] -> type pairs - class2type = {}; - -jQuery.fn = jQuery.prototype = { - constructor: jQuery, - init: function( selector, context, rootjQuery ) { - var match, elem, ret, doc; - - // Handle $(""), $(null), or $(undefined) - if ( !selector ) { - return this; - } - - // Handle $(DOMElement) - if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - } - - // The body element only exists once, optimize finding it - if ( selector === "body" && !context && document.body ) { - this.context = document; - this[0] = document.body; - this.selector = selector; - this.length = 1; - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - // Are we dealing with HTML string or an ID? - 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 = quickExpr.exec( selector ); - } - - // Verify a match, and that no context was specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - doc = (context ? context.ownerDocument || context : document); - - // If a single string is passed in and it's a single tag - // just do a createElement and skip the rest - ret = rsingleTag.exec( selector ); - - if ( ret ) { - if ( jQuery.isPlainObject( context ) ) { - selector = [ document.createElement( ret[1] ) ]; - jQuery.fn.attr.call( selector, context, true ); - - } else { - selector = [ doc.createElement( ret[1] ) ]; - } - - } else { - ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); - selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes; - } - - 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.6.2", - - // 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 slice.call( this, 0 ); - }, - - // 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 = this.constructor(); - - if ( jQuery.isArray( elems ) ) { - push.apply( ret, elems ); - - } else { - jQuery.merge( ret, 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 ) { - // Attach the listeners - jQuery.bindReady(); - - // Add the callback - readyList.done( fn ); - - return this; - }, - - eq: function( 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( slice.apply( this, arguments ), - "slice", 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: 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 ) { - // Either a released hold or an DOMready/load event and not yet ready - if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { - // 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" ).unbind( "ready" ); - } - } - }, - - bindReady: function() { - if ( readyList ) { - return; - } - - readyList = jQuery._Deferred(); - - // Catch cases where $(document).ready() is called after the - // browser event has already occurred. - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - return setTimeout( jQuery.ready, 1 ); - } - - // Mozilla, Opera and webkit nightlies currently support this event - 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 if ( document.attachEvent ) { - // 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 toplevel = false; - - try { - toplevel = window.frameElement == null; - } catch(e) {} - - if ( document.documentElement.doScroll && toplevel ) { - doScrollCheck(); - } - } - }, - - // 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"; - }, - - // A crude way of determining if an object is a window - isWindow: function( obj ) { - return obj && typeof obj === "object" && "setInterval" in obj; - }, - - isNaN: function( obj ) { - return obj == null || !rdigit.test( obj ) || isNaN( obj ); - }, - - type: function( obj ) { - return obj == null ? - String( obj ) : - class2type[ 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; - } - - // Not own constructor property must be Object - if ( obj.constructor && - !hasOwn.call(obj, "constructor") && - !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { - 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 || hasOwn.call( obj, key ); - }, - - isEmptyObject: function( obj ) { - for ( var name in obj ) { - return false; - } - return true; - }, - - error: function( msg ) { - throw msg; - }, - - parseJSON: function( data ) { - if ( typeof data !== "string" || !data ) { - 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 - // (xml & tmp used internally) - parseXML: function( data , xml , tmp ) { - - 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 ); - } - - tmp = xml.documentElement; - - if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) { - 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 && 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 ); - } - }, - - // Converts a dashed string to camelCased string; - // Used by both the css and data modules - camelCase: function( string ) { - return string.replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); - }, - - // args is for internal usage only - each: function( object, callback, args ) { - var name, i = 0, - length = object.length, - isObj = length === undefined || jQuery.isFunction( object ); - - if ( args ) { - if ( isObj ) { - for ( name in object ) { - if ( callback.apply( object[ name ], args ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.apply( object[ i++ ], args ) === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isObj ) { - for ( name in object ) { - if ( callback.call( object[ name ], name, object[ name ] ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { - break; - } - } - } - } - - return object; - }, - - // Use native String.trim function wherever possible - trim: trim ? - function( text ) { - return text == null ? - "" : - trim.call( text ); - } : - - // Otherwise use our own trimming functionality - function( text ) { - return text == null ? - "" : - text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); - }, - - // results is for internal usage only - makeArray: function( array, results ) { - var ret = results || []; - - if ( array != null ) { - // The window, strings (and functions) also have 'length' - // The extra typeof function check is to prevent crashes - // in Safari 2 (See: #3039) - // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 - var type = jQuery.type( array ); - - if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { - push.call( ret, array ); - } else { - jQuery.merge( ret, array ); - } - } - - return ret; - }, - - inArray: function( elem, array ) { - - if ( indexOf ) { - return indexOf.call( array, elem ); - } - - for ( var i = 0, length = array.length; i < length; i++ ) { - if ( array[ i ] === elem ) { - return i; - } - } - - return -1; - }, - - merge: function( first, second ) { - var i = first.length, - j = 0; - - if ( typeof second.length === "number" ) { - for ( var l = second.length; 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 ret = [], retVal; - inv = !!inv; - - // Go through the array, only saving the items - // that pass the validator function - for ( var i = 0, length = elems.length; 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 ) { - if ( typeof context === "string" ) { - var 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 - var args = slice.call( arguments, 2 ), - proxy = function() { - return fn.apply( context, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; - - return proxy; - }, - - // Mutifunctional method to get and set values to a collection - // The value/s can optionally be executed if it's a function - access: function( elems, key, value, exec, fn, pass ) { - var length = elems.length; - - // Setting many attributes - if ( typeof key === "object" ) { - for ( var k in key ) { - jQuery.access( elems, k, key[k], exec, fn, value ); - } - return elems; - } - - // Setting one attribute - if ( value !== undefined ) { - // Optionally, function values get executed if exec is true - exec = !pass && exec && jQuery.isFunction(value); - - for ( var i = 0; i < length; i++ ) { - fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); - } - - return elems; - } - - // Getting an attribute - return length ? fn( elems[0], key ) : undefined; - }, - - now: function() { - return (new Date()).getTime(); - }, - - // Use of jQuery.browser is frowned upon. - // More details: http://docs.jquery.com/Utilities/jQuery.browser - uaMatch: function( ua ) { - ua = ua.toLowerCase(); - - var match = rwebkit.exec( ua ) || - ropera.exec( ua ) || - rmsie.exec( ua ) || - ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || - []; - - return { browser: match[1] || "", version: match[2] || "0" }; - }, - - 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; - }, - - browser: {} -}); - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -browserMatch = jQuery.uaMatch( userAgent ); -if ( browserMatch.browser ) { - jQuery.browser[ browserMatch.browser ] = true; - jQuery.browser.version = browserMatch.version; -} - -// Deprecated, use jQuery.browser.webkit instead -if ( jQuery.browser.webkit ) { - jQuery.browser.safari = true; -} - -// IE doesn't match non-breaking spaces with \s -if ( rnotwhite.test( "\xA0" ) ) { - trimLeft = /^[\s\xA0]+/; - trimRight = /[\s\xA0]+$/; -} - -// All jQuery objects should point back to these -rootjQuery = jQuery(document); - -// Cleanup functions for the document ready method -if ( document.addEventListener ) { - DOMContentLoaded = function() { - document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - jQuery.ready(); - }; - -} else if ( document.attachEvent ) { - DOMContentLoaded = function() { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( document.readyState === "complete" ) { - document.detachEvent( "onreadystatechange", DOMContentLoaded ); - jQuery.ready(); - } - }; -} - -// The DOM ready check for Internet Explorer -function doScrollCheck() { - if ( jQuery.isReady ) { - return; - } - - try { - // If IE is used, use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - document.documentElement.doScroll("left"); - } catch(e) { - setTimeout( doScrollCheck, 1 ); - return; - } - - // and execute any waiting functions - jQuery.ready(); -} - -return jQuery; - -})(); - - -var // Promise methods - promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ), - // Static reference to slice - sliceDeferred = [].slice; - -jQuery.extend({ - // Create a simple deferred (one callbacks list) - _Deferred: function() { - var // callbacks list - callbacks = [], - // stored [ context , args ] - fired, - // to avoid firing when already doing so - firing, - // flag to know if the deferred has been cancelled - cancelled, - // the deferred itself - deferred = { - - // done( f1, f2, ...) - done: function() { - if ( !cancelled ) { - var args = arguments, - i, - length, - elem, - type, - _fired; - if ( fired ) { - _fired = fired; - fired = 0; - } - for ( i = 0, length = args.length; i < length; i++ ) { - elem = args[ i ]; - type = jQuery.type( elem ); - if ( type === "array" ) { - deferred.done.apply( deferred, elem ); - } else if ( type === "function" ) { - callbacks.push( elem ); - } - } - if ( _fired ) { - deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] ); - } - } - return this; - }, - - // resolve with given context and args - resolveWith: function( context, args ) { - if ( !cancelled && !fired && !firing ) { - // make sure args are available (#8421) - args = args || []; - firing = 1; - try { - while( callbacks[ 0 ] ) { - callbacks.shift().apply( context, args ); - } - } - finally { - fired = [ context, args ]; - firing = 0; - } - } - return this; - }, - - // resolve with this as context and given arguments - resolve: function() { - deferred.resolveWith( this, arguments ); - return this; - }, - - // Has this deferred been resolved? - isResolved: function() { - return !!( firing || fired ); - }, - - // Cancel - cancel: function() { - cancelled = 1; - callbacks = []; - return this; - } - }; - - return deferred; - }, - - // Full fledged deferred (two callbacks list) - Deferred: function( func ) { - var deferred = jQuery._Deferred(), - failDeferred = jQuery._Deferred(), - promise; - // Add errorDeferred methods, then and promise - jQuery.extend( deferred, { - then: function( doneCallbacks, failCallbacks ) { - deferred.done( doneCallbacks ).fail( failCallbacks ); - return this; - }, - always: function() { - return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments ); - }, - fail: failDeferred.done, - rejectWith: failDeferred.resolveWith, - reject: failDeferred.resolve, - isRejected: failDeferred.isResolved, - pipe: function( fnDone, fnFail ) { - return jQuery.Deferred(function( newDefer ) { - jQuery.each( { - done: [ fnDone, "resolve" ], - fail: [ fnFail, "reject" ] - }, function( handler, data ) { - var fn = data[ 0 ], - action = data[ 1 ], - returned; - if ( jQuery.isFunction( fn ) ) { - deferred[ handler ](function() { - returned = fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise().then( newDefer.resolve, newDefer.reject ); - } else { - newDefer[ action ]( returned ); - } - }); - } else { - deferred[ handler ]( newDefer[ action ] ); - } - }); - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - if ( obj == null ) { - if ( promise ) { - return promise; - } - promise = obj = {}; - } - var i = promiseMethods.length; - while( i-- ) { - obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; - } - return obj; - } - }); - // Make sure only one callback list will be used - deferred.done( failDeferred.cancel ).fail( deferred.cancel ); - // Unexpose cancel - delete deferred.cancel; - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - return deferred; - }, - - // Deferred helper - when: function( firstParam ) { - var args = arguments, - i = 0, - length = args.length, - count = length, - deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? - firstParam : - jQuery.Deferred(); - function resolveFunc( i ) { - return function( value ) { - args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; - if ( !( --count ) ) { - // Strange bug in FF4: - // Values changed onto the arguments object sometimes end up as undefined values - // outside the $.when method. Cloning the object into a fresh array solves the issue - deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) ); - } - }; - } - if ( length > 1 ) { - for( ; i < length; i++ ) { - if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) { - args[ i ].promise().then( resolveFunc(i), deferred.reject ); - } else { - --count; - } - } - if ( !count ) { - deferred.resolveWith( deferred, args ); - } - } else if ( deferred !== firstParam ) { - deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); - } - return deferred.promise(); - } -}); - - - -jQuery.support = (function() { - - var div = document.createElement( "div" ), - documentElement = document.documentElement, - all, - a, - select, - opt, - input, - marginDiv, - support, - fragment, - body, - testElementParent, - testElement, - testElementStyle, - tds, - events, - eventName, - i, - isSupported; - - // Preliminary tests - div.setAttribute("className", "t"); - div.innerHTML = "
    a"; - - all = div.getElementsByTagName( "*" ); - a = div.getElementsByTagName( "a" )[ 0 ]; - - // 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.55$/.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", - - // Will be defined later - submitBubbles: true, - changeBubbles: true, - focusinBubbles: false, - deleteExpando: true, - noCloneEvent: true, - inlineBlockNeedsLayout: false, - shrinkWrapBlocks: false, - reliableMarginRight: true - }; - - // 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", function() { - // Cloning a node shouldn't copy over any - // bound event handlers (IE does this) - support.noCloneEvent = false; - }); - div.cloneNode( true ).fireEvent( "onclick" ); - } - - // Check if a radio maintains it's 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"); - div.appendChild( input ); - fragment = document.createDocumentFragment(); - fragment.appendChild( div.firstChild ); - - // WebKit doesn't clone checked state correctly in fragments - support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; - - div.innerHTML = ""; - - // Figure out if the W3C box model works as expected - div.style.width = div.style.paddingLeft = "1px"; - - body = document.getElementsByTagName( "body" )[ 0 ]; - // We use our own, invisible, body unless the body is already present - // in which case we use a div (#9239) - testElement = document.createElement( body ? "div" : "body" ); - testElementStyle = { - visibility: "hidden", - width: 0, - height: 0, - border: 0, - margin: 0 - }; - if ( body ) { - jQuery.extend( testElementStyle, { - position: "absolute", - left: -1000, - top: -1000 - }); - } - for ( i in testElementStyle ) { - testElement.style[ i ] = testElementStyle[ i ]; - } - testElement.appendChild( div ); - testElementParent = body || documentElement; - testElementParent.insertBefore( testElement, testElementParent.firstChild ); - - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - support.appendChecked = input.checked; - - support.boxModel = div.offsetWidth === 2; - - if ( "zoom" in div.style ) { - // 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.style.display = "inline"; - div.style.zoom = 1; - support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); - - // Check if elements with layout shrink-wrap their children - // (IE 6 does this) - div.style.display = ""; - div.innerHTML = "
    "; - support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); - } - - div.innerHTML = "
    t
    "; - tds = div.getElementsByTagName( "td" ); - - // 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) - 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 ); - div.innerHTML = ""; - - // 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 - if ( document.defaultView && document.defaultView.getComputedStyle ) { - marginDiv = document.createElement( "div" ); - marginDiv.style.width = "0"; - marginDiv.style.marginRight = "0"; - div.appendChild( marginDiv ); - support.reliableMarginRight = - ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; - } - - // Remove the body element we added - testElement.innerHTML = ""; - testElementParent.removeChild( testElement ); - - // Technique from Juriy Zaytsev - // http://thinkweb2.com/projects/prototype/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: 1, - change: 1, - focusin: 1 - } ) { - eventName = "on" + i; - isSupported = ( eventName in div ); - if ( !isSupported ) { - div.setAttribute( eventName, "return;" ); - isSupported = ( typeof div[ eventName ] === "function" ); - } - support[ i + "Bubbles" ] = isSupported; - } - } - - // Null connected elements to avoid leaks in IE - testElement = fragment = select = opt = body = marginDiv = div = input = null; - - return support; -})(); - -// Keep track of boxModel -jQuery.boxModel = jQuery.support.boxModel; - - - - -var rbrace = /^(?:\{.*\}|\[.*\])$/, - rmultiDash = /([a-z])([A-Z])/g; - -jQuery.extend({ - cache: {}, - - // 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 internalKey = jQuery.expando, getByName = typeof name === "string", thisCache, - - // 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[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando; - - // 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 || (pvt && id && !cache[ id ][ internalKey ])) && 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[ jQuery.expando ] = id = ++jQuery.uuid; - } else { - id = jQuery.expando; - } - } - - if ( !cache[ id ] ) { - cache[ id ] = {}; - - // TODO: This is a hack for 1.5 ONLY. 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 ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); - } else { - cache[ id ] = jQuery.extend(cache[ id ], name); - } - } - - thisCache = cache[ id ]; - - // Internal jQuery data is stored in a separate object inside the object's data - // cache in order to avoid key collisions between internal data and user-defined - // data - if ( pvt ) { - if ( !thisCache[ internalKey ] ) { - thisCache[ internalKey ] = {}; - } - - thisCache = thisCache[ internalKey ]; - } - - if ( data !== undefined ) { - thisCache[ jQuery.camelCase( name ) ] = data; - } - - // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should - // not attempt to inspect the internal events object using jQuery.data, as this - // internal data object is undocumented and subject to change. - if ( name === "events" && !thisCache[name] ) { - return thisCache[ internalKey ] && thisCache[ internalKey ].events; - } - - return getByName ? - // Check for both converted-to-camel and non-converted data property names - thisCache[ jQuery.camelCase( name ) ] || thisCache[ name ] : - thisCache; - }, - - removeData: function( elem, name, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var internalKey = jQuery.expando, isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - - // See jQuery.data for more information - 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 ) { - var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ]; - - if ( thisCache ) { - delete thisCache[ name ]; - - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if ( !isEmptyDataObject(thisCache) ) { - return; - } - } - } - - // See jQuery.data for more information - if ( pvt ) { - delete cache[ id ][ internalKey ]; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if ( !isEmptyDataObject(cache[ id ]) ) { - return; - } - } - - var internalCache = cache[ id ][ internalKey ]; - - // Browsers that fail expando deletion also refuse to delete expandos on - // the window, but it will allow it on all other JS objects; other browsers - // don't care - if ( jQuery.support.deleteExpando || cache != window ) { - delete cache[ id ]; - } else { - cache[ id ] = null; - } - - // We destroyed the entire user cache at once because it's faster than - // iterating through each key, but we need to continue to persist internal - // data if it existed - if ( internalCache ) { - cache[ id ] = {}; - // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery - // metadata on plain JS objects when the object is serialized using - // JSON.stringify - if ( !isNode ) { - cache[ id ].toJSON = jQuery.noop; - } - - cache[ id ][ internalKey ] = internalCache; - - // Otherwise, we need to eliminate the expando on the node to avoid - // false lookups in the cache for entries that no longer exist - } else if ( isNode ) { - // 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 ( jQuery.support.deleteExpando ) { - delete elem[ jQuery.expando ]; - } else if ( elem.removeAttribute ) { - elem.removeAttribute( jQuery.expando ); - } else { - elem[ jQuery.expando ] = 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 ) { - if ( elem.nodeName ) { - var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; - - if ( match ) { - return !(match === true || elem.getAttribute("classid") !== match); - } - } - - return true; - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var data = null; - - if ( typeof key === "undefined" ) { - if ( this.length ) { - data = jQuery.data( this[0] ); - - if ( this[0].nodeType === 1 ) { - var attr = this[0].attributes, name; - for ( var i = 0, l = attr.length; i < l; i++ ) { - name = attr[i].name; - - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.substring(5) ); - - dataAttr( this[0], name, data[ name ] ); - } - } - } - } - - return data; - - } else if ( typeof key === "object" ) { - return this.each(function() { - jQuery.data( this, key ); - }); - } - - var parts = key.split("."); - parts[1] = parts[1] ? "." + parts[1] : ""; - - if ( value === undefined ) { - data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); - - // Try to fetch any internally stored data first - if ( data === undefined && this.length ) { - data = jQuery.data( this[0], key ); - data = dataAttr( this[0], key, data ); - } - - return data === undefined && parts[1] ? - this.data( parts[0] ) : - data; - - } else { - return this.each(function() { - var $this = jQuery( this ), - args = [ parts[0], value ]; - - $this.triggerHandler( "setData" + parts[1] + "!", args ); - jQuery.data( this, key, value ); - $this.triggerHandler( "changeData" + parts[1] + "!", args ); - }); - } - }, - - 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-$2" ).toLowerCase(); - - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - !jQuery.isNaN( data ) ? parseFloat( 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; -} - -// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON -// property to be considered empty objects; this property always exists in -// order to make sure JSON.stringify does not expose internal metadata -function isEmptyDataObject( obj ) { - for ( var name in obj ) { - if ( name !== "toJSON" ) { - return false; - } - } - - return true; -} - - - - -function handleQueueMarkDefer( elem, type, src ) { - var deferDataKey = type + "defer", - queueDataKey = type + "queue", - markDataKey = type + "mark", - defer = jQuery.data( elem, deferDataKey, undefined, true ); - if ( defer && - ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) && - ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) { - // Give room for hard-coded callbacks to fire first - // and eventually mark/queue something else on the element - setTimeout( function() { - if ( !jQuery.data( elem, queueDataKey, undefined, true ) && - !jQuery.data( elem, markDataKey, undefined, true ) ) { - jQuery.removeData( elem, deferDataKey, true ); - defer.resolve(); - } - }, 0 ); - } -} - -jQuery.extend({ - - _mark: function( elem, type ) { - if ( elem ) { - type = (type || "fx") + "mark"; - jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true ); - } - }, - - _unmark: function( force, elem, type ) { - if ( force !== true ) { - type = elem; - elem = force; - force = false; - } - if ( elem ) { - type = type || "fx"; - var key = type + "mark", - count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 ); - if ( count ) { - jQuery.data( elem, key, count, true ); - } else { - jQuery.removeData( elem, key, true ); - handleQueueMarkDefer( elem, type, "mark" ); - } - } - }, - - queue: function( elem, type, data ) { - if ( elem ) { - type = (type || "fx") + "queue"; - var q = jQuery.data( elem, type, undefined, true ); - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !q || jQuery.isArray(data) ) { - q = jQuery.data( elem, type, jQuery.makeArray(data), true ); - } else { - q.push( data ); - } - } - return q || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - fn = queue.shift(), - defer; - - // 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"); - } - - fn.call(elem, function() { - jQuery.dequeue(elem, type); - }); - } - - if ( !queue.length ) { - jQuery.removeData( elem, type + "queue", true ); - handleQueueMarkDefer( elem, type, "queue" ); - } - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - } - - if ( data === undefined ) { - return jQuery.queue( this[0], type ); - } - return this.each(function() { - var queue = jQuery.queue( this, type, data ); - - 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() { - var elem = this; - setTimeout(function() { - jQuery.dequeue( elem, type ); - }, time ); - }); - }, - 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, object ) { - if ( typeof type !== "string" ) { - object = type; - type = undefined; - } - type = type || "fx"; - var defer = jQuery.Deferred(), - elements = this, - i = elements.length, - count = 1, - deferDataKey = type + "defer", - queueDataKey = type + "queue", - markDataKey = type + "mark", - tmp; - function resolve() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - } - while( i-- ) { - if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || - ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || - jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && - jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) { - count++; - tmp.done( resolve ); - } - } - resolve(); - return defer.promise(); - } -}); - - - - -var rclass = /[\n\t\r]/g, - rspace = /\s+/, - 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, - rinvalidChar = /\:|^on/, - formHook, boolHook; - -jQuery.fn.extend({ - attr: function( name, value ) { - return jQuery.access( this, name, value, true, jQuery.attr ); - }, - - removeAttr: function( name ) { - return this.each(function() { - jQuery.removeAttr( this, name ); - }); - }, - - prop: function( name, value ) { - return jQuery.access( this, name, value, true, jQuery.prop ); - }, - - 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( 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 classNames, i, l, elem, className, c, cl; - - 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 ) { - classNames = (value || "").split( rspace ); - - for ( i = 0, l = this.length; i < l; i++ ) { - elem = this[ i ]; - - if ( elem.nodeType === 1 && elem.className ) { - if ( value ) { - className = (" " + elem.className + " ").replace( rclass, " " ); - for ( c = 0, cl = classNames.length; c < cl; c++ ) { - className = className.replace(" " + classNames[ c ] + " ", " "); - } - elem.className = jQuery.trim( className ); - - } else { - elem.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( rspace ); - - while ( (className = classNames[ i++ ]) ) { - // check each className given, space seperated 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 + " "; - for ( var i = 0, l = this.length; i < l; i++ ) { - if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { - return true; - } - } - - return false; - }, - - val: function( value ) { - var hooks, ret, - elem = this[0]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; - - 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 undefined; - } - - var isFunction = jQuery.isFunction( value ); - - return this.each(function( i ) { - var self = jQuery(this), val; - - 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.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; - - // 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, - 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 - for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { - var 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; - } - } - }, - - attrFn: { - val: true, - css: true, - html: true, - text: true, - data: true, - width: true, - height: true, - offset: true - }, - - attrFix: { - // Always normalize to ensure hook usage - tabindex: "tabIndex" - }, - - attr: function( elem, name, value, pass ) { - var nType = elem.nodeType; - - // don't get/set attributes on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return undefined; - } - - if ( pass && name in jQuery.attrFn ) { - return jQuery( elem )[ name ]( value ); - } - - // Fallback to prop when attributes are not supported - if ( !("getAttribute" in elem) ) { - return jQuery.prop( elem, name, value ); - } - - var ret, hooks, - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - // Normalize the name if needed - if ( notxml ) { - name = jQuery.attrFix[ name ] || name; - - hooks = jQuery.attrHooks[ name ]; - - if ( !hooks ) { - // Use boolHook for boolean attributes - if ( rboolean.test( name ) ) { - - hooks = boolHook; - - // Use formHook for forms and if the name contains certain characters - } else if ( formHook && name !== "className" && - (jQuery.nodeName( elem, "form" ) || rinvalidChar.test( name )) ) { - - hooks = formHook; - } - } - } - - if ( value !== undefined ) { - - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return undefined; - - } 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, name ) { - var propName; - if ( elem.nodeType === 1 ) { - name = jQuery.attrFix[ name ] || name; - - if ( jQuery.support.getSetAttribute ) { - // Use removeAttribute in browsers that support it - elem.removeAttribute( name ); - } else { - jQuery.attr( elem, name, "" ); - elem.removeAttributeNode( elem.getAttributeNode( name ) ); - } - - // Set corresponding property to false for boolean attributes - if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) 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; - } - } - }, - 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; - } - }, - // Use the value property for back compat - // Use the formHook for button elements in IE6/7 (#1954) - value: { - get: function( elem, name ) { - if ( formHook && jQuery.nodeName( elem, "button" ) ) { - return formHook.get( elem, name ); - } - return name in elem ? - elem.value : - null; - }, - set: function( elem, value, name ) { - if ( formHook && jQuery.nodeName( elem, "button" ) ) { - return formHook.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 nType = elem.nodeType; - - // don't get/set properties on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return undefined; - } - - var ret, hooks, - 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 )) !== undefined ) { - return ret; - - } else { - return elem[ name ]; - } - } - }, - - propHooks: {} -}); - -// Hook for boolean attributes -boolHook = { - get: function( elem, name ) { - // Align boolean attributes with corresponding properties - return jQuery.prop( elem, name ) ? - 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 ( !jQuery.support.getSetAttribute ) { - - // propFix is more comprehensive and contains all fixes - jQuery.attrFix = jQuery.propFix; - - // Use this for any attribute on a form in IE6/7 - formHook = jQuery.attrHooks.name = jQuery.attrHooks.title = jQuery.valHooks.button = { - get: function( elem, name ) { - var ret; - ret = elem.getAttributeNode( name ); - // Return undefined if nodeValue is empty string - return ret && ret.nodeValue !== "" ? - ret.nodeValue : - undefined; - }, - set: function( elem, value, name ) { - // Check form objects in IE (multiple bugs related) - // Only use nodeValue if the attribute node exists on the form - var ret = elem.getAttributeNode( name ); - if ( ret ) { - ret.nodeValue = value; - return 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; - } - } - }); - }); -} - - -// 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; - } - } - } - }); -} - -// 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 rnamespaces = /\.(.*)$/, - rformElems = /^(?:textarea|input|select)$/i, - rperiod = /\./g, - rspaces = / /g, - rescape = /[^\w\s.|`]/g, - fcleanup = function( nm ) { - return nm.replace(rescape, "\\$&"); - }; - -/* - * A number of helper functions used for managing events. - * Many of the ideas behind this code originated from - * Dean Edwards' addEvent library. - */ -jQuery.event = { - - // Bind an event to an element - // Original by Dean Edwards - add: function( elem, types, handler, data ) { - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - if ( handler === false ) { - handler = returnFalse; - } else if ( !handler ) { - // Fixes bug #7229. Fix recommended by jdalton - return; - } - - var handleObjIn, handleObj; - - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - } - - // Make sure that the function being executed has a unique ID - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure - var elemData = jQuery._data( elem ); - - // If no elemData is found then we must be trying to bind to one of the - // banned noData elements - if ( !elemData ) { - return; - } - - var events = elemData.events, - eventHandle = elemData.handle; - - if ( !events ) { - elemData.events = events = {}; - } - - 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.handle.apply( eventHandle.elem, arguments ) : - undefined; - }; - } - - // Add elem as a property of the handle function - // This is to prevent a memory leak with non-native events in IE. - eventHandle.elem = elem; - - // Handle multiple events separated by a space - // jQuery(...).bind("mouseover mouseout", fn); - types = types.split(" "); - - var type, i = 0, namespaces; - - while ( (type = types[ i++ ]) ) { - handleObj = handleObjIn ? - jQuery.extend({}, handleObjIn) : - { handler: handler, data: data }; - - // Namespaced event handlers - if ( type.indexOf(".") > -1 ) { - namespaces = type.split("."); - type = namespaces.shift(); - handleObj.namespace = namespaces.slice(0).sort().join("."); - - } else { - namespaces = []; - handleObj.namespace = ""; - } - - handleObj.type = type; - if ( !handleObj.guid ) { - handleObj.guid = handler.guid; - } - - // Get the current list of functions bound to this event - var handlers = events[ type ], - special = jQuery.event.special[ type ] || {}; - - // Init the event handler queue - if ( !handlers ) { - handlers = events[ type ] = []; - - // Check for a special event handler - // 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 the function to the element's handler list - handlers.push( handleObj ); - - // Keep track of which events have 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, pos ) { - // don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - if ( handler === false ) { - handler = returnFalse; - } - - var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, - elemData = jQuery.hasData( elem ) && jQuery._data( elem ), - events = elemData && elemData.events; - - if ( !elemData || !events ) { - return; - } - - // types is actually an event object here - if ( types && types.type ) { - handler = types.handler; - types = types.type; - } - - // Unbind all events for the element - if ( !types || typeof types === "string" && types.charAt(0) === "." ) { - types = types || ""; - - for ( type in events ) { - jQuery.event.remove( elem, type + types ); - } - - return; - } - - // Handle multiple events separated by a space - // jQuery(...).unbind("mouseover mouseout", fn); - types = types.split(" "); - - while ( (type = types[ i++ ]) ) { - origType = type; - handleObj = null; - all = type.indexOf(".") < 0; - namespaces = []; - - if ( !all ) { - // Namespaced event handlers - namespaces = type.split("."); - type = namespaces.shift(); - - namespace = new RegExp("(^|\\.)" + - jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)"); - } - - eventType = events[ type ]; - - if ( !eventType ) { - continue; - } - - if ( !handler ) { - for ( j = 0; j < eventType.length; j++ ) { - handleObj = eventType[ j ]; - - if ( all || namespace.test( handleObj.namespace ) ) { - jQuery.event.remove( elem, origType, handleObj.handler, j ); - eventType.splice( j--, 1 ); - } - } - - continue; - } - - special = jQuery.event.special[ type ] || {}; - - for ( j = pos || 0; j < eventType.length; j++ ) { - handleObj = eventType[ j ]; - - if ( handler.guid === handleObj.guid ) { - // remove the given handler for the given type - if ( all || namespace.test( handleObj.namespace ) ) { - if ( pos == null ) { - eventType.splice( j--, 1 ); - } - - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - - if ( pos != null ) { - break; - } - } - } - - // remove generic event handler if no more handlers exist - if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { - if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - ret = null; - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - var handle = elemData.handle; - if ( handle ) { - handle.elem = null; - } - - delete elemData.events; - delete elemData.handle; - - if ( jQuery.isEmptyObject( elemData ) ) { - jQuery.removeData( elem, undefined, 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 ) { - // Event object or event type - var type = event.type || event, - namespaces = [], - exclusive; - - 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.exclusive = exclusive; - event.namespace = namespaces.join("."); - event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)"); - - // triggerHandler() and global events don't bubble or run the default action - if ( onlyHandlers || !elem ) { - event.preventDefault(); - event.stopPropagation(); - } - - // Handle a global trigger - if ( !elem ) { - // TODO: Stop taunting the data cache; remove global events and always attach to document - jQuery.each( jQuery.cache, function() { - // internalKey variable is just used to make it easier to find - // and potentially change this stuff later; currently it just - // points to jQuery.expando - var internalKey = jQuery.expando, - internalCache = this[ internalKey ]; - if ( internalCache && internalCache.events && internalCache.events[ type ] ) { - jQuery.event.trigger( event, data, internalCache.handle.elem ); - } - }); - return; - } - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // Clean up the event in case it is being reused - event.result = undefined; - 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 ); - - var cur = elem, - // IE doesn't like method names with a colon (#3533, #8272) - ontype = type.indexOf(":") < 0 ? "on" + type : ""; - - // Fire event on the current element, then bubble up the DOM tree - do { - var handle = jQuery._data( cur, "handle" ); - - event.currentTarget = cur; - if ( handle ) { - handle.apply( cur, data ); - } - - // Trigger an inline bound script - if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) { - event.result = false; - event.preventDefault(); - } - - // Bubble up to document, then to window - cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window; - } while ( cur && !event.isPropagationStopped() ); - - // If nobody prevented the default action, do it now - if ( !event.isDefaultPrevented() ) { - var old, - special = jQuery.event.special[ type ] || {}; - - if ( (!special._default || special._default.call( elem.ownerDocument, event ) === 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. - // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch. - try { - if ( ontype && elem[ type ] ) { - // Don't re-trigger an onFOO event when we call its FOO() method - old = elem[ ontype ]; - - if ( old ) { - elem[ ontype ] = null; - } - - jQuery.event.triggered = type; - elem[ type ](); - } - } catch ( ieError ) {} - - if ( old ) { - elem[ ontype ] = old; - } - - jQuery.event.triggered = undefined; - } - } - - return event.result; - }, - - handle: function( event ) { - event = jQuery.event.fix( event || window.event ); - // Snapshot the handlers list since a called handler may add/remove events. - var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0), - run_all = !event.exclusive && !event.namespace, - args = Array.prototype.slice.call( arguments, 0 ); - - // Use the fix-ed Event rather than the (read-only) native event - args[0] = event; - event.currentTarget = this; - - for ( var j = 0, l = handlers.length; j < l; j++ ) { - var handleObj = handlers[ j ]; - - // Triggered event must 1) be non-exclusive and have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event. - if ( run_all || event.namespace_re.test( handleObj.namespace ) ) { - // Pass in a reference to the handler function itself - // So that we can later remove it - event.handler = handleObj.handler; - event.data = handleObj.data; - event.handleObj = handleObj; - - var ret = handleObj.handler.apply( this, args ); - - if ( ret !== undefined ) { - event.result = ret; - if ( ret === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - - if ( event.isImmediatePropagationStopped() ) { - break; - } - } - } - return event.result; - }, - - props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // store a copy of the original event object - // and "clone" to set read-only properties - var originalEvent = event; - event = jQuery.Event( originalEvent ); - - for ( var i = this.props.length, prop; i; ) { - prop = this.props[ --i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Fix target property, if necessary - if ( !event.target ) { - // Fixes #1925 where srcElement might not be defined either - event.target = event.srcElement || document; - } - - // check if target is a textnode (safari) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - // Add relatedTarget, if necessary - if ( !event.relatedTarget && event.fromElement ) { - event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; - } - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && event.clientX != null ) { - var eventDocument = event.target.ownerDocument || document, - doc = eventDocument.documentElement, - body = eventDocument.body; - - event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); - event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); - } - - // Add which for key events - if ( event.which == null && (event.charCode != null || event.keyCode != null) ) { - event.which = event.charCode != null ? event.charCode : event.keyCode; - } - - // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) - if ( !event.metaKey && event.ctrlKey ) { - event.metaKey = event.ctrlKey; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && event.button !== undefined ) { - event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); - } - - return event; - }, - - // Deprecated, use jQuery.guid instead - guid: 1E8, - - // Deprecated, use jQuery.proxy instead - proxy: jQuery.proxy, - - special: { - ready: { - // Make sure the ready event is setup - setup: jQuery.bindReady, - teardown: jQuery.noop - }, - - live: { - add: function( handleObj ) { - jQuery.event.add( this, - liveConvert( handleObj.origType, handleObj.selector ), - jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); - }, - - remove: function( handleObj ) { - jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj ); - } - }, - - 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; - } - } - } - } -}; - -jQuery.removeEvent = document.removeEventListener ? - function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } - } : - function( elem, type, handle ) { - if ( elem.detachEvent ) { - elem.detachEvent( "on" + type, handle ); - } - }; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !this.preventDefault ) { - 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 ); - } - - // timeStamp is buggy for some events on Firefox(#3843) - // So we won't rely on the native value - this.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 -}; - -// Checks if an event happened on an element within another element -// Used in jQuery.event.special.mouseenter and mouseleave handlers -var withinElement = function( event ) { - - // Check if mouse(over|out) are still within the same parent element - var related = event.relatedTarget, - inside = false, - eventType = event.type; - - event.type = event.data; - - if ( related !== this ) { - - if ( related ) { - inside = jQuery.contains( this, related ); - } - - if ( !inside ) { - - jQuery.event.handle.apply( this, arguments ); - - event.type = eventType; - } - } -}, - -// In case of event delegation, we only need to rename the event.type, -// liveHandler will take care of the rest. -delegate = function( event ) { - event.type = event.data; - jQuery.event.handle.apply( this, arguments ); -}; - -// Create mouseenter and mouseleave events -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - setup: function( data ) { - jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); - }, - teardown: function( data ) { - jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); - } - }; -}); - -// submit delegation -if ( !jQuery.support.submitBubbles ) { - - jQuery.event.special.submit = { - setup: function( data, namespaces ) { - if ( !jQuery.nodeName( this, "form" ) ) { - jQuery.event.add(this, "click.specialSubmit", function( e ) { - var elem = e.target, - type = elem.type; - - if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { - trigger( "submit", this, arguments ); - } - }); - - jQuery.event.add(this, "keypress.specialSubmit", function( e ) { - var elem = e.target, - type = elem.type; - - if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { - trigger( "submit", this, arguments ); - } - }); - - } else { - return false; - } - }, - - teardown: function( namespaces ) { - jQuery.event.remove( this, ".specialSubmit" ); - } - }; - -} - -// change delegation, happens here so we have bind. -if ( !jQuery.support.changeBubbles ) { - - var changeFilters, - - getVal = function( elem ) { - var type = elem.type, val = elem.value; - - if ( type === "radio" || type === "checkbox" ) { - val = elem.checked; - - } else if ( type === "select-multiple" ) { - val = elem.selectedIndex > -1 ? - jQuery.map( elem.options, function( elem ) { - return elem.selected; - }).join("-") : - ""; - - } else if ( jQuery.nodeName( elem, "select" ) ) { - val = elem.selectedIndex; - } - - return val; - }, - - testChange = function testChange( e ) { - var elem = e.target, data, val; - - if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) { - return; - } - - data = jQuery._data( elem, "_change_data" ); - val = getVal(elem); - - // the current data will be also retrieved by beforeactivate - if ( e.type !== "focusout" || elem.type !== "radio" ) { - jQuery._data( elem, "_change_data", val ); - } - - if ( data === undefined || val === data ) { - return; - } - - if ( data != null || val ) { - e.type = "change"; - e.liveFired = undefined; - jQuery.event.trigger( e, arguments[1], elem ); - } - }; - - jQuery.event.special.change = { - filters: { - focusout: testChange, - - beforedeactivate: testChange, - - click: function( e ) { - var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; - - if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) { - testChange.call( this, e ); - } - }, - - // Change has to be called before submit - // Keydown will be called before keypress, which is used in submit-event delegation - keydown: function( e ) { - var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; - - if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) || - (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || - type === "select-multiple" ) { - testChange.call( this, e ); - } - }, - - // Beforeactivate happens also before the previous element is blurred - // with this event you can't trigger a change event, but you can store - // information - beforeactivate: function( e ) { - var elem = e.target; - jQuery._data( elem, "_change_data", getVal(elem) ); - } - }, - - setup: function( data, namespaces ) { - if ( this.type === "file" ) { - return false; - } - - for ( var type in changeFilters ) { - jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); - } - - return rformElems.test( this.nodeName ); - }, - - teardown: function( namespaces ) { - jQuery.event.remove( this, ".specialChange" ); - - return rformElems.test( this.nodeName ); - } - }; - - changeFilters = jQuery.event.special.change.filters; - - // Handle when the input is .focus()'d - changeFilters.focus = changeFilters.beforeactivate; -} - -function trigger( type, elem, args ) { - // 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. - // Don't pass args or remember liveFired; they apply to the donor event. - var event = jQuery.extend( {}, args[ 0 ] ); - event.type = type; - event.originalEvent = {}; - event.liveFired = undefined; - jQuery.event.handle.call( elem, event ); - if ( event.isDefaultPrevented() ) { - args[ 0 ].preventDefault(); - } -} - -// 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; - - jQuery.event.special[ fix ] = { - setup: function() { - if ( attaches++ === 0 ) { - document.addEventListener( orig, handler, true ); - } - }, - teardown: function() { - if ( --attaches === 0 ) { - document.removeEventListener( orig, handler, true ); - } - } - }; - - function handler( donor ) { - // Donor event is always a native one; fix it and switch its type. - // Let focusin/out handler cancel the donor focus/blur event. - var e = jQuery.event.fix( donor ); - e.type = fix; - e.originalEvent = {}; - jQuery.event.trigger( e, null, e.target ); - if ( e.isDefaultPrevented() ) { - donor.preventDefault(); - } - } - }); -} - -jQuery.each(["bind", "one"], function( i, name ) { - jQuery.fn[ name ] = function( type, data, fn ) { - var handler; - - // Handle object literals - if ( typeof type === "object" ) { - for ( var key in type ) { - this[ name ](key, data, type[key], fn); - } - return this; - } - - if ( arguments.length === 2 || data === false ) { - fn = data; - data = undefined; - } - - if ( name === "one" ) { - handler = function( event ) { - jQuery( this ).unbind( event, handler ); - return fn.apply( this, arguments ); - }; - handler.guid = fn.guid || jQuery.guid++; - } else { - handler = fn; - } - - if ( type === "unload" && name !== "one" ) { - this.one( type, data, fn ); - - } else { - for ( var i = 0, l = this.length; i < l; i++ ) { - jQuery.event.add( this[i], type, handler, data ); - } - } - - return this; - }; -}); - -jQuery.fn.extend({ - unbind: function( type, fn ) { - // Handle object literals - if ( typeof type === "object" && !type.preventDefault ) { - for ( var key in type ) { - this.unbind(key, type[key]); - } - - } else { - for ( var i = 0, l = this.length; i < l; i++ ) { - jQuery.event.remove( this[i], type, fn ); - } - } - - return this; - }, - - delegate: function( selector, types, data, fn ) { - return this.live( types, data, fn, selector ); - }, - - undelegate: function( selector, types, fn ) { - if ( arguments.length === 0 ) { - return this.unbind( "live" ); - - } else { - return this.die( types, null, fn, selector ); - } - }, - - 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 ); - } -}); - -var liveMap = { - focus: "focusin", - blur: "focusout", - mouseenter: "mouseover", - mouseleave: "mouseout" -}; - -jQuery.each(["live", "die"], function( i, name ) { - jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { - var type, i = 0, match, namespaces, preType, - selector = origSelector || this.selector, - context = origSelector ? this : jQuery( this.context ); - - if ( typeof types === "object" && !types.preventDefault ) { - for ( var key in types ) { - context[ name ]( key, data, types[key], selector ); - } - - return this; - } - - if ( name === "die" && !types && - origSelector && origSelector.charAt(0) === "." ) { - - context.unbind( origSelector ); - - return this; - } - - if ( data === false || jQuery.isFunction( data ) ) { - fn = data || returnFalse; - data = undefined; - } - - types = (types || "").split(" "); - - while ( (type = types[ i++ ]) != null ) { - match = rnamespaces.exec( type ); - namespaces = ""; - - if ( match ) { - namespaces = match[0]; - type = type.replace( rnamespaces, "" ); - } - - if ( type === "hover" ) { - types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); - continue; - } - - preType = type; - - if ( liveMap[ type ] ) { - types.push( liveMap[ type ] + namespaces ); - type = type + namespaces; - - } else { - type = (liveMap[ type ] || type) + namespaces; - } - - if ( name === "live" ) { - // bind live handler - for ( var j = 0, l = context.length; j < l; j++ ) { - jQuery.event.add( context[j], "live." + liveConvert( type, selector ), - { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); - } - - } else { - // unbind live handler - context.unbind( "live." + liveConvert( type, selector ), fn ); - } - } - - return this; - }; -}); - -function liveHandler( event ) { - var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, - elems = [], - selectors = [], - events = jQuery._data( this, "events" ); - - // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911) - if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { - return; - } - - if ( event.namespace ) { - namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); - } - - event.liveFired = this; - - var live = events.live.slice(0); - - for ( j = 0; j < live.length; j++ ) { - handleObj = live[j]; - - if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { - selectors.push( handleObj.selector ); - - } else { - live.splice( j--, 1 ); - } - } - - match = jQuery( event.target ).closest( selectors, event.currentTarget ); - - for ( i = 0, l = match.length; i < l; i++ ) { - close = match[i]; - - for ( j = 0; j < live.length; j++ ) { - handleObj = live[j]; - - if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) { - elem = close.elem; - related = null; - - // Those two events require additional checking - if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { - event.type = handleObj.preType; - related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; - - // Make sure not to accidentally match a child element with the same selector - if ( related && jQuery.contains( elem, related ) ) { - related = elem; - } - } - - if ( !related || related !== elem ) { - elems.push({ elem: elem, handleObj: handleObj, level: close.level }); - } - } - } - } - - for ( i = 0, l = elems.length; i < l; i++ ) { - match = elems[i]; - - if ( maxLevel && match.level > maxLevel ) { - break; - } - - event.currentTarget = match.elem; - event.data = match.handleObj.data; - event.handleObj = match.handleObj; - - ret = match.handleObj.origHandler.apply( match.elem, arguments ); - - if ( ret === false || event.isPropagationStopped() ) { - maxLevel = match.level; - - if ( ret === false ) { - stop = false; - } - if ( event.isImmediatePropagationStopped() ) { - break; - } - } - } - - return stop; -} - -function liveConvert( type, selector ) { - return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&"); -} - -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").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.bind( name, data, fn ) : - this.trigger( name ); - }; - - if ( jQuery.attrFn ) { - jQuery.attrFn[ name ] = true; - } -}); - - - -/*! - * Sizzle CSS Selector Engine - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){ - -var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, - done = 0, - toString = Object.prototype.toString, - hasDuplicate = false, - baseHasDuplicate = true, - rBackslash = /\\/g, - rNonWord = /\W/; - -// Here we 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() { - baseHasDuplicate = false; - return 0; -}); - -var Sizzle = function( selector, context, results, seed ) { - results = results || []; - context = context || document; - - var origContext = context; - - if ( context.nodeType !== 1 && context.nodeType !== 9 ) { - return []; - } - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - var m, set, checkSet, extra, ret, cur, pop, i, - prune = true, - contextXML = Sizzle.isXML( context ), - parts = [], - soFar = selector; - - // Reset the position of the chunker regexp (start from head) - do { - chunker.exec( "" ); - m = chunker.exec( soFar ); - - if ( m ) { - soFar = m[3]; - - parts.push( m[1] ); - - if ( m[2] ) { - extra = m[3]; - break; - } - } - } while ( m ); - - if ( parts.length > 1 && origPOS.exec( selector ) ) { - - if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { - set = posProcess( parts[0] + parts[1], context ); - - } else { - set = Expr.relative[ parts[0] ] ? - [ context ] : - Sizzle( parts.shift(), context ); - - while ( parts.length ) { - selector = parts.shift(); - - if ( Expr.relative[ selector ] ) { - selector += parts.shift(); - } - - set = posProcess( selector, set ); - } - } - - } else { - // Take a shortcut and set the context if the root selector is an ID - // (but not if it'll be faster if the inner selector is an ID) - if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && - Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { - - ret = Sizzle.find( parts.shift(), context, contextXML ); - context = ret.expr ? - Sizzle.filter( ret.expr, ret.set )[0] : - ret.set[0]; - } - - if ( context ) { - ret = seed ? - { expr: parts.pop(), set: makeArray(seed) } : - Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); - - set = ret.expr ? - Sizzle.filter( ret.expr, ret.set ) : - ret.set; - - if ( parts.length > 0 ) { - checkSet = makeArray( set ); - - } else { - prune = false; - } - - while ( parts.length ) { - cur = parts.pop(); - pop = cur; - - if ( !Expr.relative[ cur ] ) { - cur = ""; - } else { - pop = parts.pop(); - } - - if ( pop == null ) { - pop = context; - } - - Expr.relative[ cur ]( checkSet, pop, contextXML ); - } - - } else { - checkSet = parts = []; - } - } - - if ( !checkSet ) { - checkSet = set; - } - - if ( !checkSet ) { - Sizzle.error( cur || selector ); - } - - if ( toString.call(checkSet) === "[object Array]" ) { - if ( !prune ) { - results.push.apply( results, checkSet ); - - } else if ( context && context.nodeType === 1 ) { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { - results.push( set[i] ); - } - } - - } else { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && checkSet[i].nodeType === 1 ) { - results.push( set[i] ); - } - } - } - - } else { - makeArray( checkSet, results ); - } - - if ( extra ) { - Sizzle( extra, origContext, results, seed ); - Sizzle.uniqueSort( results ); - } - - return results; -}; - -Sizzle.uniqueSort = function( results ) { - if ( sortOrder ) { - hasDuplicate = baseHasDuplicate; - results.sort( sortOrder ); - - if ( hasDuplicate ) { - for ( var i = 1; i < results.length; i++ ) { - if ( results[i] === results[ i - 1 ] ) { - results.splice( i--, 1 ); - } - } - } - } - - return results; -}; - -Sizzle.matches = function( expr, set ) { - return Sizzle( expr, null, null, set ); -}; - -Sizzle.matchesSelector = function( node, expr ) { - return Sizzle( expr, null, null, [node] ).length > 0; -}; - -Sizzle.find = function( expr, context, isXML ) { - var set; - - if ( !expr ) { - return []; - } - - for ( var i = 0, l = Expr.order.length; i < l; i++ ) { - var match, - type = Expr.order[i]; - - if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { - var left = match[1]; - match.splice( 1, 1 ); - - if ( left.substr( left.length - 1 ) !== "\\" ) { - match[1] = (match[1] || "").replace( rBackslash, "" ); - set = Expr.find[ type ]( match, context, isXML ); - - if ( set != null ) { - expr = expr.replace( Expr.match[ type ], "" ); - break; - } - } - } - } - - if ( !set ) { - set = typeof context.getElementsByTagName !== "undefined" ? - context.getElementsByTagName( "*" ) : - []; - } - - return { set: set, expr: expr }; -}; - -Sizzle.filter = function( expr, set, inplace, not ) { - var match, anyFound, - old = expr, - result = [], - curLoop = set, - isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); - - while ( expr && set.length ) { - for ( var type in Expr.filter ) { - if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { - var found, item, - filter = Expr.filter[ type ], - left = match[1]; - - anyFound = false; - - match.splice(1,1); - - if ( left.substr( left.length - 1 ) === "\\" ) { - continue; - } - - if ( curLoop === result ) { - result = []; - } - - if ( Expr.preFilter[ type ] ) { - match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); - - if ( !match ) { - anyFound = found = true; - - } else if ( match === true ) { - continue; - } - } - - if ( match ) { - for ( var i = 0; (item = curLoop[i]) != null; i++ ) { - if ( item ) { - found = filter( item, match, i, curLoop ); - var pass = not ^ !!found; - - if ( inplace && found != null ) { - if ( pass ) { - anyFound = true; - - } else { - curLoop[i] = false; - } - - } else if ( pass ) { - result.push( item ); - anyFound = true; - } - } - } - } - - if ( found !== undefined ) { - if ( !inplace ) { - curLoop = result; - } - - expr = expr.replace( Expr.match[ type ], "" ); - - if ( !anyFound ) { - return []; - } - - break; - } - } - } - - // Improper expression - if ( expr === old ) { - if ( anyFound == null ) { - Sizzle.error( expr ); - - } else { - break; - } - } - - old = expr; - } - - return curLoop; -}; - -Sizzle.error = function( msg ) { - throw "Syntax error, unrecognized expression: " + msg; -}; - -var Expr = Sizzle.selectors = { - order: [ "ID", "NAME", "TAG" ], - - match: { - ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, - ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, - TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, - CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, - POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, - PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ - }, - - leftMatch: {}, - - attrMap: { - "class": "className", - "for": "htmlFor" - }, - - attrHandle: { - href: function( elem ) { - return elem.getAttribute( "href" ); - }, - type: function( elem ) { - return elem.getAttribute( "type" ); - } - }, - - relative: { - "+": function(checkSet, part){ - var isPartStr = typeof part === "string", - isTag = isPartStr && !rNonWord.test( part ), - isPartStrNotTag = isPartStr && !isTag; - - if ( isTag ) { - part = part.toLowerCase(); - } - - for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { - if ( (elem = checkSet[i]) ) { - while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} - - checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? - elem || false : - elem === part; - } - } - - if ( isPartStrNotTag ) { - Sizzle.filter( part, checkSet, true ); - } - }, - - ">": function( checkSet, part ) { - var elem, - isPartStr = typeof part === "string", - i = 0, - l = checkSet.length; - - if ( isPartStr && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - - for ( ; i < l; i++ ) { - elem = checkSet[i]; - - if ( elem ) { - var parent = elem.parentNode; - checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; - } - } - - } else { - for ( ; i < l; i++ ) { - elem = checkSet[i]; - - if ( elem ) { - checkSet[i] = isPartStr ? - elem.parentNode : - elem.parentNode === part; - } - } - - if ( isPartStr ) { - Sizzle.filter( part, checkSet, true ); - } - } - }, - - "": function(checkSet, part, isXML){ - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); - }, - - "~": function( checkSet, part, isXML ) { - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); - } - }, - - find: { - ID: function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }, - - NAME: function( match, context ) { - if ( typeof context.getElementsByName !== "undefined" ) { - var ret = [], - results = context.getElementsByName( match[1] ); - - for ( var i = 0, l = results.length; i < l; i++ ) { - if ( results[i].getAttribute("name") === match[1] ) { - ret.push( results[i] ); - } - } - - return ret.length === 0 ? null : ret; - } - }, - - TAG: function( match, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( match[1] ); - } - } - }, - preFilter: { - CLASS: function( match, curLoop, inplace, result, not, isXML ) { - match = " " + match[1].replace( rBackslash, "" ) + " "; - - if ( isXML ) { - return match; - } - - for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { - if ( elem ) { - if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { - if ( !inplace ) { - result.push( elem ); - } - - } else if ( inplace ) { - curLoop[i] = false; - } - } - } - - return false; - }, - - ID: function( match ) { - return match[1].replace( rBackslash, "" ); - }, - - TAG: function( match, curLoop ) { - return match[1].replace( rBackslash, "" ).toLowerCase(); - }, - - CHILD: function( match ) { - if ( match[1] === "nth" ) { - if ( !match[2] ) { - Sizzle.error( match[0] ); - } - - match[2] = match[2].replace(/^\+|\s*/g, ''); - - // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' - var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( - match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || - !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); - - // calculate the numbers (first)n+(last) including if they are negative - match[2] = (test[1] + (test[2] || 1)) - 0; - match[3] = test[3] - 0; - } - else if ( match[2] ) { - Sizzle.error( match[0] ); - } - - // TODO: Move to normal caching system - match[0] = done++; - - return match; - }, - - ATTR: function( match, curLoop, inplace, result, not, isXML ) { - var name = match[1] = match[1].replace( rBackslash, "" ); - - if ( !isXML && Expr.attrMap[name] ) { - match[1] = Expr.attrMap[name]; - } - - // Handle if an un-quoted value was used - match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); - - if ( match[2] === "~=" ) { - match[4] = " " + match[4] + " "; - } - - return match; - }, - - PSEUDO: function( match, curLoop, inplace, result, not ) { - if ( match[1] === "not" ) { - // If we're dealing with a complex expression, or a simple one - if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { - match[3] = Sizzle(match[3], null, null, curLoop); - - } else { - var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); - - if ( !inplace ) { - result.push.apply( result, ret ); - } - - return false; - } - - } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { - return true; - } - - return match; - }, - - POS: function( match ) { - match.unshift( true ); - - return match; - } - }, - - filters: { - enabled: function( elem ) { - return elem.disabled === false && elem.type !== "hidden"; - }, - - disabled: function( elem ) { - return elem.disabled === true; - }, - - checked: function( elem ) { - return elem.checked === true; - }, - - 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 !!elem.firstChild; - }, - - empty: function( elem ) { - return !elem.firstChild; - }, - - has: function( elem, i, match ) { - return !!Sizzle( match[3], elem ).length; - }, - - header: function( elem ) { - return (/h\d/i).test( elem.nodeName ); - }, - - text: function( elem ) { - var attr = elem.getAttribute( "type" ), type = elem.type; - // 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" && "text" === type && ( attr === type || attr === null ); - }, - - radio: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; - }, - - checkbox: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; - }, - - file: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; - }, - - password: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; - }, - - submit: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && "submit" === elem.type; - }, - - image: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; - }, - - reset: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && "reset" === elem.type; - }, - - button: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && "button" === elem.type || name === "button"; - }, - - input: function( elem ) { - return (/input|select|textarea|button/i).test( elem.nodeName ); - }, - - focus: function( elem ) { - return elem === elem.ownerDocument.activeElement; - } - }, - setFilters: { - first: function( elem, i ) { - return i === 0; - }, - - last: function( elem, i, match, array ) { - return i === array.length - 1; - }, - - even: function( elem, i ) { - return i % 2 === 0; - }, - - odd: function( elem, i ) { - return i % 2 === 1; - }, - - lt: function( elem, i, match ) { - return i < match[3] - 0; - }, - - gt: function( elem, i, match ) { - return i > match[3] - 0; - }, - - nth: function( elem, i, match ) { - return match[3] - 0 === i; - }, - - eq: function( elem, i, match ) { - return match[3] - 0 === i; - } - }, - filter: { - PSEUDO: function( elem, match, i, array ) { - var name = match[1], - filter = Expr.filters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - - } else if ( name === "contains" ) { - return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0; - - } else if ( name === "not" ) { - var not = match[3]; - - for ( var j = 0, l = not.length; j < l; j++ ) { - if ( not[j] === elem ) { - return false; - } - } - - return true; - - } else { - Sizzle.error( name ); - } - }, - - CHILD: function( elem, match ) { - var type = match[1], - 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; - - case "last": - while ( (node = node.nextSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - - return true; - - case "nth": - var first = match[2], - last = match[3]; - - if ( first === 1 && last === 0 ) { - return true; - } - - var doneName = match[0], - parent = elem.parentNode; - - if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { - var count = 0; - - for ( node = parent.firstChild; node; node = node.nextSibling ) { - if ( node.nodeType === 1 ) { - node.nodeIndex = ++count; - } - } - - parent.sizcache = doneName; - } - - var diff = elem.nodeIndex - last; - - if ( first === 0 ) { - return diff === 0; - - } else { - return ( diff % first === 0 && diff / first >= 0 ); - } - } - }, - - ID: function( elem, match ) { - return elem.nodeType === 1 && elem.getAttribute("id") === match; - }, - - TAG: function( elem, match ) { - return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; - }, - - CLASS: function( elem, match ) { - return (" " + (elem.className || elem.getAttribute("class")) + " ") - .indexOf( match ) > -1; - }, - - ATTR: function( elem, match ) { - var name = match[1], - result = Expr.attrHandle[ name ] ? - Expr.attrHandle[ name ]( elem ) : - elem[ name ] != null ? - elem[ name ] : - elem.getAttribute( name ), - value = result + "", - type = match[2], - check = match[4]; - - return result == null ? - type === "!=" : - type === "=" ? - value === check : - type === "*=" ? - value.indexOf(check) >= 0 : - type === "~=" ? - (" " + value + " ").indexOf(check) >= 0 : - !check ? - value && result !== false : - type === "!=" ? - value !== check : - type === "^=" ? - value.indexOf(check) === 0 : - type === "$=" ? - value.substr(value.length - check.length) === check : - type === "|=" ? - value === check || value.substr(0, check.length + 1) === check + "-" : - false; - }, - - POS: function( elem, match, i, array ) { - var name = match[2], - filter = Expr.setFilters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - } - } - } -}; - -var origPOS = Expr.match.POS, - fescape = function(all, num){ - return "\\" + (num - 0 + 1); - }; - -for ( var type in Expr.match ) { - Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); - Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); -} - -var makeArray = function( array, results ) { - array = Array.prototype.slice.call( array, 0 ); - - if ( results ) { - results.push.apply( results, array ); - return results; - } - - return array; -}; - -// Perform a simple check to determine if the browser is capable of -// converting a NodeList to an array using builtin methods. -// Also verifies that the returned array holds DOM nodes -// (which is not the case in the Blackberry browser) -try { - Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; - -// Provide a fallback method if it does not work -} catch( e ) { - makeArray = function( array, results ) { - var i = 0, - ret = results || []; - - if ( toString.call(array) === "[object Array]" ) { - Array.prototype.push.apply( ret, array ); - - } else { - if ( typeof array.length === "number" ) { - for ( var l = array.length; i < l; i++ ) { - ret.push( array[i] ); - } - - } else { - for ( ; array[i]; i++ ) { - ret.push( array[i] ); - } - } - } - - return ret; - }; -} - -var sortOrder, siblingCheck; - -if ( document.documentElement.compareDocumentPosition ) { - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { - return a.compareDocumentPosition ? -1 : 1; - } - - return 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; - }; -} - -// Utility function for retreiving the text value of an array of DOM nodes -Sizzle.getText = function( elems ) { - var ret = "", elem; - - for ( var i = 0; elems[i]; i++ ) { - elem = elems[i]; - - // Get the text from text nodes and CDATA nodes - if ( elem.nodeType === 3 || elem.nodeType === 4 ) { - ret += elem.nodeValue; - - // Traverse everything else, except comment nodes - } else if ( elem.nodeType !== 8 ) { - ret += Sizzle.getText( elem.childNodes ); - } - } - - return ret; -}; - -// Check to see if the browser returns elements by name when -// querying by getElementById (and provide a workaround) -(function(){ - // We're going to inject a fake input element with a specified name - var form = document.createElement("div"), - id = "script" + (new Date()).getTime(), - root = document.documentElement; - - form.innerHTML = ""; - - // Inject it into the root element, check its status, and remove it quickly - root.insertBefore( form, root.firstChild ); - - // The workaround has to do additional checks after a getElementById - // Which slows things down for other browsers (hence the branching) - if ( document.getElementById( id ) ) { - Expr.find.ID = function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - - return m ? - m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? - [m] : - undefined : - []; - } - }; - - Expr.filter.ID = function( elem, match ) { - var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); - - return elem.nodeType === 1 && node && node.nodeValue === match; - }; - } - - root.removeChild( form ); - - // release memory in IE - root = form = null; -})(); - -(function(){ - // Check to see if the browser returns only elements - // when doing getElementsByTagName("*") - - // Create a fake element - var div = document.createElement("div"); - div.appendChild( document.createComment("") ); - - // Make sure no comments are found - if ( div.getElementsByTagName("*").length > 0 ) { - Expr.find.TAG = function( match, context ) { - var results = context.getElementsByTagName( match[1] ); - - // Filter out possible comments - if ( match[1] === "*" ) { - var tmp = []; - - for ( var i = 0; results[i]; i++ ) { - if ( results[i].nodeType === 1 ) { - tmp.push( results[i] ); - } - } - - results = tmp; - } - - return results; - }; - } - - // Check to see if an attribute returns normalized href attributes - div.innerHTML = ""; - - if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && - div.firstChild.getAttribute("href") !== "#" ) { - - Expr.attrHandle.href = function( elem ) { - return elem.getAttribute( "href", 2 ); - }; - } - - // release memory in IE - div = null; -})(); - -if ( document.querySelectorAll ) { - (function(){ - var oldSizzle = Sizzle, - div = document.createElement("div"), - id = "__sizzle__"; - - div.innerHTML = "

    "; - - // Safari can't handle uppercase or unicode characters when - // in quirks mode. - if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { - return; - } - - Sizzle = function( query, context, extra, seed ) { - context = context || document; - - // Only use querySelectorAll on non-XML documents - // (ID selectors don't work in non-HTML documents) - if ( !seed && !Sizzle.isXML(context) ) { - // See if we find a selector to speed up - var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); - - if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { - // Speed-up: Sizzle("TAG") - if ( match[1] ) { - return makeArray( context.getElementsByTagName( query ), extra ); - - // Speed-up: Sizzle(".CLASS") - } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { - return makeArray( context.getElementsByClassName( match[2] ), extra ); - } - } - - if ( context.nodeType === 9 ) { - // Speed-up: Sizzle("body") - // The body element only exists once, optimize finding it - if ( query === "body" && context.body ) { - return makeArray( [ context.body ], extra ); - - // Speed-up: Sizzle("#ID") - } else if ( match && match[3] ) { - var elem = context.getElementById( match[3] ); - - // 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[3] ) { - return makeArray( [ elem ], extra ); - } - - } else { - return makeArray( [], extra ); - } - } - - try { - return makeArray( context.querySelectorAll(query), extra ); - } 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 oldContext = context, - old = context.getAttribute( "id" ), - nid = old || id, - hasParent = context.parentNode, - relativeHierarchySelector = /^\s*[+~]/.test( query ); - - if ( !old ) { - context.setAttribute( "id", nid ); - } else { - nid = nid.replace( /'/g, "\\$&" ); - } - if ( relativeHierarchySelector && hasParent ) { - context = context.parentNode; - } - - try { - if ( !relativeHierarchySelector || hasParent ) { - return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); - } - - } catch(pseudoError) { - } finally { - if ( !old ) { - oldContext.removeAttribute( "id" ); - } - } - } - } - - return oldSizzle(query, context, extra, seed); - }; - - for ( var prop in oldSizzle ) { - Sizzle[ prop ] = oldSizzle[ prop ]; - } - - // release memory in IE - div = null; - })(); -} - -(function(){ - var html = document.documentElement, - matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; - - if ( matches ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9 fails this) - var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), - pseudoWorks = false; - - try { - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( document.documentElement, "[test!='']:sizzle" ); - - } catch( pseudoError ) { - pseudoWorks = true; - } - - Sizzle.matchesSelector = function( node, expr ) { - // Make sure that attribute selectors are quoted - expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); - - if ( !Sizzle.isXML( node ) ) { - try { - if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { - var ret = matches.call( node, 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, so check for that - node.document && node.document.nodeType !== 11 ) { - return ret; - } - } - } catch(e) {} - } - - return Sizzle(expr, null, null, [node]).length > 0; - }; - } -})(); - -(function(){ - var div = document.createElement("div"); - - div.innerHTML = "
    "; - - // Opera can't find a second classname (in 9.6) - // Also, make sure that getElementsByClassName actually exists - if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { - return; - } - - // Safari caches class attributes, doesn't catch changes (in 3.2) - div.lastChild.className = "e"; - - if ( div.getElementsByClassName("e").length === 1 ) { - return; - } - - Expr.order.splice(1, 0, "CLASS"); - Expr.find.CLASS = function( match, context, isXML ) { - if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { - return context.getElementsByClassName(match[1]); - } - }; - - // release memory in IE - div = null; -})(); - -function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; - - if ( elem ) { - var match = false; - - elem = elem[dir]; - - while ( elem ) { - if ( elem.sizcache === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 && !isXML ){ - elem.sizcache = doneName; - elem.sizset = i; - } - - if ( elem.nodeName.toLowerCase() === cur ) { - match = elem; - break; - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } -} - -function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; - - if ( elem ) { - var match = false; - - elem = elem[dir]; - - while ( elem ) { - if ( elem.sizcache === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 ) { - if ( !isXML ) { - elem.sizcache = doneName; - elem.sizset = i; - } - - if ( typeof cur !== "string" ) { - if ( elem === cur ) { - match = true; - break; - } - - } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { - match = elem; - break; - } - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } -} - -if ( document.documentElement.contains ) { - Sizzle.contains = function( a, b ) { - return a !== b && (a.contains ? a.contains(b) : true); - }; - -} else if ( document.documentElement.compareDocumentPosition ) { - Sizzle.contains = function( a, b ) { - return !!(a.compareDocumentPosition(b) & 16); - }; - -} else { - Sizzle.contains = function() { - return false; - }; -} - -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 : 0).documentElement; - - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -var posProcess = function( selector, context ) { - var match, - tmpSet = [], - later = "", - root = context.nodeType ? [context] : context; - - // Position selectors must be done after the filter - // And so must :not(positional) so we move all PSEUDOs to the end - while ( (match = Expr.match.PSEUDO.exec( selector )) ) { - later += match[0]; - selector = selector.replace( Expr.match.PSEUDO, "" ); - } - - selector = Expr.relative[selector] ? selector + "*" : selector; - - for ( var i = 0, l = root.length; i < l; i++ ) { - Sizzle( selector, root[i], tmpSet ); - } - - return Sizzle.filter( later, tmpSet ); -}; - -// EXPOSE -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.filters; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - -})(); - - -var runtil = /Until$/, - rparentsprev = /^(?:parents|prevUntil|prevAll)/, - // Note: This RegExp should be improved, or likely pulled from Sizzle - rmultiselector = /,/, - isSimple = /^.[^:#\[\.,]*$/, - slice = Array.prototype.slice, - POS = jQuery.expr.match.POS, - // 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 self = this, - i, l; - - 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; - } - } - }); - } - - var ret = this.pushStack( "", "find", selector ), - length, n, r; - - 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 targets = jQuery( target ); - return this.filter(function() { - for ( var i = 0, l = targets.length; i < l; 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" ? - jQuery.filter( selector, this ).length > 0 : - this.filter( selector ).length > 0 ); - }, - - closest: function( selectors, context ) { - var ret = [], i, l, cur = this[0]; - - // Array - if ( jQuery.isArray( selectors ) ) { - var match, selector, - matches = {}, - level = 1; - - if ( cur && selectors.length ) { - for ( i = 0, l = selectors.length; i < l; i++ ) { - selector = selectors[i]; - - if ( !matches[ selector ] ) { - matches[ selector ] = POS.test( selector ) ? - jQuery( selector, context || this.context ) : - selector; - } - } - - while ( cur && cur.ownerDocument && cur !== context ) { - for ( selector in matches ) { - match = matches[ selector ]; - - if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) { - ret.push({ selector: selector, elem: cur, level: level }); - } - } - - cur = cur.parentNode; - level++; - } - } - - return ret; - } - - // String - var pos = POS.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( i = 0, l = this.length; i < l; i++ ) { - cur = this[i]; - - while ( cur ) { - if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { - ret.push( cur ); - break; - - } else { - cur = cur.parentNode; - if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { - break; - } - } - } - } - - 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 ) { - if ( !elem || typeof elem === "string" ) { - return jQuery.inArray( this[0], - // If it receives a string, the selector is used - // If it receives nothing, the siblings are used - elem ? jQuery( elem ) : this.parent().children() ); - } - // 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 ) ); - }, - - andSelf: function() { - return this.add( this.prevObject ); - } -}); - -// 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; -} - -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 jQuery.nth( elem, 2, "nextSibling" ); - }, - prev: function( elem ) { - return jQuery.nth( elem, 2, "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.makeArray( elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ), - // The variable 'args' was introduced in - // https://github.com/jquery/jquery/commit/52a0238 - // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. - // http://code.google.com/p/v8/issues/detail?id=1050 - args = slice.call(arguments); - - 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 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { - ret = ret.reverse(); - } - - return this.pushStack( ret, name, args.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; - }, - - nth: function( cur, result, dir, elem ) { - result = result || 1; - var num = 0; - - for ( ; cur; cur = cur[dir] ) { - if ( cur.nodeType === 1 && ++num === result ) { - break; - } - } - - return cur; - }, - - 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; - }); -} - - - - -var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, - rleadingWhitespace = /^\s+/, - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, - rtagName = /<([\w:]+)/, - rtbody = /", "" ], - legend: [ 1, "
    ", "
    " ], - thead: [ 1, "", "
    " ], - tr: [ 2, "", "
    " ], - td: [ 3, "", "
    " ], - col: [ 2, "", "
    " ], - area: [ 1, "", "" ], - _default: [ 0, "", "" ] - }; - -wrapMap.optgroup = wrapMap.option; -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// IE can't serialize and - - - - - - diff --git a/node_modules/express/node_modules/debug/example/wildcards.js b/node_modules/express/node_modules/debug/example/wildcards.js deleted file mode 100644 index 1fdac20..0000000 --- a/node_modules/express/node_modules/debug/example/wildcards.js +++ /dev/null @@ -1,10 +0,0 @@ - -var debug = { - foo: require('../')('test:foo'), - bar: require('../')('test:bar'), - baz: require('../')('test:baz') -}; - -debug.foo('foo') -debug.bar('bar') -debug.baz('baz') \ No newline at end of file diff --git a/node_modules/express/node_modules/debug/example/worker.js b/node_modules/express/node_modules/debug/example/worker.js deleted file mode 100644 index 7f6d288..0000000 --- a/node_modules/express/node_modules/debug/example/worker.js +++ /dev/null @@ -1,22 +0,0 @@ - -// DEBUG=* node example/worker -// DEBUG=worker:* node example/worker -// DEBUG=worker:a node example/worker -// DEBUG=worker:b node example/worker - -var a = require('../')('worker:a') - , b = require('../')('worker:b'); - -function work() { - a('doing lots of uninteresting work'); - setTimeout(work, Math.random() * 1000); -} - -work(); - -function workb() { - b('doing some work'); - setTimeout(workb, Math.random() * 2000); -} - -workb(); \ No newline at end of file diff --git a/node_modules/express/node_modules/debug/head.js b/node_modules/express/node_modules/debug/head.js deleted file mode 100644 index 55d3817..0000000 --- a/node_modules/express/node_modules/debug/head.js +++ /dev/null @@ -1 +0,0 @@ -;(function(){ diff --git a/node_modules/express/node_modules/debug/index.js b/node_modules/express/node_modules/debug/index.js deleted file mode 100644 index ee54454..0000000 --- a/node_modules/express/node_modules/debug/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/debug'); \ No newline at end of file diff --git a/node_modules/express/node_modules/debug/lib/debug.js b/node_modules/express/node_modules/debug/lib/debug.js deleted file mode 100644 index 969d122..0000000 --- a/node_modules/express/node_modules/debug/lib/debug.js +++ /dev/null @@ -1,135 +0,0 @@ - -/** - * Module dependencies. - */ - -var tty = require('tty'); - -/** - * Expose `debug()` as the module. - */ - -module.exports = debug; - -/** - * Enabled debuggers. - */ - -var names = [] - , skips = []; - -(process.env.DEBUG || '') - .split(/[\s,]+/) - .forEach(function(name){ - name = name.replace('*', '.*?'); - if (name[0] === '-') { - skips.push(new RegExp('^' + name.substr(1) + '$')); - } else { - names.push(new RegExp('^' + name + '$')); - } - }); - -/** - * Colors. - */ - -var colors = [6, 2, 3, 4, 5, 1]; - -/** - * Previous debug() call. - */ - -var prev = {}; - -/** - * Previously assigned color. - */ - -var prevColor = 0; - -/** - * Is stdout a TTY? Colored output is disabled when `true`. - */ - -var isatty = tty.isatty(2); - -/** - * Select a color. - * - * @return {Number} - * @api private - */ - -function color() { - return colors[prevColor++ % colors.length]; -} - -/** - * Humanize the given `ms`. - * - * @param {Number} m - * @return {String} - * @api private - */ - -function humanize(ms) { - var sec = 1000 - , min = 60 * 1000 - , hour = 60 * min; - - if (ms >= hour) return (ms / hour).toFixed(1) + 'h'; - if (ms >= min) return (ms / min).toFixed(1) + 'm'; - if (ms >= sec) return (ms / sec | 0) + 's'; - return ms + 'ms'; -} - -/** - * Create a debugger with the given `name`. - * - * @param {String} name - * @return {Type} - * @api public - */ - -function debug(name) { - function disabled(){} - disabled.enabled = false; - - var match = skips.some(function(re){ - return re.test(name); - }); - - if (match) return disabled; - - match = names.some(function(re){ - return re.test(name); - }); - - if (!match) return disabled; - var c = color(); - - function colored(fmt) { - var curr = new Date; - var ms = curr - (prev[name] || curr); - prev[name] = curr; - - fmt = ' \033[9' + c + 'm' + name + ' ' - + '\033[3' + c + 'm\033[90m' - + fmt + '\033[3' + c + 'm' - + ' +' + humanize(ms) + '\033[0m'; - - console.error.apply(this, arguments); - } - - function plain(fmt) { - fmt = new Date().toUTCString() - + ' ' + name + ' ' + fmt; - console.error.apply(this, arguments); - } - - colored.enabled = plain.enabled = true; - - return isatty - ? colored - : plain; -} diff --git a/node_modules/express/node_modules/debug/package.json b/node_modules/express/node_modules/debug/package.json deleted file mode 100644 index 3906600..0000000 --- a/node_modules/express/node_modules/debug/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "debug", - "version": "0.7.0", - "description": "small debugging utility", - "keywords": [ - "debug", - "log", - "debugger" - ], - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "dependencies": {}, - "devDependencies": { - "mocha": "*" - }, - "main": "index", - "browserify": "debug.component.js", - "engines": { - "node": "*" - }, - "component": { - "scripts": { - "debug": "debug.component.js" - } - }, - "readme": "\n# debug\n\n tiny node.js debugging utility.\n\n## Installation\n\n```\n$ npm install debug\n```\n\n## Example\n\n This module is modelled after node core's debugging technique, allowing you to enable one or more topic-specific debugging functions, for example core does the following within many modules:\n\n```js\nvar debug;\nif (process.env.NODE_DEBUG && /cluster/.test(process.env.NODE_DEBUG)) {\n debug = function(x) {\n var prefix = process.pid + ',' +\n (process.env.NODE_WORKER_ID ? 'Worker' : 'Master');\n console.error(prefix, x);\n };\n} else {\n debug = function() { };\n}\n```\n\n This concept is extremely simple but it works well. With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility.\n \nExample _app.js_:\n\n```js\nvar debug = require('debug')('http')\n , http = require('http')\n , name = 'My App';\n\n// fake app\n\ndebug('booting %s', name);\n\nhttp.createServer(function(req, res){\n debug(req.method + ' ' + req.url);\n res.end('hello\\n');\n}).listen(3000, function(){\n debug('listening');\n});\n\n// fake worker of some kind\n\nrequire('./worker');\n```\n\nExample _worker.js_:\n\n```js\nvar debug = require('debug')('worker');\n\nsetInterval(function(){\n debug('doing some work');\n}, 1000);\n```\n\n The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples:\n\n ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png)\n\n ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png)\n\n## Millisecond diff\n\n When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the \"+NNNms\" will show you how much time was spent between calls.\n\n ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png)\n\n When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below:\n \n ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png)\n\n## Conventions\n\n If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use \":\" to separate features. For example \"bodyParser\" from Connect would then be \"connect:bodyParser\". \n\n## Wildcards\n\n The \"*\" character may be used as a wildcard. Suppose for example your library has debuggers named \"connect:bodyParser\", \"connect:compress\", \"connect:session\", instead of listing all three with `DEBUG=connect:bodyParser,connect.compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.\n\n You can also exclude specific debuggers by prefixing them with a \"-\" character. For example, `DEBUG=* -connect:*` would include all debuggers except those starting with \"connect:\".\n\n## Browser support\n\n Debug works in the browser as well, currently persisted by `localStorage`. For example if you have `worker:a` and `worker:b` as shown below, and wish to debug both type `debug.enable('worker:*')` in the console and refresh the page, this will remain until you disable with `debug.disable()`. \n\n```js\na = debug('worker:a');\nb = debug('worker:b');\n\nsetInterval(function(){\n a('doing some work');\n}, 1000);\n\nsetInterval(function(){\n a('doing some work');\n}, 1200);\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", - "_id": "debug@0.7.0", - "_from": "debug@*" -} diff --git a/node_modules/express/node_modules/debug/tail.js b/node_modules/express/node_modules/debug/tail.js deleted file mode 100644 index 5bf3fd3..0000000 --- a/node_modules/express/node_modules/debug/tail.js +++ /dev/null @@ -1,4 +0,0 @@ - - module.exports = debug; - -})(); \ No newline at end of file diff --git a/node_modules/express/node_modules/fresh/.npmignore b/node_modules/express/node_modules/fresh/.npmignore deleted file mode 100644 index 9daeafb..0000000 --- a/node_modules/express/node_modules/fresh/.npmignore +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/node_modules/express/node_modules/fresh/Makefile b/node_modules/express/node_modules/fresh/Makefile deleted file mode 100644 index 8e8640f..0000000 --- a/node_modules/express/node_modules/fresh/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --reporter spec \ - --require should - -.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/fresh/Readme.md b/node_modules/express/node_modules/fresh/Readme.md deleted file mode 100644 index 273130d..0000000 --- a/node_modules/express/node_modules/fresh/Readme.md +++ /dev/null @@ -1,32 +0,0 @@ - -# node-fresh - - HTTP response freshness testing - -## fresh(req, res) - - Check freshness of `req` and `res` headers. - - When the cache is "fresh" __true__ is returned, - otherwise __false__ is returned to indicate that - the cache is now stale. - -## Example: - -```js -var req = { 'if-none-match': 'tobi' }; -var res = { 'etag': 'luna' }; -fresh(req, res); -// => false - -var req = { 'if-none-match': 'tobi' }; -var res = { 'etag': 'tobi' }; -fresh(req, res); -// => true -``` - -## Installation - -``` -$ npm install fresh -``` \ No newline at end of file diff --git a/node_modules/express/node_modules/fresh/index.js b/node_modules/express/node_modules/fresh/index.js deleted file mode 100644 index b2f4d41..0000000 --- a/node_modules/express/node_modules/fresh/index.js +++ /dev/null @@ -1,49 +0,0 @@ - -/** - * Expose `fresh()`. - */ - -module.exports = fresh; - -/** - * Check freshness of `req` and `res` headers. - * - * When the cache is "fresh" __true__ is returned, - * otherwise __false__ is returned to indicate that - * the cache is now stale. - * - * @param {Object} req - * @param {Object} res - * @return {Boolean} - * @api public - */ - -function fresh(req, res) { - // defaults - var etagMatches = true; - var notModified = true; - - // fields - var modifiedSince = req['if-modified-since']; - var noneMatch = req['if-none-match']; - var lastModified = res['last-modified']; - var etag = res['etag']; - - // unconditional request - if (!modifiedSince && !noneMatch) return false; - - // parse if-none-match - if (noneMatch) noneMatch = noneMatch.split(/ *, */); - - // if-none-match - if (noneMatch) etagMatches = ~noneMatch.indexOf(etag) || '*' == noneMatch[0]; - - // if-modified-since - if (modifiedSince) { - modifiedSince = new Date(modifiedSince); - lastModified = new Date(lastModified); - notModified = lastModified <= modifiedSince; - } - - return !! (etagMatches && notModified); -} \ No newline at end of file diff --git a/node_modules/express/node_modules/fresh/package.json b/node_modules/express/node_modules/fresh/package.json deleted file mode 100644 index e1f985e..0000000 --- a/node_modules/express/node_modules/fresh/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "fresh", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "description": "HTTP response freshness testing", - "version": "0.1.0", - "main": "index.js", - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "readme": "\n# node-fresh\n\n HTTP response freshness testing\n\n## fresh(req, res)\n\n Check freshness of `req` and `res` headers.\n\n When the cache is \"fresh\" __true__ is returned,\n otherwise __false__ is returned to indicate that\n the cache is now stale.\n\n## Example:\n\n```js\nvar req = { 'if-none-match': 'tobi' };\nvar res = { 'etag': 'luna' };\nfresh(req, res);\n// => false\n\nvar req = { 'if-none-match': 'tobi' };\nvar res = { 'etag': 'tobi' };\nfresh(req, res);\n// => true\n```\n\n## Installation\n\n```\n$ npm install fresh\n```", - "_id": "fresh@0.1.0", - "_from": "fresh@0.1.0" -} diff --git a/node_modules/express/node_modules/methods/index.js b/node_modules/express/node_modules/methods/index.js deleted file mode 100644 index 297d022..0000000 --- a/node_modules/express/node_modules/methods/index.js +++ /dev/null @@ -1,26 +0,0 @@ - -module.exports = [ - 'get' - , 'post' - , 'put' - , 'head' - , 'delete' - , 'options' - , 'trace' - , 'copy' - , 'lock' - , 'mkcol' - , 'move' - , 'propfind' - , 'proppatch' - , 'unlock' - , 'report' - , 'mkactivity' - , 'checkout' - , 'merge' - , 'm-search' - , 'notify' - , 'subscribe' - , 'unsubscribe' - , 'patch' -]; \ No newline at end of file diff --git a/node_modules/express/node_modules/methods/package.json b/node_modules/express/node_modules/methods/package.json deleted file mode 100644 index 341b226..0000000 --- a/node_modules/express/node_modules/methods/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "methods", - "version": "0.0.1", - "description": "HTTP methods that node supports", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [ - "http", - "methods" - ], - "author": { - "name": "TJ Holowaychuk" - }, - "license": "MIT", - "_id": "methods@0.0.1", - "readme": "ERROR: No README.md file found!", - "_from": "methods@0.0.1" -} diff --git a/node_modules/express/node_modules/mkdirp/.gitignore.orig b/node_modules/express/node_modules/mkdirp/.gitignore.orig deleted file mode 100644 index 9303c34..0000000 --- a/node_modules/express/node_modules/mkdirp/.gitignore.orig +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/ -npm-debug.log \ No newline at end of file diff --git a/node_modules/express/node_modules/mkdirp/.gitignore.rej b/node_modules/express/node_modules/mkdirp/.gitignore.rej deleted file mode 100644 index 69244ff..0000000 --- a/node_modules/express/node_modules/mkdirp/.gitignore.rej +++ /dev/null @@ -1,5 +0,0 @@ ---- /dev/null -+++ .gitignore -@@ -0,0 +1,2 @@ -+node_modules/ -+npm-debug.log \ No newline at end of file diff --git a/node_modules/express/node_modules/mkdirp/.npmignore b/node_modules/express/node_modules/mkdirp/.npmignore deleted file mode 100644 index 9303c34..0000000 --- a/node_modules/express/node_modules/mkdirp/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/ -npm-debug.log \ No newline at end of file diff --git a/node_modules/express/node_modules/mkdirp/.travis.yml b/node_modules/express/node_modules/mkdirp/.travis.yml deleted file mode 100644 index f1d0f13..0000000 --- a/node_modules/express/node_modules/mkdirp/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.4 - - 0.6 diff --git a/node_modules/express/node_modules/mkdirp/LICENSE b/node_modules/express/node_modules/mkdirp/LICENSE deleted file mode 100644 index 432d1ae..0000000 --- a/node_modules/express/node_modules/mkdirp/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -Copyright 2010 James Halliday (mail@substack.net) - -This project is free software released under the MIT/X11 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/node_modules/express/node_modules/mkdirp/README.markdown b/node_modules/express/node_modules/mkdirp/README.markdown deleted file mode 100644 index 40de04f..0000000 --- a/node_modules/express/node_modules/mkdirp/README.markdown +++ /dev/null @@ -1,61 +0,0 @@ -mkdirp -====== - -Like `mkdir -p`, but in node.js! - -[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp) - -example -======= - -pow.js ------- - var mkdirp = require('mkdirp'); - - mkdirp('/tmp/foo/bar/baz', function (err) { - if (err) console.error(err) - else console.log('pow!') - }); - -Output - pow! - -And now /tmp/foo/bar/baz exists, huzzah! - -methods -======= - -var mkdirp = require('mkdirp'); - -mkdirp(dir, mode, cb) ---------------------- - -Create a new directory and any necessary subdirectories at `dir` with octal -permission string `mode`. - -If `mode` isn't specified, it defaults to `0777 & (~process.umask())`. - -`cb(err, made)` fires with the error or the first directory `made` -that had to be created, if any. - -mkdirp.sync(dir, mode) ----------------------- - -Synchronously create a new directory and any necessary subdirectories at `dir` -with octal permission string `mode`. - -If `mode` isn't specified, it defaults to `0777 & (~process.umask())`. - -Returns the first directory that had to be created, if any. - -install -======= - -With [npm](http://npmjs.org) do: - - npm install mkdirp - -license -======= - -MIT/X11 diff --git a/node_modules/express/node_modules/mkdirp/examples/pow.js b/node_modules/express/node_modules/mkdirp/examples/pow.js deleted file mode 100644 index e692421..0000000 --- a/node_modules/express/node_modules/mkdirp/examples/pow.js +++ /dev/null @@ -1,6 +0,0 @@ -var mkdirp = require('mkdirp'); - -mkdirp('/tmp/foo/bar/baz', function (err) { - if (err) console.error(err) - else console.log('pow!') -}); diff --git a/node_modules/express/node_modules/mkdirp/examples/pow.js.orig b/node_modules/express/node_modules/mkdirp/examples/pow.js.orig deleted file mode 100644 index 7741462..0000000 --- a/node_modules/express/node_modules/mkdirp/examples/pow.js.orig +++ /dev/null @@ -1,6 +0,0 @@ -var mkdirp = require('mkdirp'); - -mkdirp('/tmp/foo/bar/baz', 0755, function (err) { - if (err) console.error(err) - else console.log('pow!') -}); diff --git a/node_modules/express/node_modules/mkdirp/examples/pow.js.rej b/node_modules/express/node_modules/mkdirp/examples/pow.js.rej deleted file mode 100644 index 81e7f43..0000000 --- a/node_modules/express/node_modules/mkdirp/examples/pow.js.rej +++ /dev/null @@ -1,19 +0,0 @@ ---- examples/pow.js -+++ examples/pow.js -@@ -1,6 +1,15 @@ --var mkdirp = require('mkdirp').mkdirp; -+var mkdirp = require('../').mkdirp, -+ mkdirpSync = require('../').mkdirpSync; - - mkdirp('/tmp/foo/bar/baz', 0755, function (err) { - if (err) console.error(err) - else console.log('pow!') - }); -+ -+try { -+ mkdirpSync('/tmp/bar/foo/baz', 0755); -+ console.log('double pow!'); -+} -+catch (ex) { -+ console.log(ex); -+} \ No newline at end of file diff --git a/node_modules/express/node_modules/mkdirp/index.js b/node_modules/express/node_modules/mkdirp/index.js deleted file mode 100644 index 874b310..0000000 --- a/node_modules/express/node_modules/mkdirp/index.js +++ /dev/null @@ -1,94 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; - -function mkdirP (p, mode, f, made) { - if (typeof mode === 'function' || mode === undefined) { - f = mode; - mode = 0777 & (~process.umask()); - } - if (!made) made = null; - - var cb = f || function () {}; - if (typeof mode === 'string') mode = parseInt(mode, 8); - p = path.resolve(p); - - fs.mkdir(p, mode, function (er) { - if (!er) { - made = made || p; - return cb(null, made); - } - switch (er.code) { - case 'ENOENT': - mkdirP(path.dirname(p), mode, function (er, made) { - if (er) cb(er, made); - else mkdirP(p, mode, cb, made); - }); - break; - - case 'EISDIR': - case 'EPERM': - // Operation not permitted or already is a dir. - // This is the error you get when trying to mkdir('c:/') - // on windows, or mkdir('/') on unix. Make sure it's a - // dir by falling through to the EEXIST case. - case 'EROFS': - // a read-only file system. - // However, the dir could already exist, in which case - // the EROFS error will be obscuring a EEXIST! - // Fallthrough to that case. - case 'EEXIST': - fs.stat(p, function (er2, stat) { - // if the stat fails, then that's super weird. - // let the original error be the failure reason. - if (er2 || !stat.isDirectory()) cb(er, made) - else cb(null, made); - }); - break; - - default: - cb(er, made); - break; - } - }); -} - -mkdirP.sync = function sync (p, mode, made) { - if (mode === undefined) { - mode = 0777 & (~process.umask()); - } - if (!made) made = null; - - if (typeof mode === 'string') mode = parseInt(mode, 8); - p = path.resolve(p); - - try { - fs.mkdirSync(p, mode); - made = made || p; - } - catch (err0) { - switch (err0.code) { - case 'ENOENT' : - made = sync(path.dirname(p), mode, made); - sync(p, mode, made); - break; - - case 'EEXIST' : - var stat; - try { - stat = fs.statSync(p); - } - catch (err1) { - throw err0; - } - if (!stat.isDirectory()) throw err0; - break; - default : - throw err0 - break; - } - } - - return made; -}; diff --git a/node_modules/express/node_modules/mkdirp/package.json b/node_modules/express/node_modules/mkdirp/package.json deleted file mode 100644 index b5a2c99..0000000 --- a/node_modules/express/node_modules/mkdirp/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "mkdirp", - "description": "Recursively mkdir, like `mkdir -p`", - "version": "0.3.3", - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "main": "./index", - "keywords": [ - "mkdir", - "directory" - ], - "repository": { - "type": "git", - "url": "http://github.com/substack/node-mkdirp.git" - }, - "scripts": { - "test": "tap test/*.js" - }, - "devDependencies": { - "tap": "~0.2.4" - }, - "license": "MIT/X11", - "engines": { - "node": "*" - }, - "readme": "mkdirp\n======\n\nLike `mkdir -p`, but in node.js!\n\n[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp)\n\nexample\n=======\n\npow.js\n------\n var mkdirp = require('mkdirp');\n \n mkdirp('/tmp/foo/bar/baz', function (err) {\n if (err) console.error(err)\n else console.log('pow!')\n });\n\nOutput\n pow!\n\nAnd now /tmp/foo/bar/baz exists, huzzah!\n\nmethods\n=======\n\nvar mkdirp = require('mkdirp');\n\nmkdirp(dir, mode, cb)\n---------------------\n\nCreate a new directory and any necessary subdirectories at `dir` with octal\npermission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\n`cb(err, made)` fires with the error or the first directory `made`\nthat had to be created, if any.\n\nmkdirp.sync(dir, mode)\n----------------------\n\nSynchronously create a new directory and any necessary subdirectories at `dir`\nwith octal permission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\nReturns the first directory that had to be created, if any.\n\ninstall\n=======\n\nWith [npm](http://npmjs.org) do:\n\n npm install mkdirp\n\nlicense\n=======\n\nMIT/X11\n", - "_id": "mkdirp@0.3.3", - "_from": "mkdirp@0.3.3" -} diff --git a/node_modules/express/node_modules/mkdirp/test/chmod.js b/node_modules/express/node_modules/mkdirp/test/chmod.js deleted file mode 100644 index 520dcb8..0000000 --- a/node_modules/express/node_modules/mkdirp/test/chmod.js +++ /dev/null @@ -1,38 +0,0 @@ -var mkdirp = require('../').mkdirp; -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -var ps = [ '', 'tmp' ]; - -for (var i = 0; i < 25; i++) { - var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - ps.push(dir); -} - -var file = ps.join('/'); - -test('chmod-pre', function (t) { - var mode = 0744 - mkdirp(file, mode, function (er) { - t.ifError(er, 'should not error'); - fs.stat(file, function (er, stat) { - t.ifError(er, 'should exist'); - t.ok(stat && stat.isDirectory(), 'should be directory'); - t.equal(stat && stat.mode & 0777, mode, 'should be 0744'); - t.end(); - }); - }); -}); - -test('chmod', function (t) { - var mode = 0755 - mkdirp(file, mode, function (er) { - t.ifError(er, 'should not error'); - fs.stat(file, function (er, stat) { - t.ifError(er, 'should exist'); - t.ok(stat && stat.isDirectory(), 'should be directory'); - t.end(); - }); - }); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/clobber.js b/node_modules/express/node_modules/mkdirp/test/clobber.js deleted file mode 100644 index 0eb7099..0000000 --- a/node_modules/express/node_modules/mkdirp/test/clobber.js +++ /dev/null @@ -1,37 +0,0 @@ -var mkdirp = require('../').mkdirp; -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -var ps = [ '', 'tmp' ]; - -for (var i = 0; i < 25; i++) { - var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - ps.push(dir); -} - -var file = ps.join('/'); - -// a file in the way -var itw = ps.slice(0, 3).join('/'); - - -test('clobber-pre', function (t) { - console.error("about to write to "+itw) - fs.writeFileSync(itw, 'I AM IN THE WAY, THE TRUTH, AND THE LIGHT.'); - - fs.stat(itw, function (er, stat) { - t.ifError(er) - t.ok(stat && stat.isFile(), 'should be file') - t.end() - }) -}) - -test('clobber', function (t) { - t.plan(2); - mkdirp(file, 0755, function (err) { - t.ok(err); - t.equal(err.code, 'ENOTDIR'); - t.end(); - }); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/mkdirp.js b/node_modules/express/node_modules/mkdirp/test/mkdirp.js deleted file mode 100644 index b07cd70..0000000 --- a/node_modules/express/node_modules/mkdirp/test/mkdirp.js +++ /dev/null @@ -1,28 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('woo', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - mkdirp(file, 0755, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }) - }); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/perm.js b/node_modules/express/node_modules/mkdirp/test/perm.js deleted file mode 100644 index 23a7abb..0000000 --- a/node_modules/express/node_modules/mkdirp/test/perm.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('async perm', function (t) { - t.plan(2); - var file = '/tmp/' + (Math.random() * (1<<30)).toString(16); - - mkdirp(file, 0755, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }) - }); -}); - -test('async root perm', function (t) { - mkdirp('/tmp', 0755, function (err) { - if (err) t.fail(err); - t.end(); - }); - t.end(); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/perm_sync.js b/node_modules/express/node_modules/mkdirp/test/perm_sync.js deleted file mode 100644 index f685f60..0000000 --- a/node_modules/express/node_modules/mkdirp/test/perm_sync.js +++ /dev/null @@ -1,39 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('sync perm', function (t) { - t.plan(2); - var file = '/tmp/' + (Math.random() * (1<<30)).toString(16) + '.json'; - - mkdirp.sync(file, 0755); - path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }); -}); - -test('sync root perm', function (t) { - t.plan(1); - - var file = '/tmp'; - mkdirp.sync(file, 0755); - path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/race.js b/node_modules/express/node_modules/mkdirp/test/race.js deleted file mode 100644 index 96a0447..0000000 --- a/node_modules/express/node_modules/mkdirp/test/race.js +++ /dev/null @@ -1,41 +0,0 @@ -var mkdirp = require('../').mkdirp; -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('race', function (t) { - t.plan(4); - var ps = [ '', 'tmp' ]; - - for (var i = 0; i < 25; i++) { - var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - ps.push(dir); - } - var file = ps.join('/'); - - var res = 2; - mk(file, function () { - if (--res === 0) t.end(); - }); - - mk(file, function () { - if (--res === 0) t.end(); - }); - - function mk (file, cb) { - mkdirp(file, 0755, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - if (cb) cb(); - } - }) - }) - }); - } -}); diff --git a/node_modules/express/node_modules/mkdirp/test/rel.js b/node_modules/express/node_modules/mkdirp/test/rel.js deleted file mode 100644 index 7985824..0000000 --- a/node_modules/express/node_modules/mkdirp/test/rel.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('rel', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var cwd = process.cwd(); - process.chdir('/tmp'); - - var file = [x,y,z].join('/'); - - mkdirp(file, 0755, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - process.chdir(cwd); - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }) - }); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/return.js b/node_modules/express/node_modules/mkdirp/test/return.js deleted file mode 100644 index bce68e5..0000000 --- a/node_modules/express/node_modules/mkdirp/test/return.js +++ /dev/null @@ -1,25 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('return value', function (t) { - t.plan(4); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - // should return the first dir created. - // By this point, it would be profoundly surprising if /tmp didn't - // already exist, since every other test makes things in there. - mkdirp(file, function (err, made) { - t.ifError(err); - t.equal(made, '/tmp/' + x); - mkdirp(file, function (err, made) { - t.ifError(err); - t.equal(made, null); - }); - }); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/return_sync.js b/node_modules/express/node_modules/mkdirp/test/return_sync.js deleted file mode 100644 index 7c222d3..0000000 --- a/node_modules/express/node_modules/mkdirp/test/return_sync.js +++ /dev/null @@ -1,24 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('return value', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - // should return the first dir created. - // By this point, it would be profoundly surprising if /tmp didn't - // already exist, since every other test makes things in there. - // Note that this will throw on failure, which will fail the test. - var made = mkdirp.sync(file); - t.equal(made, '/tmp/' + x); - - // making the same file again should have no effect. - made = mkdirp.sync(file); - t.equal(made, null); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/root.js b/node_modules/express/node_modules/mkdirp/test/root.js deleted file mode 100644 index 97ad7a2..0000000 --- a/node_modules/express/node_modules/mkdirp/test/root.js +++ /dev/null @@ -1,18 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('root', function (t) { - // '/' on unix, 'c:/' on windows. - var file = path.resolve('/'); - - mkdirp(file, 0755, function (err) { - if (err) throw err - fs.stat(file, function (er, stat) { - if (er) throw er - t.ok(stat.isDirectory(), 'target is a directory'); - t.end(); - }) - }); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/sync.js b/node_modules/express/node_modules/mkdirp/test/sync.js deleted file mode 100644 index 7530cad..0000000 --- a/node_modules/express/node_modules/mkdirp/test/sync.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('sync', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - try { - mkdirp.sync(file, 0755); - } catch (err) { - t.fail(err); - return t.end(); - } - - path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }); - }); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/umask.js b/node_modules/express/node_modules/mkdirp/test/umask.js deleted file mode 100644 index 64ccafe..0000000 --- a/node_modules/express/node_modules/mkdirp/test/umask.js +++ /dev/null @@ -1,28 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('implicit mode from umask', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - mkdirp(file, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0777 & (~process.umask())); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }) - }); -}); diff --git a/node_modules/express/node_modules/mkdirp/test/umask_sync.js b/node_modules/express/node_modules/mkdirp/test/umask_sync.js deleted file mode 100644 index 35bd5cb..0000000 --- a/node_modules/express/node_modules/mkdirp/test/umask_sync.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('umask sync modes', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - try { - mkdirp.sync(file); - } catch (err) { - t.fail(err); - return t.end(); - } - - path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, (0777 & (~process.umask()))); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }); - }); -}); diff --git a/node_modules/express/node_modules/range-parser/.npmignore b/node_modules/express/node_modules/range-parser/.npmignore deleted file mode 100644 index 9daeafb..0000000 --- a/node_modules/express/node_modules/range-parser/.npmignore +++ /dev/null @@ -1 +0,0 @@ -test diff --git a/node_modules/express/node_modules/range-parser/History.md b/node_modules/express/node_modules/range-parser/History.md deleted file mode 100644 index 82df7b1..0000000 --- a/node_modules/express/node_modules/range-parser/History.md +++ /dev/null @@ -1,15 +0,0 @@ - -0.0.4 / 2012-06-17 -================== - - * changed: ret -1 for unsatisfiable and -2 when invalid - -0.0.3 / 2012-06-17 -================== - - * fix last-byte-pos default to len - 1 - -0.0.2 / 2012-06-14 -================== - - * add `.type` diff --git a/node_modules/express/node_modules/range-parser/Makefile b/node_modules/express/node_modules/range-parser/Makefile deleted file mode 100644 index 8e8640f..0000000 --- a/node_modules/express/node_modules/range-parser/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --reporter spec \ - --require should - -.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/range-parser/Readme.md b/node_modules/express/node_modules/range-parser/Readme.md deleted file mode 100644 index b2a67fe..0000000 --- a/node_modules/express/node_modules/range-parser/Readme.md +++ /dev/null @@ -1,28 +0,0 @@ - -# node-range-parser - - Range header field parser. - -## Example: - -```js -assert(-1 == parse(200, 'bytes=500-20')); -assert(-2 == parse(200, 'bytes=malformed')); -parse(200, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 199 }])); -parse(1000, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 499 }])); -parse(1000, 'bytes=40-80').should.eql(arr('bytes', [{ start: 40, end: 80 }])); -parse(1000, 'bytes=-500').should.eql(arr('bytes', [{ start: 500, end: 999 }])); -parse(1000, 'bytes=-400').should.eql(arr('bytes', [{ start: 600, end: 999 }])); -parse(1000, 'bytes=500-').should.eql(arr('bytes', [{ start: 500, end: 999 }])); -parse(1000, 'bytes=400-').should.eql(arr('bytes', [{ start: 400, end: 999 }])); -parse(1000, 'bytes=0-0').should.eql(arr('bytes', [{ start: 0, end: 0 }])); -parse(1000, 'bytes=-1').should.eql(arr('bytes', [{ start: 999, end: 999 }])); -parse(1000, 'items=0-5').should.eql(arr('items', [{ start: 0, end: 5 }])); -parse(1000, 'bytes=40-80,-1').should.eql(arr('bytes', [{ start: 40, end: 80 }, { start: 999, end: 999 }])); -``` - -## Installation - -``` -$ npm install range-parser -``` \ No newline at end of file diff --git a/node_modules/express/node_modules/range-parser/index.js b/node_modules/express/node_modules/range-parser/index.js deleted file mode 100644 index 9b0f7a8..0000000 --- a/node_modules/express/node_modules/range-parser/index.js +++ /dev/null @@ -1,49 +0,0 @@ - -/** - * Parse "Range" header `str` relative to the given file `size`. - * - * @param {Number} size - * @param {String} str - * @return {Array} - * @api public - */ - -module.exports = function(size, str){ - var valid = true; - var i = str.indexOf('='); - - if (-1 == i) return -2; - - var arr = str.slice(i + 1).split(',').map(function(range){ - var range = range.split('-') - , start = parseInt(range[0], 10) - , end = parseInt(range[1], 10); - - // -nnn - if (isNaN(start)) { - start = size - end; - end = size - 1; - // nnn- - } else if (isNaN(end)) { - end = size - 1; - } - - // limit last-byte-pos to current length - if (end > size - 1) end = size - 1; - - // invalid - if (isNaN(start) - || isNaN(end) - || start > end - || start < 0) valid = false; - - return { - start: start, - end: end - }; - }); - - arr.type = str.slice(0, i); - - return valid ? arr : -1; -}; \ No newline at end of file diff --git a/node_modules/express/node_modules/range-parser/package.json b/node_modules/express/node_modules/range-parser/package.json deleted file mode 100644 index 8ff3a32..0000000 --- a/node_modules/express/node_modules/range-parser/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "range-parser", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca", - "url": "http://tjholowaychuk.com" - }, - "description": "Range header field string parser", - "version": "0.0.4", - "main": "index.js", - "dependencies": {}, - "devDependencies": { - "mocha": "*", - "should": "*" - }, - "readme": "\n# node-range-parser\n\n Range header field parser.\n\n## Example:\n\n```js\nassert(-1 == parse(200, 'bytes=500-20'));\nassert(-2 == parse(200, 'bytes=malformed'));\nparse(200, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 199 }]));\nparse(1000, 'bytes=0-499').should.eql(arr('bytes', [{ start: 0, end: 499 }]));\nparse(1000, 'bytes=40-80').should.eql(arr('bytes', [{ start: 40, end: 80 }]));\nparse(1000, 'bytes=-500').should.eql(arr('bytes', [{ start: 500, end: 999 }]));\nparse(1000, 'bytes=-400').should.eql(arr('bytes', [{ start: 600, end: 999 }]));\nparse(1000, 'bytes=500-').should.eql(arr('bytes', [{ start: 500, end: 999 }]));\nparse(1000, 'bytes=400-').should.eql(arr('bytes', [{ start: 400, end: 999 }]));\nparse(1000, 'bytes=0-0').should.eql(arr('bytes', [{ start: 0, end: 0 }]));\nparse(1000, 'bytes=-1').should.eql(arr('bytes', [{ start: 999, end: 999 }]));\nparse(1000, 'items=0-5').should.eql(arr('items', [{ start: 0, end: 5 }]));\nparse(1000, 'bytes=40-80,-1').should.eql(arr('bytes', [{ start: 40, end: 80 }, { start: 999, end: 999 }]));\n```\n\n## Installation\n\n```\n$ npm install range-parser\n```", - "_id": "range-parser@0.0.4", - "_from": "range-parser@0.0.4" -} diff --git a/node_modules/express/node_modules/send/.npmignore b/node_modules/express/node_modules/send/.npmignore deleted file mode 100644 index f1250e5..0000000 --- a/node_modules/express/node_modules/send/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -support -test -examples -*.sock diff --git a/node_modules/express/node_modules/send/History.md b/node_modules/express/node_modules/send/History.md deleted file mode 100644 index 20c5319..0000000 --- a/node_modules/express/node_modules/send/History.md +++ /dev/null @@ -1,25 +0,0 @@ - -0.1.0 / 2012-08-25 -================== - - * add options parameter to send() that is passed to fs.createReadStream() [kanongil] - -0.0.4 / 2012-08-16 -================== - - * allow custom "Accept-Ranges" definition - -0.0.3 / 2012-07-16 -================== - - * fix normalization of the root directory. Closes #3 - -0.0.2 / 2012-07-09 -================== - - * add passing of req explicitly for now (YUCK) - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/node_modules/express/node_modules/send/Makefile b/node_modules/express/node_modules/send/Makefile deleted file mode 100644 index a9dcfd5..0000000 --- a/node_modules/express/node_modules/send/Makefile +++ /dev/null @@ -1,8 +0,0 @@ - -test: - @./node_modules/.bin/mocha \ - --require should \ - --reporter spec \ - --bail - -.PHONY: test \ No newline at end of file diff --git a/node_modules/express/node_modules/send/Readme.md b/node_modules/express/node_modules/send/Readme.md deleted file mode 100644 index 85171a9..0000000 --- a/node_modules/express/node_modules/send/Readme.md +++ /dev/null @@ -1,123 +0,0 @@ - -# send - - Send is Connect's `static()` extracted for generalized use, a streaming static file - server supporting partial responses (Ranges), conditional-GET negotiation, high test coverage, and granular events which may be leveraged to take appropriate actions in your application or framework. - -## Installation - - $ npm install send - -## Examples - - Small: - -```js -var http = require('http'); -var send = require('send'); - -var app = http.createServer(function(req, res){ - send(req, req.url).pipe(res); -}); -``` - - Serving from a root directory with custom error-handling: - -```js -var http = require('http'); -var send = require('send'); - -var app = http.createServer(function(req, res){ - // your custom error-handling logic: - function error(err) { - res.statusCode = err.status || 500; - res.end(err.message); - } - - // your custom directory handling logic: - function redirect() { - res.statusCode = 301; - res.setHeader('Location', req.url + '/'); - res.end('Redirecting to ' + req.url + '/'); - } - - // transfer arbitrary files from within - // /www/example.com/public/* - send(req, url.parse(req.url).pathname) - .root('/www/example.com/public') - .on('error', error) - .on('directory', redirect) - .pipe(res); -}); -``` - -## API - -### Events - - - `error` an error occurred `(err)` - - `directory` a directory was requested - - `stream` file streaming has started `(stream)` - - `end` streaming has completed - -### .root(dir) - - Serve files relative to `path`. Aliased as `.from(dir)`. - -### .index(path) - - By default send supports "index.html" files, to disable this - invoke `.index(false)` or to supply a new index pass a string. - -### .maxage(ms) - - Provide a max-age in milliseconds for http caching, defaults to 0. - -## Error-handling - - By default when no `error` listeners are present an automatic response will be made, otherwise you have full control over the response, aka you may show a 5xx page etc. - -## Caching - - It does _not_ perform internal caching, you should use a reverse proxy cache such - as Varnish for this, or those fancy things called CDNs. If your application is small enough that it would benefit from single-node memory caching, it's small enough that it does not need caching at all ;). - -## Debugging - - To enable `debug()` instrumentation output export __DEBUG__: - -``` -$ DEBUG=send node app -``` - -## Running tests - -``` -$ npm install -$ make test -``` - -## License - -(The MIT License) - -Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca> - -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. \ No newline at end of file diff --git a/node_modules/express/node_modules/send/index.js b/node_modules/express/node_modules/send/index.js deleted file mode 100644 index f17158d..0000000 --- a/node_modules/express/node_modules/send/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/send'); \ No newline at end of file diff --git a/node_modules/express/node_modules/send/lib/send.js b/node_modules/express/node_modules/send/lib/send.js deleted file mode 100644 index de72146..0000000 --- a/node_modules/express/node_modules/send/lib/send.js +++ /dev/null @@ -1,473 +0,0 @@ - -/** - * Module dependencies. - */ - -var debug = require('debug')('send') - , parseRange = require('range-parser') - , Stream = require('stream') - , mime = require('mime') - , fresh = require('fresh') - , path = require('path') - , http = require('http') - , fs = require('fs') - , basename = path.basename - , normalize = path.normalize - , join = path.join - , utils = require('./utils'); - -/** - * Expose `send`. - */ - -exports = module.exports = send; - -/** - * Expose mime module. - */ - -exports.mime = mime; - -/** - * Return a `SendStream` for `req` and `path`. - * - * @param {Request} req - * @param {String} path - * @param {Object} options - * @return {SendStream} - * @api public - */ - -function send(req, path, options) { - return new SendStream(req, path, options); -} - -/** - * Initialize a `SendStream` with the given `path`. - * - * Events: - * - * - `error` an error occurred - * - `stream` file streaming has started - * - `end` streaming has completed - * - `directory` a directory was requested - * - * @param {Request} req - * @param {String} path - * @param {Object} options - * @api private - */ - -function SendStream(req, path, options) { - var self = this; - this.req = req; - this.path = path; - this.options = options || {}; - this.maxage(0); - this.hidden(false); - this.index('index.html'); -} - -/** - * Inherits from `Stream.prototype`. - */ - -SendStream.prototype.__proto__ = Stream.prototype; - -/** - * Enable or disable "hidden" (dot) files. - * - * @param {Boolean} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.hidden = function(val){ - debug('hidden %s', val); - this._hidden = val; - return this; -}; - -/** - * Set index `path`, set to a falsy - * value to disable index support. - * - * @param {String|Boolean} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.index = function(path){ - debug('index %s', path); - this._index = path; - return this; -}; - -/** - * Set root `path`. - * - * @param {String} path - * @return {SendStream} - * @api public - */ - -SendStream.prototype.root = -SendStream.prototype.from = function(path){ - this._root = normalize(path); - return this; -}; - -/** - * Set max-age to `ms`. - * - * @param {Number} ms - * @return {SendStream} - * @api public - */ - -SendStream.prototype.maxage = function(ms){ - if (Infinity == ms) ms = 60 * 60 * 24 * 365 * 1000; - debug('max-age %d', ms); - this._maxage = ms; - return this; -}; - -/** - * Emit error with `status`. - * - * @param {Number} status - * @api private - */ - -SendStream.prototype.error = function(status, err){ - var res = this.res; - var msg = http.STATUS_CODES[status]; - err = err || new Error(msg); - err.status = status; - if (this.listeners('error').length) return this.emit('error', err); - res.statusCode = err.status; - res.end(msg); -}; - -/** - * Check if the pathname is potentially malicious. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isMalicious = function(){ - return !this._root && ~this.path.indexOf('..'); -}; - -/** - * Check if the pathname ends with "/". - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.hasTrailingSlash = function(){ - return '/' == this.path[this.path.length - 1]; -}; - -/** - * Check if the basename leads with ".". - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.hasLeadingDot = function(){ - return '.' == basename(this.path)[0]; -}; - -/** - * Check if this is a conditional GET request. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isConditionalGET = function(){ - return this.req.headers['if-none-match'] - || this.req.headers['if-modified-since']; -}; - -/** - * Strip content-* header fields. - * - * @api private - */ - -SendStream.prototype.removeContentHeaderFields = function(){ - var res = this.res; - Object.keys(res._headers).forEach(function(field){ - if (0 == field.indexOf('content')) { - res.removeHeader(field); - } - }); -}; - -/** - * Respond with 304 not modified. - * - * @api private - */ - -SendStream.prototype.notModified = function(){ - var res = this.res; - debug('not modified'); - this.removeContentHeaderFields(); - res.statusCode = 304; - res.end(); -}; - -/** - * Check if the request is cacheable, aka - * responded with 2xx or 304 (see RFC 2616 section 14.2{5,6}). - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isCachable = function(){ - var res = this.res; - return (res.statusCode >= 200 && res.statusCode < 300) || 304 == res.statusCode; -}; - -/** - * Handle stat() error. - * - * @param {Error} err - * @api private - */ - -SendStream.prototype.onStatError = function(err){ - var notfound = ['ENOENT', 'ENAMETOOLONG', 'ENOTDIR']; - if (~notfound.indexOf(err.code)) return this.error(404, err); - this.error(500, err); -}; - -/** - * Check if the cache is fresh. - * - * @return {Boolean} - * @api private - */ - -SendStream.prototype.isFresh = function(){ - return fresh(this.req.headers, this.res._headers); -}; - -/** - * Redirect to `path`. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.redirect = function(path){ - if (this.listeners('directory').length) return this.emit('directory'); - var res = this.res; - path += '/'; - res.statusCode = 301; - res.setHeader('Location', path); - res.end('Redirecting to ' + utils.escape(path)); -}; - -/** - * Pipe to `res. - * - * @param {Stream} res - * @return {Stream} res - * @api public - */ - -SendStream.prototype.pipe = function(res){ - var self = this - , args = arguments - , path = this.path - , root = this._root; - - // references - this.res = res; - - // invalid request uri - path = utils.decode(path); - if (-1 == path) return this.error(400); - - // null byte(s) - if (~path.indexOf('\0')) return this.error(400); - - // join / normalize from optional root dir - if (root) path = normalize(join(this._root, path)); - - // ".." is malicious without "root" - if (this.isMalicious()) return this.error(403); - - // malicious path - if (root && 0 != path.indexOf(root)) return this.error(403); - - // hidden file support - if (!this._hidden && this.hasLeadingDot()) return this.error(404); - - // index file support - if (this._index && this.hasTrailingSlash()) path += this._index; - - debug('stat "%s"', path); - fs.stat(path, function(err, stat){ - if (err) return self.onStatError(err); - if (stat.isDirectory()) return self.redirect(self.path); - self.send(path, stat); - }); - - return res; -}; - -/** - * Transfer `path`. - * - * @param {String} path - * @api public - */ - -SendStream.prototype.send = function(path, stat){ - var options = this.options; - var len = stat.size; - var res = this.res; - var req = this.req; - var ranges = req.headers.range; - var offset = options.start || 0; - - // set header fields - this.setHeader(stat); - - // set content-type - this.type(path); - - // conditional GET support - if (this.isConditionalGET() - && this.isCachable() - && this.isFresh()) { - return this.notModified(); - } - - // adjust len to start/end options - len = Math.max(0, len - offset); - if (options.end !== undefined) { - var bytes = options.end - offset + 1; - if (len > bytes) len = bytes; - } - - // Range support - if (ranges) { - ranges = parseRange(len, ranges); - - // unsatisfiable - if (-1 == ranges) { - res.setHeader('Content-Range', 'bytes */' + stat.size); - return this.error(416); - } - - // valid (syntactically invalid ranges are treated as a regular response) - if (-2 != ranges) { - options.start = offset + ranges[0].start; - options.end = offset + ranges[0].end; - - // Content-Range - res.statusCode = 206; - res.setHeader('Content-Range', 'bytes ' - + ranges[0].start - + '-' - + ranges[0].end - + '/' - + len); - len = options.end - options.start + 1; - } - } - - // content-length - res.setHeader('Content-Length', len); - - // HEAD support - if ('HEAD' == req.method) return res.end(); - - this.stream(path, options); -}; - -/** - * Stream `path` to the response. - * - * @param {String} path - * @param {Object} options - * @api private - */ - -SendStream.prototype.stream = function(path, options){ - // TODO: this is all lame, refactor meeee - var self = this; - var res = this.res; - var req = this.req; - - // pipe - var stream = fs.createReadStream(path, options); - this.emit('stream', stream); - stream.pipe(res); - - // socket closed, done with the fd - req.on('close', stream.destroy.bind(stream)); - - // error handling code-smell - stream.on('error', function(err){ - // no hope in responding - if (res._header) { - console.error(err.stack); - req.destroy(); - return; - } - - // 500 - err.status = 500; - self.emit('error', err); - }); - - // end - stream.on('end', function(){ - self.emit('end'); - }); -}; - -/** - * Set content-type based on `path` - * if it hasn't been explicitly set. - * - * @param {String} path - * @api private - */ - -SendStream.prototype.type = function(path){ - var res = this.res; - if (res.getHeader('Content-Type')) return; - var type = mime.lookup(path); - var charset = mime.charsets.lookup(type); - debug('content-type %s', type); - res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : '')); -}; - -/** - * Set reaponse header fields, most - * fields may be pre-defined. - * - * @param {Object} stat - * @api private - */ - -SendStream.prototype.setHeader = function(stat){ - var res = this.res; - if (!res.getHeader('Accept-Ranges')) res.setHeader('Accept-Ranges', 'bytes'); - if (!res.getHeader('ETag')) res.setHeader('ETag', utils.etag(stat)); - if (!res.getHeader('Date')) res.setHeader('Date', new Date().toUTCString()); - if (!res.getHeader('Cache-Control')) res.setHeader('Cache-Control', 'public, max-age=' + (this._maxage / 1000)); - if (!res.getHeader('Last-Modified')) res.setHeader('Last-Modified', stat.mtime.toUTCString()); -}; diff --git a/node_modules/express/node_modules/send/lib/utils.js b/node_modules/express/node_modules/send/lib/utils.js deleted file mode 100644 index 950e5a2..0000000 --- a/node_modules/express/node_modules/send/lib/utils.js +++ /dev/null @@ -1,47 +0,0 @@ - -/** - * Return an ETag in the form of `"-"` - * from the given `stat`. - * - * @param {Object} stat - * @return {String} - * @api private - */ - -exports.etag = function(stat) { - return '"' + stat.size + '-' + Number(stat.mtime) + '"'; -}; - -/** - * decodeURIComponent. - * - * Allows V8 to only deoptimize this fn instead of all - * of send(). - * - * @param {String} path - * @api private - */ - -exports.decode = function(path){ - try { - return decodeURIComponent(path); - } catch (err) { - return -1; - } -}; - -/** - * Escape the given string of `html`. - * - * @param {String} html - * @return {String} - * @api private - */ - -exports.escape = function(html){ - return String(html) - .replace(/&(?!\w+;)/g, '&') - .replace(//g, '>') - .replace(/"/g, '"'); -}; \ No newline at end of file diff --git a/node_modules/express/node_modules/send/node_modules/mime/LICENSE b/node_modules/express/node_modules/send/node_modules/mime/LICENSE deleted file mode 100644 index 451fc45..0000000 --- a/node_modules/express/node_modules/send/node_modules/mime/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Benjamin Thomas, Robert Kieffer - -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/node_modules/express/node_modules/send/node_modules/mime/README.md b/node_modules/express/node_modules/send/node_modules/mime/README.md deleted file mode 100644 index d8b66a8..0000000 --- a/node_modules/express/node_modules/send/node_modules/mime/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# mime - -Comprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community. - -## Install - -Install with [npm](http://github.com/isaacs/npm): - - npm install mime - -## API - Queries - -### mime.lookup(path) -Get the mime type associated with a file. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g. - - var mime = require('mime'); - - mime.lookup('/path/to/file.txt'); // => 'text/plain' - mime.lookup('file.txt'); // => 'text/plain' - mime.lookup('.TXT'); // => 'text/plain' - mime.lookup('htm'); // => 'text/html' - -### mime.extension(type) -Get the default extension for `type` - - mime.extension('text/html'); // => 'html' - mime.extension('application/octet-stream'); // => 'bin' - -### mime.charsets.lookup() - -Map mime-type to charset - - mime.charsets.lookup('text/plain'); // => 'UTF-8' - -(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.) - -## API - Defining Custom Types - -The following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/bentomas/node-mime/wiki/Requesting-New-Types). - -### mime.define() - -Add custom mime/extension mappings - - mime.define({ - 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'], - 'application/x-my-type': ['x-mt', 'x-mtt'], - // etc ... - }); - - mime.lookup('x-sft'); // => 'text/x-some-format' - -The first entry in the extensions array is returned by `mime.extension()`. E.g. - - mime.extension('text/x-some-format'); // => 'x-sf' - -### mime.load(filepath) - -Load mappings from an Apache ".types" format file - - mime.load('./my_project.types'); - -The .types file format is simple - See the `types` dir for examples. diff --git a/node_modules/express/node_modules/send/node_modules/mime/mime.js b/node_modules/express/node_modules/send/node_modules/mime/mime.js deleted file mode 100644 index 1e00585..0000000 --- a/node_modules/express/node_modules/send/node_modules/mime/mime.js +++ /dev/null @@ -1,104 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -function Mime() { - // Map of extension -> mime type - this.types = Object.create(null); - - // Map of mime type -> extension - this.extensions = Object.create(null); -} - -/** - * Define mimetype -> extension mappings. Each key is a mime-type that maps - * to an array of extensions associated with the type. The first extension is - * used as the default extension for the type. - * - * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); - * - * @param map (Object) type definitions - */ -Mime.prototype.define = function (map) { - for (var type in map) { - var exts = map[type]; - - for (var i = 0; i < exts.length; i++) { - this.types[exts[i]] = type; - } - - // Default extension is the first one we encounter - if (!this.extensions[type]) { - this.extensions[type] = exts[0]; - } - } -}; - -/** - * Load an Apache2-style ".types" file - * - * This may be called multiple times (it's expected). Where files declare - * overlapping types/extensions, the last file wins. - * - * @param file (String) path of file to load. - */ -Mime.prototype.load = function(file) { - // Read file and split into lines - var map = {}, - content = fs.readFileSync(file, 'ascii'), - lines = content.split(/[\r\n]+/); - - lines.forEach(function(line) { - // Clean up whitespace/comments, and split into fields - var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/); - map[fields.shift()] = fields; - }); - - this.define(map); -}; - -/** - * Lookup a mime type based on extension - */ -Mime.prototype.lookup = function(path, fallback) { - var ext = path.replace(/.*[\.\/]/, '').toLowerCase(); - - return this.types[ext] || fallback || this.default_type; -}; - -/** - * Return file extension associated with a mime type - */ -Mime.prototype.extension = function(mimeType) { - return this.extensions[mimeType]; -}; - -// Default instance -var mime = new Mime(); - -// Load local copy of -// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types -mime.load(path.join(__dirname, 'types/mime.types')); - -// Load additional types from node.js community -mime.load(path.join(__dirname, 'types/node.types')); - -// Default type -mime.default_type = mime.lookup('bin'); - -// -// Additional API specific to the default instance -// - -mime.Mime = Mime; - -/** - * Lookup a charset based on mime type. - */ -mime.charsets = { - lookup: function(mimeType, fallback) { - // Assume text types are utf8 - return (/^text\//).test(mimeType) ? 'UTF-8' : fallback; - } -} - -module.exports = mime; diff --git a/node_modules/express/node_modules/send/node_modules/mime/package.json b/node_modules/express/node_modules/send/node_modules/mime/package.json deleted file mode 100644 index a265300..0000000 --- a/node_modules/express/node_modules/send/node_modules/mime/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "author": { - "name": "Robert Kieffer", - "email": "robert@broofa.com", - "url": "http://github.com/broofa" - }, - "contributors": [ - { - "name": "Benjamin Thomas", - "email": "benjamin@benjaminthomas.org", - "url": "http://github.com/bentomas" - } - ], - "dependencies": {}, - "description": "A comprehensive library for mime-type mapping", - "devDependencies": {}, - "keywords": [ - "util", - "mime" - ], - "main": "mime.js", - "name": "mime", - "repository": { - "url": "https://github.com/broofa/node-mime", - "type": "git" - }, - "version": "1.2.6", - "readme": "# mime\n\nComprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community.\n\n## Install\n\nInstall with [npm](http://github.com/isaacs/npm):\n\n npm install mime\n\n## API - Queries\n\n### mime.lookup(path)\nGet the mime type associated with a file. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g.\n\n var mime = require('mime');\n\n mime.lookup('/path/to/file.txt'); // => 'text/plain'\n mime.lookup('file.txt'); // => 'text/plain'\n mime.lookup('.TXT'); // => 'text/plain'\n mime.lookup('htm'); // => 'text/html'\n\n### mime.extension(type)\nGet the default extension for `type`\n\n mime.extension('text/html'); // => 'html'\n mime.extension('application/octet-stream'); // => 'bin'\n\n### mime.charsets.lookup()\n\nMap mime-type to charset\n\n mime.charsets.lookup('text/plain'); // => 'UTF-8'\n\n(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.)\n\n## API - Defining Custom Types\n\nThe following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/bentomas/node-mime/wiki/Requesting-New-Types).\n\n### mime.define()\n\nAdd custom mime/extension mappings\n\n mime.define({\n 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'],\n 'application/x-my-type': ['x-mt', 'x-mtt'],\n // etc ...\n });\n\n mime.lookup('x-sft'); // => 'text/x-some-format'\n\nThe first entry in the extensions array is returned by `mime.extension()`. E.g.\n\n mime.extension('text/x-some-format'); // => 'x-sf'\n\n### mime.load(filepath)\n\nLoad mappings from an Apache \".types\" format file\n\n mime.load('./my_project.types');\n\nThe .types file format is simple - See the `types` dir for examples.\n", - "_id": "mime@1.2.6", - "_from": "mime@1.2.6" -} diff --git a/node_modules/express/node_modules/send/node_modules/mime/test.js b/node_modules/express/node_modules/send/node_modules/mime/test.js deleted file mode 100644 index cbad034..0000000 --- a/node_modules/express/node_modules/send/node_modules/mime/test.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Usage: node test.js - */ - -var mime = require('./mime'); -var assert = require('assert'); - -function eq(a, b) { - console.log('Test: ' + a + ' === ' + b); - assert.strictEqual.apply(null, arguments); -} - -console.log(Object.keys(mime.extensions).length + ' types'); -console.log(Object.keys(mime.types).length + ' extensions\n'); - -// -// Test mime lookups -// - -eq('text/plain', mime.lookup('text.txt')); -eq('text/plain', mime.lookup('.text.txt')); -eq('text/plain', mime.lookup('.txt')); -eq('text/plain', mime.lookup('txt')); -eq('application/octet-stream', mime.lookup('text.nope')); -eq('fallback', mime.lookup('text.fallback', 'fallback')); -eq('application/octet-stream', mime.lookup('constructor')); -eq('text/plain', mime.lookup('TEXT.TXT')); -eq('text/event-stream', mime.lookup('text/event-stream')); -eq('application/x-web-app-manifest+json', mime.lookup('text.webapp')); - -// -// Test extensions -// - -eq('txt', mime.extension(mime.types.text)); -eq('html', mime.extension(mime.types.htm)); -eq('bin', mime.extension('application/octet-stream')); -eq(undefined, mime.extension('constructor')); - -// -// Test node types -// - -eq('application/octet-stream', mime.lookup('file.buffer')); -eq('audio/mp4', mime.lookup('file.m4a')); - -// -// Test charsets -// - -eq('UTF-8', mime.charsets.lookup('text/plain')); -eq(undefined, mime.charsets.lookup(mime.types.js)); -eq('fallback', mime.charsets.lookup('application/octet-stream', 'fallback')); - -console.log('\nOK'); diff --git a/node_modules/express/node_modules/send/node_modules/mime/types/mime.types b/node_modules/express/node_modules/send/node_modules/mime/types/mime.types deleted file mode 100644 index b3cae2e..0000000 --- a/node_modules/express/node_modules/send/node_modules/mime/types/mime.types +++ /dev/null @@ -1,1510 +0,0 @@ -# This file maps Internet media types to unique file extension(s). -# Although created for httpd, this file is used by many software systems -# and has been placed in the public domain for unlimited redisribution. -# -# The table below contains both registered and (common) unregistered types. -# A type that has no unique extension can be ignored -- they are listed -# here to guide configurations toward known types and to make it easier to -# identify "new" types. File extensions are also commonly used to indicate -# content languages and encodings, so choose them carefully. -# -# Internet media types should be registered as described in RFC 4288. -# The registry is at . -# -# MIME type (lowercased) Extensions -# ============================================ ========== -# application/1d-interleaved-parityfec -# application/3gpp-ims+xml -# application/activemessage -application/andrew-inset ez -# application/applefile -application/applixware aw -application/atom+xml atom -application/atomcat+xml atomcat -# application/atomicmail -application/atomsvc+xml atomsvc -# application/auth-policy+xml -# application/batch-smtp -# application/beep+xml -# application/calendar+xml -# application/cals-1840 -# application/ccmp+xml -application/ccxml+xml ccxml -application/cdmi-capability cdmia -application/cdmi-container cdmic -application/cdmi-domain cdmid -application/cdmi-object cdmio -application/cdmi-queue cdmiq -# application/cea-2018+xml -# application/cellml+xml -# application/cfw -# application/cnrp+xml -# application/commonground -# application/conference-info+xml -# application/cpl+xml -# application/csta+xml -# application/cstadata+xml -application/cu-seeme cu -# application/cybercash -application/davmount+xml davmount -# application/dca-rft -# application/dec-dx -# application/dialog-info+xml -# application/dicom -# application/dns -# application/dskpp+xml -application/dssc+der dssc -application/dssc+xml xdssc -# application/dvcs -application/ecmascript ecma -# application/edi-consent -# application/edi-x12 -# application/edifact -application/emma+xml emma -# application/epp+xml -application/epub+zip epub -# application/eshop -# application/example -application/exi exi -# application/fastinfoset -# application/fastsoap -# application/fits -application/font-tdpfr pfr -# application/framework-attributes+xml -# application/h224 -# application/held+xml -# application/http -application/hyperstudio stk -# application/ibe-key-request+xml -# application/ibe-pkg-reply+xml -# application/ibe-pp-data -# application/iges -# application/im-iscomposing+xml -# application/index -# application/index.cmd -# application/index.obj -# application/index.response -# application/index.vnd -application/inkml+xml ink inkml -# application/iotp -application/ipfix ipfix -# application/ipp -# application/isup -application/java-archive jar -application/java-serialized-object ser -application/java-vm class -application/javascript js -application/json json -# application/kpml-request+xml -# application/kpml-response+xml -application/lost+xml lostxml -application/mac-binhex40 hqx -application/mac-compactpro cpt -# application/macwriteii -application/mads+xml mads -application/marc mrc -application/marcxml+xml mrcx -application/mathematica ma nb mb -# application/mathml-content+xml -# application/mathml-presentation+xml -application/mathml+xml mathml -# application/mbms-associated-procedure-description+xml -# application/mbms-deregister+xml -# application/mbms-envelope+xml -# application/mbms-msk+xml -# application/mbms-msk-response+xml -# application/mbms-protection-description+xml -# application/mbms-reception-report+xml -# application/mbms-register+xml -# application/mbms-register-response+xml -# application/mbms-user-service-description+xml -application/mbox mbox -# application/media_control+xml -application/mediaservercontrol+xml mscml -application/metalink4+xml meta4 -application/mets+xml mets -# application/mikey -application/mods+xml mods -# application/moss-keys -# application/moss-signature -# application/mosskey-data -# application/mosskey-request -application/mp21 m21 mp21 -application/mp4 mp4s -# application/mpeg4-generic -# application/mpeg4-iod -# application/mpeg4-iod-xmt -# application/msc-ivr+xml -# application/msc-mixer+xml -application/msword doc dot -application/mxf mxf -# application/nasdata -# application/news-checkgroups -# application/news-groupinfo -# application/news-transmission -# application/nss -# application/ocsp-request -# application/ocsp-response -application/octet-stream bin dms lha lrf lzh so iso dmg dist distz pkg bpk dump elc deploy -application/oda oda -application/oebps-package+xml opf -application/ogg ogx -application/onenote onetoc onetoc2 onetmp onepkg -application/oxps oxps -# application/parityfec -application/patch-ops-error+xml xer -application/pdf pdf -application/pgp-encrypted pgp -# application/pgp-keys -application/pgp-signature asc sig -application/pics-rules prf -# application/pidf+xml -# application/pidf-diff+xml -application/pkcs10 p10 -application/pkcs7-mime p7m p7c -application/pkcs7-signature p7s -application/pkcs8 p8 -application/pkix-attr-cert ac -application/pkix-cert cer -application/pkix-crl crl -application/pkix-pkipath pkipath -application/pkixcmp pki -application/pls+xml pls -# application/poc-settings+xml -application/postscript ai eps ps -# application/prs.alvestrand.titrax-sheet -application/prs.cww cww -# application/prs.nprend -# application/prs.plucker -# application/prs.rdf-xml-crypt -# application/prs.xsf+xml -application/pskc+xml pskcxml -# application/qsig -application/rdf+xml rdf -application/reginfo+xml rif -application/relax-ng-compact-syntax rnc -# application/remote-printing -application/resource-lists+xml rl -application/resource-lists-diff+xml rld -# application/riscos -# application/rlmi+xml -application/rls-services+xml rs -application/rpki-ghostbusters gbr -application/rpki-manifest mft -application/rpki-roa roa -# application/rpki-updown -application/rsd+xml rsd -application/rss+xml rss -application/rtf rtf -# application/rtx -# application/samlassertion+xml -# application/samlmetadata+xml -application/sbml+xml sbml -application/scvp-cv-request scq -application/scvp-cv-response scs -application/scvp-vp-request spq -application/scvp-vp-response spp -application/sdp sdp -# application/set-payment -application/set-payment-initiation setpay -# application/set-registration -application/set-registration-initiation setreg -# application/sgml -# application/sgml-open-catalog -application/shf+xml shf -# application/sieve -# application/simple-filter+xml -# application/simple-message-summary -# application/simplesymbolcontainer -# application/slate -# application/smil -application/smil+xml smi smil -# application/soap+fastinfoset -# application/soap+xml -application/sparql-query rq -application/sparql-results+xml srx -# application/spirits-event+xml -application/srgs gram -application/srgs+xml grxml -application/sru+xml sru -application/ssml+xml ssml -# application/tamp-apex-update -# application/tamp-apex-update-confirm -# application/tamp-community-update -# application/tamp-community-update-confirm -# application/tamp-error -# application/tamp-sequence-adjust -# application/tamp-sequence-adjust-confirm -# application/tamp-status-query -# application/tamp-status-response -# application/tamp-update -# application/tamp-update-confirm -application/tei+xml tei teicorpus -application/thraud+xml tfi -# application/timestamp-query -# application/timestamp-reply -application/timestamped-data tsd -# application/tve-trigger -# application/ulpfec -# application/vcard+xml -# application/vemmi -# application/vividence.scriptfile -# application/vnd.3gpp.bsf+xml -application/vnd.3gpp.pic-bw-large plb -application/vnd.3gpp.pic-bw-small psb -application/vnd.3gpp.pic-bw-var pvb -# application/vnd.3gpp.sms -# application/vnd.3gpp2.bcmcsinfo+xml -# application/vnd.3gpp2.sms -application/vnd.3gpp2.tcap tcap -application/vnd.3m.post-it-notes pwn -application/vnd.accpac.simply.aso aso -application/vnd.accpac.simply.imp imp -application/vnd.acucobol acu -application/vnd.acucorp atc acutc -application/vnd.adobe.air-application-installer-package+zip air -application/vnd.adobe.fxp fxp fxpl -# application/vnd.adobe.partial-upload -application/vnd.adobe.xdp+xml xdp -application/vnd.adobe.xfdf xfdf -# application/vnd.aether.imp -# application/vnd.ah-barcode -application/vnd.ahead.space ahead -application/vnd.airzip.filesecure.azf azf -application/vnd.airzip.filesecure.azs azs -application/vnd.amazon.ebook azw -application/vnd.americandynamics.acc acc -application/vnd.amiga.ami ami -# application/vnd.amundsen.maze+xml -application/vnd.android.package-archive apk -application/vnd.anser-web-certificate-issue-initiation cii -application/vnd.anser-web-funds-transfer-initiation fti -application/vnd.antix.game-component atx -application/vnd.apple.installer+xml mpkg -application/vnd.apple.mpegurl m3u8 -# application/vnd.arastra.swi -application/vnd.aristanetworks.swi swi -application/vnd.astraea-software.iota iota -application/vnd.audiograph aep -# application/vnd.autopackage -# application/vnd.avistar+xml -application/vnd.blueice.multipass mpm -# application/vnd.bluetooth.ep.oob -application/vnd.bmi bmi -application/vnd.businessobjects rep -# application/vnd.cab-jscript -# application/vnd.canon-cpdl -# application/vnd.canon-lips -# application/vnd.cendio.thinlinc.clientconf -application/vnd.chemdraw+xml cdxml -application/vnd.chipnuts.karaoke-mmd mmd -application/vnd.cinderella cdy -# application/vnd.cirpack.isdn-ext -application/vnd.claymore cla -application/vnd.cloanto.rp9 rp9 -application/vnd.clonk.c4group c4g c4d c4f c4p c4u -application/vnd.cluetrust.cartomobile-config c11amc -application/vnd.cluetrust.cartomobile-config-pkg c11amz -# application/vnd.collection+json -# application/vnd.commerce-battelle -application/vnd.commonspace csp -application/vnd.contact.cmsg cdbcmsg -application/vnd.cosmocaller cmc -application/vnd.crick.clicker clkx -application/vnd.crick.clicker.keyboard clkk -application/vnd.crick.clicker.palette clkp -application/vnd.crick.clicker.template clkt -application/vnd.crick.clicker.wordbank clkw -application/vnd.criticaltools.wbs+xml wbs -application/vnd.ctc-posml pml -# application/vnd.ctct.ws+xml -# application/vnd.cups-pdf -# application/vnd.cups-postscript -application/vnd.cups-ppd ppd -# application/vnd.cups-raster -# application/vnd.cups-raw -# application/vnd.curl -application/vnd.curl.car car -application/vnd.curl.pcurl pcurl -# application/vnd.cybank -application/vnd.data-vision.rdz rdz -application/vnd.dece.data uvf uvvf uvd uvvd -application/vnd.dece.ttml+xml uvt uvvt -application/vnd.dece.unspecified uvx uvvx -application/vnd.dece.zip uvz uvvz -application/vnd.denovo.fcselayout-link fe_launch -# application/vnd.dir-bi.plate-dl-nosuffix -application/vnd.dna dna -application/vnd.dolby.mlp mlp -# application/vnd.dolby.mobile.1 -# application/vnd.dolby.mobile.2 -application/vnd.dpgraph dpg -application/vnd.dreamfactory dfac -application/vnd.dvb.ait ait -# application/vnd.dvb.dvbj -# application/vnd.dvb.esgcontainer -# application/vnd.dvb.ipdcdftnotifaccess -# application/vnd.dvb.ipdcesgaccess -# application/vnd.dvb.ipdcesgaccess2 -# application/vnd.dvb.ipdcesgpdd -# application/vnd.dvb.ipdcroaming -# application/vnd.dvb.iptv.alfec-base -# application/vnd.dvb.iptv.alfec-enhancement -# application/vnd.dvb.notif-aggregate-root+xml -# application/vnd.dvb.notif-container+xml -# application/vnd.dvb.notif-generic+xml -# application/vnd.dvb.notif-ia-msglist+xml -# application/vnd.dvb.notif-ia-registration-request+xml -# application/vnd.dvb.notif-ia-registration-response+xml -# application/vnd.dvb.notif-init+xml -# application/vnd.dvb.pfr -application/vnd.dvb.service svc -# application/vnd.dxr -application/vnd.dynageo geo -# application/vnd.easykaraoke.cdgdownload -# application/vnd.ecdis-update -application/vnd.ecowin.chart mag -# application/vnd.ecowin.filerequest -# application/vnd.ecowin.fileupdate -# application/vnd.ecowin.series -# application/vnd.ecowin.seriesrequest -# application/vnd.ecowin.seriesupdate -# application/vnd.emclient.accessrequest+xml -application/vnd.enliven nml -# application/vnd.eprints.data+xml -application/vnd.epson.esf esf -application/vnd.epson.msf msf -application/vnd.epson.quickanime qam -application/vnd.epson.salt slt -application/vnd.epson.ssf ssf -# application/vnd.ericsson.quickcall -application/vnd.eszigno3+xml es3 et3 -# application/vnd.etsi.aoc+xml -# application/vnd.etsi.cug+xml -# application/vnd.etsi.iptvcommand+xml -# application/vnd.etsi.iptvdiscovery+xml -# application/vnd.etsi.iptvprofile+xml -# application/vnd.etsi.iptvsad-bc+xml -# application/vnd.etsi.iptvsad-cod+xml -# application/vnd.etsi.iptvsad-npvr+xml -# application/vnd.etsi.iptvservice+xml -# application/vnd.etsi.iptvsync+xml -# application/vnd.etsi.iptvueprofile+xml -# application/vnd.etsi.mcid+xml -# application/vnd.etsi.overload-control-policy-dataset+xml -# application/vnd.etsi.sci+xml -# application/vnd.etsi.simservs+xml -# application/vnd.etsi.tsl+xml -# application/vnd.etsi.tsl.der -# application/vnd.eudora.data -application/vnd.ezpix-album ez2 -application/vnd.ezpix-package ez3 -# application/vnd.f-secure.mobile -application/vnd.fdf fdf -application/vnd.fdsn.mseed mseed -application/vnd.fdsn.seed seed dataless -# application/vnd.ffsns -# application/vnd.fints -application/vnd.flographit gph -application/vnd.fluxtime.clip ftc -# application/vnd.font-fontforge-sfd -application/vnd.framemaker fm frame maker book -application/vnd.frogans.fnc fnc -application/vnd.frogans.ltf ltf -application/vnd.fsc.weblaunch fsc -application/vnd.fujitsu.oasys oas -application/vnd.fujitsu.oasys2 oa2 -application/vnd.fujitsu.oasys3 oa3 -application/vnd.fujitsu.oasysgp fg5 -application/vnd.fujitsu.oasysprs bh2 -# application/vnd.fujixerox.art-ex -# application/vnd.fujixerox.art4 -# application/vnd.fujixerox.hbpl -application/vnd.fujixerox.ddd ddd -application/vnd.fujixerox.docuworks xdw -application/vnd.fujixerox.docuworks.binder xbd -# application/vnd.fut-misnet -application/vnd.fuzzysheet fzs -application/vnd.genomatix.tuxedo txd -# application/vnd.geocube+xml -application/vnd.geogebra.file ggb -application/vnd.geogebra.tool ggt -application/vnd.geometry-explorer gex gre -application/vnd.geonext gxt -application/vnd.geoplan g2w -application/vnd.geospace g3w -# application/vnd.globalplatform.card-content-mgt -# application/vnd.globalplatform.card-content-mgt-response -application/vnd.gmx gmx -application/vnd.google-earth.kml+xml kml -application/vnd.google-earth.kmz kmz -application/vnd.grafeq gqf gqs -# application/vnd.gridmp -application/vnd.groove-account gac -application/vnd.groove-help ghf -application/vnd.groove-identity-message gim -application/vnd.groove-injector grv -application/vnd.groove-tool-message gtm -application/vnd.groove-tool-template tpl -application/vnd.groove-vcard vcg -# application/vnd.hal+json -application/vnd.hal+xml hal -application/vnd.handheld-entertainment+xml zmm -application/vnd.hbci hbci -# application/vnd.hcl-bireports -application/vnd.hhe.lesson-player les -application/vnd.hp-hpgl hpgl -application/vnd.hp-hpid hpid -application/vnd.hp-hps hps -application/vnd.hp-jlyt jlt -application/vnd.hp-pcl pcl -application/vnd.hp-pclxl pclxl -# application/vnd.httphone -application/vnd.hydrostatix.sof-data sfd-hdstx -application/vnd.hzn-3d-crossword x3d -# application/vnd.ibm.afplinedata -# application/vnd.ibm.electronic-media -application/vnd.ibm.minipay mpy -application/vnd.ibm.modcap afp listafp list3820 -application/vnd.ibm.rights-management irm -application/vnd.ibm.secure-container sc -application/vnd.iccprofile icc icm -application/vnd.igloader igl -application/vnd.immervision-ivp ivp -application/vnd.immervision-ivu ivu -# application/vnd.informedcontrol.rms+xml -# application/vnd.informix-visionary -# application/vnd.infotech.project -# application/vnd.infotech.project+xml -application/vnd.insors.igm igm -application/vnd.intercon.formnet xpw xpx -application/vnd.intergeo i2g -# application/vnd.intertrust.digibox -# application/vnd.intertrust.nncp -application/vnd.intu.qbo qbo -application/vnd.intu.qfx qfx -# application/vnd.iptc.g2.conceptitem+xml -# application/vnd.iptc.g2.knowledgeitem+xml -# application/vnd.iptc.g2.newsitem+xml -# application/vnd.iptc.g2.packageitem+xml -application/vnd.ipunplugged.rcprofile rcprofile -application/vnd.irepository.package+xml irp -application/vnd.is-xpr xpr -application/vnd.isac.fcs fcs -application/vnd.jam jam -# application/vnd.japannet-directory-service -# application/vnd.japannet-jpnstore-wakeup -# application/vnd.japannet-payment-wakeup -# application/vnd.japannet-registration -# application/vnd.japannet-registration-wakeup -# application/vnd.japannet-setstore-wakeup -# application/vnd.japannet-verification -# application/vnd.japannet-verification-wakeup -application/vnd.jcp.javame.midlet-rms rms -application/vnd.jisp jisp -application/vnd.joost.joda-archive joda -application/vnd.kahootz ktz ktr -application/vnd.kde.karbon karbon -application/vnd.kde.kchart chrt -application/vnd.kde.kformula kfo -application/vnd.kde.kivio flw -application/vnd.kde.kontour kon -application/vnd.kde.kpresenter kpr kpt -application/vnd.kde.kspread ksp -application/vnd.kde.kword kwd kwt -application/vnd.kenameaapp htke -application/vnd.kidspiration kia -application/vnd.kinar kne knp -application/vnd.koan skp skd skt skm -application/vnd.kodak-descriptor sse -application/vnd.las.las+xml lasxml -# application/vnd.liberty-request+xml -application/vnd.llamagraphics.life-balance.desktop lbd -application/vnd.llamagraphics.life-balance.exchange+xml lbe -application/vnd.lotus-1-2-3 123 -application/vnd.lotus-approach apr -application/vnd.lotus-freelance pre -application/vnd.lotus-notes nsf -application/vnd.lotus-organizer org -application/vnd.lotus-screencam scm -application/vnd.lotus-wordpro lwp -application/vnd.macports.portpkg portpkg -# application/vnd.marlin.drm.actiontoken+xml -# application/vnd.marlin.drm.conftoken+xml -# application/vnd.marlin.drm.license+xml -# application/vnd.marlin.drm.mdcf -application/vnd.mcd mcd -application/vnd.medcalcdata mc1 -application/vnd.mediastation.cdkey cdkey -# application/vnd.meridian-slingshot -application/vnd.mfer mwf -application/vnd.mfmp mfm -application/vnd.micrografx.flo flo -application/vnd.micrografx.igx igx -application/vnd.mif mif -# application/vnd.minisoft-hp3000-save -# application/vnd.mitsubishi.misty-guard.trustweb -application/vnd.mobius.daf daf -application/vnd.mobius.dis dis -application/vnd.mobius.mbk mbk -application/vnd.mobius.mqy mqy -application/vnd.mobius.msl msl -application/vnd.mobius.plc plc -application/vnd.mobius.txf txf -application/vnd.mophun.application mpn -application/vnd.mophun.certificate mpc -# application/vnd.motorola.flexsuite -# application/vnd.motorola.flexsuite.adsi -# application/vnd.motorola.flexsuite.fis -# application/vnd.motorola.flexsuite.gotap -# application/vnd.motorola.flexsuite.kmr -# application/vnd.motorola.flexsuite.ttc -# application/vnd.motorola.flexsuite.wem -# application/vnd.motorola.iprm -application/vnd.mozilla.xul+xml xul -application/vnd.ms-artgalry cil -# application/vnd.ms-asf -application/vnd.ms-cab-compressed cab -application/vnd.ms-excel xls xlm xla xlc xlt xlw -application/vnd.ms-excel.addin.macroenabled.12 xlam -application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb -application/vnd.ms-excel.sheet.macroenabled.12 xlsm -application/vnd.ms-excel.template.macroenabled.12 xltm -application/vnd.ms-fontobject eot -application/vnd.ms-htmlhelp chm -application/vnd.ms-ims ims -application/vnd.ms-lrm lrm -# application/vnd.ms-office.activex+xml -application/vnd.ms-officetheme thmx -application/vnd.ms-pki.seccat cat -application/vnd.ms-pki.stl stl -# application/vnd.ms-playready.initiator+xml -application/vnd.ms-powerpoint ppt pps pot -application/vnd.ms-powerpoint.addin.macroenabled.12 ppam -application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm -application/vnd.ms-powerpoint.slide.macroenabled.12 sldm -application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm -application/vnd.ms-powerpoint.template.macroenabled.12 potm -application/vnd.ms-project mpp mpt -# application/vnd.ms-tnef -# application/vnd.ms-wmdrm.lic-chlg-req -# application/vnd.ms-wmdrm.lic-resp -# application/vnd.ms-wmdrm.meter-chlg-req -# application/vnd.ms-wmdrm.meter-resp -application/vnd.ms-word.document.macroenabled.12 docm -application/vnd.ms-word.template.macroenabled.12 dotm -application/vnd.ms-works wps wks wcm wdb -application/vnd.ms-wpl wpl -application/vnd.ms-xpsdocument xps -application/vnd.mseq mseq -# application/vnd.msign -# application/vnd.multiad.creator -# application/vnd.multiad.creator.cif -# application/vnd.music-niff -application/vnd.musician mus -application/vnd.muvee.style msty -application/vnd.mynfc taglet -# application/vnd.ncd.control -# application/vnd.ncd.reference -# application/vnd.nervana -# application/vnd.netfpx -application/vnd.neurolanguage.nlu nlu -application/vnd.noblenet-directory nnd -application/vnd.noblenet-sealer nns -application/vnd.noblenet-web nnw -# application/vnd.nokia.catalogs -# application/vnd.nokia.conml+wbxml -# application/vnd.nokia.conml+xml -# application/vnd.nokia.isds-radio-presets -# application/vnd.nokia.iptv.config+xml -# application/vnd.nokia.landmark+wbxml -# application/vnd.nokia.landmark+xml -# application/vnd.nokia.landmarkcollection+xml -# application/vnd.nokia.n-gage.ac+xml -application/vnd.nokia.n-gage.data ngdat -application/vnd.nokia.n-gage.symbian.install n-gage -# application/vnd.nokia.ncd -# application/vnd.nokia.pcd+wbxml -# application/vnd.nokia.pcd+xml -application/vnd.nokia.radio-preset rpst -application/vnd.nokia.radio-presets rpss -application/vnd.novadigm.edm edm -application/vnd.novadigm.edx edx -application/vnd.novadigm.ext ext -# application/vnd.ntt-local.file-transfer -# application/vnd.ntt-local.sip-ta_remote -# application/vnd.ntt-local.sip-ta_tcp_stream -application/vnd.oasis.opendocument.chart odc -application/vnd.oasis.opendocument.chart-template otc -application/vnd.oasis.opendocument.database odb -application/vnd.oasis.opendocument.formula odf -application/vnd.oasis.opendocument.formula-template odft -application/vnd.oasis.opendocument.graphics odg -application/vnd.oasis.opendocument.graphics-template otg -application/vnd.oasis.opendocument.image odi -application/vnd.oasis.opendocument.image-template oti -application/vnd.oasis.opendocument.presentation odp -application/vnd.oasis.opendocument.presentation-template otp -application/vnd.oasis.opendocument.spreadsheet ods -application/vnd.oasis.opendocument.spreadsheet-template ots -application/vnd.oasis.opendocument.text odt -application/vnd.oasis.opendocument.text-master odm -application/vnd.oasis.opendocument.text-template ott -application/vnd.oasis.opendocument.text-web oth -# application/vnd.obn -# application/vnd.oftn.l10n+json -# application/vnd.oipf.contentaccessdownload+xml -# application/vnd.oipf.contentaccessstreaming+xml -# application/vnd.oipf.cspg-hexbinary -# application/vnd.oipf.dae.svg+xml -# application/vnd.oipf.dae.xhtml+xml -# application/vnd.oipf.mippvcontrolmessage+xml -# application/vnd.oipf.pae.gem -# application/vnd.oipf.spdiscovery+xml -# application/vnd.oipf.spdlist+xml -# application/vnd.oipf.ueprofile+xml -# application/vnd.oipf.userprofile+xml -application/vnd.olpc-sugar xo -# application/vnd.oma-scws-config -# application/vnd.oma-scws-http-request -# application/vnd.oma-scws-http-response -# application/vnd.oma.bcast.associated-procedure-parameter+xml -# application/vnd.oma.bcast.drm-trigger+xml -# application/vnd.oma.bcast.imd+xml -# application/vnd.oma.bcast.ltkm -# application/vnd.oma.bcast.notification+xml -# application/vnd.oma.bcast.provisioningtrigger -# application/vnd.oma.bcast.sgboot -# application/vnd.oma.bcast.sgdd+xml -# application/vnd.oma.bcast.sgdu -# application/vnd.oma.bcast.simple-symbol-container -# application/vnd.oma.bcast.smartcard-trigger+xml -# application/vnd.oma.bcast.sprov+xml -# application/vnd.oma.bcast.stkm -# application/vnd.oma.cab-address-book+xml -# application/vnd.oma.cab-feature-handler+xml -# application/vnd.oma.cab-pcc+xml -# application/vnd.oma.cab-user-prefs+xml -# application/vnd.oma.dcd -# application/vnd.oma.dcdc -application/vnd.oma.dd2+xml dd2 -# application/vnd.oma.drm.risd+xml -# application/vnd.oma.group-usage-list+xml -# application/vnd.oma.pal+xml -# application/vnd.oma.poc.detailed-progress-report+xml -# application/vnd.oma.poc.final-report+xml -# application/vnd.oma.poc.groups+xml -# application/vnd.oma.poc.invocation-descriptor+xml -# application/vnd.oma.poc.optimized-progress-report+xml -# application/vnd.oma.push -# application/vnd.oma.scidm.messages+xml -# application/vnd.oma.xcap-directory+xml -# application/vnd.omads-email+xml -# application/vnd.omads-file+xml -# application/vnd.omads-folder+xml -# application/vnd.omaloc-supl-init -application/vnd.openofficeorg.extension oxt -# application/vnd.openxmlformats-officedocument.custom-properties+xml -# application/vnd.openxmlformats-officedocument.customxmlproperties+xml -# application/vnd.openxmlformats-officedocument.drawing+xml -# application/vnd.openxmlformats-officedocument.drawingml.chart+xml -# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml -# application/vnd.openxmlformats-officedocument.extended-properties+xml -# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml -# application/vnd.openxmlformats-officedocument.presentationml.comments+xml -# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml -application/vnd.openxmlformats-officedocument.presentationml.presentation pptx -# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml -application/vnd.openxmlformats-officedocument.presentationml.slide sldx -# application/vnd.openxmlformats-officedocument.presentationml.slide+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml -application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx -# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml -# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml -# application/vnd.openxmlformats-officedocument.presentationml.tags+xml -application/vnd.openxmlformats-officedocument.presentationml.template potx -# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx -# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml -# application/vnd.openxmlformats-officedocument.theme+xml -# application/vnd.openxmlformats-officedocument.themeoverride+xml -# application/vnd.openxmlformats-officedocument.vmldrawing -# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.document docx -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx -# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml -# application/vnd.openxmlformats-package.core-properties+xml -# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml -# application/vnd.openxmlformats-package.relationships+xml -# application/vnd.quobject-quoxdocument -# application/vnd.osa.netdeploy -application/vnd.osgeo.mapguide.package mgp -# application/vnd.osgi.bundle -application/vnd.osgi.dp dp -# application/vnd.otps.ct-kip+xml -application/vnd.palm pdb pqa oprc -# application/vnd.paos.xml -application/vnd.pawaafile paw -application/vnd.pg.format str -application/vnd.pg.osasli ei6 -# application/vnd.piaccess.application-licence -application/vnd.picsel efif -application/vnd.pmi.widget wg -# application/vnd.poc.group-advertisement+xml -application/vnd.pocketlearn plf -application/vnd.powerbuilder6 pbd -# application/vnd.powerbuilder6-s -# application/vnd.powerbuilder7 -# application/vnd.powerbuilder7-s -# application/vnd.powerbuilder75 -# application/vnd.powerbuilder75-s -# application/vnd.preminet -application/vnd.previewsystems.box box -application/vnd.proteus.magazine mgz -application/vnd.publishare-delta-tree qps -application/vnd.pvi.ptid1 ptid -# application/vnd.pwg-multiplexed -# application/vnd.pwg-xhtml-print+xml -# application/vnd.qualcomm.brew-app-res -application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb -# application/vnd.radisys.moml+xml -# application/vnd.radisys.msml+xml -# application/vnd.radisys.msml-audit+xml -# application/vnd.radisys.msml-audit-conf+xml -# application/vnd.radisys.msml-audit-conn+xml -# application/vnd.radisys.msml-audit-dialog+xml -# application/vnd.radisys.msml-audit-stream+xml -# application/vnd.radisys.msml-conf+xml -# application/vnd.radisys.msml-dialog+xml -# application/vnd.radisys.msml-dialog-base+xml -# application/vnd.radisys.msml-dialog-fax-detect+xml -# application/vnd.radisys.msml-dialog-fax-sendrecv+xml -# application/vnd.radisys.msml-dialog-group+xml -# application/vnd.radisys.msml-dialog-speech+xml -# application/vnd.radisys.msml-dialog-transform+xml -# application/vnd.rainstor.data -# application/vnd.rapid -application/vnd.realvnc.bed bed -application/vnd.recordare.musicxml mxl -application/vnd.recordare.musicxml+xml musicxml -# application/vnd.renlearn.rlprint -application/vnd.rig.cryptonote cryptonote -application/vnd.rim.cod cod -application/vnd.rn-realmedia rm -application/vnd.route66.link66+xml link66 -# application/vnd.ruckus.download -# application/vnd.s3sms -application/vnd.sailingtracker.track st -# application/vnd.sbm.cid -# application/vnd.sbm.mid2 -# application/vnd.scribus -# application/vnd.sealed.3df -# application/vnd.sealed.csf -# application/vnd.sealed.doc -# application/vnd.sealed.eml -# application/vnd.sealed.mht -# application/vnd.sealed.net -# application/vnd.sealed.ppt -# application/vnd.sealed.tiff -# application/vnd.sealed.xls -# application/vnd.sealedmedia.softseal.html -# application/vnd.sealedmedia.softseal.pdf -application/vnd.seemail see -application/vnd.sema sema -application/vnd.semd semd -application/vnd.semf semf -application/vnd.shana.informed.formdata ifm -application/vnd.shana.informed.formtemplate itp -application/vnd.shana.informed.interchange iif -application/vnd.shana.informed.package ipk -application/vnd.simtech-mindmapper twd twds -application/vnd.smaf mmf -# application/vnd.smart.notebook -application/vnd.smart.teacher teacher -# application/vnd.software602.filler.form+xml -# application/vnd.software602.filler.form-xml-zip -application/vnd.solent.sdkm+xml sdkm sdkd -application/vnd.spotfire.dxp dxp -application/vnd.spotfire.sfs sfs -# application/vnd.sss-cod -# application/vnd.sss-dtf -# application/vnd.sss-ntf -application/vnd.stardivision.calc sdc -application/vnd.stardivision.draw sda -application/vnd.stardivision.impress sdd -application/vnd.stardivision.math smf -application/vnd.stardivision.writer sdw vor -application/vnd.stardivision.writer-global sgl -application/vnd.stepmania.package smzip -application/vnd.stepmania.stepchart sm -# application/vnd.street-stream -application/vnd.sun.xml.calc sxc -application/vnd.sun.xml.calc.template stc -application/vnd.sun.xml.draw sxd -application/vnd.sun.xml.draw.template std -application/vnd.sun.xml.impress sxi -application/vnd.sun.xml.impress.template sti -application/vnd.sun.xml.math sxm -application/vnd.sun.xml.writer sxw -application/vnd.sun.xml.writer.global sxg -application/vnd.sun.xml.writer.template stw -# application/vnd.sun.wadl+xml -application/vnd.sus-calendar sus susp -application/vnd.svd svd -# application/vnd.swiftview-ics -application/vnd.symbian.install sis sisx -application/vnd.syncml+xml xsm -application/vnd.syncml.dm+wbxml bdm -application/vnd.syncml.dm+xml xdm -# application/vnd.syncml.dm.notification -# application/vnd.syncml.ds.notification -application/vnd.tao.intent-module-archive tao -application/vnd.tcpdump.pcap pcap cap dmp -application/vnd.tmobile-livetv tmo -application/vnd.trid.tpt tpt -application/vnd.triscape.mxs mxs -application/vnd.trueapp tra -# application/vnd.truedoc -# application/vnd.ubisoft.webplayer -application/vnd.ufdl ufd ufdl -application/vnd.uiq.theme utz -application/vnd.umajin umj -application/vnd.unity unityweb -application/vnd.uoml+xml uoml -# application/vnd.uplanet.alert -# application/vnd.uplanet.alert-wbxml -# application/vnd.uplanet.bearer-choice -# application/vnd.uplanet.bearer-choice-wbxml -# application/vnd.uplanet.cacheop -# application/vnd.uplanet.cacheop-wbxml -# application/vnd.uplanet.channel -# application/vnd.uplanet.channel-wbxml -# application/vnd.uplanet.list -# application/vnd.uplanet.list-wbxml -# application/vnd.uplanet.listcmd -# application/vnd.uplanet.listcmd-wbxml -# application/vnd.uplanet.signal -application/vnd.vcx vcx -# application/vnd.vd-study -# application/vnd.vectorworks -# application/vnd.verimatrix.vcas -# application/vnd.vidsoft.vidconference -application/vnd.visio vsd vst vss vsw -application/vnd.visionary vis -# application/vnd.vividence.scriptfile -application/vnd.vsf vsf -# application/vnd.wap.sic -# application/vnd.wap.slc -application/vnd.wap.wbxml wbxml -application/vnd.wap.wmlc wmlc -application/vnd.wap.wmlscriptc wmlsc -application/vnd.webturbo wtb -# application/vnd.wfa.wsc -# application/vnd.wmc -# application/vnd.wmf.bootstrap -# application/vnd.wolfram.mathematica -# application/vnd.wolfram.mathematica.package -application/vnd.wolfram.player nbp -application/vnd.wordperfect wpd -application/vnd.wqd wqd -# application/vnd.wrq-hp3000-labelled -application/vnd.wt.stf stf -# application/vnd.wv.csp+wbxml -# application/vnd.wv.csp+xml -# application/vnd.wv.ssp+xml -application/vnd.xara xar -application/vnd.xfdl xfdl -# application/vnd.xfdl.webform -# application/vnd.xmi+xml -# application/vnd.xmpie.cpkg -# application/vnd.xmpie.dpkg -# application/vnd.xmpie.plan -# application/vnd.xmpie.ppkg -# application/vnd.xmpie.xlim -application/vnd.yamaha.hv-dic hvd -application/vnd.yamaha.hv-script hvs -application/vnd.yamaha.hv-voice hvp -application/vnd.yamaha.openscoreformat osf -application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg -# application/vnd.yamaha.remote-setup -application/vnd.yamaha.smaf-audio saf -application/vnd.yamaha.smaf-phrase spf -# application/vnd.yamaha.through-ngn -# application/vnd.yamaha.tunnel-udpencap -application/vnd.yellowriver-custom-menu cmp -application/vnd.zul zir zirz -application/vnd.zzazz.deck+xml zaz -application/voicexml+xml vxml -# application/vq-rtcpxr -# application/watcherinfo+xml -# application/whoispp-query -# application/whoispp-response -application/widget wgt -application/winhlp hlp -# application/wita -# application/wordperfect5.1 -application/wsdl+xml wsdl -application/wspolicy+xml wspolicy -application/x-7z-compressed 7z -application/x-abiword abw -application/x-ace-compressed ace -application/x-authorware-bin aab x32 u32 vox -application/x-authorware-map aam -application/x-authorware-seg aas -application/x-bcpio bcpio -application/x-bittorrent torrent -application/x-bzip bz -application/x-bzip2 bz2 boz -application/x-cdlink vcd -application/x-chat chat -application/x-chess-pgn pgn -# application/x-compress -application/x-cpio cpio -application/x-csh csh -application/x-debian-package deb udeb -application/x-director dir dcr dxr cst cct cxt w3d fgd swa -application/x-doom wad -application/x-dtbncx+xml ncx -application/x-dtbook+xml dtb -application/x-dtbresource+xml res -application/x-dvi dvi -application/x-font-bdf bdf -# application/x-font-dos -# application/x-font-framemaker -application/x-font-ghostscript gsf -# application/x-font-libgrx -application/x-font-linux-psf psf -application/x-font-otf otf -application/x-font-pcf pcf -application/x-font-snf snf -# application/x-font-speedo -# application/x-font-sunos-news -application/x-font-ttf ttf ttc -application/x-font-type1 pfa pfb pfm afm -application/x-font-woff woff -# application/x-font-vfont -application/x-futuresplash spl -application/x-gnumeric gnumeric -application/x-gtar gtar -# application/x-gzip -application/x-hdf hdf -application/x-java-jnlp-file jnlp -application/x-latex latex -application/x-mobipocket-ebook prc mobi -application/x-ms-application application -application/x-ms-wmd wmd -application/x-ms-wmz wmz -application/x-ms-xbap xbap -application/x-msaccess mdb -application/x-msbinder obd -application/x-mscardfile crd -application/x-msclip clp -application/x-msdownload exe dll com bat msi -application/x-msmediaview mvb m13 m14 -application/x-msmetafile wmf -application/x-msmoney mny -application/x-mspublisher pub -application/x-msschedule scd -application/x-msterminal trm -application/x-mswrite wri -application/x-netcdf nc cdf -application/x-pkcs12 p12 pfx -application/x-pkcs7-certificates p7b spc -application/x-pkcs7-certreqresp p7r -application/x-rar-compressed rar -application/x-sh sh -application/x-shar shar -application/x-shockwave-flash swf -application/x-silverlight-app xap -application/x-stuffit sit -application/x-stuffitx sitx -application/x-sv4cpio sv4cpio -application/x-sv4crc sv4crc -application/x-tar tar -application/x-tcl tcl -application/x-tex tex -application/x-tex-tfm tfm -application/x-texinfo texinfo texi -application/x-ustar ustar -application/x-wais-source src -application/x-x509-ca-cert der crt -application/x-xfig fig -application/x-xpinstall xpi -# application/x400-bp -# application/xcap-att+xml -# application/xcap-caps+xml -application/xcap-diff+xml xdf -# application/xcap-el+xml -# application/xcap-error+xml -# application/xcap-ns+xml -# application/xcon-conference-info-diff+xml -# application/xcon-conference-info+xml -application/xenc+xml xenc -application/xhtml+xml xhtml xht -# application/xhtml-voice+xml -application/xml xml xsl -application/xml-dtd dtd -# application/xml-external-parsed-entity -# application/xmpp+xml -application/xop+xml xop -application/xslt+xml xslt -application/xspf+xml xspf -application/xv+xml mxml xhvml xvml xvm -application/yang yang -application/yin+xml yin -application/zip zip -# audio/1d-interleaved-parityfec -# audio/32kadpcm -# audio/3gpp -# audio/3gpp2 -# audio/ac3 -audio/adpcm adp -# audio/amr -# audio/amr-wb -# audio/amr-wb+ -# audio/asc -# audio/atrac-advanced-lossless -# audio/atrac-x -# audio/atrac3 -audio/basic au snd -# audio/bv16 -# audio/bv32 -# audio/clearmode -# audio/cn -# audio/dat12 -# audio/dls -# audio/dsr-es201108 -# audio/dsr-es202050 -# audio/dsr-es202211 -# audio/dsr-es202212 -# audio/dv -# audio/dvi4 -# audio/eac3 -# audio/evrc -# audio/evrc-qcp -# audio/evrc0 -# audio/evrc1 -# audio/evrcb -# audio/evrcb0 -# audio/evrcb1 -# audio/evrcwb -# audio/evrcwb0 -# audio/evrcwb1 -# audio/example -# audio/fwdred -# audio/g719 -# audio/g722 -# audio/g7221 -# audio/g723 -# audio/g726-16 -# audio/g726-24 -# audio/g726-32 -# audio/g726-40 -# audio/g728 -# audio/g729 -# audio/g7291 -# audio/g729d -# audio/g729e -# audio/gsm -# audio/gsm-efr -# audio/gsm-hr-08 -# audio/ilbc -# audio/ip-mr_v2.5 -# audio/l16 -# audio/l20 -# audio/l24 -# audio/l8 -# audio/lpc -audio/midi mid midi kar rmi -# audio/mobile-xmf -audio/mp4 mp4a -# audio/mp4a-latm -# audio/mpa -# audio/mpa-robust -audio/mpeg mpga mp2 mp2a mp3 m2a m3a -# audio/mpeg4-generic -audio/ogg oga ogg spx -# audio/parityfec -# audio/pcma -# audio/pcma-wb -# audio/pcmu-wb -# audio/pcmu -# audio/prs.sid -# audio/qcelp -# audio/red -# audio/rtp-enc-aescm128 -# audio/rtp-midi -# audio/rtx -# audio/smv -# audio/smv0 -# audio/smv-qcp -# audio/sp-midi -# audio/speex -# audio/t140c -# audio/t38 -# audio/telephone-event -# audio/tone -# audio/uemclip -# audio/ulpfec -# audio/vdvi -# audio/vmr-wb -# audio/vnd.3gpp.iufp -# audio/vnd.4sb -# audio/vnd.audiokoz -# audio/vnd.celp -# audio/vnd.cisco.nse -# audio/vnd.cmles.radio-events -# audio/vnd.cns.anp1 -# audio/vnd.cns.inf1 -audio/vnd.dece.audio uva uvva -audio/vnd.digital-winds eol -# audio/vnd.dlna.adts -# audio/vnd.dolby.heaac.1 -# audio/vnd.dolby.heaac.2 -# audio/vnd.dolby.mlp -# audio/vnd.dolby.mps -# audio/vnd.dolby.pl2 -# audio/vnd.dolby.pl2x -# audio/vnd.dolby.pl2z -# audio/vnd.dolby.pulse.1 -audio/vnd.dra dra -audio/vnd.dts dts -audio/vnd.dts.hd dtshd -# audio/vnd.dvb.file dvb -# audio/vnd.everad.plj -# audio/vnd.hns.audio -audio/vnd.lucent.voice lvp -audio/vnd.ms-playready.media.pya pya -# audio/vnd.nokia.mobile-xmf -# audio/vnd.nortel.vbk -audio/vnd.nuera.ecelp4800 ecelp4800 -audio/vnd.nuera.ecelp7470 ecelp7470 -audio/vnd.nuera.ecelp9600 ecelp9600 -# audio/vnd.octel.sbc -# audio/vnd.qcelp -# audio/vnd.rhetorex.32kadpcm -audio/vnd.rip rip -# audio/vnd.sealedmedia.softseal.mpeg -# audio/vnd.vmx.cvsd -# audio/vorbis -# audio/vorbis-config -audio/webm weba -audio/x-aac aac -audio/x-aiff aif aiff aifc -audio/x-mpegurl m3u -audio/x-ms-wax wax -audio/x-ms-wma wma -audio/x-pn-realaudio ram ra -audio/x-pn-realaudio-plugin rmp -audio/x-wav wav -chemical/x-cdx cdx -chemical/x-cif cif -chemical/x-cmdf cmdf -chemical/x-cml cml -chemical/x-csml csml -# chemical/x-pdb -chemical/x-xyz xyz -image/bmp bmp -image/cgm cgm -# image/example -# image/fits -image/g3fax g3 -image/gif gif -image/ief ief -# image/jp2 -image/jpeg jpeg jpg jpe -# image/jpm -# image/jpx -image/ktx ktx -# image/naplps -image/png png -image/prs.btif btif -# image/prs.pti -image/svg+xml svg svgz -# image/t38 -image/tiff tiff tif -# image/tiff-fx -image/vnd.adobe.photoshop psd -# image/vnd.cns.inf2 -image/vnd.dece.graphic uvi uvvi uvg uvvg -image/vnd.dvb.subtitle sub -image/vnd.djvu djvu djv -image/vnd.dwg dwg -image/vnd.dxf dxf -image/vnd.fastbidsheet fbs -image/vnd.fpx fpx -image/vnd.fst fst -image/vnd.fujixerox.edmics-mmr mmr -image/vnd.fujixerox.edmics-rlc rlc -# image/vnd.globalgraphics.pgb -# image/vnd.microsoft.icon -# image/vnd.mix -image/vnd.ms-modi mdi -image/vnd.net-fpx npx -# image/vnd.radiance -# image/vnd.sealed.png -# image/vnd.sealedmedia.softseal.gif -# image/vnd.sealedmedia.softseal.jpg -# image/vnd.svf -image/vnd.wap.wbmp wbmp -image/vnd.xiff xif -image/webp webp -image/x-cmu-raster ras -image/x-cmx cmx -image/x-freehand fh fhc fh4 fh5 fh7 -image/x-icon ico -image/x-pcx pcx -image/x-pict pic pct -image/x-portable-anymap pnm -image/x-portable-bitmap pbm -image/x-portable-graymap pgm -image/x-portable-pixmap ppm -image/x-rgb rgb -image/x-xbitmap xbm -image/x-xpixmap xpm -image/x-xwindowdump xwd -# message/cpim -# message/delivery-status -# message/disposition-notification -# message/example -# message/external-body -# message/feedback-report -# message/global -# message/global-delivery-status -# message/global-disposition-notification -# message/global-headers -# message/http -# message/imdn+xml -# message/news -# message/partial -message/rfc822 eml mime -# message/s-http -# message/sip -# message/sipfrag -# message/tracking-status -# message/vnd.si.simp -# model/example -model/iges igs iges -model/mesh msh mesh silo -model/vnd.collada+xml dae -model/vnd.dwf dwf -# model/vnd.flatland.3dml -model/vnd.gdl gdl -# model/vnd.gs-gdl -# model/vnd.gs.gdl -model/vnd.gtw gtw -# model/vnd.moml+xml -model/vnd.mts mts -# model/vnd.parasolid.transmit.binary -# model/vnd.parasolid.transmit.text -model/vnd.vtu vtu -model/vrml wrl vrml -# multipart/alternative -# multipart/appledouble -# multipart/byteranges -# multipart/digest -# multipart/encrypted -# multipart/example -# multipart/form-data -# multipart/header-set -# multipart/mixed -# multipart/parallel -# multipart/related -# multipart/report -# multipart/signed -# multipart/voice-message -# text/1d-interleaved-parityfec -text/calendar ics ifb -text/css css -text/csv csv -# text/directory -# text/dns -# text/ecmascript -# text/enriched -# text/example -# text/fwdred -text/html html htm -# text/javascript -text/n3 n3 -# text/parityfec -text/plain txt text conf def list log in -# text/prs.fallenstein.rst -text/prs.lines.tag dsc -# text/vnd.radisys.msml-basic-layout -# text/red -# text/rfc822-headers -text/richtext rtx -# text/rtf -# text/rtp-enc-aescm128 -# text/rtx -text/sgml sgml sgm -# text/t140 -text/tab-separated-values tsv -text/troff t tr roff man me ms -text/turtle ttl -# text/ulpfec -text/uri-list uri uris urls -text/vcard vcard -# text/vnd.abc -text/vnd.curl curl -text/vnd.curl.dcurl dcurl -text/vnd.curl.scurl scurl -text/vnd.curl.mcurl mcurl -# text/vnd.dmclientscript -text/vnd.dvb.subtitle sub -# text/vnd.esmertec.theme-descriptor -text/vnd.fly fly -text/vnd.fmi.flexstor flx -text/vnd.graphviz gv -text/vnd.in3d.3dml 3dml -text/vnd.in3d.spot spot -# text/vnd.iptc.newsml -# text/vnd.iptc.nitf -# text/vnd.latex-z -# text/vnd.motorola.reflex -# text/vnd.ms-mediapackage -# text/vnd.net2phone.commcenter.command -# text/vnd.si.uricatalogue -text/vnd.sun.j2me.app-descriptor jad -# text/vnd.trolltech.linguist -# text/vnd.wap.si -# text/vnd.wap.sl -text/vnd.wap.wml wml -text/vnd.wap.wmlscript wmls -text/x-asm s asm -text/x-c c cc cxx cpp h hh dic -text/x-fortran f for f77 f90 -text/x-pascal p pas -text/x-java-source java -text/x-setext etx -text/x-uuencode uu -text/x-vcalendar vcs -text/x-vcard vcf -# text/xml -# text/xml-external-parsed-entity -# video/1d-interleaved-parityfec -video/3gpp 3gp -# video/3gpp-tt -video/3gpp2 3g2 -# video/bmpeg -# video/bt656 -# video/celb -# video/dv -# video/example -video/h261 h261 -video/h263 h263 -# video/h263-1998 -# video/h263-2000 -video/h264 h264 -# video/h264-rcdo -# video/h264-svc -video/jpeg jpgv -# video/jpeg2000 -video/jpm jpm jpgm -video/mj2 mj2 mjp2 -# video/mp1s -# video/mp2p -# video/mp2t -video/mp4 mp4 mp4v mpg4 -# video/mp4v-es -video/mpeg mpeg mpg mpe m1v m2v -# video/mpeg4-generic -# video/mpv -# video/nv -video/ogg ogv -# video/parityfec -# video/pointer -video/quicktime qt mov -# video/raw -# video/rtp-enc-aescm128 -# video/rtx -# video/smpte292m -# video/ulpfec -# video/vc1 -# video/vnd.cctv -video/vnd.dece.hd uvh uvvh -video/vnd.dece.mobile uvm uvvm -# video/vnd.dece.mp4 -video/vnd.dece.pd uvp uvvp -video/vnd.dece.sd uvs uvvs -video/vnd.dece.video uvv uvvv -# video/vnd.directv.mpeg -# video/vnd.directv.mpeg-tts -# video/vnd.dlna.mpeg-tts -video/vnd.dvb.file dvb -video/vnd.fvt fvt -# video/vnd.hns.video -# video/vnd.iptvforum.1dparityfec-1010 -# video/vnd.iptvforum.1dparityfec-2005 -# video/vnd.iptvforum.2dparityfec-1010 -# video/vnd.iptvforum.2dparityfec-2005 -# video/vnd.iptvforum.ttsavc -# video/vnd.iptvforum.ttsmpeg2 -# video/vnd.motorola.video -# video/vnd.motorola.videop -video/vnd.mpegurl mxu m4u -video/vnd.ms-playready.media.pyv pyv -# video/vnd.nokia.interleaved-multimedia -# video/vnd.nokia.videovoip -# video/vnd.objectvideo -# video/vnd.sealed.mpeg1 -# video/vnd.sealed.mpeg4 -# video/vnd.sealed.swf -# video/vnd.sealedmedia.softseal.mov -video/vnd.uvvu.mp4 uvu uvvu -video/vnd.vivo viv -video/webm webm -video/x-f4v f4v -video/x-fli fli -video/x-flv flv -video/x-m4v m4v -video/x-ms-asf asf asx -video/x-ms-wm wm -video/x-ms-wmv wmv -video/x-ms-wmx wmx -video/x-ms-wvx wvx -video/x-msvideo avi -video/x-sgi-movie movie -x-conference/x-cooltalk ice diff --git a/node_modules/express/node_modules/send/node_modules/mime/types/node.types b/node_modules/express/node_modules/send/node_modules/mime/types/node.types deleted file mode 100644 index b7fe8c0..0000000 --- a/node_modules/express/node_modules/send/node_modules/mime/types/node.types +++ /dev/null @@ -1,65 +0,0 @@ -# What: Google Chrome Extension -# Why: To allow apps to (work) be served with the right content type header. -# http://codereview.chromium.org/2830017 -# Added by: niftylettuce -application/x-chrome-extension crx - -# What: OTF Message Silencer -# Why: To silence the "Resource interpreted as font but transferred with MIME -# type font/otf" message that occurs in Google Chrome -# Added by: niftylettuce -font/opentype otf - -# What: HTC support -# Why: To properly render .htc files such as CSS3PIE -# Added by: niftylettuce -text/x-component htc - -# What: HTML5 application cache manifest -# Why: De-facto standard. Required by Mozilla browser when serving HTML5 apps -# per https://developer.mozilla.org/en/offline_resources_in_firefox -# Added by: louisremi -text/cache-manifest appcache manifest - -# What: node binary buffer format -# Why: semi-standard extension w/in the node community -# Added by: tootallnate -application/octet-stream buffer - -# What: The "protected" MP-4 formats used by iTunes. -# Why: Required for streaming music to browsers (?) -# Added by: broofa -application/mp4 m4p -audio/mp4 m4a - -# What: Music playlist format (http://en.wikipedia.org/wiki/M3U) -# Why: See https://github.com/bentomas/node-mime/pull/6 -# Added by: mjrusso -application/x-mpegURL m3u8 - -# What: Video format, Part of RFC1890 -# Why: See https://github.com/bentomas/node-mime/pull/6 -# Added by: mjrusso -video/MP2T ts - -# What: The FLAC lossless codec format -# Why: Streaming and serving FLAC audio -# Added by: jacobrask -audio/flac flac - -# What: EventSource mime type -# Why: mime type of Server-Sent Events stream -# http://www.w3.org/TR/eventsource/#text-event-stream -# Added by: francois2metz -text/event-stream event-stream - -# What: Mozilla App manifest mime type -# Why: https://developer.mozilla.org/en/Apps/Manifest#Serving_manifests -# Added by: ednapiranha -application/x-web-app-manifest+json webapp - -# What: Matroska Mime Types -# Why: http://en.wikipedia.org/wiki/Matroska -# Added by: aduncan88 -video/x-matroska mkv -audio/x-matroska mka diff --git a/node_modules/express/node_modules/send/package.json b/node_modules/express/node_modules/send/package.json deleted file mode 100644 index 78fadcb..0000000 --- a/node_modules/express/node_modules/send/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "send", - "version": "0.1.0", - "description": "Better streaming static file server with Range and conditional-GET support", - "keywords": [ - "static", - "file", - "server" - ], - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "dependencies": { - "debug": "*", - "mime": "1.2.6", - "fresh": "0.1.0", - "range-parser": "0.0.4" - }, - "devDependencies": { - "mocha": "*", - "should": "*", - "supertest": "0.0.1", - "connect": "2.x" - }, - "scripts": { - "test": "make test" - }, - "main": "index", - "readme": "\n# send\n\n Send is Connect's `static()` extracted for generalized use, a streaming static file\n server supporting partial responses (Ranges), conditional-GET negotiation, high test coverage, and granular events which may be leveraged to take appropriate actions in your application or framework.\n\n## Installation\n\n $ npm install send\n\n## Examples\n\n Small:\n\n```js\nvar http = require('http');\nvar send = require('send');\n\nvar app = http.createServer(function(req, res){\n send(req, req.url).pipe(res);\n});\n```\n\n Serving from a root directory with custom error-handling:\n\n```js\nvar http = require('http');\nvar send = require('send');\n\nvar app = http.createServer(function(req, res){\n // your custom error-handling logic:\n function error(err) {\n res.statusCode = err.status || 500;\n res.end(err.message);\n }\n\n // your custom directory handling logic:\n function redirect() {\n res.statusCode = 301;\n res.setHeader('Location', req.url + '/');\n res.end('Redirecting to ' + req.url + '/');\n }\n\n // transfer arbitrary files from within\n // /www/example.com/public/*\n send(req, url.parse(req.url).pathname)\n .root('/www/example.com/public')\n .on('error', error)\n .on('directory', redirect)\n .pipe(res);\n});\n```\n\n## API\n\n### Events\n\n - `error` an error occurred `(err)`\n - `directory` a directory was requested\n - `stream` file streaming has started `(stream)`\n - `end` streaming has completed\n\n### .root(dir)\n\n Serve files relative to `path`. Aliased as `.from(dir)`.\n\n### .index(path)\n\n By default send supports \"index.html\" files, to disable this\n invoke `.index(false)` or to supply a new index pass a string.\n\n### .maxage(ms)\n\n Provide a max-age in milliseconds for http caching, defaults to 0.\n\n## Error-handling\n\n By default when no `error` listeners are present an automatic response will be made, otherwise you have full control over the response, aka you may show a 5xx page etc.\n\n## Caching\n\n It does _not_ perform internal caching, you should use a reverse proxy cache such\n as Varnish for this, or those fancy things called CDNs. If your application is small enough that it would benefit from single-node memory caching, it's small enough that it does not need caching at all ;).\n\n## Debugging\n\n To enable `debug()` instrumentation output export __DEBUG__:\n\n```\n$ DEBUG=send node app\n```\n\n## Running tests\n\n```\n$ npm install\n$ make test\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", - "_id": "send@0.1.0", - "_from": "send@0.1.0" -} diff --git a/node_modules/express/package.json b/node_modules/express/package.json deleted file mode 100644 index f0d0b7d..0000000 --- a/node_modules/express/package.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "express", - "description": "Sinatra inspired web development framework", - "version": "3.1.0", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "contributors": [ - { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - { - "name": "Aaron Heckmann", - "email": "aaron.heckmann+github@gmail.com" - }, - { - "name": "Ciaran Jessup", - "email": "ciaranj@gmail.com" - }, - { - "name": "Guillermo Rauch", - "email": "rauchg@gmail.com" - } - ], - "dependencies": { - "connect": "2.7.2", - "commander": "0.6.1", - "range-parser": "0.0.4", - "mkdirp": "0.3.3", - "cookie": "0.0.5", - "buffer-crc32": "0.1.1", - "fresh": "0.1.0", - "methods": "0.0.1", - "send": "0.1.0", - "cookie-signature": "0.0.1", - "debug": "*" - }, - "devDependencies": { - "ejs": "*", - "mocha": "*", - "jade": "*", - "hjs": "*", - "stylus": "*", - "should": "*", - "connect-redis": "*", - "github-flavored-markdown": "*", - "supertest": "0.0.1" - }, - "keywords": [ - "express", - "framework", - "sinatra", - "web", - "rest", - "restful", - "router", - "app", - "api" - ], - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/express" - }, - "main": "index", - "bin": { - "express": "./bin/express" - }, - "scripts": { - "prepublish": "npm prune", - "test": "make test" - }, - "engines": { - "node": "*" - }, - "readme": "![express logo](http://f.cl.ly/items/0V2S1n0K1i3y1c122g04/Screen%20Shot%202012-04-11%20at%209.59.42%20AM.png)\n\n Fast, unopinionated, minimalist web framework for [node](http://nodejs.org). [![Build Status](https://secure.travis-ci.org/visionmedia/express.png)](http://travis-ci.org/visionmedia/express)\n\n```js\nvar express = require('express');\nvar app = express();\n\napp.get('/', function(req, res){\n res.send('Hello World');\n});\n\napp.listen(3000);\n```\n\n## Installation\n\n $ npm install -g express\n\n## Quick Start\n\n The quickest way to get started with express is to utilize the executable `express(1)` to generate an application as shown below:\n\n Create the app:\n\n $ npm install -g express\n $ express /tmp/foo && cd /tmp/foo\n\n Install dependencies:\n\n $ npm install\n\n Start the server:\n\n $ node app\n\n## Features\n\n * Built on [Connect](http://github.com/senchalabs/connect)\n * Robust routing\n * HTTP helpers (redirection, caching, etc)\n * View system supporting 14+ template engines\n * Content negotiation\n * Focus on high performance\n * Environment based configuration\n * Executable for generating applications quickly\n * High test coverage\n\n## Philosophy\n\n The Express philosophy is to provide small, robust tooling for HTTP servers. Making\n it a great solution for single page applications, web sites, hybrids, or public\n HTTP APIs.\n \n Built on Connect you can use _only_ what you need, and nothing more, applications\n can be as big or as small as you like, even a single file. Express does\n not force you to use any specific ORM or template engine. With support for over\n 14 template engines via [Consolidate.js](http://github.com/visionmedia/consolidate.js)\n you can quickly craft your perfect framework.\n\n## More Information\n\n * Join #express on freenode\n * [Google Group](http://groups.google.com/group/express-js) for discussion\n * Follow [tjholowaychuk](http://twitter.com/tjholowaychuk) on twitter for updates\n * Visit the [Wiki](http://github.com/visionmedia/express/wiki)\n * [日本語ドキュメンテーション](http://hideyukisaito.com/doc/expressjs/) by [hideyukisaito](https://github.com/hideyukisaito)\n * [Русскоязычная документация](http://express-js.ru/)\n\n## Viewing Examples\n\nClone the Express repo, then install the dev dependencies to install all the example / test suite deps:\n\n $ git clone git://github.com/visionmedia/express.git --depth 1\n $ cd express\n $ npm install\n\nthen run whichever tests you want:\n\n $ node examples/content-negotiation\n\n## Running Tests\n\nTo run the test suite first invoke the following command within the repo, installing the development dependencies:\n\n $ npm install\n\nthen run the tests:\n\n $ make test\n\n## Contributors\n\n```\nproject: express\ncommits: 3559\nactive : 468 days\nfiles : 237\nauthors: \n 1891\tTj Holowaychuk 53.1%\n 1285\tvisionmedia 36.1%\n 182\tTJ Holowaychuk 5.1%\n 54\tAaron Heckmann 1.5%\n 34\tcsausdev 1.0%\n 26\tciaranj 0.7%\n 21\tRobert Sköld 0.6%\n 6\tGuillermo Rauch 0.2%\n 3\tDav Glass 0.1%\n 3\tNick Poulden 0.1%\n 2\tRandy Merrill 0.1%\n 2\tBenny Wong 0.1%\n 2\tHunter Loftis 0.1%\n 2\tJake Gordon 0.1%\n 2\tBrian McKinney 0.1%\n 2\tRoman Shtylman 0.1%\n 2\tBen Weaver 0.1%\n 2\tDave Hoover 0.1%\n 2\tEivind Fjeldstad 0.1%\n 2\tDaniel Shaw 0.1%\n 1\tMatt Colyer 0.0%\n 1\tPau Ramon 0.0%\n 1\tPero Pejovic 0.0%\n 1\tPeter Rekdal Sunde 0.0%\n 1\tRaynos 0.0%\n 1\tTeng Siong Ong 0.0%\n 1\tViktor Kelemen 0.0%\n 1\tctide 0.0%\n 1\t8bitDesigner 0.0%\n 1\tisaacs 0.0%\n 1\tmgutz 0.0%\n 1\tpikeas 0.0%\n 1\tshuwatto 0.0%\n 1\ttstrimple 0.0%\n 1\tewoudj 0.0%\n 1\tAdam Sanderson 0.0%\n 1\tAndrii Kostenko 0.0%\n 1\tAndy Hiew 0.0%\n 1\tArpad Borsos 0.0%\n 1\tAshwin Purohit 0.0%\n 1\tBenjen 0.0%\n 1\tDarren Torpey 0.0%\n 1\tGreg Ritter 0.0%\n 1\tGregory Ritter 0.0%\n 1\tJames Herdman 0.0%\n 1\tJim Snodgrass 0.0%\n 1\tJoe McCann 0.0%\n 1\tJonathan Dumaine 0.0%\n 1\tJonathan Palardy 0.0%\n 1\tJonathan Zacsh 0.0%\n 1\tJustin Lilly 0.0%\n 1\tKen Sato 0.0%\n 1\tMaciej Małecki 0.0%\n 1\tMasahiro Hayashi 0.0%\n```\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2009-2012 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", - "_id": "express@3.1.0", - "dist": { - "shasum": "f869b2d92320f5c3dd496c172e06f02b6ad43310" - }, - "_from": "express@3.1.0" -} diff --git a/node_modules/express/test.js b/node_modules/express/test.js deleted file mode 100644 index 112ee0a..0000000 --- a/node_modules/express/test.js +++ /dev/null @@ -1,14 +0,0 @@ - -/** - * Module dependencies. - */ - -var express = require('./') - , app = express() - -app.get('/', function(req, res){ - console.log(req.query); -}); - -app.listen(3000); -console.log('listening on 3000'); diff --git a/node_modules/jade/.npmignore b/node_modules/jade/.npmignore deleted file mode 100644 index fdc7b89..0000000 --- a/node_modules/jade/.npmignore +++ /dev/null @@ -1,14 +0,0 @@ -test -support -benchmarks -examples -lib-cov -coverage.html -.gitmodules -.travis.yml -History.md -Makefile -test/ -support/ -benchmarks/ -examples/ diff --git a/node_modules/jade/LICENSE b/node_modules/jade/LICENSE deleted file mode 100644 index 8ad0e0d..0000000 --- a/node_modules/jade/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -(The MIT License) - -Copyright (c) 2009-2010 TJ Holowaychuk - -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. \ No newline at end of file diff --git a/node_modules/jade/Readme.md b/node_modules/jade/Readme.md deleted file mode 100644 index 9f629d9..0000000 --- a/node_modules/jade/Readme.md +++ /dev/null @@ -1,1298 +0,0 @@ - [![Build Status](https://secure.travis-ci.org/visionmedia/jade.png)](http://travis-ci.org/visionmedia/jade) - -# Jade - template engine - - Jade is a high performance template engine heavily influenced by [Haml](http://haml-lang.com) - and implemented with JavaScript for [node](http://nodejs.org). For discussion join the [Google Group](http://groups.google.com/group/jadejs). - -## Test drive - - You can test drive Jade online [here](http://naltatis.github.com/jade-syntax-docs). - -## README Contents - -- [Features](#a1) -- [Implementations](#a2) -- [Installation](#a3) -- [Browser Support](#a4) -- [Public API](#a5) -- [Syntax](#a6) - - [Line Endings](#a6-1) - - [Tags](#a6-2) - - [Tag Text](#a6-3) - - [Comments](#a6-4) - - [Block Comments](#a6-5) - - [Nesting](#a6-6) - - [Block Expansion](#a6-7) - - [Case](#a6-8) - - [Attributes](#a6-9) - - [HTML](#a6-10) - - [Doctypes](#a6-11) -- [Filters](#a7) -- [Code](#a8) -- [Iteration](#a9) -- [Conditionals](#a10) -- [Template inheritance](#a11) -- [Block append / prepend](#a12) -- [Includes](#a13) -- [Mixins](#a14) -- [Generated Output](#a15) -- [Example Makefile](#a16) -- [jade(1)](#a17) -- [Tutorials](#a18) -- [License](#a19) - - -## Features - - - client-side support - - great readability - - flexible indentation - - block-expansion - - mixins - - static includes - - attribute interpolation - - code is escaped by default for security - - contextual error reporting at compile & run time - - executable for compiling jade templates via the command line - - html 5 mode (the default doctype) - - optional memory caching - - combine dynamic and static tag classes - - parse tree manipulation via _filters_ - - template inheritance - - block append / prepend - - supports [Express JS](http://expressjs.com) out of the box - - transparent iteration over objects, arrays, and even non-enumerables via `each` - - block comments - - no tag prefix - - filters - - :stylus must have [stylus](http://github.com/LearnBoost/stylus) installed - - :less must have [less.js](http://github.com/cloudhead/less.js) installed - - :markdown must have [markdown-js](http://github.com/evilstreak/markdown-js), [node-discount](http://github.com/visionmedia/node-discount), or [marked](http://github.com/chjj/marked) installed - - :cdata - - :coffeescript must have [coffee-script](http://jashkenas.github.com/coffee-script/) installed - - [Emacs Mode](https://github.com/brianc/jade-mode) - - [Vim Syntax](https://github.com/digitaltoad/vim-jade) - - [TextMate Bundle](http://github.com/miksago/jade-tmbundle) - - [Coda/SubEtha syntax Mode](https://github.com/aaronmccall/jade.mode) - - [Screencasts](http://tjholowaychuk.com/post/1004255394/jade-screencast-template-engine-for-nodejs) - - [html2jade](https://github.com/donpark/html2jade) converter - - -## Implementations - - - [php](http://github.com/everzet/jade.php) - - [scala](http://scalate.fusesource.org/versions/snapshot/documentation/scaml-reference.html) - - [ruby](http://github.com/stonean/slim) - - [python](https://github.com/SyrusAkbary/pyjade) - - [java](https://github.com/neuland/jade4j) - - -## Installation - -via npm: - -```bash -$ npm install jade -``` - - -## Browser Support - - To compile jade to a single file compatible for client-side use simply execute: - -```bash -$ make jade.js -``` - - Alternatively, if uglifyjs is installed via npm (`npm install uglify-js`) you may execute the following which will create both files. However each release builds these for you. - -```bash -$ make jade.min.js -``` - - By default Jade instruments templates with line number statements such as `__.lineno = 3` for debugging purposes. When used in a browser it's useful to minimize this boiler plate, you can do so by passing the option `{ compileDebug: false }`. The following template - -```jade -p Hello #{name} -``` - - Can then be as small as the following generated function: - -```js -function anonymous(locals, attrs, escape, rethrow) { - var buf = []; - with (locals || {}) { - var interp; - buf.push('\n

    Hello ' + escape((interp = name) == null ? '' : interp) + '\n

    '); - } - return buf.join(""); -} -``` - - Through the use of Jade's `./runtime.js` you may utilize these pre-compiled templates on the client-side _without_ Jade itself, all you need is the associated utility functions (in runtime.js), which are then available as `jade.attrs`, `jade.escape` etc. To enable this you should pass `{ client: true }` to `jade.compile()` to tell Jade to reference the helper functions - via `jade.attrs`, `jade.escape` etc. - -```js -function anonymous(locals, attrs, escape, rethrow) { - var attrs = jade.attrs, escape = jade.escape, rethrow = jade.rethrow; - var buf = []; - with (locals || {}) { - var interp; - buf.push('\n

    Hello ' + escape((interp = name) == null ? '' : interp) + '\n

    '); - } - return buf.join(""); -} -``` - -
    -## Public API - -```js -var jade = require('jade'); - -// Compile a function -var fn = jade.compile('string of jade', options); -fn(locals); -``` - -### Options - - - `self` Use a `self` namespace to hold the locals _(false by default)_ - - `locals` Local variable object - - `filename` Used in exceptions, and required when using includes - - `debug` Outputs tokens and function body generated - - `compiler` Compiler to replace jade's default - - `compileDebug` When `false` no debug instrumentation is compiled - - `pretty` Add pretty-indentation whitespace to output _(false by default)_ - - -## Syntax - - -### Line Endings - -**CRLF** and **CR** are converted to **LF** before parsing. - - -### Tags - -A tag is simply a leading word: - -```jade -html -``` - -for example is converted to `` - -tags can also have ids: - -```jade -div#container -``` - -which would render `
    ` - -how about some classes? - -```jade -div.user-details -``` - -renders `
    ` - -multiple classes? _and_ an id? sure: - -```jade -div#foo.bar.baz -``` - -renders `
    ` - -div div div sure is annoying, how about: - -```jade -#foo -.bar -``` - -which is syntactic sugar for what we have already been doing, and outputs: - -```html -
    -``` - -
    -### Tag Text - -Simply place some content after the tag: - -```jade -p wahoo! -``` - -renders `

    wahoo!

    `. - -well cool, but how about large bodies of text: - -```jade -p - | foo bar baz - | rawr rawr - | super cool - | go jade go -``` - -renders `

    foo bar baz rawr.....

    ` - -interpolation? yup! both types of text can utilize interpolation, -if we passed `{ name: 'tj', email: 'tj@vision-media.ca' }` to the compiled function we can do the following: - -```jade -#user #{name} <#{email}> -``` - -outputs `
    tj <tj@vision-media.ca>
    ` - -Actually want `#{}` for some reason? escape it! - -```jade -p \#{something} -``` - -now we have `

    #{something}

    ` - -We can also utilize the unescaped variant `!{html}`, so the following -will result in a literal script tag: - -```jade -- var html = "" -| !{html} -``` - -Nested tags that also contain text can optionally use a text block: - -```jade -label - | Username: - input(name='user[name]') -``` - -or immediate tag text: - -```jade -label Username: - input(name='user[name]') -``` - -Tags that accept _only_ text such as `script` and `style` do not -need the leading `|` character, for example: - -```jade -html - head - title Example - script - if (foo) { - bar(); - } else { - baz(); - } -``` - -Once again as an alternative, we may use a trailing `.` to indicate a text block, for example: - -```jade -p. - foo asdf - asdf - asdfasdfaf - asdf - asd. -``` - -outputs: - -```html -

    foo asdf -asdf - asdfasdfaf - asdf -asd. -

    -``` - -This however differs from a trailing `.` followed by a space, which although is ignored by the Jade parser, tells Jade that this period is a literal: - -```jade -p . -``` - -outputs: - -```html -

    .

    -``` - -It should be noted that text blocks should be doubled escaped. For example if you desire the following output. - -```html -

    foo\bar

    -``` - -use: - -```jade -p. - foo\\bar -``` - -
    -### Comments - -Single line comments currently look the same as JavaScript comments, -aka `//` and must be placed on their own line: - -```jade -// just some paragraphs -p foo -p bar -``` - -would output - -```html - -

    foo

    -

    bar

    -``` - -Jade also supports unbuffered comments, by simply adding a hyphen: - -```jade -//- will not output within markup -p foo -p bar -``` - -outputting - -```html -

    foo

    -

    bar

    -``` - -
    -### Block Comments - - A block comment is legal as well: - -```jade -body - // - #content - h1 Example -``` - -outputting - -```html - - - -``` - -Jade supports conditional-comments as well, for example: - -```jade -head - //if lt IE 8 - script(src='/ie-sucks.js') -``` - -outputs: - -```html - - - -``` - - -### Nesting - - Jade supports nesting to define the tags in a natural way: - -```jade -ul - li.first - a(href='#') foo - li - a(href='#') bar - li.last - a(href='#') baz -``` - - -### Block Expansion - - Block expansion allows you to create terse single-line nested tags, - the following example is equivalent to the nesting example above. - -```jade -ul - li.first: a(href='#') foo - li: a(href='#') bar - li.last: a(href='#') baz -``` - - -### Case - - The case statement takes the following form: - -```jade -html - body - friends = 10 - case friends - when 0 - p you have no friends - when 1 - p you have a friend - default - p you have #{friends} friends -``` - - Block expansion may also be used: - -```jade -friends = 5 - -html - body - case friends - when 0: p you have no friends - when 1: p you have a friend - default: p you have #{friends} friends -``` - - -### Attributes - -Jade currently supports `(` and `)` as attribute delimiters. - -```jade -a(href='/login', title='View login page') Login -``` - -When a value is `undefined` or `null` the attribute is _not_ added, -so this is fine, it will not compile `something="null"`. - -```jade -div(something=null) -``` - -Boolean attributes are also supported: - -```jade -input(type="checkbox", checked) -``` - -Boolean attributes with code will only output the attribute when `true`: - -```jade -input(type="checkbox", checked=someValue) -``` - -Multiple lines work too: - -```jade -input(type='checkbox', - name='agreement', - checked) -``` - -Multiple lines without the comma work fine: - -```jade -input(type='checkbox' - name='agreement' - checked) -``` - -Funky whitespace? fine: - -```jade -input( - type='checkbox' - name='agreement' - checked) -``` - -Colons work: - -```jade -rss(xmlns:atom="atom") -``` - -Suppose we have the `user` local `{ id: 12, name: 'tobi' }` -and we wish to create an anchor tag with `href` pointing to "/user/12" -we could use regular javascript concatenation: - -```jade -a(href='/user/' + user.id)= user.name -``` - -or we could use jade's interpolation, which I added because everyone -using Ruby or CoffeeScript seems to think this is legal js..: - -```jade -a(href='/user/#{user.id}')= user.name -``` - -The `class` attribute is special-cased when an array is given, -allowing you to pass an array such as `bodyClasses = ['user', 'authenticated']` directly: - -```jade -body(class=bodyClasses) -``` - - -### HTML - - Inline html is fine, we can use the pipe syntax to - write arbitrary text, in this case some html: - -```jade -html - body - |

    Title

    - |

    foo bar baz

    -``` - - Or we can use the trailing `.` to indicate to Jade that we - only want text in this block, allowing us to omit the pipes: - -```jade -html - body. -

    Title

    -

    foo bar baz

    -``` - - Both of these examples yield the same result: - -```html -

    Title

    -

    foo bar baz

    - -``` - - The same rule applies for anywhere you can have text - in jade, raw html is fine: - -```jade -html - body - h1 User #{name} -``` - -
    -### Doctypes - -To add a doctype simply use `!!!`, or `doctype` followed by an optional value: - -```jade -!!! -``` - -or - -```jade -doctype -``` - -Will output the _html 5_ doctype, however: - -```jade -!!! transitional -``` - -Will output the _transitional_ doctype. - -Doctypes are case-insensitive, so the following are equivalent: - -```jade -doctype Basic -doctype basic -``` - -it's also possible to simply pass a doctype literal: - -```jade -doctype html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN -``` - -yielding: - -```html - -``` - -Below are the doctypes defined by default, which can easily be extended: - -```js -var doctypes = exports.doctypes = { - '5': '', - 'default': '', - 'xml': '', - 'transitional': '', - 'strict': '', - 'frameset': '', - '1.1': '', - 'basic': '', - 'mobile': '' -}; -``` - -To alter the default simply change: - -```js -jade.doctypes.default = 'whatever you want'; -``` - - -## Filters - -Filters are prefixed with `:`, for example `:markdown` and -pass the following block of text to an arbitrary function for processing. View the _features_ -at the top of this document for available filters. - -```jade -body - :markdown - Woah! jade _and_ markdown, very **cool** - we can even link to [stuff](http://google.com) -``` - -Renders: - -```html -

    Woah! jade and markdown, very cool we can even link to stuff

    -``` - - -## Code - -Jade currently supports three classifications of executable code. The first -is prefixed by `-`, and is not buffered: - -```jade -- var foo = 'bar'; -``` - -This can be used for conditionals, or iteration: - -```jade -- for (var key in obj) - p= obj[key] -``` - -Due to Jade's buffering techniques the following is valid as well: - -```jade -- if (foo) - ul - li yay - li foo - li worked -- else - p oh no! didnt work -``` - -Hell, even verbose iteration: - -```jade -- if (items.length) - ul - - items.forEach(function(item){ - li= item - - }) -``` - -Anything you want! - -Next up we have _escaped_ buffered code, which is used to -buffer a return value, which is prefixed by `=`: - -```jade -- var foo = 'bar' -= foo -h1= foo -``` - -Which outputs `bar

    bar

    `. Code buffered by `=` is escaped -by default for security, however to output unescaped return values -you may use `!=`: - -```jade -p!= aVarContainingMoreHTML -``` - - Jade also has designer-friendly variants, making the literal JavaScript - more expressive and declarative. For example the following assignments - are equivalent, and the expression is still regular javascript: - -```jade -- var foo = 'foo ' + 'bar' -foo = 'foo ' + 'bar' -``` - - Likewise Jade has first-class `if`, `else if`, `else`, `until`, `while`, `unless` among others, however you must remember that the expressions are still regular javascript: - -```jade -if foo == 'bar' - ul - li yay - li foo - li worked -else - p oh no! didnt work -``` - -
    -## Iteration - - Along with vanilla JavaScript Jade also supports a subset of - constructs that allow you to create more designer-friendly templates, - one of these constructs is `each`, taking the form: - -```jade -each VAL[, KEY] in OBJ -``` - -An example iterating over an array: - -```jade -- var items = ["one", "two", "three"] -each item in items - li= item -``` - -outputs: - -```html -
  • one
  • -
  • two
  • -
  • three
  • -``` - -iterating an array with index: - -```jade -items = ["one", "two", "three"] -each item, i in items - li #{item}: #{i} -``` - -outputs: - -```html -
  • one: 0
  • -
  • two: 1
  • -
  • three: 2
  • -``` - -iterating an object's keys and values: - -```jade -obj = { foo: 'bar' } -each val, key in obj - li #{key}: #{val} -``` - -would output `
  • foo: bar
  • ` - -Internally Jade converts these statements to regular -JavaScript loops such as `users.forEach(function(user){`, -so lexical scope and nesting applies as it would with regular -JavaScript: - -```jade -each user in users - each role in user.roles - li= role -``` - - You may also use `for` if you prefer: - -```jade -for user in users - for role in user.roles - li= role -``` - -
    -## Conditionals - - Jade conditionals are equivalent to those using the code (`-`) prefix, - however allow you to ditch parenthesis to become more designer friendly, - however keep in mind the expression given is _regular_ JavaScript: - -```jade -for user in users - if user.role == 'admin' - p #{user.name} is an admin - else - p= user.name -``` - - is equivalent to the following using vanilla JavaScript literals: - -```jade -for user in users - - if (user.role == 'admin') - p #{user.name} is an admin - - else - p= user.name -``` - - Jade also provides have `unless` which is equivalent to `if (!(expr))`: - -```jade -for user in users - unless user.isAnonymous - p - | Click to view - a(href='/users/' + user.id)= user.name -``` - - -## Template inheritance - - Jade supports template inheritance via the `block` and `extends` keywords. A block is simply a "block" of Jade that may be replaced within a child template, this process is recursive. To activate template inheritance in Express 2.x you must add: `app.set('view options', { layout: false });`. - - Jade blocks can provide default content if desired, however optional as shown below by `block scripts`, `block content`, and `block foot`. - -```jade -html - head - h1 My Site - #{title} - block scripts - script(src='/jquery.js') - body - block content - block foot - #footer - p some footer content -``` - - Now to extend the layout, simply create a new file and use the `extends` directive as shown below, giving the path (with or without the .jade extension). You may now define one or more blocks that will override the parent block content, note that here the `foot` block is _not_ redefined and will output "some footer content". - -```jade -extends layout - -block scripts - script(src='/jquery.js') - script(src='/pets.js') - -block content - h1= title - each pet in pets - include pet -``` - - It's also possible to override a block to provide additional blocks, as shown in the following example where `content` now exposes a `sidebar` and `primary` block for overriding, or the child template could override `content` all together. - -```jade -extends regular-layout - -block content - .sidebar - block sidebar - p nothing - .primary - block primary - p nothing -``` - - -## Block append / prepend - - Jade allows you to _replace_ (default), _prepend_, or _append_ blocks. Suppose for example you have default scripts in a "head" block that you wish to utilize on _every_ page, you might do this: - -```jade -html - head - block head - script(src='/vendor/jquery.js') - script(src='/vendor/caustic.js') - body - block content -``` - - Now suppose you have a page of your application for a JavaScript game, you want some game related scripts as well as these defaults, you can simply `append` the block: - -```jade -extends layout - -block append head - script(src='/vendor/three.js') - script(src='/game.js') -``` - - When using `block append` or `block prepend` the `block` is optional: - -```jade -extends layout - -append head - script(src='/vendor/three.js') - script(src='/game.js') -``` - - -## Includes - - Includes allow you to statically include chunks of Jade, - or other content like css, or html which lives in separate files. The classical example is including a header and footer. Suppose we have the following directory structure: - - ./layout.jade - ./includes/ - ./head.jade - ./foot.jade - -and the following _layout.jade_: - -```jade -html - include includes/head - body - h1 My Site - p Welcome to my super amazing site. - include includes/foot -``` - -both includes _includes/head_ and _includes/foot_ are -read relative to the `filename` option given to _layout.jade_, -which should be an absolute path to this file, however Express does this for you. Include then parses these files, and injects the AST produced to render what you would expect: - -```html - - - My Site - - - -

    My Site

    -

    Welcome to my super lame site.

    - - - -``` - - As mentioned `include` can be used to include other content - such as html or css. By providing an extension Jade will not - assume that the file is Jade source and will include it as - a literal: - -```jade -html - body - include content.html -``` - - Include directives may also accept a block, in which case the - the given block will be appended to the _last_ block defined - in the file. For example if `head.jade` contains: - -```jade -head - script(src='/jquery.js') -``` - - We may append values by providing a block to `include head` - as shown below, adding the two scripts. - -```jade -html - include head - script(src='/foo.js') - script(src='/bar.js') - body - h1 test -``` - - You may also `yield` within an included template, allowing you to explicitly mark where the block given to `include` will be placed. Suppose for example you wish to prepend scripts rather than append, you might do the following: - -```jade -head - yield - script(src='/jquery.js') - script(src='/jquery.ui.js') -``` - - Since included Jade is parsed and literally merges the AST, lexically scoped variables function as if the included Jade was written right in the same file. This means `include` may be used as sort of partial, for example suppose we have `user.jade` which utilizes a `user` variable. - -```jade -h1= user.name -p= user.occupation -``` - -We could then simply `include user` while iterating users, and since the `user` variable is already defined within the loop the included template will have access to it. - -```jade -users = [{ name: 'Tobi', occupation: 'Ferret' }] - -each user in users - .user - include user -``` - -yielding: - -```html -
    -

    Tobi

    -

    Ferret

    -
    -``` - -If we wanted to expose a different variable name as `user` since `user.jade` references that name, we could simply define a new variable as shown here with `user = person`: - -```jade -each person in users - .user - user = person - include user -``` - -
    -## Mixins - - Mixins are converted to regular JavaScript functions in - the compiled template that Jade constructs. Mixins may - take arguments, though not required: - -```jade -mixin list - ul - li foo - li bar - li baz -``` - - Utilizing a mixin without args looks similar, just without a block: - -```jade -h2 Groceries -mixin list -``` - - Mixins may take one or more arguments as well, the arguments - are regular javascripts expressions, so for example the following: - -```jade -mixin pets(pets) - ul.pets - - each pet in pets - li= pet - -mixin profile(user) - .user - h2= user.name - mixin pets(user.pets) -``` - - Would yield something similar to the following html: - -```html -
    -

    tj

    -
      -
    • tobi
    • -
    • loki
    • -
    • jane
    • -
    • manny
    • -
    -
    -``` - -
    -## Generated Output - - Suppose we have the following Jade: - -```jade -- var title = 'yay' -h1.title #{title} -p Just an example -``` - - When the `compileDebug` option is not explicitly `false`, Jade - will compile the function instrumented with `__.lineno = n;`, which - in the event of an exception is passed to `rethrow()` which constructs - a useful message relative to the initial Jade input. - -```js -function anonymous(locals) { - var __ = { lineno: 1, input: "- var title = 'yay'\nh1.title #{title}\np Just an example", filename: "testing/test.js" }; - var rethrow = jade.rethrow; - try { - var attrs = jade.attrs, escape = jade.escape; - var buf = []; - with (locals || {}) { - var interp; - __.lineno = 1; - var title = 'yay' - __.lineno = 2; - buf.push(''); - buf.push('' + escape((interp = title) == null ? '' : interp) + ''); - buf.push(''); - __.lineno = 3; - buf.push('

    '); - buf.push('Just an example'); - buf.push('

    '); - } - return buf.join(""); - } catch (err) { - rethrow(err, __.input, __.filename, __.lineno); - } -} -``` - -When the `compileDebug` option _is_ explicitly `false`, this instrumentation -is stripped, which is very helpful for light-weight client-side templates. Combining Jade's options with the `./runtime.js` file in this repo allows you -to toString() compiled templates and avoid running the entire Jade library on -the client, increasing performance, and decreasing the amount of JavaScript -required. - -```js -function anonymous(locals) { - var attrs = jade.attrs, escape = jade.escape; - var buf = []; - with (locals || {}) { - var interp; - var title = 'yay' - buf.push(''); - buf.push('' + escape((interp = title) == null ? '' : interp) + ''); - buf.push(''); - buf.push('

    '); - buf.push('Just an example'); - buf.push('

    '); - } - return buf.join(""); -} -``` - -
    -## Example Makefile - - Below is an example Makefile used to compile _pages/*.jade_ - into _pages/*.html_ files by simply executing `make`. - -```make -JADE = $(shell find pages/*.jade) -HTML = $(JADE:.jade=.html) - -all: $(HTML) - -%.html: %.jade - jade < $< --path $< > $@ - -clean: - rm -f $(HTML) - -.PHONY: clean -``` - -this can be combined with the `watch(1)` command to produce -a watcher-like behaviour: - -```bash -$ watch make -``` - - -## jade(1) - -``` - -Usage: jade [options] [dir|file ...] - -Options: - - -h, --help output usage information - -V, --version output the version number - -o, --obj javascript options object - -O, --out output the compiled html to - -p, --path filename used to resolve includes - -P, --pretty compile pretty html output - -c, --client compile for client-side runtime.js - -D, --no-debug compile without debugging (smaller functions) - -Examples: - - # translate jade the templates dir - $ jade templates - - # create {foo,bar}.html - $ jade {foo,bar}.jade - - # jade over stdio - $ jade < my.jade > my.html - - # jade over stdio - $ echo "h1 Jade!" | jade - - # foo, bar dirs rendering to /tmp - $ jade foo bar --out /tmp - -``` - - -## Tutorials - - - cssdeck interactive [Jade syntax tutorial](http://cssdeck.com/labs/learning-the-jade-templating-engine-syntax) - - cssdeck interactive [Jade logic tutorial](http://cssdeck.com/labs/jade-templating-tutorial-codecast-part-2) - - in [Japanese](http://blog.craftgear.net/4f501e97c1347ec934000001/title/10%E5%88%86%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8Bjade%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3) - - -## License - -(The MIT License) - -Copyright (c) 2009-2010 TJ Holowaychuk <tj@vision-media.ca> - -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/node_modules/jade/Readme_zh-cn.md b/node_modules/jade/Readme_zh-cn.md deleted file mode 100644 index cb90608..0000000 --- a/node_modules/jade/Readme_zh-cn.md +++ /dev/null @@ -1,921 +0,0 @@ -# Jade - 模板引擎 - - Jade 是一个高性能的模板引擎,它深受[Haml](http://haml-lang.com)影响,它是用javascript实现的,并且可以供[node](http://nodejs.org)使用. - - 翻译:[草依山](http://jser.me)   [翻译反馈](http://weibo.com/1826461472/z9jriDdmB#pl_profile_nav)  [Fork me](https://github.com/jserme/jade/) - -## 特性 - - - 客户端支持 - - 代码高可读 - - 灵活的缩进 - - 块展开 - - 混合 - - 静态包含 - - 属性改写 - - 安全,默认代码是转义的 - - 运行时和编译时上下文错误报告 - - 命令行下编译jade模板 - - html 5 模式 (使用 _!!! 5_ 文档类型) - - 在内存中缓存(可选) - - 合并动态和静态标签类 - - 可以通过 _filters_ 修改树 - - 模板继承 - - 原生支持 [Express JS](http://expressjs.com) - - 通过 `each` 枚举对象、数组甚至是不能枚举的对象 - - 块注释 - - 没有前缀的标签 - - AST filters - - 过滤器 - - :sass 必须已经安装[sass.js](http://github.com/visionmedia/sass.js) - - :less 必须已经安装[less.js](http://github.com/cloudhead/less.js) - - :markdown 必须已经安装[markdown-js](http://github.com/evilstreak/markdown-js) 或者[node-discount](http://github.com/visionmedia/node-discount) - - :cdata - - :coffeescript 必须已经安装[coffee-script](http://jashkenas.github.com/coffee-script/) - - [Vim Syntax](https://github.com/digitaltoad/vim-jade) - - [TextMate Bundle](http://github.com/miksago/jade-tmbundle) - - [Screencasts](http://tjholowaychuk.com/post/1004255394/jade-screencast-template-engine-for-nodejs) - - [html2jade](https://github.com/donpark/html2jade) 转换器 - -## 其它实现 - - - [php](http://github.com/everzet/jade.php) - - [scala](http://scalate.fusesource.org/versions/snapshot/documentation/scaml-reference.html) - - [ruby](http://github.com/stonean/slim) - -## 安装 - -通过 npm: - - npm install jade - -## 浏览器支持 - - 把jade编译为一个可供浏览器使用的单文件,只需要简单的执行: - - $ make jade.js - - 如果你已经安装了uglifyjs (`npm install uglify-js`),你可以执行下面的命令它会生成所有的文件。其实每一个正式版本里都帮你做了这事。 - - $ make jade.min.js - - 默认情况下,为了方便调试Jade会把模板组织成带有形如 `__.lineno = 3` 的行号的形式。 - 在浏览器里使用的时候,你可以通过传递一个选项`{ compileDebug: false }`来去掉这个。 - 下面的模板 - - p Hello #{name} - - 会被翻译成下面的函数: - -```js -function anonymous(locals, attrs, escape, rethrow) { - var buf = []; - with (locals || {}) { - var interp; - buf.push('\n

    Hello ' + escape((interp = name) == null ? '' : interp) + '\n

    '); - } - return buf.join(""); -} -``` - - 通过使用Jade的 `./runtime.js`你可以在浏览器使用这些预编译的模板而不需要使用Jade, 你只需要使用runtime.js里的工具函数, 它们会放在`jade.attrs`, `jade.escape` 这些里。 把选项 `{ client: true }` 传递给 `jade.compile()`, Jade 会把这些帮助函数的引用放在`jade.attrs`, `jade.escape`. - -```js -function anonymous(locals, attrs, escape, rethrow) { - var attrs = jade.attrs, escape = jade.escape, rethrow = jade.rethrow; - var buf = []; - with (locals || {}) { - var interp; - buf.push('\n

    Hello ' + escape((interp = name) == null ? '' : interp) + '\n

    '); - } - return buf.join(""); -} -``` - -## 公开API - -```javascript - var jade = require('jade'); - - // Compile a function - var fn = jade.compile('string of jade', options); - fn(locals); -``` - -### 选项 - - - `self` 使用`self` 命名空间来持有本地变量. _默认为false_ - - `locals` 本地变量对象 - - `filename` 异常发生时使用,includes时必需 - - `debug` 输出token和翻译后的函数体 - - `compiler` 替换掉jade默认的编译器 - - `compileDebug` `false`的时候调试的结构不会被输出 - -## 语法 - -### 行结束标志 - -**CRLF** 和 **CR** 会在编译之前被转换为 **LF** - -### 标签 - -标签就是一个简单的单词: - - html - -它会被转换为 `` - -标签也是可以有id的: - - div#container - -它会被转换为 `
    ` - -怎么加类呢? - - div.user-details - -转换为 `
    ` - -多个类? 和id? 也是可以搞定的: - - div#foo.bar.baz - -转换为 `
    ` - -不停的div div div 很讨厌啊 , 可以这样: - - #foo - .bar - -这个算是我们的语法糖,它已经被很好的支持了,上面的会输出: - - `
    ` - -### 标签文本 - -只需要简单的把内容放在标签之后: - - p wahoo! - -它会被渲染为 `

    wahoo!

    `. - -很帅吧,但是大段的文本怎么办呢: - - p - | foo bar baz - | rawr rawr - | super cool - | go jade go - -渲染为 `

    foo bar baz rawr.....

    ` - -怎么和数据结合起来? 所有类型的文本展示都可以和数据结合起来,如果我们把`{ name: 'tj', email: 'tj@vision-media.ca' }` 传给编译函数,下面是模板上的写法: - - #user #{name} <#{email}> - -它会被渲染为 `
    tj <tj@vision-media.ca>
    ` - -当就是要输出`#{}` 的时候怎么办? 转义一下! - - p \#{something} - -它会输出`

    #{something}

    ` - -同样可以使用非转义的变量`!{html}`, 下面的模板将直接输出一个script标签 - - - var html = "" - | !{html} - -内联标签同样可以使用文本块来包含文本: - - label - | Username: - input(name='user[name]') - -或者直接使用标签文本: - - label Username: - input(name='user[name]') - -_只_包含文本的标签,比如`script`, `style`, 和 `textarea` 不需要前缀`|` 字符, 比如: - - html - head - title Example - script - if (foo) { - bar(); - } else { - baz(); - } - -这里还有一种选择,可以使用'.' 来开始一段文本块,比如: - - p. - foo asdf - asdf - asdfasdfaf - asdf - asd. - -会被渲染为: - -

    foo asdf - asdf - asdfasdfaf - asdf - asd - . -

    - -这和带一个空格的 '.' 是不一样的, 带空格的会被Jade的解析器忽略,当作一个普通的文字: - - p . - -渲染为: - -

    .

    - - -需要注意的是广西块需要两次转义。比如想要输出下面的文本: - -

    foo\bar

    - -使用: - - p. - foo\\bar - -### 注释 - -单行注释和JavaScript里是一样的,通过"//"来开始,并且必须单独一行: - - // just some paragraphs - p foo - p bar - -渲染为: - - -

    foo

    -

    bar

    - -Jade 同样支持不输出的注释,加一个短横线就行了: - - //- will not output within markup - p foo - p bar - -渲染为: - -

    foo

    -

    bar

    - -### 块注释 - - 块注释也是支持的: - - body - // - #content - h1 Example - -渲染为: - - - - - -Jade 同样很好的支持了条件注释: - - body - //if IE - a(href='http://www.mozilla.com/en-US/firefox/') Get Firefox - - -渲染为: - - - - - -### 内联 - - Jade 支持以自然的方式定义标签嵌套: - - ul - li.first - a(href='#') foo - li - a(href='#') bar - li.last - a(href='#') baz - -### 块展开 - - 块展开可以帮助你在一行内创建嵌套的标签,下面的例子和上面的是一样的: - - ul - li.first: a(href='#') foo - li: a(href='#') bar - li.last: a(href='#') baz - - -### 属性 - -Jade 现在支持使用'(' 和 ')' 作为属性分隔符 - - a(href='/login', title='View login page') Login - -当一个值是 `undefined` 或者 `null` 属性_不_会被加上, -所以呢,它不会编译出 'something="null"'. - - div(something=null) - -Boolean 属性也是支持的: - - input(type="checkbox", checked) - -使用代码的Boolean 属性只有当属性为`true`时才会输出: - - input(type="checkbox", checked=someValue) - -多行同样也是可用的: - - input(type='checkbox', - name='agreement', - checked) - -多行的时候可以不加逗号: - - input(type='checkbox' - name='agreement' - checked) - -加点空格,格式好看一点?同样支持 - - input( - type='checkbox' - name='agreement' - checked) - -冒号也是支持的: - - rss(xmlns:atom="atom") - -假如我有一个`user` 对象 `{ id: 12, name: 'tobi' }` -我们希望创建一个指向"/user/12"的链接 `href`, 我们可以使用普通的javascript字符串连接,如下: - - a(href='/user/' + user.id)= user.name - -或者我们使用jade的修改方式,这个我想很多使用Ruby或者 CoffeeScript的人会看起来像普通的js..: - - a(href='/user/#{user.id}')= user.name - -`class`属性是一个特殊的属性,你可以直接传递一个数组,比如`bodyClasses = ['user', 'authenticated']` : - - body(class=bodyClasses) - -### HTML - - 内联的html是可以的,我们可以使用管道定义一段文本 : - -``` -html - body - |

    Title

    - |

    foo bar baz

    -``` - - 或者我们可以使用`.` 来告诉Jade我们需要一段文本: - -``` -html - body. -

    Title

    -

    foo bar baz

    -``` - - 上面的两个例子都会渲染成相同的结果: - -``` -

    Title

    -

    foo bar baz

    - -``` - - 这条规则适应于在jade里的任何文本: - -``` -html - body - h1 User #{name} -``` - -### Doctypes - -添加文档类型只需要简单的使用 `!!!`, 或者 `doctype` 跟上下面的可选项: - - !!! - -会渲染出 _transitional_ 文档类型, 或者: - - !!! 5 - -or - - !!! html - -or - - doctype html - -doctypes 是大小写不敏感的, 所以下面两个是一样的: - - doctype Basic - doctype basic - -当然也是可以直接传递一段文档类型的文本: - - doctype html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN - -渲染后: - - - -会输出 _html 5_ 文档类型. 下面的默认的文档类型,可以很简单的扩展: - -```javascript - var doctypes = exports.doctypes = { - '5': '', - 'xml': '', - 'default': '', - 'transitional': '', - 'strict': '', - 'frameset': '', - '1.1': '', - 'basic': '', - 'mobile': '' - }; -``` - -通过下面的代码可以很简单的改变默认的文档类型: - -```javascript - jade.doctypes.default = 'whatever you want'; -``` - -## 过滤器 - -过滤器前缀 `:`, 比如 `:markdown` 会把下面块里的文本交给专门的函数进行处理。查看顶部 _特性_ 里有哪些可用的过滤器。 - - body - :markdown - Woah! jade _and_ markdown, very **cool** - we can even link to [stuff](http://google.com) - -渲染为: - -

    Woah! jade and markdown, very cool we can even link to stuff

    - -## 代码 - -Jade目前支持三种类型的可执行代码。第一种是前缀`-`, 这是不会被输出的: - - - var foo = 'bar'; - -这可以用在条件语句或者循环中: - - - for (var key in obj) - p= obj[key] - -由于Jade的缓存技术,下面的代码也是可以的: - - - if (foo) - ul - li yay - li foo - li worked - - else - p oh no! didnt work - -哈哈,甚至是很长的循环也是可以的: - - - if (items.length) - ul - - items.forEach(function(item){ - li= item - - }) - -所以你想要的! - -下一步我们要_转义_输出的代码,比如我们返回一个值,只要前缀一个`=`: - - - var foo = 'bar' - = foo - h1= foo - -它会渲染为`bar

    bar

    `. 为了安全起见,使用`=`输出的代码默认是转义的,如果想直接输出不转义的值可以使用`!=`: - - p!= aVarContainingMoreHTML - -Jade 同样是设计师友好的,它可以使javascript更直接更富表现力。比如下面的赋值语句是相等的,同时表达式还是通常的javascript: - - - var foo = 'foo ' + 'bar' - foo = 'foo ' + 'bar' - -Jade会把 `if`, `else if`, `else`, `until`, `while`, `unless`同别的优先对待, 但是你得记住它们还是普通的javascript: - - if foo == 'bar' - ul - li yay - li foo - li worked - else - p oh no! didnt work - -## 循环 - -尽管已经支持JavaScript原生代码,Jade还是支持了一些特殊的标签,它们可以让模板更加易于理解,其中之一就是`each`, 这种形式: - - each VAL[, KEY] in OBJ - -一个遍历数组的例子 : - - - var items = ["one", "two", "three"] - each item in items - li= item - -渲染为: - -
  • one
  • -
  • two
  • -
  • three
  • - -遍历一个数组同时带上索引: - - items = ["one", "two", "three"] - each item, i in items - li #{item}: #{i} - -渲染为: - -
  • one: 0
  • -
  • two: 1
  • -
  • three: 2
  • - -遍历一个数组的键值: - - obj = { foo: 'bar' } - each val, key in obj - li #{key}: #{val} - -将会渲染为:`
  • foo: bar
  • ` - -Jade在内部会把这些语句转换成原生的JavaScript语句,就像使用 `users.forEach(function(user){`, -词法作用域和嵌套会像在普通的JavaScript中一样: - - each user in users - each role in user.roles - li= role - -如果你喜欢,也可以使用`for` : - - for user in users - for role in user.roles - li= role - -## 条件语句 - -Jade 条件语句和使用了(`-`) 前缀的JavaScript语句是一致的,然后它允许你不使用圆括号,这样会看上去对设计师更友好一点, -同时要在心里记住这个表达式渲染出的是_常规_Javascript: - - for user in users - if user.role == 'admin' - p #{user.name} is an admin - else - p= user.name - -和下面的使用了常规JavaScript的代码是相等的: - - for user in users - - if (user.role == 'admin') - p #{user.name} is an admin - - else - p= user.name - -Jade 同时支持`unless`, 这和`if (!(expr))`是等价的: - - for user in users - unless user.isAnonymous - p - | Click to view - a(href='/users/' + user.id)= user.name - -## 模板继承 - - Jade 支持通过 `block` 和 `extends` 关键字来实现模板继承。 一个块就是一个Jade的"block" ,它将在子模板中实现,同时是支持递归的。 - - Jade 块如果没有内容,Jade会添加默认内容,下面的代码默认会输出`block scripts`, `block content`, 和 `block foot`. - -``` -html - head - h1 My Site - #{title} - block scripts - script(src='/jquery.js') - body - block content - block foot - #footer - p some footer content -``` - - 现在我们来继承这个布局,简单创建一个新文件,像下面那样直接使用`extends`,给定路径(可以选择带.jade扩展名或者不带). 你可以定义一个或者更多的块来覆盖父级块内容, 注意到这里的`foot`块_没有_定义,所以它还会输出父级的"some footer content"。 - -``` -extends extend-layout - -block scripts - script(src='/jquery.js') - script(src='/pets.js') - -block content - h1= title - each pet in pets - include pet -``` - - 同样可以在一个子块里添加块,就像下面实现的块`content`里又定义了两个可以被实现的块`sidebar`和`primary`,或者子模板直接实现`content`。 - -``` -extends regular-layout - -block content - .sidebar - block sidebar - p nothing - .primary - block primary - p nothing -``` - -## 包含 - - Includes 允许你静态包含一段Jade, 或者别的存放在单个文件中的东西比如css, html。 非常常见的例子是包含头部和页脚。 假设我们有一个下面目录结构的文件夹: - - ./layout.jade - ./includes/ - ./head.jade - ./tail.jade - -下面是 _layout.jade_ 的内容: - - html - include includes/head - body - h1 My Site - p Welcome to my super amazing site. - include includes/foot - -这两个包含 _includes/head_ 和 _includes/foot_ 都会读取相对于给 _layout.jade_ 参数`filename` 的路径的文件, 这是一个绝对路径,不用担心Express帮你搞定这些了。Include 会解析这些文件,并且插入到已经生成的语法树中,然后渲染为你期待的内容: - -```html - - - My Site - - - -

    My Site

    -

    Welcome to my super lame site.

    - - - -``` - - 前面已经提到,`include` 可以包含比如html或者css这样的内容。给定一个扩展名后,Jade不会把这个文件当作一个Jade源代码,并且会把它当作一个普通文本包含进来: - -``` -html - body - include content.html -``` - - Include 也可以接受块内容,给定的块将会附加到包含文件 _最后_ 的块里。 举个例子,`head.jade` 包含下面的内容: - - - ``` -head - script(src='/jquery.js') -``` - - 我们可以像下面给`include head`添加内容, 这里是添加两个脚本. - -``` -html - include head - script(src='/foo.js') - script(src='/bar.js') - body - h1 test -``` - - -## Mixins - - Mixins在编译的模板里会被Jade转换为普通的JavaScript函数。 Mixins 可以还参数,但不是必需的: - - mixin list - ul - li foo - li bar - li baz - - 使用不带参数的mixin看上去非常简单,在一个块外: - - h2 Groceries - mixin list - - Mixins 也可以带一个或者多个参数,参数就是普通的javascripts表达式,比如下面的例子: - - mixin pets(pets) - ul.pets - - each pet in pets - li= pet - - mixin profile(user) - .user - h2= user.name - mixin pets(user.pets) - - 会输出像下面的html: - -```html -
    -

    tj

    -
      -
    • tobi
    • -
    • loki
    • -
    • jane
    • -
    • manny
    • -
    -
    -``` - -## 产生输出 - - 假设我们有下面的Jade源码: - -``` -- var title = 'yay' -h1.title #{title} -p Just an example -``` - - 当 `compileDebug` 选项不是`false`, Jade 会编译时会把函数里加上 `__.lineno = n;`, 这个参数会在编译出错时传递给`rethrow()`, 而这个函数会在Jade初始输出时给出一个有用的错误信息。 - -```js -function anonymous(locals) { - var __ = { lineno: 1, input: "- var title = 'yay'\nh1.title #{title}\np Just an example", filename: "testing/test.js" }; - var rethrow = jade.rethrow; - try { - var attrs = jade.attrs, escape = jade.escape; - var buf = []; - with (locals || {}) { - var interp; - __.lineno = 1; - var title = 'yay' - __.lineno = 2; - buf.push(''); - buf.push('' + escape((interp = title) == null ? '' : interp) + ''); - buf.push(''); - __.lineno = 3; - buf.push('

    '); - buf.push('Just an example'); - buf.push('

    '); - } - return buf.join(""); - } catch (err) { - rethrow(err, __.input, __.filename, __.lineno); - } -} -``` - -当`compileDebug` 参数是`false`, 这个参数会被去掉,这样对于轻量级的浏览器端模板是非常有用的。结合Jade的参数和当前源码库里的 `./runtime.js` 文件,你可以通过toString()来编译模板而不需要在浏览器端运行整个Jade库,这样可以提高性能,也可以减少载入的JavaScript数量。 - -```js -function anonymous(locals) { - var attrs = jade.attrs, escape = jade.escape; - var buf = []; - with (locals || {}) { - var interp; - var title = 'yay' - buf.push(''); - buf.push('' + escape((interp = title) == null ? '' : interp) + ''); - buf.push(''); - buf.push('

    '); - buf.push('Just an example'); - buf.push('

    '); - } - return buf.join(""); -} -``` - -## Makefile的一个例子 - - 通过执行`make`, 下面的Makefile例子可以把 _pages/*.jade_ 编译为 _pages/*.html_ 。 - -```make -JADE = $(shell find pages/*.jade) -HTML = $(JADE:.jade=.html) - -all: $(HTML) - -%.html: %.jade - jade < $< --path $< > $@ - -clean: - rm -f $(HTML) - -.PHONY: clean -``` - -这个可以和`watch(1)` 命令起来产生像下面的行为: - - $ watch make - -## 命令行的jade(1) - -``` - -使用: jade [options] [dir|file ...] - -选项: - - -h, --help 输出帮助信息 - -v, --version 输出版本号 - -o, --obj javascript选项 - -O, --out 输出编译后的html到 - -p, --path 在处理stdio时,查找包含文件时的查找路径 - -Examples: - - # 编译整个目录 - $ jade templates - - # 生成 {foo,bar}.html - $ jade {foo,bar}.jade - - # 在标准IO下使用jade - $ jade < my.jade > my.html - - # 在标准IO下使用jade, 同时指定用于查找包含的文件 - $ jade < my.jade -p my.jade > my.html - - # 在标准IO下使用jade - $ echo "h1 Jade!" | jade - - # foo, bar 目录渲染到 /tmp - $ jade foo bar --out /tmp - -``` - -## License - -(The MIT License) - -Copyright (c) 2009-2010 TJ Holowaychuk <tj@vision-media.ca> - -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/node_modules/jade/bin/jade b/node_modules/jade/bin/jade deleted file mode 100755 index 8f1c816..0000000 --- a/node_modules/jade/bin/jade +++ /dev/null @@ -1,168 +0,0 @@ -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var fs = require('fs') - , program = require('commander') - , path = require('path') - , basename = path.basename - , dirname = path.dirname - , resolve = path.resolve - , exists = fs.existsSync || path.existsSync - , join = path.join - , mkdirp = require('mkdirp') - , jade = require('../'); - -// jade options - -var options = {}; - -// options - -program - .version(jade.version) - .usage('[options] [dir|file ...]') - .option('-o, --obj ', 'javascript options object') - .option('-O, --out ', 'output the compiled html to ') - .option('-p, --path ', 'filename used to resolve includes') - .option('-P, --pretty', 'compile pretty html output') - .option('-c, --client', 'compile function for client-side runtime.js') - .option('-D, --no-debug', 'compile without debugging (smaller functions)') - .option('-w, --watch', 'watch files for changes and automatically re-render') - -program.on('--help', function(){ - console.log(' Examples:'); - console.log(''); - console.log(' # translate jade the templates dir'); - console.log(' $ jade templates'); - console.log(''); - console.log(' # create {foo,bar}.html'); - console.log(' $ jade {foo,bar}.jade'); - console.log(''); - console.log(' # jade over stdio'); - console.log(' $ jade < my.jade > my.html'); - console.log(''); - console.log(' # jade over stdio'); - console.log(' $ echo "h1 Jade!" | jade'); - console.log(''); - console.log(' # foo, bar dirs rendering to /tmp'); - console.log(' $ jade foo bar --out /tmp '); - console.log(''); -}); - -program.parse(process.argv); - -// options given, parse them - -if (program.obj) { - if (exists(program.obj)) { - options = JSON.parse(fs.readFileSync(program.obj)); - } else { - options = eval('(' + program.obj + ')'); - } -} - -// --filename - -if (program.path) options.filename = program.path; - -// --no-debug - -options.compileDebug = program.debug; - -// --client - -options.client = program.client; - -// --pretty - -options.pretty = program.pretty; - -// --watch - -options.watch = program.watch; - -// left-over args are file paths - -var files = program.args; - -// compile files - -if (files.length) { - console.log(); - files.forEach(renderFile); - if (options.watch) { - files.forEach(function (file) { - fs.watchFile(file, {interval: 100}, function (curr, prev) { - if (curr.mtime > prev.mtime) renderFile(file); - }); - }); - } - process.on('exit', function () { - console.log(); - }); -// stdio -} else { - stdin(); -} - -/** - * Compile from stdin. - */ - -function stdin() { - var buf = ''; - process.stdin.setEncoding('utf8'); - process.stdin.on('data', function(chunk){ buf += chunk; }); - process.stdin.on('end', function(){ - var fn = jade.compile(buf, options); - var output = options.client - ? fn.toString() - : fn(options); - process.stdout.write(output); - }).resume(); -} - -/** - * Process the given path, compiling the jade files found. - * Always walk the subdirectories. - */ - -function renderFile(path) { - var re = /\.jade$/; - fs.lstat(path, function(err, stat) { - if (err) throw err; - // Found jade file - if (stat.isFile() && re.test(path)) { - fs.readFile(path, 'utf8', function(err, str){ - if (err) throw err; - options.filename = path; - var fn = jade.compile(str, options); - var extname = options.client ? '.js' : '.html'; - path = path.replace(re, extname); - if (program.out) path = join(program.out, basename(path)); - var dir = resolve(dirname(path)); - mkdirp(dir, 0755, function(err){ - if (err) throw err; - var output = options.client - ? fn.toString() - : fn(options); - fs.writeFile(path, output, function(err){ - if (err) throw err; - console.log(' \033[90mrendered \033[36m%s\033[0m', path); - }); - }); - }); - // Found directory - } else if (stat.isDirectory()) { - fs.readdir(path, function(err, files) { - if (err) throw err; - files.map(function(filename) { - return path + '/' + filename; - }).forEach(renderFile); - }); - } - }); -} diff --git a/node_modules/jade/index.js b/node_modules/jade/index.js deleted file mode 100644 index 8ad059f..0000000 --- a/node_modules/jade/index.js +++ /dev/null @@ -1,4 +0,0 @@ - -module.exports = process.env.JADE_COV - ? require('./lib-cov/jade') - : require('./lib/jade'); \ No newline at end of file diff --git a/node_modules/jade/jade.js b/node_modules/jade/jade.js deleted file mode 100644 index ad22ec3..0000000 --- a/node_modules/jade/jade.js +++ /dev/null @@ -1,3654 +0,0 @@ -(function() { - -// CommonJS require() - -function require(p){ - var path = require.resolve(p) - , mod = require.modules[path]; - if (!mod) throw new Error('failed to require "' + p + '"'); - if (!mod.exports) { - mod.exports = {}; - mod.call(mod.exports, mod, mod.exports, require.relative(path)); - } - return mod.exports; - } - -require.modules = {}; - -require.resolve = function (path){ - var orig = path - , reg = path + '.js' - , index = path + '/index.js'; - return require.modules[reg] && reg - || require.modules[index] && index - || orig; - }; - -require.register = function (path, fn){ - require.modules[path] = fn; - }; - -require.relative = function (parent) { - return function(p){ - if ('.' != p.charAt(0)) return require(p); - - var path = parent.split('/') - , segs = p.split('/'); - path.pop(); - - for (var i = 0; i < segs.length; i++) { - var seg = segs[i]; - if ('..' == seg) path.pop(); - else if ('.' != seg) path.push(seg); - } - - return require(path.join('/')); - }; - }; - - -require.register("compiler.js", function(module, exports, require){ - -/*! - * Jade - Compiler - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var nodes = require('./nodes') - , filters = require('./filters') - , doctypes = require('./doctypes') - , selfClosing = require('./self-closing') - , runtime = require('./runtime') - , utils = require('./utils'); - - - if (!Object.keys) { - Object.keys = function(obj){ - var arr = []; - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - arr.push(key); - } - } - return arr; - } - } - - if (!String.prototype.trimLeft) { - String.prototype.trimLeft = function(){ - return this.replace(/^\s+/, ''); - } - } - - - -/** - * Initialize `Compiler` with the given `node`. - * - * @param {Node} node - * @param {Object} options - * @api public - */ - -var Compiler = module.exports = function Compiler(node, options) { - this.options = options = options || {}; - this.node = node; - this.hasCompiledDoctype = false; - this.hasCompiledTag = false; - this.pp = options.pretty || false; - this.debug = false !== options.compileDebug; - this.indents = 0; - this.parentIndents = 0; - if (options.doctype) this.setDoctype(options.doctype); -}; - -/** - * Compiler prototype. - */ - -Compiler.prototype = { - - /** - * Compile parse tree to JavaScript. - * - * @api public - */ - - compile: function(){ - this.buf = ['var interp;']; - if (this.pp) this.buf.push("var __indent = [];"); - this.lastBufferedIdx = -1; - this.visit(this.node); - return this.buf.join('\n'); - }, - - /** - * Sets the default doctype `name`. Sets terse mode to `true` when - * html 5 is used, causing self-closing tags to end with ">" vs "/>", - * and boolean attributes are not mirrored. - * - * @param {string} name - * @api public - */ - - setDoctype: function(name){ - name = (name && name.toLowerCase()) || 'default'; - this.doctype = doctypes[name] || ''; - this.terse = this.doctype.toLowerCase() == ''; - this.xml = 0 == this.doctype.indexOf(' 1 && !escape && block.nodes[0].isText && block.nodes[1].isText) - this.prettyIndent(1, true); - - for (var i = 0; i < len; ++i) { - // Pretty print text - if (pp && i > 0 && !escape && block.nodes[i].isText && block.nodes[i-1].isText) - this.prettyIndent(1, false); - - this.visit(block.nodes[i]); - // Multiple text nodes are separated by newlines - if (block.nodes[i+1] && block.nodes[i].isText && block.nodes[i+1].isText) - this.buffer('\\n'); - } - }, - - /** - * Visit `doctype`. Sets terse mode to `true` when html 5 - * is used, causing self-closing tags to end with ">" vs "/>", - * and boolean attributes are not mirrored. - * - * @param {Doctype} doctype - * @api public - */ - - visitDoctype: function(doctype){ - if (doctype && (doctype.val || !this.doctype)) { - this.setDoctype(doctype.val || 'default'); - } - - if (this.doctype) this.buffer(this.doctype); - this.hasCompiledDoctype = true; - }, - - /** - * Visit `mixin`, generating a function that - * may be called within the template. - * - * @param {Mixin} mixin - * @api public - */ - - visitMixin: function(mixin){ - var name = mixin.name.replace(/-/g, '_') + '_mixin' - , args = mixin.args || '' - , block = mixin.block - , attrs = mixin.attrs - , pp = this.pp; - - if (mixin.call) { - if (pp) this.buf.push("__indent.push('" + Array(this.indents + 1).join(' ') + "');") - if (block || attrs.length) { - - this.buf.push(name + '.call({'); - - if (block) { - this.buf.push('block: function(){'); - - // Render block with no indents, dynamically added when rendered - this.parentIndents++; - var _indents = this.indents; - this.indents = 0; - this.visit(mixin.block); - this.indents = _indents; - this.parentIndents--; - - if (attrs.length) { - this.buf.push('},'); - } else { - this.buf.push('}'); - } - } - - if (attrs.length) { - var val = this.attrs(attrs); - if (val.inherits) { - this.buf.push('attributes: merge({' + val.buf - + '}, attributes), escaped: merge(' + val.escaped + ', escaped, true)'); - } else { - this.buf.push('attributes: {' + val.buf + '}, escaped: ' + val.escaped); - } - } - - if (args) { - this.buf.push('}, ' + args + ');'); - } else { - this.buf.push('});'); - } - - } else { - this.buf.push(name + '(' + args + ');'); - } - if (pp) this.buf.push("__indent.pop();") - } else { - this.buf.push('var ' + name + ' = function(' + args + '){'); - this.buf.push('var block = this.block, attributes = this.attributes || {}, escaped = this.escaped || {};'); - this.parentIndents++; - this.visit(block); - this.parentIndents--; - this.buf.push('};'); - } - }, - - /** - * Visit `tag` buffering tag markup, generating - * attributes, visiting the `tag`'s code and block. - * - * @param {Tag} tag - * @api public - */ - - visitTag: function(tag){ - this.indents++; - var name = tag.name - , pp = this.pp; - - if (tag.buffer) name = "' + (" + name + ") + '"; - - if (!this.hasCompiledTag) { - if (!this.hasCompiledDoctype && 'html' == name) { - this.visitDoctype(); - } - this.hasCompiledTag = true; - } - - // pretty print - if (pp && !tag.isInline()) - this.prettyIndent(0, true); - - if ((~selfClosing.indexOf(name) || tag.selfClosing) && !this.xml) { - this.buffer('<' + name); - this.visitAttributes(tag.attrs); - this.terse - ? this.buffer('>') - : this.buffer('/>'); - } else { - // Optimize attributes buffering - if (tag.attrs.length) { - this.buffer('<' + name); - if (tag.attrs.length) this.visitAttributes(tag.attrs); - this.buffer('>'); - } else { - this.buffer('<' + name + '>'); - } - if (tag.code) this.visitCode(tag.code); - this.escape = 'pre' == tag.name; - this.visit(tag.block); - - // pretty print - if (pp && !tag.isInline() && 'pre' != tag.name && !tag.canInline()) - this.prettyIndent(0, true); - - this.buffer(''); - } - this.indents--; - }, - - /** - * Visit `filter`, throwing when the filter does not exist. - * - * @param {Filter} filter - * @api public - */ - - visitFilter: function(filter){ - var fn = filters[filter.name]; - - // unknown filter - if (!fn) { - if (filter.isASTFilter) { - throw new Error('unknown ast filter "' + filter.name + ':"'); - } else { - throw new Error('unknown filter ":' + filter.name + '"'); - } - } - - if (filter.isASTFilter) { - this.buf.push(fn(filter.block, this, filter.attrs)); - } else { - var text = filter.block.nodes.map(function(node){ return node.val }).join('\n'); - filter.attrs = filter.attrs || {}; - filter.attrs.filename = this.options.filename; - this.buffer(utils.text(fn(text, filter.attrs))); - } - }, - - /** - * Visit `text` node. - * - * @param {Text} text - * @api public - */ - - visitText: function(text){ - text = utils.text(text.val.replace(/\\/g, '_SLASH_')); - if (this.escape) text = escape(text); - text = text.replace(/_SLASH_/g, '\\\\'); - this.buffer(text); - }, - - /** - * Visit a `comment`, only buffering when the buffer flag is set. - * - * @param {Comment} comment - * @api public - */ - - visitComment: function(comment){ - if (!comment.buffer) return; - if (this.pp) this.prettyIndent(1, true); - this.buffer(''); - }, - - /** - * Visit a `BlockComment`. - * - * @param {Comment} comment - * @api public - */ - - visitBlockComment: function(comment){ - if (!comment.buffer) return; - if (0 == comment.val.trim().indexOf('if')) { - this.buffer(''); - } else { - this.buffer(''); - } - }, - - /** - * Visit `code`, respecting buffer / escape flags. - * If the code is followed by a block, wrap it in - * a self-calling function. - * - * @param {Code} code - * @api public - */ - - visitCode: function(code){ - // Wrap code blocks with {}. - // we only wrap unbuffered code blocks ATM - // since they are usually flow control - - // Buffer code - if (code.buffer) { - var val = code.val.trimLeft(); - this.buf.push('var __val__ = ' + val); - val = 'null == __val__ ? "" : __val__'; - if (code.escape) val = 'escape(' + val + ')'; - this.buf.push("buf.push(" + val + ");"); - } else { - this.buf.push(code.val); - } - - // Block support - if (code.block) { - if (!code.buffer) this.buf.push('{'); - this.visit(code.block); - if (!code.buffer) this.buf.push('}'); - } - }, - - /** - * Visit `each` block. - * - * @param {Each} each - * @api public - */ - - visitEach: function(each){ - this.buf.push('' - + '// iterate ' + each.obj + '\n' - + ';(function(){\n' - + ' if (\'number\' == typeof ' + each.obj + '.length) {\n'); - - if (each.alternative) { - this.buf.push(' if (' + each.obj + '.length) {'); - } - - this.buf.push('' - + ' for (var ' + each.key + ' = 0, $$l = ' + each.obj + '.length; ' + each.key + ' < $$l; ' + each.key + '++) {\n' - + ' var ' + each.val + ' = ' + each.obj + '[' + each.key + '];\n'); - - this.visit(each.block); - - this.buf.push(' }\n'); - - if (each.alternative) { - this.buf.push(' } else {'); - this.visit(each.alternative); - this.buf.push(' }'); - } - - this.buf.push('' - + ' } else {\n' - + ' var $$l = 0;\n' - + ' for (var ' + each.key + ' in ' + each.obj + ') {\n' - + ' $$l++;' - + ' if (' + each.obj + '.hasOwnProperty(' + each.key + ')){' - + ' var ' + each.val + ' = ' + each.obj + '[' + each.key + '];\n'); - - this.visit(each.block); - - this.buf.push(' }\n'); - - this.buf.push(' }\n'); - if (each.alternative) { - this.buf.push(' if ($$l === 0) {'); - this.visit(each.alternative); - this.buf.push(' }'); - } - this.buf.push(' }\n}).call(this);\n'); - }, - - /** - * Visit `attrs`. - * - * @param {Array} attrs - * @api public - */ - - visitAttributes: function(attrs){ - var val = this.attrs(attrs); - if (val.inherits) { - this.buf.push("buf.push(attrs(merge({ " + val.buf + - " }, attributes), merge(" + val.escaped + ", escaped, true)));"); - } else if (val.constant) { - eval('var buf={' + val.buf + '};'); - this.buffer(runtime.attrs(buf, JSON.parse(val.escaped)), true); - } else { - this.buf.push("buf.push(attrs({ " + val.buf + " }, " + val.escaped + "));"); - } - }, - - /** - * Compile attributes. - */ - - attrs: function(attrs){ - var buf = [] - , classes = [] - , escaped = {} - , constant = attrs.every(function(attr){ return isConstant(attr.val) }) - , inherits = false; - - if (this.terse) buf.push('terse: true'); - - attrs.forEach(function(attr){ - if (attr.name == 'attributes') return inherits = true; - escaped[attr.name] = attr.escaped; - if (attr.name == 'class') { - classes.push('(' + attr.val + ')'); - } else { - var pair = "'" + attr.name + "':(" + attr.val + ')'; - buf.push(pair); - } - }); - - if (classes.length) { - classes = classes.join(" + ' ' + "); - buf.push("class: " + classes); - } - - return { - buf: buf.join(', ').replace('class:', '"class":'), - escaped: JSON.stringify(escaped), - inherits: inherits, - constant: constant - }; - } -}; - -/** - * Check if expression can be evaluated to a constant - * - * @param {String} expression - * @return {Boolean} - * @api private - */ - -function isConstant(val){ - // Check strings/literals - if (/^ *("([^"\\]*(\\.[^"\\]*)*)"|'([^'\\]*(\\.[^'\\]*)*)'|true|false|null|undefined) *$/i.test(val)) - return true; - - // Check numbers - if (!isNaN(Number(val))) - return true; - - // Check arrays - var matches; - if (matches = /^ *\[(.*)\] *$/.exec(val)) - return matches[1].split(',').every(isConstant); - - return false; -} - -/** - * Escape the given string of `html`. - * - * @param {String} html - * @return {String} - * @api private - */ - -function escape(html){ - return String(html) - .replace(/&(?!\w+;)/g, '&') - .replace(//g, '>') - .replace(/"/g, '"'); -} - -}); // module: compiler.js - -require.register("doctypes.js", function(module, exports, require){ - -/*! - * Jade - doctypes - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -module.exports = { - '5': '' - , 'default': '' - , 'xml': '' - , 'transitional': '' - , 'strict': '' - , 'frameset': '' - , '1.1': '' - , 'basic': '' - , 'mobile': '' -}; -}); // module: doctypes.js - -require.register("filters.js", function(module, exports, require){ - -/*! - * Jade - filters - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -module.exports = { - - /** - * Wrap text with CDATA block. - */ - - cdata: function(str){ - return ''; - }, - - /** - * Transform sass to css, wrapped in style tags. - */ - - sass: function(str){ - str = str.replace(/\\n/g, '\n'); - var sass = require('sass').render(str).replace(/\n/g, '\\n'); - return ''; - }, - - /** - * Transform stylus to css, wrapped in style tags. - */ - - stylus: function(str, options){ - var ret; - str = str.replace(/\\n/g, '\n'); - var stylus = require('stylus'); - stylus(str, options).render(function(err, css){ - if (err) throw err; - ret = css.replace(/\n/g, '\\n'); - }); - return ''; - }, - - /** - * Transform less to css, wrapped in style tags. - */ - - less: function(str){ - var ret; - str = str.replace(/\\n/g, '\n'); - require('less').render(str, function(err, css){ - if (err) throw err; - ret = ''; - }); - return ret; - }, - - /** - * Transform markdown to html. - */ - - markdown: function(str){ - var md; - - // support markdown / discount - try { - md = require('markdown'); - } catch (err){ - try { - md = require('discount'); - } catch (err) { - try { - md = require('markdown-js'); - } catch (err) { - try { - md = require('marked'); - } catch (err) { - throw new - Error('Cannot find markdown library, install markdown, discount, or marked.'); - } - } - } - } - - str = str.replace(/\\n/g, '\n'); - return md.parse(str).replace(/\n/g, '\\n').replace(/'/g,'''); - }, - - /** - * Transform coffeescript to javascript. - */ - - coffeescript: function(str){ - var js = require('coffee-script').compile(str).replace(/\\/g, '\\\\').replace(/\n/g, '\\n'); - return ''; - } -}; - -}); // module: filters.js - -require.register("inline-tags.js", function(module, exports, require){ - -/*! - * Jade - inline tags - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -module.exports = [ - 'a' - , 'abbr' - , 'acronym' - , 'b' - , 'br' - , 'code' - , 'em' - , 'font' - , 'i' - , 'img' - , 'ins' - , 'kbd' - , 'map' - , 'samp' - , 'small' - , 'span' - , 'strong' - , 'sub' - , 'sup' -]; -}); // module: inline-tags.js - -require.register("jade.js", function(module, exports, require){ -/*! - * Jade - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Parser = require('./parser') - , Lexer = require('./lexer') - , Compiler = require('./compiler') - , runtime = require('./runtime') - -/** - * Library version. - */ - -exports.version = '0.27.6'; - -/** - * Expose self closing tags. - */ - -exports.selfClosing = require('./self-closing'); - -/** - * Default supported doctypes. - */ - -exports.doctypes = require('./doctypes'); - -/** - * Text filters. - */ - -exports.filters = require('./filters'); - -/** - * Utilities. - */ - -exports.utils = require('./utils'); - -/** - * Expose `Compiler`. - */ - -exports.Compiler = Compiler; - -/** - * Expose `Parser`. - */ - -exports.Parser = Parser; - -/** - * Expose `Lexer`. - */ - -exports.Lexer = Lexer; - -/** - * Nodes. - */ - -exports.nodes = require('./nodes'); - -/** - * Jade runtime helpers. - */ - -exports.runtime = runtime; - -/** - * Template function cache. - */ - -exports.cache = {}; - -/** - * Parse the given `str` of jade and return a function body. - * - * @param {String} str - * @param {Object} options - * @return {String} - * @api private - */ - -function parse(str, options){ - try { - // Parse - var parser = new Parser(str, options.filename, options); - - // Compile - var compiler = new (options.compiler || Compiler)(parser.parse(), options) - , js = compiler.compile(); - - // Debug compiler - if (options.debug) { - console.error('\nCompiled Function:\n\n\033[90m%s\033[0m', js.replace(/^/gm, ' ')); - } - - return '' - + 'var buf = [];\n' - + (options.self - ? 'var self = locals || {};\n' + js - : 'with (locals || {}) {\n' + js + '\n}\n') - + 'return buf.join("");'; - } catch (err) { - parser = parser.context(); - runtime.rethrow(err, parser.filename, parser.lexer.lineno); - } -} - -/** - * Strip any UTF-8 BOM off of the start of `str`, if it exists. - * - * @param {String} str - * @return {String} - * @api private - */ - -function stripBOM(str){ - return 0xFEFF == str.charCodeAt(0) - ? str.substring(1) - : str; -} - -/** - * Compile a `Function` representation of the given jade `str`. - * - * Options: - * - * - `compileDebug` when `false` debugging code is stripped from the compiled template - * - `client` when `true` the helper functions `escape()` etc will reference `jade.escape()` - * for use with the Jade client-side runtime.js - * - * @param {String} str - * @param {Options} options - * @return {Function} - * @api public - */ - -exports.compile = function(str, options){ - var options = options || {} - , client = options.client - , filename = options.filename - ? JSON.stringify(options.filename) - : 'undefined' - , fn; - - str = stripBOM(String(str)); - - if (options.compileDebug !== false) { - fn = [ - 'var __jade = [{ lineno: 1, filename: ' + filename + ' }];' - , 'try {' - , parse(str, options) - , '} catch (err) {' - , ' rethrow(err, __jade[0].filename, __jade[0].lineno);' - , '}' - ].join('\n'); - } else { - fn = parse(str, options); - } - - if (client) { - fn = 'attrs = attrs || jade.attrs; escape = escape || jade.escape; rethrow = rethrow || jade.rethrow; merge = merge || jade.merge;\n' + fn; - } - - fn = new Function('locals, attrs, escape, rethrow, merge', fn); - - if (client) return fn; - - return function(locals){ - return fn(locals, runtime.attrs, runtime.escape, runtime.rethrow, runtime.merge); - }; -}; - -/** - * Render the given `str` of jade and invoke - * the callback `fn(err, str)`. - * - * Options: - * - * - `cache` enable template caching - * - `filename` filename required for `include` / `extends` and caching - * - * @param {String} str - * @param {Object|Function} options or fn - * @param {Function} fn - * @api public - */ - -exports.render = function(str, options, fn){ - // swap args - if ('function' == typeof options) { - fn = options, options = {}; - } - - // cache requires .filename - if (options.cache && !options.filename) { - return fn(new Error('the "filename" option is required for caching')); - } - - try { - var path = options.filename; - var tmpl = options.cache - ? exports.cache[path] || (exports.cache[path] = exports.compile(str, options)) - : exports.compile(str, options); - fn(null, tmpl(options)); - } catch (err) { - fn(err); - } -}; - -/** - * Render a Jade file at the given `path` and callback `fn(err, str)`. - * - * @param {String} path - * @param {Object|Function} options or callback - * @param {Function} fn - * @api public - */ - -exports.renderFile = function(path, options, fn){ - var key = path + ':string'; - - if ('function' == typeof options) { - fn = options, options = {}; - } - - try { - options.filename = path; - var str = options.cache - ? exports.cache[key] || (exports.cache[key] = fs.readFileSync(path, 'utf8')) - : fs.readFileSync(path, 'utf8'); - exports.render(str, options, fn); - } catch (err) { - fn(err); - } -}; - -/** - * Express support. - */ - -exports.__express = exports.renderFile; - -}); // module: jade.js - -require.register("lexer.js", function(module, exports, require){ -/*! - * Jade - Lexer - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -var utils = require('./utils'); - -/** - * Initialize `Lexer` with the given `str`. - * - * Options: - * - * - `colons` allow colons for attr delimiters - * - * @param {String} str - * @param {Object} options - * @api private - */ - -var Lexer = module.exports = function Lexer(str, options) { - options = options || {}; - this.input = str.replace(/\r\n|\r/g, '\n'); - this.colons = options.colons; - this.deferredTokens = []; - this.lastIndents = 0; - this.lineno = 1; - this.stash = []; - this.indentStack = []; - this.indentRe = null; - this.pipeless = false; -}; - -/** - * Lexer prototype. - */ - -Lexer.prototype = { - - /** - * Construct a token with the given `type` and `val`. - * - * @param {String} type - * @param {String} val - * @return {Object} - * @api private - */ - - tok: function(type, val){ - return { - type: type - , line: this.lineno - , val: val - } - }, - - /** - * Consume the given `len` of input. - * - * @param {Number} len - * @api private - */ - - consume: function(len){ - this.input = this.input.substr(len); - }, - - /** - * Scan for `type` with the given `regexp`. - * - * @param {String} type - * @param {RegExp} regexp - * @return {Object} - * @api private - */ - - scan: function(regexp, type){ - var captures; - if (captures = regexp.exec(this.input)) { - this.consume(captures[0].length); - return this.tok(type, captures[1]); - } - }, - - /** - * Defer the given `tok`. - * - * @param {Object} tok - * @api private - */ - - defer: function(tok){ - this.deferredTokens.push(tok); - }, - - /** - * Lookahead `n` tokens. - * - * @param {Number} n - * @return {Object} - * @api private - */ - - lookahead: function(n){ - var fetch = n - this.stash.length; - while (fetch-- > 0) this.stash.push(this.next()); - return this.stash[--n]; - }, - - /** - * Return the indexOf `start` / `end` delimiters. - * - * @param {String} start - * @param {String} end - * @return {Number} - * @api private - */ - - indexOfDelimiters: function(start, end){ - var str = this.input - , nstart = 0 - , nend = 0 - , pos = 0; - for (var i = 0, len = str.length; i < len; ++i) { - if (start == str.charAt(i)) { - ++nstart; - } else if (end == str.charAt(i)) { - if (++nend == nstart) { - pos = i; - break; - } - } - } - return pos; - }, - - /** - * Stashed token. - */ - - stashed: function() { - return this.stash.length - && this.stash.shift(); - }, - - /** - * Deferred token. - */ - - deferred: function() { - return this.deferredTokens.length - && this.deferredTokens.shift(); - }, - - /** - * end-of-source. - */ - - eos: function() { - if (this.input.length) return; - if (this.indentStack.length) { - this.indentStack.shift(); - return this.tok('outdent'); - } else { - return this.tok('eos'); - } - }, - - /** - * Blank line. - */ - - blank: function() { - var captures; - if (captures = /^\n *\n/.exec(this.input)) { - this.consume(captures[0].length - 1); - - ++this.lineno; - if (this.pipeless) return this.tok('text', ''); - return this.next(); - } - }, - - /** - * Comment. - */ - - comment: function() { - var captures; - if (captures = /^ *\/\/(-)?([^\n]*)/.exec(this.input)) { - this.consume(captures[0].length); - var tok = this.tok('comment', captures[2]); - tok.buffer = '-' != captures[1]; - return tok; - } - }, - - /** - * Interpolated tag. - */ - - interpolation: function() { - var captures; - if (captures = /^#\{(.*?)\}/.exec(this.input)) { - this.consume(captures[0].length); - return this.tok('interpolation', captures[1]); - } - }, - - /** - * Tag. - */ - - tag: function() { - var captures; - if (captures = /^(\w[-:\w]*)(\/?)/.exec(this.input)) { - this.consume(captures[0].length); - var tok, name = captures[1]; - if (':' == name[name.length - 1]) { - name = name.slice(0, -1); - tok = this.tok('tag', name); - this.defer(this.tok(':')); - while (' ' == this.input[0]) this.input = this.input.substr(1); - } else { - tok = this.tok('tag', name); - } - tok.selfClosing = !! captures[2]; - return tok; - } - }, - - /** - * Filter. - */ - - filter: function() { - return this.scan(/^:(\w+)/, 'filter'); - }, - - /** - * Doctype. - */ - - doctype: function() { - return this.scan(/^(?:!!!|doctype) *([^\n]+)?/, 'doctype'); - }, - - /** - * Id. - */ - - id: function() { - return this.scan(/^#([\w-]+)/, 'id'); - }, - - /** - * Class. - */ - - className: function() { - return this.scan(/^\.([\w-]+)/, 'class'); - }, - - /** - * Text. - */ - - text: function() { - return this.scan(/^(?:\| ?| ?)?([^\n]+)/, 'text'); - }, - - /** - * Extends. - */ - - "extends": function() { - return this.scan(/^extends? +([^\n]+)/, 'extends'); - }, - - /** - * Block prepend. - */ - - prepend: function() { - var captures; - if (captures = /^prepend +([^\n]+)/.exec(this.input)) { - this.consume(captures[0].length); - var mode = 'prepend' - , name = captures[1] - , tok = this.tok('block', name); - tok.mode = mode; - return tok; - } - }, - - /** - * Block append. - */ - - append: function() { - var captures; - if (captures = /^append +([^\n]+)/.exec(this.input)) { - this.consume(captures[0].length); - var mode = 'append' - , name = captures[1] - , tok = this.tok('block', name); - tok.mode = mode; - return tok; - } - }, - - /** - * Block. - */ - - block: function() { - var captures; - if (captures = /^block\b *(?:(prepend|append) +)?([^\n]*)/.exec(this.input)) { - this.consume(captures[0].length); - var mode = captures[1] || 'replace' - , name = captures[2] - , tok = this.tok('block', name); - - tok.mode = mode; - return tok; - } - }, - - /** - * Yield. - */ - - yield: function() { - return this.scan(/^yield */, 'yield'); - }, - - /** - * Include. - */ - - include: function() { - return this.scan(/^include +([^\n]+)/, 'include'); - }, - - /** - * Case. - */ - - "case": function() { - return this.scan(/^case +([^\n]+)/, 'case'); - }, - - /** - * When. - */ - - when: function() { - return this.scan(/^when +([^:\n]+)/, 'when'); - }, - - /** - * Default. - */ - - "default": function() { - return this.scan(/^default */, 'default'); - }, - - /** - * Assignment. - */ - - assignment: function() { - var captures; - if (captures = /^(\w+) += *([^;\n]+)( *;? *)/.exec(this.input)) { - this.consume(captures[0].length); - var name = captures[1] - , val = captures[2]; - return this.tok('code', 'var ' + name + ' = (' + val + ');'); - } - }, - - /** - * Call mixin. - */ - - call: function(){ - var captures; - if (captures = /^\+([-\w]+)/.exec(this.input)) { - this.consume(captures[0].length); - var tok = this.tok('call', captures[1]); - - // Check for args (not attributes) - if (captures = /^ *\((.*?)\)/.exec(this.input)) { - if (!/^ *[-\w]+ *=/.test(captures[1])) { - this.consume(captures[0].length); - tok.args = captures[1]; - } - } - - return tok; - } - }, - - /** - * Mixin. - */ - - mixin: function(){ - var captures; - if (captures = /^mixin +([-\w]+)(?: *\((.*)\))?/.exec(this.input)) { - this.consume(captures[0].length); - var tok = this.tok('mixin', captures[1]); - tok.args = captures[2]; - return tok; - } - }, - - /** - * Conditional. - */ - - conditional: function() { - var captures; - if (captures = /^(if|unless|else if|else)\b([^\n]*)/.exec(this.input)) { - this.consume(captures[0].length); - var type = captures[1] - , js = captures[2]; - - switch (type) { - case 'if': js = 'if (' + js + ')'; break; - case 'unless': js = 'if (!(' + js + '))'; break; - case 'else if': js = 'else if (' + js + ')'; break; - case 'else': js = 'else'; break; - } - - return this.tok('code', js); - } - }, - - /** - * While. - */ - - "while": function() { - var captures; - if (captures = /^while +([^\n]+)/.exec(this.input)) { - this.consume(captures[0].length); - return this.tok('code', 'while (' + captures[1] + ')'); - } - }, - - /** - * Each. - */ - - each: function() { - var captures; - if (captures = /^(?:- *)?(?:each|for) +(\w+)(?: *, *(\w+))? * in *([^\n]+)/.exec(this.input)) { - this.consume(captures[0].length); - var tok = this.tok('each', captures[1]); - tok.key = captures[2] || '$index'; - tok.code = captures[3]; - return tok; - } - }, - - /** - * Code. - */ - - code: function() { - var captures; - if (captures = /^(!?=|-)([^\n]+)/.exec(this.input)) { - this.consume(captures[0].length); - var flags = captures[1]; - captures[1] = captures[2]; - var tok = this.tok('code', captures[1]); - tok.escape = flags.charAt(0) === '='; - tok.buffer = flags.charAt(0) === '=' || flags.charAt(1) === '='; - return tok; - } - }, - - /** - * Attributes. - */ - - attrs: function() { - if ('(' == this.input.charAt(0)) { - var index = this.indexOfDelimiters('(', ')') - , str = this.input.substr(1, index-1) - , tok = this.tok('attrs') - , len = str.length - , colons = this.colons - , states = ['key'] - , escapedAttr - , key = '' - , val = '' - , quote - , c - , p; - - function state(){ - return states[states.length - 1]; - } - - function interpolate(attr) { - return attr.replace(/(\\)?#\{([^}]+)\}/g, function(_, escape, expr){ - return escape - ? _ - : quote + " + (" + expr + ") + " + quote; - }); - } - - this.consume(index + 1); - tok.attrs = {}; - tok.escaped = {}; - - function parse(c) { - var real = c; - // TODO: remove when people fix ":" - if (colons && ':' == c) c = '='; - switch (c) { - case ',': - case '\n': - switch (state()) { - case 'expr': - case 'array': - case 'string': - case 'object': - val += c; - break; - default: - states.push('key'); - val = val.trim(); - key = key.trim(); - if ('' == key) return; - key = key.replace(/^['"]|['"]$/g, '').replace('!', ''); - tok.escaped[key] = escapedAttr; - tok.attrs[key] = '' == val - ? true - : interpolate(val); - key = val = ''; - } - break; - case '=': - switch (state()) { - case 'key char': - key += real; - break; - case 'val': - case 'expr': - case 'array': - case 'string': - case 'object': - val += real; - break; - default: - escapedAttr = '!' != p; - states.push('val'); - } - break; - case '(': - if ('val' == state() - || 'expr' == state()) states.push('expr'); - val += c; - break; - case ')': - if ('expr' == state() - || 'val' == state()) states.pop(); - val += c; - break; - case '{': - if ('val' == state()) states.push('object'); - val += c; - break; - case '}': - if ('object' == state()) states.pop(); - val += c; - break; - case '[': - if ('val' == state()) states.push('array'); - val += c; - break; - case ']': - if ('array' == state()) states.pop(); - val += c; - break; - case '"': - case "'": - switch (state()) { - case 'key': - states.push('key char'); - break; - case 'key char': - states.pop(); - break; - case 'string': - if (c == quote) states.pop(); - val += c; - break; - default: - states.push('string'); - val += c; - quote = c; - } - break; - case '': - break; - default: - switch (state()) { - case 'key': - case 'key char': - key += c; - break; - default: - val += c; - } - } - p = c; - } - - for (var i = 0; i < len; ++i) { - parse(str.charAt(i)); - } - - parse(','); - - if ('/' == this.input.charAt(0)) { - this.consume(1); - tok.selfClosing = true; - } - - return tok; - } - }, - - /** - * Indent | Outdent | Newline. - */ - - indent: function() { - var captures, re; - - // established regexp - if (this.indentRe) { - captures = this.indentRe.exec(this.input); - // determine regexp - } else { - // tabs - re = /^\n(\t*) */; - captures = re.exec(this.input); - - // spaces - if (captures && !captures[1].length) { - re = /^\n( *)/; - captures = re.exec(this.input); - } - - // established - if (captures && captures[1].length) this.indentRe = re; - } - - if (captures) { - var tok - , indents = captures[1].length; - - ++this.lineno; - this.consume(indents + 1); - - if (' ' == this.input[0] || '\t' == this.input[0]) { - throw new Error('Invalid indentation, you can use tabs or spaces but not both'); - } - - // blank line - if ('\n' == this.input[0]) return this.tok('newline'); - - // outdent - if (this.indentStack.length && indents < this.indentStack[0]) { - while (this.indentStack.length && this.indentStack[0] > indents) { - this.stash.push(this.tok('outdent')); - this.indentStack.shift(); - } - tok = this.stash.pop(); - // indent - } else if (indents && indents != this.indentStack[0]) { - this.indentStack.unshift(indents); - tok = this.tok('indent', indents); - // newline - } else { - tok = this.tok('newline'); - } - - return tok; - } - }, - - /** - * Pipe-less text consumed only when - * pipeless is true; - */ - - pipelessText: function() { - if (this.pipeless) { - if ('\n' == this.input[0]) return; - var i = this.input.indexOf('\n'); - if (-1 == i) i = this.input.length; - var str = this.input.substr(0, i); - this.consume(str.length); - return this.tok('text', str); - } - }, - - /** - * ':' - */ - - colon: function() { - return this.scan(/^: */, ':'); - }, - - /** - * Return the next token object, or those - * previously stashed by lookahead. - * - * @return {Object} - * @api private - */ - - advance: function(){ - return this.stashed() - || this.next(); - }, - - /** - * Return the next token object. - * - * @return {Object} - * @api private - */ - - next: function() { - return this.deferred() - || this.blank() - || this.eos() - || this.pipelessText() - || this.yield() - || this.doctype() - || this.interpolation() - || this["case"]() - || this.when() - || this["default"]() - || this["extends"]() - || this.append() - || this.prepend() - || this.block() - || this.include() - || this.mixin() - || this.call() - || this.conditional() - || this.each() - || this["while"]() - || this.assignment() - || this.tag() - || this.filter() - || this.code() - || this.id() - || this.className() - || this.attrs() - || this.indent() - || this.comment() - || this.colon() - || this.text(); - } -}; - -}); // module: lexer.js - -require.register("nodes/attrs.js", function(module, exports, require){ - -/*! - * Jade - nodes - Attrs - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node'), - Block = require('./block'); - -/** - * Initialize a `Attrs` node. - * - * @api public - */ - -var Attrs = module.exports = function Attrs() { - this.attrs = []; -}; - -/** - * Inherit from `Node`. - */ - -Attrs.prototype = new Node; -Attrs.prototype.constructor = Attrs; - - -/** - * Set attribute `name` to `val`, keep in mind these become - * part of a raw js object literal, so to quote a value you must - * '"quote me"', otherwise or example 'user.name' is literal JavaScript. - * - * @param {String} name - * @param {String} val - * @param {Boolean} escaped - * @return {Tag} for chaining - * @api public - */ - -Attrs.prototype.setAttribute = function(name, val, escaped){ - this.attrs.push({ name: name, val: val, escaped: escaped }); - return this; -}; - -/** - * Remove attribute `name` when present. - * - * @param {String} name - * @api public - */ - -Attrs.prototype.removeAttribute = function(name){ - for (var i = 0, len = this.attrs.length; i < len; ++i) { - if (this.attrs[i] && this.attrs[i].name == name) { - delete this.attrs[i]; - } - } -}; - -/** - * Get attribute value by `name`. - * - * @param {String} name - * @return {String} - * @api public - */ - -Attrs.prototype.getAttribute = function(name){ - for (var i = 0, len = this.attrs.length; i < len; ++i) { - if (this.attrs[i] && this.attrs[i].name == name) { - return this.attrs[i].val; - } - } -}; - -}); // module: nodes/attrs.js - -require.register("nodes/block-comment.js", function(module, exports, require){ - -/*! - * Jade - nodes - BlockComment - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node'); - -/** - * Initialize a `BlockComment` with the given `block`. - * - * @param {String} val - * @param {Block} block - * @param {Boolean} buffer - * @api public - */ - -var BlockComment = module.exports = function BlockComment(val, block, buffer) { - this.block = block; - this.val = val; - this.buffer = buffer; -}; - -/** - * Inherit from `Node`. - */ - -BlockComment.prototype = new Node; -BlockComment.prototype.constructor = BlockComment; - -}); // module: nodes/block-comment.js - -require.register("nodes/block.js", function(module, exports, require){ - -/*! - * Jade - nodes - Block - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node'); - -/** - * Initialize a new `Block` with an optional `node`. - * - * @param {Node} node - * @api public - */ - -var Block = module.exports = function Block(node){ - this.nodes = []; - if (node) this.push(node); -}; - -/** - * Inherit from `Node`. - */ - -Block.prototype = new Node; -Block.prototype.constructor = Block; - - -/** - * Block flag. - */ - -Block.prototype.isBlock = true; - -/** - * Replace the nodes in `other` with the nodes - * in `this` block. - * - * @param {Block} other - * @api private - */ - -Block.prototype.replace = function(other){ - other.nodes = this.nodes; -}; - -/** - * Pust the given `node`. - * - * @param {Node} node - * @return {Number} - * @api public - */ - -Block.prototype.push = function(node){ - return this.nodes.push(node); -}; - -/** - * Check if this block is empty. - * - * @return {Boolean} - * @api public - */ - -Block.prototype.isEmpty = function(){ - return 0 == this.nodes.length; -}; - -/** - * Unshift the given `node`. - * - * @param {Node} node - * @return {Number} - * @api public - */ - -Block.prototype.unshift = function(node){ - return this.nodes.unshift(node); -}; - -/** - * Return the "last" block, or the first `yield` node. - * - * @return {Block} - * @api private - */ - -Block.prototype.includeBlock = function(){ - var ret = this - , node; - - for (var i = 0, len = this.nodes.length; i < len; ++i) { - node = this.nodes[i]; - if (node.yield) return node; - else if (node.textOnly) continue; - else if (node.includeBlock) ret = node.includeBlock(); - else if (node.block && !node.block.isEmpty()) ret = node.block.includeBlock(); - if (ret.yield) return ret; - } - - return ret; -}; - -/** - * Return a clone of this block. - * - * @return {Block} - * @api private - */ - -Block.prototype.clone = function(){ - var clone = new Block; - for (var i = 0, len = this.nodes.length; i < len; ++i) { - clone.push(this.nodes[i].clone()); - } - return clone; -}; - - -}); // module: nodes/block.js - -require.register("nodes/case.js", function(module, exports, require){ - -/*! - * Jade - nodes - Case - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node'); - -/** - * Initialize a new `Case` with `expr`. - * - * @param {String} expr - * @api public - */ - -var Case = exports = module.exports = function Case(expr, block){ - this.expr = expr; - this.block = block; -}; - -/** - * Inherit from `Node`. - */ - -Case.prototype = new Node; -Case.prototype.constructor = Case; - - -var When = exports.When = function When(expr, block){ - this.expr = expr; - this.block = block; - this.debug = false; -}; - -/** - * Inherit from `Node`. - */ - -When.prototype = new Node; -When.prototype.constructor = When; - - - -}); // module: nodes/case.js - -require.register("nodes/code.js", function(module, exports, require){ - -/*! - * Jade - nodes - Code - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node'); - -/** - * Initialize a `Code` node with the given code `val`. - * Code may also be optionally buffered and escaped. - * - * @param {String} val - * @param {Boolean} buffer - * @param {Boolean} escape - * @api public - */ - -var Code = module.exports = function Code(val, buffer, escape) { - this.val = val; - this.buffer = buffer; - this.escape = escape; - if (val.match(/^ *else/)) this.debug = false; -}; - -/** - * Inherit from `Node`. - */ - -Code.prototype = new Node; -Code.prototype.constructor = Code; - -}); // module: nodes/code.js - -require.register("nodes/comment.js", function(module, exports, require){ - -/*! - * Jade - nodes - Comment - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node'); - -/** - * Initialize a `Comment` with the given `val`, optionally `buffer`, - * otherwise the comment may render in the output. - * - * @param {String} val - * @param {Boolean} buffer - * @api public - */ - -var Comment = module.exports = function Comment(val, buffer) { - this.val = val; - this.buffer = buffer; -}; - -/** - * Inherit from `Node`. - */ - -Comment.prototype = new Node; -Comment.prototype.constructor = Comment; - -}); // module: nodes/comment.js - -require.register("nodes/doctype.js", function(module, exports, require){ - -/*! - * Jade - nodes - Doctype - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node'); - -/** - * Initialize a `Doctype` with the given `val`. - * - * @param {String} val - * @api public - */ - -var Doctype = module.exports = function Doctype(val) { - this.val = val; -}; - -/** - * Inherit from `Node`. - */ - -Doctype.prototype = new Node; -Doctype.prototype.constructor = Doctype; - -}); // module: nodes/doctype.js - -require.register("nodes/each.js", function(module, exports, require){ - -/*! - * Jade - nodes - Each - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node'); - -/** - * Initialize an `Each` node, representing iteration - * - * @param {String} obj - * @param {String} val - * @param {String} key - * @param {Block} block - * @api public - */ - -var Each = module.exports = function Each(obj, val, key, block) { - this.obj = obj; - this.val = val; - this.key = key; - this.block = block; -}; - -/** - * Inherit from `Node`. - */ - -Each.prototype = new Node; -Each.prototype.constructor = Each; - -}); // module: nodes/each.js - -require.register("nodes/filter.js", function(module, exports, require){ - -/*! - * Jade - nodes - Filter - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node') - , Block = require('./block'); - -/** - * Initialize a `Filter` node with the given - * filter `name` and `block`. - * - * @param {String} name - * @param {Block|Node} block - * @api public - */ - -var Filter = module.exports = function Filter(name, block, attrs) { - this.name = name; - this.block = block; - this.attrs = attrs; - this.isASTFilter = !block.nodes.every(function(node){ return node.isText }); -}; - -/** - * Inherit from `Node`. - */ - -Filter.prototype = new Node; -Filter.prototype.constructor = Filter; - -}); // module: nodes/filter.js - -require.register("nodes/index.js", function(module, exports, require){ - -/*! - * Jade - nodes - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -exports.Node = require('./node'); -exports.Tag = require('./tag'); -exports.Code = require('./code'); -exports.Each = require('./each'); -exports.Case = require('./case'); -exports.Text = require('./text'); -exports.Block = require('./block'); -exports.Mixin = require('./mixin'); -exports.Filter = require('./filter'); -exports.Comment = require('./comment'); -exports.Literal = require('./literal'); -exports.BlockComment = require('./block-comment'); -exports.Doctype = require('./doctype'); - -}); // module: nodes/index.js - -require.register("nodes/literal.js", function(module, exports, require){ - -/*! - * Jade - nodes - Literal - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node'); - -/** - * Initialize a `Literal` node with the given `str. - * - * @param {String} str - * @api public - */ - -var Literal = module.exports = function Literal(str) { - this.str = str - .replace(/\\/g, "\\\\") - .replace(/\n|\r\n/g, "\\n") - .replace(/'/g, "\\'"); -}; - -/** - * Inherit from `Node`. - */ - -Literal.prototype = new Node; -Literal.prototype.constructor = Literal; - - -}); // module: nodes/literal.js - -require.register("nodes/mixin.js", function(module, exports, require){ - -/*! - * Jade - nodes - Mixin - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Attrs = require('./attrs'); - -/** - * Initialize a new `Mixin` with `name` and `block`. - * - * @param {String} name - * @param {String} args - * @param {Block} block - * @api public - */ - -var Mixin = module.exports = function Mixin(name, args, block, call){ - this.name = name; - this.args = args; - this.block = block; - this.attrs = []; - this.call = call; -}; - -/** - * Inherit from `Attrs`. - */ - -Mixin.prototype = new Attrs; -Mixin.prototype.constructor = Mixin; - - - -}); // module: nodes/mixin.js - -require.register("nodes/node.js", function(module, exports, require){ - -/*! - * Jade - nodes - Node - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Initialize a `Node`. - * - * @api public - */ - -var Node = module.exports = function Node(){}; - -/** - * Clone this node (return itself) - * - * @return {Node} - * @api private - */ - -Node.prototype.clone = function(){ - return this; -}; - -}); // module: nodes/node.js - -require.register("nodes/tag.js", function(module, exports, require){ - -/*! - * Jade - nodes - Tag - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Attrs = require('./attrs'), - Block = require('./block'), - inlineTags = require('../inline-tags'); - -/** - * Initialize a `Tag` node with the given tag `name` and optional `block`. - * - * @param {String} name - * @param {Block} block - * @api public - */ - -var Tag = module.exports = function Tag(name, block) { - this.name = name; - this.attrs = []; - this.block = block || new Block; -}; - -/** - * Inherit from `Attrs`. - */ - -Tag.prototype = new Attrs; -Tag.prototype.constructor = Tag; - - -/** - * Clone this tag. - * - * @return {Tag} - * @api private - */ - -Tag.prototype.clone = function(){ - var clone = new Tag(this.name, this.block.clone()); - clone.line = this.line; - clone.attrs = this.attrs; - clone.textOnly = this.textOnly; - return clone; -}; - -/** - * Check if this tag is an inline tag. - * - * @return {Boolean} - * @api private - */ - -Tag.prototype.isInline = function(){ - return ~inlineTags.indexOf(this.name); -}; - -/** - * Check if this tag's contents can be inlined. Used for pretty printing. - * - * @return {Boolean} - * @api private - */ - -Tag.prototype.canInline = function(){ - var nodes = this.block.nodes; - - function isInline(node){ - // Recurse if the node is a block - if (node.isBlock) return node.nodes.every(isInline); - return node.isText || (node.isInline && node.isInline()); - } - - // Empty tag - if (!nodes.length) return true; - - // Text-only or inline-only tag - if (1 == nodes.length) return isInline(nodes[0]); - - // Multi-line inline-only tag - if (this.block.nodes.every(isInline)) { - for (var i = 1, len = nodes.length; i < len; ++i) { - if (nodes[i-1].isText && nodes[i].isText) - return false; - } - return true; - } - - // Mixed tag - return false; -}; -}); // module: nodes/tag.js - -require.register("nodes/text.js", function(module, exports, require){ - -/*! - * Jade - nodes - Text - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node'); - -/** - * Initialize a `Text` node with optional `line`. - * - * @param {String} line - * @api public - */ - -var Text = module.exports = function Text(line) { - this.val = ''; - if ('string' == typeof line) this.val = line; -}; - -/** - * Inherit from `Node`. - */ - -Text.prototype = new Node; -Text.prototype.constructor = Text; - - -/** - * Flag as text. - */ - -Text.prototype.isText = true; -}); // module: nodes/text.js - -require.register("parser.js", function(module, exports, require){ - -/*! - * Jade - Parser - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Lexer = require('./lexer') - , nodes = require('./nodes') - , utils = require('./utils'); - -/** - * Initialize `Parser` with the given input `str` and `filename`. - * - * @param {String} str - * @param {String} filename - * @param {Object} options - * @api public - */ - -var Parser = exports = module.exports = function Parser(str, filename, options){ - this.input = str; - this.lexer = new Lexer(str, options); - this.filename = filename; - this.blocks = {}; - this.mixins = {}; - this.options = options; - this.contexts = [this]; -}; - -/** - * Tags that may not contain tags. - */ - -var textOnly = exports.textOnly = ['script', 'style']; - -/** - * Parser prototype. - */ - -Parser.prototype = { - - /** - * Push `parser` onto the context stack, - * or pop and return a `Parser`. - */ - - context: function(parser){ - if (parser) { - this.contexts.push(parser); - } else { - return this.contexts.pop(); - } - }, - - /** - * Return the next token object. - * - * @return {Object} - * @api private - */ - - advance: function(){ - return this.lexer.advance(); - }, - - /** - * Skip `n` tokens. - * - * @param {Number} n - * @api private - */ - - skip: function(n){ - while (n--) this.advance(); - }, - - /** - * Single token lookahead. - * - * @return {Object} - * @api private - */ - - peek: function() { - return this.lookahead(1); - }, - - /** - * Return lexer lineno. - * - * @return {Number} - * @api private - */ - - line: function() { - return this.lexer.lineno; - }, - - /** - * `n` token lookahead. - * - * @param {Number} n - * @return {Object} - * @api private - */ - - lookahead: function(n){ - return this.lexer.lookahead(n); - }, - - /** - * Parse input returning a string of js for evaluation. - * - * @return {String} - * @api public - */ - - parse: function(){ - var block = new nodes.Block, parser; - block.line = this.line(); - - while ('eos' != this.peek().type) { - if ('newline' == this.peek().type) { - this.advance(); - } else { - block.push(this.parseExpr()); - } - } - - if (parser = this.extending) { - this.context(parser); - var ast = parser.parse(); - this.context(); - // hoist mixins - for (var name in this.mixins) - ast.unshift(this.mixins[name]); - return ast; - } - - return block; - }, - - /** - * Expect the given type, or throw an exception. - * - * @param {String} type - * @api private - */ - - expect: function(type){ - if (this.peek().type === type) { - return this.advance(); - } else { - throw new Error('expected "' + type + '", but got "' + this.peek().type + '"'); - } - }, - - /** - * Accept the given `type`. - * - * @param {String} type - * @api private - */ - - accept: function(type){ - if (this.peek().type === type) { - return this.advance(); - } - }, - - /** - * tag - * | doctype - * | mixin - * | include - * | filter - * | comment - * | text - * | each - * | code - * | yield - * | id - * | class - * | interpolation - */ - - parseExpr: function(){ - switch (this.peek().type) { - case 'tag': - return this.parseTag(); - case 'mixin': - return this.parseMixin(); - case 'block': - return this.parseBlock(); - case 'case': - return this.parseCase(); - case 'when': - return this.parseWhen(); - case 'default': - return this.parseDefault(); - case 'extends': - return this.parseExtends(); - case 'include': - return this.parseInclude(); - case 'doctype': - return this.parseDoctype(); - case 'filter': - return this.parseFilter(); - case 'comment': - return this.parseComment(); - case 'text': - return this.parseText(); - case 'each': - return this.parseEach(); - case 'code': - return this.parseCode(); - case 'call': - return this.parseCall(); - case 'interpolation': - return this.parseInterpolation(); - case 'yield': - this.advance(); - var block = new nodes.Block; - block.yield = true; - return block; - case 'id': - case 'class': - var tok = this.advance(); - this.lexer.defer(this.lexer.tok('tag', 'div')); - this.lexer.defer(tok); - return this.parseExpr(); - default: - throw new Error('unexpected token "' + this.peek().type + '"'); - } - }, - - /** - * Text - */ - - parseText: function(){ - var tok = this.expect('text') - , node = new nodes.Text(tok.val); - node.line = this.line(); - return node; - }, - - /** - * ':' expr - * | block - */ - - parseBlockExpansion: function(){ - if (':' == this.peek().type) { - this.advance(); - return new nodes.Block(this.parseExpr()); - } else { - return this.block(); - } - }, - - /** - * case - */ - - parseCase: function(){ - var val = this.expect('case').val - , node = new nodes.Case(val); - node.line = this.line(); - node.block = this.block(); - return node; - }, - - /** - * when - */ - - parseWhen: function(){ - var val = this.expect('when').val - return new nodes.Case.When(val, this.parseBlockExpansion()); - }, - - /** - * default - */ - - parseDefault: function(){ - this.expect('default'); - return new nodes.Case.When('default', this.parseBlockExpansion()); - }, - - /** - * code - */ - - parseCode: function(){ - var tok = this.expect('code') - , node = new nodes.Code(tok.val, tok.buffer, tok.escape) - , block - , i = 1; - node.line = this.line(); - while (this.lookahead(i) && 'newline' == this.lookahead(i).type) ++i; - block = 'indent' == this.lookahead(i).type; - if (block) { - this.skip(i-1); - node.block = this.block(); - } - return node; - }, - - /** - * comment - */ - - parseComment: function(){ - var tok = this.expect('comment') - , node; - - if ('indent' == this.peek().type) { - node = new nodes.BlockComment(tok.val, this.block(), tok.buffer); - } else { - node = new nodes.Comment(tok.val, tok.buffer); - } - - node.line = this.line(); - return node; - }, - - /** - * doctype - */ - - parseDoctype: function(){ - var tok = this.expect('doctype') - , node = new nodes.Doctype(tok.val); - node.line = this.line(); - return node; - }, - - /** - * filter attrs? text-block - */ - - parseFilter: function(){ - var block - , tok = this.expect('filter') - , attrs = this.accept('attrs'); - - this.lexer.pipeless = true; - block = this.parseTextBlock(); - this.lexer.pipeless = false; - - var node = new nodes.Filter(tok.val, block, attrs && attrs.attrs); - node.line = this.line(); - return node; - }, - - /** - * tag ':' attrs? block - */ - - parseASTFilter: function(){ - var block - , tok = this.expect('tag') - , attrs = this.accept('attrs'); - - this.expect(':'); - block = this.block(); - - var node = new nodes.Filter(tok.val, block, attrs && attrs.attrs); - node.line = this.line(); - return node; - }, - - /** - * each block - */ - - parseEach: function(){ - var tok = this.expect('each') - , node = new nodes.Each(tok.code, tok.val, tok.key); - node.line = this.line(); - node.block = this.block(); - if (this.peek().type == 'code' && this.peek().val == 'else') { - this.advance(); - node.alternative = this.block(); - } - return node; - }, - - /** - * 'extends' name - */ - - parseExtends: function(){ - var path = require('path') - , fs = require('fs') - , dirname = path.dirname - , basename = path.basename - , join = path.join; - - if (!this.filename) - throw new Error('the "filename" option is required to extend templates'); - - var path = this.expect('extends').val.trim() - , dir = dirname(this.filename); - - var path = join(dir, path + '.jade') - , str = fs.readFileSync(path, 'utf8') - , parser = new Parser(str, path, this.options); - - parser.blocks = this.blocks; - parser.contexts = this.contexts; - this.extending = parser; - - // TODO: null node - return new nodes.Literal(''); - }, - - /** - * 'block' name block - */ - - parseBlock: function(){ - var block = this.expect('block') - , mode = block.mode - , name = block.val.trim(); - - block = 'indent' == this.peek().type - ? this.block() - : new nodes.Block(new nodes.Literal('')); - - var prev = this.blocks[name]; - - if (prev) { - switch (prev.mode) { - case 'append': - block.nodes = block.nodes.concat(prev.nodes); - prev = block; - break; - case 'prepend': - block.nodes = prev.nodes.concat(block.nodes); - prev = block; - break; - } - } - - block.mode = mode; - return this.blocks[name] = prev || block; - }, - - /** - * include block? - */ - - parseInclude: function(){ - var path = require('path') - , fs = require('fs') - , dirname = path.dirname - , basename = path.basename - , join = path.join; - - var path = this.expect('include').val.trim() - , dir = dirname(this.filename); - - if (!this.filename) - throw new Error('the "filename" option is required to use includes'); - - // no extension - if (!~basename(path).indexOf('.')) { - path += '.jade'; - } - - // non-jade - if ('.jade' != path.substr(-5)) { - var path = join(dir, path) - , str = fs.readFileSync(path, 'utf8'); - return new nodes.Literal(str); - } - - var path = join(dir, path) - , str = fs.readFileSync(path, 'utf8') - , parser = new Parser(str, path, this.options); - parser.blocks = utils.merge({}, this.blocks); - parser.mixins = this.mixins; - - this.context(parser); - var ast = parser.parse(); - this.context(); - ast.filename = path; - - if ('indent' == this.peek().type) { - ast.includeBlock().push(this.block()); - } - - return ast; - }, - - /** - * call ident block - */ - - parseCall: function(){ - var tok = this.expect('call') - , name = tok.val - , args = tok.args - , mixin = new nodes.Mixin(name, args, new nodes.Block, true); - - this.tag(mixin); - if (mixin.block.isEmpty()) mixin.block = null; - return mixin; - }, - - /** - * mixin block - */ - - parseMixin: function(){ - var tok = this.expect('mixin') - , name = tok.val - , args = tok.args - , mixin; - - // definition - if ('indent' == this.peek().type) { - mixin = new nodes.Mixin(name, args, this.block(), false); - this.mixins[name] = mixin; - return mixin; - // call - } else { - return new nodes.Mixin(name, args, null, true); - } - }, - - /** - * indent (text | newline)* outdent - */ - - parseTextBlock: function(){ - var block = new nodes.Block; - block.line = this.line(); - var spaces = this.expect('indent').val; - if (null == this._spaces) this._spaces = spaces; - var indent = Array(spaces - this._spaces + 1).join(' '); - while ('outdent' != this.peek().type) { - switch (this.peek().type) { - case 'newline': - this.advance(); - break; - case 'indent': - this.parseTextBlock().nodes.forEach(function(node){ - block.push(node); - }); - break; - default: - var text = new nodes.Text(indent + this.advance().val); - text.line = this.line(); - block.push(text); - } - } - - if (spaces == this._spaces) this._spaces = null; - this.expect('outdent'); - return block; - }, - - /** - * indent expr* outdent - */ - - block: function(){ - var block = new nodes.Block; - block.line = this.line(); - this.expect('indent'); - while ('outdent' != this.peek().type) { - if ('newline' == this.peek().type) { - this.advance(); - } else { - block.push(this.parseExpr()); - } - } - this.expect('outdent'); - return block; - }, - - /** - * interpolation (attrs | class | id)* (text | code | ':')? newline* block? - */ - - parseInterpolation: function(){ - var tok = this.advance(); - var tag = new nodes.Tag(tok.val); - tag.buffer = true; - return this.tag(tag); - }, - - /** - * tag (attrs | class | id)* (text | code | ':')? newline* block? - */ - - parseTag: function(){ - // ast-filter look-ahead - var i = 2; - if ('attrs' == this.lookahead(i).type) ++i; - if (':' == this.lookahead(i).type) { - if ('indent' == this.lookahead(++i).type) { - return this.parseASTFilter(); - } - } - - var tok = this.advance() - , tag = new nodes.Tag(tok.val); - - tag.selfClosing = tok.selfClosing; - - return this.tag(tag); - }, - - /** - * Parse tag. - */ - - tag: function(tag){ - var dot; - - tag.line = this.line(); - - // (attrs | class | id)* - out: - while (true) { - switch (this.peek().type) { - case 'id': - case 'class': - var tok = this.advance(); - tag.setAttribute(tok.type, "'" + tok.val + "'"); - continue; - case 'attrs': - var tok = this.advance() - , obj = tok.attrs - , escaped = tok.escaped - , names = Object.keys(obj); - - if (tok.selfClosing) tag.selfClosing = true; - - for (var i = 0, len = names.length; i < len; ++i) { - var name = names[i] - , val = obj[name]; - tag.setAttribute(name, val, escaped[name]); - } - continue; - default: - break out; - } - } - - // check immediate '.' - if ('.' == this.peek().val) { - dot = tag.textOnly = true; - this.advance(); - } - - // (text | code | ':')? - switch (this.peek().type) { - case 'text': - tag.block.push(this.parseText()); - break; - case 'code': - tag.code = this.parseCode(); - break; - case ':': - this.advance(); - tag.block = new nodes.Block; - tag.block.push(this.parseExpr()); - break; - } - - // newline* - while ('newline' == this.peek().type) this.advance(); - - tag.textOnly = tag.textOnly || ~textOnly.indexOf(tag.name); - - // script special-case - if ('script' == tag.name) { - var type = tag.getAttribute('type'); - if (!dot && type && 'text/javascript' != type.replace(/^['"]|['"]$/g, '')) { - tag.textOnly = false; - } - } - - // block? - if ('indent' == this.peek().type) { - if (tag.textOnly) { - this.lexer.pipeless = true; - tag.block = this.parseTextBlock(); - this.lexer.pipeless = false; - } else { - var block = this.block(); - if (tag.block) { - for (var i = 0, len = block.nodes.length; i < len; ++i) { - tag.block.push(block.nodes[i]); - } - } else { - tag.block = block; - } - } - } - - return tag; - } -}; - -}); // module: parser.js - -require.register("runtime.js", function(module, exports, require){ - -/*! - * Jade - runtime - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Lame Array.isArray() polyfill for now. - */ - -if (!Array.isArray) { - Array.isArray = function(arr){ - return '[object Array]' == Object.prototype.toString.call(arr); - }; -} - -/** - * Lame Object.keys() polyfill for now. - */ - -if (!Object.keys) { - Object.keys = function(obj){ - var arr = []; - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - arr.push(key); - } - } - return arr; - } -} - -/** - * Merge two attribute objects giving precedence - * to values in object `b`. Classes are special-cased - * allowing for arrays and merging/joining appropriately - * resulting in a string. - * - * @param {Object} a - * @param {Object} b - * @return {Object} a - * @api private - */ - -exports.merge = function merge(a, b) { - var ac = a['class']; - var bc = b['class']; - - if (ac || bc) { - ac = ac || []; - bc = bc || []; - if (!Array.isArray(ac)) ac = [ac]; - if (!Array.isArray(bc)) bc = [bc]; - ac = ac.filter(nulls); - bc = bc.filter(nulls); - a['class'] = ac.concat(bc).join(' '); - } - - for (var key in b) { - if (key != 'class') { - a[key] = b[key]; - } - } - - return a; -}; - -/** - * Filter null `val`s. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ - -function nulls(val) { - return val != null; -} - -/** - * Render the given attributes object. - * - * @param {Object} obj - * @param {Object} escaped - * @return {String} - * @api private - */ - -exports.attrs = function attrs(obj, escaped){ - var buf = [] - , terse = obj.terse; - - delete obj.terse; - var keys = Object.keys(obj) - , len = keys.length; - - if (len) { - buf.push(''); - for (var i = 0; i < len; ++i) { - var key = keys[i] - , val = obj[key]; - - if ('boolean' == typeof val || null == val) { - if (val) { - terse - ? buf.push(key) - : buf.push(key + '="' + key + '"'); - } - } else if (0 == key.indexOf('data') && 'string' != typeof val) { - buf.push(key + "='" + JSON.stringify(val) + "'"); - } else if ('class' == key && Array.isArray(val)) { - buf.push(key + '="' + exports.escape(val.join(' ')) + '"'); - } else if (escaped && escaped[key]) { - buf.push(key + '="' + exports.escape(val) + '"'); - } else { - buf.push(key + '="' + val + '"'); - } - } - } - - return buf.join(' '); -}; - -/** - * Escape the given string of `html`. - * - * @param {String} html - * @return {String} - * @api private - */ - -exports.escape = function escape(html){ - return String(html) - .replace(/&(?!(\w+|\#\d+);)/g, '&') - .replace(//g, '>') - .replace(/"/g, '"'); -}; - -/** - * Re-throw the given `err` in context to the - * the jade in `filename` at the given `lineno`. - * - * @param {Error} err - * @param {String} filename - * @param {String} lineno - * @api private - */ - -exports.rethrow = function rethrow(err, filename, lineno){ - if (!filename) throw err; - - var context = 3 - , str = require('fs').readFileSync(filename, 'utf8') - , lines = str.split('\n') - , start = Math.max(lineno - context, 0) - , end = Math.min(lines.length, lineno + context); - - // Error context - var context = lines.slice(start, end).map(function(line, i){ - var curr = i + start + 1; - return (curr == lineno ? ' > ' : ' ') - + curr - + '| ' - + line; - }).join('\n'); - - // Alter exception message - err.path = filename; - err.message = (filename || 'Jade') + ':' + lineno - + '\n' + context + '\n\n' + err.message; - throw err; -}; - -}); // module: runtime.js - -require.register("self-closing.js", function(module, exports, require){ - -/*! - * Jade - self closing tags - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -module.exports = [ - 'meta' - , 'img' - , 'link' - , 'input' - , 'source' - , 'area' - , 'base' - , 'col' - , 'br' - , 'hr' -]; -}); // module: self-closing.js - -require.register("utils.js", function(module, exports, require){ - -/*! - * Jade - utils - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Convert interpolation in the given string to JavaScript. - * - * @param {String} str - * @return {String} - * @api private - */ - -var interpolate = exports.interpolate = function(str){ - return str.replace(/(_SLASH_)?([#!]){(.*?)}/g, function(str, escape, flag, code){ - code = code - .replace(/\\'/g, "'") - .replace(/_SLASH_/g, '\\'); - - return escape - ? str.slice(7) - : "' + " - + ('!' == flag ? '' : 'escape') - + "((interp = " + code - + ") == null ? '' : interp) + '"; - }); -}; - -/** - * Escape single quotes in `str`. - * - * @param {String} str - * @return {String} - * @api private - */ - -var escape = exports.escape = function(str) { - return str.replace(/'/g, "\\'"); -}; - -/** - * Interpolate, and escape the given `str`. - * - * @param {String} str - * @return {String} - * @api private - */ - -exports.text = function(str){ - return interpolate(escape(str)); -}; - -/** - * Merge `b` into `a`. - * - * @param {Object} a - * @param {Object} b - * @return {Object} - * @api public - */ - -exports.merge = function(a, b) { - for (var key in b) a[key] = b[key]; - return a; -}; - - -}); // module: utils.js - -window.jade = require("jade"); -})(); diff --git a/node_modules/jade/jade.md b/node_modules/jade/jade.md deleted file mode 100644 index 051dc03..0000000 --- a/node_modules/jade/jade.md +++ /dev/null @@ -1,510 +0,0 @@ - -# Jade - - The jade template engine for node.js - -## Synopsis - - jade [-h|--help] [-v|--version] [-o|--obj STR] - [-O|--out DIR] [-p|--path PATH] [-P|--pretty] - [-c|--client] [-D|--no-debug] - -## Examples - - translate jade the templates dir - - $ jade templates - - create {foo,bar}.html - - $ jade {foo,bar}.jade - - jade over stdio - - $ jade < my.jade > my.html - - jade over s - - $ echo "h1 Jade!" | jade - - foo, bar dirs rendering to /tmp - - $ jade foo bar --out /tmp - - compile client-side templates without debugging - instrumentation, making the output javascript - very light-weight. This requires runtime.js - in your projects. - - $ jade --client --no-debug < my.jade - -## Tags - - Tags are simply nested via whitespace, closing - tags defined for you. These indents are called "blocks". - - ul - li - a Foo - li - a Bar - - You may have several tags in one "block": - - ul - li - a Foo - a Bar - a Baz - -## Self-closing Tags - - Some tags are flagged as self-closing by default, such - as `meta`, `link`, and so on. To explicitly self-close - a tag simply append the `/` character: - - foo/ - foo(bar='baz')/ - - Would yield: - - - - -## Attributes - - Tag attributes look similar to HTML, however - the values are regular JavaScript, here are - some examples: - - a(href='google.com') Google - a(class='button', href='google.com') Google - - As mentioned the attribute values are just JavaScript, - this means ternary operations and other JavaScript expressions - work just fine: - - body(class=user.authenticated ? 'authenticated' : 'anonymous') - a(href=user.website || 'http://google.com') - - Multiple lines work too: - - input(type='checkbox', - name='agreement', - checked) - - Multiple lines without the comma work fine: - - input(type='checkbox' - name='agreement' - checked) - - Funky whitespace? fine: - - input( - type='checkbox' - name='agreement' - checked) - -## Boolean attributes - - Boolean attributes are mirrored by Jade, and accept - bools, aka _true_ or _false_. When no value is specified - _true_ is assumed. For example: - - input(type="checkbox", checked) - // => "" - - For example if the checkbox was for an agreement, perhaps `user.agreed` - was _true_ the following would also output 'checked="checked"': - - input(type="checkbox", checked=user.agreed) - -## Class attributes - - The _class_ attribute accepts an array of classes, - this can be handy when generated from a javascript - function etc: - - classes = ['foo', 'bar', 'baz'] - a(class=classes) - // => "" - -## Class literal - - Classes may be defined using a ".CLASSNAME" syntax: - - .button - // => "
    " - - Or chained: - - .large.button - // => "
    " - - The previous defaulted to divs, however you - may also specify the tag type: - - h1.title My Title - // => "

    My Title

    " - -## Id literal - - Much like the class literal there's an id literal: - - #user-1 - // => "
    " - - Again we may specify the tag as well: - - ul#menu - li: a(href='/home') Home - li: a(href='/store') Store - li: a(href='/contact') Contact - - Finally all of these may be used in any combination, - the following are all valid tags: - - a.button#contact(style: 'color: red') Contact - a.button(style: 'color: red')#contact Contact - a(style: 'color: red').button#contact Contact - -## Block expansion - - Jade supports the concept of "block expansion", in which - using a trailing ":" after a tag will inject a block: - - ul - li: a Foo - li: a Bar - li: a Baz - -## Text - - Arbitrary text may follow tags: - - p Welcome to my site - - yields: - -

    Welcome to my site

    - -## Pipe text - - Another form of text is "pipe" text. Pipes act - as the text margin for large bodies of text. - - p - | This is a large - | body of text for - | this tag. - | - | Nothing too - | exciting. - - yields: - -

    This is a large - body of text for - this tag. - - Nothing too - exciting. -

    - - Using pipes we can also specify regular Jade tags - within the text: - - p - | Click to visit - a(href='http://google.com') Google - | if you want. - -## Text only tags - - As an alternative to pipe text you may add - a trailing "." to indicate that the block - contains nothing but plain-text, no tags: - - p. - This is a large - body of text for - this tag. - - Nothing too - exciting. - - Some tags are text-only by default, for example - _script_, _textarea_, and _style_ tags do not - contain nested HTML so Jade implies the trailing ".": - - script - if (foo) { - bar(); - } - - style - body { - padding: 50px; - font: 14px Helvetica; - } - -## Template script tags - - Sometimes it's useful to define HTML in script - tags using Jade, typically for client-side templates. - - To do this simply give the _script_ tag an arbitrary - _type_ attribute such as _text/x-template_: - - script(type='text/template') - h1 Look! - p Jade still works in here! - -## Interpolation - - Both plain-text and piped-text support interpolation, - which comes in two forms, escapes and non-escaped. The - following will output the _user.name_ in the paragraph - but HTML within it will be escaped to prevent XSS attacks: - - p Welcome #{user.name} - - The following syntax is identical however it will _not_ escape - HTML, and should only be used with strings that you trust: - - p Welcome !{user.name} - -## Inline HTML - - Sometimes constructing small inline snippets of HTML - in Jade can be annoying, luckily we can add plain - HTML as well: - - p Welcome #{user.name} - -## Code - - To buffer output with Jade simply use _=_ at the beginning - of a line or after a tag. This method escapes any HTML - present in the string. - - p= user.description - - To buffer output unescaped use the _!=_ variant, but again - be careful of XSS. - - p!= user.description - - The final way to mess with JavaScript code in Jade is the unbuffered - _-_, which can be used for conditionals, defining variables etc: - - - var user = { description: 'foo bar baz' } - #user - - if (user.description) { - h2 Description - p.description= user.description - - } - - When compiled blocks are wrapped in anonymous functions, so the - following is also valid, without braces: - - - var user = { description: 'foo bar baz' } - #user - - if (user.description) - h2 Description - p.description= user.description - - If you really want you could even use `.forEach()` and others: - - - users.forEach(function(user){ - .user - h2= user.name - p User #{user.name} is #{user.age} years old - - }) - - Taking this further Jade provides some syntax for conditionals, - iteration, switch statements etc. Let's look at those next! - -## Assignment - - Jade's first-class assignment is simple, simply use the _=_ - operator and Jade will _var_ it for you. The following are equivalent: - - - var user = { name: 'tobi' } - user = { name: 'tobi' } - -## Conditionals - - Jade's first-class conditional syntax allows for optional - parenthesis, and you may now omit the leading _-_ otherwise - it's identical, still just regular javascript: - - user = { description: 'foo bar baz' } - #user - if user.description - h2 Description - p.description= user.description - - Jade provides the negated version, _unless_ as well, the following - are equivalent: - - - if (!(user.isAnonymous)) - p You're logged in as #{user.name} - - unless user.isAnonymous - p You're logged in as #{user.name} - -## Iteration - - JavaScript's _for_ loops don't look very declarative, so Jade - also provides its own _for_ loop construct, aliased as _each_: - - for user in users - .user - h2= user.name - p user #{user.name} is #{user.age} year old - - As mentioned _each_ is identical: - - each user in users - .user - h2= user.name - - If necessary the index is available as well: - - for user, i in users - .user(class='user-#{i}') - h2= user.name - - Remember, it's just JavaScript: - - ul#letters - for letter in ['a', 'b', 'c'] - li= letter - -## Mixins - - Mixins provide a way to define jade "functions" which "mix in" - their contents when called. This is useful for abstracting - out large fragments of Jade. - - The simplest possible mixin which accepts no arguments might - look like this: - - mixin hello - p Hello - - You use a mixin by placing `+` before the name: - - +hello - - For something a little more dynamic, mixins can take - arguments, the mixin itself is converted to a javascript - function internally: - - mixin hello(user) - p Hello #{user} - - +hello('Tobi') - - Yields: - -

    Hello Tobi

    - - Mixins may optionally take blocks, when a block is passed - its contents becomes the implicit `block` argument. For - example here is a mixin passed a block, and also invoked - without passing a block: - - mixin article(title) - .article - .article-wrapper - h1= title - if block - block - else - p No content provided - - +article('Hello world') - - +article('Hello world') - p This is my - p Amazing article - - yields: - -
    -
    -

    Hello world

    -

    No content provided

    -
    -
    - -
    -
    -

    Hello world

    -

    This is my

    -

    Amazing article

    -
    -
    - - Mixins can even take attributes, just like a tag. When - attributes are passed they become the implicit `attributes` - argument. Individual attributes can be accessed just like - normal object properties: - - mixin centered - .centered(class=attributes.class) - block - - +centered.bold Hello world - - +centered.red - p This is my - p Amazing article - - yields: - -
    Hello world
    -
    -

    This is my

    -

    Amazing article

    -
    - - If you use `attributes` directly, *all* passed attributes - get used: - - mixin link - a.menu(attributes) - block - - +link.highlight(href='#top') Top - +link#sec1.plain(href='#section1') Section 1 - +link#sec2.plain(href='#section2') Section 2 - - yields: - - Top - Section 1 - Section 2 - - If you pass arguments, they must directly follow the mixin: - - mixin list(arr) - if block - .title - block - ul(attributes) - each item in arr - li= item - - +list(['foo', 'bar', 'baz'])(id='myList', class='bold') - - yields: - -
      -
    • foo
    • -
    • bar
    • -
    • baz
    • -
    diff --git a/node_modules/jade/jade.min.js b/node_modules/jade/jade.min.js deleted file mode 100644 index 93f3b3d..0000000 --- a/node_modules/jade/jade.min.js +++ /dev/null @@ -1,2 +0,0 @@ -(function(){function require(p){var path=require.resolve(p),mod=require.modules[path];if(!mod)throw new Error('failed to require "'+p+'"');return mod.exports||(mod.exports={},mod.call(mod.exports,mod,mod.exports,require.relative(path))),mod.exports}require.modules={},require.resolve=function(path){var orig=path,reg=path+".js",index=path+"/index.js";return require.modules[reg]&®||require.modules[index]&&index||orig},require.register=function(path,fn){require.modules[path]=fn},require.relative=function(parent){return function(p){if("."!=p.charAt(0))return require(p);var path=parent.split("/"),segs=p.split("/");path.pop();for(var i=0;i/g,">").replace(/"/g,""")}var nodes=require("./nodes"),filters=require("./filters"),doctypes=require("./doctypes"),selfClosing=require("./self-closing"),runtime=require("./runtime"),utils=require("./utils");Object.keys||(Object.keys=function(obj){var arr=[];for(var key in obj)obj.hasOwnProperty(key)&&arr.push(key);return arr}),String.prototype.trimLeft||(String.prototype.trimLeft=function(){return this.replace(/^\s+/,"")});var Compiler=module.exports=function Compiler(node,options){this.options=options=options||{},this.node=node,this.hasCompiledDoctype=!1,this.hasCompiledTag=!1,this.pp=options.pretty||!1,this.debug=!1!==options.compileDebug,this.indents=0,this.parentIndents=0,options.doctype&&this.setDoctype(options.doctype)};Compiler.prototype={compile:function(){return this.buf=["var interp;"],this.pp&&this.buf.push("var __indent = [];"),this.lastBufferedIdx=-1,this.visit(this.node),this.buf.join("\n")},setDoctype:function(name){name=name&&name.toLowerCase()||"default",this.doctype=doctypes[name]||"",this.terse=this.doctype.toLowerCase()=="",this.xml=0==this.doctype.indexOf("1&&!escape&&block.nodes[0].isText&&block.nodes[1].isText&&this.prettyIndent(1,!0);for(var i=0;i0&&!escape&&block.nodes[i].isText&&block.nodes[i-1].isText&&this.prettyIndent(1,!1),this.visit(block.nodes[i]),block.nodes[i+1]&&block.nodes[i].isText&&block.nodes[i+1].isText&&this.buffer("\\n")},visitDoctype:function(doctype){doctype&&(doctype.val||!this.doctype)&&this.setDoctype(doctype.val||"default"),this.doctype&&this.buffer(this.doctype),this.hasCompiledDoctype=!0},visitMixin:function(mixin){var name=mixin.name.replace(/-/g,"_")+"_mixin",args=mixin.args||"",block=mixin.block,attrs=mixin.attrs,pp=this.pp;if(mixin.call){pp&&this.buf.push("__indent.push('"+Array(this.indents+1).join(" ")+"');");if(block||attrs.length){this.buf.push(name+".call({");if(block){this.buf.push("block: function(){"),this.parentIndents++;var _indents=this.indents;this.indents=0,this.visit(mixin.block),this.indents=_indents,this.parentIndents--,attrs.length?this.buf.push("},"):this.buf.push("}")}if(attrs.length){var val=this.attrs(attrs);val.inherits?this.buf.push("attributes: merge({"+val.buf+"}, attributes), escaped: merge("+val.escaped+", escaped, true)"):this.buf.push("attributes: {"+val.buf+"}, escaped: "+val.escaped)}args?this.buf.push("}, "+args+");"):this.buf.push("});")}else this.buf.push(name+"("+args+");");pp&&this.buf.push("__indent.pop();")}else this.buf.push("var "+name+" = function("+args+"){"),this.buf.push("var block = this.block, attributes = this.attributes || {}, escaped = this.escaped || {};"),this.parentIndents++,this.visit(block),this.parentIndents--,this.buf.push("};")},visitTag:function(tag){this.indents++;var name=tag.name,pp=this.pp;tag.buffer&&(name="' + ("+name+") + '"),this.hasCompiledTag||(!this.hasCompiledDoctype&&"html"==name&&this.visitDoctype(),this.hasCompiledTag=!0),pp&&!tag.isInline()&&this.prettyIndent(0,!0),(~selfClosing.indexOf(name)||tag.selfClosing)&&!this.xml?(this.buffer("<"+name),this.visitAttributes(tag.attrs),this.terse?this.buffer(">"):this.buffer("/>")):(tag.attrs.length?(this.buffer("<"+name),tag.attrs.length&&this.visitAttributes(tag.attrs),this.buffer(">")):this.buffer("<"+name+">"),tag.code&&this.visitCode(tag.code),this.escape="pre"==tag.name,this.visit(tag.block),pp&&!tag.isInline()&&"pre"!=tag.name&&!tag.canInline()&&this.prettyIndent(0,!0),this.buffer("")),this.indents--},visitFilter:function(filter){var fn=filters[filter.name];if(!fn)throw filter.isASTFilter?new Error('unknown ast filter "'+filter.name+':"'):new Error('unknown filter ":'+filter.name+'"');if(filter.isASTFilter)this.buf.push(fn(filter.block,this,filter.attrs));else{var text=filter.block.nodes.map(function(node){return node.val}).join("\n");filter.attrs=filter.attrs||{},filter.attrs.filename=this.options.filename,this.buffer(utils.text(fn(text,filter.attrs)))}},visitText:function(text){text=utils.text(text.val.replace(/\\/g,"_SLASH_")),this.escape&&(text=escape(text)),text=text.replace(/_SLASH_/g,"\\\\"),this.buffer(text)},visitComment:function(comment){if(!comment.buffer)return;this.pp&&this.prettyIndent(1,!0),this.buffer("")},visitBlockComment:function(comment){if(!comment.buffer)return;0==comment.val.trim().indexOf("if")?(this.buffer("")):(this.buffer(""))},visitCode:function(code){if(code.buffer){var val=code.val.trimLeft();this.buf.push("var __val__ = "+val),val='null == __val__ ? "" : __val__',code.escape&&(val="escape("+val+")"),this.buf.push("buf.push("+val+");")}else this.buf.push(code.val);code.block&&(code.buffer||this.buf.push("{"),this.visit(code.block),code.buffer||this.buf.push("}"))},visitEach:function(each){this.buf.push("// iterate "+each.obj+"\n"+";(function(){\n"+" if ('number' == typeof "+each.obj+".length) {\n"),each.alternative&&this.buf.push(" if ("+each.obj+".length) {"),this.buf.push(" for (var "+each.key+" = 0, $$l = "+each.obj+".length; "+each.key+" < $$l; "+each.key+"++) {\n"+" var "+each.val+" = "+each.obj+"["+each.key+"];\n"),this.visit(each.block),this.buf.push(" }\n"),each.alternative&&(this.buf.push(" } else {"),this.visit(each.alternative),this.buf.push(" }")),this.buf.push(" } else {\n var $$l = 0;\n for (var "+each.key+" in "+each.obj+") {\n"+" $$l++;"+" if ("+each.obj+".hasOwnProperty("+each.key+")){"+" var "+each.val+" = "+each.obj+"["+each.key+"];\n"),this.visit(each.block),this.buf.push(" }\n"),this.buf.push(" }\n"),each.alternative&&(this.buf.push(" if ($$l === 0) {"),this.visit(each.alternative),this.buf.push(" }")),this.buf.push(" }\n}).call(this);\n")},visitAttributes:function(attrs){var val=this.attrs(attrs);val.inherits?this.buf.push("buf.push(attrs(merge({ "+val.buf+" }, attributes), merge("+val.escaped+", escaped, true)));"):val.constant?(eval("var buf={"+val.buf+"};"),this.buffer(runtime.attrs(buf,JSON.parse(val.escaped)),!0)):this.buf.push("buf.push(attrs({ "+val.buf+" }, "+val.escaped+"));")},attrs:function(attrs){var buf=[],classes=[],escaped={},constant=attrs.every(function(attr){return isConstant(attr.val)}),inherits=!1;return this.terse&&buf.push("terse: true"),attrs.forEach(function(attr){if(attr.name=="attributes")return inherits=!0;escaped[attr.name]=attr.escaped;if(attr.name=="class")classes.push("("+attr.val+")");else{var pair="'"+attr.name+"':("+attr.val+")";buf.push(pair)}}),classes.length&&(classes=classes.join(" + ' ' + "),buf.push("class: "+classes)),{buf:buf.join(", ").replace("class:",'"class":'),escaped:JSON.stringify(escaped),inherits:inherits,constant:constant}}}}),require.register("doctypes.js",function(module,exports,require){module.exports={5:"","default":"",xml:'',transitional:'',strict:'',frameset:'',1.1:'',basic:'',mobile:''}}),require.register("filters.js",function(module,exports,require){module.exports={cdata:function(str){return""},sass:function(str){str=str.replace(/\\n/g,"\n");var sass=require("sass").render(str).replace(/\n/g,"\\n");return'"},stylus:function(str,options){var ret;str=str.replace(/\\n/g,"\n");var stylus=require("stylus");return stylus(str,options).render(function(err,css){if(err)throw err;ret=css.replace(/\n/g,"\\n")}),'"},less:function(str){var ret;return str=str.replace(/\\n/g,"\n"),require("less").render(str,function(err,css){if(err)throw err;ret='"}),ret},markdown:function(str){var md;try{md=require("markdown")}catch(err){try{md=require("discount")}catch(err){try{md=require("markdown-js")}catch(err){try{md=require("marked")}catch(err){throw new Error("Cannot find markdown library, install markdown, discount, or marked.")}}}}return str=str.replace(/\\n/g,"\n"),md.parse(str).replace(/\n/g,"\\n").replace(/'/g,"'")},coffeescript:function(str){var js=require("coffee-script").compile(str).replace(/\\/g,"\\\\").replace(/\n/g,"\\n");return'"}}}),require.register("inline-tags.js",function(module,exports,require){module.exports=["a","abbr","acronym","b","br","code","em","font","i","img","ins","kbd","map","samp","small","span","strong","sub","sup"]}),require.register("jade.js",function(module,exports,require){function parse(str,options){try{var parser=new Parser(str,options.filename,options),compiler=new(options.compiler||Compiler)(parser.parse(),options),js=compiler.compile();return options.debug&&console.error("\nCompiled Function:\n\n%s",js.replace(/^/gm," ")),"var buf = [];\n"+(options.self?"var self = locals || {};\n"+js:"with (locals || {}) {\n"+js+"\n}\n")+'return buf.join("");'}catch(err){parser=parser.context(),runtime.rethrow(err,parser.filename,parser.lexer.lineno)}}function stripBOM(str){return 65279==str.charCodeAt(0)?str.substring(1):str}var Parser=require("./parser"),Lexer=require("./lexer"),Compiler=require("./compiler"),runtime=require("./runtime");exports.version="0.27.6",exports.selfClosing=require("./self-closing"),exports.doctypes=require("./doctypes"),exports.filters=require("./filters"),exports.utils=require("./utils"),exports.Compiler=Compiler,exports.Parser=Parser,exports.Lexer=Lexer,exports.nodes=require("./nodes"),exports.runtime=runtime,exports.cache={},exports.compile=function(str,options){var options=options||{},client=options.client,filename=options.filename?JSON.stringify(options.filename):"undefined",fn;return str=stripBOM(String(str)),options.compileDebug!==!1?fn=["var __jade = [{ lineno: 1, filename: "+filename+" }];","try {",parse(str,options),"} catch (err) {"," rethrow(err, __jade[0].filename, __jade[0].lineno);","}"].join("\n"):fn=parse(str,options),client&&(fn="attrs = attrs || jade.attrs; escape = escape || jade.escape; rethrow = rethrow || jade.rethrow; merge = merge || jade.merge;\n"+fn),fn=new Function("locals, attrs, escape, rethrow, merge",fn),client?fn:function(locals){return fn(locals,runtime.attrs,runtime.escape,runtime.rethrow,runtime.merge)}},exports.render=function(str,options,fn){"function"==typeof options&&(fn=options,options={});if(options.cache&&!options.filename)return fn(new Error('the "filename" option is required for caching'));try{var path=options.filename,tmpl=options.cache?exports.cache[path]||(exports.cache[path]=exports.compile(str,options)):exports.compile(str,options);fn(null,tmpl(options))}catch(err){fn(err)}},exports.renderFile=function(path,options,fn){var key=path+":string";"function"==typeof options&&(fn=options,options={});try{options.filename=path;var str=options.cache?exports.cache[key]||(exports.cache[key]=fs.readFileSync(path,"utf8")):fs.readFileSync(path,"utf8");exports.render(str,options,fn)}catch(err){fn(err)}},exports.__express=exports.renderFile}),require.register("lexer.js",function(module,exports,require){var utils=require("./utils"),Lexer=module.exports=function Lexer(str,options){options=options||{},this.input=str.replace(/\r\n|\r/g,"\n"),this.colons=options.colons,this.deferredTokens=[],this.lastIndents=0,this.lineno=1,this.stash=[],this.indentStack=[],this.indentRe=null,this.pipeless=!1};Lexer.prototype={tok:function(type,val){return{type:type,line:this.lineno,val:val}},consume:function(len){this.input=this.input.substr(len)},scan:function(regexp,type){var captures;if(captures=regexp.exec(this.input))return this.consume(captures[0].length),this.tok(type,captures[1])},defer:function(tok){this.deferredTokens.push(tok)},lookahead:function(n){var fetch=n-this.stash.length;while(fetch-->0)this.stash.push(this.next());return this.stash[--n]},indexOfDelimiters:function(start,end){var str=this.input,nstart=0,nend=0,pos=0;for(var i=0,len=str.length;iindents)this.stash.push(this.tok("outdent")),this.indentStack.shift();tok=this.stash.pop()}else indents&&indents!=this.indentStack[0]?(this.indentStack.unshift(indents),tok=this.tok("indent",indents)):tok=this.tok("newline");return tok}},pipelessText:function(){if(this.pipeless){if("\n"==this.input[0])return;var i=this.input.indexOf("\n");-1==i&&(i=this.input.length);var str=this.input.substr(0,i);return this.consume(str.length),this.tok("text",str)}},colon:function(){return this.scan(/^: */,":")},advance:function(){return this.stashed()||this.next()},next:function(){return this.deferred()||this.blank()||this.eos()||this.pipelessText()||this.yield()||this.doctype()||this.interpolation()||this["case"]()||this.when()||this["default"]()||this["extends"]()||this.append()||this.prepend()||this.block()||this.include()||this.mixin()||this.call()||this.conditional()||this.each()||this["while"]()||this.assignment()||this.tag()||this.filter()||this.code()||this.id()||this.className()||this.attrs()||this.indent()||this.comment()||this.colon()||this.text()}}}),require.register("nodes/attrs.js",function(module,exports,require){var Node=require("./node"),Block=require("./block"),Attrs=module.exports=function Attrs(){this.attrs=[]};Attrs.prototype=new Node,Attrs.prototype.constructor=Attrs,Attrs.prototype.setAttribute=function(name,val,escaped){return this.attrs.push({name:name,val:val,escaped:escaped}),this},Attrs.prototype.removeAttribute=function(name){for(var i=0,len=this.attrs.length;i/g,">").replace(/"/g,""")},exports.rethrow=function rethrow(err,filename,lineno){if(!filename)throw err;var context=3,str=require("fs").readFileSync(filename,"utf8"),lines=str.split("\n"),start=Math.max(lineno-context,0),end=Math.min(lines.length,lineno+context),context=lines.slice(start,end).map(function(line,i){var curr=i+start+1;return(curr==lineno?" > ":" ")+curr+"| "+line}).join("\n");throw err.path=filename,err.message=(filename||"Jade")+":"+lineno+"\n"+context+"\n\n"+err.message,err}}),require.register("self-closing.js",function(module,exports,require){module.exports=["meta","img","link","input","source","area","base","col","br","hr"]}),require.register("utils.js",function(module,exports,require){var interpolate=exports.interpolate=function(str){return str.replace(/(_SLASH_)?([#!]){(.*?)}/g,function(str,escape,flag,code){return code=code.replace(/\\'/g,"'").replace(/_SLASH_/g,"\\"),escape?str.slice(7):"' + "+("!"==flag?"":"escape")+"((interp = "+code+") == null ? '' : interp) + '"})},escape=exports.escape=function(str){return str.replace(/'/g,"\\'")};exports.text=function(str){return interpolate(escape(str))},exports.merge=function(a,b){for(var key in b)a[key]=b[key];return a}}),window.jade=require("jade")})(); \ No newline at end of file diff --git a/node_modules/jade/lib/compiler.js b/node_modules/jade/lib/compiler.js deleted file mode 100644 index bb56142..0000000 --- a/node_modules/jade/lib/compiler.js +++ /dev/null @@ -1,655 +0,0 @@ - -/*! - * Jade - Compiler - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var nodes = require('./nodes') - , filters = require('./filters') - , doctypes = require('./doctypes') - , selfClosing = require('./self-closing') - , runtime = require('./runtime') - , utils = require('./utils'); - -// if browser -// -// if (!Object.keys) { -// Object.keys = function(obj){ -// var arr = []; -// for (var key in obj) { -// if (obj.hasOwnProperty(key)) { -// arr.push(key); -// } -// } -// return arr; -// } -// } -// -// if (!String.prototype.trimLeft) { -// String.prototype.trimLeft = function(){ -// return this.replace(/^\s+/, ''); -// } -// } -// -// end - - -/** - * Initialize `Compiler` with the given `node`. - * - * @param {Node} node - * @param {Object} options - * @api public - */ - -var Compiler = module.exports = function Compiler(node, options) { - this.options = options = options || {}; - this.node = node; - this.hasCompiledDoctype = false; - this.hasCompiledTag = false; - this.pp = options.pretty || false; - this.debug = false !== options.compileDebug; - this.indents = 0; - this.parentIndents = 0; - if (options.doctype) this.setDoctype(options.doctype); -}; - -/** - * Compiler prototype. - */ - -Compiler.prototype = { - - /** - * Compile parse tree to JavaScript. - * - * @api public - */ - - compile: function(){ - this.buf = ['var interp;']; - if (this.pp) this.buf.push("var __indent = [];"); - this.lastBufferedIdx = -1; - this.visit(this.node); - return this.buf.join('\n'); - }, - - /** - * Sets the default doctype `name`. Sets terse mode to `true` when - * html 5 is used, causing self-closing tags to end with ">" vs "/>", - * and boolean attributes are not mirrored. - * - * @param {string} name - * @api public - */ - - setDoctype: function(name){ - name = (name && name.toLowerCase()) || 'default'; - this.doctype = doctypes[name] || ''; - this.terse = this.doctype.toLowerCase() == ''; - this.xml = 0 == this.doctype.indexOf(' 1 && !escape && block.nodes[0].isText && block.nodes[1].isText) - this.prettyIndent(1, true); - - for (var i = 0; i < len; ++i) { - // Pretty print text - if (pp && i > 0 && !escape && block.nodes[i].isText && block.nodes[i-1].isText) - this.prettyIndent(1, false); - - this.visit(block.nodes[i]); - // Multiple text nodes are separated by newlines - if (block.nodes[i+1] && block.nodes[i].isText && block.nodes[i+1].isText) - this.buffer('\\n'); - } - }, - - /** - * Visit `doctype`. Sets terse mode to `true` when html 5 - * is used, causing self-closing tags to end with ">" vs "/>", - * and boolean attributes are not mirrored. - * - * @param {Doctype} doctype - * @api public - */ - - visitDoctype: function(doctype){ - if (doctype && (doctype.val || !this.doctype)) { - this.setDoctype(doctype.val || 'default'); - } - - if (this.doctype) this.buffer(this.doctype); - this.hasCompiledDoctype = true; - }, - - /** - * Visit `mixin`, generating a function that - * may be called within the template. - * - * @param {Mixin} mixin - * @api public - */ - - visitMixin: function(mixin){ - var name = mixin.name.replace(/-/g, '_') + '_mixin' - , args = mixin.args || '' - , block = mixin.block - , attrs = mixin.attrs - , pp = this.pp; - - if (mixin.call) { - if (pp) this.buf.push("__indent.push('" + Array(this.indents + 1).join(' ') + "');") - if (block || attrs.length) { - - this.buf.push(name + '.call({'); - - if (block) { - this.buf.push('block: function(){'); - - // Render block with no indents, dynamically added when rendered - this.parentIndents++; - var _indents = this.indents; - this.indents = 0; - this.visit(mixin.block); - this.indents = _indents; - this.parentIndents--; - - if (attrs.length) { - this.buf.push('},'); - } else { - this.buf.push('}'); - } - } - - if (attrs.length) { - var val = this.attrs(attrs); - if (val.inherits) { - this.buf.push('attributes: merge({' + val.buf - + '}, attributes), escaped: merge(' + val.escaped + ', escaped, true)'); - } else { - this.buf.push('attributes: {' + val.buf + '}, escaped: ' + val.escaped); - } - } - - if (args) { - this.buf.push('}, ' + args + ');'); - } else { - this.buf.push('});'); - } - - } else { - this.buf.push(name + '(' + args + ');'); - } - if (pp) this.buf.push("__indent.pop();") - } else { - this.buf.push('var ' + name + ' = function(' + args + '){'); - this.buf.push('var block = this.block, attributes = this.attributes || {}, escaped = this.escaped || {};'); - this.parentIndents++; - this.visit(block); - this.parentIndents--; - this.buf.push('};'); - } - }, - - /** - * Visit `tag` buffering tag markup, generating - * attributes, visiting the `tag`'s code and block. - * - * @param {Tag} tag - * @api public - */ - - visitTag: function(tag){ - this.indents++; - var name = tag.name - , pp = this.pp; - - if (tag.buffer) name = "' + (" + name + ") + '"; - - if (!this.hasCompiledTag) { - if (!this.hasCompiledDoctype && 'html' == name) { - this.visitDoctype(); - } - this.hasCompiledTag = true; - } - - // pretty print - if (pp && !tag.isInline()) - this.prettyIndent(0, true); - - if ((~selfClosing.indexOf(name) || tag.selfClosing) && !this.xml) { - this.buffer('<' + name); - this.visitAttributes(tag.attrs); - this.terse - ? this.buffer('>') - : this.buffer('/>'); - } else { - // Optimize attributes buffering - if (tag.attrs.length) { - this.buffer('<' + name); - if (tag.attrs.length) this.visitAttributes(tag.attrs); - this.buffer('>'); - } else { - this.buffer('<' + name + '>'); - } - if (tag.code) this.visitCode(tag.code); - this.escape = 'pre' == tag.name; - this.visit(tag.block); - - // pretty print - if (pp && !tag.isInline() && 'pre' != tag.name && !tag.canInline()) - this.prettyIndent(0, true); - - this.buffer(''); - } - this.indents--; - }, - - /** - * Visit `filter`, throwing when the filter does not exist. - * - * @param {Filter} filter - * @api public - */ - - visitFilter: function(filter){ - var fn = filters[filter.name]; - - // unknown filter - if (!fn) throw new Error('unknown filter ":' + filter.name + '"'); - - var text = filter.block.nodes.map( - function(node){ return node.val; } - ).join('\n'); - filter.attrs = filter.attrs || {}; - filter.attrs.filename = this.options.filename; - this.buffer(utils.text(fn(text, filter.attrs))); - }, - - /** - * Visit `text` node. - * - * @param {Text} text - * @api public - */ - - visitText: function(text){ - text = utils.text(text.val.replace(/\\/g, '_SLASH_')); - if (this.escape) text = escape(text); - text = text.replace(/_SLASH_/g, '\\\\'); - this.buffer(text); - }, - - /** - * Visit a `comment`, only buffering when the buffer flag is set. - * - * @param {Comment} comment - * @api public - */ - - visitComment: function(comment){ - if (!comment.buffer) return; - if (this.pp) this.prettyIndent(1, true); - this.buffer(''); - }, - - /** - * Visit a `BlockComment`. - * - * @param {Comment} comment - * @api public - */ - - visitBlockComment: function(comment){ - if (!comment.buffer) return; - if (0 == comment.val.trim().indexOf('if')) { - this.buffer(''); - } else { - this.buffer(''); - } - }, - - /** - * Visit `code`, respecting buffer / escape flags. - * If the code is followed by a block, wrap it in - * a self-calling function. - * - * @param {Code} code - * @api public - */ - - visitCode: function(code){ - // Wrap code blocks with {}. - // we only wrap unbuffered code blocks ATM - // since they are usually flow control - - // Buffer code - if (code.buffer) { - var val = code.val.trimLeft(); - this.buf.push('var __val__ = ' + val); - val = 'null == __val__ ? "" : __val__'; - if (code.escape) val = 'escape(' + val + ')'; - this.buf.push("buf.push(" + val + ");"); - } else { - this.buf.push(code.val); - } - - // Block support - if (code.block) { - if (!code.buffer) this.buf.push('{'); - this.visit(code.block); - if (!code.buffer) this.buf.push('}'); - } - }, - - /** - * Visit `each` block. - * - * @param {Each} each - * @api public - */ - - visitEach: function(each){ - this.buf.push('' - + '// iterate ' + each.obj + '\n' - + ';(function(){\n' - + ' if (\'number\' == typeof ' + each.obj + '.length) {\n'); - - if (each.alternative) { - this.buf.push(' if (' + each.obj + '.length) {'); - } - - this.buf.push('' - + ' for (var ' + each.key + ' = 0, $$l = ' + each.obj + '.length; ' + each.key + ' < $$l; ' + each.key + '++) {\n' - + ' var ' + each.val + ' = ' + each.obj + '[' + each.key + '];\n'); - - this.visit(each.block); - - this.buf.push(' }\n'); - - if (each.alternative) { - this.buf.push(' } else {'); - this.visit(each.alternative); - this.buf.push(' }'); - } - - this.buf.push('' - + ' } else {\n' - + ' var $$l = 0;\n' - + ' for (var ' + each.key + ' in ' + each.obj + ') {\n' - + ' $$l++;' - // if browser - // + ' if (' + each.obj + '.hasOwnProperty(' + each.key + ')){' - // end - + ' var ' + each.val + ' = ' + each.obj + '[' + each.key + '];\n'); - - this.visit(each.block); - - // if browser - // this.buf.push(' }\n'); - // end - - this.buf.push(' }\n'); - if (each.alternative) { - this.buf.push(' if ($$l === 0) {'); - this.visit(each.alternative); - this.buf.push(' }'); - } - this.buf.push(' }\n}).call(this);\n'); - }, - - /** - * Visit `attrs`. - * - * @param {Array} attrs - * @api public - */ - - visitAttributes: function(attrs){ - var val = this.attrs(attrs); - if (val.inherits) { - this.buf.push("buf.push(attrs(merge({ " + val.buf + - " }, attributes), merge(" + val.escaped + ", escaped, true)));"); - } else if (val.constant) { - eval('var buf={' + val.buf + '};'); - this.buffer(runtime.attrs(buf, JSON.parse(val.escaped)), true); - } else { - this.buf.push("buf.push(attrs({ " + val.buf + " }, " + val.escaped + "));"); - } - }, - - /** - * Compile attributes. - */ - - attrs: function(attrs){ - var buf = [] - , classes = [] - , escaped = {} - , constant = attrs.every(function(attr){ return isConstant(attr.val) }) - , inherits = false; - - if (this.terse) buf.push('terse: true'); - - attrs.forEach(function(attr){ - if (attr.name == 'attributes') return inherits = true; - escaped[attr.name] = attr.escaped; - if (attr.name == 'class') { - classes.push('(' + attr.val + ')'); - } else { - var pair = "'" + attr.name + "':(" + attr.val + ')'; - buf.push(pair); - } - }); - - if (classes.length) { - classes = classes.join(" + ' ' + "); - buf.push('"class": ' + classes); - } - - return { - buf: buf.join(', '), - escaped: JSON.stringify(escaped), - inherits: inherits, - constant: constant - }; - } -}; - -/** - * Check if expression can be evaluated to a constant - * - * @param {String} expression - * @return {Boolean} - * @api private - */ - -function isConstant(val){ - // Check strings/literals - if (/^ *("([^"\\]*(\\.[^"\\]*)*)"|'([^'\\]*(\\.[^'\\]*)*)'|true|false|null|undefined) *$/i.test(val)) - return true; - - // Check numbers - if (!isNaN(Number(val))) - return true; - - // Check arrays - var matches; - if (matches = /^ *\[(.*)\] *$/.exec(val)) - return matches[1].split(',').every(isConstant); - - return false; -} - -/** - * Escape the given string of `html`. - * - * @param {String} html - * @return {String} - * @api private - */ - -function escape(html){ - return String(html) - .replace(/&(?!\w+;)/g, '&') - .replace(//g, '>') - .replace(/"/g, '"'); -} diff --git a/node_modules/jade/lib/doctypes.js b/node_modules/jade/lib/doctypes.js deleted file mode 100644 index e87ca1e..0000000 --- a/node_modules/jade/lib/doctypes.js +++ /dev/null @@ -1,18 +0,0 @@ - -/*! - * Jade - doctypes - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -module.exports = { - '5': '' - , 'default': '' - , 'xml': '' - , 'transitional': '' - , 'strict': '' - , 'frameset': '' - , '1.1': '' - , 'basic': '' - , 'mobile': '' -}; \ No newline at end of file diff --git a/node_modules/jade/lib/filters.js b/node_modules/jade/lib/filters.js deleted file mode 100644 index d633559..0000000 --- a/node_modules/jade/lib/filters.js +++ /dev/null @@ -1,105 +0,0 @@ - -/*! - * Jade - filters - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Wrap text with CDATA block. - */ - -exports.cdata = function(str){ - return ''; -}; - -/** - * Wrap text in script tags. - */ - -exports.js = function(str){ - return ''; -}; - -/** - * Wrap text in style tags. - */ - -exports.css = function(str){ - return ''; -}; - -/** - * Transform stylus to css, wrapped in style tags. - */ - -exports.stylus = function(str, options){ - var ret; - str = str.replace(/\\n/g, '\n'); - var stylus = require('stylus'); - stylus(str, options).render(function(err, css){ - if (err) throw err; - ret = css.replace(/\n/g, '\\n'); - }); - return ''; -}; - -/** - * Transform less to css, wrapped in style tags. - */ - -exports.less = function(str){ - var ret; - str = str.replace(/\\n/g, '\n'); - require('less').render(str, function(err, css){ - if (err) throw err; - ret = ''; - }); - return ret; -}; - -/** - * Transform markdown to html. - */ - -exports.markdown = function(str){ - var md; - - // support markdown / discount - try { - md = require('markdown'); - } catch (err){ - try { - md = require('discount'); - } catch (err) { - try { - md = require('markdown-js'); - } catch (err) { - try { - md = require('marked'); - } catch (err) { - throw new - Error('Cannot find markdown library, install markdown, discount, or marked.'); - } - } - } - } - - str = str.replace(/\\n/g, '\n'); - return md.parse(str).replace(/\n/g, '\\n').replace(/'/g,'''); -}; - -/** - * Transform coffeescript to javascript. - */ - -exports.coffeescript = function(str){ - var js = require('coffee-script').compile(str).replace(/\\/g, '\\\\').replace(/\n/g, '\\n'); - return ''; -}; - -// aliases - -exports.md = exports.markdown; -exports.styl = exports.stylus; -exports.coffee = exports.coffeescript; diff --git a/node_modules/jade/lib/inline-tags.js b/node_modules/jade/lib/inline-tags.js deleted file mode 100644 index 491de0b..0000000 --- a/node_modules/jade/lib/inline-tags.js +++ /dev/null @@ -1,28 +0,0 @@ - -/*! - * Jade - inline tags - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -module.exports = [ - 'a' - , 'abbr' - , 'acronym' - , 'b' - , 'br' - , 'code' - , 'em' - , 'font' - , 'i' - , 'img' - , 'ins' - , 'kbd' - , 'map' - , 'samp' - , 'small' - , 'span' - , 'strong' - , 'sub' - , 'sup' -]; \ No newline at end of file diff --git a/node_modules/jade/lib/jade.js b/node_modules/jade/lib/jade.js deleted file mode 100644 index 09d61e6..0000000 --- a/node_modules/jade/lib/jade.js +++ /dev/null @@ -1,253 +0,0 @@ -/*! - * Jade - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Parser = require('./parser') - , Lexer = require('./lexer') - , Compiler = require('./compiler') - , runtime = require('./runtime') -// if node - , fs = require('fs'); -// end - -/** - * Library version. - */ - -exports.version = '0.28.0'; - -/** - * Expose self closing tags. - */ - -exports.selfClosing = require('./self-closing'); - -/** - * Default supported doctypes. - */ - -exports.doctypes = require('./doctypes'); - -/** - * Text filters. - */ - -exports.filters = require('./filters'); - -/** - * Utilities. - */ - -exports.utils = require('./utils'); - -/** - * Expose `Compiler`. - */ - -exports.Compiler = Compiler; - -/** - * Expose `Parser`. - */ - -exports.Parser = Parser; - -/** - * Expose `Lexer`. - */ - -exports.Lexer = Lexer; - -/** - * Nodes. - */ - -exports.nodes = require('./nodes'); - -/** - * Jade runtime helpers. - */ - -exports.runtime = runtime; - -/** - * Template function cache. - */ - -exports.cache = {}; - -/** - * Parse the given `str` of jade and return a function body. - * - * @param {String} str - * @param {Object} options - * @return {String} - * @api private - */ - -function parse(str, options){ - try { - // Parse - var parser = new Parser(str, options.filename, options); - - // Compile - var compiler = new (options.compiler || Compiler)(parser.parse(), options) - , js = compiler.compile(); - - // Debug compiler - if (options.debug) { - console.error('\nCompiled Function:\n\n\033[90m%s\033[0m', js.replace(/^/gm, ' ')); - } - - return '' - + 'var buf = [];\n' - + (options.self - ? 'var self = locals || {};\n' + js - : 'with (locals || {}) {\n' + js + '\n}\n') - + 'return buf.join("");'; - } catch (err) { - parser = parser.context(); - runtime.rethrow(err, parser.filename, parser.lexer.lineno); - } -} - -/** - * Strip any UTF-8 BOM off of the start of `str`, if it exists. - * - * @param {String} str - * @return {String} - * @api private - */ - -function stripBOM(str){ - return 0xFEFF == str.charCodeAt(0) - ? str.substring(1) - : str; -} - -/** - * Compile a `Function` representation of the given jade `str`. - * - * Options: - * - * - `compileDebug` when `false` debugging code is stripped from the compiled template - * - `client` when `true` the helper functions `escape()` etc will reference `jade.escape()` - * for use with the Jade client-side runtime.js - * - * @param {String} str - * @param {Options} options - * @return {Function} - * @api public - */ - -exports.compile = function(str, options){ - var options = options || {} - , client = options.client - , filename = options.filename - ? JSON.stringify(options.filename) - : 'undefined' - , fn; - - str = stripBOM(String(str)); - - if (options.compileDebug !== false) { - fn = [ - 'var __jade = [{ lineno: 1, filename: ' + filename + ' }];' - , 'try {' - , parse(str, options) - , '} catch (err) {' - , ' rethrow(err, __jade[0].filename, __jade[0].lineno);' - , '}' - ].join('\n'); - } else { - fn = parse(str, options); - } - - if (client) { - fn = 'attrs = attrs || jade.attrs; escape = escape || jade.escape; rethrow = rethrow || jade.rethrow; merge = merge || jade.merge;\n' + fn; - } - - fn = new Function('locals, attrs, escape, rethrow, merge', fn); - - if (client) return fn; - - return function(locals){ - return fn(locals, runtime.attrs, runtime.escape, runtime.rethrow, runtime.merge); - }; -}; - -/** - * Render the given `str` of jade and invoke - * the callback `fn(err, str)`. - * - * Options: - * - * - `cache` enable template caching - * - `filename` filename required for `include` / `extends` and caching - * - * @param {String} str - * @param {Object|Function} options or fn - * @param {Function} fn - * @api public - */ - -exports.render = function(str, options, fn){ - // swap args - if ('function' == typeof options) { - fn = options, options = {}; - } - - // cache requires .filename - if (options.cache && !options.filename) { - return fn(new Error('the "filename" option is required for caching')); - } - - try { - var path = options.filename; - var tmpl = options.cache - ? exports.cache[path] || (exports.cache[path] = exports.compile(str, options)) - : exports.compile(str, options); - fn(null, tmpl(options)); - } catch (err) { - fn(err); - } -}; - -/** - * Render a Jade file at the given `path` and callback `fn(err, str)`. - * - * @param {String} path - * @param {Object|Function} options or callback - * @param {Function} fn - * @api public - */ - -exports.renderFile = function(path, options, fn){ - var key = path + ':string'; - - if ('function' == typeof options) { - fn = options, options = {}; - } - - try { - options.filename = path; - var str = options.cache - ? exports.cache[key] || (exports.cache[key] = fs.readFileSync(path, 'utf8')) - : fs.readFileSync(path, 'utf8'); - exports.render(str, options, fn); - } catch (err) { - fn(err); - } -}; - -/** - * Express support. - */ - -exports.__express = exports.renderFile; diff --git a/node_modules/jade/lib/lexer.js b/node_modules/jade/lib/lexer.js deleted file mode 100644 index 1e0bfff..0000000 --- a/node_modules/jade/lib/lexer.js +++ /dev/null @@ -1,775 +0,0 @@ -/*! - * Jade - Lexer - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -var utils = require('./utils'); - -/** - * Initialize `Lexer` with the given `str`. - * - * Options: - * - * - `colons` allow colons for attr delimiters - * - * @param {String} str - * @param {Object} options - * @api private - */ - -var Lexer = module.exports = function Lexer(str, options) { - options = options || {}; - this.input = str.replace(/\r\n|\r/g, '\n'); - this.colons = options.colons; - this.deferredTokens = []; - this.lastIndents = 0; - this.lineno = 1; - this.stash = []; - this.indentStack = []; - this.indentRe = null; - this.pipeless = false; -}; - -/** - * Lexer prototype. - */ - -Lexer.prototype = { - - /** - * Construct a token with the given `type` and `val`. - * - * @param {String} type - * @param {String} val - * @return {Object} - * @api private - */ - - tok: function(type, val){ - return { - type: type - , line: this.lineno - , val: val - } - }, - - /** - * Consume the given `len` of input. - * - * @param {Number} len - * @api private - */ - - consume: function(len){ - this.input = this.input.substr(len); - }, - - /** - * Scan for `type` with the given `regexp`. - * - * @param {String} type - * @param {RegExp} regexp - * @return {Object} - * @api private - */ - - scan: function(regexp, type){ - var captures; - if (captures = regexp.exec(this.input)) { - this.consume(captures[0].length); - return this.tok(type, captures[1]); - } - }, - - /** - * Defer the given `tok`. - * - * @param {Object} tok - * @api private - */ - - defer: function(tok){ - this.deferredTokens.push(tok); - }, - - /** - * Lookahead `n` tokens. - * - * @param {Number} n - * @return {Object} - * @api private - */ - - lookahead: function(n){ - var fetch = n - this.stash.length; - while (fetch-- > 0) this.stash.push(this.next()); - return this.stash[--n]; - }, - - /** - * Return the indexOf `start` / `end` delimiters. - * - * @param {String} start - * @param {String} end - * @return {Number} - * @api private - */ - - indexOfDelimiters: function(start, end){ - var str = this.input - , nstart = 0 - , nend = 0 - , pos = 0; - for (var i = 0, len = str.length; i < len; ++i) { - if (start == str.charAt(i)) { - ++nstart; - } else if (end == str.charAt(i)) { - if (++nend == nstart) { - pos = i; - break; - } - } - } - return pos; - }, - - /** - * Stashed token. - */ - - stashed: function() { - return this.stash.length - && this.stash.shift(); - }, - - /** - * Deferred token. - */ - - deferred: function() { - return this.deferredTokens.length - && this.deferredTokens.shift(); - }, - - /** - * end-of-source. - */ - - eos: function() { - if (this.input.length) return; - if (this.indentStack.length) { - this.indentStack.shift(); - return this.tok('outdent'); - } else { - return this.tok('eos'); - } - }, - - /** - * Blank line. - */ - - blank: function() { - var captures; - if (captures = /^\n *\n/.exec(this.input)) { - this.consume(captures[0].length - 1); - ++this.lineno; - if (this.pipeless) return this.tok('text', ''); - return this.next(); - } - }, - - /** - * Comment. - */ - - comment: function() { - var captures; - if (captures = /^ *\/\/(-)?([^\n]*)/.exec(this.input)) { - this.consume(captures[0].length); - var tok = this.tok('comment', captures[2]); - tok.buffer = '-' != captures[1]; - return tok; - } - }, - - /** - * Interpolated tag. - */ - - interpolation: function() { - var captures; - if (captures = /^#\{(.*?)\}/.exec(this.input)) { - this.consume(captures[0].length); - return this.tok('interpolation', captures[1]); - } - }, - - /** - * Tag. - */ - - tag: function() { - var captures; - if (captures = /^(\w[-:\w]*)(\/?)/.exec(this.input)) { - this.consume(captures[0].length); - var tok, name = captures[1]; - if (':' == name[name.length - 1]) { - name = name.slice(0, -1); - tok = this.tok('tag', name); - this.defer(this.tok(':')); - while (' ' == this.input[0]) this.input = this.input.substr(1); - } else { - tok = this.tok('tag', name); - } - tok.selfClosing = !! captures[2]; - return tok; - } - }, - - /** - * Filter. - */ - - filter: function() { - return this.scan(/^:(\w+)/, 'filter'); - }, - - /** - * Doctype. - */ - - doctype: function() { - return this.scan(/^(?:!!!|doctype) *([^\n]+)?/, 'doctype'); - }, - - /** - * Id. - */ - - id: function() { - return this.scan(/^#([\w-]+)/, 'id'); - }, - - /** - * Class. - */ - - className: function() { - return this.scan(/^\.([\w-]+)/, 'class'); - }, - - /** - * Text. - */ - - text: function() { - return this.scan(/^(?:\| ?| ?)?([^\n]+)/, 'text'); - }, - - /** - * Extends. - */ - - "extends": function() { - return this.scan(/^extends? +([^\n]+)/, 'extends'); - }, - - /** - * Block prepend. - */ - - prepend: function() { - var captures; - if (captures = /^prepend +([^\n]+)/.exec(this.input)) { - this.consume(captures[0].length); - var mode = 'prepend' - , name = captures[1] - , tok = this.tok('block', name); - tok.mode = mode; - return tok; - } - }, - - /** - * Block append. - */ - - append: function() { - var captures; - if (captures = /^append +([^\n]+)/.exec(this.input)) { - this.consume(captures[0].length); - var mode = 'append' - , name = captures[1] - , tok = this.tok('block', name); - tok.mode = mode; - return tok; - } - }, - - /** - * Block. - */ - - block: function() { - var captures; - if (captures = /^block\b *(?:(prepend|append) +)?([^\n]*)/.exec(this.input)) { - this.consume(captures[0].length); - var mode = captures[1] || 'replace' - , name = captures[2] - , tok = this.tok('block', name); - - tok.mode = mode; - return tok; - } - }, - - /** - * Yield. - */ - - yield: function() { - return this.scan(/^yield */, 'yield'); - }, - - /** - * Include. - */ - - include: function() { - return this.scan(/^include +([^\n]+)/, 'include'); - }, - - /** - * Case. - */ - - "case": function() { - return this.scan(/^case +([^\n]+)/, 'case'); - }, - - /** - * When. - */ - - when: function() { - return this.scan(/^when +([^:\n]+)/, 'when'); - }, - - /** - * Default. - */ - - "default": function() { - return this.scan(/^default */, 'default'); - }, - - /** - * Assignment. - */ - - assignment: function() { - var captures; - if (captures = /^(\w+) += *([^;\n]+)( *;? *)/.exec(this.input)) { - this.consume(captures[0].length); - var name = captures[1] - , val = captures[2]; - return this.tok('code', 'var ' + name + ' = (' + val + ');'); - } - }, - - /** - * Call mixin. - */ - - call: function(){ - var captures; - if (captures = /^\+([-\w]+)/.exec(this.input)) { - this.consume(captures[0].length); - var tok = this.tok('call', captures[1]); - - // Check for args (not attributes) - if (captures = /^ *\((.*?)\)/.exec(this.input)) { - if (!/^ *[-\w]+ *=/.test(captures[1])) { - this.consume(captures[0].length); - tok.args = captures[1]; - } - } - - return tok; - } - }, - - /** - * Mixin. - */ - - mixin: function(){ - var captures; - if (captures = /^mixin +([-\w]+)(?: *\((.*)\))?/.exec(this.input)) { - this.consume(captures[0].length); - var tok = this.tok('mixin', captures[1]); - tok.args = captures[2]; - return tok; - } - }, - - /** - * Conditional. - */ - - conditional: function() { - var captures; - if (captures = /^(if|unless|else if|else)\b([^\n]*)/.exec(this.input)) { - this.consume(captures[0].length); - var type = captures[1] - , js = captures[2]; - - switch (type) { - case 'if': js = 'if (' + js + ')'; break; - case 'unless': js = 'if (!(' + js + '))'; break; - case 'else if': js = 'else if (' + js + ')'; break; - case 'else': js = 'else'; break; - } - - return this.tok('code', js); - } - }, - - /** - * While. - */ - - "while": function() { - var captures; - if (captures = /^while +([^\n]+)/.exec(this.input)) { - this.consume(captures[0].length); - return this.tok('code', 'while (' + captures[1] + ')'); - } - }, - - /** - * Each. - */ - - each: function() { - var captures; - if (captures = /^(?:- *)?(?:each|for) +(\w+)(?: *, *(\w+))? * in *([^\n]+)/.exec(this.input)) { - this.consume(captures[0].length); - var tok = this.tok('each', captures[1]); - tok.key = captures[2] || '$index'; - tok.code = captures[3]; - return tok; - } - }, - - /** - * Code. - */ - - code: function() { - var captures; - if (captures = /^(!?=|-)([^\n]+)/.exec(this.input)) { - this.consume(captures[0].length); - var flags = captures[1]; - captures[1] = captures[2]; - var tok = this.tok('code', captures[1]); - tok.escape = flags.charAt(0) === '='; - tok.buffer = flags.charAt(0) === '=' || flags.charAt(1) === '='; - return tok; - } - }, - - /** - * Attributes. - */ - - attrs: function() { - if ('(' == this.input.charAt(0)) { - var index = this.indexOfDelimiters('(', ')') - , str = this.input.substr(1, index-1) - , tok = this.tok('attrs') - , len = str.length - , colons = this.colons - , states = ['key'] - , escapedAttr - , key = '' - , val = '' - , quote - , c - , p; - - function state(){ - return states[states.length - 1]; - } - - function interpolate(attr) { - return attr.replace(/(\\)?#\{([^}]+)\}/g, function(_, escape, expr){ - return escape - ? _ - : quote + " + (" + expr + ") + " + quote; - }); - } - - this.consume(index + 1); - tok.attrs = {}; - tok.escaped = {}; - - function parse(c) { - var real = c; - // TODO: remove when people fix ":" - if (colons && ':' == c) c = '='; - switch (c) { - case ',': - case '\n': - switch (state()) { - case 'expr': - case 'array': - case 'string': - case 'object': - val += c; - break; - default: - states.push('key'); - val = val.trim(); - key = key.trim(); - if ('' == key) return; - key = key.replace(/^['"]|['"]$/g, '').replace('!', ''); - tok.escaped[key] = escapedAttr; - tok.attrs[key] = '' == val - ? true - : interpolate(val); - key = val = ''; - } - break; - case '=': - switch (state()) { - case 'key char': - key += real; - break; - case 'val': - case 'expr': - case 'array': - case 'string': - case 'object': - val += real; - break; - default: - escapedAttr = '!' != p; - states.push('val'); - } - break; - case '(': - if ('val' == state() - || 'expr' == state()) states.push('expr'); - val += c; - break; - case ')': - if ('expr' == state() - || 'val' == state()) states.pop(); - val += c; - break; - case '{': - if ('val' == state()) states.push('object'); - val += c; - break; - case '}': - if ('object' == state()) states.pop(); - val += c; - break; - case '[': - if ('val' == state()) states.push('array'); - val += c; - break; - case ']': - if ('array' == state()) states.pop(); - val += c; - break; - case '"': - case "'": - switch (state()) { - case 'key': - states.push('key char'); - break; - case 'key char': - states.pop(); - break; - case 'string': - if (c == quote) states.pop(); - val += c; - break; - default: - states.push('string'); - val += c; - quote = c; - } - break; - case '': - break; - default: - switch (state()) { - case 'key': - case 'key char': - key += c; - break; - default: - val += c; - } - } - p = c; - } - - for (var i = 0; i < len; ++i) { - parse(str.charAt(i)); - } - - parse(','); - - if ('/' == this.input.charAt(0)) { - this.consume(1); - tok.selfClosing = true; - } - - return tok; - } - }, - - /** - * Indent | Outdent | Newline. - */ - - indent: function() { - var captures, re; - - // established regexp - if (this.indentRe) { - captures = this.indentRe.exec(this.input); - // determine regexp - } else { - // tabs - re = /^\n(\t*) */; - captures = re.exec(this.input); - - // spaces - if (captures && !captures[1].length) { - re = /^\n( *)/; - captures = re.exec(this.input); - } - - // established - if (captures && captures[1].length) this.indentRe = re; - } - - if (captures) { - var tok - , indents = captures[1].length; - - ++this.lineno; - this.consume(indents + 1); - - if (' ' == this.input[0] || '\t' == this.input[0]) { - throw new Error('Invalid indentation, you can use tabs or spaces but not both'); - } - - // blank line - if ('\n' == this.input[0]) return this.tok('newline'); - - // outdent - if (this.indentStack.length && indents < this.indentStack[0]) { - while (this.indentStack.length && this.indentStack[0] > indents) { - this.stash.push(this.tok('outdent')); - this.indentStack.shift(); - } - tok = this.stash.pop(); - // indent - } else if (indents && indents != this.indentStack[0]) { - this.indentStack.unshift(indents); - tok = this.tok('indent', indents); - // newline - } else { - tok = this.tok('newline'); - } - - return tok; - } - }, - - /** - * Pipe-less text consumed only when - * pipeless is true; - */ - - pipelessText: function() { - if (this.pipeless) { - if ('\n' == this.input[0]) return; - var i = this.input.indexOf('\n'); - if (-1 == i) i = this.input.length; - var str = this.input.substr(0, i); - this.consume(str.length); - return this.tok('text', str); - } - }, - - /** - * ':' - */ - - colon: function() { - return this.scan(/^: */, ':'); - }, - - /** - * Return the next token object, or those - * previously stashed by lookahead. - * - * @return {Object} - * @api private - */ - - advance: function(){ - return this.stashed() - || this.next(); - }, - - /** - * Return the next token object. - * - * @return {Object} - * @api private - */ - - next: function() { - return this.deferred() - || this.blank() - || this.eos() - || this.pipelessText() - || this.yield() - || this.doctype() - || this.interpolation() - || this["case"]() - || this.when() - || this["default"]() - || this["extends"]() - || this.append() - || this.prepend() - || this.block() - || this.include() - || this.mixin() - || this.call() - || this.conditional() - || this.each() - || this["while"]() - || this.assignment() - || this.tag() - || this.filter() - || this.code() - || this.id() - || this.className() - || this.attrs() - || this.indent() - || this.comment() - || this.colon() - || this.text(); - } -}; diff --git a/node_modules/jade/lib/nodes/attrs.js b/node_modules/jade/lib/nodes/attrs.js deleted file mode 100644 index 5de9b59..0000000 --- a/node_modules/jade/lib/nodes/attrs.js +++ /dev/null @@ -1,77 +0,0 @@ - -/*! - * Jade - nodes - Attrs - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node'), - Block = require('./block'); - -/** - * Initialize a `Attrs` node. - * - * @api public - */ - -var Attrs = module.exports = function Attrs() { - this.attrs = []; -}; - -/** - * Inherit from `Node`. - */ - -Attrs.prototype.__proto__ = Node.prototype; - -/** - * Set attribute `name` to `val`, keep in mind these become - * part of a raw js object literal, so to quote a value you must - * '"quote me"', otherwise or example 'user.name' is literal JavaScript. - * - * @param {String} name - * @param {String} val - * @param {Boolean} escaped - * @return {Tag} for chaining - * @api public - */ - -Attrs.prototype.setAttribute = function(name, val, escaped){ - this.attrs.push({ name: name, val: val, escaped: escaped }); - return this; -}; - -/** - * Remove attribute `name` when present. - * - * @param {String} name - * @api public - */ - -Attrs.prototype.removeAttribute = function(name){ - for (var i = 0, len = this.attrs.length; i < len; ++i) { - if (this.attrs[i] && this.attrs[i].name == name) { - delete this.attrs[i]; - } - } -}; - -/** - * Get attribute value by `name`. - * - * @param {String} name - * @return {String} - * @api public - */ - -Attrs.prototype.getAttribute = function(name){ - for (var i = 0, len = this.attrs.length; i < len; ++i) { - if (this.attrs[i] && this.attrs[i].name == name) { - return this.attrs[i].val; - } - } -}; diff --git a/node_modules/jade/lib/nodes/block-comment.js b/node_modules/jade/lib/nodes/block-comment.js deleted file mode 100644 index 4f41e4a..0000000 --- a/node_modules/jade/lib/nodes/block-comment.js +++ /dev/null @@ -1,33 +0,0 @@ - -/*! - * Jade - nodes - BlockComment - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node'); - -/** - * Initialize a `BlockComment` with the given `block`. - * - * @param {String} val - * @param {Block} block - * @param {Boolean} buffer - * @api public - */ - -var BlockComment = module.exports = function BlockComment(val, block, buffer) { - this.block = block; - this.val = val; - this.buffer = buffer; -}; - -/** - * Inherit from `Node`. - */ - -BlockComment.prototype.__proto__ = Node.prototype; \ No newline at end of file diff --git a/node_modules/jade/lib/nodes/block.js b/node_modules/jade/lib/nodes/block.js deleted file mode 100644 index 6bb18c9..0000000 --- a/node_modules/jade/lib/nodes/block.js +++ /dev/null @@ -1,122 +0,0 @@ - -/*! - * Jade - nodes - Block - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node'); - -/** - * Initialize a new `Block` with an optional `node`. - * - * @param {Node} node - * @api public - */ - -var Block = module.exports = function Block(node){ - this.nodes = []; - if (node) this.push(node); -}; - -/** - * Inherit from `Node`. - */ - -Block.prototype.__proto__ = Node.prototype; - -/** - * Block flag. - */ - -Block.prototype.isBlock = true; - -/** - * Replace the nodes in `other` with the nodes - * in `this` block. - * - * @param {Block} other - * @api private - */ - -Block.prototype.replace = function(other){ - other.nodes = this.nodes; -}; - -/** - * Pust the given `node`. - * - * @param {Node} node - * @return {Number} - * @api public - */ - -Block.prototype.push = function(node){ - return this.nodes.push(node); -}; - -/** - * Check if this block is empty. - * - * @return {Boolean} - * @api public - */ - -Block.prototype.isEmpty = function(){ - return 0 == this.nodes.length; -}; - -/** - * Unshift the given `node`. - * - * @param {Node} node - * @return {Number} - * @api public - */ - -Block.prototype.unshift = function(node){ - return this.nodes.unshift(node); -}; - -/** - * Return the "last" block, or the first `yield` node. - * - * @return {Block} - * @api private - */ - -Block.prototype.includeBlock = function(){ - var ret = this - , node; - - for (var i = 0, len = this.nodes.length; i < len; ++i) { - node = this.nodes[i]; - if (node.yield) return node; - else if (node.textOnly) continue; - else if (node.includeBlock) ret = node.includeBlock(); - else if (node.block && !node.block.isEmpty()) ret = node.block.includeBlock(); - if (ret.yield) return ret; - } - - return ret; -}; - -/** - * Return a clone of this block. - * - * @return {Block} - * @api private - */ - -Block.prototype.clone = function(){ - var clone = new Block; - for (var i = 0, len = this.nodes.length; i < len; ++i) { - clone.push(this.nodes[i].clone()); - } - return clone; -}; - diff --git a/node_modules/jade/lib/nodes/case.js b/node_modules/jade/lib/nodes/case.js deleted file mode 100644 index 08ff033..0000000 --- a/node_modules/jade/lib/nodes/case.js +++ /dev/null @@ -1,43 +0,0 @@ - -/*! - * Jade - nodes - Case - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node'); - -/** - * Initialize a new `Case` with `expr`. - * - * @param {String} expr - * @api public - */ - -var Case = exports = module.exports = function Case(expr, block){ - this.expr = expr; - this.block = block; -}; - -/** - * Inherit from `Node`. - */ - -Case.prototype.__proto__ = Node.prototype; - -var When = exports.When = function When(expr, block){ - this.expr = expr; - this.block = block; - this.debug = false; -}; - -/** - * Inherit from `Node`. - */ - -When.prototype.__proto__ = Node.prototype; - diff --git a/node_modules/jade/lib/nodes/code.js b/node_modules/jade/lib/nodes/code.js deleted file mode 100644 index babc675..0000000 --- a/node_modules/jade/lib/nodes/code.js +++ /dev/null @@ -1,35 +0,0 @@ - -/*! - * Jade - nodes - Code - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node'); - -/** - * Initialize a `Code` node with the given code `val`. - * Code may also be optionally buffered and escaped. - * - * @param {String} val - * @param {Boolean} buffer - * @param {Boolean} escape - * @api public - */ - -var Code = module.exports = function Code(val, buffer, escape) { - this.val = val; - this.buffer = buffer; - this.escape = escape; - if (val.match(/^ *else/)) this.debug = false; -}; - -/** - * Inherit from `Node`. - */ - -Code.prototype.__proto__ = Node.prototype; \ No newline at end of file diff --git a/node_modules/jade/lib/nodes/comment.js b/node_modules/jade/lib/nodes/comment.js deleted file mode 100644 index 2e1469e..0000000 --- a/node_modules/jade/lib/nodes/comment.js +++ /dev/null @@ -1,32 +0,0 @@ - -/*! - * Jade - nodes - Comment - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node'); - -/** - * Initialize a `Comment` with the given `val`, optionally `buffer`, - * otherwise the comment may render in the output. - * - * @param {String} val - * @param {Boolean} buffer - * @api public - */ - -var Comment = module.exports = function Comment(val, buffer) { - this.val = val; - this.buffer = buffer; -}; - -/** - * Inherit from `Node`. - */ - -Comment.prototype.__proto__ = Node.prototype; \ No newline at end of file diff --git a/node_modules/jade/lib/nodes/doctype.js b/node_modules/jade/lib/nodes/doctype.js deleted file mode 100644 index b8f33e5..0000000 --- a/node_modules/jade/lib/nodes/doctype.js +++ /dev/null @@ -1,29 +0,0 @@ - -/*! - * Jade - nodes - Doctype - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node'); - -/** - * Initialize a `Doctype` with the given `val`. - * - * @param {String} val - * @api public - */ - -var Doctype = module.exports = function Doctype(val) { - this.val = val; -}; - -/** - * Inherit from `Node`. - */ - -Doctype.prototype.__proto__ = Node.prototype; \ No newline at end of file diff --git a/node_modules/jade/lib/nodes/each.js b/node_modules/jade/lib/nodes/each.js deleted file mode 100644 index f54101f..0000000 --- a/node_modules/jade/lib/nodes/each.js +++ /dev/null @@ -1,35 +0,0 @@ - -/*! - * Jade - nodes - Each - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node'); - -/** - * Initialize an `Each` node, representing iteration - * - * @param {String} obj - * @param {String} val - * @param {String} key - * @param {Block} block - * @api public - */ - -var Each = module.exports = function Each(obj, val, key, block) { - this.obj = obj; - this.val = val; - this.key = key; - this.block = block; -}; - -/** - * Inherit from `Node`. - */ - -Each.prototype.__proto__ = Node.prototype; \ No newline at end of file diff --git a/node_modules/jade/lib/nodes/filter.js b/node_modules/jade/lib/nodes/filter.js deleted file mode 100644 index 0d7ff6e..0000000 --- a/node_modules/jade/lib/nodes/filter.js +++ /dev/null @@ -1,34 +0,0 @@ - -/*! - * Jade - nodes - Filter - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node') - , Block = require('./block'); - -/** - * Initialize a `Filter` node with the given - * filter `name` and `block`. - * - * @param {String} name - * @param {Block|Node} block - * @api public - */ - -var Filter = module.exports = function Filter(name, block, attrs) { - this.name = name; - this.block = block; - this.attrs = attrs; -}; - -/** - * Inherit from `Node`. - */ - -Filter.prototype.__proto__ = Node.prototype; \ No newline at end of file diff --git a/node_modules/jade/lib/nodes/index.js b/node_modules/jade/lib/nodes/index.js deleted file mode 100644 index 386ad2f..0000000 --- a/node_modules/jade/lib/nodes/index.js +++ /dev/null @@ -1,20 +0,0 @@ - -/*! - * Jade - nodes - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -exports.Node = require('./node'); -exports.Tag = require('./tag'); -exports.Code = require('./code'); -exports.Each = require('./each'); -exports.Case = require('./case'); -exports.Text = require('./text'); -exports.Block = require('./block'); -exports.Mixin = require('./mixin'); -exports.Filter = require('./filter'); -exports.Comment = require('./comment'); -exports.Literal = require('./literal'); -exports.BlockComment = require('./block-comment'); -exports.Doctype = require('./doctype'); diff --git a/node_modules/jade/lib/nodes/literal.js b/node_modules/jade/lib/nodes/literal.js deleted file mode 100644 index fde586b..0000000 --- a/node_modules/jade/lib/nodes/literal.js +++ /dev/null @@ -1,32 +0,0 @@ - -/*! - * Jade - nodes - Literal - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node'); - -/** - * Initialize a `Literal` node with the given `str. - * - * @param {String} str - * @api public - */ - -var Literal = module.exports = function Literal(str) { - this.str = str - .replace(/\\/g, "\\\\") - .replace(/\n|\r\n/g, "\\n") - .replace(/'/g, "\\'"); -}; - -/** - * Inherit from `Node`. - */ - -Literal.prototype.__proto__ = Node.prototype; diff --git a/node_modules/jade/lib/nodes/mixin.js b/node_modules/jade/lib/nodes/mixin.js deleted file mode 100644 index 8407bc7..0000000 --- a/node_modules/jade/lib/nodes/mixin.js +++ /dev/null @@ -1,36 +0,0 @@ - -/*! - * Jade - nodes - Mixin - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Attrs = require('./attrs'); - -/** - * Initialize a new `Mixin` with `name` and `block`. - * - * @param {String} name - * @param {String} args - * @param {Block} block - * @api public - */ - -var Mixin = module.exports = function Mixin(name, args, block, call){ - this.name = name; - this.args = args; - this.block = block; - this.attrs = []; - this.call = call; -}; - -/** - * Inherit from `Attrs`. - */ - -Mixin.prototype.__proto__ = Attrs.prototype; - diff --git a/node_modules/jade/lib/nodes/node.js b/node_modules/jade/lib/nodes/node.js deleted file mode 100644 index e98f042..0000000 --- a/node_modules/jade/lib/nodes/node.js +++ /dev/null @@ -1,25 +0,0 @@ - -/*! - * Jade - nodes - Node - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Initialize a `Node`. - * - * @api public - */ - -var Node = module.exports = function Node(){}; - -/** - * Clone this node (return itself) - * - * @return {Node} - * @api private - */ - -Node.prototype.clone = function(){ - return this; -}; diff --git a/node_modules/jade/lib/nodes/tag.js b/node_modules/jade/lib/nodes/tag.js deleted file mode 100644 index 4b6728a..0000000 --- a/node_modules/jade/lib/nodes/tag.js +++ /dev/null @@ -1,95 +0,0 @@ - -/*! - * Jade - nodes - Tag - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Attrs = require('./attrs'), - Block = require('./block'), - inlineTags = require('../inline-tags'); - -/** - * Initialize a `Tag` node with the given tag `name` and optional `block`. - * - * @param {String} name - * @param {Block} block - * @api public - */ - -var Tag = module.exports = function Tag(name, block) { - this.name = name; - this.attrs = []; - this.block = block || new Block; -}; - -/** - * Inherit from `Attrs`. - */ - -Tag.prototype.__proto__ = Attrs.prototype; - -/** - * Clone this tag. - * - * @return {Tag} - * @api private - */ - -Tag.prototype.clone = function(){ - var clone = new Tag(this.name, this.block.clone()); - clone.line = this.line; - clone.attrs = this.attrs; - clone.textOnly = this.textOnly; - return clone; -}; - -/** - * Check if this tag is an inline tag. - * - * @return {Boolean} - * @api private - */ - -Tag.prototype.isInline = function(){ - return ~inlineTags.indexOf(this.name); -}; - -/** - * Check if this tag's contents can be inlined. Used for pretty printing. - * - * @return {Boolean} - * @api private - */ - -Tag.prototype.canInline = function(){ - var nodes = this.block.nodes; - - function isInline(node){ - // Recurse if the node is a block - if (node.isBlock) return node.nodes.every(isInline); - return node.isText || (node.isInline && node.isInline()); - } - - // Empty tag - if (!nodes.length) return true; - - // Text-only or inline-only tag - if (1 == nodes.length) return isInline(nodes[0]); - - // Multi-line inline-only tag - if (this.block.nodes.every(isInline)) { - for (var i = 1, len = nodes.length; i < len; ++i) { - if (nodes[i-1].isText && nodes[i].isText) - return false; - } - return true; - } - - // Mixed tag - return false; -}; \ No newline at end of file diff --git a/node_modules/jade/lib/nodes/text.js b/node_modules/jade/lib/nodes/text.js deleted file mode 100644 index 3b5dd55..0000000 --- a/node_modules/jade/lib/nodes/text.js +++ /dev/null @@ -1,36 +0,0 @@ - -/*! - * Jade - nodes - Text - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Node = require('./node'); - -/** - * Initialize a `Text` node with optional `line`. - * - * @param {String} line - * @api public - */ - -var Text = module.exports = function Text(line) { - this.val = ''; - if ('string' == typeof line) this.val = line; -}; - -/** - * Inherit from `Node`. - */ - -Text.prototype.__proto__ = Node.prototype; - -/** - * Flag as text. - */ - -Text.prototype.isText = true; \ No newline at end of file diff --git a/node_modules/jade/lib/parser.js b/node_modules/jade/lib/parser.js deleted file mode 100644 index 5039c90..0000000 --- a/node_modules/jade/lib/parser.js +++ /dev/null @@ -1,699 +0,0 @@ - -/*! - * Jade - Parser - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var Lexer = require('./lexer') - , nodes = require('./nodes') - , utils = require('./utils') - , filters = require('./filters') - , path = require('path') - , extname = path.extname; - -/** - * Initialize `Parser` with the given input `str` and `filename`. - * - * @param {String} str - * @param {String} filename - * @param {Object} options - * @api public - */ - -var Parser = exports = module.exports = function Parser(str, filename, options){ - this.input = str; - this.lexer = new Lexer(str, options); - this.filename = filename; - this.blocks = {}; - this.mixins = {}; - this.options = options; - this.contexts = [this]; -}; - -/** - * Tags that may not contain tags. - */ - -var textOnly = exports.textOnly = ['script', 'style']; - -/** - * Parser prototype. - */ - -Parser.prototype = { - - /** - * Push `parser` onto the context stack, - * or pop and return a `Parser`. - */ - - context: function(parser){ - if (parser) { - this.contexts.push(parser); - } else { - return this.contexts.pop(); - } - }, - - /** - * Return the next token object. - * - * @return {Object} - * @api private - */ - - advance: function(){ - return this.lexer.advance(); - }, - - /** - * Skip `n` tokens. - * - * @param {Number} n - * @api private - */ - - skip: function(n){ - while (n--) this.advance(); - }, - - /** - * Single token lookahead. - * - * @return {Object} - * @api private - */ - - peek: function() { - return this.lookahead(1); - }, - - /** - * Return lexer lineno. - * - * @return {Number} - * @api private - */ - - line: function() { - return this.lexer.lineno; - }, - - /** - * `n` token lookahead. - * - * @param {Number} n - * @return {Object} - * @api private - */ - - lookahead: function(n){ - return this.lexer.lookahead(n); - }, - - /** - * Parse input returning a string of js for evaluation. - * - * @return {String} - * @api public - */ - - parse: function(){ - var block = new nodes.Block, parser; - block.line = this.line(); - - while ('eos' != this.peek().type) { - if ('newline' == this.peek().type) { - this.advance(); - } else { - block.push(this.parseExpr()); - } - } - - if (parser = this.extending) { - this.context(parser); - var ast = parser.parse(); - this.context(); - // hoist mixins - for (var name in this.mixins) - ast.unshift(this.mixins[name]); - return ast; - } - - return block; - }, - - /** - * Expect the given type, or throw an exception. - * - * @param {String} type - * @api private - */ - - expect: function(type){ - if (this.peek().type === type) { - return this.advance(); - } else { - throw new Error('expected "' + type + '", but got "' + this.peek().type + '"'); - } - }, - - /** - * Accept the given `type`. - * - * @param {String} type - * @api private - */ - - accept: function(type){ - if (this.peek().type === type) { - return this.advance(); - } - }, - - /** - * tag - * | doctype - * | mixin - * | include - * | filter - * | comment - * | text - * | each - * | code - * | yield - * | id - * | class - * | interpolation - */ - - parseExpr: function(){ - switch (this.peek().type) { - case 'tag': - return this.parseTag(); - case 'mixin': - return this.parseMixin(); - case 'block': - return this.parseBlock(); - case 'case': - return this.parseCase(); - case 'when': - return this.parseWhen(); - case 'default': - return this.parseDefault(); - case 'extends': - return this.parseExtends(); - case 'include': - return this.parseInclude(); - case 'doctype': - return this.parseDoctype(); - case 'filter': - return this.parseFilter(); - case 'comment': - return this.parseComment(); - case 'text': - return this.parseText(); - case 'each': - return this.parseEach(); - case 'code': - return this.parseCode(); - case 'call': - return this.parseCall(); - case 'interpolation': - return this.parseInterpolation(); - case 'yield': - this.advance(); - var block = new nodes.Block; - block.yield = true; - return block; - case 'id': - case 'class': - var tok = this.advance(); - this.lexer.defer(this.lexer.tok('tag', 'div')); - this.lexer.defer(tok); - return this.parseExpr(); - default: - throw new Error('unexpected token "' + this.peek().type + '"'); - } - }, - - /** - * Text - */ - - parseText: function(){ - var tok = this.expect('text'); - var node = new nodes.Text(tok.val); - node.line = this.line(); - return node; - }, - - /** - * ':' expr - * | block - */ - - parseBlockExpansion: function(){ - if (':' == this.peek().type) { - this.advance(); - return new nodes.Block(this.parseExpr()); - } else { - return this.block(); - } - }, - - /** - * case - */ - - parseCase: function(){ - var val = this.expect('case').val; - var node = new nodes.Case(val); - node.line = this.line(); - node.block = this.block(); - return node; - }, - - /** - * when - */ - - parseWhen: function(){ - var val = this.expect('when').val - return new nodes.Case.When(val, this.parseBlockExpansion()); - }, - - /** - * default - */ - - parseDefault: function(){ - this.expect('default'); - return new nodes.Case.When('default', this.parseBlockExpansion()); - }, - - /** - * code - */ - - parseCode: function(){ - var tok = this.expect('code'); - var node = new nodes.Code(tok.val, tok.buffer, tok.escape); - var block; - var i = 1; - node.line = this.line(); - while (this.lookahead(i) && 'newline' == this.lookahead(i).type) ++i; - block = 'indent' == this.lookahead(i).type; - if (block) { - this.skip(i-1); - node.block = this.block(); - } - return node; - }, - - /** - * comment - */ - - parseComment: function(){ - var tok = this.expect('comment'); - var node; - - if ('indent' == this.peek().type) { - node = new nodes.BlockComment(tok.val, this.block(), tok.buffer); - } else { - node = new nodes.Comment(tok.val, tok.buffer); - } - - node.line = this.line(); - return node; - }, - - /** - * doctype - */ - - parseDoctype: function(){ - var tok = this.expect('doctype'); - var node = new nodes.Doctype(tok.val); - node.line = this.line(); - return node; - }, - - /** - * filter attrs? text-block - */ - - parseFilter: function(){ - var tok = this.expect('filter'); - var attrs = this.accept('attrs'); - var block; - - this.lexer.pipeless = true; - block = this.parseTextBlock(); - this.lexer.pipeless = false; - - var node = new nodes.Filter(tok.val, block, attrs && attrs.attrs); - node.line = this.line(); - return node; - }, - - /** - * each block - */ - - parseEach: function(){ - var tok = this.expect('each'); - var node = new nodes.Each(tok.code, tok.val, tok.key); - node.line = this.line(); - node.block = this.block(); - if (this.peek().type == 'code' && this.peek().val == 'else') { - this.advance(); - node.alternative = this.block(); - } - return node; - }, - - /** - * 'extends' name - */ - - parseExtends: function(){ - var path = require('path'); - var fs = require('fs'); - var dirname = path.dirname; - var basename = path.basename; - var join = path.join; - - if (!this.filename) - throw new Error('the "filename" option is required to extend templates'); - - var path = this.expect('extends').val.trim(); - var dir = dirname(this.filename); - - var path = join(dir, path + '.jade'); - var str = fs.readFileSync(path, 'utf8'); - var parser = new Parser(str, path, this.options); - - parser.blocks = this.blocks; - parser.contexts = this.contexts; - this.extending = parser; - - // TODO: null node - return new nodes.Literal(''); - }, - - /** - * 'block' name block - */ - - parseBlock: function(){ - var block = this.expect('block'); - var mode = block.mode; - var name = block.val.trim(); - - block = 'indent' == this.peek().type - ? this.block() - : new nodes.Block(new nodes.Literal('')); - - var prev = this.blocks[name]; - - if (prev) { - switch (prev.mode) { - case 'append': - block.nodes = block.nodes.concat(prev.nodes); - prev = block; - break; - case 'prepend': - block.nodes = prev.nodes.concat(block.nodes); - prev = block; - break; - } - } - - block.mode = mode; - return this.blocks[name] = prev || block; - }, - - /** - * include block? - */ - - parseInclude: function(){ - var path = require('path'); - var fs = require('fs'); - var dirname = path.dirname; - var basename = path.basename; - var join = path.join; - - var path = this.expect('include').val.trim(); - var dir = dirname(this.filename); - - if (!this.filename) - throw new Error('the "filename" option is required to use includes'); - - // no extension - if (!~basename(path).indexOf('.')) { - path += '.jade'; - } - - // non-jade - if ('.jade' != path.substr(-5)) { - var path = join(dir, path); - var str = fs.readFileSync(path, 'utf8'); - var ext = extname(path).slice(1); - var filter = filters[ext]; - if (filter) str = filter(str, { filename: path }).replace(/\\n/g, '\n'); - return new nodes.Literal(str); - } - - var path = join(dir, path); - var str = fs.readFileSync(path, 'utf8'); - var parser = new Parser(str, path, this.options); - parser.blocks = utils.merge({}, this.blocks); - parser.mixins = this.mixins; - - this.context(parser); - var ast = parser.parse(); - this.context(); - ast.filename = path; - - if ('indent' == this.peek().type) { - ast.includeBlock().push(this.block()); - } - - return ast; - }, - - /** - * call ident block - */ - - parseCall: function(){ - var tok = this.expect('call'); - var name = tok.val; - var args = tok.args; - var mixin = new nodes.Mixin(name, args, new nodes.Block, true); - - this.tag(mixin); - if (mixin.block.isEmpty()) mixin.block = null; - return mixin; - }, - - /** - * mixin block - */ - - parseMixin: function(){ - var tok = this.expect('mixin'); - var name = tok.val; - var args = tok.args; - var mixin; - - // definition - if ('indent' == this.peek().type) { - mixin = new nodes.Mixin(name, args, this.block(), false); - this.mixins[name] = mixin; - return mixin; - // call - } else { - return new nodes.Mixin(name, args, null, true); - } - }, - - /** - * indent (text | newline)* outdent - */ - - parseTextBlock: function(){ - var block = new nodes.Block; - block.line = this.line(); - var spaces = this.expect('indent').val; - if (null == this._spaces) this._spaces = spaces; - var indent = Array(spaces - this._spaces + 1).join(' '); - while ('outdent' != this.peek().type) { - switch (this.peek().type) { - case 'newline': - this.advance(); - break; - case 'indent': - this.parseTextBlock().nodes.forEach(function(node){ - block.push(node); - }); - break; - default: - var text = new nodes.Text(indent + this.advance().val); - text.line = this.line(); - block.push(text); - } - } - - if (spaces == this._spaces) this._spaces = null; - this.expect('outdent'); - return block; - }, - - /** - * indent expr* outdent - */ - - block: function(){ - var block = new nodes.Block; - block.line = this.line(); - this.expect('indent'); - while ('outdent' != this.peek().type) { - if ('newline' == this.peek().type) { - this.advance(); - } else { - block.push(this.parseExpr()); - } - } - this.expect('outdent'); - return block; - }, - - /** - * interpolation (attrs | class | id)* (text | code | ':')? newline* block? - */ - - parseInterpolation: function(){ - var tok = this.advance(); - var tag = new nodes.Tag(tok.val); - tag.buffer = true; - return this.tag(tag); - }, - - /** - * tag (attrs | class | id)* (text | code | ':')? newline* block? - */ - - parseTag: function(){ - // ast-filter look-ahead - var i = 2; - if ('attrs' == this.lookahead(i).type) ++i; - - var tok = this.advance(); - var tag = new nodes.Tag(tok.val); - - tag.selfClosing = tok.selfClosing; - - return this.tag(tag); - }, - - /** - * Parse tag. - */ - - tag: function(tag){ - var dot; - - tag.line = this.line(); - - // (attrs | class | id)* - out: - while (true) { - switch (this.peek().type) { - case 'id': - case 'class': - var tok = this.advance(); - tag.setAttribute(tok.type, "'" + tok.val + "'"); - continue; - case 'attrs': - var tok = this.advance() - , obj = tok.attrs - , escaped = tok.escaped - , names = Object.keys(obj); - - if (tok.selfClosing) tag.selfClosing = true; - - for (var i = 0, len = names.length; i < len; ++i) { - var name = names[i] - , val = obj[name]; - tag.setAttribute(name, val, escaped[name]); - } - continue; - default: - break out; - } - } - - // check immediate '.' - if ('.' == this.peek().val) { - dot = tag.textOnly = true; - this.advance(); - } - - // (text | code | ':')? - switch (this.peek().type) { - case 'text': - tag.block.push(this.parseText()); - break; - case 'code': - tag.code = this.parseCode(); - break; - case ':': - this.advance(); - tag.block = new nodes.Block; - tag.block.push(this.parseExpr()); - break; - } - - // newline* - while ('newline' == this.peek().type) this.advance(); - - tag.textOnly = tag.textOnly || ~textOnly.indexOf(tag.name); - - // script special-case - if ('script' == tag.name) { - var type = tag.getAttribute('type'); - if (!dot && type && 'text/javascript' != type.replace(/^['"]|['"]$/g, '')) { - tag.textOnly = false; - } - } - - // block? - if ('indent' == this.peek().type) { - if (tag.textOnly) { - this.lexer.pipeless = true; - tag.block = this.parseTextBlock(); - this.lexer.pipeless = false; - } else { - var block = this.block(); - if (tag.block) { - for (var i = 0, len = block.nodes.length; i < len; ++i) { - tag.block.push(block.nodes[i]); - } - } else { - tag.block = block; - } - } - } - - return tag; - } -}; diff --git a/node_modules/jade/lib/runtime.js b/node_modules/jade/lib/runtime.js deleted file mode 100644 index fb711f5..0000000 --- a/node_modules/jade/lib/runtime.js +++ /dev/null @@ -1,174 +0,0 @@ - -/*! - * Jade - runtime - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Lame Array.isArray() polyfill for now. - */ - -if (!Array.isArray) { - Array.isArray = function(arr){ - return '[object Array]' == Object.prototype.toString.call(arr); - }; -} - -/** - * Lame Object.keys() polyfill for now. - */ - -if (!Object.keys) { - Object.keys = function(obj){ - var arr = []; - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - arr.push(key); - } - } - return arr; - } -} - -/** - * Merge two attribute objects giving precedence - * to values in object `b`. Classes are special-cased - * allowing for arrays and merging/joining appropriately - * resulting in a string. - * - * @param {Object} a - * @param {Object} b - * @return {Object} a - * @api private - */ - -exports.merge = function merge(a, b) { - var ac = a['class']; - var bc = b['class']; - - if (ac || bc) { - ac = ac || []; - bc = bc || []; - if (!Array.isArray(ac)) ac = [ac]; - if (!Array.isArray(bc)) bc = [bc]; - ac = ac.filter(nulls); - bc = bc.filter(nulls); - a['class'] = ac.concat(bc).join(' '); - } - - for (var key in b) { - if (key != 'class') { - a[key] = b[key]; - } - } - - return a; -}; - -/** - * Filter null `val`s. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ - -function nulls(val) { - return val != null; -} - -/** - * Render the given attributes object. - * - * @param {Object} obj - * @param {Object} escaped - * @return {String} - * @api private - */ - -exports.attrs = function attrs(obj, escaped){ - var buf = [] - , terse = obj.terse; - - delete obj.terse; - var keys = Object.keys(obj) - , len = keys.length; - - if (len) { - buf.push(''); - for (var i = 0; i < len; ++i) { - var key = keys[i] - , val = obj[key]; - - if ('boolean' == typeof val || null == val) { - if (val) { - terse - ? buf.push(key) - : buf.push(key + '="' + key + '"'); - } - } else if (0 == key.indexOf('data') && 'string' != typeof val) { - buf.push(key + "='" + JSON.stringify(val) + "'"); - } else if ('class' == key && Array.isArray(val)) { - buf.push(key + '="' + exports.escape(val.join(' ')) + '"'); - } else if (escaped && escaped[key]) { - buf.push(key + '="' + exports.escape(val) + '"'); - } else { - buf.push(key + '="' + val + '"'); - } - } - } - - return buf.join(' '); -}; - -/** - * Escape the given string of `html`. - * - * @param {String} html - * @return {String} - * @api private - */ - -exports.escape = function escape(html){ - return String(html) - .replace(/&(?!(\w+|\#\d+);)/g, '&') - .replace(//g, '>') - .replace(/"/g, '"'); -}; - -/** - * Re-throw the given `err` in context to the - * the jade in `filename` at the given `lineno`. - * - * @param {Error} err - * @param {String} filename - * @param {String} lineno - * @api private - */ - -exports.rethrow = function rethrow(err, filename, lineno){ - if (!filename) throw err; - - var context = 3 - , str = require('fs').readFileSync(filename, 'utf8') - , lines = str.split('\n') - , start = Math.max(lineno - context, 0) - , end = Math.min(lines.length, lineno + context); - - // Error context - var context = lines.slice(start, end).map(function(line, i){ - var curr = i + start + 1; - return (curr == lineno ? ' > ' : ' ') - + curr - + '| ' - + line; - }).join('\n'); - - // Alter exception message - err.path = filename; - err.message = (filename || 'Jade') + ':' + lineno - + '\n' + context + '\n\n' + err.message; - throw err; -}; diff --git a/node_modules/jade/lib/self-closing.js b/node_modules/jade/lib/self-closing.js deleted file mode 100644 index 0548771..0000000 --- a/node_modules/jade/lib/self-closing.js +++ /dev/null @@ -1,19 +0,0 @@ - -/*! - * Jade - self closing tags - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -module.exports = [ - 'meta' - , 'img' - , 'link' - , 'input' - , 'source' - , 'area' - , 'base' - , 'col' - , 'br' - , 'hr' -]; \ No newline at end of file diff --git a/node_modules/jade/lib/utils.js b/node_modules/jade/lib/utils.js deleted file mode 100644 index ca4a7fa..0000000 --- a/node_modules/jade/lib/utils.js +++ /dev/null @@ -1,68 +0,0 @@ - -/*! - * Jade - utils - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Convert interpolation in the given string to JavaScript. - * - * @param {String} str - * @return {String} - * @api private - */ - -var interpolate = exports.interpolate = function(str){ - return str.replace(/(_SLASH_)?([#!]){(.*?)}/g, function(str, escape, flag, code){ - code = code - .replace(/\\'/g, "'") - .replace(/_SLASH_/g, '\\'); - - return escape - ? str.slice(7) - : "' + " - + ('!' == flag ? '' : 'escape') - + "((interp = " + code - + ") == null ? '' : interp) + '"; - }); -}; - -/** - * Escape single quotes in `str`. - * - * @param {String} str - * @return {String} - * @api private - */ - -var escape = exports.escape = function(str) { - return str.replace(/'/g, "\\'"); -}; - -/** - * Interpolate, and escape the given `str`. - * - * @param {String} str - * @return {String} - * @api private - */ - -exports.text = function(str){ - return interpolate(escape(str)); -}; - -/** - * Merge `b` into `a`. - * - * @param {Object} a - * @param {Object} b - * @return {Object} - * @api public - */ - -exports.merge = function(a, b) { - for (var key in b) a[key] = b[key]; - return a; -}; - diff --git a/node_modules/jade/node_modules/.bin/cake b/node_modules/jade/node_modules/.bin/cake deleted file mode 100755 index 5965f4e..0000000 --- a/node_modules/jade/node_modules/.bin/cake +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node - -var path = require('path'); -var fs = require('fs'); -var lib = path.join(path.dirname(fs.realpathSync(__filename)), '../lib'); - -require(lib + '/coffee-script/cake').run(); diff --git a/node_modules/jade/node_modules/.bin/coffee b/node_modules/jade/node_modules/.bin/coffee deleted file mode 100755 index 3d1d71c..0000000 --- a/node_modules/jade/node_modules/.bin/coffee +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node - -var path = require('path'); -var fs = require('fs'); -var lib = path.join(path.dirname(fs.realpathSync(__filename)), '../lib'); - -require(lib + '/coffee-script/command').run(); diff --git a/node_modules/jade/node_modules/coffee-script/.npmignore b/node_modules/jade/node_modules/coffee-script/.npmignore deleted file mode 100644 index 21e430d..0000000 --- a/node_modules/jade/node_modules/coffee-script/.npmignore +++ /dev/null @@ -1,11 +0,0 @@ -*.coffee -*.html -.DS_Store -.git* -Cakefile -documentation/ -examples/ -extras/coffee-script.js -raw/ -src/ -test/ diff --git a/node_modules/jade/node_modules/coffee-script/CNAME b/node_modules/jade/node_modules/coffee-script/CNAME deleted file mode 100644 index faadabe..0000000 --- a/node_modules/jade/node_modules/coffee-script/CNAME +++ /dev/null @@ -1 +0,0 @@ -coffeescript.org \ No newline at end of file diff --git a/node_modules/jade/node_modules/coffee-script/CONTRIBUTING.md b/node_modules/jade/node_modules/coffee-script/CONTRIBUTING.md deleted file mode 100644 index 6390c68..0000000 --- a/node_modules/jade/node_modules/coffee-script/CONTRIBUTING.md +++ /dev/null @@ -1,9 +0,0 @@ -## How to contribute to CoffeeScript - -* Before you open a ticket or send a pull request, [search](https://github.com/jashkenas/coffee-script/issues) for previous discussions about the same feature or issue. Add to the earlier ticket if you find one. - -* Before sending a pull request for a feature, be sure to have [tests](https://github.com/jashkenas/coffee-script/tree/master/test). - -* Use the same coding style as the rest of the [codebase](https://github.com/jashkenas/coffee-script/tree/master/src). If you're just getting started with CoffeeScript, there's a nice [style guide](https://github.com/polarmobile/coffeescript-style-guide). - -* In your pull request, do not add documentation to `index.html` or re-build the minified `coffee-script.js` file. We'll do those things before cutting a new release. \ No newline at end of file diff --git a/node_modules/jade/node_modules/coffee-script/LICENSE b/node_modules/jade/node_modules/coffee-script/LICENSE deleted file mode 100644 index dbe6b4e..0000000 --- a/node_modules/jade/node_modules/coffee-script/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2009-2012 Jeremy Ashkenas - -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. \ No newline at end of file diff --git a/node_modules/jade/node_modules/coffee-script/README b/node_modules/jade/node_modules/coffee-script/README deleted file mode 100644 index 69ee6f4..0000000 --- a/node_modules/jade/node_modules/coffee-script/README +++ /dev/null @@ -1,51 +0,0 @@ - - { - } } { - { { } } - } }{ { - { }{ } } _____ __ __ - ( }{ }{ { ) / ____| / _|/ _| - .- { { } { }} -. | | ___ | |_| |_ ___ ___ - ( ( } { } { } } ) | | / _ \| _| _/ _ \/ _ \ - |`-..________ ..-'| | |___| (_) | | | || __/ __/ - | | \_____\___/|_| |_| \___|\___| - | ;--. - | (__ \ _____ _ _ - | | ) ) / ____| (_) | | - | |/ / | (___ ___ _ __ _ _ __ | |_ - | ( / \___ \ / __| '__| | '_ \| __| - | |/ ____) | (__| | | | |_) | |_ - | | |_____/ \___|_| |_| .__/ \__| - `-.._________..-' | | - |_| - - - CoffeeScript is a little language that compiles into JavaScript. - - Install Node.js, and then the CoffeeScript compiler: - sudo bin/cake install - - Or, if you have the Node Package Manager installed: - npm install -g coffee-script - (Leave off the -g if you don't wish to install globally.) - - Execute a script: - coffee /path/to/script.coffee - - Compile a script: - coffee -c /path/to/script.coffee - - For documentation, usage, and examples, see: - http://coffeescript.org/ - - To suggest a feature, report a bug, or general discussion: - http://github.com/jashkenas/coffee-script/issues/ - - If you'd like to chat, drop by #coffeescript on Freenode IRC, - or on webchat.freenode.net. - - The source repository: - git://github.com/jashkenas/coffee-script.git - - All contributors are listed here: - http://github.com/jashkenas/coffee-script/contributors diff --git a/node_modules/jade/node_modules/coffee-script/Rakefile b/node_modules/jade/node_modules/coffee-script/Rakefile deleted file mode 100644 index dfb85da..0000000 --- a/node_modules/jade/node_modules/coffee-script/Rakefile +++ /dev/null @@ -1,78 +0,0 @@ -require 'rubygems' -require 'erb' -require 'fileutils' -require 'rake/testtask' -require 'json' - -desc "Build the documentation page" -task :doc do - source = 'documentation/index.html.erb' - child = fork { exec "bin/coffee -bcw -o documentation/js documentation/coffee/*.coffee" } - at_exit { Process.kill("INT", child) } - Signal.trap("INT") { exit } - loop do - mtime = File.stat(source).mtime - if !@mtime || mtime > @mtime - rendered = ERB.new(File.read(source)).result(binding) - File.open('index.html', 'w+') {|f| f.write(rendered) } - end - @mtime = mtime - sleep 1 - end -end - -desc "Build coffee-script-source gem" -task :gem do - require 'rubygems' - require 'rubygems/package' - - gemspec = Gem::Specification.new do |s| - s.name = 'coffee-script-source' - s.version = JSON.parse(File.read('package.json'))["version"] - s.date = Time.now.strftime("%Y-%m-%d") - - s.homepage = "http://jashkenas.github.com/coffee-script/" - s.summary = "The CoffeeScript Compiler" - s.description = <<-EOS - CoffeeScript is a little language that compiles into JavaScript. - Underneath all of those embarrassing braces and semicolons, - JavaScript has always had a gorgeous object model at its heart. - CoffeeScript is an attempt to expose the good parts of JavaScript - in a simple way. - EOS - - s.files = [ - 'lib/coffee_script/coffee-script.js', - 'lib/coffee_script/source.rb' - ] - - s.authors = ['Jeremy Ashkenas'] - s.email = 'jashkenas@gmail.com' - s.rubyforge_project = 'coffee-script-source' - end - - file = File.open("coffee-script-source.gem", "w") - Gem::Package.open(file, 'w') do |pkg| - pkg.metadata = gemspec.to_yaml - - path = "lib/coffee_script/source.rb" - contents = <<-ERUBY -module CoffeeScript - module Source - def self.bundled_path - File.expand_path("../coffee-script.js", __FILE__) - end - end -end - ERUBY - pkg.add_file_simple(path, 0644, contents.size) do |tar_io| - tar_io.write(contents) - end - - contents = File.read("extras/coffee-script.js") - path = "lib/coffee_script/coffee-script.js" - pkg.add_file_simple(path, 0644, contents.size) do |tar_io| - tar_io.write(contents) - end - end -end diff --git a/node_modules/jade/node_modules/coffee-script/bin/cake b/node_modules/jade/node_modules/coffee-script/bin/cake deleted file mode 100755 index 5965f4e..0000000 --- a/node_modules/jade/node_modules/coffee-script/bin/cake +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node - -var path = require('path'); -var fs = require('fs'); -var lib = path.join(path.dirname(fs.realpathSync(__filename)), '../lib'); - -require(lib + '/coffee-script/cake').run(); diff --git a/node_modules/jade/node_modules/coffee-script/bin/coffee b/node_modules/jade/node_modules/coffee-script/bin/coffee deleted file mode 100755 index 3d1d71c..0000000 --- a/node_modules/jade/node_modules/coffee-script/bin/coffee +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node - -var path = require('path'); -var fs = require('fs'); -var lib = path.join(path.dirname(fs.realpathSync(__filename)), '../lib'); - -require(lib + '/coffee-script/command').run(); diff --git a/node_modules/jade/node_modules/coffee-script/extras/jsl.conf b/node_modules/jade/node_modules/coffee-script/extras/jsl.conf deleted file mode 100644 index 1190da5..0000000 --- a/node_modules/jade/node_modules/coffee-script/extras/jsl.conf +++ /dev/null @@ -1,44 +0,0 @@ -# JavaScriptLint configuration file for CoffeeScript. - -+no_return_value # function {0} does not always return a value -+duplicate_formal # duplicate formal argument {0} --equal_as_assign # test for equality (==) mistyped as assignment (=)?{0} -+var_hides_arg # variable {0} hides argument -+redeclared_var # redeclaration of {0} {1} --anon_no_return_value # anonymous function does not always return a value -+missing_semicolon # missing semicolon -+meaningless_block # meaningless block; curly braces have no impact --comma_separated_stmts # multiple statements separated by commas (use semicolons?) -+unreachable_code # unreachable code -+missing_break # missing break statement --missing_break_for_last_case # missing break statement for last case in switch --comparison_type_conv # comparisons against null, 0, true, false, or an empty string allowing implicit type conversion (use === or !==) --inc_dec_within_stmt # increment (++) and decrement (--) operators used as part of greater statement --useless_void # use of the void type may be unnecessary (void is always undefined) -+multiple_plus_minus # unknown order of operations for successive plus (e.g. x+++y) or minus (e.g. x---y) signs -+use_of_label # use of label --block_without_braces # block statement without curly braces -+leading_decimal_point # leading decimal point may indicate a number or an object member -+trailing_decimal_point # trailing decimal point may indicate a number or an object member -+octal_number # leading zeros make an octal number -+nested_comment # nested comment -+misplaced_regex # regular expressions should be preceded by a left parenthesis, assignment, colon, or comma -+ambiguous_newline # unexpected end of line; it is ambiguous whether these lines are part of the same statement -+empty_statement # empty statement or extra semicolon --missing_option_explicit # the "option explicit" control comment is missing -+partial_option_explicit # the "option explicit" control comment, if used, must be in the first script tag -+dup_option_explicit # duplicate "option explicit" control comment -+useless_assign # useless assignment -+ambiguous_nested_stmt # block statements containing block statements should use curly braces to resolve ambiguity -+ambiguous_else_stmt # the else statement could be matched with one of multiple if statements (use curly braces to indicate intent) --missing_default_case # missing default case in switch statement -+duplicate_case_in_switch # duplicate case in switch statements -+default_not_at_end # the default case is not at the end of the switch statement -+legacy_cc_not_understood # couldn't understand control comment using /*@keyword@*/ syntax -+jsl_cc_not_understood # couldn't understand control comment using /*jsl:keyword*/ syntax -+useless_comparison # useless comparison; comparing identical expressions -+with_statement # with statement hides undeclared variables; use temporary variable instead -+trailing_comma_in_array # extra comma is not recommended in array initializers -+assign_to_function_call # assignment to a function call -+parseint_missing_radix # parseInt missing radix parameter -+lambda_assign_requires_semicolon diff --git a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/browser.js b/node_modules/jade/node_modules/coffee-script/lib/coffee-script/browser.js deleted file mode 100644 index 045156f..0000000 --- a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/browser.js +++ /dev/null @@ -1,92 +0,0 @@ -// Generated by CoffeeScript 1.4.0 -(function() { - var CoffeeScript, runScripts; - - CoffeeScript = require('./coffee-script'); - - CoffeeScript.require = require; - - CoffeeScript["eval"] = function(code, options) { - var _ref; - if (options == null) { - options = {}; - } - if ((_ref = options.bare) == null) { - options.bare = true; - } - return eval(CoffeeScript.compile(code, options)); - }; - - CoffeeScript.run = function(code, options) { - if (options == null) { - options = {}; - } - options.bare = true; - return Function(CoffeeScript.compile(code, options))(); - }; - - if (typeof window === "undefined" || window === null) { - return; - } - - CoffeeScript.load = function(url, callback) { - var xhr; - xhr = window.ActiveXObject ? new window.ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest(); - xhr.open('GET', url, true); - if ('overrideMimeType' in xhr) { - xhr.overrideMimeType('text/plain'); - } - xhr.onreadystatechange = function() { - var _ref; - if (xhr.readyState === 4) { - if ((_ref = xhr.status) === 0 || _ref === 200) { - CoffeeScript.run(xhr.responseText); - } else { - throw new Error("Could not load " + url); - } - if (callback) { - return callback(); - } - } - }; - return xhr.send(null); - }; - - runScripts = function() { - var coffees, execute, index, length, s, scripts; - scripts = document.getElementsByTagName('script'); - coffees = (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = scripts.length; _i < _len; _i++) { - s = scripts[_i]; - if (s.type === 'text/coffeescript') { - _results.push(s); - } - } - return _results; - })(); - index = 0; - length = coffees.length; - (execute = function() { - var script; - script = coffees[index++]; - if ((script != null ? script.type : void 0) === 'text/coffeescript') { - if (script.src) { - return CoffeeScript.load(script.src, execute); - } else { - CoffeeScript.run(script.innerHTML); - return execute(); - } - } - })(); - return null; - }; - - if (window.addEventListener) { - addEventListener('DOMContentLoaded', runScripts, false); - } else { - attachEvent('onload', runScripts); - } - -}).call(this); diff --git a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/cake.js b/node_modules/jade/node_modules/coffee-script/lib/coffee-script/cake.js deleted file mode 100644 index 0e7f1cc..0000000 --- a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/cake.js +++ /dev/null @@ -1,113 +0,0 @@ -// Generated by CoffeeScript 1.4.0 -(function() { - var CoffeeScript, cakefileDirectory, existsSync, fatalError, fs, helpers, missingTask, oparse, options, optparse, path, printTasks, switches, tasks; - - fs = require('fs'); - - path = require('path'); - - helpers = require('./helpers'); - - optparse = require('./optparse'); - - CoffeeScript = require('./coffee-script'); - - existsSync = fs.existsSync || path.existsSync; - - tasks = {}; - - options = {}; - - switches = []; - - oparse = null; - - helpers.extend(global, { - task: function(name, description, action) { - var _ref; - if (!action) { - _ref = [description, action], action = _ref[0], description = _ref[1]; - } - return tasks[name] = { - name: name, - description: description, - action: action - }; - }, - option: function(letter, flag, description) { - return switches.push([letter, flag, description]); - }, - invoke: function(name) { - if (!tasks[name]) { - missingTask(name); - } - return tasks[name].action(options); - } - }); - - exports.run = function() { - var arg, args, _i, _len, _ref, _results; - global.__originalDirname = fs.realpathSync('.'); - process.chdir(cakefileDirectory(__originalDirname)); - args = process.argv.slice(2); - CoffeeScript.run(fs.readFileSync('Cakefile').toString(), { - filename: 'Cakefile' - }); - oparse = new optparse.OptionParser(switches); - if (!args.length) { - return printTasks(); - } - try { - options = oparse.parse(args); - } catch (e) { - return fatalError("" + e); - } - _ref = options["arguments"]; - _results = []; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - arg = _ref[_i]; - _results.push(invoke(arg)); - } - return _results; - }; - - printTasks = function() { - var cakefilePath, desc, name, relative, spaces, task; - relative = path.relative || path.resolve; - cakefilePath = path.join(relative(__originalDirname, process.cwd()), 'Cakefile'); - console.log("" + cakefilePath + " defines the following tasks:\n"); - for (name in tasks) { - task = tasks[name]; - spaces = 20 - name.length; - spaces = spaces > 0 ? Array(spaces + 1).join(' ') : ''; - desc = task.description ? "# " + task.description : ''; - console.log("cake " + name + spaces + " " + desc); - } - if (switches.length) { - return console.log(oparse.help()); - } - }; - - fatalError = function(message) { - console.error(message + '\n'); - console.log('To see a list of all tasks/options, run "cake"'); - return process.exit(1); - }; - - missingTask = function(task) { - return fatalError("No such task: " + task); - }; - - cakefileDirectory = function(dir) { - var parent; - if (existsSync(path.join(dir, 'Cakefile'))) { - return dir; - } - parent = path.normalize(path.join(dir, '..')); - if (parent !== dir) { - return cakefileDirectory(parent); - } - throw new Error("Cakefile not found in " + (process.cwd())); - }; - -}).call(this); diff --git a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/coffee-script.js b/node_modules/jade/node_modules/coffee-script/lib/coffee-script/coffee-script.js deleted file mode 100644 index 7ee55cd..0000000 --- a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/coffee-script.js +++ /dev/null @@ -1,171 +0,0 @@ -// Generated by CoffeeScript 1.4.0 -(function() { - var Lexer, RESERVED, compile, fs, lexer, parser, path, stripBOM, vm, _ref, - __hasProp = {}.hasOwnProperty; - - fs = require('fs'); - - path = require('path'); - - _ref = require('./lexer'), Lexer = _ref.Lexer, RESERVED = _ref.RESERVED; - - parser = require('./parser').parser; - - vm = require('vm'); - - stripBOM = function(content) { - if (content.charCodeAt(0) === 0xFEFF) { - return content.substring(1); - } else { - return content; - } - }; - - if (require.extensions) { - require.extensions['.coffee'] = function(module, filename) { - var content; - content = compile(stripBOM(fs.readFileSync(filename, 'utf8')), { - filename: filename - }); - return module._compile(content, filename); - }; - } - - exports.VERSION = '1.4.0'; - - exports.RESERVED = RESERVED; - - exports.helpers = require('./helpers'); - - exports.compile = compile = function(code, options) { - var header, js, merge; - if (options == null) { - options = {}; - } - merge = exports.helpers.merge; - try { - js = (parser.parse(lexer.tokenize(code))).compile(options); - if (!options.header) { - return js; - } - } catch (err) { - if (options.filename) { - err.message = "In " + options.filename + ", " + err.message; - } - throw err; - } - header = "Generated by CoffeeScript " + this.VERSION; - return "// " + header + "\n" + js; - }; - - exports.tokens = function(code, options) { - return lexer.tokenize(code, options); - }; - - exports.nodes = function(source, options) { - if (typeof source === 'string') { - return parser.parse(lexer.tokenize(source, options)); - } else { - return parser.parse(source); - } - }; - - exports.run = function(code, options) { - var mainModule; - if (options == null) { - options = {}; - } - mainModule = require.main; - mainModule.filename = process.argv[1] = options.filename ? fs.realpathSync(options.filename) : '.'; - mainModule.moduleCache && (mainModule.moduleCache = {}); - mainModule.paths = require('module')._nodeModulePaths(path.dirname(fs.realpathSync(options.filename))); - if (path.extname(mainModule.filename) !== '.coffee' || require.extensions) { - return mainModule._compile(compile(code, options), mainModule.filename); - } else { - return mainModule._compile(code, mainModule.filename); - } - }; - - exports["eval"] = function(code, options) { - var Module, Script, js, k, o, r, sandbox, v, _i, _len, _module, _ref1, _ref2, _require; - if (options == null) { - options = {}; - } - if (!(code = code.trim())) { - return; - } - Script = vm.Script; - if (Script) { - if (options.sandbox != null) { - if (options.sandbox instanceof Script.createContext().constructor) { - sandbox = options.sandbox; - } else { - sandbox = Script.createContext(); - _ref1 = options.sandbox; - for (k in _ref1) { - if (!__hasProp.call(_ref1, k)) continue; - v = _ref1[k]; - sandbox[k] = v; - } - } - sandbox.global = sandbox.root = sandbox.GLOBAL = sandbox; - } else { - sandbox = global; - } - sandbox.__filename = options.filename || 'eval'; - sandbox.__dirname = path.dirname(sandbox.__filename); - if (!(sandbox !== global || sandbox.module || sandbox.require)) { - Module = require('module'); - sandbox.module = _module = new Module(options.modulename || 'eval'); - sandbox.require = _require = function(path) { - return Module._load(path, _module, true); - }; - _module.filename = sandbox.__filename; - _ref2 = Object.getOwnPropertyNames(require); - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - r = _ref2[_i]; - if (r !== 'paths') { - _require[r] = require[r]; - } - } - _require.paths = _module.paths = Module._nodeModulePaths(process.cwd()); - _require.resolve = function(request) { - return Module._resolveFilename(request, _module); - }; - } - } - o = {}; - for (k in options) { - if (!__hasProp.call(options, k)) continue; - v = options[k]; - o[k] = v; - } - o.bare = true; - js = compile(code, o); - if (sandbox === global) { - return vm.runInThisContext(js); - } else { - return vm.runInContext(js, sandbox); - } - }; - - lexer = new Lexer; - - parser.lexer = { - lex: function() { - var tag, _ref1; - _ref1 = this.tokens[this.pos++] || [''], tag = _ref1[0], this.yytext = _ref1[1], this.yylineno = _ref1[2]; - return tag; - }, - setInput: function(tokens) { - this.tokens = tokens; - return this.pos = 0; - }, - upcomingInput: function() { - return ""; - } - }; - - parser.yy = require('./nodes'); - -}).call(this); diff --git a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/command.js b/node_modules/jade/node_modules/coffee-script/lib/coffee-script/command.js deleted file mode 100644 index b0bcfe1..0000000 --- a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/command.js +++ /dev/null @@ -1,502 +0,0 @@ -// Generated by CoffeeScript 1.4.0 -(function() { - var BANNER, CoffeeScript, EventEmitter, SWITCHES, compileJoin, compileOptions, compilePath, compileScript, compileStdio, exec, exists, forkNode, fs, helpers, hidden, joinTimeout, lint, loadRequires, notSources, optionParser, optparse, opts, outputPath, parseOptions, path, printLine, printTokens, printWarn, removeSource, sourceCode, sources, spawn, timeLog, unwatchDir, usage, version, wait, watch, watchDir, watchers, writeJs, _ref; - - fs = require('fs'); - - path = require('path'); - - helpers = require('./helpers'); - - optparse = require('./optparse'); - - CoffeeScript = require('./coffee-script'); - - _ref = require('child_process'), spawn = _ref.spawn, exec = _ref.exec; - - EventEmitter = require('events').EventEmitter; - - exists = fs.exists || path.exists; - - helpers.extend(CoffeeScript, new EventEmitter); - - printLine = function(line) { - return process.stdout.write(line + '\n'); - }; - - printWarn = function(line) { - return process.stderr.write(line + '\n'); - }; - - hidden = function(file) { - return /^\.|~$/.test(file); - }; - - BANNER = 'Usage: coffee [options] path/to/script.coffee -- [args]\n\nIf called without options, `coffee` will run your script.'; - - SWITCHES = [['-b', '--bare', 'compile without a top-level function wrapper'], ['-c', '--compile', 'compile to JavaScript and save as .js files'], ['-e', '--eval', 'pass a string from the command line as input'], ['-h', '--help', 'display this help message'], ['-i', '--interactive', 'run an interactive CoffeeScript REPL'], ['-j', '--join [FILE]', 'concatenate the source CoffeeScript before compiling'], ['-l', '--lint', 'pipe the compiled JavaScript through JavaScript Lint'], ['-n', '--nodes', 'print out the parse tree that the parser produces'], ['--nodejs [ARGS]', 'pass options directly to the "node" binary'], ['-o', '--output [DIR]', 'set the output directory for compiled JavaScript'], ['-p', '--print', 'print out the compiled JavaScript'], ['-r', '--require [FILE*]', 'require a library before executing your script'], ['-s', '--stdio', 'listen for and compile scripts over stdio'], ['-t', '--tokens', 'print out the tokens that the lexer/rewriter produce'], ['-v', '--version', 'display the version number'], ['-w', '--watch', 'watch scripts for changes and rerun commands']]; - - opts = {}; - - sources = []; - - sourceCode = []; - - notSources = {}; - - watchers = {}; - - optionParser = null; - - exports.run = function() { - var literals, source, _i, _len, _results; - parseOptions(); - if (opts.nodejs) { - return forkNode(); - } - if (opts.help) { - return usage(); - } - if (opts.version) { - return version(); - } - if (opts.require) { - loadRequires(); - } - if (opts.interactive) { - return require('./repl'); - } - if (opts.watch && !fs.watch) { - return printWarn("The --watch feature depends on Node v0.6.0+. You are running " + process.version + "."); - } - if (opts.stdio) { - return compileStdio(); - } - if (opts["eval"]) { - return compileScript(null, sources[0]); - } - if (!sources.length) { - return require('./repl'); - } - literals = opts.run ? sources.splice(1) : []; - process.argv = process.argv.slice(0, 2).concat(literals); - process.argv[0] = 'coffee'; - process.execPath = require.main.filename; - _results = []; - for (_i = 0, _len = sources.length; _i < _len; _i++) { - source = sources[_i]; - _results.push(compilePath(source, true, path.normalize(source))); - } - return _results; - }; - - compilePath = function(source, topLevel, base) { - return fs.stat(source, function(err, stats) { - if (err && err.code !== 'ENOENT') { - throw err; - } - if ((err != null ? err.code : void 0) === 'ENOENT') { - if (topLevel && source.slice(-7) !== '.coffee') { - source = sources[sources.indexOf(source)] = "" + source + ".coffee"; - return compilePath(source, topLevel, base); - } - if (topLevel) { - console.error("File not found: " + source); - process.exit(1); - } - return; - } - if (stats.isDirectory()) { - if (opts.watch) { - watchDir(source, base); - } - return fs.readdir(source, function(err, files) { - var file, index, _ref1, _ref2; - if (err && err.code !== 'ENOENT') { - throw err; - } - if ((err != null ? err.code : void 0) === 'ENOENT') { - return; - } - index = sources.indexOf(source); - files = files.filter(function(file) { - return !hidden(file); - }); - [].splice.apply(sources, [index, index - index + 1].concat(_ref1 = (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = files.length; _i < _len; _i++) { - file = files[_i]; - _results.push(path.join(source, file)); - } - return _results; - })())), _ref1; - [].splice.apply(sourceCode, [index, index - index + 1].concat(_ref2 = files.map(function() { - return null; - }))), _ref2; - return files.forEach(function(file) { - return compilePath(path.join(source, file), false, base); - }); - }); - } else if (topLevel || path.extname(source) === '.coffee') { - if (opts.watch) { - watch(source, base); - } - return fs.readFile(source, function(err, code) { - if (err && err.code !== 'ENOENT') { - throw err; - } - if ((err != null ? err.code : void 0) === 'ENOENT') { - return; - } - return compileScript(source, code.toString(), base); - }); - } else { - notSources[source] = true; - return removeSource(source, base); - } - }); - }; - - compileScript = function(file, input, base) { - var o, options, t, task; - o = opts; - options = compileOptions(file); - try { - t = task = { - file: file, - input: input, - options: options - }; - CoffeeScript.emit('compile', task); - if (o.tokens) { - return printTokens(CoffeeScript.tokens(t.input)); - } else if (o.nodes) { - return printLine(CoffeeScript.nodes(t.input).toString().trim()); - } else if (o.run) { - return CoffeeScript.run(t.input, t.options); - } else if (o.join && t.file !== o.join) { - sourceCode[sources.indexOf(t.file)] = t.input; - return compileJoin(); - } else { - t.output = CoffeeScript.compile(t.input, t.options); - CoffeeScript.emit('success', task); - if (o.print) { - return printLine(t.output.trim()); - } else if (o.compile) { - return writeJs(t.file, t.output, base); - } else if (o.lint) { - return lint(t.file, t.output); - } - } - } catch (err) { - CoffeeScript.emit('failure', err, task); - if (CoffeeScript.listeners('failure').length) { - return; - } - if (o.watch) { - return printLine(err.message + '\x07'); - } - printWarn(err instanceof Error && err.stack || ("ERROR: " + err)); - return process.exit(1); - } - }; - - compileStdio = function() { - var code, stdin; - code = ''; - stdin = process.openStdin(); - stdin.on('data', function(buffer) { - if (buffer) { - return code += buffer.toString(); - } - }); - return stdin.on('end', function() { - return compileScript(null, code); - }); - }; - - joinTimeout = null; - - compileJoin = function() { - if (!opts.join) { - return; - } - if (!sourceCode.some(function(code) { - return code === null; - })) { - clearTimeout(joinTimeout); - return joinTimeout = wait(100, function() { - return compileScript(opts.join, sourceCode.join('\n'), opts.join); - }); - } - }; - - loadRequires = function() { - var realFilename, req, _i, _len, _ref1; - realFilename = module.filename; - module.filename = '.'; - _ref1 = opts.require; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - req = _ref1[_i]; - require(req); - } - return module.filename = realFilename; - }; - - watch = function(source, base) { - var compile, compileTimeout, prevStats, rewatch, watchErr, watcher; - prevStats = null; - compileTimeout = null; - watchErr = function(e) { - if (e.code === 'ENOENT') { - if (sources.indexOf(source) === -1) { - return; - } - try { - rewatch(); - return compile(); - } catch (e) { - removeSource(source, base, true); - return compileJoin(); - } - } else { - throw e; - } - }; - compile = function() { - clearTimeout(compileTimeout); - return compileTimeout = wait(25, function() { - return fs.stat(source, function(err, stats) { - if (err) { - return watchErr(err); - } - if (prevStats && stats.size === prevStats.size && stats.mtime.getTime() === prevStats.mtime.getTime()) { - return rewatch(); - } - prevStats = stats; - return fs.readFile(source, function(err, code) { - if (err) { - return watchErr(err); - } - compileScript(source, code.toString(), base); - return rewatch(); - }); - }); - }); - }; - try { - watcher = fs.watch(source, compile); - } catch (e) { - watchErr(e); - } - return rewatch = function() { - if (watcher != null) { - watcher.close(); - } - return watcher = fs.watch(source, compile); - }; - }; - - watchDir = function(source, base) { - var readdirTimeout, watcher; - readdirTimeout = null; - try { - return watcher = fs.watch(source, function() { - clearTimeout(readdirTimeout); - return readdirTimeout = wait(25, function() { - return fs.readdir(source, function(err, files) { - var file, _i, _len, _results; - if (err) { - if (err.code !== 'ENOENT') { - throw err; - } - watcher.close(); - return unwatchDir(source, base); - } - _results = []; - for (_i = 0, _len = files.length; _i < _len; _i++) { - file = files[_i]; - if (!(!hidden(file) && !notSources[file])) { - continue; - } - file = path.join(source, file); - if (sources.some(function(s) { - return s.indexOf(file) >= 0; - })) { - continue; - } - sources.push(file); - sourceCode.push(null); - _results.push(compilePath(file, false, base)); - } - return _results; - }); - }); - }); - } catch (e) { - if (e.code !== 'ENOENT') { - throw e; - } - } - }; - - unwatchDir = function(source, base) { - var file, prevSources, toRemove, _i, _len; - prevSources = sources.slice(0); - toRemove = (function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = sources.length; _i < _len; _i++) { - file = sources[_i]; - if (file.indexOf(source) >= 0) { - _results.push(file); - } - } - return _results; - })(); - for (_i = 0, _len = toRemove.length; _i < _len; _i++) { - file = toRemove[_i]; - removeSource(file, base, true); - } - if (!sources.some(function(s, i) { - return prevSources[i] !== s; - })) { - return; - } - return compileJoin(); - }; - - removeSource = function(source, base, removeJs) { - var index, jsPath; - index = sources.indexOf(source); - sources.splice(index, 1); - sourceCode.splice(index, 1); - if (removeJs && !opts.join) { - jsPath = outputPath(source, base); - return exists(jsPath, function(itExists) { - if (itExists) { - return fs.unlink(jsPath, function(err) { - if (err && err.code !== 'ENOENT') { - throw err; - } - return timeLog("removed " + source); - }); - } - }); - } - }; - - outputPath = function(source, base) { - var baseDir, dir, filename, srcDir; - filename = path.basename(source, path.extname(source)) + '.js'; - srcDir = path.dirname(source); - baseDir = base === '.' ? srcDir : srcDir.substring(base.length); - dir = opts.output ? path.join(opts.output, baseDir) : srcDir; - return path.join(dir, filename); - }; - - writeJs = function(source, js, base) { - var compile, jsDir, jsPath; - jsPath = outputPath(source, base); - jsDir = path.dirname(jsPath); - compile = function() { - if (js.length <= 0) { - js = ' '; - } - return fs.writeFile(jsPath, js, function(err) { - if (err) { - return printLine(err.message); - } else if (opts.compile && opts.watch) { - return timeLog("compiled " + source); - } - }); - }; - return exists(jsDir, function(itExists) { - if (itExists) { - return compile(); - } else { - return exec("mkdir -p " + jsDir, compile); - } - }); - }; - - wait = function(milliseconds, func) { - return setTimeout(func, milliseconds); - }; - - timeLog = function(message) { - return console.log("" + ((new Date).toLocaleTimeString()) + " - " + message); - }; - - lint = function(file, js) { - var conf, jsl, printIt; - printIt = function(buffer) { - return printLine(file + ':\t' + buffer.toString().trim()); - }; - conf = __dirname + '/../../extras/jsl.conf'; - jsl = spawn('jsl', ['-nologo', '-stdin', '-conf', conf]); - jsl.stdout.on('data', printIt); - jsl.stderr.on('data', printIt); - jsl.stdin.write(js); - return jsl.stdin.end(); - }; - - printTokens = function(tokens) { - var strings, tag, token, value; - strings = (function() { - var _i, _len, _ref1, _results; - _results = []; - for (_i = 0, _len = tokens.length; _i < _len; _i++) { - token = tokens[_i]; - _ref1 = [token[0], token[1].toString().replace(/\n/, '\\n')], tag = _ref1[0], value = _ref1[1]; - _results.push("[" + tag + " " + value + "]"); - } - return _results; - })(); - return printLine(strings.join(' ')); - }; - - parseOptions = function() { - var i, o, source, _i, _len; - optionParser = new optparse.OptionParser(SWITCHES, BANNER); - o = opts = optionParser.parse(process.argv.slice(2)); - o.compile || (o.compile = !!o.output); - o.run = !(o.compile || o.print || o.lint); - o.print = !!(o.print || (o["eval"] || o.stdio && o.compile)); - sources = o["arguments"]; - for (i = _i = 0, _len = sources.length; _i < _len; i = ++_i) { - source = sources[i]; - sourceCode[i] = null; - } - }; - - compileOptions = function(filename) { - return { - filename: filename, - bare: opts.bare, - header: opts.compile - }; - }; - - forkNode = function() { - var args, nodeArgs; - nodeArgs = opts.nodejs.split(/\s+/); - args = process.argv.slice(1); - args.splice(args.indexOf('--nodejs'), 2); - return spawn(process.execPath, nodeArgs.concat(args), { - cwd: process.cwd(), - env: process.env, - customFds: [0, 1, 2] - }); - }; - - usage = function() { - return printLine((new optparse.OptionParser(SWITCHES, BANNER)).help()); - }; - - version = function() { - return printLine("CoffeeScript version " + CoffeeScript.VERSION); - }; - -}).call(this); diff --git a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/grammar.js b/node_modules/jade/node_modules/coffee-script/lib/coffee-script/grammar.js deleted file mode 100644 index e3513e5..0000000 --- a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/grammar.js +++ /dev/null @@ -1,606 +0,0 @@ -// Generated by CoffeeScript 1.4.0 -(function() { - var Parser, alt, alternatives, grammar, name, o, operators, token, tokens, unwrap; - - Parser = require('jison').Parser; - - unwrap = /^function\s*\(\)\s*\{\s*return\s*([\s\S]*);\s*\}/; - - o = function(patternString, action, options) { - var match; - patternString = patternString.replace(/\s{2,}/g, ' '); - if (!action) { - return [patternString, '$$ = $1;', options]; - } - action = (match = unwrap.exec(action)) ? match[1] : "(" + action + "())"; - action = action.replace(/\bnew /g, '$&yy.'); - action = action.replace(/\b(?:Block\.wrap|extend)\b/g, 'yy.$&'); - return [patternString, "$$ = " + action + ";", options]; - }; - - grammar = { - Root: [ - o('', function() { - return new Block; - }), o('Body'), o('Block TERMINATOR') - ], - Body: [ - o('Line', function() { - return Block.wrap([$1]); - }), o('Body TERMINATOR Line', function() { - return $1.push($3); - }), o('Body TERMINATOR') - ], - Line: [o('Expression'), o('Statement')], - Statement: [ - o('Return'), o('Comment'), o('STATEMENT', function() { - return new Literal($1); - }) - ], - Expression: [o('Value'), o('Invocation'), o('Code'), o('Operation'), o('Assign'), o('If'), o('Try'), o('While'), o('For'), o('Switch'), o('Class'), o('Throw')], - Block: [ - o('INDENT OUTDENT', function() { - return new Block; - }), o('INDENT Body OUTDENT', function() { - return $2; - }) - ], - Identifier: [ - o('IDENTIFIER', function() { - return new Literal($1); - }) - ], - AlphaNumeric: [ - o('NUMBER', function() { - return new Literal($1); - }), o('STRING', function() { - return new Literal($1); - }) - ], - Literal: [ - o('AlphaNumeric'), o('JS', function() { - return new Literal($1); - }), o('REGEX', function() { - return new Literal($1); - }), o('DEBUGGER', function() { - return new Literal($1); - }), o('UNDEFINED', function() { - return new Undefined; - }), o('NULL', function() { - return new Null; - }), o('BOOL', function() { - return new Bool($1); - }) - ], - Assign: [ - o('Assignable = Expression', function() { - return new Assign($1, $3); - }), o('Assignable = TERMINATOR Expression', function() { - return new Assign($1, $4); - }), o('Assignable = INDENT Expression OUTDENT', function() { - return new Assign($1, $4); - }) - ], - AssignObj: [ - o('ObjAssignable', function() { - return new Value($1); - }), o('ObjAssignable : Expression', function() { - return new Assign(new Value($1), $3, 'object'); - }), o('ObjAssignable :\ - INDENT Expression OUTDENT', function() { - return new Assign(new Value($1), $4, 'object'); - }), o('Comment') - ], - ObjAssignable: [o('Identifier'), o('AlphaNumeric'), o('ThisProperty')], - Return: [ - o('RETURN Expression', function() { - return new Return($2); - }), o('RETURN', function() { - return new Return; - }) - ], - Comment: [ - o('HERECOMMENT', function() { - return new Comment($1); - }) - ], - Code: [ - o('PARAM_START ParamList PARAM_END FuncGlyph Block', function() { - return new Code($2, $5, $4); - }), o('FuncGlyph Block', function() { - return new Code([], $2, $1); - }) - ], - FuncGlyph: [ - o('->', function() { - return 'func'; - }), o('=>', function() { - return 'boundfunc'; - }) - ], - OptComma: [o(''), o(',')], - ParamList: [ - o('', function() { - return []; - }), o('Param', function() { - return [$1]; - }), o('ParamList , Param', function() { - return $1.concat($3); - }), o('ParamList OptComma TERMINATOR Param', function() { - return $1.concat($4); - }), o('ParamList OptComma INDENT ParamList OptComma OUTDENT', function() { - return $1.concat($4); - }) - ], - Param: [ - o('ParamVar', function() { - return new Param($1); - }), o('ParamVar ...', function() { - return new Param($1, null, true); - }), o('ParamVar = Expression', function() { - return new Param($1, $3); - }) - ], - ParamVar: [o('Identifier'), o('ThisProperty'), o('Array'), o('Object')], - Splat: [ - o('Expression ...', function() { - return new Splat($1); - }) - ], - SimpleAssignable: [ - o('Identifier', function() { - return new Value($1); - }), o('Value Accessor', function() { - return $1.add($2); - }), o('Invocation Accessor', function() { - return new Value($1, [].concat($2)); - }), o('ThisProperty') - ], - Assignable: [ - o('SimpleAssignable'), o('Array', function() { - return new Value($1); - }), o('Object', function() { - return new Value($1); - }) - ], - Value: [ - o('Assignable'), o('Literal', function() { - return new Value($1); - }), o('Parenthetical', function() { - return new Value($1); - }), o('Range', function() { - return new Value($1); - }), o('This') - ], - Accessor: [ - o('. Identifier', function() { - return new Access($2); - }), o('?. Identifier', function() { - return new Access($2, 'soak'); - }), o(':: Identifier', function() { - return [new Access(new Literal('prototype')), new Access($2)]; - }), o('::', function() { - return new Access(new Literal('prototype')); - }), o('Index') - ], - Index: [ - o('INDEX_START IndexValue INDEX_END', function() { - return $2; - }), o('INDEX_SOAK Index', function() { - return extend($2, { - soak: true - }); - }) - ], - IndexValue: [ - o('Expression', function() { - return new Index($1); - }), o('Slice', function() { - return new Slice($1); - }) - ], - Object: [ - o('{ AssignList OptComma }', function() { - return new Obj($2, $1.generated); - }) - ], - AssignList: [ - o('', function() { - return []; - }), o('AssignObj', function() { - return [$1]; - }), o('AssignList , AssignObj', function() { - return $1.concat($3); - }), o('AssignList OptComma TERMINATOR AssignObj', function() { - return $1.concat($4); - }), o('AssignList OptComma INDENT AssignList OptComma OUTDENT', function() { - return $1.concat($4); - }) - ], - Class: [ - o('CLASS', function() { - return new Class; - }), o('CLASS Block', function() { - return new Class(null, null, $2); - }), o('CLASS EXTENDS Expression', function() { - return new Class(null, $3); - }), o('CLASS EXTENDS Expression Block', function() { - return new Class(null, $3, $4); - }), o('CLASS SimpleAssignable', function() { - return new Class($2); - }), o('CLASS SimpleAssignable Block', function() { - return new Class($2, null, $3); - }), o('CLASS SimpleAssignable EXTENDS Expression', function() { - return new Class($2, $4); - }), o('CLASS SimpleAssignable EXTENDS Expression Block', function() { - return new Class($2, $4, $5); - }) - ], - Invocation: [ - o('Value OptFuncExist Arguments', function() { - return new Call($1, $3, $2); - }), o('Invocation OptFuncExist Arguments', function() { - return new Call($1, $3, $2); - }), o('SUPER', function() { - return new Call('super', [new Splat(new Literal('arguments'))]); - }), o('SUPER Arguments', function() { - return new Call('super', $2); - }) - ], - OptFuncExist: [ - o('', function() { - return false; - }), o('FUNC_EXIST', function() { - return true; - }) - ], - Arguments: [ - o('CALL_START CALL_END', function() { - return []; - }), o('CALL_START ArgList OptComma CALL_END', function() { - return $2; - }) - ], - This: [ - o('THIS', function() { - return new Value(new Literal('this')); - }), o('@', function() { - return new Value(new Literal('this')); - }) - ], - ThisProperty: [ - o('@ Identifier', function() { - return new Value(new Literal('this'), [new Access($2)], 'this'); - }) - ], - Array: [ - o('[ ]', function() { - return new Arr([]); - }), o('[ ArgList OptComma ]', function() { - return new Arr($2); - }) - ], - RangeDots: [ - o('..', function() { - return 'inclusive'; - }), o('...', function() { - return 'exclusive'; - }) - ], - Range: [ - o('[ Expression RangeDots Expression ]', function() { - return new Range($2, $4, $3); - }) - ], - Slice: [ - o('Expression RangeDots Expression', function() { - return new Range($1, $3, $2); - }), o('Expression RangeDots', function() { - return new Range($1, null, $2); - }), o('RangeDots Expression', function() { - return new Range(null, $2, $1); - }), o('RangeDots', function() { - return new Range(null, null, $1); - }) - ], - ArgList: [ - o('Arg', function() { - return [$1]; - }), o('ArgList , Arg', function() { - return $1.concat($3); - }), o('ArgList OptComma TERMINATOR Arg', function() { - return $1.concat($4); - }), o('INDENT ArgList OptComma OUTDENT', function() { - return $2; - }), o('ArgList OptComma INDENT ArgList OptComma OUTDENT', function() { - return $1.concat($4); - }) - ], - Arg: [o('Expression'), o('Splat')], - SimpleArgs: [ - o('Expression'), o('SimpleArgs , Expression', function() { - return [].concat($1, $3); - }) - ], - Try: [ - o('TRY Block', function() { - return new Try($2); - }), o('TRY Block Catch', function() { - return new Try($2, $3[0], $3[1]); - }), o('TRY Block FINALLY Block', function() { - return new Try($2, null, null, $4); - }), o('TRY Block Catch FINALLY Block', function() { - return new Try($2, $3[0], $3[1], $5); - }) - ], - Catch: [ - o('CATCH Identifier Block', function() { - return [$2, $3]; - }) - ], - Throw: [ - o('THROW Expression', function() { - return new Throw($2); - }) - ], - Parenthetical: [ - o('( Body )', function() { - return new Parens($2); - }), o('( INDENT Body OUTDENT )', function() { - return new Parens($3); - }) - ], - WhileSource: [ - o('WHILE Expression', function() { - return new While($2); - }), o('WHILE Expression WHEN Expression', function() { - return new While($2, { - guard: $4 - }); - }), o('UNTIL Expression', function() { - return new While($2, { - invert: true - }); - }), o('UNTIL Expression WHEN Expression', function() { - return new While($2, { - invert: true, - guard: $4 - }); - }) - ], - While: [ - o('WhileSource Block', function() { - return $1.addBody($2); - }), o('Statement WhileSource', function() { - return $2.addBody(Block.wrap([$1])); - }), o('Expression WhileSource', function() { - return $2.addBody(Block.wrap([$1])); - }), o('Loop', function() { - return $1; - }) - ], - Loop: [ - o('LOOP Block', function() { - return new While(new Literal('true')).addBody($2); - }), o('LOOP Expression', function() { - return new While(new Literal('true')).addBody(Block.wrap([$2])); - }) - ], - For: [ - o('Statement ForBody', function() { - return new For($1, $2); - }), o('Expression ForBody', function() { - return new For($1, $2); - }), o('ForBody Block', function() { - return new For($2, $1); - }) - ], - ForBody: [ - o('FOR Range', function() { - return { - source: new Value($2) - }; - }), o('ForStart ForSource', function() { - $2.own = $1.own; - $2.name = $1[0]; - $2.index = $1[1]; - return $2; - }) - ], - ForStart: [ - o('FOR ForVariables', function() { - return $2; - }), o('FOR OWN ForVariables', function() { - $3.own = true; - return $3; - }) - ], - ForValue: [ - o('Identifier'), o('ThisProperty'), o('Array', function() { - return new Value($1); - }), o('Object', function() { - return new Value($1); - }) - ], - ForVariables: [ - o('ForValue', function() { - return [$1]; - }), o('ForValue , ForValue', function() { - return [$1, $3]; - }) - ], - ForSource: [ - o('FORIN Expression', function() { - return { - source: $2 - }; - }), o('FOROF Expression', function() { - return { - source: $2, - object: true - }; - }), o('FORIN Expression WHEN Expression', function() { - return { - source: $2, - guard: $4 - }; - }), o('FOROF Expression WHEN Expression', function() { - return { - source: $2, - guard: $4, - object: true - }; - }), o('FORIN Expression BY Expression', function() { - return { - source: $2, - step: $4 - }; - }), o('FORIN Expression WHEN Expression BY Expression', function() { - return { - source: $2, - guard: $4, - step: $6 - }; - }), o('FORIN Expression BY Expression WHEN Expression', function() { - return { - source: $2, - step: $4, - guard: $6 - }; - }) - ], - Switch: [ - o('SWITCH Expression INDENT Whens OUTDENT', function() { - return new Switch($2, $4); - }), o('SWITCH Expression INDENT Whens ELSE Block OUTDENT', function() { - return new Switch($2, $4, $6); - }), o('SWITCH INDENT Whens OUTDENT', function() { - return new Switch(null, $3); - }), o('SWITCH INDENT Whens ELSE Block OUTDENT', function() { - return new Switch(null, $3, $5); - }) - ], - Whens: [ - o('When'), o('Whens When', function() { - return $1.concat($2); - }) - ], - When: [ - o('LEADING_WHEN SimpleArgs Block', function() { - return [[$2, $3]]; - }), o('LEADING_WHEN SimpleArgs Block TERMINATOR', function() { - return [[$2, $3]]; - }) - ], - IfBlock: [ - o('IF Expression Block', function() { - return new If($2, $3, { - type: $1 - }); - }), o('IfBlock ELSE IF Expression Block', function() { - return $1.addElse(new If($4, $5, { - type: $3 - })); - }) - ], - If: [ - o('IfBlock'), o('IfBlock ELSE Block', function() { - return $1.addElse($3); - }), o('Statement POST_IF Expression', function() { - return new If($3, Block.wrap([$1]), { - type: $2, - statement: true - }); - }), o('Expression POST_IF Expression', function() { - return new If($3, Block.wrap([$1]), { - type: $2, - statement: true - }); - }) - ], - Operation: [ - o('UNARY Expression', function() { - return new Op($1, $2); - }), o('- Expression', (function() { - return new Op('-', $2); - }), { - prec: 'UNARY' - }), o('+ Expression', (function() { - return new Op('+', $2); - }), { - prec: 'UNARY' - }), o('-- SimpleAssignable', function() { - return new Op('--', $2); - }), o('++ SimpleAssignable', function() { - return new Op('++', $2); - }), o('SimpleAssignable --', function() { - return new Op('--', $1, null, true); - }), o('SimpleAssignable ++', function() { - return new Op('++', $1, null, true); - }), o('Expression ?', function() { - return new Existence($1); - }), o('Expression + Expression', function() { - return new Op('+', $1, $3); - }), o('Expression - Expression', function() { - return new Op('-', $1, $3); - }), o('Expression MATH Expression', function() { - return new Op($2, $1, $3); - }), o('Expression SHIFT Expression', function() { - return new Op($2, $1, $3); - }), o('Expression COMPARE Expression', function() { - return new Op($2, $1, $3); - }), o('Expression LOGIC Expression', function() { - return new Op($2, $1, $3); - }), o('Expression RELATION Expression', function() { - if ($2.charAt(0) === '!') { - return new Op($2.slice(1), $1, $3).invert(); - } else { - return new Op($2, $1, $3); - } - }), o('SimpleAssignable COMPOUND_ASSIGN\ - Expression', function() { - return new Assign($1, $3, $2); - }), o('SimpleAssignable COMPOUND_ASSIGN\ - INDENT Expression OUTDENT', function() { - return new Assign($1, $4, $2); - }), o('SimpleAssignable EXTENDS Expression', function() { - return new Extends($1, $3); - }) - ] - }; - - operators = [['left', '.', '?.', '::'], ['left', 'CALL_START', 'CALL_END'], ['nonassoc', '++', '--'], ['left', '?'], ['right', 'UNARY'], ['left', 'MATH'], ['left', '+', '-'], ['left', 'SHIFT'], ['left', 'RELATION'], ['left', 'COMPARE'], ['left', 'LOGIC'], ['nonassoc', 'INDENT', 'OUTDENT'], ['right', '=', ':', 'COMPOUND_ASSIGN', 'RETURN', 'THROW', 'EXTENDS'], ['right', 'FORIN', 'FOROF', 'BY', 'WHEN'], ['right', 'IF', 'ELSE', 'FOR', 'WHILE', 'UNTIL', 'LOOP', 'SUPER', 'CLASS'], ['right', 'POST_IF']]; - - tokens = []; - - for (name in grammar) { - alternatives = grammar[name]; - grammar[name] = (function() { - var _i, _j, _len, _len1, _ref, _results; - _results = []; - for (_i = 0, _len = alternatives.length; _i < _len; _i++) { - alt = alternatives[_i]; - _ref = alt[0].split(' '); - for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { - token = _ref[_j]; - if (!grammar[token]) { - tokens.push(token); - } - } - if (name === 'Root') { - alt[1] = "return " + alt[1]; - } - _results.push(alt); - } - return _results; - })(); - } - - exports.parser = new Parser({ - tokens: tokens.join(' '), - bnf: grammar, - operators: operators.reverse(), - startSymbol: 'Root' - }); - -}).call(this); diff --git a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/helpers.js b/node_modules/jade/node_modules/coffee-script/lib/coffee-script/helpers.js deleted file mode 100644 index f9929f7..0000000 --- a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/helpers.js +++ /dev/null @@ -1,88 +0,0 @@ -// Generated by CoffeeScript 1.4.0 -(function() { - var extend, flatten, _ref; - - exports.starts = function(string, literal, start) { - return literal === string.substr(start, literal.length); - }; - - exports.ends = function(string, literal, back) { - var len; - len = literal.length; - return literal === string.substr(string.length - len - (back || 0), len); - }; - - exports.compact = function(array) { - var item, _i, _len, _results; - _results = []; - for (_i = 0, _len = array.length; _i < _len; _i++) { - item = array[_i]; - if (item) { - _results.push(item); - } - } - return _results; - }; - - exports.count = function(string, substr) { - var num, pos; - num = pos = 0; - if (!substr.length) { - return 1 / 0; - } - while (pos = 1 + string.indexOf(substr, pos)) { - num++; - } - return num; - }; - - exports.merge = function(options, overrides) { - return extend(extend({}, options), overrides); - }; - - extend = exports.extend = function(object, properties) { - var key, val; - for (key in properties) { - val = properties[key]; - object[key] = val; - } - return object; - }; - - exports.flatten = flatten = function(array) { - var element, flattened, _i, _len; - flattened = []; - for (_i = 0, _len = array.length; _i < _len; _i++) { - element = array[_i]; - if (element instanceof Array) { - flattened = flattened.concat(flatten(element)); - } else { - flattened.push(element); - } - } - return flattened; - }; - - exports.del = function(obj, key) { - var val; - val = obj[key]; - delete obj[key]; - return val; - }; - - exports.last = function(array, back) { - return array[array.length - (back || 0) - 1]; - }; - - exports.some = (_ref = Array.prototype.some) != null ? _ref : function(fn) { - var e, _i, _len; - for (_i = 0, _len = this.length; _i < _len; _i++) { - e = this[_i]; - if (fn(e)) { - return true; - } - } - return false; - }; - -}).call(this); diff --git a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/index.js b/node_modules/jade/node_modules/coffee-script/lib/coffee-script/index.js deleted file mode 100644 index b1c1765..0000000 --- a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/index.js +++ /dev/null @@ -1,11 +0,0 @@ -// Generated by CoffeeScript 1.4.0 -(function() { - var key, val, _ref; - - _ref = require('./coffee-script'); - for (key in _ref) { - val = _ref[key]; - exports[key] = val; - } - -}).call(this); diff --git a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/lexer.js b/node_modules/jade/node_modules/coffee-script/lib/coffee-script/lexer.js deleted file mode 100644 index 1b777cb..0000000 --- a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/lexer.js +++ /dev/null @@ -1,788 +0,0 @@ -// Generated by CoffeeScript 1.4.0 -(function() { - var BOOL, CALLABLE, CODE, COFFEE_ALIASES, COFFEE_ALIAS_MAP, COFFEE_KEYWORDS, COMMENT, COMPARE, COMPOUND_ASSIGN, HEREDOC, HEREDOC_ILLEGAL, HEREDOC_INDENT, HEREGEX, HEREGEX_OMIT, IDENTIFIER, INDEXABLE, INVERSES, JSTOKEN, JS_FORBIDDEN, JS_KEYWORDS, LINE_BREAK, LINE_CONTINUER, LOGIC, Lexer, MATH, MULTILINER, MULTI_DENT, NOT_REGEX, NOT_SPACED_REGEX, NUMBER, OPERATOR, REGEX, RELATION, RESERVED, Rewriter, SHIFT, SIMPLESTR, STRICT_PROSCRIBED, TRAILING_SPACES, UNARY, WHITESPACE, compact, count, key, last, starts, _ref, _ref1, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - - _ref = require('./rewriter'), Rewriter = _ref.Rewriter, INVERSES = _ref.INVERSES; - - _ref1 = require('./helpers'), count = _ref1.count, starts = _ref1.starts, compact = _ref1.compact, last = _ref1.last; - - exports.Lexer = Lexer = (function() { - - function Lexer() {} - - Lexer.prototype.tokenize = function(code, opts) { - var i, tag; - if (opts == null) { - opts = {}; - } - if (WHITESPACE.test(code)) { - code = "\n" + code; - } - code = code.replace(/\r/g, '').replace(TRAILING_SPACES, ''); - this.code = code; - this.line = opts.line || 0; - this.indent = 0; - this.indebt = 0; - this.outdebt = 0; - this.indents = []; - this.ends = []; - this.tokens = []; - i = 0; - while (this.chunk = code.slice(i)) { - i += this.identifierToken() || this.commentToken() || this.whitespaceToken() || this.lineToken() || this.heredocToken() || this.stringToken() || this.numberToken() || this.regexToken() || this.jsToken() || this.literalToken(); - } - this.closeIndentation(); - if (tag = this.ends.pop()) { - this.error("missing " + tag); - } - if (opts.rewrite === false) { - return this.tokens; - } - return (new Rewriter).rewrite(this.tokens); - }; - - Lexer.prototype.identifierToken = function() { - var colon, forcedIdentifier, id, input, match, prev, tag, _ref2, _ref3; - if (!(match = IDENTIFIER.exec(this.chunk))) { - return 0; - } - input = match[0], id = match[1], colon = match[2]; - if (id === 'own' && this.tag() === 'FOR') { - this.token('OWN', id); - return id.length; - } - forcedIdentifier = colon || (prev = last(this.tokens)) && (((_ref2 = prev[0]) === '.' || _ref2 === '?.' || _ref2 === '::') || !prev.spaced && prev[0] === '@'); - tag = 'IDENTIFIER'; - if (!forcedIdentifier && (__indexOf.call(JS_KEYWORDS, id) >= 0 || __indexOf.call(COFFEE_KEYWORDS, id) >= 0)) { - tag = id.toUpperCase(); - if (tag === 'WHEN' && (_ref3 = this.tag(), __indexOf.call(LINE_BREAK, _ref3) >= 0)) { - tag = 'LEADING_WHEN'; - } else if (tag === 'FOR') { - this.seenFor = true; - } else if (tag === 'UNLESS') { - tag = 'IF'; - } else if (__indexOf.call(UNARY, tag) >= 0) { - tag = 'UNARY'; - } else if (__indexOf.call(RELATION, tag) >= 0) { - if (tag !== 'INSTANCEOF' && this.seenFor) { - tag = 'FOR' + tag; - this.seenFor = false; - } else { - tag = 'RELATION'; - if (this.value() === '!') { - this.tokens.pop(); - id = '!' + id; - } - } - } - } - if (__indexOf.call(JS_FORBIDDEN, id) >= 0) { - if (forcedIdentifier) { - tag = 'IDENTIFIER'; - id = new String(id); - id.reserved = true; - } else if (__indexOf.call(RESERVED, id) >= 0) { - this.error("reserved word \"" + id + "\""); - } - } - if (!forcedIdentifier) { - if (__indexOf.call(COFFEE_ALIASES, id) >= 0) { - id = COFFEE_ALIAS_MAP[id]; - } - tag = (function() { - switch (id) { - case '!': - return 'UNARY'; - case '==': - case '!=': - return 'COMPARE'; - case '&&': - case '||': - return 'LOGIC'; - case 'true': - case 'false': - return 'BOOL'; - case 'break': - case 'continue': - return 'STATEMENT'; - default: - return tag; - } - })(); - } - this.token(tag, id); - if (colon) { - this.token(':', ':'); - } - return input.length; - }; - - Lexer.prototype.numberToken = function() { - var binaryLiteral, lexedLength, match, number, octalLiteral; - if (!(match = NUMBER.exec(this.chunk))) { - return 0; - } - number = match[0]; - if (/^0[BOX]/.test(number)) { - this.error("radix prefix '" + number + "' must be lowercase"); - } else if (/E/.test(number) && !/^0x/.test(number)) { - this.error("exponential notation '" + number + "' must be indicated with a lowercase 'e'"); - } else if (/^0\d*[89]/.test(number)) { - this.error("decimal literal '" + number + "' must not be prefixed with '0'"); - } else if (/^0\d+/.test(number)) { - this.error("octal literal '" + number + "' must be prefixed with '0o'"); - } - lexedLength = number.length; - if (octalLiteral = /^0o([0-7]+)/.exec(number)) { - number = '0x' + (parseInt(octalLiteral[1], 8)).toString(16); - } - if (binaryLiteral = /^0b([01]+)/.exec(number)) { - number = '0x' + (parseInt(binaryLiteral[1], 2)).toString(16); - } - this.token('NUMBER', number); - return lexedLength; - }; - - Lexer.prototype.stringToken = function() { - var match, octalEsc, string; - switch (this.chunk.charAt(0)) { - case "'": - if (!(match = SIMPLESTR.exec(this.chunk))) { - return 0; - } - this.token('STRING', (string = match[0]).replace(MULTILINER, '\\\n')); - break; - case '"': - if (!(string = this.balancedString(this.chunk, '"'))) { - return 0; - } - if (0 < string.indexOf('#{', 1)) { - this.interpolateString(string.slice(1, -1)); - } else { - this.token('STRING', this.escapeLines(string)); - } - break; - default: - return 0; - } - if (octalEsc = /^(?:\\.|[^\\])*\\(?:0[0-7]|[1-7])/.test(string)) { - this.error("octal escape sequences " + string + " are not allowed"); - } - this.line += count(string, '\n'); - return string.length; - }; - - Lexer.prototype.heredocToken = function() { - var doc, heredoc, match, quote; - if (!(match = HEREDOC.exec(this.chunk))) { - return 0; - } - heredoc = match[0]; - quote = heredoc.charAt(0); - doc = this.sanitizeHeredoc(match[2], { - quote: quote, - indent: null - }); - if (quote === '"' && 0 <= doc.indexOf('#{')) { - this.interpolateString(doc, { - heredoc: true - }); - } else { - this.token('STRING', this.makeString(doc, quote, true)); - } - this.line += count(heredoc, '\n'); - return heredoc.length; - }; - - Lexer.prototype.commentToken = function() { - var comment, here, match; - if (!(match = this.chunk.match(COMMENT))) { - return 0; - } - comment = match[0], here = match[1]; - if (here) { - this.token('HERECOMMENT', this.sanitizeHeredoc(here, { - herecomment: true, - indent: Array(this.indent + 1).join(' ') - })); - } - this.line += count(comment, '\n'); - return comment.length; - }; - - Lexer.prototype.jsToken = function() { - var match, script; - if (!(this.chunk.charAt(0) === '`' && (match = JSTOKEN.exec(this.chunk)))) { - return 0; - } - this.token('JS', (script = match[0]).slice(1, -1)); - this.line += count(script, '\n'); - return script.length; - }; - - Lexer.prototype.regexToken = function() { - var flags, length, match, prev, regex, _ref2, _ref3; - if (this.chunk.charAt(0) !== '/') { - return 0; - } - if (match = HEREGEX.exec(this.chunk)) { - length = this.heregexToken(match); - this.line += count(match[0], '\n'); - return length; - } - prev = last(this.tokens); - if (prev && (_ref2 = prev[0], __indexOf.call((prev.spaced ? NOT_REGEX : NOT_SPACED_REGEX), _ref2) >= 0)) { - return 0; - } - if (!(match = REGEX.exec(this.chunk))) { - return 0; - } - _ref3 = match, match = _ref3[0], regex = _ref3[1], flags = _ref3[2]; - if (regex.slice(0, 2) === '/*') { - this.error('regular expressions cannot begin with `*`'); - } - if (regex === '//') { - regex = '/(?:)/'; - } - this.token('REGEX', "" + regex + flags); - return match.length; - }; - - Lexer.prototype.heregexToken = function(match) { - var body, flags, heregex, re, tag, tokens, value, _i, _len, _ref2, _ref3, _ref4, _ref5; - heregex = match[0], body = match[1], flags = match[2]; - if (0 > body.indexOf('#{')) { - re = body.replace(HEREGEX_OMIT, '').replace(/\//g, '\\/'); - if (re.match(/^\*/)) { - this.error('regular expressions cannot begin with `*`'); - } - this.token('REGEX', "/" + (re || '(?:)') + "/" + flags); - return heregex.length; - } - this.token('IDENTIFIER', 'RegExp'); - this.tokens.push(['CALL_START', '(']); - tokens = []; - _ref2 = this.interpolateString(body, { - regex: true - }); - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - _ref3 = _ref2[_i], tag = _ref3[0], value = _ref3[1]; - if (tag === 'TOKENS') { - tokens.push.apply(tokens, value); - } else { - if (!(value = value.replace(HEREGEX_OMIT, ''))) { - continue; - } - value = value.replace(/\\/g, '\\\\'); - tokens.push(['STRING', this.makeString(value, '"', true)]); - } - tokens.push(['+', '+']); - } - tokens.pop(); - if (((_ref4 = tokens[0]) != null ? _ref4[0] : void 0) !== 'STRING') { - this.tokens.push(['STRING', '""'], ['+', '+']); - } - (_ref5 = this.tokens).push.apply(_ref5, tokens); - if (flags) { - this.tokens.push([',', ','], ['STRING', '"' + flags + '"']); - } - this.token(')', ')'); - return heregex.length; - }; - - Lexer.prototype.lineToken = function() { - var diff, indent, match, noNewlines, size; - if (!(match = MULTI_DENT.exec(this.chunk))) { - return 0; - } - indent = match[0]; - this.line += count(indent, '\n'); - this.seenFor = false; - size = indent.length - 1 - indent.lastIndexOf('\n'); - noNewlines = this.unfinished(); - if (size - this.indebt === this.indent) { - if (noNewlines) { - this.suppressNewlines(); - } else { - this.newlineToken(); - } - return indent.length; - } - if (size > this.indent) { - if (noNewlines) { - this.indebt = size - this.indent; - this.suppressNewlines(); - return indent.length; - } - diff = size - this.indent + this.outdebt; - this.token('INDENT', diff); - this.indents.push(diff); - this.ends.push('OUTDENT'); - this.outdebt = this.indebt = 0; - } else { - this.indebt = 0; - this.outdentToken(this.indent - size, noNewlines); - } - this.indent = size; - return indent.length; - }; - - Lexer.prototype.outdentToken = function(moveOut, noNewlines) { - var dent, len; - while (moveOut > 0) { - len = this.indents.length - 1; - if (this.indents[len] === void 0) { - moveOut = 0; - } else if (this.indents[len] === this.outdebt) { - moveOut -= this.outdebt; - this.outdebt = 0; - } else if (this.indents[len] < this.outdebt) { - this.outdebt -= this.indents[len]; - moveOut -= this.indents[len]; - } else { - dent = this.indents.pop() - this.outdebt; - moveOut -= dent; - this.outdebt = 0; - this.pair('OUTDENT'); - this.token('OUTDENT', dent); - } - } - if (dent) { - this.outdebt -= moveOut; - } - while (this.value() === ';') { - this.tokens.pop(); - } - if (!(this.tag() === 'TERMINATOR' || noNewlines)) { - this.token('TERMINATOR', '\n'); - } - return this; - }; - - Lexer.prototype.whitespaceToken = function() { - var match, nline, prev; - if (!((match = WHITESPACE.exec(this.chunk)) || (nline = this.chunk.charAt(0) === '\n'))) { - return 0; - } - prev = last(this.tokens); - if (prev) { - prev[match ? 'spaced' : 'newLine'] = true; - } - if (match) { - return match[0].length; - } else { - return 0; - } - }; - - Lexer.prototype.newlineToken = function() { - while (this.value() === ';') { - this.tokens.pop(); - } - if (this.tag() !== 'TERMINATOR') { - this.token('TERMINATOR', '\n'); - } - return this; - }; - - Lexer.prototype.suppressNewlines = function() { - if (this.value() === '\\') { - this.tokens.pop(); - } - return this; - }; - - Lexer.prototype.literalToken = function() { - var match, prev, tag, value, _ref2, _ref3, _ref4, _ref5; - if (match = OPERATOR.exec(this.chunk)) { - value = match[0]; - if (CODE.test(value)) { - this.tagParameters(); - } - } else { - value = this.chunk.charAt(0); - } - tag = value; - prev = last(this.tokens); - if (value === '=' && prev) { - if (!prev[1].reserved && (_ref2 = prev[1], __indexOf.call(JS_FORBIDDEN, _ref2) >= 0)) { - this.error("reserved word \"" + (this.value()) + "\" can't be assigned"); - } - if ((_ref3 = prev[1]) === '||' || _ref3 === '&&') { - prev[0] = 'COMPOUND_ASSIGN'; - prev[1] += '='; - return value.length; - } - } - if (value === ';') { - this.seenFor = false; - tag = 'TERMINATOR'; - } else if (__indexOf.call(MATH, value) >= 0) { - tag = 'MATH'; - } else if (__indexOf.call(COMPARE, value) >= 0) { - tag = 'COMPARE'; - } else if (__indexOf.call(COMPOUND_ASSIGN, value) >= 0) { - tag = 'COMPOUND_ASSIGN'; - } else if (__indexOf.call(UNARY, value) >= 0) { - tag = 'UNARY'; - } else if (__indexOf.call(SHIFT, value) >= 0) { - tag = 'SHIFT'; - } else if (__indexOf.call(LOGIC, value) >= 0 || value === '?' && (prev != null ? prev.spaced : void 0)) { - tag = 'LOGIC'; - } else if (prev && !prev.spaced) { - if (value === '(' && (_ref4 = prev[0], __indexOf.call(CALLABLE, _ref4) >= 0)) { - if (prev[0] === '?') { - prev[0] = 'FUNC_EXIST'; - } - tag = 'CALL_START'; - } else if (value === '[' && (_ref5 = prev[0], __indexOf.call(INDEXABLE, _ref5) >= 0)) { - tag = 'INDEX_START'; - switch (prev[0]) { - case '?': - prev[0] = 'INDEX_SOAK'; - } - } - } - switch (value) { - case '(': - case '{': - case '[': - this.ends.push(INVERSES[value]); - break; - case ')': - case '}': - case ']': - this.pair(value); - } - this.token(tag, value); - return value.length; - }; - - Lexer.prototype.sanitizeHeredoc = function(doc, options) { - var attempt, herecomment, indent, match, _ref2; - indent = options.indent, herecomment = options.herecomment; - if (herecomment) { - if (HEREDOC_ILLEGAL.test(doc)) { - this.error("block comment cannot contain \"*/\", starting"); - } - if (doc.indexOf('\n') <= 0) { - return doc; - } - } else { - while (match = HEREDOC_INDENT.exec(doc)) { - attempt = match[1]; - if (indent === null || (0 < (_ref2 = attempt.length) && _ref2 < indent.length)) { - indent = attempt; - } - } - } - if (indent) { - doc = doc.replace(RegExp("\\n" + indent, "g"), '\n'); - } - if (!herecomment) { - doc = doc.replace(/^\n/, ''); - } - return doc; - }; - - Lexer.prototype.tagParameters = function() { - var i, stack, tok, tokens; - if (this.tag() !== ')') { - return this; - } - stack = []; - tokens = this.tokens; - i = tokens.length; - tokens[--i][0] = 'PARAM_END'; - while (tok = tokens[--i]) { - switch (tok[0]) { - case ')': - stack.push(tok); - break; - case '(': - case 'CALL_START': - if (stack.length) { - stack.pop(); - } else if (tok[0] === '(') { - tok[0] = 'PARAM_START'; - return this; - } else { - return this; - } - } - } - return this; - }; - - Lexer.prototype.closeIndentation = function() { - return this.outdentToken(this.indent); - }; - - Lexer.prototype.balancedString = function(str, end) { - var continueCount, i, letter, match, prev, stack, _i, _ref2; - continueCount = 0; - stack = [end]; - for (i = _i = 1, _ref2 = str.length; 1 <= _ref2 ? _i < _ref2 : _i > _ref2; i = 1 <= _ref2 ? ++_i : --_i) { - if (continueCount) { - --continueCount; - continue; - } - switch (letter = str.charAt(i)) { - case '\\': - ++continueCount; - continue; - case end: - stack.pop(); - if (!stack.length) { - return str.slice(0, +i + 1 || 9e9); - } - end = stack[stack.length - 1]; - continue; - } - if (end === '}' && (letter === '"' || letter === "'")) { - stack.push(end = letter); - } else if (end === '}' && letter === '/' && (match = HEREGEX.exec(str.slice(i)) || REGEX.exec(str.slice(i)))) { - continueCount += match[0].length - 1; - } else if (end === '}' && letter === '{') { - stack.push(end = '}'); - } else if (end === '"' && prev === '#' && letter === '{') { - stack.push(end = '}'); - } - prev = letter; - } - return this.error("missing " + (stack.pop()) + ", starting"); - }; - - Lexer.prototype.interpolateString = function(str, options) { - var expr, heredoc, i, inner, interpolated, len, letter, nested, pi, regex, tag, tokens, value, _i, _len, _ref2, _ref3, _ref4; - if (options == null) { - options = {}; - } - heredoc = options.heredoc, regex = options.regex; - tokens = []; - pi = 0; - i = -1; - while (letter = str.charAt(i += 1)) { - if (letter === '\\') { - i += 1; - continue; - } - if (!(letter === '#' && str.charAt(i + 1) === '{' && (expr = this.balancedString(str.slice(i + 1), '}')))) { - continue; - } - if (pi < i) { - tokens.push(['NEOSTRING', str.slice(pi, i)]); - } - inner = expr.slice(1, -1); - if (inner.length) { - nested = new Lexer().tokenize(inner, { - line: this.line, - rewrite: false - }); - nested.pop(); - if (((_ref2 = nested[0]) != null ? _ref2[0] : void 0) === 'TERMINATOR') { - nested.shift(); - } - if (len = nested.length) { - if (len > 1) { - nested.unshift(['(', '(', this.line]); - nested.push([')', ')', this.line]); - } - tokens.push(['TOKENS', nested]); - } - } - i += expr.length; - pi = i + 1; - } - if ((i > pi && pi < str.length)) { - tokens.push(['NEOSTRING', str.slice(pi)]); - } - if (regex) { - return tokens; - } - if (!tokens.length) { - return this.token('STRING', '""'); - } - if (tokens[0][0] !== 'NEOSTRING') { - tokens.unshift(['', '']); - } - if (interpolated = tokens.length > 1) { - this.token('(', '('); - } - for (i = _i = 0, _len = tokens.length; _i < _len; i = ++_i) { - _ref3 = tokens[i], tag = _ref3[0], value = _ref3[1]; - if (i) { - this.token('+', '+'); - } - if (tag === 'TOKENS') { - (_ref4 = this.tokens).push.apply(_ref4, value); - } else { - this.token('STRING', this.makeString(value, '"', heredoc)); - } - } - if (interpolated) { - this.token(')', ')'); - } - return tokens; - }; - - Lexer.prototype.pair = function(tag) { - var size, wanted; - if (tag !== (wanted = last(this.ends))) { - if ('OUTDENT' !== wanted) { - this.error("unmatched " + tag); - } - this.indent -= size = last(this.indents); - this.outdentToken(size, true); - return this.pair(tag); - } - return this.ends.pop(); - }; - - Lexer.prototype.token = function(tag, value) { - return this.tokens.push([tag, value, this.line]); - }; - - Lexer.prototype.tag = function(index, tag) { - var tok; - return (tok = last(this.tokens, index)) && (tag ? tok[0] = tag : tok[0]); - }; - - Lexer.prototype.value = function(index, val) { - var tok; - return (tok = last(this.tokens, index)) && (val ? tok[1] = val : tok[1]); - }; - - Lexer.prototype.unfinished = function() { - var _ref2; - return LINE_CONTINUER.test(this.chunk) || ((_ref2 = this.tag()) === '\\' || _ref2 === '.' || _ref2 === '?.' || _ref2 === 'UNARY' || _ref2 === 'MATH' || _ref2 === '+' || _ref2 === '-' || _ref2 === 'SHIFT' || _ref2 === 'RELATION' || _ref2 === 'COMPARE' || _ref2 === 'LOGIC' || _ref2 === 'THROW' || _ref2 === 'EXTENDS'); - }; - - Lexer.prototype.escapeLines = function(str, heredoc) { - return str.replace(MULTILINER, heredoc ? '\\n' : ''); - }; - - Lexer.prototype.makeString = function(body, quote, heredoc) { - if (!body) { - return quote + quote; - } - body = body.replace(/\\([\s\S])/g, function(match, contents) { - if (contents === '\n' || contents === quote) { - return contents; - } else { - return match; - } - }); - body = body.replace(RegExp("" + quote, "g"), '\\$&'); - return quote + this.escapeLines(body, heredoc) + quote; - }; - - Lexer.prototype.error = function(message) { - throw SyntaxError("" + message + " on line " + (this.line + 1)); - }; - - return Lexer; - - })(); - - JS_KEYWORDS = ['true', 'false', 'null', 'this', 'new', 'delete', 'typeof', 'in', 'instanceof', 'return', 'throw', 'break', 'continue', 'debugger', 'if', 'else', 'switch', 'for', 'while', 'do', 'try', 'catch', 'finally', 'class', 'extends', 'super']; - - COFFEE_KEYWORDS = ['undefined', 'then', 'unless', 'until', 'loop', 'of', 'by', 'when']; - - COFFEE_ALIAS_MAP = { - and: '&&', - or: '||', - is: '==', - isnt: '!=', - not: '!', - yes: 'true', - no: 'false', - on: 'true', - off: 'false' - }; - - COFFEE_ALIASES = (function() { - var _results; - _results = []; - for (key in COFFEE_ALIAS_MAP) { - _results.push(key); - } - return _results; - })(); - - COFFEE_KEYWORDS = COFFEE_KEYWORDS.concat(COFFEE_ALIASES); - - RESERVED = ['case', 'default', 'function', 'var', 'void', 'with', 'const', 'let', 'enum', 'export', 'import', 'native', '__hasProp', '__extends', '__slice', '__bind', '__indexOf', 'implements', 'interface', 'package', 'private', 'protected', 'public', 'static', 'yield']; - - STRICT_PROSCRIBED = ['arguments', 'eval']; - - JS_FORBIDDEN = JS_KEYWORDS.concat(RESERVED).concat(STRICT_PROSCRIBED); - - exports.RESERVED = RESERVED.concat(JS_KEYWORDS).concat(COFFEE_KEYWORDS).concat(STRICT_PROSCRIBED); - - exports.STRICT_PROSCRIBED = STRICT_PROSCRIBED; - - IDENTIFIER = /^([$A-Za-z_\x7f-\uffff][$\w\x7f-\uffff]*)([^\n\S]*:(?!:))?/; - - NUMBER = /^0b[01]+|^0o[0-7]+|^0x[\da-f]+|^\d*\.?\d+(?:e[+-]?\d+)?/i; - - HEREDOC = /^("""|''')([\s\S]*?)(?:\n[^\n\S]*)?\1/; - - OPERATOR = /^(?:[-=]>|[-+*\/%<>&|^!?=]=|>>>=?|([-+:])\1|([&|<>])\2=?|\?\.|\.{2,3})/; - - WHITESPACE = /^[^\n\S]+/; - - COMMENT = /^###([^#][\s\S]*?)(?:###[^\n\S]*|(?:###)?$)|^(?:\s*#(?!##[^#]).*)+/; - - CODE = /^[-=]>/; - - MULTI_DENT = /^(?:\n[^\n\S]*)+/; - - SIMPLESTR = /^'[^\\']*(?:\\.[^\\']*)*'/; - - JSTOKEN = /^`[^\\`]*(?:\\.[^\\`]*)*`/; - - REGEX = /^(\/(?![\s=])[^[\/\n\\]*(?:(?:\\[\s\S]|\[[^\]\n\\]*(?:\\[\s\S][^\]\n\\]*)*])[^[\/\n\\]*)*\/)([imgy]{0,4})(?!\w)/; - - HEREGEX = /^\/{3}([\s\S]+?)\/{3}([imgy]{0,4})(?!\w)/; - - HEREGEX_OMIT = /\s+(?:#.*)?/g; - - MULTILINER = /\n/g; - - HEREDOC_INDENT = /\n+([^\n\S]*)/g; - - HEREDOC_ILLEGAL = /\*\//; - - LINE_CONTINUER = /^\s*(?:,|\??\.(?![.\d])|::)/; - - TRAILING_SPACES = /\s+$/; - - COMPOUND_ASSIGN = ['-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>=', '&=', '^=', '|=']; - - UNARY = ['!', '~', 'NEW', 'TYPEOF', 'DELETE', 'DO']; - - LOGIC = ['&&', '||', '&', '|', '^']; - - SHIFT = ['<<', '>>', '>>>']; - - COMPARE = ['==', '!=', '<', '>', '<=', '>=']; - - MATH = ['*', '/', '%']; - - RELATION = ['IN', 'OF', 'INSTANCEOF']; - - BOOL = ['TRUE', 'FALSE']; - - NOT_REGEX = ['NUMBER', 'REGEX', 'BOOL', 'NULL', 'UNDEFINED', '++', '--', ']']; - - NOT_SPACED_REGEX = NOT_REGEX.concat(')', '}', 'THIS', 'IDENTIFIER', 'STRING'); - - CALLABLE = ['IDENTIFIER', 'STRING', 'REGEX', ')', ']', '}', '?', '::', '@', 'THIS', 'SUPER']; - - INDEXABLE = CALLABLE.concat('NUMBER', 'BOOL', 'NULL', 'UNDEFINED'); - - LINE_BREAK = ['INDENT', 'OUTDENT', 'TERMINATOR']; - -}).call(this); diff --git a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/nodes.js b/node_modules/jade/node_modules/coffee-script/lib/coffee-script/nodes.js deleted file mode 100644 index f8e0777..0000000 --- a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/nodes.js +++ /dev/null @@ -1,2971 +0,0 @@ -// Generated by CoffeeScript 1.4.0 -(function() { - var Access, Arr, Assign, Base, Block, Call, Class, Closure, Code, Comment, Existence, Extends, For, IDENTIFIER, IDENTIFIER_STR, IS_STRING, If, In, Index, LEVEL_ACCESS, LEVEL_COND, LEVEL_LIST, LEVEL_OP, LEVEL_PAREN, LEVEL_TOP, Literal, METHOD_DEF, NEGATE, NO, Obj, Op, Param, Parens, RESERVED, Range, Return, SIMPLENUM, STRICT_PROSCRIBED, Scope, Slice, Splat, Switch, TAB, THIS, Throw, Try, UTILITIES, Value, While, YES, compact, del, ends, extend, flatten, last, merge, multident, some, starts, unfoldSoak, utility, _ref, _ref1, - __hasProp = {}.hasOwnProperty, - __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - - Scope = require('./scope').Scope; - - _ref = require('./lexer'), RESERVED = _ref.RESERVED, STRICT_PROSCRIBED = _ref.STRICT_PROSCRIBED; - - _ref1 = require('./helpers'), compact = _ref1.compact, flatten = _ref1.flatten, extend = _ref1.extend, merge = _ref1.merge, del = _ref1.del, starts = _ref1.starts, ends = _ref1.ends, last = _ref1.last, some = _ref1.some; - - exports.extend = extend; - - YES = function() { - return true; - }; - - NO = function() { - return false; - }; - - THIS = function() { - return this; - }; - - NEGATE = function() { - this.negated = !this.negated; - return this; - }; - - exports.Base = Base = (function() { - - function Base() {} - - Base.prototype.compile = function(o, lvl) { - var node; - o = extend({}, o); - if (lvl) { - o.level = lvl; - } - node = this.unfoldSoak(o) || this; - node.tab = o.indent; - if (o.level === LEVEL_TOP || !node.isStatement(o)) { - return node.compileNode(o); - } else { - return node.compileClosure(o); - } - }; - - Base.prototype.compileClosure = function(o) { - if (this.jumps()) { - throw SyntaxError('cannot use a pure statement in an expression.'); - } - o.sharedScope = true; - return Closure.wrap(this).compileNode(o); - }; - - Base.prototype.cache = function(o, level, reused) { - var ref, sub; - if (!this.isComplex()) { - ref = level ? this.compile(o, level) : this; - return [ref, ref]; - } else { - ref = new Literal(reused || o.scope.freeVariable('ref')); - sub = new Assign(ref, this); - if (level) { - return [sub.compile(o, level), ref.value]; - } else { - return [sub, ref]; - } - } - }; - - Base.prototype.compileLoopReference = function(o, name) { - var src, tmp; - src = tmp = this.compile(o, LEVEL_LIST); - if (!((-Infinity < +src && +src < Infinity) || IDENTIFIER.test(src) && o.scope.check(src, true))) { - src = "" + (tmp = o.scope.freeVariable(name)) + " = " + src; - } - return [src, tmp]; - }; - - Base.prototype.makeReturn = function(res) { - var me; - me = this.unwrapAll(); - if (res) { - return new Call(new Literal("" + res + ".push"), [me]); - } else { - return new Return(me); - } - }; - - Base.prototype.contains = function(pred) { - var contains; - contains = false; - this.traverseChildren(false, function(node) { - if (pred(node)) { - contains = true; - return false; - } - }); - return contains; - }; - - Base.prototype.containsType = function(type) { - return this instanceof type || this.contains(function(node) { - return node instanceof type; - }); - }; - - Base.prototype.lastNonComment = function(list) { - var i; - i = list.length; - while (i--) { - if (!(list[i] instanceof Comment)) { - return list[i]; - } - } - return null; - }; - - Base.prototype.toString = function(idt, name) { - var tree; - if (idt == null) { - idt = ''; - } - if (name == null) { - name = this.constructor.name; - } - tree = '\n' + idt + name; - if (this.soak) { - tree += '?'; - } - this.eachChild(function(node) { - return tree += node.toString(idt + TAB); - }); - return tree; - }; - - Base.prototype.eachChild = function(func) { - var attr, child, _i, _j, _len, _len1, _ref2, _ref3; - if (!this.children) { - return this; - } - _ref2 = this.children; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - attr = _ref2[_i]; - if (this[attr]) { - _ref3 = flatten([this[attr]]); - for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) { - child = _ref3[_j]; - if (func(child) === false) { - return this; - } - } - } - } - return this; - }; - - Base.prototype.traverseChildren = function(crossScope, func) { - return this.eachChild(function(child) { - if (func(child) === false) { - return false; - } - return child.traverseChildren(crossScope, func); - }); - }; - - Base.prototype.invert = function() { - return new Op('!', this); - }; - - Base.prototype.unwrapAll = function() { - var node; - node = this; - while (node !== (node = node.unwrap())) { - continue; - } - return node; - }; - - Base.prototype.children = []; - - Base.prototype.isStatement = NO; - - Base.prototype.jumps = NO; - - Base.prototype.isComplex = YES; - - Base.prototype.isChainable = NO; - - Base.prototype.isAssignable = NO; - - Base.prototype.unwrap = THIS; - - Base.prototype.unfoldSoak = NO; - - Base.prototype.assigns = NO; - - return Base; - - })(); - - exports.Block = Block = (function(_super) { - - __extends(Block, _super); - - function Block(nodes) { - this.expressions = compact(flatten(nodes || [])); - } - - Block.prototype.children = ['expressions']; - - Block.prototype.push = function(node) { - this.expressions.push(node); - return this; - }; - - Block.prototype.pop = function() { - return this.expressions.pop(); - }; - - Block.prototype.unshift = function(node) { - this.expressions.unshift(node); - return this; - }; - - Block.prototype.unwrap = function() { - if (this.expressions.length === 1) { - return this.expressions[0]; - } else { - return this; - } - }; - - Block.prototype.isEmpty = function() { - return !this.expressions.length; - }; - - Block.prototype.isStatement = function(o) { - var exp, _i, _len, _ref2; - _ref2 = this.expressions; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - exp = _ref2[_i]; - if (exp.isStatement(o)) { - return true; - } - } - return false; - }; - - Block.prototype.jumps = function(o) { - var exp, _i, _len, _ref2; - _ref2 = this.expressions; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - exp = _ref2[_i]; - if (exp.jumps(o)) { - return exp; - } - } - }; - - Block.prototype.makeReturn = function(res) { - var expr, len; - len = this.expressions.length; - while (len--) { - expr = this.expressions[len]; - if (!(expr instanceof Comment)) { - this.expressions[len] = expr.makeReturn(res); - if (expr instanceof Return && !expr.expression) { - this.expressions.splice(len, 1); - } - break; - } - } - return this; - }; - - Block.prototype.compile = function(o, level) { - if (o == null) { - o = {}; - } - if (o.scope) { - return Block.__super__.compile.call(this, o, level); - } else { - return this.compileRoot(o); - } - }; - - Block.prototype.compileNode = function(o) { - var code, codes, node, top, _i, _len, _ref2; - this.tab = o.indent; - top = o.level === LEVEL_TOP; - codes = []; - _ref2 = this.expressions; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - node = _ref2[_i]; - node = node.unwrapAll(); - node = node.unfoldSoak(o) || node; - if (node instanceof Block) { - codes.push(node.compileNode(o)); - } else if (top) { - node.front = true; - code = node.compile(o); - if (!node.isStatement(o)) { - code = "" + this.tab + code + ";"; - if (node instanceof Literal) { - code = "" + code + "\n"; - } - } - codes.push(code); - } else { - codes.push(node.compile(o, LEVEL_LIST)); - } - } - if (top) { - if (this.spaced) { - return "\n" + (codes.join('\n\n')) + "\n"; - } else { - return codes.join('\n'); - } - } - code = codes.join(', ') || 'void 0'; - if (codes.length > 1 && o.level >= LEVEL_LIST) { - return "(" + code + ")"; - } else { - return code; - } - }; - - Block.prototype.compileRoot = function(o) { - var code, exp, i, prelude, preludeExps, rest; - o.indent = o.bare ? '' : TAB; - o.scope = new Scope(null, this, null); - o.level = LEVEL_TOP; - this.spaced = true; - prelude = ""; - if (!o.bare) { - preludeExps = (function() { - var _i, _len, _ref2, _results; - _ref2 = this.expressions; - _results = []; - for (i = _i = 0, _len = _ref2.length; _i < _len; i = ++_i) { - exp = _ref2[i]; - if (!(exp.unwrap() instanceof Comment)) { - break; - } - _results.push(exp); - } - return _results; - }).call(this); - rest = this.expressions.slice(preludeExps.length); - this.expressions = preludeExps; - if (preludeExps.length) { - prelude = "" + (this.compileNode(merge(o, { - indent: '' - }))) + "\n"; - } - this.expressions = rest; - } - code = this.compileWithDeclarations(o); - if (o.bare) { - return code; - } - return "" + prelude + "(function() {\n" + code + "\n}).call(this);\n"; - }; - - Block.prototype.compileWithDeclarations = function(o) { - var assigns, code, declars, exp, i, post, rest, scope, spaced, _i, _len, _ref2, _ref3, _ref4; - code = post = ''; - _ref2 = this.expressions; - for (i = _i = 0, _len = _ref2.length; _i < _len; i = ++_i) { - exp = _ref2[i]; - exp = exp.unwrap(); - if (!(exp instanceof Comment || exp instanceof Literal)) { - break; - } - } - o = merge(o, { - level: LEVEL_TOP - }); - if (i) { - rest = this.expressions.splice(i, 9e9); - _ref3 = [this.spaced, false], spaced = _ref3[0], this.spaced = _ref3[1]; - _ref4 = [this.compileNode(o), spaced], code = _ref4[0], this.spaced = _ref4[1]; - this.expressions = rest; - } - post = this.compileNode(o); - scope = o.scope; - if (scope.expressions === this) { - declars = o.scope.hasDeclarations(); - assigns = scope.hasAssignments; - if (declars || assigns) { - if (i) { - code += '\n'; - } - code += "" + this.tab + "var "; - if (declars) { - code += scope.declaredVariables().join(', '); - } - if (assigns) { - if (declars) { - code += ",\n" + (this.tab + TAB); - } - code += scope.assignedVariables().join(",\n" + (this.tab + TAB)); - } - code += ';\n'; - } - } - return code + post; - }; - - Block.wrap = function(nodes) { - if (nodes.length === 1 && nodes[0] instanceof Block) { - return nodes[0]; - } - return new Block(nodes); - }; - - return Block; - - })(Base); - - exports.Literal = Literal = (function(_super) { - - __extends(Literal, _super); - - function Literal(value) { - this.value = value; - } - - Literal.prototype.makeReturn = function() { - if (this.isStatement()) { - return this; - } else { - return Literal.__super__.makeReturn.apply(this, arguments); - } - }; - - Literal.prototype.isAssignable = function() { - return IDENTIFIER.test(this.value); - }; - - Literal.prototype.isStatement = function() { - var _ref2; - return (_ref2 = this.value) === 'break' || _ref2 === 'continue' || _ref2 === 'debugger'; - }; - - Literal.prototype.isComplex = NO; - - Literal.prototype.assigns = function(name) { - return name === this.value; - }; - - Literal.prototype.jumps = function(o) { - if (this.value === 'break' && !((o != null ? o.loop : void 0) || (o != null ? o.block : void 0))) { - return this; - } - if (this.value === 'continue' && !(o != null ? o.loop : void 0)) { - return this; - } - }; - - Literal.prototype.compileNode = function(o) { - var code, _ref2; - code = this.value === 'this' ? ((_ref2 = o.scope.method) != null ? _ref2.bound : void 0) ? o.scope.method.context : this.value : this.value.reserved ? "\"" + this.value + "\"" : this.value; - if (this.isStatement()) { - return "" + this.tab + code + ";"; - } else { - return code; - } - }; - - Literal.prototype.toString = function() { - return ' "' + this.value + '"'; - }; - - return Literal; - - })(Base); - - exports.Undefined = (function(_super) { - - __extends(Undefined, _super); - - function Undefined() { - return Undefined.__super__.constructor.apply(this, arguments); - } - - Undefined.prototype.isAssignable = NO; - - Undefined.prototype.isComplex = NO; - - Undefined.prototype.compileNode = function(o) { - if (o.level >= LEVEL_ACCESS) { - return '(void 0)'; - } else { - return 'void 0'; - } - }; - - return Undefined; - - })(Base); - - exports.Null = (function(_super) { - - __extends(Null, _super); - - function Null() { - return Null.__super__.constructor.apply(this, arguments); - } - - Null.prototype.isAssignable = NO; - - Null.prototype.isComplex = NO; - - Null.prototype.compileNode = function() { - return "null"; - }; - - return Null; - - })(Base); - - exports.Bool = (function(_super) { - - __extends(Bool, _super); - - Bool.prototype.isAssignable = NO; - - Bool.prototype.isComplex = NO; - - Bool.prototype.compileNode = function() { - return this.val; - }; - - function Bool(val) { - this.val = val; - } - - return Bool; - - })(Base); - - exports.Return = Return = (function(_super) { - - __extends(Return, _super); - - function Return(expr) { - if (expr && !expr.unwrap().isUndefined) { - this.expression = expr; - } - } - - Return.prototype.children = ['expression']; - - Return.prototype.isStatement = YES; - - Return.prototype.makeReturn = THIS; - - Return.prototype.jumps = THIS; - - Return.prototype.compile = function(o, level) { - var expr, _ref2; - expr = (_ref2 = this.expression) != null ? _ref2.makeReturn() : void 0; - if (expr && !(expr instanceof Return)) { - return expr.compile(o, level); - } else { - return Return.__super__.compile.call(this, o, level); - } - }; - - Return.prototype.compileNode = function(o) { - return this.tab + ("return" + [this.expression ? " " + (this.expression.compile(o, LEVEL_PAREN)) : void 0] + ";"); - }; - - return Return; - - })(Base); - - exports.Value = Value = (function(_super) { - - __extends(Value, _super); - - function Value(base, props, tag) { - if (!props && base instanceof Value) { - return base; - } - this.base = base; - this.properties = props || []; - if (tag) { - this[tag] = true; - } - return this; - } - - Value.prototype.children = ['base', 'properties']; - - Value.prototype.add = function(props) { - this.properties = this.properties.concat(props); - return this; - }; - - Value.prototype.hasProperties = function() { - return !!this.properties.length; - }; - - Value.prototype.isArray = function() { - return !this.properties.length && this.base instanceof Arr; - }; - - Value.prototype.isComplex = function() { - return this.hasProperties() || this.base.isComplex(); - }; - - Value.prototype.isAssignable = function() { - return this.hasProperties() || this.base.isAssignable(); - }; - - Value.prototype.isSimpleNumber = function() { - return this.base instanceof Literal && SIMPLENUM.test(this.base.value); - }; - - Value.prototype.isString = function() { - return this.base instanceof Literal && IS_STRING.test(this.base.value); - }; - - Value.prototype.isAtomic = function() { - var node, _i, _len, _ref2; - _ref2 = this.properties.concat(this.base); - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - node = _ref2[_i]; - if (node.soak || node instanceof Call) { - return false; - } - } - return true; - }; - - Value.prototype.isStatement = function(o) { - return !this.properties.length && this.base.isStatement(o); - }; - - Value.prototype.assigns = function(name) { - return !this.properties.length && this.base.assigns(name); - }; - - Value.prototype.jumps = function(o) { - return !this.properties.length && this.base.jumps(o); - }; - - Value.prototype.isObject = function(onlyGenerated) { - if (this.properties.length) { - return false; - } - return (this.base instanceof Obj) && (!onlyGenerated || this.base.generated); - }; - - Value.prototype.isSplice = function() { - return last(this.properties) instanceof Slice; - }; - - Value.prototype.unwrap = function() { - if (this.properties.length) { - return this; - } else { - return this.base; - } - }; - - Value.prototype.cacheReference = function(o) { - var base, bref, name, nref; - name = last(this.properties); - if (this.properties.length < 2 && !this.base.isComplex() && !(name != null ? name.isComplex() : void 0)) { - return [this, this]; - } - base = new Value(this.base, this.properties.slice(0, -1)); - if (base.isComplex()) { - bref = new Literal(o.scope.freeVariable('base')); - base = new Value(new Parens(new Assign(bref, base))); - } - if (!name) { - return [base, bref]; - } - if (name.isComplex()) { - nref = new Literal(o.scope.freeVariable('name')); - name = new Index(new Assign(nref, name.index)); - nref = new Index(nref); - } - return [base.add(name), new Value(bref || base.base, [nref || name])]; - }; - - Value.prototype.compileNode = function(o) { - var code, prop, props, _i, _len; - this.base.front = this.front; - props = this.properties; - code = this.base.compile(o, props.length ? LEVEL_ACCESS : null); - if ((this.base instanceof Parens || props.length) && SIMPLENUM.test(code)) { - code = "" + code + "."; - } - for (_i = 0, _len = props.length; _i < _len; _i++) { - prop = props[_i]; - code += prop.compile(o); - } - return code; - }; - - Value.prototype.unfoldSoak = function(o) { - var result, - _this = this; - if (this.unfoldedSoak != null) { - return this.unfoldedSoak; - } - result = (function() { - var fst, i, ifn, prop, ref, snd, _i, _len, _ref2; - if (ifn = _this.base.unfoldSoak(o)) { - Array.prototype.push.apply(ifn.body.properties, _this.properties); - return ifn; - } - _ref2 = _this.properties; - for (i = _i = 0, _len = _ref2.length; _i < _len; i = ++_i) { - prop = _ref2[i]; - if (!prop.soak) { - continue; - } - prop.soak = false; - fst = new Value(_this.base, _this.properties.slice(0, i)); - snd = new Value(_this.base, _this.properties.slice(i)); - if (fst.isComplex()) { - ref = new Literal(o.scope.freeVariable('ref')); - fst = new Parens(new Assign(ref, fst)); - snd.base = ref; - } - return new If(new Existence(fst), snd, { - soak: true - }); - } - return null; - })(); - return this.unfoldedSoak = result || false; - }; - - return Value; - - })(Base); - - exports.Comment = Comment = (function(_super) { - - __extends(Comment, _super); - - function Comment(comment) { - this.comment = comment; - } - - Comment.prototype.isStatement = YES; - - Comment.prototype.makeReturn = THIS; - - Comment.prototype.compileNode = function(o, level) { - var code; - code = '/*' + multident(this.comment, this.tab) + ("\n" + this.tab + "*/\n"); - if ((level || o.level) === LEVEL_TOP) { - code = o.indent + code; - } - return code; - }; - - return Comment; - - })(Base); - - exports.Call = Call = (function(_super) { - - __extends(Call, _super); - - function Call(variable, args, soak) { - this.args = args != null ? args : []; - this.soak = soak; - this.isNew = false; - this.isSuper = variable === 'super'; - this.variable = this.isSuper ? null : variable; - } - - Call.prototype.children = ['variable', 'args']; - - Call.prototype.newInstance = function() { - var base, _ref2; - base = ((_ref2 = this.variable) != null ? _ref2.base : void 0) || this.variable; - if (base instanceof Call && !base.isNew) { - base.newInstance(); - } else { - this.isNew = true; - } - return this; - }; - - Call.prototype.superReference = function(o) { - var accesses, method, name; - method = o.scope.namedMethod(); - if (!method) { - throw SyntaxError('cannot call super outside of a function.'); - } - name = method.name; - if (name == null) { - throw SyntaxError('cannot call super on an anonymous function.'); - } - if (method.klass) { - accesses = [new Access(new Literal('__super__'))]; - if (method["static"]) { - accesses.push(new Access(new Literal('constructor'))); - } - accesses.push(new Access(new Literal(name))); - return (new Value(new Literal(method.klass), accesses)).compile(o); - } else { - return "" + name + ".__super__.constructor"; - } - }; - - Call.prototype.superThis = function(o) { - var method; - method = o.scope.method; - return (method && !method.klass && method.context) || "this"; - }; - - Call.prototype.unfoldSoak = function(o) { - var call, ifn, left, list, rite, _i, _len, _ref2, _ref3; - if (this.soak) { - if (this.variable) { - if (ifn = unfoldSoak(o, this, 'variable')) { - return ifn; - } - _ref2 = new Value(this.variable).cacheReference(o), left = _ref2[0], rite = _ref2[1]; - } else { - left = new Literal(this.superReference(o)); - rite = new Value(left); - } - rite = new Call(rite, this.args); - rite.isNew = this.isNew; - left = new Literal("typeof " + (left.compile(o)) + " === \"function\""); - return new If(left, new Value(rite), { - soak: true - }); - } - call = this; - list = []; - while (true) { - if (call.variable instanceof Call) { - list.push(call); - call = call.variable; - continue; - } - if (!(call.variable instanceof Value)) { - break; - } - list.push(call); - if (!((call = call.variable.base) instanceof Call)) { - break; - } - } - _ref3 = list.reverse(); - for (_i = 0, _len = _ref3.length; _i < _len; _i++) { - call = _ref3[_i]; - if (ifn) { - if (call.variable instanceof Call) { - call.variable = ifn; - } else { - call.variable.base = ifn; - } - } - ifn = unfoldSoak(o, call, 'variable'); - } - return ifn; - }; - - Call.prototype.filterImplicitObjects = function(list) { - var node, nodes, obj, prop, properties, _i, _j, _len, _len1, _ref2; - nodes = []; - for (_i = 0, _len = list.length; _i < _len; _i++) { - node = list[_i]; - if (!((typeof node.isObject === "function" ? node.isObject() : void 0) && node.base.generated)) { - nodes.push(node); - continue; - } - obj = null; - _ref2 = node.base.properties; - for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { - prop = _ref2[_j]; - if (prop instanceof Assign || prop instanceof Comment) { - if (!obj) { - nodes.push(obj = new Obj(properties = [], true)); - } - properties.push(prop); - } else { - nodes.push(prop); - obj = null; - } - } - } - return nodes; - }; - - Call.prototype.compileNode = function(o) { - var arg, args, code, _ref2; - if ((_ref2 = this.variable) != null) { - _ref2.front = this.front; - } - if (code = Splat.compileSplattedArray(o, this.args, true)) { - return this.compileSplat(o, code); - } - args = this.filterImplicitObjects(this.args); - args = ((function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = args.length; _i < _len; _i++) { - arg = args[_i]; - _results.push(arg.compile(o, LEVEL_LIST)); - } - return _results; - })()).join(', '); - if (this.isSuper) { - return this.superReference(o) + (".call(" + (this.superThis(o)) + (args && ', ' + args) + ")"); - } else { - return (this.isNew ? 'new ' : '') + this.variable.compile(o, LEVEL_ACCESS) + ("(" + args + ")"); - } - }; - - Call.prototype.compileSuper = function(args, o) { - return "" + (this.superReference(o)) + ".call(" + (this.superThis(o)) + (args.length ? ', ' : '') + args + ")"; - }; - - Call.prototype.compileSplat = function(o, splatArgs) { - var base, fun, idt, name, ref; - if (this.isSuper) { - return "" + (this.superReference(o)) + ".apply(" + (this.superThis(o)) + ", " + splatArgs + ")"; - } - if (this.isNew) { - idt = this.tab + TAB; - return "(function(func, args, ctor) {\n" + idt + "ctor.prototype = func.prototype;\n" + idt + "var child = new ctor, result = func.apply(child, args);\n" + idt + "return Object(result) === result ? result : child;\n" + this.tab + "})(" + (this.variable.compile(o, LEVEL_LIST)) + ", " + splatArgs + ", function(){})"; - } - base = new Value(this.variable); - if ((name = base.properties.pop()) && base.isComplex()) { - ref = o.scope.freeVariable('ref'); - fun = "(" + ref + " = " + (base.compile(o, LEVEL_LIST)) + ")" + (name.compile(o)); - } else { - fun = base.compile(o, LEVEL_ACCESS); - if (SIMPLENUM.test(fun)) { - fun = "(" + fun + ")"; - } - if (name) { - ref = fun; - fun += name.compile(o); - } else { - ref = 'null'; - } - } - return "" + fun + ".apply(" + ref + ", " + splatArgs + ")"; - }; - - return Call; - - })(Base); - - exports.Extends = Extends = (function(_super) { - - __extends(Extends, _super); - - function Extends(child, parent) { - this.child = child; - this.parent = parent; - } - - Extends.prototype.children = ['child', 'parent']; - - Extends.prototype.compile = function(o) { - return new Call(new Value(new Literal(utility('extends'))), [this.child, this.parent]).compile(o); - }; - - return Extends; - - })(Base); - - exports.Access = Access = (function(_super) { - - __extends(Access, _super); - - function Access(name, tag) { - this.name = name; - this.name.asKey = true; - this.soak = tag === 'soak'; - } - - Access.prototype.children = ['name']; - - Access.prototype.compile = function(o) { - var name; - name = this.name.compile(o); - if (IDENTIFIER.test(name)) { - return "." + name; - } else { - return "[" + name + "]"; - } - }; - - Access.prototype.isComplex = NO; - - return Access; - - })(Base); - - exports.Index = Index = (function(_super) { - - __extends(Index, _super); - - function Index(index) { - this.index = index; - } - - Index.prototype.children = ['index']; - - Index.prototype.compile = function(o) { - return "[" + (this.index.compile(o, LEVEL_PAREN)) + "]"; - }; - - Index.prototype.isComplex = function() { - return this.index.isComplex(); - }; - - return Index; - - })(Base); - - exports.Range = Range = (function(_super) { - - __extends(Range, _super); - - Range.prototype.children = ['from', 'to']; - - function Range(from, to, tag) { - this.from = from; - this.to = to; - this.exclusive = tag === 'exclusive'; - this.equals = this.exclusive ? '' : '='; - } - - Range.prototype.compileVariables = function(o) { - var step, _ref2, _ref3, _ref4, _ref5; - o = merge(o, { - top: true - }); - _ref2 = this.from.cache(o, LEVEL_LIST), this.fromC = _ref2[0], this.fromVar = _ref2[1]; - _ref3 = this.to.cache(o, LEVEL_LIST), this.toC = _ref3[0], this.toVar = _ref3[1]; - if (step = del(o, 'step')) { - _ref4 = step.cache(o, LEVEL_LIST), this.step = _ref4[0], this.stepVar = _ref4[1]; - } - _ref5 = [this.fromVar.match(SIMPLENUM), this.toVar.match(SIMPLENUM)], this.fromNum = _ref5[0], this.toNum = _ref5[1]; - if (this.stepVar) { - return this.stepNum = this.stepVar.match(SIMPLENUM); - } - }; - - Range.prototype.compileNode = function(o) { - var cond, condPart, from, gt, idx, idxName, known, lt, namedIndex, stepPart, to, varPart, _ref2, _ref3; - if (!this.fromVar) { - this.compileVariables(o); - } - if (!o.index) { - return this.compileArray(o); - } - known = this.fromNum && this.toNum; - idx = del(o, 'index'); - idxName = del(o, 'name'); - namedIndex = idxName && idxName !== idx; - varPart = "" + idx + " = " + this.fromC; - if (this.toC !== this.toVar) { - varPart += ", " + this.toC; - } - if (this.step !== this.stepVar) { - varPart += ", " + this.step; - } - _ref2 = ["" + idx + " <" + this.equals, "" + idx + " >" + this.equals], lt = _ref2[0], gt = _ref2[1]; - condPart = this.stepNum ? +this.stepNum > 0 ? "" + lt + " " + this.toVar : "" + gt + " " + this.toVar : known ? ((_ref3 = [+this.fromNum, +this.toNum], from = _ref3[0], to = _ref3[1], _ref3), from <= to ? "" + lt + " " + to : "" + gt + " " + to) : (cond = "" + this.fromVar + " <= " + this.toVar, "" + cond + " ? " + lt + " " + this.toVar + " : " + gt + " " + this.toVar); - stepPart = this.stepVar ? "" + idx + " += " + this.stepVar : known ? namedIndex ? from <= to ? "++" + idx : "--" + idx : from <= to ? "" + idx + "++" : "" + idx + "--" : namedIndex ? "" + cond + " ? ++" + idx + " : --" + idx : "" + cond + " ? " + idx + "++ : " + idx + "--"; - if (namedIndex) { - varPart = "" + idxName + " = " + varPart; - } - if (namedIndex) { - stepPart = "" + idxName + " = " + stepPart; - } - return "" + varPart + "; " + condPart + "; " + stepPart; - }; - - Range.prototype.compileArray = function(o) { - var args, body, cond, hasArgs, i, idt, post, pre, range, result, vars, _i, _ref2, _ref3, _results; - if (this.fromNum && this.toNum && Math.abs(this.fromNum - this.toNum) <= 20) { - range = (function() { - _results = []; - for (var _i = _ref2 = +this.fromNum, _ref3 = +this.toNum; _ref2 <= _ref3 ? _i <= _ref3 : _i >= _ref3; _ref2 <= _ref3 ? _i++ : _i--){ _results.push(_i); } - return _results; - }).apply(this); - if (this.exclusive) { - range.pop(); - } - return "[" + (range.join(', ')) + "]"; - } - idt = this.tab + TAB; - i = o.scope.freeVariable('i'); - result = o.scope.freeVariable('results'); - pre = "\n" + idt + result + " = [];"; - if (this.fromNum && this.toNum) { - o.index = i; - body = this.compileNode(o); - } else { - vars = ("" + i + " = " + this.fromC) + (this.toC !== this.toVar ? ", " + this.toC : ''); - cond = "" + this.fromVar + " <= " + this.toVar; - body = "var " + vars + "; " + cond + " ? " + i + " <" + this.equals + " " + this.toVar + " : " + i + " >" + this.equals + " " + this.toVar + "; " + cond + " ? " + i + "++ : " + i + "--"; - } - post = "{ " + result + ".push(" + i + "); }\n" + idt + "return " + result + ";\n" + o.indent; - hasArgs = function(node) { - return node != null ? node.contains(function(n) { - return n instanceof Literal && n.value === 'arguments' && !n.asKey; - }) : void 0; - }; - if (hasArgs(this.from) || hasArgs(this.to)) { - args = ', arguments'; - } - return "(function() {" + pre + "\n" + idt + "for (" + body + ")" + post + "}).apply(this" + (args != null ? args : '') + ")"; - }; - - return Range; - - })(Base); - - exports.Slice = Slice = (function(_super) { - - __extends(Slice, _super); - - Slice.prototype.children = ['range']; - - function Slice(range) { - this.range = range; - Slice.__super__.constructor.call(this); - } - - Slice.prototype.compileNode = function(o) { - var compiled, from, fromStr, to, toStr, _ref2; - _ref2 = this.range, to = _ref2.to, from = _ref2.from; - fromStr = from && from.compile(o, LEVEL_PAREN) || '0'; - compiled = to && to.compile(o, LEVEL_PAREN); - if (to && !(!this.range.exclusive && +compiled === -1)) { - toStr = ', ' + (this.range.exclusive ? compiled : SIMPLENUM.test(compiled) ? "" + (+compiled + 1) : (compiled = to.compile(o, LEVEL_ACCESS), "+" + compiled + " + 1 || 9e9")); - } - return ".slice(" + fromStr + (toStr || '') + ")"; - }; - - return Slice; - - })(Base); - - exports.Obj = Obj = (function(_super) { - - __extends(Obj, _super); - - function Obj(props, generated) { - this.generated = generated != null ? generated : false; - this.objects = this.properties = props || []; - } - - Obj.prototype.children = ['properties']; - - Obj.prototype.compileNode = function(o) { - var i, idt, indent, join, lastNoncom, node, obj, prop, props, _i, _len; - props = this.properties; - if (!props.length) { - return (this.front ? '({})' : '{}'); - } - if (this.generated) { - for (_i = 0, _len = props.length; _i < _len; _i++) { - node = props[_i]; - if (node instanceof Value) { - throw new Error('cannot have an implicit value in an implicit object'); - } - } - } - idt = o.indent += TAB; - lastNoncom = this.lastNonComment(this.properties); - props = (function() { - var _j, _len1, _results; - _results = []; - for (i = _j = 0, _len1 = props.length; _j < _len1; i = ++_j) { - prop = props[i]; - join = i === props.length - 1 ? '' : prop === lastNoncom || prop instanceof Comment ? '\n' : ',\n'; - indent = prop instanceof Comment ? '' : idt; - if (prop instanceof Value && prop["this"]) { - prop = new Assign(prop.properties[0].name, prop, 'object'); - } - if (!(prop instanceof Comment)) { - if (!(prop instanceof Assign)) { - prop = new Assign(prop, prop, 'object'); - } - (prop.variable.base || prop.variable).asKey = true; - } - _results.push(indent + prop.compile(o, LEVEL_TOP) + join); - } - return _results; - })(); - props = props.join(''); - obj = "{" + (props && '\n' + props + '\n' + this.tab) + "}"; - if (this.front) { - return "(" + obj + ")"; - } else { - return obj; - } - }; - - Obj.prototype.assigns = function(name) { - var prop, _i, _len, _ref2; - _ref2 = this.properties; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - prop = _ref2[_i]; - if (prop.assigns(name)) { - return true; - } - } - return false; - }; - - return Obj; - - })(Base); - - exports.Arr = Arr = (function(_super) { - - __extends(Arr, _super); - - function Arr(objs) { - this.objects = objs || []; - } - - Arr.prototype.children = ['objects']; - - Arr.prototype.filterImplicitObjects = Call.prototype.filterImplicitObjects; - - Arr.prototype.compileNode = function(o) { - var code, obj, objs; - if (!this.objects.length) { - return '[]'; - } - o.indent += TAB; - objs = this.filterImplicitObjects(this.objects); - if (code = Splat.compileSplattedArray(o, objs)) { - return code; - } - code = ((function() { - var _i, _len, _results; - _results = []; - for (_i = 0, _len = objs.length; _i < _len; _i++) { - obj = objs[_i]; - _results.push(obj.compile(o, LEVEL_LIST)); - } - return _results; - })()).join(', '); - if (code.indexOf('\n') >= 0) { - return "[\n" + o.indent + code + "\n" + this.tab + "]"; - } else { - return "[" + code + "]"; - } - }; - - Arr.prototype.assigns = function(name) { - var obj, _i, _len, _ref2; - _ref2 = this.objects; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - obj = _ref2[_i]; - if (obj.assigns(name)) { - return true; - } - } - return false; - }; - - return Arr; - - })(Base); - - exports.Class = Class = (function(_super) { - - __extends(Class, _super); - - function Class(variable, parent, body) { - this.variable = variable; - this.parent = parent; - this.body = body != null ? body : new Block; - this.boundFuncs = []; - this.body.classBody = true; - } - - Class.prototype.children = ['variable', 'parent', 'body']; - - Class.prototype.determineName = function() { - var decl, tail; - if (!this.variable) { - return null; - } - decl = (tail = last(this.variable.properties)) ? tail instanceof Access && tail.name.value : this.variable.base.value; - if (__indexOf.call(STRICT_PROSCRIBED, decl) >= 0) { - throw SyntaxError("variable name may not be " + decl); - } - return decl && (decl = IDENTIFIER.test(decl) && decl); - }; - - Class.prototype.setContext = function(name) { - return this.body.traverseChildren(false, function(node) { - if (node.classBody) { - return false; - } - if (node instanceof Literal && node.value === 'this') { - return node.value = name; - } else if (node instanceof Code) { - node.klass = name; - if (node.bound) { - return node.context = name; - } - } - }); - }; - - Class.prototype.addBoundFunctions = function(o) { - var bvar, lhs, _i, _len, _ref2, _results; - if (this.boundFuncs.length) { - _ref2 = this.boundFuncs; - _results = []; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - bvar = _ref2[_i]; - lhs = (new Value(new Literal("this"), [new Access(bvar)])).compile(o); - _results.push(this.ctor.body.unshift(new Literal("" + lhs + " = " + (utility('bind')) + "(" + lhs + ", this)"))); - } - return _results; - } - }; - - Class.prototype.addProperties = function(node, name, o) { - var assign, base, exprs, func, props; - props = node.base.properties.slice(0); - exprs = (function() { - var _results; - _results = []; - while (assign = props.shift()) { - if (assign instanceof Assign) { - base = assign.variable.base; - delete assign.context; - func = assign.value; - if (base.value === 'constructor') { - if (this.ctor) { - throw new Error('cannot define more than one constructor in a class'); - } - if (func.bound) { - throw new Error('cannot define a constructor as a bound function'); - } - if (func instanceof Code) { - assign = this.ctor = func; - } else { - this.externalCtor = o.scope.freeVariable('class'); - assign = new Assign(new Literal(this.externalCtor), func); - } - } else { - if (assign.variable["this"]) { - func["static"] = true; - if (func.bound) { - func.context = name; - } - } else { - assign.variable = new Value(new Literal(name), [new Access(new Literal('prototype')), new Access(base)]); - if (func instanceof Code && func.bound) { - this.boundFuncs.push(base); - func.bound = false; - } - } - } - } - _results.push(assign); - } - return _results; - }).call(this); - return compact(exprs); - }; - - Class.prototype.walkBody = function(name, o) { - var _this = this; - return this.traverseChildren(false, function(child) { - var exps, i, node, _i, _len, _ref2; - if (child instanceof Class) { - return false; - } - if (child instanceof Block) { - _ref2 = exps = child.expressions; - for (i = _i = 0, _len = _ref2.length; _i < _len; i = ++_i) { - node = _ref2[i]; - if (node instanceof Value && node.isObject(true)) { - exps[i] = _this.addProperties(node, name, o); - } - } - return child.expressions = exps = flatten(exps); - } - }); - }; - - Class.prototype.hoistDirectivePrologue = function() { - var expressions, index, node; - index = 0; - expressions = this.body.expressions; - while ((node = expressions[index]) && node instanceof Comment || node instanceof Value && node.isString()) { - ++index; - } - return this.directives = expressions.splice(0, index); - }; - - Class.prototype.ensureConstructor = function(name) { - if (!this.ctor) { - this.ctor = new Code; - if (this.parent) { - this.ctor.body.push(new Literal("" + name + ".__super__.constructor.apply(this, arguments)")); - } - if (this.externalCtor) { - this.ctor.body.push(new Literal("" + this.externalCtor + ".apply(this, arguments)")); - } - this.ctor.body.makeReturn(); - this.body.expressions.unshift(this.ctor); - } - this.ctor.ctor = this.ctor.name = name; - this.ctor.klass = null; - return this.ctor.noReturn = true; - }; - - Class.prototype.compileNode = function(o) { - var call, decl, klass, lname, name, params, _ref2; - decl = this.determineName(); - name = decl || '_Class'; - if (name.reserved) { - name = "_" + name; - } - lname = new Literal(name); - this.hoistDirectivePrologue(); - this.setContext(name); - this.walkBody(name, o); - this.ensureConstructor(name); - this.body.spaced = true; - if (!(this.ctor instanceof Code)) { - this.body.expressions.unshift(this.ctor); - } - this.body.expressions.push(lname); - (_ref2 = this.body.expressions).unshift.apply(_ref2, this.directives); - this.addBoundFunctions(o); - call = Closure.wrap(this.body); - if (this.parent) { - this.superClass = new Literal(o.scope.freeVariable('super', false)); - this.body.expressions.unshift(new Extends(lname, this.superClass)); - call.args.push(this.parent); - params = call.variable.params || call.variable.base.params; - params.push(new Param(this.superClass)); - } - klass = new Parens(call, true); - if (this.variable) { - klass = new Assign(this.variable, klass); - } - return klass.compile(o); - }; - - return Class; - - })(Base); - - exports.Assign = Assign = (function(_super) { - - __extends(Assign, _super); - - function Assign(variable, value, context, options) { - var forbidden, name, _ref2; - this.variable = variable; - this.value = value; - this.context = context; - this.param = options && options.param; - this.subpattern = options && options.subpattern; - forbidden = (_ref2 = (name = this.variable.unwrapAll().value), __indexOf.call(STRICT_PROSCRIBED, _ref2) >= 0); - if (forbidden && this.context !== 'object') { - throw SyntaxError("variable name may not be \"" + name + "\""); - } - } - - Assign.prototype.children = ['variable', 'value']; - - Assign.prototype.isStatement = function(o) { - return (o != null ? o.level : void 0) === LEVEL_TOP && (this.context != null) && __indexOf.call(this.context, "?") >= 0; - }; - - Assign.prototype.assigns = function(name) { - return this[this.context === 'object' ? 'value' : 'variable'].assigns(name); - }; - - Assign.prototype.unfoldSoak = function(o) { - return unfoldSoak(o, this, 'variable'); - }; - - Assign.prototype.compileNode = function(o) { - var isValue, match, name, val, varBase, _ref2, _ref3, _ref4, _ref5; - if (isValue = this.variable instanceof Value) { - if (this.variable.isArray() || this.variable.isObject()) { - return this.compilePatternMatch(o); - } - if (this.variable.isSplice()) { - return this.compileSplice(o); - } - if ((_ref2 = this.context) === '||=' || _ref2 === '&&=' || _ref2 === '?=') { - return this.compileConditional(o); - } - } - name = this.variable.compile(o, LEVEL_LIST); - if (!this.context) { - if (!(varBase = this.variable.unwrapAll()).isAssignable()) { - throw SyntaxError("\"" + (this.variable.compile(o)) + "\" cannot be assigned."); - } - if (!(typeof varBase.hasProperties === "function" ? varBase.hasProperties() : void 0)) { - if (this.param) { - o.scope.add(name, 'var'); - } else { - o.scope.find(name); - } - } - } - if (this.value instanceof Code && (match = METHOD_DEF.exec(name))) { - if (match[1]) { - this.value.klass = match[1]; - } - this.value.name = (_ref3 = (_ref4 = (_ref5 = match[2]) != null ? _ref5 : match[3]) != null ? _ref4 : match[4]) != null ? _ref3 : match[5]; - } - val = this.value.compile(o, LEVEL_LIST); - if (this.context === 'object') { - return "" + name + ": " + val; - } - val = name + (" " + (this.context || '=') + " ") + val; - if (o.level <= LEVEL_LIST) { - return val; - } else { - return "(" + val + ")"; - } - }; - - Assign.prototype.compilePatternMatch = function(o) { - var acc, assigns, code, i, idx, isObject, ivar, name, obj, objects, olen, ref, rest, splat, top, val, value, vvar, _i, _len, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8; - top = o.level === LEVEL_TOP; - value = this.value; - objects = this.variable.base.objects; - if (!(olen = objects.length)) { - code = value.compile(o); - if (o.level >= LEVEL_OP) { - return "(" + code + ")"; - } else { - return code; - } - } - isObject = this.variable.isObject(); - if (top && olen === 1 && !((obj = objects[0]) instanceof Splat)) { - if (obj instanceof Assign) { - _ref2 = obj, (_ref3 = _ref2.variable, idx = _ref3.base), obj = _ref2.value; - } else { - if (obj.base instanceof Parens) { - _ref4 = new Value(obj.unwrapAll()).cacheReference(o), obj = _ref4[0], idx = _ref4[1]; - } else { - idx = isObject ? obj["this"] ? obj.properties[0].name : obj : new Literal(0); - } - } - acc = IDENTIFIER.test(idx.unwrap().value || 0); - value = new Value(value); - value.properties.push(new (acc ? Access : Index)(idx)); - if (_ref5 = obj.unwrap().value, __indexOf.call(RESERVED, _ref5) >= 0) { - throw new SyntaxError("assignment to a reserved word: " + (obj.compile(o)) + " = " + (value.compile(o))); - } - return new Assign(obj, value, null, { - param: this.param - }).compile(o, LEVEL_TOP); - } - vvar = value.compile(o, LEVEL_LIST); - assigns = []; - splat = false; - if (!IDENTIFIER.test(vvar) || this.variable.assigns(vvar)) { - assigns.push("" + (ref = o.scope.freeVariable('ref')) + " = " + vvar); - vvar = ref; - } - for (i = _i = 0, _len = objects.length; _i < _len; i = ++_i) { - obj = objects[i]; - idx = i; - if (isObject) { - if (obj instanceof Assign) { - _ref6 = obj, (_ref7 = _ref6.variable, idx = _ref7.base), obj = _ref6.value; - } else { - if (obj.base instanceof Parens) { - _ref8 = new Value(obj.unwrapAll()).cacheReference(o), obj = _ref8[0], idx = _ref8[1]; - } else { - idx = obj["this"] ? obj.properties[0].name : obj; - } - } - } - if (!splat && obj instanceof Splat) { - name = obj.name.unwrap().value; - obj = obj.unwrap(); - val = "" + olen + " <= " + vvar + ".length ? " + (utility('slice')) + ".call(" + vvar + ", " + i; - if (rest = olen - i - 1) { - ivar = o.scope.freeVariable('i'); - val += ", " + ivar + " = " + vvar + ".length - " + rest + ") : (" + ivar + " = " + i + ", [])"; - } else { - val += ") : []"; - } - val = new Literal(val); - splat = "" + ivar + "++"; - } else { - name = obj.unwrap().value; - if (obj instanceof Splat) { - obj = obj.name.compile(o); - throw new SyntaxError("multiple splats are disallowed in an assignment: " + obj + "..."); - } - if (typeof idx === 'number') { - idx = new Literal(splat || idx); - acc = false; - } else { - acc = isObject && IDENTIFIER.test(idx.unwrap().value || 0); - } - val = new Value(new Literal(vvar), [new (acc ? Access : Index)(idx)]); - } - if ((name != null) && __indexOf.call(RESERVED, name) >= 0) { - throw new SyntaxError("assignment to a reserved word: " + (obj.compile(o)) + " = " + (val.compile(o))); - } - assigns.push(new Assign(obj, val, null, { - param: this.param, - subpattern: true - }).compile(o, LEVEL_LIST)); - } - if (!(top || this.subpattern)) { - assigns.push(vvar); - } - code = assigns.join(', '); - if (o.level < LEVEL_LIST) { - return code; - } else { - return "(" + code + ")"; - } - }; - - Assign.prototype.compileConditional = function(o) { - var left, right, _ref2; - _ref2 = this.variable.cacheReference(o), left = _ref2[0], right = _ref2[1]; - if (!left.properties.length && left.base instanceof Literal && left.base.value !== "this" && !o.scope.check(left.base.value)) { - throw new Error("the variable \"" + left.base.value + "\" can't be assigned with " + this.context + " because it has not been defined."); - } - if (__indexOf.call(this.context, "?") >= 0) { - o.isExistentialEquals = true; - } - return new Op(this.context.slice(0, -1), left, new Assign(right, this.value, '=')).compile(o); - }; - - Assign.prototype.compileSplice = function(o) { - var code, exclusive, from, fromDecl, fromRef, name, to, valDef, valRef, _ref2, _ref3, _ref4; - _ref2 = this.variable.properties.pop().range, from = _ref2.from, to = _ref2.to, exclusive = _ref2.exclusive; - name = this.variable.compile(o); - _ref3 = (from != null ? from.cache(o, LEVEL_OP) : void 0) || ['0', '0'], fromDecl = _ref3[0], fromRef = _ref3[1]; - if (to) { - if ((from != null ? from.isSimpleNumber() : void 0) && to.isSimpleNumber()) { - to = +to.compile(o) - +fromRef; - if (!exclusive) { - to += 1; - } - } else { - to = to.compile(o, LEVEL_ACCESS) + ' - ' + fromRef; - if (!exclusive) { - to += ' + 1'; - } - } - } else { - to = "9e9"; - } - _ref4 = this.value.cache(o, LEVEL_LIST), valDef = _ref4[0], valRef = _ref4[1]; - code = "[].splice.apply(" + name + ", [" + fromDecl + ", " + to + "].concat(" + valDef + ")), " + valRef; - if (o.level > LEVEL_TOP) { - return "(" + code + ")"; - } else { - return code; - } - }; - - return Assign; - - })(Base); - - exports.Code = Code = (function(_super) { - - __extends(Code, _super); - - function Code(params, body, tag) { - this.params = params || []; - this.body = body || new Block; - this.bound = tag === 'boundfunc'; - if (this.bound) { - this.context = '_this'; - } - } - - Code.prototype.children = ['params', 'body']; - - Code.prototype.isStatement = function() { - return !!this.ctor; - }; - - Code.prototype.jumps = NO; - - Code.prototype.compileNode = function(o) { - var code, exprs, i, idt, lit, name, p, param, params, ref, splats, uniqs, val, wasEmpty, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _len5, _m, _n, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8; - o.scope = new Scope(o.scope, this.body, this); - o.scope.shared = del(o, 'sharedScope'); - o.indent += TAB; - delete o.bare; - delete o.isExistentialEquals; - params = []; - exprs = []; - _ref2 = this.paramNames(); - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - name = _ref2[_i]; - if (!o.scope.check(name)) { - o.scope.parameter(name); - } - } - _ref3 = this.params; - for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) { - param = _ref3[_j]; - if (!param.splat) { - continue; - } - _ref4 = this.params; - for (_k = 0, _len2 = _ref4.length; _k < _len2; _k++) { - p = _ref4[_k].name; - if (p["this"]) { - p = p.properties[0].name; - } - if (p.value) { - o.scope.add(p.value, 'var', true); - } - } - splats = new Assign(new Value(new Arr((function() { - var _l, _len3, _ref5, _results; - _ref5 = this.params; - _results = []; - for (_l = 0, _len3 = _ref5.length; _l < _len3; _l++) { - p = _ref5[_l]; - _results.push(p.asReference(o)); - } - return _results; - }).call(this))), new Value(new Literal('arguments'))); - break; - } - _ref5 = this.params; - for (_l = 0, _len3 = _ref5.length; _l < _len3; _l++) { - param = _ref5[_l]; - if (param.isComplex()) { - val = ref = param.asReference(o); - if (param.value) { - val = new Op('?', ref, param.value); - } - exprs.push(new Assign(new Value(param.name), val, '=', { - param: true - })); - } else { - ref = param; - if (param.value) { - lit = new Literal(ref.name.value + ' == null'); - val = new Assign(new Value(param.name), param.value, '='); - exprs.push(new If(lit, val)); - } - } - if (!splats) { - params.push(ref); - } - } - wasEmpty = this.body.isEmpty(); - if (splats) { - exprs.unshift(splats); - } - if (exprs.length) { - (_ref6 = this.body.expressions).unshift.apply(_ref6, exprs); - } - for (i = _m = 0, _len4 = params.length; _m < _len4; i = ++_m) { - p = params[i]; - o.scope.parameter(params[i] = p.compile(o)); - } - uniqs = []; - _ref7 = this.paramNames(); - for (_n = 0, _len5 = _ref7.length; _n < _len5; _n++) { - name = _ref7[_n]; - if (__indexOf.call(uniqs, name) >= 0) { - throw SyntaxError("multiple parameters named '" + name + "'"); - } - uniqs.push(name); - } - if (!(wasEmpty || this.noReturn)) { - this.body.makeReturn(); - } - if (this.bound) { - if ((_ref8 = o.scope.parent.method) != null ? _ref8.bound : void 0) { - this.bound = this.context = o.scope.parent.method.context; - } else if (!this["static"]) { - o.scope.parent.assign('_this', 'this'); - } - } - idt = o.indent; - code = 'function'; - if (this.ctor) { - code += ' ' + this.name; - } - code += '(' + params.join(', ') + ') {'; - if (!this.body.isEmpty()) { - code += "\n" + (this.body.compileWithDeclarations(o)) + "\n" + this.tab; - } - code += '}'; - if (this.ctor) { - return this.tab + code; - } - if (this.front || (o.level >= LEVEL_ACCESS)) { - return "(" + code + ")"; - } else { - return code; - } - }; - - Code.prototype.paramNames = function() { - var names, param, _i, _len, _ref2; - names = []; - _ref2 = this.params; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - param = _ref2[_i]; - names.push.apply(names, param.names()); - } - return names; - }; - - Code.prototype.traverseChildren = function(crossScope, func) { - if (crossScope) { - return Code.__super__.traverseChildren.call(this, crossScope, func); - } - }; - - return Code; - - })(Base); - - exports.Param = Param = (function(_super) { - - __extends(Param, _super); - - function Param(name, value, splat) { - var _ref2; - this.name = name; - this.value = value; - this.splat = splat; - if (_ref2 = (name = this.name.unwrapAll().value), __indexOf.call(STRICT_PROSCRIBED, _ref2) >= 0) { - throw SyntaxError("parameter name \"" + name + "\" is not allowed"); - } - } - - Param.prototype.children = ['name', 'value']; - - Param.prototype.compile = function(o) { - return this.name.compile(o, LEVEL_LIST); - }; - - Param.prototype.asReference = function(o) { - var node; - if (this.reference) { - return this.reference; - } - node = this.name; - if (node["this"]) { - node = node.properties[0].name; - if (node.value.reserved) { - node = new Literal(o.scope.freeVariable(node.value)); - } - } else if (node.isComplex()) { - node = new Literal(o.scope.freeVariable('arg')); - } - node = new Value(node); - if (this.splat) { - node = new Splat(node); - } - return this.reference = node; - }; - - Param.prototype.isComplex = function() { - return this.name.isComplex(); - }; - - Param.prototype.names = function(name) { - var atParam, names, obj, _i, _len, _ref2; - if (name == null) { - name = this.name; - } - atParam = function(obj) { - var value; - value = obj.properties[0].name.value; - if (value.reserved) { - return []; - } else { - return [value]; - } - }; - if (name instanceof Literal) { - return [name.value]; - } - if (name instanceof Value) { - return atParam(name); - } - names = []; - _ref2 = name.objects; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - obj = _ref2[_i]; - if (obj instanceof Assign) { - names.push(obj.value.unwrap().value); - } else if (obj instanceof Splat) { - names.push(obj.name.unwrap().value); - } else if (obj instanceof Value) { - if (obj.isArray() || obj.isObject()) { - names.push.apply(names, this.names(obj.base)); - } else if (obj["this"]) { - names.push.apply(names, atParam(obj)); - } else { - names.push(obj.base.value); - } - } else { - throw SyntaxError("illegal parameter " + (obj.compile())); - } - } - return names; - }; - - return Param; - - })(Base); - - exports.Splat = Splat = (function(_super) { - - __extends(Splat, _super); - - Splat.prototype.children = ['name']; - - Splat.prototype.isAssignable = YES; - - function Splat(name) { - this.name = name.compile ? name : new Literal(name); - } - - Splat.prototype.assigns = function(name) { - return this.name.assigns(name); - }; - - Splat.prototype.compile = function(o) { - if (this.index != null) { - return this.compileParam(o); - } else { - return this.name.compile(o); - } - }; - - Splat.prototype.unwrap = function() { - return this.name; - }; - - Splat.compileSplattedArray = function(o, list, apply) { - var args, base, code, i, index, node, _i, _len; - index = -1; - while ((node = list[++index]) && !(node instanceof Splat)) { - continue; - } - if (index >= list.length) { - return ''; - } - if (list.length === 1) { - code = list[0].compile(o, LEVEL_LIST); - if (apply) { - return code; - } - return "" + (utility('slice')) + ".call(" + code + ")"; - } - args = list.slice(index); - for (i = _i = 0, _len = args.length; _i < _len; i = ++_i) { - node = args[i]; - code = node.compile(o, LEVEL_LIST); - args[i] = node instanceof Splat ? "" + (utility('slice')) + ".call(" + code + ")" : "[" + code + "]"; - } - if (index === 0) { - return args[0] + (".concat(" + (args.slice(1).join(', ')) + ")"); - } - base = (function() { - var _j, _len1, _ref2, _results; - _ref2 = list.slice(0, index); - _results = []; - for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) { - node = _ref2[_j]; - _results.push(node.compile(o, LEVEL_LIST)); - } - return _results; - })(); - return "[" + (base.join(', ')) + "].concat(" + (args.join(', ')) + ")"; - }; - - return Splat; - - })(Base); - - exports.While = While = (function(_super) { - - __extends(While, _super); - - function While(condition, options) { - this.condition = (options != null ? options.invert : void 0) ? condition.invert() : condition; - this.guard = options != null ? options.guard : void 0; - } - - While.prototype.children = ['condition', 'guard', 'body']; - - While.prototype.isStatement = YES; - - While.prototype.makeReturn = function(res) { - if (res) { - return While.__super__.makeReturn.apply(this, arguments); - } else { - this.returns = !this.jumps({ - loop: true - }); - return this; - } - }; - - While.prototype.addBody = function(body) { - this.body = body; - return this; - }; - - While.prototype.jumps = function() { - var expressions, node, _i, _len; - expressions = this.body.expressions; - if (!expressions.length) { - return false; - } - for (_i = 0, _len = expressions.length; _i < _len; _i++) { - node = expressions[_i]; - if (node.jumps({ - loop: true - })) { - return node; - } - } - return false; - }; - - While.prototype.compileNode = function(o) { - var body, code, rvar, set; - o.indent += TAB; - set = ''; - body = this.body; - if (body.isEmpty()) { - body = ''; - } else { - if (this.returns) { - body.makeReturn(rvar = o.scope.freeVariable('results')); - set = "" + this.tab + rvar + " = [];\n"; - } - if (this.guard) { - if (body.expressions.length > 1) { - body.expressions.unshift(new If((new Parens(this.guard)).invert(), new Literal("continue"))); - } else { - if (this.guard) { - body = Block.wrap([new If(this.guard, body)]); - } - } - } - body = "\n" + (body.compile(o, LEVEL_TOP)) + "\n" + this.tab; - } - code = set + this.tab + ("while (" + (this.condition.compile(o, LEVEL_PAREN)) + ") {" + body + "}"); - if (this.returns) { - code += "\n" + this.tab + "return " + rvar + ";"; - } - return code; - }; - - return While; - - })(Base); - - exports.Op = Op = (function(_super) { - var CONVERSIONS, INVERSIONS; - - __extends(Op, _super); - - function Op(op, first, second, flip) { - if (op === 'in') { - return new In(first, second); - } - if (op === 'do') { - return this.generateDo(first); - } - if (op === 'new') { - if (first instanceof Call && !first["do"] && !first.isNew) { - return first.newInstance(); - } - if (first instanceof Code && first.bound || first["do"]) { - first = new Parens(first); - } - } - this.operator = CONVERSIONS[op] || op; - this.first = first; - this.second = second; - this.flip = !!flip; - return this; - } - - CONVERSIONS = { - '==': '===', - '!=': '!==', - 'of': 'in' - }; - - INVERSIONS = { - '!==': '===', - '===': '!==' - }; - - Op.prototype.children = ['first', 'second']; - - Op.prototype.isSimpleNumber = NO; - - Op.prototype.isUnary = function() { - return !this.second; - }; - - Op.prototype.isComplex = function() { - var _ref2; - return !(this.isUnary() && ((_ref2 = this.operator) === '+' || _ref2 === '-')) || this.first.isComplex(); - }; - - Op.prototype.isChainable = function() { - var _ref2; - return (_ref2 = this.operator) === '<' || _ref2 === '>' || _ref2 === '>=' || _ref2 === '<=' || _ref2 === '===' || _ref2 === '!=='; - }; - - Op.prototype.invert = function() { - var allInvertable, curr, fst, op, _ref2; - if (this.isChainable() && this.first.isChainable()) { - allInvertable = true; - curr = this; - while (curr && curr.operator) { - allInvertable && (allInvertable = curr.operator in INVERSIONS); - curr = curr.first; - } - if (!allInvertable) { - return new Parens(this).invert(); - } - curr = this; - while (curr && curr.operator) { - curr.invert = !curr.invert; - curr.operator = INVERSIONS[curr.operator]; - curr = curr.first; - } - return this; - } else if (op = INVERSIONS[this.operator]) { - this.operator = op; - if (this.first.unwrap() instanceof Op) { - this.first.invert(); - } - return this; - } else if (this.second) { - return new Parens(this).invert(); - } else if (this.operator === '!' && (fst = this.first.unwrap()) instanceof Op && ((_ref2 = fst.operator) === '!' || _ref2 === 'in' || _ref2 === 'instanceof')) { - return fst; - } else { - return new Op('!', this); - } - }; - - Op.prototype.unfoldSoak = function(o) { - var _ref2; - return ((_ref2 = this.operator) === '++' || _ref2 === '--' || _ref2 === 'delete') && unfoldSoak(o, this, 'first'); - }; - - Op.prototype.generateDo = function(exp) { - var call, func, param, passedParams, ref, _i, _len, _ref2; - passedParams = []; - func = exp instanceof Assign && (ref = exp.value.unwrap()) instanceof Code ? ref : exp; - _ref2 = func.params || []; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - param = _ref2[_i]; - if (param.value) { - passedParams.push(param.value); - delete param.value; - } else { - passedParams.push(param); - } - } - call = new Call(exp, passedParams); - call["do"] = true; - return call; - }; - - Op.prototype.compileNode = function(o) { - var code, isChain, _ref2, _ref3; - isChain = this.isChainable() && this.first.isChainable(); - if (!isChain) { - this.first.front = this.front; - } - if (this.operator === 'delete' && o.scope.check(this.first.unwrapAll().value)) { - throw SyntaxError('delete operand may not be argument or var'); - } - if (((_ref2 = this.operator) === '--' || _ref2 === '++') && (_ref3 = this.first.unwrapAll().value, __indexOf.call(STRICT_PROSCRIBED, _ref3) >= 0)) { - throw SyntaxError('prefix increment/decrement may not have eval or arguments operand'); - } - if (this.isUnary()) { - return this.compileUnary(o); - } - if (isChain) { - return this.compileChain(o); - } - if (this.operator === '?') { - return this.compileExistence(o); - } - code = this.first.compile(o, LEVEL_OP) + ' ' + this.operator + ' ' + this.second.compile(o, LEVEL_OP); - if (o.level <= LEVEL_OP) { - return code; - } else { - return "(" + code + ")"; - } - }; - - Op.prototype.compileChain = function(o) { - var code, fst, shared, _ref2; - _ref2 = this.first.second.cache(o), this.first.second = _ref2[0], shared = _ref2[1]; - fst = this.first.compile(o, LEVEL_OP); - code = "" + fst + " " + (this.invert ? '&&' : '||') + " " + (shared.compile(o)) + " " + this.operator + " " + (this.second.compile(o, LEVEL_OP)); - return "(" + code + ")"; - }; - - Op.prototype.compileExistence = function(o) { - var fst, ref; - if (this.first.isComplex()) { - ref = new Literal(o.scope.freeVariable('ref')); - fst = new Parens(new Assign(ref, this.first)); - } else { - fst = this.first; - ref = fst; - } - return new If(new Existence(fst), ref, { - type: 'if' - }).addElse(this.second).compile(o); - }; - - Op.prototype.compileUnary = function(o) { - var op, parts, plusMinus; - if (o.level >= LEVEL_ACCESS) { - return (new Parens(this)).compile(o); - } - parts = [op = this.operator]; - plusMinus = op === '+' || op === '-'; - if ((op === 'new' || op === 'typeof' || op === 'delete') || plusMinus && this.first instanceof Op && this.first.operator === op) { - parts.push(' '); - } - if ((plusMinus && this.first instanceof Op) || (op === 'new' && this.first.isStatement(o))) { - this.first = new Parens(this.first); - } - parts.push(this.first.compile(o, LEVEL_OP)); - if (this.flip) { - parts.reverse(); - } - return parts.join(''); - }; - - Op.prototype.toString = function(idt) { - return Op.__super__.toString.call(this, idt, this.constructor.name + ' ' + this.operator); - }; - - return Op; - - })(Base); - - exports.In = In = (function(_super) { - - __extends(In, _super); - - function In(object, array) { - this.object = object; - this.array = array; - } - - In.prototype.children = ['object', 'array']; - - In.prototype.invert = NEGATE; - - In.prototype.compileNode = function(o) { - var hasSplat, obj, _i, _len, _ref2; - if (this.array instanceof Value && this.array.isArray()) { - _ref2 = this.array.base.objects; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - obj = _ref2[_i]; - if (!(obj instanceof Splat)) { - continue; - } - hasSplat = true; - break; - } - if (!hasSplat) { - return this.compileOrTest(o); - } - } - return this.compileLoopTest(o); - }; - - In.prototype.compileOrTest = function(o) { - var cmp, cnj, i, item, ref, sub, tests, _ref2, _ref3; - if (this.array.base.objects.length === 0) { - return "" + (!!this.negated); - } - _ref2 = this.object.cache(o, LEVEL_OP), sub = _ref2[0], ref = _ref2[1]; - _ref3 = this.negated ? [' !== ', ' && '] : [' === ', ' || '], cmp = _ref3[0], cnj = _ref3[1]; - tests = (function() { - var _i, _len, _ref4, _results; - _ref4 = this.array.base.objects; - _results = []; - for (i = _i = 0, _len = _ref4.length; _i < _len; i = ++_i) { - item = _ref4[i]; - _results.push((i ? ref : sub) + cmp + item.compile(o, LEVEL_ACCESS)); - } - return _results; - }).call(this); - tests = tests.join(cnj); - if (o.level < LEVEL_OP) { - return tests; - } else { - return "(" + tests + ")"; - } - }; - - In.prototype.compileLoopTest = function(o) { - var code, ref, sub, _ref2; - _ref2 = this.object.cache(o, LEVEL_LIST), sub = _ref2[0], ref = _ref2[1]; - code = utility('indexOf') + (".call(" + (this.array.compile(o, LEVEL_LIST)) + ", " + ref + ") ") + (this.negated ? '< 0' : '>= 0'); - if (sub === ref) { - return code; - } - code = sub + ', ' + code; - if (o.level < LEVEL_LIST) { - return code; - } else { - return "(" + code + ")"; - } - }; - - In.prototype.toString = function(idt) { - return In.__super__.toString.call(this, idt, this.constructor.name + (this.negated ? '!' : '')); - }; - - return In; - - })(Base); - - exports.Try = Try = (function(_super) { - - __extends(Try, _super); - - function Try(attempt, error, recovery, ensure) { - this.attempt = attempt; - this.error = error; - this.recovery = recovery; - this.ensure = ensure; - } - - Try.prototype.children = ['attempt', 'recovery', 'ensure']; - - Try.prototype.isStatement = YES; - - Try.prototype.jumps = function(o) { - var _ref2; - return this.attempt.jumps(o) || ((_ref2 = this.recovery) != null ? _ref2.jumps(o) : void 0); - }; - - Try.prototype.makeReturn = function(res) { - if (this.attempt) { - this.attempt = this.attempt.makeReturn(res); - } - if (this.recovery) { - this.recovery = this.recovery.makeReturn(res); - } - return this; - }; - - Try.prototype.compileNode = function(o) { - var catchPart, ensurePart, errorPart, tryPart; - o.indent += TAB; - errorPart = this.error ? " (" + (this.error.compile(o)) + ") " : ' '; - tryPart = this.attempt.compile(o, LEVEL_TOP); - catchPart = (function() { - var _ref2; - if (this.recovery) { - if (_ref2 = this.error.value, __indexOf.call(STRICT_PROSCRIBED, _ref2) >= 0) { - throw SyntaxError("catch variable may not be \"" + this.error.value + "\""); - } - if (!o.scope.check(this.error.value)) { - o.scope.add(this.error.value, 'param'); - } - return " catch" + errorPart + "{\n" + (this.recovery.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}"; - } else if (!(this.ensure || this.recovery)) { - return ' catch (_error) {}'; - } - }).call(this); - ensurePart = this.ensure ? " finally {\n" + (this.ensure.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}" : ''; - return "" + this.tab + "try {\n" + tryPart + "\n" + this.tab + "}" + (catchPart || '') + ensurePart; - }; - - return Try; - - })(Base); - - exports.Throw = Throw = (function(_super) { - - __extends(Throw, _super); - - function Throw(expression) { - this.expression = expression; - } - - Throw.prototype.children = ['expression']; - - Throw.prototype.isStatement = YES; - - Throw.prototype.jumps = NO; - - Throw.prototype.makeReturn = THIS; - - Throw.prototype.compileNode = function(o) { - return this.tab + ("throw " + (this.expression.compile(o)) + ";"); - }; - - return Throw; - - })(Base); - - exports.Existence = Existence = (function(_super) { - - __extends(Existence, _super); - - function Existence(expression) { - this.expression = expression; - } - - Existence.prototype.children = ['expression']; - - Existence.prototype.invert = NEGATE; - - Existence.prototype.compileNode = function(o) { - var cmp, cnj, code, _ref2; - this.expression.front = this.front; - code = this.expression.compile(o, LEVEL_OP); - if (IDENTIFIER.test(code) && !o.scope.check(code)) { - _ref2 = this.negated ? ['===', '||'] : ['!==', '&&'], cmp = _ref2[0], cnj = _ref2[1]; - code = "typeof " + code + " " + cmp + " \"undefined\" " + cnj + " " + code + " " + cmp + " null"; - } else { - code = "" + code + " " + (this.negated ? '==' : '!=') + " null"; - } - if (o.level <= LEVEL_COND) { - return code; - } else { - return "(" + code + ")"; - } - }; - - return Existence; - - })(Base); - - exports.Parens = Parens = (function(_super) { - - __extends(Parens, _super); - - function Parens(body) { - this.body = body; - } - - Parens.prototype.children = ['body']; - - Parens.prototype.unwrap = function() { - return this.body; - }; - - Parens.prototype.isComplex = function() { - return this.body.isComplex(); - }; - - Parens.prototype.compileNode = function(o) { - var bare, code, expr; - expr = this.body.unwrap(); - if (expr instanceof Value && expr.isAtomic()) { - expr.front = this.front; - return expr.compile(o); - } - code = expr.compile(o, LEVEL_PAREN); - bare = o.level < LEVEL_OP && (expr instanceof Op || expr instanceof Call || (expr instanceof For && expr.returns)); - if (bare) { - return code; - } else { - return "(" + code + ")"; - } - }; - - return Parens; - - })(Base); - - exports.For = For = (function(_super) { - - __extends(For, _super); - - function For(body, source) { - var _ref2; - this.source = source.source, this.guard = source.guard, this.step = source.step, this.name = source.name, this.index = source.index; - this.body = Block.wrap([body]); - this.own = !!source.own; - this.object = !!source.object; - if (this.object) { - _ref2 = [this.index, this.name], this.name = _ref2[0], this.index = _ref2[1]; - } - if (this.index instanceof Value) { - throw SyntaxError('index cannot be a pattern matching expression'); - } - this.range = this.source instanceof Value && this.source.base instanceof Range && !this.source.properties.length; - this.pattern = this.name instanceof Value; - if (this.range && this.index) { - throw SyntaxError('indexes do not apply to range loops'); - } - if (this.range && this.pattern) { - throw SyntaxError('cannot pattern match over range loops'); - } - this.returns = false; - } - - For.prototype.children = ['body', 'source', 'guard', 'step']; - - For.prototype.compileNode = function(o) { - var body, defPart, forPart, forVarPart, guardPart, idt1, index, ivar, kvar, kvarAssign, lastJumps, lvar, name, namePart, ref, resultPart, returnResult, rvar, scope, source, stepPart, stepvar, svar, varPart, _ref2; - body = Block.wrap([this.body]); - lastJumps = (_ref2 = last(body.expressions)) != null ? _ref2.jumps() : void 0; - if (lastJumps && lastJumps instanceof Return) { - this.returns = false; - } - source = this.range ? this.source.base : this.source; - scope = o.scope; - name = this.name && this.name.compile(o, LEVEL_LIST); - index = this.index && this.index.compile(o, LEVEL_LIST); - if (name && !this.pattern) { - scope.find(name); - } - if (index) { - scope.find(index); - } - if (this.returns) { - rvar = scope.freeVariable('results'); - } - ivar = (this.object && index) || scope.freeVariable('i'); - kvar = (this.range && name) || index || ivar; - kvarAssign = kvar !== ivar ? "" + kvar + " = " : ""; - if (this.step && !this.range) { - stepvar = scope.freeVariable("step"); - } - if (this.pattern) { - name = ivar; - } - varPart = ''; - guardPart = ''; - defPart = ''; - idt1 = this.tab + TAB; - if (this.range) { - forPart = source.compile(merge(o, { - index: ivar, - name: name, - step: this.step - })); - } else { - svar = this.source.compile(o, LEVEL_LIST); - if ((name || this.own) && !IDENTIFIER.test(svar)) { - defPart = "" + this.tab + (ref = scope.freeVariable('ref')) + " = " + svar + ";\n"; - svar = ref; - } - if (name && !this.pattern) { - namePart = "" + name + " = " + svar + "[" + kvar + "]"; - } - if (!this.object) { - lvar = scope.freeVariable('len'); - forVarPart = "" + kvarAssign + ivar + " = 0, " + lvar + " = " + svar + ".length"; - if (this.step) { - forVarPart += ", " + stepvar + " = " + (this.step.compile(o, LEVEL_OP)); - } - stepPart = "" + kvarAssign + (this.step ? "" + ivar + " += " + stepvar : (kvar !== ivar ? "++" + ivar : "" + ivar + "++")); - forPart = "" + forVarPart + "; " + ivar + " < " + lvar + "; " + stepPart; - } - } - if (this.returns) { - resultPart = "" + this.tab + rvar + " = [];\n"; - returnResult = "\n" + this.tab + "return " + rvar + ";"; - body.makeReturn(rvar); - } - if (this.guard) { - if (body.expressions.length > 1) { - body.expressions.unshift(new If((new Parens(this.guard)).invert(), new Literal("continue"))); - } else { - if (this.guard) { - body = Block.wrap([new If(this.guard, body)]); - } - } - } - if (this.pattern) { - body.expressions.unshift(new Assign(this.name, new Literal("" + svar + "[" + kvar + "]"))); - } - defPart += this.pluckDirectCall(o, body); - if (namePart) { - varPart = "\n" + idt1 + namePart + ";"; - } - if (this.object) { - forPart = "" + kvar + " in " + svar; - if (this.own) { - guardPart = "\n" + idt1 + "if (!" + (utility('hasProp')) + ".call(" + svar + ", " + kvar + ")) continue;"; - } - } - body = body.compile(merge(o, { - indent: idt1 - }), LEVEL_TOP); - if (body) { - body = '\n' + body + '\n'; - } - return "" + defPart + (resultPart || '') + this.tab + "for (" + forPart + ") {" + guardPart + varPart + body + this.tab + "}" + (returnResult || ''); - }; - - For.prototype.pluckDirectCall = function(o, body) { - var base, defs, expr, fn, idx, ref, val, _i, _len, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7; - defs = ''; - _ref2 = body.expressions; - for (idx = _i = 0, _len = _ref2.length; _i < _len; idx = ++_i) { - expr = _ref2[idx]; - expr = expr.unwrapAll(); - if (!(expr instanceof Call)) { - continue; - } - val = expr.variable.unwrapAll(); - if (!((val instanceof Code) || (val instanceof Value && ((_ref3 = val.base) != null ? _ref3.unwrapAll() : void 0) instanceof Code && val.properties.length === 1 && ((_ref4 = (_ref5 = val.properties[0].name) != null ? _ref5.value : void 0) === 'call' || _ref4 === 'apply')))) { - continue; - } - fn = ((_ref6 = val.base) != null ? _ref6.unwrapAll() : void 0) || val; - ref = new Literal(o.scope.freeVariable('fn')); - base = new Value(ref); - if (val.base) { - _ref7 = [base, val], val.base = _ref7[0], base = _ref7[1]; - } - body.expressions[idx] = new Call(base, expr.args); - defs += this.tab + new Assign(ref, fn).compile(o, LEVEL_TOP) + ';\n'; - } - return defs; - }; - - return For; - - })(While); - - exports.Switch = Switch = (function(_super) { - - __extends(Switch, _super); - - function Switch(subject, cases, otherwise) { - this.subject = subject; - this.cases = cases; - this.otherwise = otherwise; - } - - Switch.prototype.children = ['subject', 'cases', 'otherwise']; - - Switch.prototype.isStatement = YES; - - Switch.prototype.jumps = function(o) { - var block, conds, _i, _len, _ref2, _ref3, _ref4; - if (o == null) { - o = { - block: true - }; - } - _ref2 = this.cases; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - _ref3 = _ref2[_i], conds = _ref3[0], block = _ref3[1]; - if (block.jumps(o)) { - return block; - } - } - return (_ref4 = this.otherwise) != null ? _ref4.jumps(o) : void 0; - }; - - Switch.prototype.makeReturn = function(res) { - var pair, _i, _len, _ref2, _ref3; - _ref2 = this.cases; - for (_i = 0, _len = _ref2.length; _i < _len; _i++) { - pair = _ref2[_i]; - pair[1].makeReturn(res); - } - if (res) { - this.otherwise || (this.otherwise = new Block([new Literal('void 0')])); - } - if ((_ref3 = this.otherwise) != null) { - _ref3.makeReturn(res); - } - return this; - }; - - Switch.prototype.compileNode = function(o) { - var block, body, code, cond, conditions, expr, i, idt1, idt2, _i, _j, _len, _len1, _ref2, _ref3, _ref4, _ref5; - idt1 = o.indent + TAB; - idt2 = o.indent = idt1 + TAB; - code = this.tab + ("switch (" + (((_ref2 = this.subject) != null ? _ref2.compile(o, LEVEL_PAREN) : void 0) || false) + ") {\n"); - _ref3 = this.cases; - for (i = _i = 0, _len = _ref3.length; _i < _len; i = ++_i) { - _ref4 = _ref3[i], conditions = _ref4[0], block = _ref4[1]; - _ref5 = flatten([conditions]); - for (_j = 0, _len1 = _ref5.length; _j < _len1; _j++) { - cond = _ref5[_j]; - if (!this.subject) { - cond = cond.invert(); - } - code += idt1 + ("case " + (cond.compile(o, LEVEL_PAREN)) + ":\n"); - } - if (body = block.compile(o, LEVEL_TOP)) { - code += body + '\n'; - } - if (i === this.cases.length - 1 && !this.otherwise) { - break; - } - expr = this.lastNonComment(block.expressions); - if (expr instanceof Return || (expr instanceof Literal && expr.jumps() && expr.value !== 'debugger')) { - continue; - } - code += idt2 + 'break;\n'; - } - if (this.otherwise && this.otherwise.expressions.length) { - code += idt1 + ("default:\n" + (this.otherwise.compile(o, LEVEL_TOP)) + "\n"); - } - return code + this.tab + '}'; - }; - - return Switch; - - })(Base); - - exports.If = If = (function(_super) { - - __extends(If, _super); - - function If(condition, body, options) { - this.body = body; - if (options == null) { - options = {}; - } - this.condition = options.type === 'unless' ? condition.invert() : condition; - this.elseBody = null; - this.isChain = false; - this.soak = options.soak; - } - - If.prototype.children = ['condition', 'body', 'elseBody']; - - If.prototype.bodyNode = function() { - var _ref2; - return (_ref2 = this.body) != null ? _ref2.unwrap() : void 0; - }; - - If.prototype.elseBodyNode = function() { - var _ref2; - return (_ref2 = this.elseBody) != null ? _ref2.unwrap() : void 0; - }; - - If.prototype.addElse = function(elseBody) { - if (this.isChain) { - this.elseBodyNode().addElse(elseBody); - } else { - this.isChain = elseBody instanceof If; - this.elseBody = this.ensureBlock(elseBody); - } - return this; - }; - - If.prototype.isStatement = function(o) { - var _ref2; - return (o != null ? o.level : void 0) === LEVEL_TOP || this.bodyNode().isStatement(o) || ((_ref2 = this.elseBodyNode()) != null ? _ref2.isStatement(o) : void 0); - }; - - If.prototype.jumps = function(o) { - var _ref2; - return this.body.jumps(o) || ((_ref2 = this.elseBody) != null ? _ref2.jumps(o) : void 0); - }; - - If.prototype.compileNode = function(o) { - if (this.isStatement(o)) { - return this.compileStatement(o); - } else { - return this.compileExpression(o); - } - }; - - If.prototype.makeReturn = function(res) { - if (res) { - this.elseBody || (this.elseBody = new Block([new Literal('void 0')])); - } - this.body && (this.body = new Block([this.body.makeReturn(res)])); - this.elseBody && (this.elseBody = new Block([this.elseBody.makeReturn(res)])); - return this; - }; - - If.prototype.ensureBlock = function(node) { - if (node instanceof Block) { - return node; - } else { - return new Block([node]); - } - }; - - If.prototype.compileStatement = function(o) { - var body, child, cond, exeq, ifPart; - child = del(o, 'chainChild'); - exeq = del(o, 'isExistentialEquals'); - if (exeq) { - return new If(this.condition.invert(), this.elseBodyNode(), { - type: 'if' - }).compile(o); - } - cond = this.condition.compile(o, LEVEL_PAREN); - o.indent += TAB; - body = this.ensureBlock(this.body); - ifPart = "if (" + cond + ") {\n" + (body.compile(o)) + "\n" + this.tab + "}"; - if (!child) { - ifPart = this.tab + ifPart; - } - if (!this.elseBody) { - return ifPart; - } - return ifPart + ' else ' + (this.isChain ? (o.indent = this.tab, o.chainChild = true, this.elseBody.unwrap().compile(o, LEVEL_TOP)) : "{\n" + (this.elseBody.compile(o, LEVEL_TOP)) + "\n" + this.tab + "}"); - }; - - If.prototype.compileExpression = function(o) { - var alt, body, code, cond; - cond = this.condition.compile(o, LEVEL_COND); - body = this.bodyNode().compile(o, LEVEL_LIST); - alt = this.elseBodyNode() ? this.elseBodyNode().compile(o, LEVEL_LIST) : 'void 0'; - code = "" + cond + " ? " + body + " : " + alt; - if (o.level >= LEVEL_COND) { - return "(" + code + ")"; - } else { - return code; - } - }; - - If.prototype.unfoldSoak = function() { - return this.soak && this; - }; - - return If; - - })(Base); - - Closure = { - wrap: function(expressions, statement, noReturn) { - var args, call, func, mentionsArgs, meth; - if (expressions.jumps()) { - return expressions; - } - func = new Code([], Block.wrap([expressions])); - args = []; - if ((mentionsArgs = expressions.contains(this.literalArgs)) || expressions.contains(this.literalThis)) { - meth = new Literal(mentionsArgs ? 'apply' : 'call'); - args = [new Literal('this')]; - if (mentionsArgs) { - args.push(new Literal('arguments')); - } - func = new Value(func, [new Access(meth)]); - } - func.noReturn = noReturn; - call = new Call(func, args); - if (statement) { - return Block.wrap([call]); - } else { - return call; - } - }, - literalArgs: function(node) { - return node instanceof Literal && node.value === 'arguments' && !node.asKey; - }, - literalThis: function(node) { - return (node instanceof Literal && node.value === 'this' && !node.asKey) || (node instanceof Code && node.bound) || (node instanceof Call && node.isSuper); - } - }; - - unfoldSoak = function(o, parent, name) { - var ifn; - if (!(ifn = parent[name].unfoldSoak(o))) { - return; - } - parent[name] = ifn.body; - ifn.body = new Value(parent); - return ifn; - }; - - UTILITIES = { - "extends": function() { - return "function(child, parent) { for (var key in parent) { if (" + (utility('hasProp')) + ".call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }"; - }, - bind: function() { - return 'function(fn, me){ return function(){ return fn.apply(me, arguments); }; }'; - }, - indexOf: function() { - return "[].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }"; - }, - hasProp: function() { - return '{}.hasOwnProperty'; - }, - slice: function() { - return '[].slice'; - } - }; - - LEVEL_TOP = 1; - - LEVEL_PAREN = 2; - - LEVEL_LIST = 3; - - LEVEL_COND = 4; - - LEVEL_OP = 5; - - LEVEL_ACCESS = 6; - - TAB = ' '; - - IDENTIFIER_STR = "[$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*"; - - IDENTIFIER = RegExp("^" + IDENTIFIER_STR + "$"); - - SIMPLENUM = /^[+-]?\d+$/; - - METHOD_DEF = RegExp("^(?:(" + IDENTIFIER_STR + ")\\.prototype(?:\\.(" + IDENTIFIER_STR + ")|\\[(\"(?:[^\\\\\"\\r\\n]|\\\\.)*\"|'(?:[^\\\\'\\r\\n]|\\\\.)*')\\]|\\[(0x[\\da-fA-F]+|\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\]))|(" + IDENTIFIER_STR + ")$"); - - IS_STRING = /^['"]/; - - utility = function(name) { - var ref; - ref = "__" + name; - Scope.root.assign(ref, UTILITIES[name]()); - return ref; - }; - - multident = function(code, tab) { - code = code.replace(/\n/g, '$&' + tab); - return code.replace(/\s+$/, ''); - }; - -}).call(this); diff --git a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/optparse.js b/node_modules/jade/node_modules/coffee-script/lib/coffee-script/optparse.js deleted file mode 100644 index d9bab41..0000000 --- a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/optparse.js +++ /dev/null @@ -1,138 +0,0 @@ -// Generated by CoffeeScript 1.4.0 -(function() { - var LONG_FLAG, MULTI_FLAG, OPTIONAL, OptionParser, SHORT_FLAG, buildRule, buildRules, normalizeArguments; - - exports.OptionParser = OptionParser = (function() { - - function OptionParser(rules, banner) { - this.banner = banner; - this.rules = buildRules(rules); - } - - OptionParser.prototype.parse = function(args) { - var arg, i, isOption, matchedRule, options, originalArgs, pos, rule, seenNonOptionArg, skippingArgument, value, _i, _j, _len, _len1, _ref; - options = { - "arguments": [] - }; - skippingArgument = false; - originalArgs = args; - args = normalizeArguments(args); - for (i = _i = 0, _len = args.length; _i < _len; i = ++_i) { - arg = args[i]; - if (skippingArgument) { - skippingArgument = false; - continue; - } - if (arg === '--') { - pos = originalArgs.indexOf('--'); - options["arguments"] = options["arguments"].concat(originalArgs.slice(pos + 1)); - break; - } - isOption = !!(arg.match(LONG_FLAG) || arg.match(SHORT_FLAG)); - seenNonOptionArg = options["arguments"].length > 0; - if (!seenNonOptionArg) { - matchedRule = false; - _ref = this.rules; - for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { - rule = _ref[_j]; - if (rule.shortFlag === arg || rule.longFlag === arg) { - value = true; - if (rule.hasArgument) { - skippingArgument = true; - value = args[i + 1]; - } - options[rule.name] = rule.isList ? (options[rule.name] || []).concat(value) : value; - matchedRule = true; - break; - } - } - if (isOption && !matchedRule) { - throw new Error("unrecognized option: " + arg); - } - } - if (seenNonOptionArg || !isOption) { - options["arguments"].push(arg); - } - } - return options; - }; - - OptionParser.prototype.help = function() { - var letPart, lines, rule, spaces, _i, _len, _ref; - lines = []; - if (this.banner) { - lines.unshift("" + this.banner + "\n"); - } - _ref = this.rules; - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - rule = _ref[_i]; - spaces = 15 - rule.longFlag.length; - spaces = spaces > 0 ? Array(spaces + 1).join(' ') : ''; - letPart = rule.shortFlag ? rule.shortFlag + ', ' : ' '; - lines.push(' ' + letPart + rule.longFlag + spaces + rule.description); - } - return "\n" + (lines.join('\n')) + "\n"; - }; - - return OptionParser; - - })(); - - LONG_FLAG = /^(--\w[\w\-]*)/; - - SHORT_FLAG = /^(-\w)$/; - - MULTI_FLAG = /^-(\w{2,})/; - - OPTIONAL = /\[(\w+(\*?))\]/; - - buildRules = function(rules) { - var tuple, _i, _len, _results; - _results = []; - for (_i = 0, _len = rules.length; _i < _len; _i++) { - tuple = rules[_i]; - if (tuple.length < 3) { - tuple.unshift(null); - } - _results.push(buildRule.apply(null, tuple)); - } - return _results; - }; - - buildRule = function(shortFlag, longFlag, description, options) { - var match; - if (options == null) { - options = {}; - } - match = longFlag.match(OPTIONAL); - longFlag = longFlag.match(LONG_FLAG)[1]; - return { - name: longFlag.substr(2), - shortFlag: shortFlag, - longFlag: longFlag, - description: description, - hasArgument: !!(match && match[1]), - isList: !!(match && match[2]) - }; - }; - - normalizeArguments = function(args) { - var arg, l, match, result, _i, _j, _len, _len1, _ref; - args = args.slice(0); - result = []; - for (_i = 0, _len = args.length; _i < _len; _i++) { - arg = args[_i]; - if (match = arg.match(MULTI_FLAG)) { - _ref = match[1].split(''); - for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) { - l = _ref[_j]; - result.push('-' + l); - } - } else { - result.push(arg); - } - } - return result; - }; - -}).call(this); diff --git a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/parser.js b/node_modules/jade/node_modules/coffee-script/lib/coffee-script/parser.js deleted file mode 100755 index f049903..0000000 --- a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/parser.js +++ /dev/null @@ -1,683 +0,0 @@ -/* Jison generated parser */ -var parser = (function(){ -var parser = {trace: function trace() { }, -yy: {}, -symbols_: {"error":2,"Root":3,"Body":4,"Block":5,"TERMINATOR":6,"Line":7,"Expression":8,"Statement":9,"Return":10,"Comment":11,"STATEMENT":12,"Value":13,"Invocation":14,"Code":15,"Operation":16,"Assign":17,"If":18,"Try":19,"While":20,"For":21,"Switch":22,"Class":23,"Throw":24,"INDENT":25,"OUTDENT":26,"Identifier":27,"IDENTIFIER":28,"AlphaNumeric":29,"NUMBER":30,"STRING":31,"Literal":32,"JS":33,"REGEX":34,"DEBUGGER":35,"UNDEFINED":36,"NULL":37,"BOOL":38,"Assignable":39,"=":40,"AssignObj":41,"ObjAssignable":42,":":43,"ThisProperty":44,"RETURN":45,"HERECOMMENT":46,"PARAM_START":47,"ParamList":48,"PARAM_END":49,"FuncGlyph":50,"->":51,"=>":52,"OptComma":53,",":54,"Param":55,"ParamVar":56,"...":57,"Array":58,"Object":59,"Splat":60,"SimpleAssignable":61,"Accessor":62,"Parenthetical":63,"Range":64,"This":65,".":66,"?.":67,"::":68,"Index":69,"INDEX_START":70,"IndexValue":71,"INDEX_END":72,"INDEX_SOAK":73,"Slice":74,"{":75,"AssignList":76,"}":77,"CLASS":78,"EXTENDS":79,"OptFuncExist":80,"Arguments":81,"SUPER":82,"FUNC_EXIST":83,"CALL_START":84,"CALL_END":85,"ArgList":86,"THIS":87,"@":88,"[":89,"]":90,"RangeDots":91,"..":92,"Arg":93,"SimpleArgs":94,"TRY":95,"Catch":96,"FINALLY":97,"CATCH":98,"THROW":99,"(":100,")":101,"WhileSource":102,"WHILE":103,"WHEN":104,"UNTIL":105,"Loop":106,"LOOP":107,"ForBody":108,"FOR":109,"ForStart":110,"ForSource":111,"ForVariables":112,"OWN":113,"ForValue":114,"FORIN":115,"FOROF":116,"BY":117,"SWITCH":118,"Whens":119,"ELSE":120,"When":121,"LEADING_WHEN":122,"IfBlock":123,"IF":124,"POST_IF":125,"UNARY":126,"-":127,"+":128,"--":129,"++":130,"?":131,"MATH":132,"SHIFT":133,"COMPARE":134,"LOGIC":135,"RELATION":136,"COMPOUND_ASSIGN":137,"$accept":0,"$end":1}, -terminals_: {2:"error",6:"TERMINATOR",12:"STATEMENT",25:"INDENT",26:"OUTDENT",28:"IDENTIFIER",30:"NUMBER",31:"STRING",33:"JS",34:"REGEX",35:"DEBUGGER",36:"UNDEFINED",37:"NULL",38:"BOOL",40:"=",43:":",45:"RETURN",46:"HERECOMMENT",47:"PARAM_START",49:"PARAM_END",51:"->",52:"=>",54:",",57:"...",66:".",67:"?.",68:"::",70:"INDEX_START",72:"INDEX_END",73:"INDEX_SOAK",75:"{",77:"}",78:"CLASS",79:"EXTENDS",82:"SUPER",83:"FUNC_EXIST",84:"CALL_START",85:"CALL_END",87:"THIS",88:"@",89:"[",90:"]",92:"..",95:"TRY",97:"FINALLY",98:"CATCH",99:"THROW",100:"(",101:")",103:"WHILE",104:"WHEN",105:"UNTIL",107:"LOOP",109:"FOR",113:"OWN",115:"FORIN",116:"FOROF",117:"BY",118:"SWITCH",120:"ELSE",122:"LEADING_WHEN",124:"IF",125:"POST_IF",126:"UNARY",127:"-",128:"+",129:"--",130:"++",131:"?",132:"MATH",133:"SHIFT",134:"COMPARE",135:"LOGIC",136:"RELATION",137:"COMPOUND_ASSIGN"}, -productions_: [0,[3,0],[3,1],[3,2],[4,1],[4,3],[4,2],[7,1],[7,1],[9,1],[9,1],[9,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[8,1],[5,2],[5,3],[27,1],[29,1],[29,1],[32,1],[32,1],[32,1],[32,1],[32,1],[32,1],[32,1],[17,3],[17,4],[17,5],[41,1],[41,3],[41,5],[41,1],[42,1],[42,1],[42,1],[10,2],[10,1],[11,1],[15,5],[15,2],[50,1],[50,1],[53,0],[53,1],[48,0],[48,1],[48,3],[48,4],[48,6],[55,1],[55,2],[55,3],[56,1],[56,1],[56,1],[56,1],[60,2],[61,1],[61,2],[61,2],[61,1],[39,1],[39,1],[39,1],[13,1],[13,1],[13,1],[13,1],[13,1],[62,2],[62,2],[62,2],[62,1],[62,1],[69,3],[69,2],[71,1],[71,1],[59,4],[76,0],[76,1],[76,3],[76,4],[76,6],[23,1],[23,2],[23,3],[23,4],[23,2],[23,3],[23,4],[23,5],[14,3],[14,3],[14,1],[14,2],[80,0],[80,1],[81,2],[81,4],[65,1],[65,1],[44,2],[58,2],[58,4],[91,1],[91,1],[64,5],[74,3],[74,2],[74,2],[74,1],[86,1],[86,3],[86,4],[86,4],[86,6],[93,1],[93,1],[94,1],[94,3],[19,2],[19,3],[19,4],[19,5],[96,3],[24,2],[63,3],[63,5],[102,2],[102,4],[102,2],[102,4],[20,2],[20,2],[20,2],[20,1],[106,2],[106,2],[21,2],[21,2],[21,2],[108,2],[108,2],[110,2],[110,3],[114,1],[114,1],[114,1],[114,1],[112,1],[112,3],[111,2],[111,2],[111,4],[111,4],[111,4],[111,6],[111,6],[22,5],[22,7],[22,4],[22,6],[119,1],[119,2],[121,3],[121,4],[123,3],[123,5],[18,1],[18,3],[18,3],[18,3],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,2],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,3],[16,5],[16,3]], -performAction: function anonymous(yytext,yyleng,yylineno,yy,yystate,$$,_$) { - -var $0 = $$.length - 1; -switch (yystate) { -case 1:return this.$ = new yy.Block; -break; -case 2:return this.$ = $$[$0]; -break; -case 3:return this.$ = $$[$0-1]; -break; -case 4:this.$ = yy.Block.wrap([$$[$0]]); -break; -case 5:this.$ = $$[$0-2].push($$[$0]); -break; -case 6:this.$ = $$[$0-1]; -break; -case 7:this.$ = $$[$0]; -break; -case 8:this.$ = $$[$0]; -break; -case 9:this.$ = $$[$0]; -break; -case 10:this.$ = $$[$0]; -break; -case 11:this.$ = new yy.Literal($$[$0]); -break; -case 12:this.$ = $$[$0]; -break; -case 13:this.$ = $$[$0]; -break; -case 14:this.$ = $$[$0]; -break; -case 15:this.$ = $$[$0]; -break; -case 16:this.$ = $$[$0]; -break; -case 17:this.$ = $$[$0]; -break; -case 18:this.$ = $$[$0]; -break; -case 19:this.$ = $$[$0]; -break; -case 20:this.$ = $$[$0]; -break; -case 21:this.$ = $$[$0]; -break; -case 22:this.$ = $$[$0]; -break; -case 23:this.$ = $$[$0]; -break; -case 24:this.$ = new yy.Block; -break; -case 25:this.$ = $$[$0-1]; -break; -case 26:this.$ = new yy.Literal($$[$0]); -break; -case 27:this.$ = new yy.Literal($$[$0]); -break; -case 28:this.$ = new yy.Literal($$[$0]); -break; -case 29:this.$ = $$[$0]; -break; -case 30:this.$ = new yy.Literal($$[$0]); -break; -case 31:this.$ = new yy.Literal($$[$0]); -break; -case 32:this.$ = new yy.Literal($$[$0]); -break; -case 33:this.$ = new yy.Undefined; -break; -case 34:this.$ = new yy.Null; -break; -case 35:this.$ = new yy.Bool($$[$0]); -break; -case 36:this.$ = new yy.Assign($$[$0-2], $$[$0]); -break; -case 37:this.$ = new yy.Assign($$[$0-3], $$[$0]); -break; -case 38:this.$ = new yy.Assign($$[$0-4], $$[$0-1]); -break; -case 39:this.$ = new yy.Value($$[$0]); -break; -case 40:this.$ = new yy.Assign(new yy.Value($$[$0-2]), $$[$0], 'object'); -break; -case 41:this.$ = new yy.Assign(new yy.Value($$[$0-4]), $$[$0-1], 'object'); -break; -case 42:this.$ = $$[$0]; -break; -case 43:this.$ = $$[$0]; -break; -case 44:this.$ = $$[$0]; -break; -case 45:this.$ = $$[$0]; -break; -case 46:this.$ = new yy.Return($$[$0]); -break; -case 47:this.$ = new yy.Return; -break; -case 48:this.$ = new yy.Comment($$[$0]); -break; -case 49:this.$ = new yy.Code($$[$0-3], $$[$0], $$[$0-1]); -break; -case 50:this.$ = new yy.Code([], $$[$0], $$[$0-1]); -break; -case 51:this.$ = 'func'; -break; -case 52:this.$ = 'boundfunc'; -break; -case 53:this.$ = $$[$0]; -break; -case 54:this.$ = $$[$0]; -break; -case 55:this.$ = []; -break; -case 56:this.$ = [$$[$0]]; -break; -case 57:this.$ = $$[$0-2].concat($$[$0]); -break; -case 58:this.$ = $$[$0-3].concat($$[$0]); -break; -case 59:this.$ = $$[$0-5].concat($$[$0-2]); -break; -case 60:this.$ = new yy.Param($$[$0]); -break; -case 61:this.$ = new yy.Param($$[$0-1], null, true); -break; -case 62:this.$ = new yy.Param($$[$0-2], $$[$0]); -break; -case 63:this.$ = $$[$0]; -break; -case 64:this.$ = $$[$0]; -break; -case 65:this.$ = $$[$0]; -break; -case 66:this.$ = $$[$0]; -break; -case 67:this.$ = new yy.Splat($$[$0-1]); -break; -case 68:this.$ = new yy.Value($$[$0]); -break; -case 69:this.$ = $$[$0-1].add($$[$0]); -break; -case 70:this.$ = new yy.Value($$[$0-1], [].concat($$[$0])); -break; -case 71:this.$ = $$[$0]; -break; -case 72:this.$ = $$[$0]; -break; -case 73:this.$ = new yy.Value($$[$0]); -break; -case 74:this.$ = new yy.Value($$[$0]); -break; -case 75:this.$ = $$[$0]; -break; -case 76:this.$ = new yy.Value($$[$0]); -break; -case 77:this.$ = new yy.Value($$[$0]); -break; -case 78:this.$ = new yy.Value($$[$0]); -break; -case 79:this.$ = $$[$0]; -break; -case 80:this.$ = new yy.Access($$[$0]); -break; -case 81:this.$ = new yy.Access($$[$0], 'soak'); -break; -case 82:this.$ = [new yy.Access(new yy.Literal('prototype')), new yy.Access($$[$0])]; -break; -case 83:this.$ = new yy.Access(new yy.Literal('prototype')); -break; -case 84:this.$ = $$[$0]; -break; -case 85:this.$ = $$[$0-1]; -break; -case 86:this.$ = yy.extend($$[$0], { - soak: true - }); -break; -case 87:this.$ = new yy.Index($$[$0]); -break; -case 88:this.$ = new yy.Slice($$[$0]); -break; -case 89:this.$ = new yy.Obj($$[$0-2], $$[$0-3].generated); -break; -case 90:this.$ = []; -break; -case 91:this.$ = [$$[$0]]; -break; -case 92:this.$ = $$[$0-2].concat($$[$0]); -break; -case 93:this.$ = $$[$0-3].concat($$[$0]); -break; -case 94:this.$ = $$[$0-5].concat($$[$0-2]); -break; -case 95:this.$ = new yy.Class; -break; -case 96:this.$ = new yy.Class(null, null, $$[$0]); -break; -case 97:this.$ = new yy.Class(null, $$[$0]); -break; -case 98:this.$ = new yy.Class(null, $$[$0-1], $$[$0]); -break; -case 99:this.$ = new yy.Class($$[$0]); -break; -case 100:this.$ = new yy.Class($$[$0-1], null, $$[$0]); -break; -case 101:this.$ = new yy.Class($$[$0-2], $$[$0]); -break; -case 102:this.$ = new yy.Class($$[$0-3], $$[$0-1], $$[$0]); -break; -case 103:this.$ = new yy.Call($$[$0-2], $$[$0], $$[$0-1]); -break; -case 104:this.$ = new yy.Call($$[$0-2], $$[$0], $$[$0-1]); -break; -case 105:this.$ = new yy.Call('super', [new yy.Splat(new yy.Literal('arguments'))]); -break; -case 106:this.$ = new yy.Call('super', $$[$0]); -break; -case 107:this.$ = false; -break; -case 108:this.$ = true; -break; -case 109:this.$ = []; -break; -case 110:this.$ = $$[$0-2]; -break; -case 111:this.$ = new yy.Value(new yy.Literal('this')); -break; -case 112:this.$ = new yy.Value(new yy.Literal('this')); -break; -case 113:this.$ = new yy.Value(new yy.Literal('this'), [new yy.Access($$[$0])], 'this'); -break; -case 114:this.$ = new yy.Arr([]); -break; -case 115:this.$ = new yy.Arr($$[$0-2]); -break; -case 116:this.$ = 'inclusive'; -break; -case 117:this.$ = 'exclusive'; -break; -case 118:this.$ = new yy.Range($$[$0-3], $$[$0-1], $$[$0-2]); -break; -case 119:this.$ = new yy.Range($$[$0-2], $$[$0], $$[$0-1]); -break; -case 120:this.$ = new yy.Range($$[$0-1], null, $$[$0]); -break; -case 121:this.$ = new yy.Range(null, $$[$0], $$[$0-1]); -break; -case 122:this.$ = new yy.Range(null, null, $$[$0]); -break; -case 123:this.$ = [$$[$0]]; -break; -case 124:this.$ = $$[$0-2].concat($$[$0]); -break; -case 125:this.$ = $$[$0-3].concat($$[$0]); -break; -case 126:this.$ = $$[$0-2]; -break; -case 127:this.$ = $$[$0-5].concat($$[$0-2]); -break; -case 128:this.$ = $$[$0]; -break; -case 129:this.$ = $$[$0]; -break; -case 130:this.$ = $$[$0]; -break; -case 131:this.$ = [].concat($$[$0-2], $$[$0]); -break; -case 132:this.$ = new yy.Try($$[$0]); -break; -case 133:this.$ = new yy.Try($$[$0-1], $$[$0][0], $$[$0][1]); -break; -case 134:this.$ = new yy.Try($$[$0-2], null, null, $$[$0]); -break; -case 135:this.$ = new yy.Try($$[$0-3], $$[$0-2][0], $$[$0-2][1], $$[$0]); -break; -case 136:this.$ = [$$[$0-1], $$[$0]]; -break; -case 137:this.$ = new yy.Throw($$[$0]); -break; -case 138:this.$ = new yy.Parens($$[$0-1]); -break; -case 139:this.$ = new yy.Parens($$[$0-2]); -break; -case 140:this.$ = new yy.While($$[$0]); -break; -case 141:this.$ = new yy.While($$[$0-2], { - guard: $$[$0] - }); -break; -case 142:this.$ = new yy.While($$[$0], { - invert: true - }); -break; -case 143:this.$ = new yy.While($$[$0-2], { - invert: true, - guard: $$[$0] - }); -break; -case 144:this.$ = $$[$0-1].addBody($$[$0]); -break; -case 145:this.$ = $$[$0].addBody(yy.Block.wrap([$$[$0-1]])); -break; -case 146:this.$ = $$[$0].addBody(yy.Block.wrap([$$[$0-1]])); -break; -case 147:this.$ = $$[$0]; -break; -case 148:this.$ = new yy.While(new yy.Literal('true')).addBody($$[$0]); -break; -case 149:this.$ = new yy.While(new yy.Literal('true')).addBody(yy.Block.wrap([$$[$0]])); -break; -case 150:this.$ = new yy.For($$[$0-1], $$[$0]); -break; -case 151:this.$ = new yy.For($$[$0-1], $$[$0]); -break; -case 152:this.$ = new yy.For($$[$0], $$[$0-1]); -break; -case 153:this.$ = { - source: new yy.Value($$[$0]) - }; -break; -case 154:this.$ = (function () { - $$[$0].own = $$[$0-1].own; - $$[$0].name = $$[$0-1][0]; - $$[$0].index = $$[$0-1][1]; - return $$[$0]; - }()); -break; -case 155:this.$ = $$[$0]; -break; -case 156:this.$ = (function () { - $$[$0].own = true; - return $$[$0]; - }()); -break; -case 157:this.$ = $$[$0]; -break; -case 158:this.$ = $$[$0]; -break; -case 159:this.$ = new yy.Value($$[$0]); -break; -case 160:this.$ = new yy.Value($$[$0]); -break; -case 161:this.$ = [$$[$0]]; -break; -case 162:this.$ = [$$[$0-2], $$[$0]]; -break; -case 163:this.$ = { - source: $$[$0] - }; -break; -case 164:this.$ = { - source: $$[$0], - object: true - }; -break; -case 165:this.$ = { - source: $$[$0-2], - guard: $$[$0] - }; -break; -case 166:this.$ = { - source: $$[$0-2], - guard: $$[$0], - object: true - }; -break; -case 167:this.$ = { - source: $$[$0-2], - step: $$[$0] - }; -break; -case 168:this.$ = { - source: $$[$0-4], - guard: $$[$0-2], - step: $$[$0] - }; -break; -case 169:this.$ = { - source: $$[$0-4], - step: $$[$0-2], - guard: $$[$0] - }; -break; -case 170:this.$ = new yy.Switch($$[$0-3], $$[$0-1]); -break; -case 171:this.$ = new yy.Switch($$[$0-5], $$[$0-3], $$[$0-1]); -break; -case 172:this.$ = new yy.Switch(null, $$[$0-1]); -break; -case 173:this.$ = new yy.Switch(null, $$[$0-3], $$[$0-1]); -break; -case 174:this.$ = $$[$0]; -break; -case 175:this.$ = $$[$0-1].concat($$[$0]); -break; -case 176:this.$ = [[$$[$0-1], $$[$0]]]; -break; -case 177:this.$ = [[$$[$0-2], $$[$0-1]]]; -break; -case 178:this.$ = new yy.If($$[$0-1], $$[$0], { - type: $$[$0-2] - }); -break; -case 179:this.$ = $$[$0-4].addElse(new yy.If($$[$0-1], $$[$0], { - type: $$[$0-2] - })); -break; -case 180:this.$ = $$[$0]; -break; -case 181:this.$ = $$[$0-2].addElse($$[$0]); -break; -case 182:this.$ = new yy.If($$[$0], yy.Block.wrap([$$[$0-2]]), { - type: $$[$0-1], - statement: true - }); -break; -case 183:this.$ = new yy.If($$[$0], yy.Block.wrap([$$[$0-2]]), { - type: $$[$0-1], - statement: true - }); -break; -case 184:this.$ = new yy.Op($$[$0-1], $$[$0]); -break; -case 185:this.$ = new yy.Op('-', $$[$0]); -break; -case 186:this.$ = new yy.Op('+', $$[$0]); -break; -case 187:this.$ = new yy.Op('--', $$[$0]); -break; -case 188:this.$ = new yy.Op('++', $$[$0]); -break; -case 189:this.$ = new yy.Op('--', $$[$0-1], null, true); -break; -case 190:this.$ = new yy.Op('++', $$[$0-1], null, true); -break; -case 191:this.$ = new yy.Existence($$[$0-1]); -break; -case 192:this.$ = new yy.Op('+', $$[$0-2], $$[$0]); -break; -case 193:this.$ = new yy.Op('-', $$[$0-2], $$[$0]); -break; -case 194:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]); -break; -case 195:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]); -break; -case 196:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]); -break; -case 197:this.$ = new yy.Op($$[$0-1], $$[$0-2], $$[$0]); -break; -case 198:this.$ = (function () { - if ($$[$0-1].charAt(0) === '!') { - return new yy.Op($$[$0-1].slice(1), $$[$0-2], $$[$0]).invert(); - } else { - return new yy.Op($$[$0-1], $$[$0-2], $$[$0]); - } - }()); -break; -case 199:this.$ = new yy.Assign($$[$0-2], $$[$0], $$[$0-1]); -break; -case 200:this.$ = new yy.Assign($$[$0-4], $$[$0-1], $$[$0-3]); -break; -case 201:this.$ = new yy.Extends($$[$0-2], $$[$0]); -break; -} -}, -table: [{1:[2,1],3:1,4:2,5:3,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,5],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[3]},{1:[2,2],6:[1,74]},{6:[1,75]},{1:[2,4],6:[2,4],26:[2,4],101:[2,4]},{4:77,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[1,76],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,7],6:[2,7],26:[2,7],101:[2,7],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,8],6:[2,8],26:[2,8],101:[2,8],102:90,103:[1,65],105:[1,66],108:91,109:[1,68],110:69,125:[1,89]},{1:[2,12],6:[2,12],25:[2,12],26:[2,12],49:[2,12],54:[2,12],57:[2,12],62:93,66:[1,95],67:[1,96],68:[1,97],69:98,70:[1,99],72:[2,12],73:[1,100],77:[2,12],80:92,83:[1,94],84:[2,107],85:[2,12],90:[2,12],92:[2,12],101:[2,12],103:[2,12],104:[2,12],105:[2,12],109:[2,12],117:[2,12],125:[2,12],127:[2,12],128:[2,12],131:[2,12],132:[2,12],133:[2,12],134:[2,12],135:[2,12],136:[2,12]},{1:[2,13],6:[2,13],25:[2,13],26:[2,13],49:[2,13],54:[2,13],57:[2,13],62:102,66:[1,95],67:[1,96],68:[1,97],69:98,70:[1,99],72:[2,13],73:[1,100],77:[2,13],80:101,83:[1,94],84:[2,107],85:[2,13],90:[2,13],92:[2,13],101:[2,13],103:[2,13],104:[2,13],105:[2,13],109:[2,13],117:[2,13],125:[2,13],127:[2,13],128:[2,13],131:[2,13],132:[2,13],133:[2,13],134:[2,13],135:[2,13],136:[2,13]},{1:[2,14],6:[2,14],25:[2,14],26:[2,14],49:[2,14],54:[2,14],57:[2,14],72:[2,14],77:[2,14],85:[2,14],90:[2,14],92:[2,14],101:[2,14],103:[2,14],104:[2,14],105:[2,14],109:[2,14],117:[2,14],125:[2,14],127:[2,14],128:[2,14],131:[2,14],132:[2,14],133:[2,14],134:[2,14],135:[2,14],136:[2,14]},{1:[2,15],6:[2,15],25:[2,15],26:[2,15],49:[2,15],54:[2,15],57:[2,15],72:[2,15],77:[2,15],85:[2,15],90:[2,15],92:[2,15],101:[2,15],103:[2,15],104:[2,15],105:[2,15],109:[2,15],117:[2,15],125:[2,15],127:[2,15],128:[2,15],131:[2,15],132:[2,15],133:[2,15],134:[2,15],135:[2,15],136:[2,15]},{1:[2,16],6:[2,16],25:[2,16],26:[2,16],49:[2,16],54:[2,16],57:[2,16],72:[2,16],77:[2,16],85:[2,16],90:[2,16],92:[2,16],101:[2,16],103:[2,16],104:[2,16],105:[2,16],109:[2,16],117:[2,16],125:[2,16],127:[2,16],128:[2,16],131:[2,16],132:[2,16],133:[2,16],134:[2,16],135:[2,16],136:[2,16]},{1:[2,17],6:[2,17],25:[2,17],26:[2,17],49:[2,17],54:[2,17],57:[2,17],72:[2,17],77:[2,17],85:[2,17],90:[2,17],92:[2,17],101:[2,17],103:[2,17],104:[2,17],105:[2,17],109:[2,17],117:[2,17],125:[2,17],127:[2,17],128:[2,17],131:[2,17],132:[2,17],133:[2,17],134:[2,17],135:[2,17],136:[2,17]},{1:[2,18],6:[2,18],25:[2,18],26:[2,18],49:[2,18],54:[2,18],57:[2,18],72:[2,18],77:[2,18],85:[2,18],90:[2,18],92:[2,18],101:[2,18],103:[2,18],104:[2,18],105:[2,18],109:[2,18],117:[2,18],125:[2,18],127:[2,18],128:[2,18],131:[2,18],132:[2,18],133:[2,18],134:[2,18],135:[2,18],136:[2,18]},{1:[2,19],6:[2,19],25:[2,19],26:[2,19],49:[2,19],54:[2,19],57:[2,19],72:[2,19],77:[2,19],85:[2,19],90:[2,19],92:[2,19],101:[2,19],103:[2,19],104:[2,19],105:[2,19],109:[2,19],117:[2,19],125:[2,19],127:[2,19],128:[2,19],131:[2,19],132:[2,19],133:[2,19],134:[2,19],135:[2,19],136:[2,19]},{1:[2,20],6:[2,20],25:[2,20],26:[2,20],49:[2,20],54:[2,20],57:[2,20],72:[2,20],77:[2,20],85:[2,20],90:[2,20],92:[2,20],101:[2,20],103:[2,20],104:[2,20],105:[2,20],109:[2,20],117:[2,20],125:[2,20],127:[2,20],128:[2,20],131:[2,20],132:[2,20],133:[2,20],134:[2,20],135:[2,20],136:[2,20]},{1:[2,21],6:[2,21],25:[2,21],26:[2,21],49:[2,21],54:[2,21],57:[2,21],72:[2,21],77:[2,21],85:[2,21],90:[2,21],92:[2,21],101:[2,21],103:[2,21],104:[2,21],105:[2,21],109:[2,21],117:[2,21],125:[2,21],127:[2,21],128:[2,21],131:[2,21],132:[2,21],133:[2,21],134:[2,21],135:[2,21],136:[2,21]},{1:[2,22],6:[2,22],25:[2,22],26:[2,22],49:[2,22],54:[2,22],57:[2,22],72:[2,22],77:[2,22],85:[2,22],90:[2,22],92:[2,22],101:[2,22],103:[2,22],104:[2,22],105:[2,22],109:[2,22],117:[2,22],125:[2,22],127:[2,22],128:[2,22],131:[2,22],132:[2,22],133:[2,22],134:[2,22],135:[2,22],136:[2,22]},{1:[2,23],6:[2,23],25:[2,23],26:[2,23],49:[2,23],54:[2,23],57:[2,23],72:[2,23],77:[2,23],85:[2,23],90:[2,23],92:[2,23],101:[2,23],103:[2,23],104:[2,23],105:[2,23],109:[2,23],117:[2,23],125:[2,23],127:[2,23],128:[2,23],131:[2,23],132:[2,23],133:[2,23],134:[2,23],135:[2,23],136:[2,23]},{1:[2,9],6:[2,9],26:[2,9],101:[2,9],103:[2,9],105:[2,9],109:[2,9],125:[2,9]},{1:[2,10],6:[2,10],26:[2,10],101:[2,10],103:[2,10],105:[2,10],109:[2,10],125:[2,10]},{1:[2,11],6:[2,11],26:[2,11],101:[2,11],103:[2,11],105:[2,11],109:[2,11],125:[2,11]},{1:[2,75],6:[2,75],25:[2,75],26:[2,75],40:[1,103],49:[2,75],54:[2,75],57:[2,75],66:[2,75],67:[2,75],68:[2,75],70:[2,75],72:[2,75],73:[2,75],77:[2,75],83:[2,75],84:[2,75],85:[2,75],90:[2,75],92:[2,75],101:[2,75],103:[2,75],104:[2,75],105:[2,75],109:[2,75],117:[2,75],125:[2,75],127:[2,75],128:[2,75],131:[2,75],132:[2,75],133:[2,75],134:[2,75],135:[2,75],136:[2,75]},{1:[2,76],6:[2,76],25:[2,76],26:[2,76],49:[2,76],54:[2,76],57:[2,76],66:[2,76],67:[2,76],68:[2,76],70:[2,76],72:[2,76],73:[2,76],77:[2,76],83:[2,76],84:[2,76],85:[2,76],90:[2,76],92:[2,76],101:[2,76],103:[2,76],104:[2,76],105:[2,76],109:[2,76],117:[2,76],125:[2,76],127:[2,76],128:[2,76],131:[2,76],132:[2,76],133:[2,76],134:[2,76],135:[2,76],136:[2,76]},{1:[2,77],6:[2,77],25:[2,77],26:[2,77],49:[2,77],54:[2,77],57:[2,77],66:[2,77],67:[2,77],68:[2,77],70:[2,77],72:[2,77],73:[2,77],77:[2,77],83:[2,77],84:[2,77],85:[2,77],90:[2,77],92:[2,77],101:[2,77],103:[2,77],104:[2,77],105:[2,77],109:[2,77],117:[2,77],125:[2,77],127:[2,77],128:[2,77],131:[2,77],132:[2,77],133:[2,77],134:[2,77],135:[2,77],136:[2,77]},{1:[2,78],6:[2,78],25:[2,78],26:[2,78],49:[2,78],54:[2,78],57:[2,78],66:[2,78],67:[2,78],68:[2,78],70:[2,78],72:[2,78],73:[2,78],77:[2,78],83:[2,78],84:[2,78],85:[2,78],90:[2,78],92:[2,78],101:[2,78],103:[2,78],104:[2,78],105:[2,78],109:[2,78],117:[2,78],125:[2,78],127:[2,78],128:[2,78],131:[2,78],132:[2,78],133:[2,78],134:[2,78],135:[2,78],136:[2,78]},{1:[2,79],6:[2,79],25:[2,79],26:[2,79],49:[2,79],54:[2,79],57:[2,79],66:[2,79],67:[2,79],68:[2,79],70:[2,79],72:[2,79],73:[2,79],77:[2,79],83:[2,79],84:[2,79],85:[2,79],90:[2,79],92:[2,79],101:[2,79],103:[2,79],104:[2,79],105:[2,79],109:[2,79],117:[2,79],125:[2,79],127:[2,79],128:[2,79],131:[2,79],132:[2,79],133:[2,79],134:[2,79],135:[2,79],136:[2,79]},{1:[2,105],6:[2,105],25:[2,105],26:[2,105],49:[2,105],54:[2,105],57:[2,105],66:[2,105],67:[2,105],68:[2,105],70:[2,105],72:[2,105],73:[2,105],77:[2,105],81:104,83:[2,105],84:[1,105],85:[2,105],90:[2,105],92:[2,105],101:[2,105],103:[2,105],104:[2,105],105:[2,105],109:[2,105],117:[2,105],125:[2,105],127:[2,105],128:[2,105],131:[2,105],132:[2,105],133:[2,105],134:[2,105],135:[2,105],136:[2,105]},{6:[2,55],25:[2,55],27:109,28:[1,73],44:110,48:106,49:[2,55],54:[2,55],55:107,56:108,58:111,59:112,75:[1,70],88:[1,113],89:[1,114]},{5:115,25:[1,5]},{8:116,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:118,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:119,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{13:121,14:122,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:123,44:63,58:47,59:48,61:120,63:25,64:26,65:27,75:[1,70],82:[1,28],87:[1,58],88:[1,59],89:[1,57],100:[1,56]},{13:121,14:122,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:123,44:63,58:47,59:48,61:124,63:25,64:26,65:27,75:[1,70],82:[1,28],87:[1,58],88:[1,59],89:[1,57],100:[1,56]},{1:[2,72],6:[2,72],25:[2,72],26:[2,72],40:[2,72],49:[2,72],54:[2,72],57:[2,72],66:[2,72],67:[2,72],68:[2,72],70:[2,72],72:[2,72],73:[2,72],77:[2,72],79:[1,128],83:[2,72],84:[2,72],85:[2,72],90:[2,72],92:[2,72],101:[2,72],103:[2,72],104:[2,72],105:[2,72],109:[2,72],117:[2,72],125:[2,72],127:[2,72],128:[2,72],129:[1,125],130:[1,126],131:[2,72],132:[2,72],133:[2,72],134:[2,72],135:[2,72],136:[2,72],137:[1,127]},{1:[2,180],6:[2,180],25:[2,180],26:[2,180],49:[2,180],54:[2,180],57:[2,180],72:[2,180],77:[2,180],85:[2,180],90:[2,180],92:[2,180],101:[2,180],103:[2,180],104:[2,180],105:[2,180],109:[2,180],117:[2,180],120:[1,129],125:[2,180],127:[2,180],128:[2,180],131:[2,180],132:[2,180],133:[2,180],134:[2,180],135:[2,180],136:[2,180]},{5:130,25:[1,5]},{5:131,25:[1,5]},{1:[2,147],6:[2,147],25:[2,147],26:[2,147],49:[2,147],54:[2,147],57:[2,147],72:[2,147],77:[2,147],85:[2,147],90:[2,147],92:[2,147],101:[2,147],103:[2,147],104:[2,147],105:[2,147],109:[2,147],117:[2,147],125:[2,147],127:[2,147],128:[2,147],131:[2,147],132:[2,147],133:[2,147],134:[2,147],135:[2,147],136:[2,147]},{5:132,25:[1,5]},{8:133,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,134],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,95],5:135,6:[2,95],13:121,14:122,25:[1,5],26:[2,95],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:123,44:63,49:[2,95],54:[2,95],57:[2,95],58:47,59:48,61:137,63:25,64:26,65:27,72:[2,95],75:[1,70],77:[2,95],79:[1,136],82:[1,28],85:[2,95],87:[1,58],88:[1,59],89:[1,57],90:[2,95],92:[2,95],100:[1,56],101:[2,95],103:[2,95],104:[2,95],105:[2,95],109:[2,95],117:[2,95],125:[2,95],127:[2,95],128:[2,95],131:[2,95],132:[2,95],133:[2,95],134:[2,95],135:[2,95],136:[2,95]},{8:138,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,47],6:[2,47],8:139,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[2,47],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],101:[2,47],102:39,103:[2,47],105:[2,47],106:40,107:[1,67],108:41,109:[2,47],110:69,118:[1,42],123:37,124:[1,64],125:[2,47],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,48],6:[2,48],25:[2,48],26:[2,48],54:[2,48],77:[2,48],101:[2,48],103:[2,48],105:[2,48],109:[2,48],125:[2,48]},{1:[2,73],6:[2,73],25:[2,73],26:[2,73],40:[2,73],49:[2,73],54:[2,73],57:[2,73],66:[2,73],67:[2,73],68:[2,73],70:[2,73],72:[2,73],73:[2,73],77:[2,73],83:[2,73],84:[2,73],85:[2,73],90:[2,73],92:[2,73],101:[2,73],103:[2,73],104:[2,73],105:[2,73],109:[2,73],117:[2,73],125:[2,73],127:[2,73],128:[2,73],131:[2,73],132:[2,73],133:[2,73],134:[2,73],135:[2,73],136:[2,73]},{1:[2,74],6:[2,74],25:[2,74],26:[2,74],40:[2,74],49:[2,74],54:[2,74],57:[2,74],66:[2,74],67:[2,74],68:[2,74],70:[2,74],72:[2,74],73:[2,74],77:[2,74],83:[2,74],84:[2,74],85:[2,74],90:[2,74],92:[2,74],101:[2,74],103:[2,74],104:[2,74],105:[2,74],109:[2,74],117:[2,74],125:[2,74],127:[2,74],128:[2,74],131:[2,74],132:[2,74],133:[2,74],134:[2,74],135:[2,74],136:[2,74]},{1:[2,29],6:[2,29],25:[2,29],26:[2,29],49:[2,29],54:[2,29],57:[2,29],66:[2,29],67:[2,29],68:[2,29],70:[2,29],72:[2,29],73:[2,29],77:[2,29],83:[2,29],84:[2,29],85:[2,29],90:[2,29],92:[2,29],101:[2,29],103:[2,29],104:[2,29],105:[2,29],109:[2,29],117:[2,29],125:[2,29],127:[2,29],128:[2,29],131:[2,29],132:[2,29],133:[2,29],134:[2,29],135:[2,29],136:[2,29]},{1:[2,30],6:[2,30],25:[2,30],26:[2,30],49:[2,30],54:[2,30],57:[2,30],66:[2,30],67:[2,30],68:[2,30],70:[2,30],72:[2,30],73:[2,30],77:[2,30],83:[2,30],84:[2,30],85:[2,30],90:[2,30],92:[2,30],101:[2,30],103:[2,30],104:[2,30],105:[2,30],109:[2,30],117:[2,30],125:[2,30],127:[2,30],128:[2,30],131:[2,30],132:[2,30],133:[2,30],134:[2,30],135:[2,30],136:[2,30]},{1:[2,31],6:[2,31],25:[2,31],26:[2,31],49:[2,31],54:[2,31],57:[2,31],66:[2,31],67:[2,31],68:[2,31],70:[2,31],72:[2,31],73:[2,31],77:[2,31],83:[2,31],84:[2,31],85:[2,31],90:[2,31],92:[2,31],101:[2,31],103:[2,31],104:[2,31],105:[2,31],109:[2,31],117:[2,31],125:[2,31],127:[2,31],128:[2,31],131:[2,31],132:[2,31],133:[2,31],134:[2,31],135:[2,31],136:[2,31]},{1:[2,32],6:[2,32],25:[2,32],26:[2,32],49:[2,32],54:[2,32],57:[2,32],66:[2,32],67:[2,32],68:[2,32],70:[2,32],72:[2,32],73:[2,32],77:[2,32],83:[2,32],84:[2,32],85:[2,32],90:[2,32],92:[2,32],101:[2,32],103:[2,32],104:[2,32],105:[2,32],109:[2,32],117:[2,32],125:[2,32],127:[2,32],128:[2,32],131:[2,32],132:[2,32],133:[2,32],134:[2,32],135:[2,32],136:[2,32]},{1:[2,33],6:[2,33],25:[2,33],26:[2,33],49:[2,33],54:[2,33],57:[2,33],66:[2,33],67:[2,33],68:[2,33],70:[2,33],72:[2,33],73:[2,33],77:[2,33],83:[2,33],84:[2,33],85:[2,33],90:[2,33],92:[2,33],101:[2,33],103:[2,33],104:[2,33],105:[2,33],109:[2,33],117:[2,33],125:[2,33],127:[2,33],128:[2,33],131:[2,33],132:[2,33],133:[2,33],134:[2,33],135:[2,33],136:[2,33]},{1:[2,34],6:[2,34],25:[2,34],26:[2,34],49:[2,34],54:[2,34],57:[2,34],66:[2,34],67:[2,34],68:[2,34],70:[2,34],72:[2,34],73:[2,34],77:[2,34],83:[2,34],84:[2,34],85:[2,34],90:[2,34],92:[2,34],101:[2,34],103:[2,34],104:[2,34],105:[2,34],109:[2,34],117:[2,34],125:[2,34],127:[2,34],128:[2,34],131:[2,34],132:[2,34],133:[2,34],134:[2,34],135:[2,34],136:[2,34]},{1:[2,35],6:[2,35],25:[2,35],26:[2,35],49:[2,35],54:[2,35],57:[2,35],66:[2,35],67:[2,35],68:[2,35],70:[2,35],72:[2,35],73:[2,35],77:[2,35],83:[2,35],84:[2,35],85:[2,35],90:[2,35],92:[2,35],101:[2,35],103:[2,35],104:[2,35],105:[2,35],109:[2,35],117:[2,35],125:[2,35],127:[2,35],128:[2,35],131:[2,35],132:[2,35],133:[2,35],134:[2,35],135:[2,35],136:[2,35]},{4:140,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,141],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:142,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,146],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:147,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],86:144,87:[1,58],88:[1,59],89:[1,57],90:[1,143],93:145,95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,111],6:[2,111],25:[2,111],26:[2,111],49:[2,111],54:[2,111],57:[2,111],66:[2,111],67:[2,111],68:[2,111],70:[2,111],72:[2,111],73:[2,111],77:[2,111],83:[2,111],84:[2,111],85:[2,111],90:[2,111],92:[2,111],101:[2,111],103:[2,111],104:[2,111],105:[2,111],109:[2,111],117:[2,111],125:[2,111],127:[2,111],128:[2,111],131:[2,111],132:[2,111],133:[2,111],134:[2,111],135:[2,111],136:[2,111]},{1:[2,112],6:[2,112],25:[2,112],26:[2,112],27:148,28:[1,73],49:[2,112],54:[2,112],57:[2,112],66:[2,112],67:[2,112],68:[2,112],70:[2,112],72:[2,112],73:[2,112],77:[2,112],83:[2,112],84:[2,112],85:[2,112],90:[2,112],92:[2,112],101:[2,112],103:[2,112],104:[2,112],105:[2,112],109:[2,112],117:[2,112],125:[2,112],127:[2,112],128:[2,112],131:[2,112],132:[2,112],133:[2,112],134:[2,112],135:[2,112],136:[2,112]},{25:[2,51]},{25:[2,52]},{1:[2,68],6:[2,68],25:[2,68],26:[2,68],40:[2,68],49:[2,68],54:[2,68],57:[2,68],66:[2,68],67:[2,68],68:[2,68],70:[2,68],72:[2,68],73:[2,68],77:[2,68],79:[2,68],83:[2,68],84:[2,68],85:[2,68],90:[2,68],92:[2,68],101:[2,68],103:[2,68],104:[2,68],105:[2,68],109:[2,68],117:[2,68],125:[2,68],127:[2,68],128:[2,68],129:[2,68],130:[2,68],131:[2,68],132:[2,68],133:[2,68],134:[2,68],135:[2,68],136:[2,68],137:[2,68]},{1:[2,71],6:[2,71],25:[2,71],26:[2,71],40:[2,71],49:[2,71],54:[2,71],57:[2,71],66:[2,71],67:[2,71],68:[2,71],70:[2,71],72:[2,71],73:[2,71],77:[2,71],79:[2,71],83:[2,71],84:[2,71],85:[2,71],90:[2,71],92:[2,71],101:[2,71],103:[2,71],104:[2,71],105:[2,71],109:[2,71],117:[2,71],125:[2,71],127:[2,71],128:[2,71],129:[2,71],130:[2,71],131:[2,71],132:[2,71],133:[2,71],134:[2,71],135:[2,71],136:[2,71],137:[2,71]},{8:149,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:150,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:151,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{5:152,8:153,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,5],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{27:158,28:[1,73],44:159,58:160,59:161,64:154,75:[1,70],88:[1,113],89:[1,57],112:155,113:[1,156],114:157},{111:162,115:[1,163],116:[1,164]},{6:[2,90],11:168,25:[2,90],27:169,28:[1,73],29:170,30:[1,71],31:[1,72],41:166,42:167,44:171,46:[1,46],54:[2,90],76:165,77:[2,90],88:[1,113]},{1:[2,27],6:[2,27],25:[2,27],26:[2,27],43:[2,27],49:[2,27],54:[2,27],57:[2,27],66:[2,27],67:[2,27],68:[2,27],70:[2,27],72:[2,27],73:[2,27],77:[2,27],83:[2,27],84:[2,27],85:[2,27],90:[2,27],92:[2,27],101:[2,27],103:[2,27],104:[2,27],105:[2,27],109:[2,27],117:[2,27],125:[2,27],127:[2,27],128:[2,27],131:[2,27],132:[2,27],133:[2,27],134:[2,27],135:[2,27],136:[2,27]},{1:[2,28],6:[2,28],25:[2,28],26:[2,28],43:[2,28],49:[2,28],54:[2,28],57:[2,28],66:[2,28],67:[2,28],68:[2,28],70:[2,28],72:[2,28],73:[2,28],77:[2,28],83:[2,28],84:[2,28],85:[2,28],90:[2,28],92:[2,28],101:[2,28],103:[2,28],104:[2,28],105:[2,28],109:[2,28],117:[2,28],125:[2,28],127:[2,28],128:[2,28],131:[2,28],132:[2,28],133:[2,28],134:[2,28],135:[2,28],136:[2,28]},{1:[2,26],6:[2,26],25:[2,26],26:[2,26],40:[2,26],43:[2,26],49:[2,26],54:[2,26],57:[2,26],66:[2,26],67:[2,26],68:[2,26],70:[2,26],72:[2,26],73:[2,26],77:[2,26],79:[2,26],83:[2,26],84:[2,26],85:[2,26],90:[2,26],92:[2,26],101:[2,26],103:[2,26],104:[2,26],105:[2,26],109:[2,26],115:[2,26],116:[2,26],117:[2,26],125:[2,26],127:[2,26],128:[2,26],129:[2,26],130:[2,26],131:[2,26],132:[2,26],133:[2,26],134:[2,26],135:[2,26],136:[2,26],137:[2,26]},{1:[2,6],6:[2,6],7:172,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,26:[2,6],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],101:[2,6],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,3]},{1:[2,24],6:[2,24],25:[2,24],26:[2,24],49:[2,24],54:[2,24],57:[2,24],72:[2,24],77:[2,24],85:[2,24],90:[2,24],92:[2,24],97:[2,24],98:[2,24],101:[2,24],103:[2,24],104:[2,24],105:[2,24],109:[2,24],117:[2,24],120:[2,24],122:[2,24],125:[2,24],127:[2,24],128:[2,24],131:[2,24],132:[2,24],133:[2,24],134:[2,24],135:[2,24],136:[2,24]},{6:[1,74],26:[1,173]},{1:[2,191],6:[2,191],25:[2,191],26:[2,191],49:[2,191],54:[2,191],57:[2,191],72:[2,191],77:[2,191],85:[2,191],90:[2,191],92:[2,191],101:[2,191],103:[2,191],104:[2,191],105:[2,191],109:[2,191],117:[2,191],125:[2,191],127:[2,191],128:[2,191],131:[2,191],132:[2,191],133:[2,191],134:[2,191],135:[2,191],136:[2,191]},{8:174,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:175,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:176,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:177,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:178,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:179,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:180,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:181,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,146],6:[2,146],25:[2,146],26:[2,146],49:[2,146],54:[2,146],57:[2,146],72:[2,146],77:[2,146],85:[2,146],90:[2,146],92:[2,146],101:[2,146],103:[2,146],104:[2,146],105:[2,146],109:[2,146],117:[2,146],125:[2,146],127:[2,146],128:[2,146],131:[2,146],132:[2,146],133:[2,146],134:[2,146],135:[2,146],136:[2,146]},{1:[2,151],6:[2,151],25:[2,151],26:[2,151],49:[2,151],54:[2,151],57:[2,151],72:[2,151],77:[2,151],85:[2,151],90:[2,151],92:[2,151],101:[2,151],103:[2,151],104:[2,151],105:[2,151],109:[2,151],117:[2,151],125:[2,151],127:[2,151],128:[2,151],131:[2,151],132:[2,151],133:[2,151],134:[2,151],135:[2,151],136:[2,151]},{8:182,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,145],6:[2,145],25:[2,145],26:[2,145],49:[2,145],54:[2,145],57:[2,145],72:[2,145],77:[2,145],85:[2,145],90:[2,145],92:[2,145],101:[2,145],103:[2,145],104:[2,145],105:[2,145],109:[2,145],117:[2,145],125:[2,145],127:[2,145],128:[2,145],131:[2,145],132:[2,145],133:[2,145],134:[2,145],135:[2,145],136:[2,145]},{1:[2,150],6:[2,150],25:[2,150],26:[2,150],49:[2,150],54:[2,150],57:[2,150],72:[2,150],77:[2,150],85:[2,150],90:[2,150],92:[2,150],101:[2,150],103:[2,150],104:[2,150],105:[2,150],109:[2,150],117:[2,150],125:[2,150],127:[2,150],128:[2,150],131:[2,150],132:[2,150],133:[2,150],134:[2,150],135:[2,150],136:[2,150]},{81:183,84:[1,105]},{1:[2,69],6:[2,69],25:[2,69],26:[2,69],40:[2,69],49:[2,69],54:[2,69],57:[2,69],66:[2,69],67:[2,69],68:[2,69],70:[2,69],72:[2,69],73:[2,69],77:[2,69],79:[2,69],83:[2,69],84:[2,69],85:[2,69],90:[2,69],92:[2,69],101:[2,69],103:[2,69],104:[2,69],105:[2,69],109:[2,69],117:[2,69],125:[2,69],127:[2,69],128:[2,69],129:[2,69],130:[2,69],131:[2,69],132:[2,69],133:[2,69],134:[2,69],135:[2,69],136:[2,69],137:[2,69]},{84:[2,108]},{27:184,28:[1,73]},{27:185,28:[1,73]},{1:[2,83],6:[2,83],25:[2,83],26:[2,83],27:186,28:[1,73],40:[2,83],49:[2,83],54:[2,83],57:[2,83],66:[2,83],67:[2,83],68:[2,83],70:[2,83],72:[2,83],73:[2,83],77:[2,83],79:[2,83],83:[2,83],84:[2,83],85:[2,83],90:[2,83],92:[2,83],101:[2,83],103:[2,83],104:[2,83],105:[2,83],109:[2,83],117:[2,83],125:[2,83],127:[2,83],128:[2,83],129:[2,83],130:[2,83],131:[2,83],132:[2,83],133:[2,83],134:[2,83],135:[2,83],136:[2,83],137:[2,83]},{1:[2,84],6:[2,84],25:[2,84],26:[2,84],40:[2,84],49:[2,84],54:[2,84],57:[2,84],66:[2,84],67:[2,84],68:[2,84],70:[2,84],72:[2,84],73:[2,84],77:[2,84],79:[2,84],83:[2,84],84:[2,84],85:[2,84],90:[2,84],92:[2,84],101:[2,84],103:[2,84],104:[2,84],105:[2,84],109:[2,84],117:[2,84],125:[2,84],127:[2,84],128:[2,84],129:[2,84],130:[2,84],131:[2,84],132:[2,84],133:[2,84],134:[2,84],135:[2,84],136:[2,84],137:[2,84]},{8:188,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],57:[1,192],58:47,59:48,61:36,63:25,64:26,65:27,71:187,74:189,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],91:190,92:[1,191],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{69:193,70:[1,99],73:[1,100]},{81:194,84:[1,105]},{1:[2,70],6:[2,70],25:[2,70],26:[2,70],40:[2,70],49:[2,70],54:[2,70],57:[2,70],66:[2,70],67:[2,70],68:[2,70],70:[2,70],72:[2,70],73:[2,70],77:[2,70],79:[2,70],83:[2,70],84:[2,70],85:[2,70],90:[2,70],92:[2,70],101:[2,70],103:[2,70],104:[2,70],105:[2,70],109:[2,70],117:[2,70],125:[2,70],127:[2,70],128:[2,70],129:[2,70],130:[2,70],131:[2,70],132:[2,70],133:[2,70],134:[2,70],135:[2,70],136:[2,70],137:[2,70]},{6:[1,196],8:195,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,197],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,106],6:[2,106],25:[2,106],26:[2,106],49:[2,106],54:[2,106],57:[2,106],66:[2,106],67:[2,106],68:[2,106],70:[2,106],72:[2,106],73:[2,106],77:[2,106],83:[2,106],84:[2,106],85:[2,106],90:[2,106],92:[2,106],101:[2,106],103:[2,106],104:[2,106],105:[2,106],109:[2,106],117:[2,106],125:[2,106],127:[2,106],128:[2,106],131:[2,106],132:[2,106],133:[2,106],134:[2,106],135:[2,106],136:[2,106]},{8:200,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,146],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:147,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],85:[1,198],86:199,87:[1,58],88:[1,59],89:[1,57],93:145,95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{6:[2,53],25:[2,53],49:[1,201],53:203,54:[1,202]},{6:[2,56],25:[2,56],26:[2,56],49:[2,56],54:[2,56]},{6:[2,60],25:[2,60],26:[2,60],40:[1,205],49:[2,60],54:[2,60],57:[1,204]},{6:[2,63],25:[2,63],26:[2,63],40:[2,63],49:[2,63],54:[2,63],57:[2,63]},{6:[2,64],25:[2,64],26:[2,64],40:[2,64],49:[2,64],54:[2,64],57:[2,64]},{6:[2,65],25:[2,65],26:[2,65],40:[2,65],49:[2,65],54:[2,65],57:[2,65]},{6:[2,66],25:[2,66],26:[2,66],40:[2,66],49:[2,66],54:[2,66],57:[2,66]},{27:148,28:[1,73]},{8:200,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,146],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:147,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],86:144,87:[1,58],88:[1,59],89:[1,57],90:[1,143],93:145,95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,50],6:[2,50],25:[2,50],26:[2,50],49:[2,50],54:[2,50],57:[2,50],72:[2,50],77:[2,50],85:[2,50],90:[2,50],92:[2,50],101:[2,50],103:[2,50],104:[2,50],105:[2,50],109:[2,50],117:[2,50],125:[2,50],127:[2,50],128:[2,50],131:[2,50],132:[2,50],133:[2,50],134:[2,50],135:[2,50],136:[2,50]},{1:[2,184],6:[2,184],25:[2,184],26:[2,184],49:[2,184],54:[2,184],57:[2,184],72:[2,184],77:[2,184],85:[2,184],90:[2,184],92:[2,184],101:[2,184],102:87,103:[2,184],104:[2,184],105:[2,184],108:88,109:[2,184],110:69,117:[2,184],125:[2,184],127:[2,184],128:[2,184],131:[1,78],132:[2,184],133:[2,184],134:[2,184],135:[2,184],136:[2,184]},{102:90,103:[1,65],105:[1,66],108:91,109:[1,68],110:69,125:[1,89]},{1:[2,185],6:[2,185],25:[2,185],26:[2,185],49:[2,185],54:[2,185],57:[2,185],72:[2,185],77:[2,185],85:[2,185],90:[2,185],92:[2,185],101:[2,185],102:87,103:[2,185],104:[2,185],105:[2,185],108:88,109:[2,185],110:69,117:[2,185],125:[2,185],127:[2,185],128:[2,185],131:[1,78],132:[2,185],133:[2,185],134:[2,185],135:[2,185],136:[2,185]},{1:[2,186],6:[2,186],25:[2,186],26:[2,186],49:[2,186],54:[2,186],57:[2,186],72:[2,186],77:[2,186],85:[2,186],90:[2,186],92:[2,186],101:[2,186],102:87,103:[2,186],104:[2,186],105:[2,186],108:88,109:[2,186],110:69,117:[2,186],125:[2,186],127:[2,186],128:[2,186],131:[1,78],132:[2,186],133:[2,186],134:[2,186],135:[2,186],136:[2,186]},{1:[2,187],6:[2,187],25:[2,187],26:[2,187],49:[2,187],54:[2,187],57:[2,187],66:[2,72],67:[2,72],68:[2,72],70:[2,72],72:[2,187],73:[2,72],77:[2,187],83:[2,72],84:[2,72],85:[2,187],90:[2,187],92:[2,187],101:[2,187],103:[2,187],104:[2,187],105:[2,187],109:[2,187],117:[2,187],125:[2,187],127:[2,187],128:[2,187],131:[2,187],132:[2,187],133:[2,187],134:[2,187],135:[2,187],136:[2,187]},{62:93,66:[1,95],67:[1,96],68:[1,97],69:98,70:[1,99],73:[1,100],80:92,83:[1,94],84:[2,107]},{62:102,66:[1,95],67:[1,96],68:[1,97],69:98,70:[1,99],73:[1,100],80:101,83:[1,94],84:[2,107]},{66:[2,75],67:[2,75],68:[2,75],70:[2,75],73:[2,75],83:[2,75],84:[2,75]},{1:[2,188],6:[2,188],25:[2,188],26:[2,188],49:[2,188],54:[2,188],57:[2,188],66:[2,72],67:[2,72],68:[2,72],70:[2,72],72:[2,188],73:[2,72],77:[2,188],83:[2,72],84:[2,72],85:[2,188],90:[2,188],92:[2,188],101:[2,188],103:[2,188],104:[2,188],105:[2,188],109:[2,188],117:[2,188],125:[2,188],127:[2,188],128:[2,188],131:[2,188],132:[2,188],133:[2,188],134:[2,188],135:[2,188],136:[2,188]},{1:[2,189],6:[2,189],25:[2,189],26:[2,189],49:[2,189],54:[2,189],57:[2,189],72:[2,189],77:[2,189],85:[2,189],90:[2,189],92:[2,189],101:[2,189],103:[2,189],104:[2,189],105:[2,189],109:[2,189],117:[2,189],125:[2,189],127:[2,189],128:[2,189],131:[2,189],132:[2,189],133:[2,189],134:[2,189],135:[2,189],136:[2,189]},{1:[2,190],6:[2,190],25:[2,190],26:[2,190],49:[2,190],54:[2,190],57:[2,190],72:[2,190],77:[2,190],85:[2,190],90:[2,190],92:[2,190],101:[2,190],103:[2,190],104:[2,190],105:[2,190],109:[2,190],117:[2,190],125:[2,190],127:[2,190],128:[2,190],131:[2,190],132:[2,190],133:[2,190],134:[2,190],135:[2,190],136:[2,190]},{8:206,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,207],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:208,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{5:209,25:[1,5],124:[1,210]},{1:[2,132],6:[2,132],25:[2,132],26:[2,132],49:[2,132],54:[2,132],57:[2,132],72:[2,132],77:[2,132],85:[2,132],90:[2,132],92:[2,132],96:211,97:[1,212],98:[1,213],101:[2,132],103:[2,132],104:[2,132],105:[2,132],109:[2,132],117:[2,132],125:[2,132],127:[2,132],128:[2,132],131:[2,132],132:[2,132],133:[2,132],134:[2,132],135:[2,132],136:[2,132]},{1:[2,144],6:[2,144],25:[2,144],26:[2,144],49:[2,144],54:[2,144],57:[2,144],72:[2,144],77:[2,144],85:[2,144],90:[2,144],92:[2,144],101:[2,144],103:[2,144],104:[2,144],105:[2,144],109:[2,144],117:[2,144],125:[2,144],127:[2,144],128:[2,144],131:[2,144],132:[2,144],133:[2,144],134:[2,144],135:[2,144],136:[2,144]},{1:[2,152],6:[2,152],25:[2,152],26:[2,152],49:[2,152],54:[2,152],57:[2,152],72:[2,152],77:[2,152],85:[2,152],90:[2,152],92:[2,152],101:[2,152],103:[2,152],104:[2,152],105:[2,152],109:[2,152],117:[2,152],125:[2,152],127:[2,152],128:[2,152],131:[2,152],132:[2,152],133:[2,152],134:[2,152],135:[2,152],136:[2,152]},{25:[1,214],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{119:215,121:216,122:[1,217]},{1:[2,96],6:[2,96],25:[2,96],26:[2,96],49:[2,96],54:[2,96],57:[2,96],72:[2,96],77:[2,96],85:[2,96],90:[2,96],92:[2,96],101:[2,96],103:[2,96],104:[2,96],105:[2,96],109:[2,96],117:[2,96],125:[2,96],127:[2,96],128:[2,96],131:[2,96],132:[2,96],133:[2,96],134:[2,96],135:[2,96],136:[2,96]},{8:218,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,99],5:219,6:[2,99],25:[1,5],26:[2,99],49:[2,99],54:[2,99],57:[2,99],66:[2,72],67:[2,72],68:[2,72],70:[2,72],72:[2,99],73:[2,72],77:[2,99],79:[1,220],83:[2,72],84:[2,72],85:[2,99],90:[2,99],92:[2,99],101:[2,99],103:[2,99],104:[2,99],105:[2,99],109:[2,99],117:[2,99],125:[2,99],127:[2,99],128:[2,99],131:[2,99],132:[2,99],133:[2,99],134:[2,99],135:[2,99],136:[2,99]},{1:[2,137],6:[2,137],25:[2,137],26:[2,137],49:[2,137],54:[2,137],57:[2,137],72:[2,137],77:[2,137],85:[2,137],90:[2,137],92:[2,137],101:[2,137],102:87,103:[2,137],104:[2,137],105:[2,137],108:88,109:[2,137],110:69,117:[2,137],125:[2,137],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,46],6:[2,46],26:[2,46],101:[2,46],102:87,103:[2,46],105:[2,46],108:88,109:[2,46],110:69,125:[2,46],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{6:[1,74],101:[1,221]},{4:222,7:4,8:6,9:7,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{6:[2,128],25:[2,128],54:[2,128],57:[1,224],90:[2,128],91:223,92:[1,191],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,114],6:[2,114],25:[2,114],26:[2,114],40:[2,114],49:[2,114],54:[2,114],57:[2,114],66:[2,114],67:[2,114],68:[2,114],70:[2,114],72:[2,114],73:[2,114],77:[2,114],83:[2,114],84:[2,114],85:[2,114],90:[2,114],92:[2,114],101:[2,114],103:[2,114],104:[2,114],105:[2,114],109:[2,114],115:[2,114],116:[2,114],117:[2,114],125:[2,114],127:[2,114],128:[2,114],131:[2,114],132:[2,114],133:[2,114],134:[2,114],135:[2,114],136:[2,114]},{6:[2,53],25:[2,53],53:225,54:[1,226],90:[2,53]},{6:[2,123],25:[2,123],26:[2,123],54:[2,123],85:[2,123],90:[2,123]},{8:200,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,146],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:147,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],86:227,87:[1,58],88:[1,59],89:[1,57],93:145,95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{6:[2,129],25:[2,129],26:[2,129],54:[2,129],85:[2,129],90:[2,129]},{1:[2,113],6:[2,113],25:[2,113],26:[2,113],40:[2,113],43:[2,113],49:[2,113],54:[2,113],57:[2,113],66:[2,113],67:[2,113],68:[2,113],70:[2,113],72:[2,113],73:[2,113],77:[2,113],79:[2,113],83:[2,113],84:[2,113],85:[2,113],90:[2,113],92:[2,113],101:[2,113],103:[2,113],104:[2,113],105:[2,113],109:[2,113],115:[2,113],116:[2,113],117:[2,113],125:[2,113],127:[2,113],128:[2,113],129:[2,113],130:[2,113],131:[2,113],132:[2,113],133:[2,113],134:[2,113],135:[2,113],136:[2,113],137:[2,113]},{5:228,25:[1,5],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,140],6:[2,140],25:[2,140],26:[2,140],49:[2,140],54:[2,140],57:[2,140],72:[2,140],77:[2,140],85:[2,140],90:[2,140],92:[2,140],101:[2,140],102:87,103:[1,65],104:[1,229],105:[1,66],108:88,109:[1,68],110:69,117:[2,140],125:[2,140],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,142],6:[2,142],25:[2,142],26:[2,142],49:[2,142],54:[2,142],57:[2,142],72:[2,142],77:[2,142],85:[2,142],90:[2,142],92:[2,142],101:[2,142],102:87,103:[1,65],104:[1,230],105:[1,66],108:88,109:[1,68],110:69,117:[2,142],125:[2,142],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,148],6:[2,148],25:[2,148],26:[2,148],49:[2,148],54:[2,148],57:[2,148],72:[2,148],77:[2,148],85:[2,148],90:[2,148],92:[2,148],101:[2,148],103:[2,148],104:[2,148],105:[2,148],109:[2,148],117:[2,148],125:[2,148],127:[2,148],128:[2,148],131:[2,148],132:[2,148],133:[2,148],134:[2,148],135:[2,148],136:[2,148]},{1:[2,149],6:[2,149],25:[2,149],26:[2,149],49:[2,149],54:[2,149],57:[2,149],72:[2,149],77:[2,149],85:[2,149],90:[2,149],92:[2,149],101:[2,149],102:87,103:[1,65],104:[2,149],105:[1,66],108:88,109:[1,68],110:69,117:[2,149],125:[2,149],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,153],6:[2,153],25:[2,153],26:[2,153],49:[2,153],54:[2,153],57:[2,153],72:[2,153],77:[2,153],85:[2,153],90:[2,153],92:[2,153],101:[2,153],103:[2,153],104:[2,153],105:[2,153],109:[2,153],117:[2,153],125:[2,153],127:[2,153],128:[2,153],131:[2,153],132:[2,153],133:[2,153],134:[2,153],135:[2,153],136:[2,153]},{115:[2,155],116:[2,155]},{27:158,28:[1,73],44:159,58:160,59:161,75:[1,70],88:[1,113],89:[1,114],112:231,114:157},{54:[1,232],115:[2,161],116:[2,161]},{54:[2,157],115:[2,157],116:[2,157]},{54:[2,158],115:[2,158],116:[2,158]},{54:[2,159],115:[2,159],116:[2,159]},{54:[2,160],115:[2,160],116:[2,160]},{1:[2,154],6:[2,154],25:[2,154],26:[2,154],49:[2,154],54:[2,154],57:[2,154],72:[2,154],77:[2,154],85:[2,154],90:[2,154],92:[2,154],101:[2,154],103:[2,154],104:[2,154],105:[2,154],109:[2,154],117:[2,154],125:[2,154],127:[2,154],128:[2,154],131:[2,154],132:[2,154],133:[2,154],134:[2,154],135:[2,154],136:[2,154]},{8:233,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:234,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{6:[2,53],25:[2,53],53:235,54:[1,236],77:[2,53]},{6:[2,91],25:[2,91],26:[2,91],54:[2,91],77:[2,91]},{6:[2,39],25:[2,39],26:[2,39],43:[1,237],54:[2,39],77:[2,39]},{6:[2,42],25:[2,42],26:[2,42],54:[2,42],77:[2,42]},{6:[2,43],25:[2,43],26:[2,43],43:[2,43],54:[2,43],77:[2,43]},{6:[2,44],25:[2,44],26:[2,44],43:[2,44],54:[2,44],77:[2,44]},{6:[2,45],25:[2,45],26:[2,45],43:[2,45],54:[2,45],77:[2,45]},{1:[2,5],6:[2,5],26:[2,5],101:[2,5]},{1:[2,25],6:[2,25],25:[2,25],26:[2,25],49:[2,25],54:[2,25],57:[2,25],72:[2,25],77:[2,25],85:[2,25],90:[2,25],92:[2,25],97:[2,25],98:[2,25],101:[2,25],103:[2,25],104:[2,25],105:[2,25],109:[2,25],117:[2,25],120:[2,25],122:[2,25],125:[2,25],127:[2,25],128:[2,25],131:[2,25],132:[2,25],133:[2,25],134:[2,25],135:[2,25],136:[2,25]},{1:[2,192],6:[2,192],25:[2,192],26:[2,192],49:[2,192],54:[2,192],57:[2,192],72:[2,192],77:[2,192],85:[2,192],90:[2,192],92:[2,192],101:[2,192],102:87,103:[2,192],104:[2,192],105:[2,192],108:88,109:[2,192],110:69,117:[2,192],125:[2,192],127:[2,192],128:[2,192],131:[1,78],132:[1,81],133:[2,192],134:[2,192],135:[2,192],136:[2,192]},{1:[2,193],6:[2,193],25:[2,193],26:[2,193],49:[2,193],54:[2,193],57:[2,193],72:[2,193],77:[2,193],85:[2,193],90:[2,193],92:[2,193],101:[2,193],102:87,103:[2,193],104:[2,193],105:[2,193],108:88,109:[2,193],110:69,117:[2,193],125:[2,193],127:[2,193],128:[2,193],131:[1,78],132:[1,81],133:[2,193],134:[2,193],135:[2,193],136:[2,193]},{1:[2,194],6:[2,194],25:[2,194],26:[2,194],49:[2,194],54:[2,194],57:[2,194],72:[2,194],77:[2,194],85:[2,194],90:[2,194],92:[2,194],101:[2,194],102:87,103:[2,194],104:[2,194],105:[2,194],108:88,109:[2,194],110:69,117:[2,194],125:[2,194],127:[2,194],128:[2,194],131:[1,78],132:[2,194],133:[2,194],134:[2,194],135:[2,194],136:[2,194]},{1:[2,195],6:[2,195],25:[2,195],26:[2,195],49:[2,195],54:[2,195],57:[2,195],72:[2,195],77:[2,195],85:[2,195],90:[2,195],92:[2,195],101:[2,195],102:87,103:[2,195],104:[2,195],105:[2,195],108:88,109:[2,195],110:69,117:[2,195],125:[2,195],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[2,195],134:[2,195],135:[2,195],136:[2,195]},{1:[2,196],6:[2,196],25:[2,196],26:[2,196],49:[2,196],54:[2,196],57:[2,196],72:[2,196],77:[2,196],85:[2,196],90:[2,196],92:[2,196],101:[2,196],102:87,103:[2,196],104:[2,196],105:[2,196],108:88,109:[2,196],110:69,117:[2,196],125:[2,196],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[2,196],135:[2,196],136:[1,85]},{1:[2,197],6:[2,197],25:[2,197],26:[2,197],49:[2,197],54:[2,197],57:[2,197],72:[2,197],77:[2,197],85:[2,197],90:[2,197],92:[2,197],101:[2,197],102:87,103:[2,197],104:[2,197],105:[2,197],108:88,109:[2,197],110:69,117:[2,197],125:[2,197],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[2,197],136:[1,85]},{1:[2,198],6:[2,198],25:[2,198],26:[2,198],49:[2,198],54:[2,198],57:[2,198],72:[2,198],77:[2,198],85:[2,198],90:[2,198],92:[2,198],101:[2,198],102:87,103:[2,198],104:[2,198],105:[2,198],108:88,109:[2,198],110:69,117:[2,198],125:[2,198],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[2,198],135:[2,198],136:[2,198]},{1:[2,183],6:[2,183],25:[2,183],26:[2,183],49:[2,183],54:[2,183],57:[2,183],72:[2,183],77:[2,183],85:[2,183],90:[2,183],92:[2,183],101:[2,183],102:87,103:[1,65],104:[2,183],105:[1,66],108:88,109:[1,68],110:69,117:[2,183],125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,182],6:[2,182],25:[2,182],26:[2,182],49:[2,182],54:[2,182],57:[2,182],72:[2,182],77:[2,182],85:[2,182],90:[2,182],92:[2,182],101:[2,182],102:87,103:[1,65],104:[2,182],105:[1,66],108:88,109:[1,68],110:69,117:[2,182],125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,103],6:[2,103],25:[2,103],26:[2,103],49:[2,103],54:[2,103],57:[2,103],66:[2,103],67:[2,103],68:[2,103],70:[2,103],72:[2,103],73:[2,103],77:[2,103],83:[2,103],84:[2,103],85:[2,103],90:[2,103],92:[2,103],101:[2,103],103:[2,103],104:[2,103],105:[2,103],109:[2,103],117:[2,103],125:[2,103],127:[2,103],128:[2,103],131:[2,103],132:[2,103],133:[2,103],134:[2,103],135:[2,103],136:[2,103]},{1:[2,80],6:[2,80],25:[2,80],26:[2,80],40:[2,80],49:[2,80],54:[2,80],57:[2,80],66:[2,80],67:[2,80],68:[2,80],70:[2,80],72:[2,80],73:[2,80],77:[2,80],79:[2,80],83:[2,80],84:[2,80],85:[2,80],90:[2,80],92:[2,80],101:[2,80],103:[2,80],104:[2,80],105:[2,80],109:[2,80],117:[2,80],125:[2,80],127:[2,80],128:[2,80],129:[2,80],130:[2,80],131:[2,80],132:[2,80],133:[2,80],134:[2,80],135:[2,80],136:[2,80],137:[2,80]},{1:[2,81],6:[2,81],25:[2,81],26:[2,81],40:[2,81],49:[2,81],54:[2,81],57:[2,81],66:[2,81],67:[2,81],68:[2,81],70:[2,81],72:[2,81],73:[2,81],77:[2,81],79:[2,81],83:[2,81],84:[2,81],85:[2,81],90:[2,81],92:[2,81],101:[2,81],103:[2,81],104:[2,81],105:[2,81],109:[2,81],117:[2,81],125:[2,81],127:[2,81],128:[2,81],129:[2,81],130:[2,81],131:[2,81],132:[2,81],133:[2,81],134:[2,81],135:[2,81],136:[2,81],137:[2,81]},{1:[2,82],6:[2,82],25:[2,82],26:[2,82],40:[2,82],49:[2,82],54:[2,82],57:[2,82],66:[2,82],67:[2,82],68:[2,82],70:[2,82],72:[2,82],73:[2,82],77:[2,82],79:[2,82],83:[2,82],84:[2,82],85:[2,82],90:[2,82],92:[2,82],101:[2,82],103:[2,82],104:[2,82],105:[2,82],109:[2,82],117:[2,82],125:[2,82],127:[2,82],128:[2,82],129:[2,82],130:[2,82],131:[2,82],132:[2,82],133:[2,82],134:[2,82],135:[2,82],136:[2,82],137:[2,82]},{72:[1,238]},{57:[1,192],72:[2,87],91:239,92:[1,191],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{72:[2,88]},{8:240,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,72:[2,122],75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{12:[2,116],28:[2,116],30:[2,116],31:[2,116],33:[2,116],34:[2,116],35:[2,116],36:[2,116],37:[2,116],38:[2,116],45:[2,116],46:[2,116],47:[2,116],51:[2,116],52:[2,116],72:[2,116],75:[2,116],78:[2,116],82:[2,116],87:[2,116],88:[2,116],89:[2,116],95:[2,116],99:[2,116],100:[2,116],103:[2,116],105:[2,116],107:[2,116],109:[2,116],118:[2,116],124:[2,116],126:[2,116],127:[2,116],128:[2,116],129:[2,116],130:[2,116]},{12:[2,117],28:[2,117],30:[2,117],31:[2,117],33:[2,117],34:[2,117],35:[2,117],36:[2,117],37:[2,117],38:[2,117],45:[2,117],46:[2,117],47:[2,117],51:[2,117],52:[2,117],72:[2,117],75:[2,117],78:[2,117],82:[2,117],87:[2,117],88:[2,117],89:[2,117],95:[2,117],99:[2,117],100:[2,117],103:[2,117],105:[2,117],107:[2,117],109:[2,117],118:[2,117],124:[2,117],126:[2,117],127:[2,117],128:[2,117],129:[2,117],130:[2,117]},{1:[2,86],6:[2,86],25:[2,86],26:[2,86],40:[2,86],49:[2,86],54:[2,86],57:[2,86],66:[2,86],67:[2,86],68:[2,86],70:[2,86],72:[2,86],73:[2,86],77:[2,86],79:[2,86],83:[2,86],84:[2,86],85:[2,86],90:[2,86],92:[2,86],101:[2,86],103:[2,86],104:[2,86],105:[2,86],109:[2,86],117:[2,86],125:[2,86],127:[2,86],128:[2,86],129:[2,86],130:[2,86],131:[2,86],132:[2,86],133:[2,86],134:[2,86],135:[2,86],136:[2,86],137:[2,86]},{1:[2,104],6:[2,104],25:[2,104],26:[2,104],49:[2,104],54:[2,104],57:[2,104],66:[2,104],67:[2,104],68:[2,104],70:[2,104],72:[2,104],73:[2,104],77:[2,104],83:[2,104],84:[2,104],85:[2,104],90:[2,104],92:[2,104],101:[2,104],103:[2,104],104:[2,104],105:[2,104],109:[2,104],117:[2,104],125:[2,104],127:[2,104],128:[2,104],131:[2,104],132:[2,104],133:[2,104],134:[2,104],135:[2,104],136:[2,104]},{1:[2,36],6:[2,36],25:[2,36],26:[2,36],49:[2,36],54:[2,36],57:[2,36],72:[2,36],77:[2,36],85:[2,36],90:[2,36],92:[2,36],101:[2,36],102:87,103:[2,36],104:[2,36],105:[2,36],108:88,109:[2,36],110:69,117:[2,36],125:[2,36],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{8:241,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:242,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,109],6:[2,109],25:[2,109],26:[2,109],49:[2,109],54:[2,109],57:[2,109],66:[2,109],67:[2,109],68:[2,109],70:[2,109],72:[2,109],73:[2,109],77:[2,109],83:[2,109],84:[2,109],85:[2,109],90:[2,109],92:[2,109],101:[2,109],103:[2,109],104:[2,109],105:[2,109],109:[2,109],117:[2,109],125:[2,109],127:[2,109],128:[2,109],131:[2,109],132:[2,109],133:[2,109],134:[2,109],135:[2,109],136:[2,109]},{6:[2,53],25:[2,53],53:243,54:[1,226],85:[2,53]},{6:[2,128],25:[2,128],26:[2,128],54:[2,128],57:[1,244],85:[2,128],90:[2,128],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{50:245,51:[1,60],52:[1,61]},{6:[2,54],25:[2,54],26:[2,54],27:109,28:[1,73],44:110,55:246,56:108,58:111,59:112,75:[1,70],88:[1,113],89:[1,114]},{6:[1,247],25:[1,248]},{6:[2,61],25:[2,61],26:[2,61],49:[2,61],54:[2,61]},{8:249,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,199],6:[2,199],25:[2,199],26:[2,199],49:[2,199],54:[2,199],57:[2,199],72:[2,199],77:[2,199],85:[2,199],90:[2,199],92:[2,199],101:[2,199],102:87,103:[2,199],104:[2,199],105:[2,199],108:88,109:[2,199],110:69,117:[2,199],125:[2,199],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{8:250,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,201],6:[2,201],25:[2,201],26:[2,201],49:[2,201],54:[2,201],57:[2,201],72:[2,201],77:[2,201],85:[2,201],90:[2,201],92:[2,201],101:[2,201],102:87,103:[2,201],104:[2,201],105:[2,201],108:88,109:[2,201],110:69,117:[2,201],125:[2,201],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,181],6:[2,181],25:[2,181],26:[2,181],49:[2,181],54:[2,181],57:[2,181],72:[2,181],77:[2,181],85:[2,181],90:[2,181],92:[2,181],101:[2,181],103:[2,181],104:[2,181],105:[2,181],109:[2,181],117:[2,181],125:[2,181],127:[2,181],128:[2,181],131:[2,181],132:[2,181],133:[2,181],134:[2,181],135:[2,181],136:[2,181]},{8:251,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,133],6:[2,133],25:[2,133],26:[2,133],49:[2,133],54:[2,133],57:[2,133],72:[2,133],77:[2,133],85:[2,133],90:[2,133],92:[2,133],97:[1,252],101:[2,133],103:[2,133],104:[2,133],105:[2,133],109:[2,133],117:[2,133],125:[2,133],127:[2,133],128:[2,133],131:[2,133],132:[2,133],133:[2,133],134:[2,133],135:[2,133],136:[2,133]},{5:253,25:[1,5]},{27:254,28:[1,73]},{119:255,121:216,122:[1,217]},{26:[1,256],120:[1,257],121:258,122:[1,217]},{26:[2,174],120:[2,174],122:[2,174]},{8:260,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],94:259,95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,97],5:261,6:[2,97],25:[1,5],26:[2,97],49:[2,97],54:[2,97],57:[2,97],72:[2,97],77:[2,97],85:[2,97],90:[2,97],92:[2,97],101:[2,97],102:87,103:[1,65],104:[2,97],105:[1,66],108:88,109:[1,68],110:69,117:[2,97],125:[2,97],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,100],6:[2,100],25:[2,100],26:[2,100],49:[2,100],54:[2,100],57:[2,100],72:[2,100],77:[2,100],85:[2,100],90:[2,100],92:[2,100],101:[2,100],103:[2,100],104:[2,100],105:[2,100],109:[2,100],117:[2,100],125:[2,100],127:[2,100],128:[2,100],131:[2,100],132:[2,100],133:[2,100],134:[2,100],135:[2,100],136:[2,100]},{8:262,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,138],6:[2,138],25:[2,138],26:[2,138],49:[2,138],54:[2,138],57:[2,138],66:[2,138],67:[2,138],68:[2,138],70:[2,138],72:[2,138],73:[2,138],77:[2,138],83:[2,138],84:[2,138],85:[2,138],90:[2,138],92:[2,138],101:[2,138],103:[2,138],104:[2,138],105:[2,138],109:[2,138],117:[2,138],125:[2,138],127:[2,138],128:[2,138],131:[2,138],132:[2,138],133:[2,138],134:[2,138],135:[2,138],136:[2,138]},{6:[1,74],26:[1,263]},{8:264,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{6:[2,67],12:[2,117],25:[2,67],28:[2,117],30:[2,117],31:[2,117],33:[2,117],34:[2,117],35:[2,117],36:[2,117],37:[2,117],38:[2,117],45:[2,117],46:[2,117],47:[2,117],51:[2,117],52:[2,117],54:[2,67],75:[2,117],78:[2,117],82:[2,117],87:[2,117],88:[2,117],89:[2,117],90:[2,67],95:[2,117],99:[2,117],100:[2,117],103:[2,117],105:[2,117],107:[2,117],109:[2,117],118:[2,117],124:[2,117],126:[2,117],127:[2,117],128:[2,117],129:[2,117],130:[2,117]},{6:[1,266],25:[1,267],90:[1,265]},{6:[2,54],8:200,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[2,54],26:[2,54],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:147,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],85:[2,54],87:[1,58],88:[1,59],89:[1,57],90:[2,54],93:268,95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{6:[2,53],25:[2,53],26:[2,53],53:269,54:[1,226]},{1:[2,178],6:[2,178],25:[2,178],26:[2,178],49:[2,178],54:[2,178],57:[2,178],72:[2,178],77:[2,178],85:[2,178],90:[2,178],92:[2,178],101:[2,178],103:[2,178],104:[2,178],105:[2,178],109:[2,178],117:[2,178],120:[2,178],125:[2,178],127:[2,178],128:[2,178],131:[2,178],132:[2,178],133:[2,178],134:[2,178],135:[2,178],136:[2,178]},{8:270,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:271,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{115:[2,156],116:[2,156]},{27:158,28:[1,73],44:159,58:160,59:161,75:[1,70],88:[1,113],89:[1,114],114:272},{1:[2,163],6:[2,163],25:[2,163],26:[2,163],49:[2,163],54:[2,163],57:[2,163],72:[2,163],77:[2,163],85:[2,163],90:[2,163],92:[2,163],101:[2,163],102:87,103:[2,163],104:[1,273],105:[2,163],108:88,109:[2,163],110:69,117:[1,274],125:[2,163],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,164],6:[2,164],25:[2,164],26:[2,164],49:[2,164],54:[2,164],57:[2,164],72:[2,164],77:[2,164],85:[2,164],90:[2,164],92:[2,164],101:[2,164],102:87,103:[2,164],104:[1,275],105:[2,164],108:88,109:[2,164],110:69,117:[2,164],125:[2,164],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{6:[1,277],25:[1,278],77:[1,276]},{6:[2,54],11:168,25:[2,54],26:[2,54],27:169,28:[1,73],29:170,30:[1,71],31:[1,72],41:279,42:167,44:171,46:[1,46],77:[2,54],88:[1,113]},{8:280,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,281],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,85],6:[2,85],25:[2,85],26:[2,85],40:[2,85],49:[2,85],54:[2,85],57:[2,85],66:[2,85],67:[2,85],68:[2,85],70:[2,85],72:[2,85],73:[2,85],77:[2,85],79:[2,85],83:[2,85],84:[2,85],85:[2,85],90:[2,85],92:[2,85],101:[2,85],103:[2,85],104:[2,85],105:[2,85],109:[2,85],117:[2,85],125:[2,85],127:[2,85],128:[2,85],129:[2,85],130:[2,85],131:[2,85],132:[2,85],133:[2,85],134:[2,85],135:[2,85],136:[2,85],137:[2,85]},{8:282,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,72:[2,120],75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{72:[2,121],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,37],6:[2,37],25:[2,37],26:[2,37],49:[2,37],54:[2,37],57:[2,37],72:[2,37],77:[2,37],85:[2,37],90:[2,37],92:[2,37],101:[2,37],102:87,103:[2,37],104:[2,37],105:[2,37],108:88,109:[2,37],110:69,117:[2,37],125:[2,37],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{26:[1,283],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{6:[1,266],25:[1,267],85:[1,284]},{6:[2,67],25:[2,67],26:[2,67],54:[2,67],85:[2,67],90:[2,67]},{5:285,25:[1,5]},{6:[2,57],25:[2,57],26:[2,57],49:[2,57],54:[2,57]},{27:109,28:[1,73],44:110,55:286,56:108,58:111,59:112,75:[1,70],88:[1,113],89:[1,114]},{6:[2,55],25:[2,55],26:[2,55],27:109,28:[1,73],44:110,48:287,54:[2,55],55:107,56:108,58:111,59:112,75:[1,70],88:[1,113],89:[1,114]},{6:[2,62],25:[2,62],26:[2,62],49:[2,62],54:[2,62],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{26:[1,288],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{5:289,25:[1,5],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{5:290,25:[1,5]},{1:[2,134],6:[2,134],25:[2,134],26:[2,134],49:[2,134],54:[2,134],57:[2,134],72:[2,134],77:[2,134],85:[2,134],90:[2,134],92:[2,134],101:[2,134],103:[2,134],104:[2,134],105:[2,134],109:[2,134],117:[2,134],125:[2,134],127:[2,134],128:[2,134],131:[2,134],132:[2,134],133:[2,134],134:[2,134],135:[2,134],136:[2,134]},{5:291,25:[1,5]},{26:[1,292],120:[1,293],121:258,122:[1,217]},{1:[2,172],6:[2,172],25:[2,172],26:[2,172],49:[2,172],54:[2,172],57:[2,172],72:[2,172],77:[2,172],85:[2,172],90:[2,172],92:[2,172],101:[2,172],103:[2,172],104:[2,172],105:[2,172],109:[2,172],117:[2,172],125:[2,172],127:[2,172],128:[2,172],131:[2,172],132:[2,172],133:[2,172],134:[2,172],135:[2,172],136:[2,172]},{5:294,25:[1,5]},{26:[2,175],120:[2,175],122:[2,175]},{5:295,25:[1,5],54:[1,296]},{25:[2,130],54:[2,130],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,98],6:[2,98],25:[2,98],26:[2,98],49:[2,98],54:[2,98],57:[2,98],72:[2,98],77:[2,98],85:[2,98],90:[2,98],92:[2,98],101:[2,98],103:[2,98],104:[2,98],105:[2,98],109:[2,98],117:[2,98],125:[2,98],127:[2,98],128:[2,98],131:[2,98],132:[2,98],133:[2,98],134:[2,98],135:[2,98],136:[2,98]},{1:[2,101],5:297,6:[2,101],25:[1,5],26:[2,101],49:[2,101],54:[2,101],57:[2,101],72:[2,101],77:[2,101],85:[2,101],90:[2,101],92:[2,101],101:[2,101],102:87,103:[1,65],104:[2,101],105:[1,66],108:88,109:[1,68],110:69,117:[2,101],125:[2,101],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{101:[1,298]},{90:[1,299],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,115],6:[2,115],25:[2,115],26:[2,115],40:[2,115],49:[2,115],54:[2,115],57:[2,115],66:[2,115],67:[2,115],68:[2,115],70:[2,115],72:[2,115],73:[2,115],77:[2,115],83:[2,115],84:[2,115],85:[2,115],90:[2,115],92:[2,115],101:[2,115],103:[2,115],104:[2,115],105:[2,115],109:[2,115],115:[2,115],116:[2,115],117:[2,115],125:[2,115],127:[2,115],128:[2,115],131:[2,115],132:[2,115],133:[2,115],134:[2,115],135:[2,115],136:[2,115]},{8:200,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:147,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],93:300,95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:200,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,25:[1,146],27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,60:147,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],86:301,87:[1,58],88:[1,59],89:[1,57],93:145,95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{6:[2,124],25:[2,124],26:[2,124],54:[2,124],85:[2,124],90:[2,124]},{6:[1,266],25:[1,267],26:[1,302]},{1:[2,141],6:[2,141],25:[2,141],26:[2,141],49:[2,141],54:[2,141],57:[2,141],72:[2,141],77:[2,141],85:[2,141],90:[2,141],92:[2,141],101:[2,141],102:87,103:[1,65],104:[2,141],105:[1,66],108:88,109:[1,68],110:69,117:[2,141],125:[2,141],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,143],6:[2,143],25:[2,143],26:[2,143],49:[2,143],54:[2,143],57:[2,143],72:[2,143],77:[2,143],85:[2,143],90:[2,143],92:[2,143],101:[2,143],102:87,103:[1,65],104:[2,143],105:[1,66],108:88,109:[1,68],110:69,117:[2,143],125:[2,143],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{115:[2,162],116:[2,162]},{8:303,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:304,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:305,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,89],6:[2,89],25:[2,89],26:[2,89],40:[2,89],49:[2,89],54:[2,89],57:[2,89],66:[2,89],67:[2,89],68:[2,89],70:[2,89],72:[2,89],73:[2,89],77:[2,89],83:[2,89],84:[2,89],85:[2,89],90:[2,89],92:[2,89],101:[2,89],103:[2,89],104:[2,89],105:[2,89],109:[2,89],115:[2,89],116:[2,89],117:[2,89],125:[2,89],127:[2,89],128:[2,89],131:[2,89],132:[2,89],133:[2,89],134:[2,89],135:[2,89],136:[2,89]},{11:168,27:169,28:[1,73],29:170,30:[1,71],31:[1,72],41:306,42:167,44:171,46:[1,46],88:[1,113]},{6:[2,90],11:168,25:[2,90],26:[2,90],27:169,28:[1,73],29:170,30:[1,71],31:[1,72],41:166,42:167,44:171,46:[1,46],54:[2,90],76:307,88:[1,113]},{6:[2,92],25:[2,92],26:[2,92],54:[2,92],77:[2,92]},{6:[2,40],25:[2,40],26:[2,40],54:[2,40],77:[2,40],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{8:308,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{72:[2,119],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,38],6:[2,38],25:[2,38],26:[2,38],49:[2,38],54:[2,38],57:[2,38],72:[2,38],77:[2,38],85:[2,38],90:[2,38],92:[2,38],101:[2,38],103:[2,38],104:[2,38],105:[2,38],109:[2,38],117:[2,38],125:[2,38],127:[2,38],128:[2,38],131:[2,38],132:[2,38],133:[2,38],134:[2,38],135:[2,38],136:[2,38]},{1:[2,110],6:[2,110],25:[2,110],26:[2,110],49:[2,110],54:[2,110],57:[2,110],66:[2,110],67:[2,110],68:[2,110],70:[2,110],72:[2,110],73:[2,110],77:[2,110],83:[2,110],84:[2,110],85:[2,110],90:[2,110],92:[2,110],101:[2,110],103:[2,110],104:[2,110],105:[2,110],109:[2,110],117:[2,110],125:[2,110],127:[2,110],128:[2,110],131:[2,110],132:[2,110],133:[2,110],134:[2,110],135:[2,110],136:[2,110]},{1:[2,49],6:[2,49],25:[2,49],26:[2,49],49:[2,49],54:[2,49],57:[2,49],72:[2,49],77:[2,49],85:[2,49],90:[2,49],92:[2,49],101:[2,49],103:[2,49],104:[2,49],105:[2,49],109:[2,49],117:[2,49],125:[2,49],127:[2,49],128:[2,49],131:[2,49],132:[2,49],133:[2,49],134:[2,49],135:[2,49],136:[2,49]},{6:[2,58],25:[2,58],26:[2,58],49:[2,58],54:[2,58]},{6:[2,53],25:[2,53],26:[2,53],53:309,54:[1,202]},{1:[2,200],6:[2,200],25:[2,200],26:[2,200],49:[2,200],54:[2,200],57:[2,200],72:[2,200],77:[2,200],85:[2,200],90:[2,200],92:[2,200],101:[2,200],103:[2,200],104:[2,200],105:[2,200],109:[2,200],117:[2,200],125:[2,200],127:[2,200],128:[2,200],131:[2,200],132:[2,200],133:[2,200],134:[2,200],135:[2,200],136:[2,200]},{1:[2,179],6:[2,179],25:[2,179],26:[2,179],49:[2,179],54:[2,179],57:[2,179],72:[2,179],77:[2,179],85:[2,179],90:[2,179],92:[2,179],101:[2,179],103:[2,179],104:[2,179],105:[2,179],109:[2,179],117:[2,179],120:[2,179],125:[2,179],127:[2,179],128:[2,179],131:[2,179],132:[2,179],133:[2,179],134:[2,179],135:[2,179],136:[2,179]},{1:[2,135],6:[2,135],25:[2,135],26:[2,135],49:[2,135],54:[2,135],57:[2,135],72:[2,135],77:[2,135],85:[2,135],90:[2,135],92:[2,135],101:[2,135],103:[2,135],104:[2,135],105:[2,135],109:[2,135],117:[2,135],125:[2,135],127:[2,135],128:[2,135],131:[2,135],132:[2,135],133:[2,135],134:[2,135],135:[2,135],136:[2,135]},{1:[2,136],6:[2,136],25:[2,136],26:[2,136],49:[2,136],54:[2,136],57:[2,136],72:[2,136],77:[2,136],85:[2,136],90:[2,136],92:[2,136],97:[2,136],101:[2,136],103:[2,136],104:[2,136],105:[2,136],109:[2,136],117:[2,136],125:[2,136],127:[2,136],128:[2,136],131:[2,136],132:[2,136],133:[2,136],134:[2,136],135:[2,136],136:[2,136]},{1:[2,170],6:[2,170],25:[2,170],26:[2,170],49:[2,170],54:[2,170],57:[2,170],72:[2,170],77:[2,170],85:[2,170],90:[2,170],92:[2,170],101:[2,170],103:[2,170],104:[2,170],105:[2,170],109:[2,170],117:[2,170],125:[2,170],127:[2,170],128:[2,170],131:[2,170],132:[2,170],133:[2,170],134:[2,170],135:[2,170],136:[2,170]},{5:310,25:[1,5]},{26:[1,311]},{6:[1,312],26:[2,176],120:[2,176],122:[2,176]},{8:313,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{1:[2,102],6:[2,102],25:[2,102],26:[2,102],49:[2,102],54:[2,102],57:[2,102],72:[2,102],77:[2,102],85:[2,102],90:[2,102],92:[2,102],101:[2,102],103:[2,102],104:[2,102],105:[2,102],109:[2,102],117:[2,102],125:[2,102],127:[2,102],128:[2,102],131:[2,102],132:[2,102],133:[2,102],134:[2,102],135:[2,102],136:[2,102]},{1:[2,139],6:[2,139],25:[2,139],26:[2,139],49:[2,139],54:[2,139],57:[2,139],66:[2,139],67:[2,139],68:[2,139],70:[2,139],72:[2,139],73:[2,139],77:[2,139],83:[2,139],84:[2,139],85:[2,139],90:[2,139],92:[2,139],101:[2,139],103:[2,139],104:[2,139],105:[2,139],109:[2,139],117:[2,139],125:[2,139],127:[2,139],128:[2,139],131:[2,139],132:[2,139],133:[2,139],134:[2,139],135:[2,139],136:[2,139]},{1:[2,118],6:[2,118],25:[2,118],26:[2,118],49:[2,118],54:[2,118],57:[2,118],66:[2,118],67:[2,118],68:[2,118],70:[2,118],72:[2,118],73:[2,118],77:[2,118],83:[2,118],84:[2,118],85:[2,118],90:[2,118],92:[2,118],101:[2,118],103:[2,118],104:[2,118],105:[2,118],109:[2,118],117:[2,118],125:[2,118],127:[2,118],128:[2,118],131:[2,118],132:[2,118],133:[2,118],134:[2,118],135:[2,118],136:[2,118]},{6:[2,125],25:[2,125],26:[2,125],54:[2,125],85:[2,125],90:[2,125]},{6:[2,53],25:[2,53],26:[2,53],53:314,54:[1,226]},{6:[2,126],25:[2,126],26:[2,126],54:[2,126],85:[2,126],90:[2,126]},{1:[2,165],6:[2,165],25:[2,165],26:[2,165],49:[2,165],54:[2,165],57:[2,165],72:[2,165],77:[2,165],85:[2,165],90:[2,165],92:[2,165],101:[2,165],102:87,103:[2,165],104:[2,165],105:[2,165],108:88,109:[2,165],110:69,117:[1,315],125:[2,165],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,167],6:[2,167],25:[2,167],26:[2,167],49:[2,167],54:[2,167],57:[2,167],72:[2,167],77:[2,167],85:[2,167],90:[2,167],92:[2,167],101:[2,167],102:87,103:[2,167],104:[1,316],105:[2,167],108:88,109:[2,167],110:69,117:[2,167],125:[2,167],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,166],6:[2,166],25:[2,166],26:[2,166],49:[2,166],54:[2,166],57:[2,166],72:[2,166],77:[2,166],85:[2,166],90:[2,166],92:[2,166],101:[2,166],102:87,103:[2,166],104:[2,166],105:[2,166],108:88,109:[2,166],110:69,117:[2,166],125:[2,166],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{6:[2,93],25:[2,93],26:[2,93],54:[2,93],77:[2,93]},{6:[2,53],25:[2,53],26:[2,53],53:317,54:[1,236]},{26:[1,318],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{6:[1,247],25:[1,248],26:[1,319]},{26:[1,320]},{1:[2,173],6:[2,173],25:[2,173],26:[2,173],49:[2,173],54:[2,173],57:[2,173],72:[2,173],77:[2,173],85:[2,173],90:[2,173],92:[2,173],101:[2,173],103:[2,173],104:[2,173],105:[2,173],109:[2,173],117:[2,173],125:[2,173],127:[2,173],128:[2,173],131:[2,173],132:[2,173],133:[2,173],134:[2,173],135:[2,173],136:[2,173]},{26:[2,177],120:[2,177],122:[2,177]},{25:[2,131],54:[2,131],102:87,103:[1,65],105:[1,66],108:88,109:[1,68],110:69,125:[1,86],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{6:[1,266],25:[1,267],26:[1,321]},{8:322,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{8:323,9:117,10:20,11:21,12:[1,22],13:8,14:9,15:10,16:11,17:12,18:13,19:14,20:15,21:16,22:17,23:18,24:19,27:62,28:[1,73],29:49,30:[1,71],31:[1,72],32:24,33:[1,50],34:[1,51],35:[1,52],36:[1,53],37:[1,54],38:[1,55],39:23,44:63,45:[1,45],46:[1,46],47:[1,29],50:30,51:[1,60],52:[1,61],58:47,59:48,61:36,63:25,64:26,65:27,75:[1,70],78:[1,43],82:[1,28],87:[1,58],88:[1,59],89:[1,57],95:[1,38],99:[1,44],100:[1,56],102:39,103:[1,65],105:[1,66],106:40,107:[1,67],108:41,109:[1,68],110:69,118:[1,42],123:37,124:[1,64],126:[1,31],127:[1,32],128:[1,33],129:[1,34],130:[1,35]},{6:[1,277],25:[1,278],26:[1,324]},{6:[2,41],25:[2,41],26:[2,41],54:[2,41],77:[2,41]},{6:[2,59],25:[2,59],26:[2,59],49:[2,59],54:[2,59]},{1:[2,171],6:[2,171],25:[2,171],26:[2,171],49:[2,171],54:[2,171],57:[2,171],72:[2,171],77:[2,171],85:[2,171],90:[2,171],92:[2,171],101:[2,171],103:[2,171],104:[2,171],105:[2,171],109:[2,171],117:[2,171],125:[2,171],127:[2,171],128:[2,171],131:[2,171],132:[2,171],133:[2,171],134:[2,171],135:[2,171],136:[2,171]},{6:[2,127],25:[2,127],26:[2,127],54:[2,127],85:[2,127],90:[2,127]},{1:[2,168],6:[2,168],25:[2,168],26:[2,168],49:[2,168],54:[2,168],57:[2,168],72:[2,168],77:[2,168],85:[2,168],90:[2,168],92:[2,168],101:[2,168],102:87,103:[2,168],104:[2,168],105:[2,168],108:88,109:[2,168],110:69,117:[2,168],125:[2,168],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{1:[2,169],6:[2,169],25:[2,169],26:[2,169],49:[2,169],54:[2,169],57:[2,169],72:[2,169],77:[2,169],85:[2,169],90:[2,169],92:[2,169],101:[2,169],102:87,103:[2,169],104:[2,169],105:[2,169],108:88,109:[2,169],110:69,117:[2,169],125:[2,169],127:[1,80],128:[1,79],131:[1,78],132:[1,81],133:[1,82],134:[1,83],135:[1,84],136:[1,85]},{6:[2,94],25:[2,94],26:[2,94],54:[2,94],77:[2,94]}], -defaultActions: {60:[2,51],61:[2,52],75:[2,3],94:[2,108],189:[2,88]}, -parseError: function parseError(str, hash) { - throw new Error(str); -}, -parse: function parse(input) { - var self = this, - stack = [0], - vstack = [null], // semantic value stack - lstack = [], // location stack - table = this.table, - yytext = '', - yylineno = 0, - yyleng = 0, - recovering = 0, - TERROR = 2, - EOF = 1; - - //this.reductionCount = this.shiftCount = 0; - - this.lexer.setInput(input); - this.lexer.yy = this.yy; - this.yy.lexer = this.lexer; - if (typeof this.lexer.yylloc == 'undefined') - this.lexer.yylloc = {}; - var yyloc = this.lexer.yylloc; - lstack.push(yyloc); - - if (typeof this.yy.parseError === 'function') - this.parseError = this.yy.parseError; - - function popStack (n) { - stack.length = stack.length - 2*n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - - function lex() { - var token; - token = self.lexer.lex() || 1; // $end = 1 - // if token isn't its numeric value, convert - if (typeof token !== 'number') { - token = self.symbols_[token] || token; - } - return token; - } - - var symbol, preErrorSymbol, state, action, a, r, yyval={},p,len,newState, expected; - while (true) { - // retreive state number from top of stack - state = stack[stack.length-1]; - - // use default actions if available - if (this.defaultActions[state]) { - action = this.defaultActions[state]; - } else { - if (symbol == null) - symbol = lex(); - // read action for current state and first input - action = table[state] && table[state][symbol]; - } - - // handle parse error - _handle_error: - if (typeof action === 'undefined' || !action.length || !action[0]) { - - if (!recovering) { - // Report error - expected = []; - for (p in table[state]) if (this.terminals_[p] && p > 2) { - expected.push("'"+this.terminals_[p]+"'"); - } - var errStr = ''; - if (this.lexer.showPosition) { - errStr = 'Parse error on line '+(yylineno+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+expected.join(', ') + ", got '" + this.terminals_[symbol]+ "'"; - } else { - errStr = 'Parse error on line '+(yylineno+1)+": Unexpected " + - (symbol == 1 /*EOF*/ ? "end of input" : - ("'"+(this.terminals_[symbol] || symbol)+"'")); - } - this.parseError(errStr, - {text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected}); - } - - // just recovered from another error - if (recovering == 3) { - if (symbol == EOF) { - throw new Error(errStr || 'Parsing halted.'); - } - - // discard current lookahead and grab another - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - symbol = lex(); - } - - // try to recover from error - while (1) { - // check for error recovery rule in this state - if ((TERROR.toString()) in table[state]) { - break; - } - if (state == 0) { - throw new Error(errStr || 'Parsing halted.'); - } - popStack(1); - state = stack[stack.length-1]; - } - - preErrorSymbol = symbol; // save the lookahead token - symbol = TERROR; // insert generic error symbol as new lookahead - state = stack[stack.length-1]; - action = table[state] && table[state][TERROR]; - recovering = 3; // allow 3 real symbols to be shifted before reporting a new error - } - - // this shouldn't happen, unless resolve defaults are off - if (action[0] instanceof Array && action.length > 1) { - throw new Error('Parse Error: multiple actions possible at state: '+state+', token: '+symbol); - } - - switch (action[0]) { - - case 1: // shift - //this.shiftCount++; - - stack.push(symbol); - vstack.push(this.lexer.yytext); - lstack.push(this.lexer.yylloc); - stack.push(action[1]); // push state - symbol = null; - if (!preErrorSymbol) { // normal execution/no error - yyleng = this.lexer.yyleng; - yytext = this.lexer.yytext; - yylineno = this.lexer.yylineno; - yyloc = this.lexer.yylloc; - if (recovering > 0) - recovering--; - } else { // error just occurred, resume old lookahead f/ before error - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - - case 2: // reduce - //this.reductionCount++; - - len = this.productions_[action[1]][1]; - - // perform semantic action - yyval.$ = vstack[vstack.length-len]; // default to $$ = $1 - // default location, uses first token for firsts, last for lasts - yyval._$ = { - first_line: lstack[lstack.length-(len||1)].first_line, - last_line: lstack[lstack.length-1].last_line, - first_column: lstack[lstack.length-(len||1)].first_column, - last_column: lstack[lstack.length-1].last_column - }; - r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack); - - if (typeof r !== 'undefined') { - return r; - } - - // pop off stack - if (len) { - stack = stack.slice(0,-1*len*2); - vstack = vstack.slice(0, -1*len); - lstack = lstack.slice(0, -1*len); - } - - stack.push(this.productions_[action[1]][0]); // push nonterminal (reduce) - vstack.push(yyval.$); - lstack.push(yyval._$); - // goto new state = table[STATE][NONTERMINAL] - newState = table[stack[stack.length-2]][stack[stack.length-1]]; - stack.push(newState); - break; - - case 3: // accept - return true; - } - - } - - return true; -}}; -undefined -return parser; -})(); -if (typeof require !== 'undefined' && typeof exports !== 'undefined') { -exports.parser = parser; -exports.parse = function () { return parser.parse.apply(parser, arguments); } -exports.main = function commonjsMain(args) { - if (!args[1]) - throw new Error('Usage: '+args[0]+' FILE'); - if (typeof process !== 'undefined') { - var source = require('fs').readFileSync(require('path').join(process.cwd(), args[1]), "utf8"); - } else { - var cwd = require("file").path(require("file").cwd()); - var source = cwd.join(args[1]).read({charset: "utf-8"}); - } - return exports.parser.parse(source); -} -if (typeof module !== 'undefined' && require.main === module) { - exports.main(typeof process !== 'undefined' ? process.argv.slice(1) : require("system").args); -} -} \ No newline at end of file diff --git a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/repl.js b/node_modules/jade/node_modules/coffee-script/lib/coffee-script/repl.js deleted file mode 100644 index 578dc59..0000000 --- a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/repl.js +++ /dev/null @@ -1,276 +0,0 @@ -// Generated by CoffeeScript 1.4.0 -(function() { - var ACCESSOR, CoffeeScript, Module, REPL_PROMPT, REPL_PROMPT_CONTINUATION, REPL_PROMPT_MULTILINE, SIMPLEVAR, Script, autocomplete, backlog, completeAttribute, completeVariable, enableColours, error, getCompletions, inspect, multilineMode, pipedInput, readline, repl, run, stdin, stdout, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; - - stdin = process.openStdin(); - - stdout = process.stdout; - - CoffeeScript = require('./coffee-script'); - - readline = require('readline'); - - inspect = require('util').inspect; - - Script = require('vm').Script; - - Module = require('module'); - - REPL_PROMPT = 'coffee> '; - - REPL_PROMPT_MULTILINE = '------> '; - - REPL_PROMPT_CONTINUATION = '......> '; - - enableColours = false; - - if (process.platform !== 'win32') { - enableColours = !process.env.NODE_DISABLE_COLORS; - } - - error = function(err) { - return stdout.write((err.stack || err.toString()) + '\n'); - }; - - ACCESSOR = /\s*([\w\.]+)(?:\.(\w*))$/; - - SIMPLEVAR = /(\w+)$/i; - - autocomplete = function(text) { - return completeAttribute(text) || completeVariable(text) || [[], text]; - }; - - completeAttribute = function(text) { - var all, candidates, completions, key, match, obj, prefix, _i, _len, _ref; - if (match = text.match(ACCESSOR)) { - all = match[0], obj = match[1], prefix = match[2]; - try { - obj = Script.runInThisContext(obj); - } catch (e) { - return; - } - if (obj == null) { - return; - } - obj = Object(obj); - candidates = Object.getOwnPropertyNames(obj); - while (obj = Object.getPrototypeOf(obj)) { - _ref = Object.getOwnPropertyNames(obj); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - key = _ref[_i]; - if (__indexOf.call(candidates, key) < 0) { - candidates.push(key); - } - } - } - completions = getCompletions(prefix, candidates); - return [completions, prefix]; - } - }; - - completeVariable = function(text) { - var candidates, completions, free, key, keywords, r, vars, _i, _len, _ref; - free = (_ref = text.match(SIMPLEVAR)) != null ? _ref[1] : void 0; - if (text === "") { - free = ""; - } - if (free != null) { - vars = Script.runInThisContext('Object.getOwnPropertyNames(Object(this))'); - keywords = (function() { - var _i, _len, _ref1, _results; - _ref1 = CoffeeScript.RESERVED; - _results = []; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - r = _ref1[_i]; - if (r.slice(0, 2) !== '__') { - _results.push(r); - } - } - return _results; - })(); - candidates = vars; - for (_i = 0, _len = keywords.length; _i < _len; _i++) { - key = keywords[_i]; - if (__indexOf.call(candidates, key) < 0) { - candidates.push(key); - } - } - completions = getCompletions(free, candidates); - return [completions, free]; - } - }; - - getCompletions = function(prefix, candidates) { - var el, _i, _len, _results; - _results = []; - for (_i = 0, _len = candidates.length; _i < _len; _i++) { - el = candidates[_i]; - if (0 === el.indexOf(prefix)) { - _results.push(el); - } - } - return _results; - }; - - process.on('uncaughtException', error); - - backlog = ''; - - run = function(buffer) { - var code, returnValue, _; - buffer = buffer.replace(/(^|[\r\n]+)(\s*)##?(?:[^#\r\n][^\r\n]*|)($|[\r\n])/, "$1$2$3"); - buffer = buffer.replace(/[\r\n]+$/, ""); - if (multilineMode) { - backlog += "" + buffer + "\n"; - repl.setPrompt(REPL_PROMPT_CONTINUATION); - repl.prompt(); - return; - } - if (!buffer.toString().trim() && !backlog) { - repl.prompt(); - return; - } - code = backlog += buffer; - if (code[code.length - 1] === '\\') { - backlog = "" + backlog.slice(0, -1) + "\n"; - repl.setPrompt(REPL_PROMPT_CONTINUATION); - repl.prompt(); - return; - } - repl.setPrompt(REPL_PROMPT); - backlog = ''; - try { - _ = global._; - returnValue = CoffeeScript["eval"]("_=(" + code + "\n)", { - filename: 'repl', - modulename: 'repl' - }); - if (returnValue === void 0) { - global._ = _; - } - repl.output.write("" + (inspect(returnValue, false, 2, enableColours)) + "\n"); - } catch (err) { - error(err); - } - return repl.prompt(); - }; - - if (stdin.readable && stdin.isRaw) { - pipedInput = ''; - repl = { - prompt: function() { - return stdout.write(this._prompt); - }, - setPrompt: function(p) { - return this._prompt = p; - }, - input: stdin, - output: stdout, - on: function() {} - }; - stdin.on('data', function(chunk) { - var line, lines, _i, _len, _ref; - pipedInput += chunk; - if (!/\n/.test(pipedInput)) { - return; - } - lines = pipedInput.split("\n"); - pipedInput = lines[lines.length - 1]; - _ref = lines.slice(0, -1); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - line = _ref[_i]; - if (!(line)) { - continue; - } - stdout.write("" + line + "\n"); - run(line); - } - }); - stdin.on('end', function() { - var line, _i, _len, _ref; - _ref = pipedInput.trim().split("\n"); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - line = _ref[_i]; - if (!(line)) { - continue; - } - stdout.write("" + line + "\n"); - run(line); - } - stdout.write('\n'); - return process.exit(0); - }); - } else { - if (readline.createInterface.length < 3) { - repl = readline.createInterface(stdin, autocomplete); - stdin.on('data', function(buffer) { - return repl.write(buffer); - }); - } else { - repl = readline.createInterface(stdin, stdout, autocomplete); - } - } - - multilineMode = false; - - repl.input.on('keypress', function(char, key) { - var cursorPos, newPrompt; - if (!(key && key.ctrl && !key.meta && !key.shift && key.name === 'v')) { - return; - } - cursorPos = repl.cursor; - repl.output.cursorTo(0); - repl.output.clearLine(1); - multilineMode = !multilineMode; - if (!multilineMode && backlog) { - repl._line(); - } - backlog = ''; - repl.setPrompt((newPrompt = multilineMode ? REPL_PROMPT_MULTILINE : REPL_PROMPT)); - repl.prompt(); - return repl.output.cursorTo(newPrompt.length + (repl.cursor = cursorPos)); - }); - - repl.input.on('keypress', function(char, key) { - if (!(multilineMode && repl.line)) { - return; - } - if (!(key && key.ctrl && !key.meta && !key.shift && key.name === 'd')) { - return; - } - multilineMode = false; - return repl._line(); - }); - - repl.on('attemptClose', function() { - if (multilineMode) { - multilineMode = false; - repl.output.cursorTo(0); - repl.output.clearLine(1); - repl._onLine(repl.line); - return; - } - if (backlog || repl.line) { - backlog = ''; - repl.historyIndex = -1; - repl.setPrompt(REPL_PROMPT); - repl.output.write('\n(^C again to quit)'); - return repl._line((repl.line = '')); - } else { - return repl.close(); - } - }); - - repl.on('close', function() { - repl.output.write('\n'); - return repl.input.destroy(); - }); - - repl.on('line', run); - - repl.setPrompt(REPL_PROMPT); - - repl.prompt(); - -}).call(this); diff --git a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/rewriter.js b/node_modules/jade/node_modules/coffee-script/lib/coffee-script/rewriter.js deleted file mode 100644 index fdfeffc..0000000 --- a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/rewriter.js +++ /dev/null @@ -1,349 +0,0 @@ -// Generated by CoffeeScript 1.4.0 -(function() { - var BALANCED_PAIRS, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_BLOCK, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, IMPLICIT_UNSPACED_CALL, INVERSES, LINEBREAKS, SINGLE_CLOSERS, SINGLE_LINERS, left, rite, _i, _len, _ref, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, - __slice = [].slice; - - exports.Rewriter = (function() { - - function Rewriter() {} - - Rewriter.prototype.rewrite = function(tokens) { - this.tokens = tokens; - this.removeLeadingNewlines(); - this.removeMidExpressionNewlines(); - this.closeOpenCalls(); - this.closeOpenIndexes(); - this.addImplicitIndentation(); - this.tagPostfixConditionals(); - this.addImplicitBraces(); - this.addImplicitParentheses(); - return this.tokens; - }; - - Rewriter.prototype.scanTokens = function(block) { - var i, token, tokens; - tokens = this.tokens; - i = 0; - while (token = tokens[i]) { - i += block.call(this, token, i, tokens); - } - return true; - }; - - Rewriter.prototype.detectEnd = function(i, condition, action) { - var levels, token, tokens, _ref, _ref1; - tokens = this.tokens; - levels = 0; - while (token = tokens[i]) { - if (levels === 0 && condition.call(this, token, i)) { - return action.call(this, token, i); - } - if (!token || levels < 0) { - return action.call(this, token, i - 1); - } - if (_ref = token[0], __indexOf.call(EXPRESSION_START, _ref) >= 0) { - levels += 1; - } else if (_ref1 = token[0], __indexOf.call(EXPRESSION_END, _ref1) >= 0) { - levels -= 1; - } - i += 1; - } - return i - 1; - }; - - Rewriter.prototype.removeLeadingNewlines = function() { - var i, tag, _i, _len, _ref; - _ref = this.tokens; - for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { - tag = _ref[i][0]; - if (tag !== 'TERMINATOR') { - break; - } - } - if (i) { - return this.tokens.splice(0, i); - } - }; - - Rewriter.prototype.removeMidExpressionNewlines = function() { - return this.scanTokens(function(token, i, tokens) { - var _ref; - if (!(token[0] === 'TERMINATOR' && (_ref = this.tag(i + 1), __indexOf.call(EXPRESSION_CLOSE, _ref) >= 0))) { - return 1; - } - tokens.splice(i, 1); - return 0; - }); - }; - - Rewriter.prototype.closeOpenCalls = function() { - var action, condition; - condition = function(token, i) { - var _ref; - return ((_ref = token[0]) === ')' || _ref === 'CALL_END') || token[0] === 'OUTDENT' && this.tag(i - 1) === ')'; - }; - action = function(token, i) { - return this.tokens[token[0] === 'OUTDENT' ? i - 1 : i][0] = 'CALL_END'; - }; - return this.scanTokens(function(token, i) { - if (token[0] === 'CALL_START') { - this.detectEnd(i + 1, condition, action); - } - return 1; - }); - }; - - Rewriter.prototype.closeOpenIndexes = function() { - var action, condition; - condition = function(token, i) { - var _ref; - return (_ref = token[0]) === ']' || _ref === 'INDEX_END'; - }; - action = function(token, i) { - return token[0] = 'INDEX_END'; - }; - return this.scanTokens(function(token, i) { - if (token[0] === 'INDEX_START') { - this.detectEnd(i + 1, condition, action); - } - return 1; - }); - }; - - Rewriter.prototype.addImplicitBraces = function() { - var action, condition, sameLine, stack, start, startIndent, startIndex, startsLine; - stack = []; - start = null; - startsLine = null; - sameLine = true; - startIndent = 0; - startIndex = 0; - condition = function(token, i) { - var one, tag, three, two, _ref, _ref1; - _ref = this.tokens.slice(i + 1, +(i + 3) + 1 || 9e9), one = _ref[0], two = _ref[1], three = _ref[2]; - if ('HERECOMMENT' === (one != null ? one[0] : void 0)) { - return false; - } - tag = token[0]; - if (__indexOf.call(LINEBREAKS, tag) >= 0) { - sameLine = false; - } - return (((tag === 'TERMINATOR' || tag === 'OUTDENT') || (__indexOf.call(IMPLICIT_END, tag) >= 0 && sameLine && !(i - startIndex === 1))) && ((!startsLine && this.tag(i - 1) !== ',') || !((two != null ? two[0] : void 0) === ':' || (one != null ? one[0] : void 0) === '@' && (three != null ? three[0] : void 0) === ':'))) || (tag === ',' && one && ((_ref1 = one[0]) !== 'IDENTIFIER' && _ref1 !== 'NUMBER' && _ref1 !== 'STRING' && _ref1 !== '@' && _ref1 !== 'TERMINATOR' && _ref1 !== 'OUTDENT')); - }; - action = function(token, i) { - var tok; - tok = this.generate('}', '}', token[2]); - return this.tokens.splice(i, 0, tok); - }; - return this.scanTokens(function(token, i, tokens) { - var ago, idx, prevTag, tag, tok, value, _ref, _ref1; - if (_ref = (tag = token[0]), __indexOf.call(EXPRESSION_START, _ref) >= 0) { - stack.push([(tag === 'INDENT' && this.tag(i - 1) === '{' ? '{' : tag), i]); - return 1; - } - if (__indexOf.call(EXPRESSION_END, tag) >= 0) { - start = stack.pop(); - return 1; - } - if (!(tag === ':' && ((ago = this.tag(i - 2)) === ':' || ((_ref1 = stack[stack.length - 1]) != null ? _ref1[0] : void 0) !== '{'))) { - return 1; - } - sameLine = true; - startIndex = i + 1; - stack.push(['{']); - idx = ago === '@' ? i - 2 : i - 1; - while (this.tag(idx - 2) === 'HERECOMMENT') { - idx -= 2; - } - prevTag = this.tag(idx - 1); - startsLine = !prevTag || (__indexOf.call(LINEBREAKS, prevTag) >= 0); - value = new String('{'); - value.generated = true; - tok = this.generate('{', value, token[2]); - tokens.splice(idx, 0, tok); - this.detectEnd(i + 2, condition, action); - return 2; - }); - }; - - Rewriter.prototype.addImplicitParentheses = function() { - var action, condition, noCall, seenControl, seenSingle; - noCall = seenSingle = seenControl = false; - condition = function(token, i) { - var post, tag, _ref, _ref1; - tag = token[0]; - if (!seenSingle && token.fromThen) { - return true; - } - if (tag === 'IF' || tag === 'ELSE' || tag === 'CATCH' || tag === '->' || tag === '=>' || tag === 'CLASS') { - seenSingle = true; - } - if (tag === 'IF' || tag === 'ELSE' || tag === 'SWITCH' || tag === 'TRY' || tag === '=') { - seenControl = true; - } - if ((tag === '.' || tag === '?.' || tag === '::') && this.tag(i - 1) === 'OUTDENT') { - return true; - } - return !token.generated && this.tag(i - 1) !== ',' && (__indexOf.call(IMPLICIT_END, tag) >= 0 || (tag === 'INDENT' && !seenControl)) && (tag !== 'INDENT' || (((_ref = this.tag(i - 2)) !== 'CLASS' && _ref !== 'EXTENDS') && (_ref1 = this.tag(i - 1), __indexOf.call(IMPLICIT_BLOCK, _ref1) < 0) && !((post = this.tokens[i + 1]) && post.generated && post[0] === '{'))); - }; - action = function(token, i) { - return this.tokens.splice(i, 0, this.generate('CALL_END', ')', token[2])); - }; - return this.scanTokens(function(token, i, tokens) { - var callObject, current, next, prev, tag, _ref, _ref1, _ref2; - tag = token[0]; - if (tag === 'CLASS' || tag === 'IF' || tag === 'FOR' || tag === 'WHILE') { - noCall = true; - } - _ref = tokens.slice(i - 1, +(i + 1) + 1 || 9e9), prev = _ref[0], current = _ref[1], next = _ref[2]; - callObject = !noCall && tag === 'INDENT' && next && next.generated && next[0] === '{' && prev && (_ref1 = prev[0], __indexOf.call(IMPLICIT_FUNC, _ref1) >= 0); - seenSingle = false; - seenControl = false; - if (__indexOf.call(LINEBREAKS, tag) >= 0) { - noCall = false; - } - if (prev && !prev.spaced && tag === '?') { - token.call = true; - } - if (token.fromThen) { - return 1; - } - if (!(callObject || (prev != null ? prev.spaced : void 0) && (prev.call || (_ref2 = prev[0], __indexOf.call(IMPLICIT_FUNC, _ref2) >= 0)) && (__indexOf.call(IMPLICIT_CALL, tag) >= 0 || !(token.spaced || token.newLine) && __indexOf.call(IMPLICIT_UNSPACED_CALL, tag) >= 0))) { - return 1; - } - tokens.splice(i, 0, this.generate('CALL_START', '(', token[2])); - this.detectEnd(i + 1, condition, action); - if (prev[0] === '?') { - prev[0] = 'FUNC_EXIST'; - } - return 2; - }); - }; - - Rewriter.prototype.addImplicitIndentation = function() { - var action, condition, indent, outdent, starter; - starter = indent = outdent = null; - condition = function(token, i) { - var _ref; - return token[1] !== ';' && (_ref = token[0], __indexOf.call(SINGLE_CLOSERS, _ref) >= 0) && !(token[0] === 'ELSE' && (starter !== 'IF' && starter !== 'THEN')); - }; - action = function(token, i) { - return this.tokens.splice((this.tag(i - 1) === ',' ? i - 1 : i), 0, outdent); - }; - return this.scanTokens(function(token, i, tokens) { - var tag, _ref, _ref1; - tag = token[0]; - if (tag === 'TERMINATOR' && this.tag(i + 1) === 'THEN') { - tokens.splice(i, 1); - return 0; - } - if (tag === 'ELSE' && this.tag(i - 1) !== 'OUTDENT') { - tokens.splice.apply(tokens, [i, 0].concat(__slice.call(this.indentation(token)))); - return 2; - } - if (tag === 'CATCH' && ((_ref = this.tag(i + 2)) === 'OUTDENT' || _ref === 'TERMINATOR' || _ref === 'FINALLY')) { - tokens.splice.apply(tokens, [i + 2, 0].concat(__slice.call(this.indentation(token)))); - return 4; - } - if (__indexOf.call(SINGLE_LINERS, tag) >= 0 && this.tag(i + 1) !== 'INDENT' && !(tag === 'ELSE' && this.tag(i + 1) === 'IF')) { - starter = tag; - _ref1 = this.indentation(token, true), indent = _ref1[0], outdent = _ref1[1]; - if (starter === 'THEN') { - indent.fromThen = true; - } - tokens.splice(i + 1, 0, indent); - this.detectEnd(i + 2, condition, action); - if (tag === 'THEN') { - tokens.splice(i, 1); - } - return 1; - } - return 1; - }); - }; - - Rewriter.prototype.tagPostfixConditionals = function() { - var action, condition, original; - original = null; - condition = function(token, i) { - var _ref; - return (_ref = token[0]) === 'TERMINATOR' || _ref === 'INDENT'; - }; - action = function(token, i) { - if (token[0] !== 'INDENT' || (token.generated && !token.fromThen)) { - return original[0] = 'POST_' + original[0]; - } - }; - return this.scanTokens(function(token, i) { - if (token[0] !== 'IF') { - return 1; - } - original = token; - this.detectEnd(i + 1, condition, action); - return 1; - }); - }; - - Rewriter.prototype.indentation = function(token, implicit) { - var indent, outdent; - if (implicit == null) { - implicit = false; - } - indent = ['INDENT', 2, token[2]]; - outdent = ['OUTDENT', 2, token[2]]; - if (implicit) { - indent.generated = outdent.generated = true; - } - return [indent, outdent]; - }; - - Rewriter.prototype.generate = function(tag, value, line) { - var tok; - tok = [tag, value, line]; - tok.generated = true; - return tok; - }; - - Rewriter.prototype.tag = function(i) { - var _ref; - return (_ref = this.tokens[i]) != null ? _ref[0] : void 0; - }; - - return Rewriter; - - })(); - - BALANCED_PAIRS = [['(', ')'], ['[', ']'], ['{', '}'], ['INDENT', 'OUTDENT'], ['CALL_START', 'CALL_END'], ['PARAM_START', 'PARAM_END'], ['INDEX_START', 'INDEX_END']]; - - exports.INVERSES = INVERSES = {}; - - EXPRESSION_START = []; - - EXPRESSION_END = []; - - for (_i = 0, _len = BALANCED_PAIRS.length; _i < _len; _i++) { - _ref = BALANCED_PAIRS[_i], left = _ref[0], rite = _ref[1]; - EXPRESSION_START.push(INVERSES[rite] = left); - EXPRESSION_END.push(INVERSES[left] = rite); - } - - EXPRESSION_CLOSE = ['CATCH', 'WHEN', 'ELSE', 'FINALLY'].concat(EXPRESSION_END); - - IMPLICIT_FUNC = ['IDENTIFIER', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END', '@', 'THIS']; - - IMPLICIT_CALL = ['IDENTIFIER', 'NUMBER', 'STRING', 'JS', 'REGEX', 'NEW', 'PARAM_START', 'CLASS', 'IF', 'TRY', 'SWITCH', 'THIS', 'BOOL', 'NULL', 'UNDEFINED', 'UNARY', 'SUPER', '@', '->', '=>', '[', '(', '{', '--', '++']; - - IMPLICIT_UNSPACED_CALL = ['+', '-']; - - IMPLICIT_BLOCK = ['->', '=>', '{', '[', ',']; - - IMPLICIT_END = ['POST_IF', 'FOR', 'WHILE', 'UNTIL', 'WHEN', 'BY', 'LOOP', 'TERMINATOR']; - - SINGLE_LINERS = ['ELSE', '->', '=>', 'TRY', 'FINALLY', 'THEN']; - - SINGLE_CLOSERS = ['TERMINATOR', 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN']; - - LINEBREAKS = ['TERMINATOR', 'INDENT', 'OUTDENT']; - -}).call(this); diff --git a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/scope.js b/node_modules/jade/node_modules/coffee-script/lib/coffee-script/scope.js deleted file mode 100644 index 3f35dbf..0000000 --- a/node_modules/jade/node_modules/coffee-script/lib/coffee-script/scope.js +++ /dev/null @@ -1,146 +0,0 @@ -// Generated by CoffeeScript 1.4.0 -(function() { - var Scope, extend, last, _ref; - - _ref = require('./helpers'), extend = _ref.extend, last = _ref.last; - - exports.Scope = Scope = (function() { - - Scope.root = null; - - function Scope(parent, expressions, method) { - this.parent = parent; - this.expressions = expressions; - this.method = method; - this.variables = [ - { - name: 'arguments', - type: 'arguments' - } - ]; - this.positions = {}; - if (!this.parent) { - Scope.root = this; - } - } - - Scope.prototype.add = function(name, type, immediate) { - if (this.shared && !immediate) { - return this.parent.add(name, type, immediate); - } - if (Object.prototype.hasOwnProperty.call(this.positions, name)) { - return this.variables[this.positions[name]].type = type; - } else { - return this.positions[name] = this.variables.push({ - name: name, - type: type - }) - 1; - } - }; - - Scope.prototype.namedMethod = function() { - if (this.method.name || !this.parent) { - return this.method; - } - return this.parent.namedMethod(); - }; - - Scope.prototype.find = function(name) { - if (this.check(name)) { - return true; - } - this.add(name, 'var'); - return false; - }; - - Scope.prototype.parameter = function(name) { - if (this.shared && this.parent.check(name, true)) { - return; - } - return this.add(name, 'param'); - }; - - Scope.prototype.check = function(name) { - var _ref1; - return !!(this.type(name) || ((_ref1 = this.parent) != null ? _ref1.check(name) : void 0)); - }; - - Scope.prototype.temporary = function(name, index) { - if (name.length > 1) { - return '_' + name + (index > 1 ? index - 1 : ''); - } else { - return '_' + (index + parseInt(name, 36)).toString(36).replace(/\d/g, 'a'); - } - }; - - Scope.prototype.type = function(name) { - var v, _i, _len, _ref1; - _ref1 = this.variables; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - v = _ref1[_i]; - if (v.name === name) { - return v.type; - } - } - return null; - }; - - Scope.prototype.freeVariable = function(name, reserve) { - var index, temp; - if (reserve == null) { - reserve = true; - } - index = 0; - while (this.check((temp = this.temporary(name, index)))) { - index++; - } - if (reserve) { - this.add(temp, 'var', true); - } - return temp; - }; - - Scope.prototype.assign = function(name, value) { - this.add(name, { - value: value, - assigned: true - }, true); - return this.hasAssignments = true; - }; - - Scope.prototype.hasDeclarations = function() { - return !!this.declaredVariables().length; - }; - - Scope.prototype.declaredVariables = function() { - var realVars, tempVars, v, _i, _len, _ref1; - realVars = []; - tempVars = []; - _ref1 = this.variables; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - v = _ref1[_i]; - if (v.type === 'var') { - (v.name.charAt(0) === '_' ? tempVars : realVars).push(v.name); - } - } - return realVars.sort().concat(tempVars.sort()); - }; - - Scope.prototype.assignedVariables = function() { - var v, _i, _len, _ref1, _results; - _ref1 = this.variables; - _results = []; - for (_i = 0, _len = _ref1.length; _i < _len; _i++) { - v = _ref1[_i]; - if (v.type.assigned) { - _results.push("" + v.name + " = " + v.type.value); - } - } - return _results; - }; - - return Scope; - - })(); - -}).call(this); diff --git a/node_modules/jade/node_modules/coffee-script/package.json b/node_modules/jade/node_modules/coffee-script/package.json deleted file mode 100644 index 938ef19..0000000 --- a/node_modules/jade/node_modules/coffee-script/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "coffee-script", - "description": "Unfancy JavaScript", - "keywords": [ - "javascript", - "language", - "coffeescript", - "compiler" - ], - "author": { - "name": "Jeremy Ashkenas" - }, - "version": "1.4.0", - "licenses": [ - { - "type": "MIT", - "url": "https://raw.github.com/jashkenas/coffee-script/master/LICENSE" - } - ], - "engines": { - "node": ">=0.4.0" - }, - "directories": { - "lib": "./lib/coffee-script" - }, - "main": "./lib/coffee-script/coffee-script", - "bin": { - "coffee": "./bin/coffee", - "cake": "./bin/cake" - }, - "scripts": { - "test": "node ./bin/cake test" - }, - "homepage": "http://coffeescript.org", - "bugs": "https://github.com/jashkenas/coffee-script/issues", - "repository": { - "type": "git", - "url": "git://github.com/jashkenas/coffee-script.git" - }, - "devDependencies": { - "uglify-js": ">=1.0.0", - "jison": ">=0.2.0" - }, - "readme": "\n {\n } } {\n { { } }\n } }{ {\n { }{ } } _____ __ __\n ( }{ }{ { ) / ____| / _|/ _|\n .- { { } { }} -. | | ___ | |_| |_ ___ ___\n ( ( } { } { } } ) | | / _ \\| _| _/ _ \\/ _ \\\n |`-..________ ..-'| | |___| (_) | | | || __/ __/\n | | \\_____\\___/|_| |_| \\___|\\___|\n | ;--.\n | (__ \\ _____ _ _\n | | ) ) / ____| (_) | |\n | |/ / | (___ ___ _ __ _ _ __ | |_\n | ( / \\___ \\ / __| '__| | '_ \\| __|\n | |/ ____) | (__| | | | |_) | |_\n | | |_____/ \\___|_| |_| .__/ \\__|\n `-.._________..-' | |\n |_|\n\n\n CoffeeScript is a little language that compiles into JavaScript.\n\n Install Node.js, and then the CoffeeScript compiler:\n sudo bin/cake install\n\n Or, if you have the Node Package Manager installed:\n npm install -g coffee-script\n (Leave off the -g if you don't wish to install globally.)\n\n Execute a script:\n coffee /path/to/script.coffee\n\n Compile a script:\n coffee -c /path/to/script.coffee\n\n For documentation, usage, and examples, see:\n http://coffeescript.org/\n\n To suggest a feature, report a bug, or general discussion:\n http://github.com/jashkenas/coffee-script/issues/\n\n If you'd like to chat, drop by #coffeescript on Freenode IRC,\n or on webchat.freenode.net.\n\n The source repository:\n git://github.com/jashkenas/coffee-script.git\n\n All contributors are listed here:\n http://github.com/jashkenas/coffee-script/contributors\n", - "_id": "coffee-script@1.4.0", - "dist": { - "shasum": "5e3bc8aac26c01a8e27bf107722c5655f5ad7d36" - }, - "_from": "coffee-script@~1.4.0" -} diff --git a/node_modules/jade/node_modules/commander/.npmignore b/node_modules/jade/node_modules/commander/.npmignore deleted file mode 100644 index f1250e5..0000000 --- a/node_modules/jade/node_modules/commander/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -support -test -examples -*.sock diff --git a/node_modules/jade/node_modules/commander/.travis.yml b/node_modules/jade/node_modules/commander/.travis.yml deleted file mode 100644 index f1d0f13..0000000 --- a/node_modules/jade/node_modules/commander/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.4 - - 0.6 diff --git a/node_modules/jade/node_modules/commander/History.md b/node_modules/jade/node_modules/commander/History.md deleted file mode 100644 index 4961d2e..0000000 --- a/node_modules/jade/node_modules/commander/History.md +++ /dev/null @@ -1,107 +0,0 @@ - -0.6.1 / 2012-06-01 -================== - - * Added: append (yes or no) on confirmation - * Added: allow node.js v0.7.x - -0.6.0 / 2012-04-10 -================== - - * Added `.prompt(obj, callback)` support. Closes #49 - * Added default support to .choose(). Closes #41 - * Fixed the choice example - -0.5.1 / 2011-12-20 -================== - - * Fixed `password()` for recent nodes. Closes #36 - -0.5.0 / 2011-12-04 -================== - - * Added sub-command option support [itay] - -0.4.3 / 2011-12-04 -================== - - * Fixed custom help ordering. Closes #32 - -0.4.2 / 2011-11-24 -================== - - * Added travis support - * Fixed: line-buffered input automatically trimmed. Closes #31 - -0.4.1 / 2011-11-18 -================== - - * Removed listening for "close" on --help - -0.4.0 / 2011-11-15 -================== - - * Added support for `--`. Closes #24 - -0.3.3 / 2011-11-14 -================== - - * Fixed: wait for close event when writing help info [Jerry Hamlet] - -0.3.2 / 2011-11-01 -================== - - * Fixed long flag definitions with values [felixge] - -0.3.1 / 2011-10-31 -================== - - * Changed `--version` short flag to `-V` from `-v` - * Changed `.version()` so it's configurable [felixge] - -0.3.0 / 2011-10-31 -================== - - * Added support for long flags only. Closes #18 - -0.2.1 / 2011-10-24 -================== - - * "node": ">= 0.4.x < 0.7.0". Closes #20 - -0.2.0 / 2011-09-26 -================== - - * Allow for defaults that are not just boolean. Default peassignment only occurs for --no-*, optional, and required arguments. [Jim Isaacs] - -0.1.0 / 2011-08-24 -================== - - * Added support for custom `--help` output - -0.0.5 / 2011-08-18 -================== - - * Changed: when the user enters nothing prompt for password again - * Fixed issue with passwords beginning with numbers [NuckChorris] - -0.0.4 / 2011-08-15 -================== - - * Fixed `Commander#args` - -0.0.3 / 2011-08-15 -================== - - * Added default option value support - -0.0.2 / 2011-08-15 -================== - - * Added mask support to `Command#password(str[, mask], fn)` - * Added `Command#password(str, fn)` - -0.0.1 / 2010-01-03 -================== - - * Initial release diff --git a/node_modules/jade/node_modules/commander/Makefile b/node_modules/jade/node_modules/commander/Makefile deleted file mode 100644 index 0074625..0000000 --- a/node_modules/jade/node_modules/commander/Makefile +++ /dev/null @@ -1,7 +0,0 @@ - -TESTS = $(shell find test/test.*.js) - -test: - @./test/run $(TESTS) - -.PHONY: test \ No newline at end of file diff --git a/node_modules/jade/node_modules/commander/Readme.md b/node_modules/jade/node_modules/commander/Readme.md deleted file mode 100644 index b8328c3..0000000 --- a/node_modules/jade/node_modules/commander/Readme.md +++ /dev/null @@ -1,262 +0,0 @@ -# Commander.js - - The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander). - - [![Build Status](https://secure.travis-ci.org/visionmedia/commander.js.png)](http://travis-ci.org/visionmedia/commander.js) - -## Installation - - $ npm install commander - -## Option parsing - - Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options. - -```js -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var program = require('commander'); - -program - .version('0.0.1') - .option('-p, --peppers', 'Add peppers') - .option('-P, --pineapple', 'Add pineapple') - .option('-b, --bbq', 'Add bbq sauce') - .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble') - .parse(process.argv); - -console.log('you ordered a pizza with:'); -if (program.peppers) console.log(' - peppers'); -if (program.pineapple) console.log(' - pineappe'); -if (program.bbq) console.log(' - bbq'); -console.log(' - %s cheese', program.cheese); -``` - - Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc. - -## Automated --help - - The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free: - -``` - $ ./examples/pizza --help - - Usage: pizza [options] - - Options: - - -V, --version output the version number - -p, --peppers Add peppers - -P, --pineapple Add pineappe - -b, --bbq Add bbq sauce - -c, --cheese Add the specified type of cheese [marble] - -h, --help output usage information - -``` - -## Coercion - -```js -function range(val) { - return val.split('..').map(Number); -} - -function list(val) { - return val.split(','); -} - -program - .version('0.0.1') - .usage('[options] ') - .option('-i, --integer ', 'An integer argument', parseInt) - .option('-f, --float ', 'A float argument', parseFloat) - .option('-r, --range ..', 'A range', range) - .option('-l, --list ', 'A list', list) - .option('-o, --optional [value]', 'An optional value') - .parse(process.argv); - -console.log(' int: %j', program.integer); -console.log(' float: %j', program.float); -console.log(' optional: %j', program.optional); -program.range = program.range || []; -console.log(' range: %j..%j', program.range[0], program.range[1]); -console.log(' list: %j', program.list); -console.log(' args: %j', program.args); -``` - -## Custom help - - You can display arbitrary `-h, --help` information - by listening for "--help". Commander will automatically - exit once you are done so that the remainder of your program - does not execute causing undesired behaviours, for example - in the following executable "stuff" will not output when - `--help` is used. - -```js -#!/usr/bin/env node - -/** - * Module dependencies. - */ - -var program = require('../'); - -function list(val) { - return val.split(',').map(Number); -} - -program - .version('0.0.1') - .option('-f, --foo', 'enable some foo') - .option('-b, --bar', 'enable some bar') - .option('-B, --baz', 'enable some baz'); - -// must be before .parse() since -// node's emit() is immediate - -program.on('--help', function(){ - console.log(' Examples:'); - console.log(''); - console.log(' $ custom-help --help'); - console.log(' $ custom-help -h'); - console.log(''); -}); - -program.parse(process.argv); - -console.log('stuff'); -``` - -yielding the following help output: - -``` - -Usage: custom-help [options] - -Options: - - -h, --help output usage information - -V, --version output the version number - -f, --foo enable some foo - -b, --bar enable some bar - -B, --baz enable some baz - -Examples: - - $ custom-help --help - $ custom-help -h - -``` - -## .prompt(msg, fn) - - Single-line prompt: - -```js -program.prompt('name: ', function(name){ - console.log('hi %s', name); -}); -``` - - Multi-line prompt: - -```js -program.prompt('description:', function(name){ - console.log('hi %s', name); -}); -``` - - Coercion: - -```js -program.prompt('Age: ', Number, function(age){ - console.log('age: %j', age); -}); -``` - -```js -program.prompt('Birthdate: ', Date, function(date){ - console.log('date: %s', date); -}); -``` - -## .password(msg[, mask], fn) - -Prompt for password without echoing: - -```js -program.password('Password: ', function(pass){ - console.log('got "%s"', pass); - process.stdin.destroy(); -}); -``` - -Prompt for password with mask char "*": - -```js -program.password('Password: ', '*', function(pass){ - console.log('got "%s"', pass); - process.stdin.destroy(); -}); -``` - -## .confirm(msg, fn) - - Confirm with the given `msg`: - -```js -program.confirm('continue? ', function(ok){ - console.log(' got %j', ok); -}); -``` - -## .choose(list, fn) - - Let the user choose from a `list`: - -```js -var list = ['tobi', 'loki', 'jane', 'manny', 'luna']; - -console.log('Choose the coolest pet:'); -program.choose(list, function(i){ - console.log('you chose %d "%s"', i, list[i]); -}); -``` - -## Links - - - [API documentation](http://visionmedia.github.com/commander.js/) - - [ascii tables](https://github.com/LearnBoost/cli-table) - - [progress bars](https://github.com/visionmedia/node-progress) - - [more progress bars](https://github.com/substack/node-multimeter) - - [examples](https://github.com/visionmedia/commander.js/tree/master/examples) - -## License - -(The MIT License) - -Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca> - -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. \ No newline at end of file diff --git a/node_modules/jade/node_modules/commander/index.js b/node_modules/jade/node_modules/commander/index.js deleted file mode 100644 index 06ec1e4..0000000 --- a/node_modules/jade/node_modules/commander/index.js +++ /dev/null @@ -1,2 +0,0 @@ - -module.exports = require('./lib/commander'); \ No newline at end of file diff --git a/node_modules/jade/node_modules/commander/lib/commander.js b/node_modules/jade/node_modules/commander/lib/commander.js deleted file mode 100644 index 5ba87eb..0000000 --- a/node_modules/jade/node_modules/commander/lib/commander.js +++ /dev/null @@ -1,1026 +0,0 @@ - -/*! - * commander - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var EventEmitter = require('events').EventEmitter - , path = require('path') - , tty = require('tty') - , basename = path.basename; - -/** - * Expose the root command. - */ - -exports = module.exports = new Command; - -/** - * Expose `Command`. - */ - -exports.Command = Command; - -/** - * Expose `Option`. - */ - -exports.Option = Option; - -/** - * Initialize a new `Option` with the given `flags` and `description`. - * - * @param {String} flags - * @param {String} description - * @api public - */ - -function Option(flags, description) { - this.flags = flags; - this.required = ~flags.indexOf('<'); - this.optional = ~flags.indexOf('['); - this.bool = !~flags.indexOf('-no-'); - flags = flags.split(/[ ,|]+/); - if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift(); - this.long = flags.shift(); - this.description = description; -} - -/** - * Return option name. - * - * @return {String} - * @api private - */ - -Option.prototype.name = function(){ - return this.long - .replace('--', '') - .replace('no-', ''); -}; - -/** - * Check if `arg` matches the short or long flag. - * - * @param {String} arg - * @return {Boolean} - * @api private - */ - -Option.prototype.is = function(arg){ - return arg == this.short - || arg == this.long; -}; - -/** - * Initialize a new `Command`. - * - * @param {String} name - * @api public - */ - -function Command(name) { - this.commands = []; - this.options = []; - this.args = []; - this.name = name; -} - -/** - * Inherit from `EventEmitter.prototype`. - */ - -Command.prototype.__proto__ = EventEmitter.prototype; - -/** - * Add command `name`. - * - * The `.action()` callback is invoked when the - * command `name` is specified via __ARGV__, - * and the remaining arguments are applied to the - * function for access. - * - * When the `name` is "*" an un-matched command - * will be passed as the first arg, followed by - * the rest of __ARGV__ remaining. - * - * Examples: - * - * program - * .version('0.0.1') - * .option('-C, --chdir ', 'change the working directory') - * .option('-c, --config ', 'set config path. defaults to ./deploy.conf') - * .option('-T, --no-tests', 'ignore test hook') - * - * program - * .command('setup') - * .description('run remote setup commands') - * .action(function(){ - * console.log('setup'); - * }); - * - * program - * .command('exec ') - * .description('run the given remote command') - * .action(function(cmd){ - * console.log('exec "%s"', cmd); - * }); - * - * program - * .command('*') - * .description('deploy the given env') - * .action(function(env){ - * console.log('deploying "%s"', env); - * }); - * - * program.parse(process.argv); - * - * @param {String} name - * @return {Command} the new command - * @api public - */ - -Command.prototype.command = function(name){ - var args = name.split(/ +/); - var cmd = new Command(args.shift()); - this.commands.push(cmd); - cmd.parseExpectedArgs(args); - cmd.parent = this; - return cmd; -}; - -/** - * Parse expected `args`. - * - * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`. - * - * @param {Array} args - * @return {Command} for chaining - * @api public - */ - -Command.prototype.parseExpectedArgs = function(args){ - if (!args.length) return; - var self = this; - args.forEach(function(arg){ - switch (arg[0]) { - case '<': - self.args.push({ required: true, name: arg.slice(1, -1) }); - break; - case '[': - self.args.push({ required: false, name: arg.slice(1, -1) }); - break; - } - }); - return this; -}; - -/** - * Register callback `fn` for the command. - * - * Examples: - * - * program - * .command('help') - * .description('display verbose help') - * .action(function(){ - * // output help here - * }); - * - * @param {Function} fn - * @return {Command} for chaining - * @api public - */ - -Command.prototype.action = function(fn){ - var self = this; - this.parent.on(this.name, function(args, unknown){ - // Parse any so-far unknown options - unknown = unknown || []; - var parsed = self.parseOptions(unknown); - - // Output help if necessary - outputHelpIfNecessary(self, parsed.unknown); - - // If there are still any unknown options, then we simply - // die, unless someone asked for help, in which case we give it - // to them, and then we die. - if (parsed.unknown.length > 0) { - self.unknownOption(parsed.unknown[0]); - } - - self.args.forEach(function(arg, i){ - if (arg.required && null == args[i]) { - self.missingArgument(arg.name); - } - }); - - // Always append ourselves to the end of the arguments, - // to make sure we match the number of arguments the user - // expects - if (self.args.length) { - args[self.args.length] = self; - } else { - args.push(self); - } - - fn.apply(this, args); - }); - return this; -}; - -/** - * Define option with `flags`, `description` and optional - * coercion `fn`. - * - * The `flags` string should contain both the short and long flags, - * separated by comma, a pipe or space. The following are all valid - * all will output this way when `--help` is used. - * - * "-p, --pepper" - * "-p|--pepper" - * "-p --pepper" - * - * Examples: - * - * // simple boolean defaulting to false - * program.option('-p, --pepper', 'add pepper'); - * - * --pepper - * program.pepper - * // => Boolean - * - * // simple boolean defaulting to false - * program.option('-C, --no-cheese', 'remove cheese'); - * - * program.cheese - * // => true - * - * --no-cheese - * program.cheese - * // => true - * - * // required argument - * program.option('-C, --chdir ', 'change the working directory'); - * - * --chdir /tmp - * program.chdir - * // => "/tmp" - * - * // optional argument - * program.option('-c, --cheese [type]', 'add cheese [marble]'); - * - * @param {String} flags - * @param {String} description - * @param {Function|Mixed} fn or default - * @param {Mixed} defaultValue - * @return {Command} for chaining - * @api public - */ - -Command.prototype.option = function(flags, description, fn, defaultValue){ - var self = this - , option = new Option(flags, description) - , oname = option.name() - , name = camelcase(oname); - - // default as 3rd arg - if ('function' != typeof fn) defaultValue = fn, fn = null; - - // preassign default value only for --no-*, [optional], or - if (false == option.bool || option.optional || option.required) { - // when --no-* we make sure default is true - if (false == option.bool) defaultValue = true; - // preassign only if we have a default - if (undefined !== defaultValue) self[name] = defaultValue; - } - - // register the option - this.options.push(option); - - // when it's passed assign the value - // and conditionally invoke the callback - this.on(oname, function(val){ - // coercion - if (null != val && fn) val = fn(val); - - // unassigned or bool - if ('boolean' == typeof self[name] || 'undefined' == typeof self[name]) { - // if no value, bool true, and we have a default, then use it! - if (null == val) { - self[name] = option.bool - ? defaultValue || true - : false; - } else { - self[name] = val; - } - } else if (null !== val) { - // reassign - self[name] = val; - } - }); - - return this; -}; - -/** - * Parse `argv`, settings options and invoking commands when defined. - * - * @param {Array} argv - * @return {Command} for chaining - * @api public - */ - -Command.prototype.parse = function(argv){ - // store raw args - this.rawArgs = argv; - - // guess name - if (!this.name) this.name = basename(argv[1]); - - // process argv - var parsed = this.parseOptions(this.normalize(argv.slice(2))); - this.args = parsed.args; - return this.parseArgs(this.args, parsed.unknown); -}; - -/** - * Normalize `args`, splitting joined short flags. For example - * the arg "-abc" is equivalent to "-a -b -c". - * - * @param {Array} args - * @return {Array} - * @api private - */ - -Command.prototype.normalize = function(args){ - var ret = [] - , arg; - - for (var i = 0, len = args.length; i < len; ++i) { - arg = args[i]; - if (arg.length > 1 && '-' == arg[0] && '-' != arg[1]) { - arg.slice(1).split('').forEach(function(c){ - ret.push('-' + c); - }); - } else { - ret.push(arg); - } - } - - return ret; -}; - -/** - * Parse command `args`. - * - * When listener(s) are available those - * callbacks are invoked, otherwise the "*" - * event is emitted and those actions are invoked. - * - * @param {Array} args - * @return {Command} for chaining - * @api private - */ - -Command.prototype.parseArgs = function(args, unknown){ - var cmds = this.commands - , len = cmds.length - , name; - - if (args.length) { - name = args[0]; - if (this.listeners(name).length) { - this.emit(args.shift(), args, unknown); - } else { - this.emit('*', args); - } - } else { - outputHelpIfNecessary(this, unknown); - - // If there were no args and we have unknown options, - // then they are extraneous and we need to error. - if (unknown.length > 0) { - this.unknownOption(unknown[0]); - } - } - - return this; -}; - -/** - * Return an option matching `arg` if any. - * - * @param {String} arg - * @return {Option} - * @api private - */ - -Command.prototype.optionFor = function(arg){ - for (var i = 0, len = this.options.length; i < len; ++i) { - if (this.options[i].is(arg)) { - return this.options[i]; - } - } -}; - -/** - * Parse options from `argv` returning `argv` - * void of these options. - * - * @param {Array} argv - * @return {Array} - * @api public - */ - -Command.prototype.parseOptions = function(argv){ - var args = [] - , len = argv.length - , literal - , option - , arg; - - var unknownOptions = []; - - // parse options - for (var i = 0; i < len; ++i) { - arg = argv[i]; - - // literal args after -- - if ('--' == arg) { - literal = true; - continue; - } - - if (literal) { - args.push(arg); - continue; - } - - // find matching Option - option = this.optionFor(arg); - - // option is defined - if (option) { - // requires arg - if (option.required) { - arg = argv[++i]; - if (null == arg) return this.optionMissingArgument(option); - if ('-' == arg[0]) return this.optionMissingArgument(option, arg); - this.emit(option.name(), arg); - // optional arg - } else if (option.optional) { - arg = argv[i+1]; - if (null == arg || '-' == arg[0]) { - arg = null; - } else { - ++i; - } - this.emit(option.name(), arg); - // bool - } else { - this.emit(option.name()); - } - continue; - } - - // looks like an option - if (arg.length > 1 && '-' == arg[0]) { - unknownOptions.push(arg); - - // If the next argument looks like it might be - // an argument for this option, we pass it on. - // If it isn't, then it'll simply be ignored - if (argv[i+1] && '-' != argv[i+1][0]) { - unknownOptions.push(argv[++i]); - } - continue; - } - - // arg - args.push(arg); - } - - return { args: args, unknown: unknownOptions }; -}; - -/** - * Argument `name` is missing. - * - * @param {String} name - * @api private - */ - -Command.prototype.missingArgument = function(name){ - console.error(); - console.error(" error: missing required argument `%s'", name); - console.error(); - process.exit(1); -}; - -/** - * `Option` is missing an argument, but received `flag` or nothing. - * - * @param {String} option - * @param {String} flag - * @api private - */ - -Command.prototype.optionMissingArgument = function(option, flag){ - console.error(); - if (flag) { - console.error(" error: option `%s' argument missing, got `%s'", option.flags, flag); - } else { - console.error(" error: option `%s' argument missing", option.flags); - } - console.error(); - process.exit(1); -}; - -/** - * Unknown option `flag`. - * - * @param {String} flag - * @api private - */ - -Command.prototype.unknownOption = function(flag){ - console.error(); - console.error(" error: unknown option `%s'", flag); - console.error(); - process.exit(1); -}; - -/** - * Set the program version to `str`. - * - * This method auto-registers the "-V, --version" flag - * which will print the version number when passed. - * - * @param {String} str - * @param {String} flags - * @return {Command} for chaining - * @api public - */ - -Command.prototype.version = function(str, flags){ - if (0 == arguments.length) return this._version; - this._version = str; - flags = flags || '-V, --version'; - this.option(flags, 'output the version number'); - this.on('version', function(){ - console.log(str); - process.exit(0); - }); - return this; -}; - -/** - * Set the description `str`. - * - * @param {String} str - * @return {String|Command} - * @api public - */ - -Command.prototype.description = function(str){ - if (0 == arguments.length) return this._description; - this._description = str; - return this; -}; - -/** - * Set / get the command usage `str`. - * - * @param {String} str - * @return {String|Command} - * @api public - */ - -Command.prototype.usage = function(str){ - var args = this.args.map(function(arg){ - return arg.required - ? '<' + arg.name + '>' - : '[' + arg.name + ']'; - }); - - var usage = '[options' - + (this.commands.length ? '] [command' : '') - + ']' - + (this.args.length ? ' ' + args : ''); - if (0 == arguments.length) return this._usage || usage; - this._usage = str; - - return this; -}; - -/** - * Return the largest option length. - * - * @return {Number} - * @api private - */ - -Command.prototype.largestOptionLength = function(){ - return this.options.reduce(function(max, option){ - return Math.max(max, option.flags.length); - }, 0); -}; - -/** - * Return help for options. - * - * @return {String} - * @api private - */ - -Command.prototype.optionHelp = function(){ - var width = this.largestOptionLength(); - - // Prepend the help information - return [pad('-h, --help', width) + ' ' + 'output usage information'] - .concat(this.options.map(function(option){ - return pad(option.flags, width) - + ' ' + option.description; - })) - .join('\n'); -}; - -/** - * Return command help documentation. - * - * @return {String} - * @api private - */ - -Command.prototype.commandHelp = function(){ - if (!this.commands.length) return ''; - return [ - '' - , ' Commands:' - , '' - , this.commands.map(function(cmd){ - var args = cmd.args.map(function(arg){ - return arg.required - ? '<' + arg.name + '>' - : '[' + arg.name + ']'; - }).join(' '); - - return cmd.name - + (cmd.options.length - ? ' [options]' - : '') + ' ' + args - + (cmd.description() - ? '\n' + cmd.description() - : ''); - }).join('\n\n').replace(/^/gm, ' ') - , '' - ].join('\n'); -}; - -/** - * Return program help documentation. - * - * @return {String} - * @api private - */ - -Command.prototype.helpInformation = function(){ - return [ - '' - , ' Usage: ' + this.name + ' ' + this.usage() - , '' + this.commandHelp() - , ' Options:' - , '' - , '' + this.optionHelp().replace(/^/gm, ' ') - , '' - , '' - ].join('\n'); -}; - -/** - * Prompt for a `Number`. - * - * @param {String} str - * @param {Function} fn - * @api private - */ - -Command.prototype.promptForNumber = function(str, fn){ - var self = this; - this.promptSingleLine(str, function parseNumber(val){ - val = Number(val); - if (isNaN(val)) return self.promptSingleLine(str + '(must be a number) ', parseNumber); - fn(val); - }); -}; - -/** - * Prompt for a `Date`. - * - * @param {String} str - * @param {Function} fn - * @api private - */ - -Command.prototype.promptForDate = function(str, fn){ - var self = this; - this.promptSingleLine(str, function parseDate(val){ - val = new Date(val); - if (isNaN(val.getTime())) return self.promptSingleLine(str + '(must be a date) ', parseDate); - fn(val); - }); -}; - -/** - * Single-line prompt. - * - * @param {String} str - * @param {Function} fn - * @api private - */ - -Command.prototype.promptSingleLine = function(str, fn){ - if ('function' == typeof arguments[2]) { - return this['promptFor' + (fn.name || fn)](str, arguments[2]); - } - - process.stdout.write(str); - process.stdin.setEncoding('utf8'); - process.stdin.once('data', function(val){ - fn(val.trim()); - }).resume(); -}; - -/** - * Multi-line prompt. - * - * @param {String} str - * @param {Function} fn - * @api private - */ - -Command.prototype.promptMultiLine = function(str, fn){ - var buf = []; - console.log(str); - process.stdin.setEncoding('utf8'); - process.stdin.on('data', function(val){ - if ('\n' == val || '\r\n' == val) { - process.stdin.removeAllListeners('data'); - fn(buf.join('\n')); - } else { - buf.push(val.trimRight()); - } - }).resume(); -}; - -/** - * Prompt `str` and callback `fn(val)` - * - * Commander supports single-line and multi-line prompts. - * To issue a single-line prompt simply add white-space - * to the end of `str`, something like "name: ", whereas - * for a multi-line prompt omit this "description:". - * - * - * Examples: - * - * program.prompt('Username: ', function(name){ - * console.log('hi %s', name); - * }); - * - * program.prompt('Description:', function(desc){ - * console.log('description was "%s"', desc.trim()); - * }); - * - * @param {String|Object} str - * @param {Function} fn - * @api public - */ - -Command.prototype.prompt = function(str, fn){ - var self = this; - - if ('string' == typeof str) { - if (/ $/.test(str)) return this.promptSingleLine.apply(this, arguments); - this.promptMultiLine(str, fn); - } else { - var keys = Object.keys(str) - , obj = {}; - - function next() { - var key = keys.shift() - , label = str[key]; - - if (!key) return fn(obj); - self.prompt(label, function(val){ - obj[key] = val; - next(); - }); - } - - next(); - } -}; - -/** - * Prompt for password with `str`, `mask` char and callback `fn(val)`. - * - * The mask string defaults to '', aka no output is - * written while typing, you may want to use "*" etc. - * - * Examples: - * - * program.password('Password: ', function(pass){ - * console.log('got "%s"', pass); - * process.stdin.destroy(); - * }); - * - * program.password('Password: ', '*', function(pass){ - * console.log('got "%s"', pass); - * process.stdin.destroy(); - * }); - * - * @param {String} str - * @param {String} mask - * @param {Function} fn - * @api public - */ - -Command.prototype.password = function(str, mask, fn){ - var self = this - , buf = ''; - - // default mask - if ('function' == typeof mask) { - fn = mask; - mask = ''; - } - - process.stdin.resume(); - tty.setRawMode(true); - process.stdout.write(str); - - // keypress - process.stdin.on('keypress', function(c, key){ - if (key && 'enter' == key.name) { - console.log(); - process.stdin.removeAllListeners('keypress'); - tty.setRawMode(false); - if (!buf.trim().length) return self.password(str, mask, fn); - fn(buf); - return; - } - - if (key && key.ctrl && 'c' == key.name) { - console.log('%s', buf); - process.exit(); - } - - process.stdout.write(mask); - buf += c; - }).resume(); -}; - -/** - * Confirmation prompt with `str` and callback `fn(bool)` - * - * Examples: - * - * program.confirm('continue? ', function(ok){ - * console.log(' got %j', ok); - * process.stdin.destroy(); - * }); - * - * @param {String} str - * @param {Function} fn - * @api public - */ - - -Command.prototype.confirm = function(str, fn, verbose){ - var self = this; - this.prompt(str, function(ok){ - if (!ok.trim()) { - if (!verbose) str += '(yes or no) '; - return self.confirm(str, fn, true); - } - fn(parseBool(ok)); - }); -}; - -/** - * Choice prompt with `list` of items and callback `fn(index, item)` - * - * Examples: - * - * var list = ['tobi', 'loki', 'jane', 'manny', 'luna']; - * - * console.log('Choose the coolest pet:'); - * program.choose(list, function(i){ - * console.log('you chose %d "%s"', i, list[i]); - * process.stdin.destroy(); - * }); - * - * @param {Array} list - * @param {Number|Function} index or fn - * @param {Function} fn - * @api public - */ - -Command.prototype.choose = function(list, index, fn){ - var self = this - , hasDefault = 'number' == typeof index; - - if (!hasDefault) { - fn = index; - index = null; - } - - list.forEach(function(item, i){ - if (hasDefault && i == index) { - console.log('* %d) %s', i + 1, item); - } else { - console.log(' %d) %s', i + 1, item); - } - }); - - function again() { - self.prompt(' : ', function(val){ - val = parseInt(val, 10) - 1; - if (hasDefault && isNaN(val)) val = index; - - if (null == list[val]) { - again(); - } else { - fn(val, list[val]); - } - }); - } - - again(); -}; - -/** - * Camel-case the given `flag` - * - * @param {String} flag - * @return {String} - * @api private - */ - -function camelcase(flag) { - return flag.split('-').reduce(function(str, word){ - return str + word[0].toUpperCase() + word.slice(1); - }); -} - -/** - * Parse a boolean `str`. - * - * @param {String} str - * @return {Boolean} - * @api private - */ - -function parseBool(str) { - return /^y|yes|ok|true$/i.test(str); -} - -/** - * Pad `str` to `width`. - * - * @param {String} str - * @param {Number} width - * @return {String} - * @api private - */ - -function pad(str, width) { - var len = Math.max(0, width - str.length); - return str + Array(len + 1).join(' '); -} - -/** - * Output help information if necessary - * - * @param {Command} command to output help for - * @param {Array} array of options to search for -h or --help - * @api private - */ - -function outputHelpIfNecessary(cmd, options) { - options = options || []; - for (var i = 0; i < options.length; i++) { - if (options[i] == '--help' || options[i] == '-h') { - process.stdout.write(cmd.helpInformation()); - cmd.emit('--help'); - process.exit(0); - } - } -} diff --git a/node_modules/jade/node_modules/commander/package.json b/node_modules/jade/node_modules/commander/package.json deleted file mode 100644 index 764dece..0000000 --- a/node_modules/jade/node_modules/commander/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "commander", - "version": "0.6.1", - "description": "the complete solution for node.js command-line programs", - "keywords": [ - "command", - "option", - "parser", - "prompt", - "stdin" - ], - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "repository": { - "type": "git", - "url": "https://github.com/visionmedia/commander.js.git" - }, - "dependencies": {}, - "devDependencies": { - "should": ">= 0.0.1" - }, - "scripts": { - "test": "make test" - }, - "main": "index", - "engines": { - "node": ">= 0.4.x" - }, - "readme": "# Commander.js\n\n The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/visionmedia/commander).\n\n [![Build Status](https://secure.travis-ci.org/visionmedia/commander.js.png)](http://travis-ci.org/visionmedia/commander.js)\n\n## Installation\n\n $ npm install commander\n\n## Option parsing\n\n Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('commander');\n\nprogram\n .version('0.0.1')\n .option('-p, --peppers', 'Add peppers')\n .option('-P, --pineapple', 'Add pineapple')\n .option('-b, --bbq', 'Add bbq sauce')\n .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')\n .parse(process.argv);\n\nconsole.log('you ordered a pizza with:');\nif (program.peppers) console.log(' - peppers');\nif (program.pineapple) console.log(' - pineappe');\nif (program.bbq) console.log(' - bbq');\nconsole.log(' - %s cheese', program.cheese);\n```\n\n Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as \"--template-engine\" are camel-cased, becoming `program.templateEngine` etc.\n\n## Automated --help\n\n The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:\n\n``` \n $ ./examples/pizza --help\n\n Usage: pizza [options]\n\n Options:\n\n -V, --version output the version number\n -p, --peppers Add peppers\n -P, --pineapple Add pineappe\n -b, --bbq Add bbq sauce\n -c, --cheese Add the specified type of cheese [marble]\n -h, --help output usage information\n\n```\n\n## Coercion\n\n```js\nfunction range(val) {\n return val.split('..').map(Number);\n}\n\nfunction list(val) {\n return val.split(',');\n}\n\nprogram\n .version('0.0.1')\n .usage('[options] ')\n .option('-i, --integer ', 'An integer argument', parseInt)\n .option('-f, --float ', 'A float argument', parseFloat)\n .option('-r, --range ..', 'A range', range)\n .option('-l, --list ', 'A list', list)\n .option('-o, --optional [value]', 'An optional value')\n .parse(process.argv);\n\nconsole.log(' int: %j', program.integer);\nconsole.log(' float: %j', program.float);\nconsole.log(' optional: %j', program.optional);\nprogram.range = program.range || [];\nconsole.log(' range: %j..%j', program.range[0], program.range[1]);\nconsole.log(' list: %j', program.list);\nconsole.log(' args: %j', program.args);\n```\n\n## Custom help\n\n You can display arbitrary `-h, --help` information\n by listening for \"--help\". Commander will automatically\n exit once you are done so that the remainder of your program\n does not execute causing undesired behaviours, for example\n in the following executable \"stuff\" will not output when\n `--help` is used.\n\n```js\n#!/usr/bin/env node\n\n/**\n * Module dependencies.\n */\n\nvar program = require('../');\n\nfunction list(val) {\n return val.split(',').map(Number);\n}\n\nprogram\n .version('0.0.1')\n .option('-f, --foo', 'enable some foo')\n .option('-b, --bar', 'enable some bar')\n .option('-B, --baz', 'enable some baz');\n\n// must be before .parse() since\n// node's emit() is immediate\n\nprogram.on('--help', function(){\n console.log(' Examples:');\n console.log('');\n console.log(' $ custom-help --help');\n console.log(' $ custom-help -h');\n console.log('');\n});\n\nprogram.parse(process.argv);\n\nconsole.log('stuff');\n```\n\nyielding the following help output:\n\n```\n\nUsage: custom-help [options]\n\nOptions:\n\n -h, --help output usage information\n -V, --version output the version number\n -f, --foo enable some foo\n -b, --bar enable some bar\n -B, --baz enable some baz\n\nExamples:\n\n $ custom-help --help\n $ custom-help -h\n\n```\n\n## .prompt(msg, fn)\n\n Single-line prompt:\n\n```js\nprogram.prompt('name: ', function(name){\n console.log('hi %s', name);\n});\n```\n\n Multi-line prompt:\n\n```js\nprogram.prompt('description:', function(name){\n console.log('hi %s', name);\n});\n```\n\n Coercion:\n\n```js\nprogram.prompt('Age: ', Number, function(age){\n console.log('age: %j', age);\n});\n```\n\n```js\nprogram.prompt('Birthdate: ', Date, function(date){\n console.log('date: %s', date);\n});\n```\n\n## .password(msg[, mask], fn)\n\nPrompt for password without echoing:\n\n```js\nprogram.password('Password: ', function(pass){\n console.log('got \"%s\"', pass);\n process.stdin.destroy();\n});\n```\n\nPrompt for password with mask char \"*\":\n\n```js\nprogram.password('Password: ', '*', function(pass){\n console.log('got \"%s\"', pass);\n process.stdin.destroy();\n});\n```\n\n## .confirm(msg, fn)\n\n Confirm with the given `msg`:\n\n```js\nprogram.confirm('continue? ', function(ok){\n console.log(' got %j', ok);\n});\n```\n\n## .choose(list, fn)\n\n Let the user choose from a `list`:\n\n```js\nvar list = ['tobi', 'loki', 'jane', 'manny', 'luna'];\n\nconsole.log('Choose the coolest pet:');\nprogram.choose(list, function(i){\n console.log('you chose %d \"%s\"', i, list[i]);\n});\n```\n\n## Links\n\n - [API documentation](http://visionmedia.github.com/commander.js/)\n - [ascii tables](https://github.com/LearnBoost/cli-table)\n - [progress bars](https://github.com/visionmedia/node-progress)\n - [more progress bars](https://github.com/substack/node-multimeter)\n - [examples](https://github.com/visionmedia/commander.js/tree/master/examples)\n\n## License \n\n(The MIT License)\n\nCopyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.", - "_id": "commander@0.6.1", - "_from": "commander@0.6.1" -} diff --git a/node_modules/jade/node_modules/mkdirp/.npmignore b/node_modules/jade/node_modules/mkdirp/.npmignore deleted file mode 100644 index 9303c34..0000000 --- a/node_modules/jade/node_modules/mkdirp/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules/ -npm-debug.log \ No newline at end of file diff --git a/node_modules/jade/node_modules/mkdirp/.travis.yml b/node_modules/jade/node_modules/mkdirp/.travis.yml deleted file mode 100644 index f1d0f13..0000000 --- a/node_modules/jade/node_modules/mkdirp/.travis.yml +++ /dev/null @@ -1,4 +0,0 @@ -language: node_js -node_js: - - 0.4 - - 0.6 diff --git a/node_modules/jade/node_modules/mkdirp/LICENSE b/node_modules/jade/node_modules/mkdirp/LICENSE deleted file mode 100644 index 432d1ae..0000000 --- a/node_modules/jade/node_modules/mkdirp/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -Copyright 2010 James Halliday (mail@substack.net) - -This project is free software released under the MIT/X11 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/node_modules/jade/node_modules/mkdirp/README.markdown b/node_modules/jade/node_modules/mkdirp/README.markdown deleted file mode 100644 index 40de04f..0000000 --- a/node_modules/jade/node_modules/mkdirp/README.markdown +++ /dev/null @@ -1,61 +0,0 @@ -mkdirp -====== - -Like `mkdir -p`, but in node.js! - -[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp) - -example -======= - -pow.js ------- - var mkdirp = require('mkdirp'); - - mkdirp('/tmp/foo/bar/baz', function (err) { - if (err) console.error(err) - else console.log('pow!') - }); - -Output - pow! - -And now /tmp/foo/bar/baz exists, huzzah! - -methods -======= - -var mkdirp = require('mkdirp'); - -mkdirp(dir, mode, cb) ---------------------- - -Create a new directory and any necessary subdirectories at `dir` with octal -permission string `mode`. - -If `mode` isn't specified, it defaults to `0777 & (~process.umask())`. - -`cb(err, made)` fires with the error or the first directory `made` -that had to be created, if any. - -mkdirp.sync(dir, mode) ----------------------- - -Synchronously create a new directory and any necessary subdirectories at `dir` -with octal permission string `mode`. - -If `mode` isn't specified, it defaults to `0777 & (~process.umask())`. - -Returns the first directory that had to be created, if any. - -install -======= - -With [npm](http://npmjs.org) do: - - npm install mkdirp - -license -======= - -MIT/X11 diff --git a/node_modules/jade/node_modules/mkdirp/examples/pow.js b/node_modules/jade/node_modules/mkdirp/examples/pow.js deleted file mode 100644 index e692421..0000000 --- a/node_modules/jade/node_modules/mkdirp/examples/pow.js +++ /dev/null @@ -1,6 +0,0 @@ -var mkdirp = require('mkdirp'); - -mkdirp('/tmp/foo/bar/baz', function (err) { - if (err) console.error(err) - else console.log('pow!') -}); diff --git a/node_modules/jade/node_modules/mkdirp/index.js b/node_modules/jade/node_modules/mkdirp/index.js deleted file mode 100644 index fda6de8..0000000 --- a/node_modules/jade/node_modules/mkdirp/index.js +++ /dev/null @@ -1,82 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; - -function mkdirP (p, mode, f, made) { - if (typeof mode === 'function' || mode === undefined) { - f = mode; - mode = 0777 & (~process.umask()); - } - if (!made) made = null; - - var cb = f || function () {}; - if (typeof mode === 'string') mode = parseInt(mode, 8); - p = path.resolve(p); - - fs.mkdir(p, mode, function (er) { - if (!er) { - made = made || p; - return cb(null, made); - } - switch (er.code) { - case 'ENOENT': - mkdirP(path.dirname(p), mode, function (er, made) { - if (er) cb(er, made); - else mkdirP(p, mode, cb, made); - }); - break; - - // In the case of any other error, just see if there's a dir - // there already. If so, then hooray! If not, then something - // is borked. - default: - fs.stat(p, function (er2, stat) { - // if the stat fails, then that's super weird. - // let the original error be the failure reason. - if (er2 || !stat.isDirectory()) cb(er, made) - else cb(null, made); - }); - break; - } - }); -} - -mkdirP.sync = function sync (p, mode, made) { - if (mode === undefined) { - mode = 0777 & (~process.umask()); - } - if (!made) made = null; - - if (typeof mode === 'string') mode = parseInt(mode, 8); - p = path.resolve(p); - - try { - fs.mkdirSync(p, mode); - made = made || p; - } - catch (err0) { - switch (err0.code) { - case 'ENOENT' : - made = sync(path.dirname(p), mode, made); - sync(p, mode, made); - break; - - // In the case of any other error, just see if there's a dir - // there already. If so, then hooray! If not, then something - // is borked. - default: - var stat; - try { - stat = fs.statSync(p); - } - catch (err1) { - throw err0; - } - if (!stat.isDirectory()) throw err0; - break; - } - } - - return made; -}; diff --git a/node_modules/jade/node_modules/mkdirp/package.json b/node_modules/jade/node_modules/mkdirp/package.json deleted file mode 100644 index 8772a1f..0000000 --- a/node_modules/jade/node_modules/mkdirp/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "mkdirp", - "description": "Recursively mkdir, like `mkdir -p`", - "version": "0.3.4", - "author": { - "name": "James Halliday", - "email": "mail@substack.net", - "url": "http://substack.net" - }, - "main": "./index", - "keywords": [ - "mkdir", - "directory" - ], - "repository": { - "type": "git", - "url": "http://github.com/substack/node-mkdirp.git" - }, - "scripts": { - "test": "tap test/*.js" - }, - "devDependencies": { - "tap": "~0.2.4" - }, - "license": "MIT/X11", - "engines": { - "node": "*" - }, - "readme": "mkdirp\n======\n\nLike `mkdir -p`, but in node.js!\n\n[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp)\n\nexample\n=======\n\npow.js\n------\n var mkdirp = require('mkdirp');\n \n mkdirp('/tmp/foo/bar/baz', function (err) {\n if (err) console.error(err)\n else console.log('pow!')\n });\n\nOutput\n pow!\n\nAnd now /tmp/foo/bar/baz exists, huzzah!\n\nmethods\n=======\n\nvar mkdirp = require('mkdirp');\n\nmkdirp(dir, mode, cb)\n---------------------\n\nCreate a new directory and any necessary subdirectories at `dir` with octal\npermission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\n`cb(err, made)` fires with the error or the first directory `made`\nthat had to be created, if any.\n\nmkdirp.sync(dir, mode)\n----------------------\n\nSynchronously create a new directory and any necessary subdirectories at `dir`\nwith octal permission string `mode`.\n\nIf `mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\nReturns the first directory that had to be created, if any.\n\ninstall\n=======\n\nWith [npm](http://npmjs.org) do:\n\n npm install mkdirp\n\nlicense\n=======\n\nMIT/X11\n", - "_id": "mkdirp@0.3.4", - "dist": { - "shasum": "c039e4133209fbeba85f2acd7e8dc6f5838a8c21" - }, - "_from": "mkdirp@0.3.x" -} diff --git a/node_modules/jade/node_modules/mkdirp/test/chmod.js b/node_modules/jade/node_modules/mkdirp/test/chmod.js deleted file mode 100644 index 520dcb8..0000000 --- a/node_modules/jade/node_modules/mkdirp/test/chmod.js +++ /dev/null @@ -1,38 +0,0 @@ -var mkdirp = require('../').mkdirp; -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -var ps = [ '', 'tmp' ]; - -for (var i = 0; i < 25; i++) { - var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - ps.push(dir); -} - -var file = ps.join('/'); - -test('chmod-pre', function (t) { - var mode = 0744 - mkdirp(file, mode, function (er) { - t.ifError(er, 'should not error'); - fs.stat(file, function (er, stat) { - t.ifError(er, 'should exist'); - t.ok(stat && stat.isDirectory(), 'should be directory'); - t.equal(stat && stat.mode & 0777, mode, 'should be 0744'); - t.end(); - }); - }); -}); - -test('chmod', function (t) { - var mode = 0755 - mkdirp(file, mode, function (er) { - t.ifError(er, 'should not error'); - fs.stat(file, function (er, stat) { - t.ifError(er, 'should exist'); - t.ok(stat && stat.isDirectory(), 'should be directory'); - t.end(); - }); - }); -}); diff --git a/node_modules/jade/node_modules/mkdirp/test/clobber.js b/node_modules/jade/node_modules/mkdirp/test/clobber.js deleted file mode 100644 index 0eb7099..0000000 --- a/node_modules/jade/node_modules/mkdirp/test/clobber.js +++ /dev/null @@ -1,37 +0,0 @@ -var mkdirp = require('../').mkdirp; -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -var ps = [ '', 'tmp' ]; - -for (var i = 0; i < 25; i++) { - var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - ps.push(dir); -} - -var file = ps.join('/'); - -// a file in the way -var itw = ps.slice(0, 3).join('/'); - - -test('clobber-pre', function (t) { - console.error("about to write to "+itw) - fs.writeFileSync(itw, 'I AM IN THE WAY, THE TRUTH, AND THE LIGHT.'); - - fs.stat(itw, function (er, stat) { - t.ifError(er) - t.ok(stat && stat.isFile(), 'should be file') - t.end() - }) -}) - -test('clobber', function (t) { - t.plan(2); - mkdirp(file, 0755, function (err) { - t.ok(err); - t.equal(err.code, 'ENOTDIR'); - t.end(); - }); -}); diff --git a/node_modules/jade/node_modules/mkdirp/test/mkdirp.js b/node_modules/jade/node_modules/mkdirp/test/mkdirp.js deleted file mode 100644 index b07cd70..0000000 --- a/node_modules/jade/node_modules/mkdirp/test/mkdirp.js +++ /dev/null @@ -1,28 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('woo', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - mkdirp(file, 0755, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }) - }); -}); diff --git a/node_modules/jade/node_modules/mkdirp/test/perm.js b/node_modules/jade/node_modules/mkdirp/test/perm.js deleted file mode 100644 index 23a7abb..0000000 --- a/node_modules/jade/node_modules/mkdirp/test/perm.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('async perm', function (t) { - t.plan(2); - var file = '/tmp/' + (Math.random() * (1<<30)).toString(16); - - mkdirp(file, 0755, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }) - }); -}); - -test('async root perm', function (t) { - mkdirp('/tmp', 0755, function (err) { - if (err) t.fail(err); - t.end(); - }); - t.end(); -}); diff --git a/node_modules/jade/node_modules/mkdirp/test/perm_sync.js b/node_modules/jade/node_modules/mkdirp/test/perm_sync.js deleted file mode 100644 index f685f60..0000000 --- a/node_modules/jade/node_modules/mkdirp/test/perm_sync.js +++ /dev/null @@ -1,39 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('sync perm', function (t) { - t.plan(2); - var file = '/tmp/' + (Math.random() * (1<<30)).toString(16) + '.json'; - - mkdirp.sync(file, 0755); - path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }); -}); - -test('sync root perm', function (t) { - t.plan(1); - - var file = '/tmp'; - mkdirp.sync(file, 0755); - path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }); -}); diff --git a/node_modules/jade/node_modules/mkdirp/test/race.js b/node_modules/jade/node_modules/mkdirp/test/race.js deleted file mode 100644 index 96a0447..0000000 --- a/node_modules/jade/node_modules/mkdirp/test/race.js +++ /dev/null @@ -1,41 +0,0 @@ -var mkdirp = require('../').mkdirp; -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('race', function (t) { - t.plan(4); - var ps = [ '', 'tmp' ]; - - for (var i = 0; i < 25; i++) { - var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - ps.push(dir); - } - var file = ps.join('/'); - - var res = 2; - mk(file, function () { - if (--res === 0) t.end(); - }); - - mk(file, function () { - if (--res === 0) t.end(); - }); - - function mk (file, cb) { - mkdirp(file, 0755, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - if (cb) cb(); - } - }) - }) - }); - } -}); diff --git a/node_modules/jade/node_modules/mkdirp/test/rel.js b/node_modules/jade/node_modules/mkdirp/test/rel.js deleted file mode 100644 index 7985824..0000000 --- a/node_modules/jade/node_modules/mkdirp/test/rel.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('rel', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var cwd = process.cwd(); - process.chdir('/tmp'); - - var file = [x,y,z].join('/'); - - mkdirp(file, 0755, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - process.chdir(cwd); - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }) - }); -}); diff --git a/node_modules/jade/node_modules/mkdirp/test/return.js b/node_modules/jade/node_modules/mkdirp/test/return.js deleted file mode 100644 index bce68e5..0000000 --- a/node_modules/jade/node_modules/mkdirp/test/return.js +++ /dev/null @@ -1,25 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('return value', function (t) { - t.plan(4); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - // should return the first dir created. - // By this point, it would be profoundly surprising if /tmp didn't - // already exist, since every other test makes things in there. - mkdirp(file, function (err, made) { - t.ifError(err); - t.equal(made, '/tmp/' + x); - mkdirp(file, function (err, made) { - t.ifError(err); - t.equal(made, null); - }); - }); -}); diff --git a/node_modules/jade/node_modules/mkdirp/test/return_sync.js b/node_modules/jade/node_modules/mkdirp/test/return_sync.js deleted file mode 100644 index 7c222d3..0000000 --- a/node_modules/jade/node_modules/mkdirp/test/return_sync.js +++ /dev/null @@ -1,24 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('return value', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - // should return the first dir created. - // By this point, it would be profoundly surprising if /tmp didn't - // already exist, since every other test makes things in there. - // Note that this will throw on failure, which will fail the test. - var made = mkdirp.sync(file); - t.equal(made, '/tmp/' + x); - - // making the same file again should have no effect. - made = mkdirp.sync(file); - t.equal(made, null); -}); diff --git a/node_modules/jade/node_modules/mkdirp/test/root.js b/node_modules/jade/node_modules/mkdirp/test/root.js deleted file mode 100644 index 97ad7a2..0000000 --- a/node_modules/jade/node_modules/mkdirp/test/root.js +++ /dev/null @@ -1,18 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('root', function (t) { - // '/' on unix, 'c:/' on windows. - var file = path.resolve('/'); - - mkdirp(file, 0755, function (err) { - if (err) throw err - fs.stat(file, function (er, stat) { - if (er) throw er - t.ok(stat.isDirectory(), 'target is a directory'); - t.end(); - }) - }); -}); diff --git a/node_modules/jade/node_modules/mkdirp/test/sync.js b/node_modules/jade/node_modules/mkdirp/test/sync.js deleted file mode 100644 index 7530cad..0000000 --- a/node_modules/jade/node_modules/mkdirp/test/sync.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('sync', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - try { - mkdirp.sync(file, 0755); - } catch (err) { - t.fail(err); - return t.end(); - } - - path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0755); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }); - }); -}); diff --git a/node_modules/jade/node_modules/mkdirp/test/umask.js b/node_modules/jade/node_modules/mkdirp/test/umask.js deleted file mode 100644 index 64ccafe..0000000 --- a/node_modules/jade/node_modules/mkdirp/test/umask.js +++ /dev/null @@ -1,28 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('implicit mode from umask', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - mkdirp(file, function (err) { - if (err) t.fail(err); - else path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, 0777 & (~process.umask())); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }) - }) - }); -}); diff --git a/node_modules/jade/node_modules/mkdirp/test/umask_sync.js b/node_modules/jade/node_modules/mkdirp/test/umask_sync.js deleted file mode 100644 index 35bd5cb..0000000 --- a/node_modules/jade/node_modules/mkdirp/test/umask_sync.js +++ /dev/null @@ -1,32 +0,0 @@ -var mkdirp = require('../'); -var path = require('path'); -var fs = require('fs'); -var test = require('tap').test; - -test('umask sync modes', function (t) { - t.plan(2); - var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16); - - var file = '/tmp/' + [x,y,z].join('/'); - - try { - mkdirp.sync(file); - } catch (err) { - t.fail(err); - return t.end(); - } - - path.exists(file, function (ex) { - if (!ex) t.fail('file not created') - else fs.stat(file, function (err, stat) { - if (err) t.fail(err) - else { - t.equal(stat.mode & 0777, (0777 & (~process.umask()))); - t.ok(stat.isDirectory(), 'target not a directory'); - t.end(); - } - }); - }); -}); diff --git a/node_modules/jade/package.json b/node_modules/jade/package.json deleted file mode 100644 index 0e46d88..0000000 --- a/node_modules/jade/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "name": "jade", - "description": "Jade template engine", - "version": "0.28.1", - "author": { - "name": "TJ Holowaychuk", - "email": "tj@vision-media.ca" - }, - "repository": { - "type": "git", - "url": "git://github.com/visionmedia/jade" - }, - "main": "./index.js", - "bin": { - "jade": "./bin/jade" - }, - "man": [ - "./jade.1" - ], - "dependencies": { - "commander": "0.6.1", - "mkdirp": "0.3.x", - "coffee-script": "~1.4.0" - }, - "devDependencies": { - "mocha": "*", - "markdown": "*", - "stylus": "*", - "uubench": "*", - "should": "*", - "less": "*", - "uglify-js": "*" - }, - "component": { - "scripts": { - "jade": "runtime.js" - } - }, - "scripts": { - "prepublish": "npm prune" - }, - "readme": " [![Build Status](https://secure.travis-ci.org/visionmedia/jade.png)](http://travis-ci.org/visionmedia/jade)\n\n# Jade - template engine\n\n Jade is a high performance template engine heavily influenced by [Haml](http://haml-lang.com)\n and implemented with JavaScript for [node](http://nodejs.org). For discussion join the [Google Group](http://groups.google.com/group/jadejs).\n\n## Test drive\n\n You can test drive Jade online [here](http://naltatis.github.com/jade-syntax-docs).\n\n## README Contents\n\n- [Features](#a1)\n- [Implementations](#a2)\n- [Installation](#a3)\n- [Browser Support](#a4)\n- [Public API](#a5)\n- [Syntax](#a6)\n - [Line Endings](#a6-1)\n - [Tags](#a6-2)\n - [Tag Text](#a6-3)\n - [Comments](#a6-4)\n - [Block Comments](#a6-5)\n - [Nesting](#a6-6)\n - [Block Expansion](#a6-7)\n - [Case](#a6-8)\n - [Attributes](#a6-9)\n - [HTML](#a6-10)\n - [Doctypes](#a6-11)\n- [Filters](#a7)\n- [Code](#a8)\n- [Iteration](#a9)\n- [Conditionals](#a10)\n- [Template inheritance](#a11)\n- [Block append / prepend](#a12)\n- [Includes](#a13)\n- [Mixins](#a14)\n- [Generated Output](#a15)\n- [Example Makefile](#a16)\n- [jade(1)](#a17)\n- [Tutorials](#a18)\n- [License](#a19)\n\n\n## Features\n\n - client-side support\n - great readability\n - flexible indentation\n - block-expansion\n - mixins\n - static includes\n - attribute interpolation\n - code is escaped by default for security\n - contextual error reporting at compile & run time\n - executable for compiling jade templates via the command line\n - html 5 mode (the default doctype)\n - optional memory caching\n - combine dynamic and static tag classes\n - parse tree manipulation via _filters_\n - template inheritance\n - block append / prepend\n - supports [Express JS](http://expressjs.com) out of the box\n - transparent iteration over objects, arrays, and even non-enumerables via `each`\n - block comments\n - no tag prefix\n - filters\n - :stylus must have [stylus](http://github.com/LearnBoost/stylus) installed\n - :less must have [less.js](http://github.com/cloudhead/less.js) installed\n - :markdown must have [markdown-js](http://github.com/evilstreak/markdown-js), [node-discount](http://github.com/visionmedia/node-discount), or [marked](http://github.com/chjj/marked) installed\n - :cdata\n - :coffeescript must have [coffee-script](http://jashkenas.github.com/coffee-script/) installed\n - [Emacs Mode](https://github.com/brianc/jade-mode)\n - [Vim Syntax](https://github.com/digitaltoad/vim-jade)\n - [TextMate Bundle](http://github.com/miksago/jade-tmbundle)\n - [Coda/SubEtha syntax Mode](https://github.com/aaronmccall/jade.mode)\n - [Screencasts](http://tjholowaychuk.com/post/1004255394/jade-screencast-template-engine-for-nodejs)\n - [html2jade](https://github.com/donpark/html2jade) converter\n\n\n## Implementations\n\n - [php](http://github.com/everzet/jade.php)\n - [scala](http://scalate.fusesource.org/versions/snapshot/documentation/scaml-reference.html)\n - [ruby](http://github.com/stonean/slim)\n - [python](https://github.com/SyrusAkbary/pyjade)\n - [java](https://github.com/neuland/jade4j)\n\n\n## Installation\n\nvia npm:\n\n```bash\n$ npm install jade\n```\n\n\n## Browser Support\n\n To compile jade to a single file compatible for client-side use simply execute:\n\n```bash\n$ make jade.js\n```\n\n Alternatively, if uglifyjs is installed via npm (`npm install uglify-js`) you may execute the following which will create both files. However each release builds these for you.\n\n```bash\n$ make jade.min.js\n```\n\n By default Jade instruments templates with line number statements such as `__.lineno = 3` for debugging purposes. When used in a browser it's useful to minimize this boiler plate, you can do so by passing the option `{ compileDebug: false }`. The following template\n\n```jade\np Hello #{name}\n```\n\n Can then be as small as the following generated function:\n\n```js\nfunction anonymous(locals, attrs, escape, rethrow) {\n var buf = [];\n with (locals || {}) {\n var interp;\n buf.push('\\n

    Hello ' + escape((interp = name) == null ? '' : interp) + '\\n

    ');\n }\n return buf.join(\"\");\n}\n```\n\n Through the use of Jade's `./runtime.js` you may utilize these pre-compiled templates on the client-side _without_ Jade itself, all you need is the associated utility functions (in runtime.js), which are then available as `jade.attrs`, `jade.escape` etc. To enable this you should pass `{ client: true }` to `jade.compile()` to tell Jade to reference the helper functions\n via `jade.attrs`, `jade.escape` etc.\n\n```js\nfunction anonymous(locals, attrs, escape, rethrow) {\n var attrs = jade.attrs, escape = jade.escape, rethrow = jade.rethrow;\n var buf = [];\n with (locals || {}) {\n var interp;\n buf.push('\\n

    Hello ' + escape((interp = name) == null ? '' : interp) + '\\n

    ');\n }\n return buf.join(\"\");\n}\n```\n\n
    \n## Public API\n\n```js\nvar jade = require('jade');\n\n// Compile a function\nvar fn = jade.compile('string of jade', options);\nfn(locals);\n```\n\n### Options\n\n - `self` Use a `self` namespace to hold the locals _(false by default)_\n - `locals` Local variable object\n - `filename` Used in exceptions, and required when using includes\n - `debug` Outputs tokens and function body generated\n - `compiler` Compiler to replace jade's default\n - `compileDebug` When `false` no debug instrumentation is compiled\n - `pretty` Add pretty-indentation whitespace to output _(false by default)_\n\n\n## Syntax\n\n\n### Line Endings\n\n**CRLF** and **CR** are converted to **LF** before parsing.\n\n\n### Tags\n\nA tag is simply a leading word:\n\n```jade\nhtml\n```\n\nfor example is converted to ``\n\ntags can also have ids:\n\n```jade\ndiv#container\n```\n\nwhich would render `
    `\n\nhow about some classes?\n\n```jade\ndiv.user-details\n```\n\nrenders `
    `\n\nmultiple classes? _and_ an id? sure:\n\n```jade\ndiv#foo.bar.baz\n```\n\nrenders `
    `\n\ndiv div div sure is annoying, how about:\n\n```jade\n#foo\n.bar\n```\n\nwhich is syntactic sugar for what we have already been doing, and outputs:\n\n```html\n
    \n```\n\n
    \n### Tag Text\n\nSimply place some content after the tag:\n\n```jade\np wahoo!\n```\n\nrenders `

    wahoo!

    `.\n\nwell cool, but how about large bodies of text:\n\n```jade\np\n | foo bar baz\n | rawr rawr\n | super cool\n | go jade go\n```\n\nrenders `

    foo bar baz rawr.....

    `\n\ninterpolation? yup! both types of text can utilize interpolation,\nif we passed `{ name: 'tj', email: 'tj@vision-media.ca' }` to the compiled function we can do the following:\n\n```jade\n#user #{name} <#{email}>\n```\n\noutputs `
    tj <tj@vision-media.ca>
    `\n\nActually want `#{}` for some reason? escape it!\n\n```jade\np \\#{something}\n```\n\nnow we have `

    #{something}

    `\n\nWe can also utilize the unescaped variant `!{html}`, so the following\nwill result in a literal script tag:\n\n```jade\n- var html = \"\"\n| !{html}\n```\n\nNested tags that also contain text can optionally use a text block:\n\n```jade\nlabel\n | Username:\n input(name='user[name]')\n```\n\nor immediate tag text:\n\n```jade\nlabel Username:\n input(name='user[name]')\n```\n\nTags that accept _only_ text such as `script` and `style` do not\nneed the leading `|` character, for example:\n\n```jade\nhtml\n head\n title Example\n script\n if (foo) {\n bar();\n } else {\n baz();\n }\n```\n\nOnce again as an alternative, we may use a trailing `.` to indicate a text block, for example:\n\n```jade\np.\n foo asdf\n asdf\n asdfasdfaf\n asdf\n asd.\n```\n\noutputs:\n\n```html\n

    foo asdf\nasdf\n asdfasdfaf\n asdf\nasd.\n

    \n```\n\nThis however differs from a trailing `.` followed by a space, which although is ignored by the Jade parser, tells Jade that this period is a literal:\n\n```jade\np .\n```\n\noutputs:\n\n```html\n

    .

    \n```\n\nIt should be noted that text blocks should be doubled escaped. For example if you desire the following output.\n\n```html\n

    foo\\bar

    \n```\n\nuse:\n\n```jade\np.\n foo\\\\bar\n```\n\n
    \n### Comments\n\nSingle line comments currently look the same as JavaScript comments,\naka `//` and must be placed on their own line:\n\n```jade\n// just some paragraphs\np foo\np bar\n```\n\nwould output\n\n```html\n\n

    foo

    \n

    bar

    \n```\n\nJade also supports unbuffered comments, by simply adding a hyphen:\n\n```jade\n//- will not output within markup\np foo\np bar\n```\n\noutputting\n\n```html\n

    foo

    \n

    bar

    \n```\n\n
    \n### Block Comments\n\n A block comment is legal as well:\n\n```jade\nbody\n //\n #content\n h1 Example\n```\n\noutputting\n\n```html\n\n \n\n```\n\nJade supports conditional-comments as well, for example:\n\n```jade\nhead\n //if lt IE 8\n script(src='/ie-sucks.js')\n```\n\noutputs:\n\n```html\n\n \n\n```\n\n\n### Nesting\n\n Jade supports nesting to define the tags in a natural way:\n\n```jade\nul\n li.first\n a(href='#') foo\n li\n a(href='#') bar\n li.last\n a(href='#') baz\n```\n\n\n### Block Expansion\n\n Block expansion allows you to create terse single-line nested tags,\n the following example is equivalent to the nesting example above.\n\n```jade\nul\n li.first: a(href='#') foo\n li: a(href='#') bar\n li.last: a(href='#') baz\n```\n\n\n### Case\n\n The case statement takes the following form:\n\n```jade\nhtml\n body\n friends = 10\n case friends\n when 0\n p you have no friends\n when 1\n p you have a friend\n default\n p you have #{friends} friends\n```\n\n Block expansion may also be used:\n\n```jade\nfriends = 5\n\nhtml\n body\n case friends\n when 0: p you have no friends\n when 1: p you have a friend\n default: p you have #{friends} friends\n```\n\n\n### Attributes\n\nJade currently supports `(` and `)` as attribute delimiters.\n\n```jade\na(href='/login', title='View login page') Login\n```\n\nWhen a value is `undefined` or `null` the attribute is _not_ added,\nso this is fine, it will not compile `something=\"null\"`.\n\n```jade\ndiv(something=null)\n```\n\nBoolean attributes are also supported:\n\n```jade\ninput(type=\"checkbox\", checked)\n```\n\nBoolean attributes with code will only output the attribute when `true`:\n\n```jade\ninput(type=\"checkbox\", checked=someValue)\n```\n\nMultiple lines work too:\n\n```jade\ninput(type='checkbox',\n name='agreement',\n checked)\n```\n\nMultiple lines without the comma work fine:\n\n```jade\ninput(type='checkbox'\n name='agreement'\n checked)\n```\n\nFunky whitespace? fine:\n\n```jade\ninput(\n type='checkbox'\n name='agreement'\n checked)\n```\n\nColons work:\n\n```jade\nrss(xmlns:atom=\"atom\")\n```\n\nSuppose we have the `user` local `{ id: 12, name: 'tobi' }`\nand we wish to create an anchor tag with `href` pointing to \"/user/12\"\nwe could use regular javascript concatenation:\n\n```jade\na(href='/user/' + user.id)= user.name\n```\n\nor we could use jade's interpolation, which I added because everyone\nusing Ruby or CoffeeScript seems to think this is legal js..:\n\n```jade\na(href='/user/#{user.id}')= user.name\n```\n\nThe `class` attribute is special-cased when an array is given,\nallowing you to pass an array such as `bodyClasses = ['user', 'authenticated']` directly:\n\n```jade\nbody(class=bodyClasses)\n```\n\n\n### HTML\n\n Inline html is fine, we can use the pipe syntax to\n write arbitrary text, in this case some html:\n\n```jade\nhtml\n body\n |

    Title

    \n |

    foo bar baz

    \n```\n\n Or we can use the trailing `.` to indicate to Jade that we\n only want text in this block, allowing us to omit the pipes:\n\n```jade\nhtml\n body.\n

    Title

    \n

    foo bar baz

    \n```\n\n Both of these examples yield the same result:\n\n```html\n

    Title

    \n

    foo bar baz

    \n\n```\n\n The same rule applies for anywhere you can have text\n in jade, raw html is fine:\n\n```jade\nhtml\n body\n h1 User #{name}\n```\n\n
    \n### Doctypes\n\nTo add a doctype simply use `!!!`, or `doctype` followed by an optional value:\n\n```jade\n!!!\n```\n\nor\n\n```jade\ndoctype\n```\n\nWill output the _html 5_ doctype, however:\n\n```jade\n!!! transitional\n```\n\nWill output the _transitional_ doctype.\n\nDoctypes are case-insensitive, so the following are equivalent:\n\n```jade\ndoctype Basic\ndoctype basic\n```\n\nit's also possible to simply pass a doctype literal:\n\n```jade\ndoctype html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\n```\n\nyielding:\n\n```html\n\n```\n\nBelow are the doctypes defined by default, which can easily be extended:\n\n```js\nvar doctypes = exports.doctypes = {\n '5': '',\n 'default': '',\n 'xml': '',\n 'transitional': '',\n 'strict': '',\n 'frameset': '',\n '1.1': '',\n 'basic': '',\n 'mobile': ''\n};\n```\n\nTo alter the default simply change:\n\n```js\njade.doctypes.default = 'whatever you want';\n```\n\n\n## Filters\n\nFilters are prefixed with `:`, for example `:markdown` and\npass the following block of text to an arbitrary function for processing. View the _features_\nat the top of this document for available filters.\n\n```jade\nbody\n :markdown\n Woah! jade _and_ markdown, very **cool**\n we can even link to [stuff](http://google.com)\n```\n\nRenders:\n\n```html\n

    Woah! jade and markdown, very cool we can even link to stuff

    \n```\n\n\n## Code\n\nJade currently supports three classifications of executable code. The first\nis prefixed by `-`, and is not buffered:\n\n```jade\n- var foo = 'bar';\n```\n\nThis can be used for conditionals, or iteration:\n\n```jade\n- for (var key in obj)\n p= obj[key]\n```\n\nDue to Jade's buffering techniques the following is valid as well:\n\n```jade\n- if (foo)\n ul\n li yay\n li foo\n li worked\n- else\n p oh no! didnt work\n```\n\nHell, even verbose iteration:\n\n```jade\n- if (items.length)\n ul\n - items.forEach(function(item){\n li= item\n - })\n```\n\nAnything you want!\n\nNext up we have _escaped_ buffered code, which is used to\nbuffer a return value, which is prefixed by `=`:\n\n```jade\n- var foo = 'bar'\n= foo\nh1= foo\n```\n\nWhich outputs `bar

    bar

    `. Code buffered by `=` is escaped\nby default for security, however to output unescaped return values\nyou may use `!=`:\n\n```jade\np!= aVarContainingMoreHTML\n```\n\n Jade also has designer-friendly variants, making the literal JavaScript\n more expressive and declarative. For example the following assignments\n are equivalent, and the expression is still regular javascript:\n\n```jade\n- var foo = 'foo ' + 'bar'\nfoo = 'foo ' + 'bar'\n```\n\n Likewise Jade has first-class `if`, `else if`, `else`, `until`, `while`, `unless` among others, however you must remember that the expressions are still regular javascript:\n\n```jade\nif foo == 'bar'\n ul\n li yay\n li foo\n li worked\nelse\n p oh no! didnt work\n```\n\n
    \n## Iteration\n\n Along with vanilla JavaScript Jade also supports a subset of\n constructs that allow you to create more designer-friendly templates,\n one of these constructs is `each`, taking the form:\n\n```jade\neach VAL[, KEY] in OBJ\n```\n\nAn example iterating over an array:\n\n```jade\n- var items = [\"one\", \"two\", \"three\"]\neach item in items\n li= item\n```\n\noutputs:\n\n```html\n
  • one
  • \n
  • two
  • \n
  • three
  • \n```\n\niterating an array with index:\n\n```jade\nitems = [\"one\", \"two\", \"three\"]\neach item, i in items\n li #{item}: #{i}\n```\n\noutputs:\n\n```html\n
  • one: 0
  • \n
  • two: 1
  • \n
  • three: 2
  • \n```\n\niterating an object's keys and values:\n\n```jade\nobj = { foo: 'bar' }\neach val, key in obj\n li #{key}: #{val}\n```\n\nwould output `
  • foo: bar
  • `\n\nInternally Jade converts these statements to regular\nJavaScript loops such as `users.forEach(function(user){`,\nso lexical scope and nesting applies as it would with regular\nJavaScript:\n\n```jade\neach user in users\n each role in user.roles\n li= role\n```\n\n You may also use `for` if you prefer:\n\n```jade\nfor user in users\n for role in user.roles\n li= role\n```\n\n
    \n## Conditionals\n\n Jade conditionals are equivalent to those using the code (`-`) prefix,\n however allow you to ditch parenthesis to become more designer friendly,\n however keep in mind the expression given is _regular_ JavaScript:\n\n```jade\nfor user in users\n if user.role == 'admin'\n p #{user.name} is an admin\n else\n p= user.name\n```\n\n is equivalent to the following using vanilla JavaScript literals:\n\n```jade\nfor user in users\n - if (user.role == 'admin')\n p #{user.name} is an admin\n - else\n p= user.name\n```\n\n Jade also provides have `unless` which is equivalent to `if (!(expr))`:\n\n```jade\nfor user in users\n unless user.isAnonymous\n p\n | Click to view\n a(href='/users/' + user.id)= user.name\n```\n\n\n## Template inheritance\n\n Jade supports template inheritance via the `block` and `extends` keywords. A block is simply a \"block\" of Jade that may be replaced within a child template, this process is recursive. To activate template inheritance in Express 2.x you must add: `app.set('view options', { layout: false });`.\n\n Jade blocks can provide default content if desired, however optional as shown below by `block scripts`, `block content`, and `block foot`.\n\n```jade\nhtml\n head\n h1 My Site - #{title}\n block scripts\n script(src='/jquery.js')\n body\n block content\n block foot\n #footer\n p some footer content\n```\n\n Now to extend the layout, simply create a new file and use the `extends` directive as shown below, giving the path (with or without the .jade extension). You may now define one or more blocks that will override the parent block content, note that here the `foot` block is _not_ redefined and will output \"some footer content\".\n\n```jade\nextends layout\n\nblock scripts\n script(src='/jquery.js')\n script(src='/pets.js')\n\nblock content\n h1= title\n each pet in pets\n include pet\n```\n\n It's also possible to override a block to provide additional blocks, as shown in the following example where `content` now exposes a `sidebar` and `primary` block for overriding, or the child template could override `content` all together.\n\n```jade\nextends regular-layout\n\nblock content\n .sidebar\n block sidebar\n p nothing\n .primary\n block primary\n p nothing\n```\n\n\n## Block append / prepend\n\n Jade allows you to _replace_ (default), _prepend_, or _append_ blocks. Suppose for example you have default scripts in a \"head\" block that you wish to utilize on _every_ page, you might do this:\n\n```jade\nhtml\n head\n block head\n script(src='/vendor/jquery.js')\n script(src='/vendor/caustic.js')\n body\n block content\n```\n\n Now suppose you have a page of your application for a JavaScript game, you want some game related scripts as well as these defaults, you can simply `append` the block:\n\n```jade\nextends layout\n\nblock append head\n script(src='/vendor/three.js')\n script(src='/game.js')\n```\n\n When using `block append` or `block prepend` the `block` is optional:\n\n```jade\nextends layout\n\nappend head\n script(src='/vendor/three.js')\n script(src='/game.js')\n```\n\n\n## Includes\n\n Includes allow you to statically include chunks of Jade,\n or other content like css, or html which lives in separate files. The classical example is including a header and footer. Suppose we have the following directory structure:\n\n ./layout.jade\n ./includes/\n ./head.jade\n ./foot.jade\n\nand the following _layout.jade_:\n\n```jade\nhtml\n include includes/head\n body\n h1 My Site\n p Welcome to my super amazing site.\n include includes/foot\n```\n\nboth includes _includes/head_ and _includes/foot_ are\nread relative to the `filename` option given to _layout.jade_,\nwhich should be an absolute path to this file, however Express does this for you. Include then parses these files, and injects the AST produced to render what you would expect:\n\n```html\n\n \n My Site\n \n \n \n

    My Site

    \n

    Welcome to my super lame site.

    \n
    \n

    Copyright>(c) foobar

    \n
    \n \n\n```\n\n As mentioned `include` can be used to include other content\n such as html or css. By providing an extension Jade will not\n assume that the file is Jade source and will include it as\n a literal:\n\n```jade\nhtml\n body\n include content.html\n```\n\n Include directives may also accept a block, in which case the\n the given block will be appended to the _last_ block defined\n in the file. For example if `head.jade` contains:\n\n```jade\nhead\n script(src='/jquery.js')\n```\n\n We may append values by providing a block to `include head`\n as shown below, adding the two scripts.\n\n```jade\nhtml\n include head\n script(src='/foo.js')\n script(src='/bar.js')\n body\n h1 test\n```\n\n You may also `yield` within an included template, allowing you to explicitly mark where the block given to `include` will be placed. Suppose for example you wish to prepend scripts rather than append, you might do the following:\n\n```jade\nhead\n yield\n script(src='/jquery.js')\n script(src='/jquery.ui.js')\n```\n\n Since included Jade is parsed and literally merges the AST, lexically scoped variables function as if the included Jade was written right in the same file. This means `include` may be used as sort of partial, for example suppose we have `user.jade` which utilizes a `user` variable.\n\n```jade\nh1= user.name\np= user.occupation\n```\n\nWe could then simply `include user` while iterating users, and since the `user` variable is already defined within the loop the included template will have access to it.\n\n```jade\nusers = [{ name: 'Tobi', occupation: 'Ferret' }]\n\neach user in users\n .user\n include user\n```\n\nyielding:\n\n```html\n
    \n

    Tobi

    \n

    Ferret

    \n
    \n```\n\nIf we wanted to expose a different variable name as `user` since `user.jade` references that name, we could simply define a new variable as shown here with `user = person`:\n\n```jade\neach person in users\n .user\n user = person\n include user\n```\n\n
    \n## Mixins\n\n Mixins are converted to regular JavaScript functions in\n the compiled template that Jade constructs. Mixins may\n take arguments, though not required:\n\n```jade\nmixin list\n ul\n li foo\n li bar\n li baz\n```\n\n Utilizing a mixin without args looks similar, just without a block:\n\n```jade\nh2 Groceries\nmixin list\n```\n\n Mixins may take one or more arguments as well, the arguments\n are regular javascripts expressions, so for example the following:\n\n```jade\nmixin pets(pets)\n ul.pets\n - each pet in pets\n li= pet\n\nmixin profile(user)\n .user\n h2= user.name\n mixin pets(user.pets)\n```\n\n Would yield something similar to the following html:\n\n```html\n
    \n

    tj

    \n
      \n
    • tobi
    • \n
    • loki
    • \n
    • jane
    • \n
    • manny
    • \n
    \n
    \n```\n\n
    \n## Generated Output\n\n Suppose we have the following Jade:\n\n```jade\n- var title = 'yay'\nh1.title #{title}\np Just an example\n```\n\n When the `compileDebug` option is not explicitly `false`, Jade\n will compile the function instrumented with `__.lineno = n;`, which\n in the event of an exception is passed to `rethrow()` which constructs\n a useful message relative to the initial Jade input.\n\n```js\nfunction anonymous(locals) {\n var __ = { lineno: 1, input: \"- var title = 'yay'\\nh1.title #{title}\\np Just an example\", filename: \"testing/test.js\" };\n var rethrow = jade.rethrow;\n try {\n var attrs = jade.attrs, escape = jade.escape;\n var buf = [];\n with (locals || {}) {\n var interp;\n __.lineno = 1;\n var title = 'yay'\n __.lineno = 2;\n buf.push('');\n buf.push('' + escape((interp = title) == null ? '' : interp) + '');\n buf.push('');\n __.lineno = 3;\n buf.push('

    ');\n buf.push('Just an example');\n buf.push('

    ');\n }\n return buf.join(\"\");\n } catch (err) {\n rethrow(err, __.input, __.filename, __.lineno);\n }\n}\n```\n\nWhen the `compileDebug` option _is_ explicitly `false`, this instrumentation\nis stripped, which is very helpful for light-weight client-side templates. Combining Jade's options with the `./runtime.js` file in this repo allows you\nto toString() compiled templates and avoid running the entire Jade library on\nthe client, increasing performance, and decreasing the amount of JavaScript\nrequired.\n\n```js\nfunction anonymous(locals) {\n var attrs = jade.attrs, escape = jade.escape;\n var buf = [];\n with (locals || {}) {\n var interp;\n var title = 'yay'\n buf.push('');\n buf.push('' + escape((interp = title) == null ? '' : interp) + '');\n buf.push('');\n buf.push('

    ');\n buf.push('Just an example');\n buf.push('

    ');\n }\n return buf.join(\"\");\n}\n```\n\n
    \n## Example Makefile\n\n Below is an example Makefile used to compile _pages/*.jade_\n into _pages/*.html_ files by simply executing `make`.\n\n```make\nJADE = $(shell find pages/*.jade)\nHTML = $(JADE:.jade=.html)\n\nall: $(HTML)\n\n%.html: %.jade\n jade < $< --path $< > $@\n\nclean:\n rm -f $(HTML)\n\n.PHONY: clean\n```\n\nthis can be combined with the `watch(1)` command to produce\na watcher-like behaviour:\n\n```bash\n$ watch make\n```\n\n\n## jade(1)\n\n```\n\nUsage: jade [options] [dir|file ...]\n\nOptions:\n\n -h, --help output usage information\n -V, --version output the version number\n -o, --obj javascript options object\n -O, --out output the compiled html to \n -p, --path filename used to resolve includes\n -P, --pretty compile pretty html output\n -c, --client compile for client-side runtime.js\n -D, --no-debug compile without debugging (smaller functions)\n\nExamples:\n\n # translate jade the templates dir\n $ jade templates\n\n # create {foo,bar}.html\n $ jade {foo,bar}.jade\n\n # jade over stdio\n $ jade < my.jade > my.html\n\n # jade over stdio\n $ echo \"h1 Jade!\" | jade\n\n # foo, bar dirs rendering to /tmp\n $ jade foo bar --out /tmp\n\n```\n\n\n## Tutorials\n\n - cssdeck interactive [Jade syntax tutorial](http://cssdeck.com/labs/learning-the-jade-templating-engine-syntax)\n - cssdeck interactive [Jade logic tutorial](http://cssdeck.com/labs/jade-templating-tutorial-codecast-part-2)\n - in [Japanese](http://blog.craftgear.net/4f501e97c1347ec934000001/title/10%E5%88%86%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8Bjade%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3)\n\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2009-2010 TJ Holowaychuk <tj@vision-media.ca>\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n'Software'), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n", - "_id": "jade@0.28.1", - "dist": { - "shasum": "39b19c3d637f74aae346ee0b8df6cb3f22f5689f" - }, - "_from": "jade@*" -} diff --git a/node_modules/jade/runtime.js b/node_modules/jade/runtime.js deleted file mode 100644 index 0f54907..0000000 --- a/node_modules/jade/runtime.js +++ /dev/null @@ -1,179 +0,0 @@ - -jade = (function(exports){ -/*! - * Jade - runtime - * Copyright(c) 2010 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Lame Array.isArray() polyfill for now. - */ - -if (!Array.isArray) { - Array.isArray = function(arr){ - return '[object Array]' == Object.prototype.toString.call(arr); - }; -} - -/** - * Lame Object.keys() polyfill for now. - */ - -if (!Object.keys) { - Object.keys = function(obj){ - var arr = []; - for (var key in obj) { - if (obj.hasOwnProperty(key)) { - arr.push(key); - } - } - return arr; - } -} - -/** - * Merge two attribute objects giving precedence - * to values in object `b`. Classes are special-cased - * allowing for arrays and merging/joining appropriately - * resulting in a string. - * - * @param {Object} a - * @param {Object} b - * @return {Object} a - * @api private - */ - -exports.merge = function merge(a, b) { - var ac = a['class']; - var bc = b['class']; - - if (ac || bc) { - ac = ac || []; - bc = bc || []; - if (!Array.isArray(ac)) ac = [ac]; - if (!Array.isArray(bc)) bc = [bc]; - ac = ac.filter(nulls); - bc = bc.filter(nulls); - a['class'] = ac.concat(bc).join(' '); - } - - for (var key in b) { - if (key != 'class') { - a[key] = b[key]; - } - } - - return a; -}; - -/** - * Filter null `val`s. - * - * @param {Mixed} val - * @return {Mixed} - * @api private - */ - -function nulls(val) { - return val != null; -} - -/** - * Render the given attributes object. - * - * @param {Object} obj - * @param {Object} escaped - * @return {String} - * @api private - */ - -exports.attrs = function attrs(obj, escaped){ - var buf = [] - , terse = obj.terse; - - delete obj.terse; - var keys = Object.keys(obj) - , len = keys.length; - - if (len) { - buf.push(''); - for (var i = 0; i < len; ++i) { - var key = keys[i] - , val = obj[key]; - - if ('boolean' == typeof val || null == val) { - if (val) { - terse - ? buf.push(key) - : buf.push(key + '="' + key + '"'); - } - } else if (0 == key.indexOf('data') && 'string' != typeof val) { - buf.push(key + "='" + JSON.stringify(val) + "'"); - } else if ('class' == key && Array.isArray(val)) { - buf.push(key + '="' + exports.escape(val.join(' ')) + '"'); - } else if (escaped && escaped[key]) { - buf.push(key + '="' + exports.escape(val) + '"'); - } else { - buf.push(key + '="' + val + '"'); - } - } - } - - return buf.join(' '); -}; - -/** - * Escape the given string of `html`. - * - * @param {String} html - * @return {String} - * @api private - */ - -exports.escape = function escape(html){ - return String(html) - .replace(/&(?!(\w+|\#\d+);)/g, '&') - .replace(//g, '>') - .replace(/"/g, '"'); -}; - -/** - * Re-throw the given `err` in context to the - * the jade in `filename` at the given `lineno`. - * - * @param {Error} err - * @param {String} filename - * @param {String} lineno - * @api private - */ - -exports.rethrow = function rethrow(err, filename, lineno){ - if (!filename) throw err; - - var context = 3 - , str = require('fs').readFileSync(filename, 'utf8') - , lines = str.split('\n') - , start = Math.max(lineno - context, 0) - , end = Math.min(lines.length, lineno + context); - - // Error context - var context = lines.slice(start, end).map(function(line, i){ - var curr = i + start + 1; - return (curr == lineno ? ' > ' : ' ') - + curr - + '| ' - + line; - }).join('\n'); - - // Alter exception message - err.path = filename; - err.message = (filename || 'Jade') + ':' + lineno - + '\n' + context + '\n\n' + err.message; - throw err; -}; - - return exports; - -})({}); diff --git a/node_modules/jade/runtime.min.js b/node_modules/jade/runtime.min.js deleted file mode 100644 index 1714efb..0000000 --- a/node_modules/jade/runtime.min.js +++ /dev/null @@ -1 +0,0 @@ -jade=function(exports){Array.isArray||(Array.isArray=function(arr){return"[object Array]"==Object.prototype.toString.call(arr)}),Object.keys||(Object.keys=function(obj){var arr=[];for(var key in obj)obj.hasOwnProperty(key)&&arr.push(key);return arr}),exports.merge=function merge(a,b){var ac=a["class"],bc=b["class"];if(ac||bc)ac=ac||[],bc=bc||[],Array.isArray(ac)||(ac=[ac]),Array.isArray(bc)||(bc=[bc]),ac=ac.filter(nulls),bc=bc.filter(nulls),a["class"]=ac.concat(bc).join(" ");for(var key in b)key!="class"&&(a[key]=b[key]);return a};function nulls(val){return val!=null}return exports.attrs=function attrs(obj,escaped){var buf=[],terse=obj.terse;delete obj.terse;var keys=Object.keys(obj),len=keys.length;if(len){buf.push("");for(var i=0;i/g,">").replace(/"/g,""")},exports.rethrow=function rethrow(err,filename,lineno){if(!filename)throw err;var context=3,str=require("fs").readFileSync(filename,"utf8"),lines=str.split("\n"),start=Math.max(lineno-context,0),end=Math.min(lines.length,lineno+context),context=lines.slice(start,end).map(function(line,i){var curr=i+start+1;return(curr==lineno?" > ":" ")+curr+"| "+line}).join("\n");throw err.path=filename,err.message=(filename||"Jade")+":"+lineno+"\n"+context+"\n\n"+err.message,err},exports}({}); \ No newline at end of file diff --git a/node_modules/jade/testing/index.html b/node_modules/jade/testing/index.html deleted file mode 100644 index 105c9f4..0000000 --- a/node_modules/jade/testing/index.html +++ /dev/null @@ -1,5 +0,0 @@ - \ No newline at end of file diff --git a/node_modules/jade/testing/index.jade b/node_modules/jade/testing/index.jade deleted file mode 100644 index a22e82a..0000000 --- a/node_modules/jade/testing/index.jade +++ /dev/null @@ -1,4 +0,0 @@ - -html - body - include some.js diff --git a/node_modules/jade/testing/layout.html b/node_modules/jade/testing/layout.html deleted file mode 100644 index cbbfc7a..0000000 --- a/node_modules/jade/testing/layout.html +++ /dev/null @@ -1 +0,0 @@ -Application \ No newline at end of file diff --git a/node_modules/jade/testing/layout.jade b/node_modules/jade/testing/layout.jade deleted file mode 100644 index a48765c..0000000 --- a/node_modules/jade/testing/layout.jade +++ /dev/null @@ -1,6 +0,0 @@ -!!! 5 -html - head - title Application - body - block content diff --git a/node_modules/jade/testing/mobile.html b/node_modules/jade/testing/mobile.html deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/jade/testing/mobile.jade b/node_modules/jade/testing/mobile.jade deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/jade/testing/nested/something.html b/node_modules/jade/testing/nested/something.html deleted file mode 100644 index d6b0493..0000000 --- a/node_modules/jade/testing/nested/something.html +++ /dev/null @@ -1 +0,0 @@ -

    out

    \ No newline at end of file diff --git a/node_modules/jade/testing/nested/something.jade b/node_modules/jade/testing/nested/something.jade deleted file mode 100644 index 552c797..0000000 --- a/node_modules/jade/testing/nested/something.jade +++ /dev/null @@ -1 +0,0 @@ -p out \ No newline at end of file diff --git a/node_modules/jade/testing/some.js b/node_modules/jade/testing/some.js deleted file mode 100644 index 3104e71..0000000 --- a/node_modules/jade/testing/some.js +++ /dev/null @@ -1,4 +0,0 @@ - -if (something) { - something('hey'); -} diff --git a/node_modules/jade/testing/test.md b/node_modules/jade/testing/test.md deleted file mode 100644 index 9af1bb2..0000000 --- a/node_modules/jade/testing/test.md +++ /dev/null @@ -1,5 +0,0 @@ -Just a _test_ of some **markdown**: - - - foo - - bar - - baz diff --git a/node_modules/jsdom/.travis.yml b/node_modules/jsdom/.travis.yml deleted file mode 100644 index baa0031..0000000 --- a/node_modules/jsdom/.travis.yml +++ /dev/null @@ -1,3 +0,0 @@ -language: node_js -node_js: - - 0.8 diff --git a/node_modules/jsdom/LICENSE.txt b/node_modules/jsdom/LICENSE.txt deleted file mode 100644 index 0dbd429..0000000 --- a/node_modules/jsdom/LICENSE.txt +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2010 Elijah Insua - -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/node_modules/jsdom/README.md b/node_modules/jsdom/README.md deleted file mode 100644 index 314bb14..0000000 --- a/node_modules/jsdom/README.md +++ /dev/null @@ -1,310 +0,0 @@ -# jsdom - -A JavaScript implementation of the W3C DOM. - -## Install - -```bash -$ npm install jsdom -``` - -## Human contact - -see: [mailing list](http://groups.google.com/group/jsdom) - -## Easymode - -Bootstrapping a DOM is generally a difficult process involving many error prone steps. We didn't want jsdom to fall into the same trap and that is why a new method, `jsdom.env()`, has been added in jsdom 0.2.0 which should make everyone's lives easier. - -with URL - -```js -// Count all of the links from the nodejs build page -var jsdom = require("jsdom"); - -jsdom.env( - "http://nodejs.org/dist/", - ["http://code.jquery.com/jquery.js"], - function (errors, window) { - console.log("there have been", window.$("a").length, "nodejs releases!"); - } -); -``` - -or with raw HTML - -```js -// Run some jQuery on a html fragment -var jsdom = require("jsdom"); - -jsdom.env( - '

    jsdom\'s Homepage

    ', - ["http://code.jquery.com/jquery.js"], - function(errors, window) { - console.log("contents of a.the-link:", window.$("a.the-link").text()); - } -); -``` - -or with a configuration object - -```js -// Print all of the news items on hackernews -var jsdom = require("jsdom"); - -jsdom.env({ - html: "http://news.ycombinator.com/", - scripts: ["http://code.jquery.com/jquery.js"], - done: function (errors, window) { - var $ = window.$; - console.log("HN Links"); - $("td.title:not(:last) a").each(function() { - console.log(" -", $(this).text()); - }); - } -}); -``` - -or with raw JavaScript source - -```js -// Print all of the news items on hackernews -var jsdom = require("jsdom"); -var fs = require("fs"); -var jquery = fs.readFileSync("./jquery.js").toString(); - -jsdom.env({ - html: "http://news.ycombinator.com/", - src: [jquery], - done: function (errors, window) { - var $ = window.$; - console.log("HN Links"); - $("td.title:not(:last) a").each(function() { - console.log(" -", $(this).text()); - }); - } -}); -``` - -### How it works -`jsdom.env` is built for ease of use, which is rare in the world of the DOM! Since the web has some absolutely horrible JavaScript on it, as of jsdom 0.2.0 `jsdom.env` will not process external resources (scripts, images, etc). If you want to process the JavaScript use one of the methods below (`jsdom.jsdom` or `jsdom.jQueryify`) - -```js -jsdom.env(html, [scripts], [config], callback); -``` - -- `html` (**required**): may be a URL, HTML fragment, or file. -- `scripts` (**optional**): may contain files or URLs. -- `config` (**optional**): see below. -- `callback` (**required**): takes two arguments: - - `errors`: an array of errors - - `window`: a brand new window - -_example:_ - -```js -jsdom.env(html, function (errors, window) { - // free memory associated with the window - window.close(); -}); -``` - -If you would like to specify a configuration object only: - -```js -jsdom.env(config); -``` - -- `config.html`: see `html` above. -- `config.scripts`: see `scripts` above. -- `config.src`: an array of JavaScript strings that will be evaluated against the resulting document. Similar to `scripts`, but it accepts JavaScript instead of paths/URLs. -- `config.done`: see `callback` above. -- `config.document`: - - `referer`: the new document will have this referer - - `cookie`: manually set a cookie value, e.g. `'key=value; expires=Wed, Sep 21 2011 12:00:00 GMT; path=/'` -- `config.features` : see `Flexibility` section below. **Note**: the default feature set for jsdom.env does _not_ include fetching remote JavaScript and executing it. This is something that you will need to **carefully** enable yourself. - -## For the hardcore - -If you want to spawn a document/window and specify all sorts of options this is the section for you. This section covers the `jsdom.jsdom` method: - -```js -var jsdom = require("jsdom").jsdom; -var doc = jsdom(markup, level, options); -var window = doc.createWindow(); -``` - -- `markup` is an HTML/XML document to be parsed. You can also pass `null` or an undefined value to get a basic document with empty `` and `` tags. Document fragments are also supported (including `""`), and will behave as sanely as possible (e.g. the resulting document will lack the `head`, `body` and `documentElement` properties if the corresponding elements aren't included). - -- `level` is `null` (which means level3) by default, but you can pass another level if you'd like. - - ```js - var jsdom = require("jsdom"); - var doc = jsdom.jsdom("", jsdom.level(1, "core")); - ``` - -- `options` see the **Flexibility** section below. - -### Flexibility - -One of the goals of jsdom is to be as minimal and light as possible. This section details how someone can change the behavior of `Document`s on the fly. These features are baked into the `DOMImplementation` that every `Document` has, and may be tweaked in two ways: - -1. When you create a new `Document` using the jsdom builder (`require("jsdom").jsdom()`) - - ```js - var jsdom = require("jsdom").jsdom; - var doc = jsdom("", null, { - features: { - FetchExternalResources : ["img"] - } - }); - ``` - - Do note, that this will only affect the document that is currently being created. All other documents will use the defaults specified below (see: Default Features). - -2. Before creating any documents, you can modify the defaults for all future documents: - - ```js - require("jsdom").defaultDocumentFeatures = { - FetchExternalResources: ["script"], - ProcessExternalResources: false - }; - ``` - -#### Default Features - -Default features are extremely important for jsdom as they lower the configuration requirement and present developers a set of consistent default behaviors. The following sections detail the available features, their defaults, and the values that jsdom uses. - - -`FetchExternalResources` - -- _Default_: `["script"]` -- _Allowed_: `["script", "img", "css", "frame", "iframe", "link"]` or `false` - -Enables/disables fetching files over the file system/HTTP. - -`ProcessExternalResources` - -- _Default_: `["script"]` -- _Allowed_: `["script"]` or `false` - -Disabling this will disable script execution (currently only JavaScript). - -`SkipExternalResources` - -- _Default_: `false` -- _Allowed_: `/url to be skipped/` or `false` -- _Example_: `/http:\/\/example.org/js/bad\.js/` - -Do not download and process resources with url matching a regular expression. - -## Canvas - -jsdom includes support for using the [canvas](https://npmjs.org/package/canvas) package to extend any `` elements with the canvas API. To make this work, you need to include canvas as a dependency in your project, as a peer of jsdom. If jsdom can find the canvas package, it will use it, but if it's not present, then `` elements will behave like `
    `s. - -# More Examples - -## Creating a document-less window - -```js -var jsdom = require("jsdom"); -var window = jsdom.createWindow(); - -console.log(window.document); // output: undefined -``` - -## Creating a document - -```js -var jsdom = require("jsdom"); -var doc = new (jsdom.level(1, "core").Document)(); - -console.log(doc.nodeName); // outputs: #document -``` - -## Creating a browser-like BOM/DOM/Window - -```js -var jsdom = require("jsdom").jsdom; -var document = jsdom("hello world"); -var window = document.createWindow(); - -console.log(window.document.innerHTML); -// output: "hello world" - -console.log(window.innerWidth); -// output: 1024 - -console.log(typeof window.document.getElementsByClassName); -// outputs: function -``` - -## jQueryify - -```js -var jsdom = require("jsdom"); -var window = jsdom.jsdom().createWindow(); - -jsdom.jQueryify(window, "http://code.jquery.com/jquery.js", function () { - window.$("body").append('
    Hello World, It works
    '); - - console.log(window.$(".testing").text()); -}); -``` - -## Passing objects to scripts inside the page - -```js -var jsdom = require("jsdom").jsdom; -var window = jsdom().createWindow(); - -window.__myObject = { foo: "bar" }; - -var scriptEl = window.document.createElement("script"); -scriptEl.src = "anotherScript.js"; -window.document.body.appendChild(scriptEl); - -// anotherScript.js will have the ability to read `window.__myObject`, even -// though it originated in Node! -``` - -# Test Compliance: - -``` - level1/core 532/532 100% - level1/html 238/238 100% - level1/svg 527/527 100% - level2/core 283/283 100% - level2/html 697/697 100% - level2/style 10/10 100% - level2/extra 4/4 100% - level2/events 24/24 100% - level3/xpath 93/93 100% - window/index 5/5 100% - window/script 10/10 100% - window/frame 14/14 100% - sizzle/index 9/14 64% - jsdom/index 86/86 100% - jsonp/jsonp 1/1 100% - browser/contextifyReplacement 4/4 100% - browser/index 22/22 100% ------------------------------------------------------- -TOTALS: 5/2564 failed; 99% success -``` - -## Running the tests - -First you'll want to `npm install`. To run all the tests, use `npm test`, which just calls `node test/runner`. - -Using `test/runner` directly, you can slice and dice which tests your want to run from different levels. Usage is as follows: - -``` -test/runner --help -Run the jsdom test suite - -Options: --s, --suites suites that you want to run. ie: -s level1/core,1/html,html [string] --f, --fail-fast stop on the first failed test --h, --help show the help --t, --tests choose the test cases to run. ie: -t jquery -``` diff --git a/node_modules/jsdom/lib/jsdom.js b/node_modules/jsdom/lib/jsdom.js deleted file mode 100644 index e6d22fb..0000000 --- a/node_modules/jsdom/lib/jsdom.js +++ /dev/null @@ -1,368 +0,0 @@ -var dom = exports.dom = require("./jsdom/level3/index").dom, - features = require('./jsdom/browser/documentfeatures'), - fs = require("fs"), - pkg = JSON.parse(fs.readFileSync(__dirname + "/../package.json")), - request = require('request'), - URL = require('url'); - -var style = require('./jsdom/level2/style'); -exports.defaultLevel = dom.level3.html; -exports.browserAugmentation = require("./jsdom/browser/index").browserAugmentation; -exports.windowAugmentation = require("./jsdom/browser/index").windowAugmentation; - -// Proxy feature functions to features module. -['availableDocumentFeatures', - 'defaultDocumentFeatures', - 'applyDocumentFeatures'].forEach(function (propName) { - exports.__defineGetter__(propName, function () { - return features[propName]; - }); - exports.__defineSetter__(propName, function (val) { - return features[propName] = val; - }); -}); - -exports.debugMode = false; - -var createWindow = exports.createWindow = require("./jsdom/browser/index").createWindow; - -exports.__defineGetter__('version', function() { - return pkg.version; -}); - -exports.level = function (level, feature) { - if(!feature) { - feature = 'core'; - } - - return require('./jsdom/level' + level + '/' + feature).dom['level' + level][feature]; -}; - -exports.jsdom = function (html, level, options) { - - options = options || {}; - if(typeof level == "string") { - level = exports.level(level, 'html'); - } else { - level = level || exports.defaultLevel; - } - - if (!options.url) { - options.url = (module.parent.id === 'jsdom') ? - module.parent.parent.filename : - module.parent.filename; - options.url = options.url.replace(/\\/g, '/'); - if (options.url[0] !== '/') { - options.url = '/' + options.url; - } - options.url = 'file://' + options.url; - } - - var browser = exports.browserAugmentation(level, options), - doc = (browser.HTMLDocument) ? - new browser.HTMLDocument(options) : - new browser.Document(options); - - require("./jsdom/selectors/index").applyQuerySelector(doc, level); - - features.applyDocumentFeatures(doc, options.features); - - if (typeof html === 'undefined' || html === null) { - doc.write(''); - } else { - doc.write(html + ''); - } - - if (doc.close && !options.deferClose) { - doc.close(); - } - - // Kept for backwards-compatibility. The window is lazily created when - // document.parentWindow or document.defaultView is accessed. - doc.createWindow = function() { - // Remove ourself - if (doc.createWindow) { - delete doc.createWindow; - } - return doc.parentWindow; - }; - - return doc; -}; - -exports.html = function(html, level, options) { - html += ''; - - // TODO: cache a regex and use it here instead - // or make the parser handle it - var htmlLowered = html.toLowerCase(); - - // body - if (!~htmlLowered.indexOf(''; - } - - // html - if (!~htmlLowered.indexOf(''; - } - return exports.jsdom(html, level, options); -}; - -exports.jQueryify = exports.jsdom.jQueryify = function (window /* path [optional], callback */) { - - if (!window || !window.document) { return; } - - var args = Array.prototype.slice.call(arguments), - callback = (typeof(args[args.length - 1]) === 'function') && args.pop(), - path, - jQueryTag = window.document.createElement("script"); - jQueryTag.className = "jsdom"; - - if (args.length > 1 && typeof(args[1] === 'string')) { - path = args[1]; - } - - var features = window.document.implementation._features; - - window.document.implementation.addFeature('FetchExternalResources', ['script']); - window.document.implementation.addFeature('ProcessExternalResources', ['script']); - window.document.implementation.addFeature('MutationEvents', ["2.0"]); - jQueryTag.src = path || 'http://code.jquery.com/jquery-latest.js'; - window.document.body.appendChild(jQueryTag); - - jQueryTag.onload = function() { - if (callback) { - callback(window, window.jQuery); - } - - window.document.implementation._features = features; - }; - - return window; -}; - - -exports.env = exports.jsdom.env = function() { - var - args = Array.prototype.slice.call(arguments), - config = exports.env.processArguments(args), - callback = config.done, - processHTML = function(err, html) { - - html += ''; - if(err) { - return callback(err); - } - - config.scripts = config.scripts || []; - if (typeof config.scripts === 'string') { - config.scripts = [config.scripts]; - } - - config.src = config.src || []; - if (typeof config.src === 'string') { - config.src = [config.src]; - } - - var - options = { - features: config.features || { - 'FetchExternalResources' : false, - 'ProcessExternalResources' : false, - 'SkipExternalResources' : false - }, - url: config.url - }, - window = exports.html(html, null, options).createWindow(), - features = JSON.parse(JSON.stringify(window.document.implementation._features)), - docsLoaded = 0, - totalDocs = config.scripts.length + config.src.length, - readyState = null, - errors = null; - - if (!window || !window.document) { - return callback(new Error('JSDOM: a window object could not be created.')); - } - - if( config.document ) { - window.document._referrer = config.document.referrer; - window.document._cookie = config.document.cookie; - } - - window.document.implementation.addFeature('FetchExternalResources', ['script']); - window.document.implementation.addFeature('ProcessExternalResources', ['script']); - window.document.implementation.addFeature('MutationEvents', ['2.0']); - - var scriptComplete = function() { - docsLoaded++; - if (docsLoaded >= totalDocs) { - window.document.implementation._features = features; - - if (errors) { - errors = errors.concat(window.document.errors || []); - } - - process.nextTick(function() { callback(errors, window); }); - } - } - - if (config.scripts.length > 0 || config.src.length > 0) { - config.scripts.forEach(function(src) { - var script = window.document.createElement('script'); - script.className = "jsdom"; - script.onload = function() { - scriptComplete() - }; - - script.onerror = function(e) { - if (!errors) { - errors = []; - } - errors.push(e.error); - scriptComplete(); - }; - - script.src = src; - try { - // project against invalid dom - // ex: http://www.google.com/foo#bar - window.document.documentElement.appendChild(script); - } catch(e) { - if(!errors) { - errors=[]; - } - errors.push(e.error || e.message); - scriptComplete(); - } - }); - - config.src.forEach(function(src) { - var script = window.document.createElement('script'); - script.onload = function() { - process.nextTick(scriptComplete); - }; - - script.onerror = function(e) { - if (!errors) { - errors = []; - } - errors.push(e.error || e.message); - // nextTick so that an exception within scriptComplete won't cause - // another script onerror (which would be an infinite loop) - process.nextTick(scriptComplete); - }; - - script.text = src; - window.document.documentElement.appendChild(script); - window.document.documentElement.removeChild(script); - }); - } else { - scriptComplete(); - } - }; - - config.html += ''; - - // Handle markup - if (config.html.indexOf("\n") > 0 || config.html.match(/^\W*)(?=<(?!\/\2))/gi, - singleTag: (function() { - var tags = []; - for (var i in singleTags) { - tags.push(i); - } - return new RegExp('<' + tags.join('|<'), 'i'); - })() -}; - -var uncanon = function(str, letter) { - return '-' + letter.toLowerCase(); -}; - -var HTMLEncode = require('./htmlencoding').HTMLEncode; - -exports.stringifyElement = function stringifyElement(element) { - var tagName = element.tagName.toLowerCase(), - ret = { - start: "<" + tagName, - end:'' - }, - attributes = [], - i, - attribute = null; - - if (element.attributes.length) { - ret.start += " "; - for (i = 0; i"; - } - - return ret; -}; - -var rawTextElements = /SCRIPT|STYLE/i; - -function stringifyDoctype (doctype) { - if (doctype.ownerDocument && doctype.ownerDocument._fullDT) { - return doctype.ownerDocument._fullDT; - } - - var dt = ' -1) { - dt += "'" + doctype.systemId + "'"; - } else { - dt += '"' + doctype.systemId + '"'; - } - } - dt += '>'; - return dt; -} - -exports.makeHtmlGenerator = function makeHtmlGenerator(indentUnit, eol) { - indentUnit = indentUnit || ""; - eol = eol || ""; - - return function generateHtmlRecursive(node, rawText, curIndent) { - var ret = "", parent, current, i; - curIndent = curIndent || ""; - if (node) { - if (node.nodeType && - node.nodeType === node.ENTITY_REFERENCE_NODE) { - node = node._entity; - } - - var childNodesRawText = rawText || rawTextElements.test(node.nodeName); - - switch (node.nodeType) { - case node.ELEMENT_NODE: - current = exports.stringifyElement(node); - if (childNodesRawText) { - ret += curIndent + current.start; - } else { - ret += curIndent + current.start; - } - if (node._childNodes.length > 0) { - if (node._childNodes[0].nodeType !== node.TEXT_NODE) { - ret += eol; - } - for (i=0; i' + eol; - break; - case node.DOCUMENT_NODE: - for (i=0; i', - 'nbsp': ' ', - 'iexcl': '¡', - 'cent': '¢', - 'pound': '£', - 'curren': '¤', - 'yen': '¥', - 'brvbar': '¦', - 'sect': '§', - 'uml': '¨', - 'copy': '©', - 'ordf': 'ª', - 'laquo': '«', - 'not': '¬', - 'shy': '­', - 'reg': '®', - 'macr': '¯', // http://www.w3.org/TR/html4/sgml/entities.html - 'strns': '¯', // http://www.w3.org/TR/html5/named-character-references.html - 'deg': '°', - 'plusmn': '±', // http://www.w3.org/TR/html4/sgml/entities.html - 'pm': '±', // http://www.w3.org/TR/html5/named-character-references.html - 'sup2': '²', - 'sup3': '³', - 'acute': '´', - 'micro': 'µ', - 'para': '¶', - 'middot': '·', - 'cedil': '¸', - 'sup1': '¹', - 'ordm': 'º', - 'raquo': '»', - 'frac14': '¼', - 'half': '½', // http://www.w3.org/TR/html4/sgml/entities.html - 'frac12': '½', // http://www.w3.org/TR/html5/named-character-references.html - 'frac34': '¾', - 'iquest': '¿', - 'Agrave': 'À', - 'Aacute': 'Á', - 'Acirc': 'Â', - 'Atilde': 'Ã', - 'Auml': 'Ä', - 'Aring': 'Å', // http://www.w3.org/TR/html4/sgml/entities.html - 'angst': 'Å', // http://www.w3.org/TR/html5/named-character-references.html - 'AElig': 'Æ', - 'Ccedil': 'Ç', - 'Egrave': 'È', - 'Eacute': 'É', - 'Ecirc': 'Ê', - 'Euml': 'Ë', - 'Igrave': 'Ì', - 'Iacute': 'Í', - 'Icirc': 'Î', - 'Iuml': 'Ï', - 'ETH': 'Ð', - 'Ntilde': 'Ñ', - 'Ograve': 'Ò', - 'Oacute': 'Ó', - 'Ocirc': 'Ô', - 'Otilde': 'Õ', - 'Ouml': 'Ö', - 'times': '×', - 'Oslash': 'Ø', - 'Ugrave': 'Ù', - 'Uacute': 'Ú', - 'Ucirc': 'Û', - 'Uuml': 'Ü', - 'Yacute': 'Ý', - 'THORN': 'Þ', - 'szlig': 'ß', - 'agrave': 'à', - 'aacute': 'á', - 'acirc': 'â', - 'atilde': 'ã', - 'auml': 'ä', - 'aring': 'å', - 'aelig': 'æ', - 'ccedil': 'ç', - 'egrave': 'è', - 'eacute': 'é', - 'ecirc': 'ê', - 'euml': 'ë', - 'igrave': 'ì', - 'iacute': 'í', - 'icirc': 'î', - 'iuml': 'ï', - 'eth': 'ð', - 'ntilde': 'ñ', - 'ograve': 'ò', - 'oacute': 'ó', - 'ocirc': 'ô', - 'otilde': 'õ', - 'ouml': 'ö', - 'divide': '÷', - 'oslash': 'ø', - 'ugrave': 'ù', - 'uacute': 'ú', - 'ucirc': 'û', - 'uuml': 'ü', - 'yacute': 'ý', - 'thorn': 'þ', - 'yuml': 'ÿ', - 'Amacr': 'Ā', - 'amacr': 'ā', - 'Abreve': 'Ă', - 'abreve': 'ă', - 'Aogon': 'Ą', - 'aogon': 'ą', - 'Cacute': 'Ć', - 'cacute': 'ć', - 'Ccirc': 'Ĉ', - 'ccirc': 'ĉ', - 'Cdot': 'Ċ', - 'cdot': 'ċ', - 'Ccaron': 'Č', - 'ccaron': 'č', - 'Dcaron': 'Ď', - 'dcaron': 'ď', - 'Dstrok': 'Đ', - 'dstrok': 'đ', - 'Emacr': 'Ē', - 'emacr': 'ē', - 'Edot': 'Ė', - 'edot': 'ė', - 'Eogon': 'Ę', - 'eogon': 'ę', - 'Ecaron': 'Ě', - 'ecaron': 'ě', - 'Gcirc': 'Ĝ', - 'gcirc': 'ĝ', - 'Gbreve': 'Ğ', - 'gbreve': 'ğ', - 'Gdot': 'Ġ', - 'gdot': 'ġ', - 'Gcedil': 'Ģ', - 'Hcirc': 'Ĥ', - 'hcirc': 'ĥ', - 'Hstrok': 'Ħ', - 'hstrok': 'ħ', - 'Itilde': 'Ĩ', - 'itilde': 'ĩ', - 'Imacr': 'Ī', - 'imacr': 'ī', - 'Iogon': 'Į', - 'iogon': 'į', - 'Idot': 'İ', - 'inodot': 'ı', - 'IJlig': 'IJ', - 'ijlig': 'ij', - 'Jcirc': 'Ĵ', - 'jcirc': 'ĵ', - 'Kcedil': 'Ķ', - 'kcedil': 'ķ', - 'kgreen': 'ĸ', - 'Lacute': 'Ĺ', - 'lacute': 'ĺ', - 'Lcedil': 'Ļ', - 'lcedil': 'ļ', - 'Lcaron': 'Ľ', - 'lcaron': 'ľ', - 'Lmidot': 'Ŀ', - 'lmidot': 'ŀ', - 'Lstrok': 'Ł', - 'lstrok': 'ł', - 'Nacute': 'Ń', - 'nacute': 'ń', - 'Ncedil': 'Ņ', - 'ncedil': 'ņ', - 'Ncaron': 'Ň', - 'ncaron': 'ň', - 'napos': 'ʼn', - 'ENG': 'Ŋ', - 'eng': 'ŋ', - 'Omacr': 'Ō', - 'omacr': 'ō', - 'Odblac': 'Ő', - 'odblac': 'ő', - 'OElig': 'Œ', - 'oelig': 'œ', - 'Racute': 'Ŕ', - 'racute': 'ŕ', - 'Rcedil': 'Ŗ', - 'rcedil': 'ŗ', - 'Rcaron': 'Ř', - 'rcaron': 'ř', - 'Sacute': 'Ś', - 'sacute': 'ś', - 'Scirc': 'Ŝ', - 'scirc': 'ŝ', - 'Scedil': 'Ş', - 'scedil': 'ş', - 'Scaron': 'Š', - 'scaron': 'š', - 'Tcedil': 'Ţ', - 'tcedil': 'ţ', - 'Tcaron': 'Ť', - 'tcaron': 'ť', - 'Tstrok': 'Ŧ', - 'tstrok': 'ŧ', - 'Utilde': 'Ũ', - 'utilde': 'ũ', - 'Umacr': 'Ū', - 'umacr': 'ū', - 'Ubreve': 'Ŭ', - 'ubreve': 'ŭ', - 'Uring': 'Ů', - 'uring': 'ů', - 'Udblac': 'Ű', - 'udblac': 'ű', - 'Uogon': 'Ų', - 'uogon': 'ų', - 'Wcirc': 'Ŵ', - 'wcirc': 'ŵ', - 'Ycirc': 'Ŷ', - 'ycirc': 'ŷ', - 'Yuml': 'Ÿ', - 'Zacute': 'Ź', - 'zacute': 'ź', - 'Zdot': 'Ż', - 'zdot': 'ż', - 'Zcaron': 'Ž', - 'zcaron': 'ž', - 'fnof': 'ƒ', - 'imped': 'Ƶ', - 'gacute': 'ǵ', - 'jmath': 'ȷ', - 'circ': 'ˆ', - 'caron': 'ˇ', - 'breve': '˘', - 'dot': '˙', - 'ring': '˚', - 'ogon': '˛', - 'tilde': '˜', - 'dblac': '˝', - 'Alpha': 'Α', - 'Beta': 'Β', - 'Gamma': 'Γ', - 'Delta': 'Δ', - 'Epsilon': 'Ε', - 'Zeta': 'Ζ', - 'Eta': 'Η', - 'Theta': 'Θ', - 'Iota': 'Ι', - 'Kappa': 'Κ', - 'Lambda': 'Λ', - 'Mu': 'Μ', - 'Nu': 'Ν', - 'Xi': 'Ξ', - 'Omicron': 'Ο', - 'Pi': 'Π', - 'Rho': 'Ρ', - 'Sigma': 'Σ', - 'Tau': 'Τ', - 'Upsilon': 'Υ', - 'Phi': 'Φ', - 'Chi': 'Χ', - 'Psi': 'Ψ', - 'Omega': 'Ω', // http://www.w3.org/TR/html4/sgml/entities.html - 'ohm': 'Ω', // http://www.w3.org/TR/html5/named-character-references.html - 'alpha': 'α', - 'beta': 'β', - 'gamma': 'γ', - 'delta': 'δ', - 'epsilon': 'ε', - 'zeta': 'ζ', - 'eta': 'η', - 'theta': 'θ', - 'iota': 'ι', - 'kappa': 'κ', - 'lambda': 'λ', - 'mu': 'μ', - 'nu': 'ν', - 'xi': 'ξ', - 'omicron': 'ο', - 'pi': 'π', - 'rho': 'ρ', - 'sigmaf': 'ς', // http://www.w3.org/TR/html4/sgml/entities.html - 'varsigma': 'ς', // http://www.w3.org/TR/html5/named-character-references.html - 'sigma': 'σ', - 'tau': 'τ', - 'upsilon': 'υ', - 'phi': 'φ', - 'chi': 'χ', - 'psi': 'ψ', - 'omega': 'ω', - 'thetasym': 'ϑ', // http://www.w3.org/TR/html4/sgml/entities.html - 'vartheta': 'ϑ', // http://www.w3.org/TR/html5/named-character-references.html - 'upsih': 'ϒ', - 'varphi': 'ϕ', - 'piv': 'ϖ', // http://www.w3.org/TR/html4/sgml/entities.html - 'varpi': 'ϖ', // http://www.w3.org/TR/html5/named-character-references.html - 'Gammad': 'Ϝ', - 'gammad': 'ϝ', - 'varkappa': 'ϰ', - 'varrho': 'ϱ', - 'varepsilon': 'ϵ', - 'bepsi': '϶', - 'IOcy': 'Ё', - 'DJcy': 'Ђ', - 'GJcy': 'Ѓ', - 'Jukcy': 'Є', - 'DScy': 'Ѕ', - 'Iukcy': 'І', - 'YIcy': 'Ї', - 'Jsercy': 'Ј', - 'LJcy': 'Љ', - 'NJcy': 'Њ', - 'TSHcy': 'Ћ', - 'KJcy': 'Ќ', - 'Ubrcy': 'Ў', - 'DZcy': 'Џ', - 'Acy': 'А', - 'Bcy': 'Б', - 'Vcy': 'В', - 'Gcy': 'Г', - 'Dcy': 'Д', - 'IEcy': 'Е', - 'ZHcy': 'Ж', - 'Zcy': 'З', - 'Icy': 'И', - 'Jcy': 'Й', - 'Kcy': 'К', - 'Lcy': 'Л', - 'Mcy': 'М', - 'Ncy': 'Н', - 'Ocy': 'О', - 'Pcy': 'П', - 'Rcy': 'Р', - 'Scy': 'С', - 'Tcy': 'Т', - 'Ucy': 'У', - 'Fcy': 'Ф', - 'KHcy': 'Х', - 'TScy': 'Ц', - 'CHcy': 'Ч', - 'SHcy': 'Ш', - 'SHCHcy': 'Щ', - 'HARDcy': 'Ъ', - 'Ycy': 'Ы', - 'SOFTcy': 'Ь', - 'Ecy': 'Э', - 'YUcy': 'Ю', - 'YAcy': 'Я', - 'acy': 'а', - 'bcy': 'б', - 'vcy': 'в', - 'gcy': 'г', - 'dcy': 'д', - 'iecy': 'е', - 'zhcy': 'ж', - 'zcy': 'з', - 'icy': 'и', - 'jcy': 'й', - 'kcy': 'к', - 'lcy': 'л', - 'mcy': 'м', - 'ncy': 'н', - 'ocy': 'о', - 'pcy': 'п', - 'rcy': 'р', - 'scy': 'с', - 'tcy': 'т', - 'ucy': 'у', - 'fcy': 'ф', - 'khcy': 'х', - 'tscy': 'ц', - 'chcy': 'ч', - 'shcy': 'ш', - 'shchcy': 'щ', - 'hardcy': 'ъ', - 'ycy': 'ы', - 'softcy': 'ь', - 'ecy': 'э', - 'yucy': 'ю', - 'yacy': 'я', - 'iocy': 'ё', - 'djcy': 'ђ', - 'gjcy': 'ѓ', - 'jukcy': 'є', - 'dscy': 'ѕ', - 'iukcy': 'і', - 'yicy': 'ї', - 'jsercy': 'ј', - 'ljcy': 'љ', - 'njcy': 'њ', - 'tshcy': 'ћ', - 'kjcy': 'ќ', - 'ubrcy': 'ў', - 'dzcy': 'џ', - 'ensp': ' ', - 'emsp': ' ', - 'emsp13': ' ', - 'emsp14': ' ', - 'numsp': ' ', - 'puncsp': ' ', - 'thinsp': ' ', - 'hairsp': ' ', - 'ZeroWidthSpace': '​', - 'zwnj': '‌', - 'zwj': '‍', - 'lrm': '‎', - 'rlm': '‏', - 'hyphen': '‐', - 'ndash': '–', - 'mdash': '—', - 'horbar': '―', - 'Vert': '‖', - 'lsquo': '‘', - 'rsquo': '’', // http://www.w3.org/TR/html4/sgml/entities.html - 'rsquor': '’', // http://www.w3.org/TR/html5/named-character-references.html - 'sbquo': '‚', - 'ldquo': '“', - 'rdquo': '”', // http://www.w3.org/TR/html4/sgml/entities.html - 'rdquor': '”', // http://www.w3.org/TR/html5/named-character-references.html - 'ldquo': '“', // http://www.w3.org/TR/html4/sgml/entities.html - 'ldquor': '„', // http://www.w3.org/TR/html5/named-character-references.html - 'dagger': '†', - 'Dagger': '‡', // http://www.w3.org/TR/html4/sgml/entities.html - 'ddagger': '‡', // http://www.w3.org/TR/html5/named-character-references.html - 'bull': '•', // http://www.w3.org/TR/html4/sgml/entities.html - 'bullet': '•', // http://www.w3.org/TR/html5/named-character-references.html - 'nldr': '‥', - 'hellip': '…', // http://www.w3.org/TR/html4/sgml/entities.html - 'mldr': '…', // http://www.w3.org/TR/html5/named-character-references.html - 'permil': '‰', - 'pertenk': '‱', - 'prime': '′', - 'Prime': '″', - 'tprime': '‴', - 'bprime': '‵', - 'lsaquo': '‹', - 'rsaquo': '›', - 'oline': '‾', - 'caret': '⁁', - 'hybull': '⁃', - 'frasl': '⁄', - 'bsemi': '⁏', - 'qprime': '⁗', - 'MediumSpace': ' ', - 'NoBreak': '⁠', - 'af': '⁡', - 'it': '⁢', - 'ic': '⁣', - 'euro': '€', - 'complexes': 'ℂ', - 'incare': '℅', - 'gscr': 'ℊ', - 'hamilt': 'ℋ', - 'Poincareplane': 'ℌ', - 'quaternions': 'ℍ', - 'planckh': 'ℎ', - 'plankv': 'ℏ', - 'imagline': 'ℐ', - 'image': 'ℑ', // http://www.w3.org/TR/html4/sgml/entities.html - 'imagpart': 'ℑ', // http://www.w3.org/TR/html5/named-character-references.html - 'lagran': 'ℒ', - 'ell': 'ℓ', - 'naturals': 'ℕ', - 'numero': '№', - 'copysr': '℗', - 'weierp': '℘', // http://www.w3.org/TR/html4/sgml/entities.html - 'wp': '℘', // http://www.w3.org/TR/html5/named-character-references.html - 'primes': 'ℙ', - 'rationals': 'ℚ', - 'realine': 'ℛ', - 'real': 'ℜ', // http://www.w3.org/TR/html4/sgml/entities.html - 'realpart': 'ℜ', // http://www.w3.org/TR/html5/named-character-references.html - 'reals': 'ℝ', - 'rx': '℞', - 'trade': '™', - 'integers': 'ℤ', - 'mho': '℧', - 'zeetrf': 'ℨ', - 'iiota': '℩', - 'bernou': 'ℬ', - 'Cfr': 'ℭ', - 'escr': 'ℯ', - 'expectation': 'ℰ', - 'Fscr': 'ℱ', - 'phmmat': 'ℳ', - 'oscr': 'ℴ', - 'alefsym': 'ℵ', // http://www.w3.org/TR/html4/sgml/entities.html - 'aleph': 'ℵ', // http://www.w3.org/TR/html5/named-character-references.html - 'beth': 'ℶ', - 'gimel': 'ℷ', - 'daleth': 'ℸ', - 'DD': 'ⅅ', - 'dd': 'ⅆ', - 'exponentiale': 'ⅇ', - 'ii': 'ⅈ', - 'frac13': '⅓', - 'frac23': '⅔', - 'frac15': '⅕', - 'frac25': '⅖', - 'frac35': '⅗', - 'frac45': '⅘', - 'frac16': '⅙', - 'frac56': '⅚', - 'frac18': '⅛', - 'frac38': '⅜', - 'frac58': '⅝', - 'frac78': '⅞', - 'larr': '←', // http://www.w3.org/TR/html4/sgml/entities.html - 'slarr': '←', // http://www.w3.org/TR/html5/named-character-references.html - 'uarr': '↑', // http://www.w3.org/TR/html4/sgml/entities.html - 'uparrow': '↑', // http://www.w3.org/TR/html5/named-character-references.html - 'rarr': '→', // http://www.w3.org/TR/html4/sgml/entities.html - 'srarr': '→', // http://www.w3.org/TR/html5/named-character-references.html - 'darr': '↓', // http://www.w3.org/TR/html4/sgml/entities.html - 'downarrow': '↓', // http://www.w3.org/TR/html5/named-character-references.html - 'harr': '↔', // http://www.w3.org/TR/html4/sgml/entities.html - 'leftrightarrow': '↔', // http://www.w3.org/TR/html5/named-character-references.html - 'varr': '↕', - 'nwarrow': '↖', - 'nearrow': '↗', - 'searrow': '↘', - 'swarrow': '↙', - 'nleftarrow': '↚', - 'nrightarrow': '↛', - 'rightsquigarrow': '↝', - 'twoheadleftarrow': '↞', - 'Uarr': '↟', - 'twoheadrightarrow': '↠', - 'Darr': '↡', - 'leftarrowtail': '↢', - 'rightarrowtail': '↣', - 'mapstoleft': '↤', - 'mapstoup': '↥', - 'mapsto': '↦', - 'mapstodown': '↧', - 'larrhk': '↩', - 'rarrhk': '↪', - 'looparrowleft': '↫', - 'rarrlp': '↬', - 'leftrightsquigarrow': '↭', - 'nleftrightarrow': '↮', - 'lsh': '↰', - 'rsh': '↱', - 'ldsh': '↲', - 'rdsh': '↳', - 'crarr': '↵', - 'curvearrowleft': '↶', - 'curvearrowright': '↷', - 'olarr': '↺', - 'orarr': '↻', - 'lharu': '↼', - 'lhard': '↽', - 'upharpoonright': '↾', - 'upharpoonleft': '↿', - 'rightharpoonup': '⇀', - 'rightharpoondown': '⇁', - 'downharpoonright': '⇂', - 'downharpoonleft': '⇃', - 'rlarr': '⇄', - 'udarr': '⇅', - 'lrarr': '⇆', - 'llarr': '⇇', - 'uuarr': '⇈', - 'rrarr': '⇉', - 'downdownarrows': '⇊', - 'lrhar': '⇋', - 'rlhar': '⇌', - 'nlArr': '⇍', - 'nhArr': '⇎', - 'nrArr': '⇏', - 'lArr': '⇐', - 'uArr': '⇑', - 'rArr': '⇒', - 'dArr': '⇓', - 'hArr': '⇔', // http://www.w3.org/TR/html4/sgml/entities.html - 'iff': '⇔', // http://www.w3.org/TR/html5/named-character-references.html - 'vArr': '⇕', - 'nwArr': '⇖', - 'neArr': '⇗', - 'seArr': '⇘', - 'swArr': '⇙', - 'lAarr': '⇚', - 'rAarr': '⇛', - 'zigrarr': '⇝', - 'larrb': '⇤', - 'rarrb': '⇥', - 'duarr': '⇵', - 'loarr': '⇽', - 'roarr': '⇾', - 'hoarr': '⇿', - 'forall': '∀', - 'complement': '∁', - 'part': '∂', - 'exist': '∃', - 'nexists': '∄', - 'empty': '∅', // http://www.w3.org/TR/html4/sgml/entities.html - 'varnothing': '∅', // http://www.w3.org/TR/html5/named-character-references.html - 'nabla': '∇', - 'isin': '∈', // http://www.w3.org/TR/html4/sgml/entities.html - 'isinv': '∈', // http://www.w3.org/TR/html5/named-character-references.html - 'notin': '∉', // http://www.w3.org/TR/html4/sgml/entities.html - 'notinva': '∉', // http://www.w3.org/TR/html5/named-character-references.html - 'ni': '∋', // http://www.w3.org/TR/html4/sgml/entities.html - 'niv': '∋', // http://www.w3.org/TR/html5/named-character-references.html - 'notniva': '∌', - 'prod': '∏', - 'coprod': '∐', - 'sum': '∑', - 'minus': '−', - 'mp': '∓', - 'plusdo': '∔', - 'ssetmn': '∖', - 'lowast': '∗', - 'compfn': '∘', - 'radic': '√', - 'prop': '∝', // http://www.w3.org/TR/html4/sgml/entities.html - 'vprop': '∝', // http://www.w3.org/TR/html5/named-character-references.html - 'infin': '∞', - 'angrt': '∟', - 'ang': '∠', // http://www.w3.org/TR/html4/sgml/entities.html - 'angle': '∠', // http://www.w3.org/TR/html5/named-character-references.html - 'measuredangle': '∡', - 'angsph': '∢', - 'smid': '∣', - 'nsmid': '∤', - 'spar': '∥', - 'nspar': '∦', - 'and': '∧', // http://www.w3.org/TR/html4/sgml/entities.html - 'wedge': '∧', // http://www.w3.org/TR/html5/named-character-references.html - 'or': '∨', // http://www.w3.org/TR/html4/sgml/entities.html - 'vee': '∨', // http://www.w3.org/TR/html5/named-character-references.html - 'cap': '∩', - 'cup': '∪', - 'int': '∫', - 'Int': '∬', - 'tint': '∭', - 'oint': '∮', - 'DoubleContourIntegral': '∯', - 'Cconint': '∰', - 'cwint': '∱', - 'cwconint': '∲', - 'awconint': '∳', - 'there4': '∴', // http://www.w3.org/TR/html4/sgml/entities.html - 'therefore': '∴', // http://www.w3.org/TR/html5/named-character-references.html - 'because': '∵', - 'ratio': '∶', - 'Proportion': '∷', - 'minusd': '∸', - 'mDDot': '∺', - 'homtht': '∻', - 'sim': '∼', // http://www.w3.org/TR/html4/sgml/entities.html - 'thksim': '∼', // http://www.w3.org/TR/html5/named-character-references.html - 'bsim': '∽', - 'mstpos': '∾', - 'acd': '∿', - 'wreath': '≀', - 'nsim': '≁', - 'esim': '≂', - 'simeq': '≃', - 'nsimeq': '≄', - 'cong': '≅', - 'simne': '≆', - 'ncong': '≇', - 'asymp': '≈', // http://www.w3.org/TR/html4/sgml/entities.html - 'thkap': '≈', // http://www.w3.org/TR/html5/named-character-references.html - 'napprox': '≉', - 'approxeq': '≊', - 'apid': '≋', - 'bcong': '≌', - 'asympeq': '≍', - 'bump': '≎', - 'bumpeq': '≏', - 'esdot': '≐', - 'eDot': '≑', - 'fallingdotseq': '≒', - 'risingdotseq': '≓', - 'coloneq': '≔', - 'eqcolon': '≕', - 'eqcirc': '≖', - 'cire': '≗', - 'wedgeq': '≙', - 'veeeq': '≚', - 'trie': '≜', - 'questeq': '≟', - 'ne': '≠', - 'equiv': '≡', - 'nequiv': '≢', - 'le': '≤', // http://www.w3.org/TR/html4/sgml/entities.html - 'leq': '≤', // http://www.w3.org/TR/html5/named-character-references.html - 'ge': '≥', // http://www.w3.org/TR/html4/sgml/entities.html - 'geq': '≥', // http://www.w3.org/TR/html5/named-character-references.html - 'leqq': '≦', - 'geqq': '≧', - 'lneqq': '≨', - 'gneqq': '≩', - 'll': '≪', - 'gg': '≫', - 'twixt': '≬', - 'NotCupCap': '≭', - 'nlt': '≮', - 'ngtr': '≯', - 'nleq': '≰', - 'ngeq': '≱', - 'lsim': '≲', - 'gtrsim': '≳', - 'nlsim': '≴', - 'ngsim': '≵', - 'lg': '≶', - 'gtrless': '≷', - 'ntlg': '≸', - 'ntgl': '≹', - 'prec': '≺', - 'succ': '≻', - 'preccurlyeq': '≼', - 'succcurlyeq': '≽', - 'prsim': '≾', - 'succsim': '≿', - 'nprec': '⊀', - 'nsucc': '⊁', - 'sub': '⊂', // http://www.w3.org/TR/html4/sgml/entities.html - 'subset': '⊂', // http://www.w3.org/TR/html5/named-character-references.html - 'sup': '⊃', // http://www.w3.org/TR/html4/sgml/entities.html - 'supset': '⊃', // http://www.w3.org/TR/html5/named-character-references.html - 'nsub': '⊄', - 'nsup': '⊅', - 'sube': '⊆', // http://www.w3.org/TR/html4/sgml/entities.html - 'subseteq': '⊆', // http://www.w3.org/TR/html5/named-character-references.html - 'supe': '⊇', // http://www.w3.org/TR/html4/sgml/entities.html - 'supseteq': '⊇', // http://www.w3.org/TR/html5/named-character-references.html - 'nsubseteq': '⊈', - 'nsupseteq': '⊉', - 'subsetneq': '⊊', - 'supsetneq': '⊋', - 'cupdot': '⊍', - 'uplus': '⊎', - 'sqsubset': '⊏', - 'sqsupset': '⊐', - 'sqsubseteq': '⊑', - 'sqsupseteq': '⊒', - 'sqcap': '⊓', - 'sqcup': '⊔', - 'oplus': '⊕', - 'ominus': '⊖', - 'otimes': '⊗', - 'osol': '⊘', - 'odot': '⊙', - 'ocir': '⊚', - 'oast': '⊛', - 'odash': '⊝', - 'plusb': '⊞', - 'minusb': '⊟', - 'timesb': '⊠', - 'sdotb': '⊡', - 'vdash': '⊢', - 'dashv': '⊣', - 'top': '⊤', - 'perp': '⊥', - 'models': '⊧', - 'vDash': '⊨', - 'Vdash': '⊩', - 'Vvdash': '⊪', - 'VDash': '⊫', - 'nvdash': '⊬', - 'nvDash': '⊭', - 'nVdash': '⊮', - 'nVDash': '⊯', - 'prurel': '⊰', - 'vltri': '⊲', - 'vrtri': '⊳', - 'trianglelefteq': '⊴', - 'trianglerighteq': '⊵', - 'origof': '⊶', - 'imof': '⊷', - 'mumap': '⊸', - 'hercon': '⊹', - 'intercal': '⊺', - 'veebar': '⊻', - 'barvee': '⊽', - 'angrtvb': '⊾', - 'lrtri': '⊿', - 'xwedge': '⋀', - 'xvee': '⋁', - 'xcap': '⋂', - 'xcup': '⋃', - 'diamond': '⋄', - 'sdot': '⋅', - 'sstarf': '⋆', - 'divonx': '⋇', - 'bowtie': '⋈', - 'ltimes': '⋉', - 'rtimes': '⋊', - 'lthree': '⋋', - 'rthree': '⋌', - 'bsime': '⋍', - 'cuvee': '⋎', - 'cuwed': '⋏', - 'Subset': '⋐', - 'Supset': '⋑', - 'Cap': '⋒', - 'Cup': '⋓', - 'pitchfork': '⋔', - 'epar': '⋕', - 'ltdot': '⋖', - 'gtrdot': '⋗', - 'Ll': '⋘', - 'ggg': '⋙', - 'lesseqgtr': '⋚', - 'gtreqless': '⋛', - 'curlyeqprec': '⋞', - 'curlyeqsucc': '⋟', - 'nprcue': '⋠', - 'nsccue': '⋡', - 'nsqsube': '⋢', - 'nsqsupe': '⋣', - 'lnsim': '⋦', - 'gnsim': '⋧', - 'prnsim': '⋨', - 'succnsim': '⋩', - 'ntriangleleft': '⋪', - 'ntriangleright': '⋫', - 'ntrianglelefteq': '⋬', - 'ntrianglerighteq': '⋭', - 'vellip': '⋮', - 'ctdot': '⋯', - 'utdot': '⋰', - 'dtdot': '⋱', - 'disin': '⋲', - 'isinsv': '⋳', - 'isins': '⋴', - 'isindot': '⋵', - 'notinvc': '⋶', - 'notinvb': '⋷', - 'isinE': '⋹', - 'nisd': '⋺', - 'xnis': '⋻', - 'nis': '⋼', - 'notnivc': '⋽', - 'notnivb': '⋾', - 'barwedge': '⌅', - 'doublebarwedge': '⌆', - 'lceil': '⌈', - 'rceil': '⌉', - 'lfloor': '⌊', - 'rfloor': '⌋', - 'drcrop': '⌌', - 'dlcrop': '⌍', - 'urcrop': '⌎', - 'ulcrop': '⌏', - 'bnot': '⌐', - 'profline': '⌒', - 'profsurf': '⌓', - 'telrec': '⌕', - 'target': '⌖', - 'ulcorner': '⌜', - 'urcorner': '⌝', - 'llcorner': '⌞', - 'lrcorner': '⌟', - 'sfrown': '⌢', - 'ssmile': '⌣', - 'lang': '〈', // http://www.w3.org/TR/html4/sgml/entities.html - 'rang': '〉', // http://www.w3.org/TR/html4/sgml/entities.html - 'cylcty': '⌭', - 'profalar': '⌮', - 'topbot': '⌶', - 'ovbar': '⌽', - 'solbar': '⌿', - 'angzarr': '⍼', - 'lmoustache': '⎰', - 'rmoustache': '⎱', - 'tbrk': '⎴', - 'bbrk': '⎵', - 'bbrktbrk': '⎶', - 'OverParenthesis': '⏜', - 'UnderParenthesis': '⏝', - 'OverBrace': '⏞', - 'UnderBrace': '⏟', - 'trpezium': '⏢', - 'elinters': '⏧', - 'blank': '␣', - 'oS': 'Ⓢ', - 'boxh': '─', - 'boxv': '│', - 'boxdr': '┌', - 'boxdl': '┐', - 'boxur': '└', - 'boxul': '┘', - 'boxvr': '├', - 'boxvl': '┤', - 'boxhd': '┬', - 'boxhu': '┴', - 'boxvh': '┼', - 'boxH': '═', - 'boxV': '║', - 'boxdR': '╒', - 'boxDr': '╓', - 'boxDR': '╔', - 'boxdL': '╕', - 'boxDl': '╖', - 'boxDL': '╗', - 'boxuR': '╘', - 'boxUr': '╙', - 'boxUR': '╚', - 'boxuL': '╛', - 'boxUl': '╜', - 'boxUL': '╝', - 'boxvR': '╞', - 'boxVr': '╟', - 'boxVR': '╠', - 'boxvL': '╡', - 'boxVl': '╢', - 'boxVL': '╣', - 'boxHd': '╤', - 'boxhD': '╥', - 'boxHD': '╦', - 'boxHu': '╧', - 'boxhU': '╨', - 'boxHU': '╩', - 'boxvH': '╪', - 'boxVh': '╫', - 'boxVH': '╬', - 'uhblk': '▀', - 'lhblk': '▄', - 'block': '█', - 'blk14': '░', - 'blk12': '▒', - 'blk34': '▓', - 'square': '□', - 'squf': '▪', - 'EmptyVerySmallSquare': '▫', - 'rect': '▭', - 'marker': '▮', - 'fltns': '▱', - 'xutri': '△', - 'utrif': '▴', - 'utri': '▵', - 'rtrif': '▸', - 'triangleright': '▹', - 'xdtri': '▽', - 'dtrif': '▾', - 'triangledown': '▿', - 'ltrif': '◂', - 'triangleleft': '◃', - 'loz': '◊', // http://www.w3.org/TR/html4/sgml/entities.html - 'lozenge': '◊', // http://www.w3.org/TR/html5/named-character-references.html - 'cir': '○', - 'tridot': '◬', - 'xcirc': '◯', - 'ultri': '◸', - 'urtri': '◹', - 'lltri': '◺', - 'EmptySmallSquare': '◻', - 'FilledSmallSquare': '◼', - 'starf': '★', - 'star': '☆', - 'phone': '☎', - 'female': '♀', - 'male': '♂', - 'spades': '♠', // http://www.w3.org/TR/html4/sgml/entities.html - 'spadesuit': '♠', // http://www.w3.org/TR/html5/named-character-references.html - 'clubs': '♣', // http://www.w3.org/TR/html4/sgml/entities.html - 'clubsuit': '♣', // http://www.w3.org/TR/html5/named-character-references.html - 'hearts': '♥', // http://www.w3.org/TR/html4/sgml/entities.html - 'heartsuit': '♥', // http://www.w3.org/TR/html5/named-character-references.html - 'diams': '♦', - 'sung': '♪', - 'flat': '♭', - 'natural': '♮', - 'sharp': '♯', - 'checkmark': '✓', - 'cross': '✗', - 'maltese': '✠', - 'sext': '✶', - 'VerticalSeparator': '❘', - 'lbbrk': '❲', - 'rbbrk': '❳', - 'bsolhsub': '⟈', - 'suphsol': '⟉', - 'lobrk': '⟦', - 'robrk': '⟧', - 'langle': '⟨', - 'rangle': '⟩', - 'Lang': '⟪', - 'Rang': '⟫', - 'loang': '⟬', - 'roang': '⟭', - 'xlarr': '⟵', - 'xrarr': '⟶', - 'xharr': '⟷', - 'xlArr': '⟸', - 'xrArr': '⟹', - 'xhArr': '⟺', - 'xmap': '⟼', - 'dzigrarr': '⟿', - 'nvlArr': '⤂', - 'nvrArr': '⤃', - 'nvHarr': '⤄', - 'Map': '⤅', - 'lbarr': '⤌', - 'rbarr': '⤍', - 'lBarr': '⤎', - 'rBarr': '⤏', - 'drbkarow': '⤐', - 'DDotrahd': '⤑', - 'UpArrowBar': '⤒', - 'DownArrowBar': '⤓', - 'Rarrtl': '⤖', - 'latail': '⤙', - 'ratail': '⤚', - 'lAtail': '⤛', - 'rAtail': '⤜', - 'larrfs': '⤝', - 'rarrfs': '⤞', - 'larrbfs': '⤟', - 'rarrbfs': '⤠', - 'nwarhk': '⤣', - 'nearhk': '⤤', - 'searhk': '⤥', - 'swarhk': '⤦', - 'nwnear': '⤧', - 'toea': '⤨', - 'tosa': '⤩', - 'swnwar': '⤪', - 'rarrc': '⤳', - 'cudarrr': '⤵', - 'ldca': '⤶', - 'rdca': '⤷', - 'cudarrl': '⤸', - 'larrpl': '⤹', - 'curarrm': '⤼', - 'cularrp': '⤽', - 'rarrpl': '⥅', - 'harrcir': '⥈', - 'Uarrocir': '⥉', - 'lurdshar': '⥊', - 'ldrushar': '⥋', - 'LeftRightVector': '⥎', - 'RightUpDownVector': '⥏', - 'DownLeftRightVector': '⥐', - 'LeftUpDownVector': '⥑', - 'LeftVectorBar': '⥒', - 'RightVectorBar': '⥓', - 'RightUpVectorBar': '⥔', - 'RightDownVectorBar': '⥕', - 'DownLeftVectorBar': '⥖', - 'DownRightVectorBar': '⥗', - 'LeftUpVectorBar': '⥘', - 'LeftDownVectorBar': '⥙', - 'LeftTeeVector': '⥚', - 'RightTeeVector': '⥛', - 'RightUpTeeVector': '⥜', - 'RightDownTeeVector': '⥝', - 'DownLeftTeeVector': '⥞', - 'DownRightTeeVector': '⥟', - 'LeftUpTeeVector': '⥠', - 'LeftDownTeeVector': '⥡', - 'lHar': '⥢', - 'uHar': '⥣', - 'rHar': '⥤', - 'dHar': '⥥', - 'luruhar': '⥦', - 'ldrdhar': '⥧', - 'ruluhar': '⥨', - 'rdldhar': '⥩', - 'lharul': '⥪', - 'llhard': '⥫', - 'rharul': '⥬', - 'lrhard': '⥭', - 'udhar': '⥮', - 'duhar': '⥯', - 'RoundImplies': '⥰', - 'erarr': '⥱', - 'simrarr': '⥲', - 'larrsim': '⥳', - 'rarrsim': '⥴', - 'rarrap': '⥵', - 'ltlarr': '⥶', - 'gtrarr': '⥸', - 'subrarr': '⥹', - 'suplarr': '⥻', - 'lfisht': '⥼', - 'rfisht': '⥽', - 'ufisht': '⥾', - 'dfisht': '⥿', - 'lopar': '⦅', - 'ropar': '⦆', - 'lbrke': '⦋', - 'rbrke': '⦌', - 'lbrkslu': '⦍', - 'rbrksld': '⦎', - 'lbrksld': '⦏', - 'rbrkslu': '⦐', - 'langd': '⦑', - 'rangd': '⦒', - 'lparlt': '⦓', - 'rpargt': '⦔', - 'gtlPar': '⦕', - 'ltrPar': '⦖', - 'vzigzag': '⦚', - 'vangrt': '⦜', - 'angrtvbd': '⦝', - 'ange': '⦤', - 'range': '⦥', - 'dwangle': '⦦', - 'uwangle': '⦧', - 'angmsdaa': '⦨', - 'angmsdab': '⦩', - 'angmsdac': '⦪', - 'angmsdad': '⦫', - 'angmsdae': '⦬', - 'angmsdaf': '⦭', - 'angmsdag': '⦮', - 'angmsdah': '⦯', - 'bemptyv': '⦰', - 'demptyv': '⦱', - 'cemptyv': '⦲', - 'raemptyv': '⦳', - 'laemptyv': '⦴', - 'ohbar': '⦵', - 'omid': '⦶', - 'opar': '⦷', - 'operp': '⦹', - 'olcross': '⦻', - 'odsold': '⦼', - 'olcir': '⦾', - 'ofcir': '⦿', - 'olt': '⧀', - 'ogt': '⧁', - 'cirscir': '⧂', - 'cirE': '⧃', - 'solb': '⧄', - 'bsolb': '⧅', - 'boxbox': '⧉', - 'trisb': '⧍', - 'rtriltri': '⧎', - 'LeftTriangleBar': '⧏', - 'RightTriangleBar': '⧐', - 'iinfin': '⧜', - 'infintie': '⧝', - 'nvinfin': '⧞', - 'eparsl': '⧣', - 'smeparsl': '⧤', - 'eqvparsl': '⧥', - 'lozf': '⧫', - 'RuleDelayed': '⧴', - 'dsol': '⧶', - 'xodot': '⨀', - 'xoplus': '⨁', - 'xotime': '⨂', - 'xuplus': '⨄', - 'xsqcup': '⨆', - 'qint': '⨌', - 'fpartint': '⨍', - 'cirfnint': '⨐', - 'awint': '⨑', - 'rppolint': '⨒', - 'scpolint': '⨓', - 'npolint': '⨔', - 'pointint': '⨕', - 'quatint': '⨖', - 'intlarhk': '⨗', - 'pluscir': '⨢', - 'plusacir': '⨣', - 'simplus': '⨤', - 'plusdu': '⨥', - 'plussim': '⨦', - 'plustwo': '⨧', - 'mcomma': '⨩', - 'minusdu': '⨪', - 'loplus': '⨭', - 'roplus': '⨮', - 'Cross': '⨯', - 'timesd': '⨰', - 'timesbar': '⨱', - 'smashp': '⨳', - 'lotimes': '⨴', - 'rotimes': '⨵', - 'otimesas': '⨶', - 'Otimes': '⨷', - 'odiv': '⨸', - 'triplus': '⨹', - 'triminus': '⨺', - 'tritime': '⨻', - 'iprod': '⨼', - 'amalg': '⨿', - 'capdot': '⩀', - 'ncup': '⩂', - 'ncap': '⩃', - 'capand': '⩄', - 'cupor': '⩅', - 'cupcap': '⩆', - 'capcup': '⩇', - 'cupbrcap': '⩈', - 'capbrcup': '⩉', - 'cupcup': '⩊', - 'capcap': '⩋', - 'ccups': '⩌', - 'ccaps': '⩍', - 'ccupssm': '⩐', - 'And': '⩓', - 'Or': '⩔', - 'andand': '⩕', - 'oror': '⩖', - 'orslope': '⩗', - 'andslope': '⩘', - 'andv': '⩚', - 'orv': '⩛', - 'andd': '⩜', - 'ord': '⩝', - 'wedbar': '⩟', - 'sdote': '⩦', - 'simdot': '⩪', - 'congdot': '⩭', - 'easter': '⩮', - 'apacir': '⩯', - 'apE': '⩰', - 'eplus': '⩱', - 'pluse': '⩲', - 'Esim': '⩳', - 'Colone': '⩴', - 'Equal': '⩵', - 'eDDot': '⩷', - 'equivDD': '⩸', - 'ltcir': '⩹', - 'gtcir': '⩺', - 'ltquest': '⩻', - 'gtquest': '⩼', - 'les': '⩽', - 'ges': '⩾', - 'lesdot': '⩿', - 'gesdot': '⪀', - 'lesdoto': '⪁', - 'gesdoto': '⪂', - 'lesdotor': '⪃', - 'gesdotol': '⪄', - 'lessapprox': '⪅', - 'gtrapprox': '⪆', - 'lneq': '⪇', - 'gneq': '⪈', - 'lnapprox': '⪉', - 'gnapprox': '⪊', - 'lesseqqgtr': '⪋', - 'gtreqqless': '⪌', - 'lsime': '⪍', - 'gsime': '⪎', - 'lsimg': '⪏', - 'gsiml': '⪐', - 'lgE': '⪑', - 'glE': '⪒', - 'lesges': '⪓', - 'gesles': '⪔', - 'eqslantless': '⪕', - 'eqslantgtr': '⪖', - 'elsdot': '⪗', - 'egsdot': '⪘', - 'el': '⪙', - 'eg': '⪚', - 'siml': '⪝', - 'simg': '⪞', - 'simlE': '⪟', - 'simgE': '⪠', - 'LessLess': '⪡', - 'GreaterGreater': '⪢', - 'glj': '⪤', - 'gla': '⪥', - 'ltcc': '⪦', - 'gtcc': '⪧', - 'lescc': '⪨', - 'gescc': '⪩', - 'smt': '⪪', - 'lat': '⪫', - 'smte': '⪬', - 'late': '⪭', - 'bumpE': '⪮', - 'preceq': '⪯', - 'succeq': '⪰', - 'prE': '⪳', - 'scE': '⪴', - 'prnE': '⪵', - 'succneqq': '⪶', - 'precapprox': '⪷', - 'succapprox': '⪸', - 'prnap': '⪹', - 'succnapprox': '⪺', - 'Pr': '⪻', - 'Sc': '⪼', - 'subdot': '⪽', - 'supdot': '⪾', - 'subplus': '⪿', - 'supplus': '⫀', - 'submult': '⫁', - 'supmult': '⫂', - 'subedot': '⫃', - 'supedot': '⫄', - 'subseteqq': '⫅', - 'supseteqq': '⫆', - 'subsim': '⫇', - 'supsim': '⫈', - 'subsetneqq': '⫋', - 'supsetneqq': '⫌', - 'csub': '⫏', - 'csup': '⫐', - 'csube': '⫑', - 'csupe': '⫒', - 'subsup': '⫓', - 'supsub': '⫔', - 'subsub': '⫕', - 'supsup': '⫖', - 'suphsub': '⫗', - 'supdsub': '⫘', - 'forkv': '⫙', - 'topfork': '⫚', - 'mlcp': '⫛', - 'DoubleLeftTee': '⫤', - 'Vdashl': '⫦', - 'Barv': '⫧', - 'vBar': '⫨', - 'vBarv': '⫩', - 'Vbar': '⫫', - 'Not': '⫬', - 'bNot': '⫭', - 'rnmid': '⫮', - 'cirmid': '⫯', - 'midcir': '⫰', - 'topcir': '⫱', - 'nhpar': '⫲', - 'parsim': '⫳', - 'parsl': '⫽', - 'fflig': 'ff', - 'filig': 'fi', - 'fllig': 'fl', - 'ffilig': 'ffi', - 'ffllig': 'ffl', - 'Ascr': '풜', - 'Cscr': '풞', - 'Dscr': '풟', - 'Gscr': '풢', - 'Jscr': '풥', - 'Kscr': '풦', - 'Nscr': '풩', - 'Oscr': '풪', - 'Pscr': '풫', - 'Qscr': '풬', - 'Sscr': '풮', - 'Tscr': '풯', - 'Uscr': '풰', - 'Vscr': '풱', - 'Wscr': '풲', - 'Xscr': '풳', - 'Yscr': '풴', - 'Zscr': '풵', - 'ascr': '풶', - 'bscr': '풷', - 'cscr': '풸', - 'dscr': '풹', - 'fscr': '풻', - 'hscr': '풽', - 'iscr': '풾', - 'jscr': '풿', - 'kscr': '퓀', - 'lscr': '퓁', - 'mscr': '퓂', - 'nscr': '퓃', - 'pscr': '퓅', - 'qscr': '퓆', - 'rscr': '퓇', - 'sscr': '퓈', - 'tscr': '퓉', - 'uscr': '퓊', - 'vscr': '퓋', - 'wscr': '퓌', - 'xscr': '퓍', - 'yscr': '퓎', - 'zscr': '퓏', - 'Afr': '프', - 'Bfr': '픅', - 'Dfr': '픇', - 'Efr': '픈', - 'Ffr': '픉', - 'Gfr': '픊', - 'Jfr': '픍', - 'Kfr': '픎', - 'Lfr': '픏', - 'Mfr': '픐', - 'Nfr': '픑', - 'Ofr': '픒', - 'Pfr': '픓', - 'Qfr': '픔', - 'Sfr': '픖', - 'Tfr': '픗', - 'Ufr': '픘', - 'Vfr': '픙', - 'Wfr': '픚', - 'Xfr': '픛', - 'Yfr': '픜', - 'afr': '픞', - 'bfr': '픟', - 'cfr': '픠', - 'dfr': '픡', - 'efr': '픢', - 'ffr': '픣', - 'gfr': '픤', - 'hfr': '픥', - 'ifr': '픦', - 'jfr': '픧', - 'kfr': '픨', - 'lfr': '픩', - 'mfr': '픪', - 'nfr': '픫', - 'ofr': '픬', - 'pfr': '픭', - 'qfr': '픮', - 'rfr': '픯', - 'sfr': '픰', - 'tfr': '픱', - 'ufr': '픲', - 'vfr': '픳', - 'wfr': '픴', - 'xfr': '픵', - 'yfr': '픶', - 'zfr': '픷', - 'Aopf': '픸', - 'Bopf': '픹', - 'Dopf': '픻', - 'Eopf': '피', - 'Fopf': '픽', - 'Gopf': '픾', - 'Iopf': '핀', - 'Jopf': '핁', - 'Kopf': '핂', - 'Lopf': '핃', - 'Mopf': '필', - 'Oopf': '핆', - 'Sopf': '핊', - 'Topf': '핋', - 'Uopf': '핌', - 'Vopf': '핍', - 'Wopf': '핎', - 'Xopf': '핏', - 'Yopf': '핐', - 'aopf': '핒', - 'bopf': '핓', - 'copf': '핔', - 'dopf': '핕', - 'eopf': '핖', - 'fopf': '핗', - 'gopf': '하', - 'hopf': '학', - 'iopf': '핚', - 'jopf': '핛', - 'kopf': '한', - 'lopf': '핝', - 'mopf': '핞', - 'nopf': '핟', - 'oopf': '할', - 'popf': '핡', - 'qopf': '핢', - 'ropf': '핣', - 'sopf': '핤', - 'topf': '핥', - 'uopf': '핦', - 'vopf': '핧', - 'wopf': '함', - 'xopf': '합', - 'yopf': '핪', - 'zopf': '핫' -}; - -var specialCharEntities = { - '&': '&', - '"': '"', - '<': '<', - '>': '>', - '\xA0': ' ' -}; - -var entityRegExp = /&(?:#([0-9]+)|#x([0-9a-f]+)|([a-z0-9]+));/gi; -var attributeModeSpecialCharRegExp = /["&<>\xA0]/g; -var nonAttributeModeSpecialCharRegExp = /[&<>\xA0]/g; - -exports.HTMLDecode = function decode(s) { - if (!s) return ''; - return s.replace(entityRegExp, function ($0, decimalStr, hexStr, entityName) { - if (decimalStr) { - return String.fromCharCode(parseInt(decimalStr, 10)); - } else if (hexStr) { - return String.fromCharCode(parseInt(hexStr, 16)); - } else { - // Fall back to the original string if we don't know the entity, as per browser behavior: - return charByEntityName[entityName] || $0; - } - }); -}; - -function specialCharToEntity(s) { - var entity = specialCharEntities[s]; - return entity ? entity : s; -} - -exports.HTMLEncode = function encode(s, attributeMode) { - if (!s) return ''; - if (!s.replace) return s; - if(attributeMode) { - return s.replace(attributeModeSpecialCharRegExp, specialCharToEntity); - } else { - return s.replace(nonAttributeModeSpecialCharRegExp, specialCharToEntity); - } -}; diff --git a/node_modules/jsdom/lib/jsdom/browser/htmltodom.js b/node_modules/jsdom/lib/jsdom/browser/htmltodom.js deleted file mode 100644 index 1ea28cc..0000000 --- a/node_modules/jsdom/lib/jsdom/browser/htmltodom.js +++ /dev/null @@ -1,187 +0,0 @@ -var HTMLDecode = require('./htmlencoding').HTMLDecode; - -function HtmlToDom(parser) { - - if(parser && parser.write) { - // sax parser - this.appendHtmlToElement = function(html, element){ - - var currentElement = element, currentLevel = 0; - - parser.onerror = function (e) {}; - - parser.ontext = function (t) { - var ownerDocument = currentElement.ownerDocument || currentElement; - var newText = ownerDocument.createTextNode(t); - currentElement.appendChild(newText); - }; - - parser.onopentag = function (node) { - var nodeName = node.name.toLowerCase(), - document = currentElement.ownerDocument || currentElement, - newElement = document.createElement(nodeName), - i = 0, - length = (node.attributes && node.attributes.length) ? - node.attributes.length : - 0; - - for (i in node.attributes) { - if (node.attributes.hasOwnProperty(i)) { - newElement.setAttribute(i, node.attributes[i]); - } - } - - for (i=0; i 0) { - if (element.nodeType == 9) { - new parser.Parser({document: element}).parse(html); - } - else { - var p = new parser.Parser({document: element.ownerDocument}); - p.parse_fragment(html, element); - } - } - }; - } else { - - this.appendHtmlToElement = function(){ - console.log(''); - console.log('###########################################################'); - console.log('# WARNING: No HTML parser could be found.'); - console.log('# Element.innerHTML setter support has been disabled'); - console.log('# Element.innerHTML getter support will still function'); - console.log('# Download: http://github.com/tautologistics/node-htmlparser'); - console.log('###########################################################'); - console.log(''); - }; - - } -}; - -// utility function for forgiving parser -function setChild(parent, node) { - - var c, newNode, currentDocument = parent._ownerDocument || parent; - - switch (node.type) - { - case 'tag': - case 'script': - case 'style': - try { - newNode = currentDocument.createElement(node.name); - if (node.location) { - newNode.sourceLocation = node.location; - newNode.sourceLocation.file = parent.sourceLocation.file; - } - } catch (err) { - currentDocument.raise('error', 'invalid markup', { - exception: err, - node : node - }); - - return null; - } - break; - - case 'text': - // Decode HTML entities if we're not inside a - , Style: "style" //Special tag - , Tag: "tag" //Any tag that isn't special -} - -function Parser (handler, options) { - this._options = options ? options : { }; - if (this._options.includeLocation == undefined) { - this._options.includeLocation = false; //Do not track element position in document by default - } - - this.validateHandler(handler); - this._handler = handler; - this.reset(); -} - - //**"Static"**// - //Regular expressions used for cleaning up and parsing (stateless) - Parser._reTrim = /(^\s+|\s+$)/g; //Trim leading/trailing whitespace - Parser._reTrimComment = /(^\!--|--$)/g; //Remove comment tag markup from comment contents - Parser._reWhitespace = /\s/g; //Used to find any whitespace to split on - Parser._reTagName = /^\s*(\/?)\s*([^\s\/]+)/; //Used to find the tag name for an element - - //Regular expressions used for parsing (stateful) - Parser._reAttrib = //Find attributes in a tag - /([^=<>\"\'\s]+)\s*=\s*"([^"]*)"|([^=<>\"\'\s]+)\s*=\s*'([^']*)'|([^=<>\"\'\s]+)\s*=\s*([^'"\s]+)|([^=<>\"\'\s\/]+)/g; - Parser._reTags = /[\<\>]/g; //Find tag markers - - //**Public**// - //Methods// - //Parses a complete HTML and pushes it to the handler - Parser.prototype.parseComplete = function Parser$parseComplete (data) { - this.reset(); - this.parseChunk(data); - this.done(); - } - - //Parses a piece of an HTML document - Parser.prototype.parseChunk = function Parser$parseChunk (data) { - if (this._done) - this.handleError(new Error("Attempted to parse chunk after parsing already done")); - this._buffer += data; //FIXME: this can be a bottleneck - this.parseTags(); - } - - //Tells the parser that the HTML being parsed is complete - Parser.prototype.done = function Parser$done () { - if (this._done) - return; - this._done = true; - - //Push any unparsed text into a final element in the element list - if (this._buffer.length) { - var rawData = this._buffer; - this._buffer = ""; - var element = { - raw: rawData - , data: (this._parseState == ElementType.Text) ? rawData : rawData.replace(Parser._reTrim, "") - , type: this._parseState - }; - if (this._parseState == ElementType.Tag || this._parseState == ElementType.Script || this._parseState == ElementType.Style) - element.name = this.parseTagName(element.data); - this.parseAttribs(element); - this._elements.push(element); - } - - this.writeHandler(); - this._handler.done(); - } - - //Resets the parser to a blank state, ready to parse a new HTML document - Parser.prototype.reset = function Parser$reset () { - this._buffer = ""; - this._done = false; - this._elements = []; - this._elementsCurrent = 0; - this._current = 0; - this._next = 0; - this._location = { - row: 0 - , col: 0 - , charOffset: 0 - , inBuffer: 0 - }; - this._parseState = ElementType.Text; - this._prevTagSep = ''; - this._tagStack = []; - this._handler.reset(); - } - - //**Private**// - //Properties// - Parser.prototype._options = null; //Parser options for how to behave - Parser.prototype._handler = null; //Handler for parsed elements - Parser.prototype._buffer = null; //Buffer of unparsed data - Parser.prototype._done = false; //Flag indicating whether parsing is done - Parser.prototype._elements = null; //Array of parsed elements - Parser.prototype._elementsCurrent = 0; //Pointer to last element in _elements that has been processed - Parser.prototype._current = 0; //Position in data that has already been parsed - Parser.prototype._next = 0; //Position in data of the next tag marker (<>) - Parser.prototype._location = null; //Position tracking for elements in a stream - Parser.prototype._parseState = ElementType.Text; //Current type of element being parsed - Parser.prototype._prevTagSep = ''; //Previous tag marker found - //Stack of element types previously encountered; keeps track of when - //parsing occurs inside a script/comment/style tag - Parser.prototype._tagStack = null; - - //Methods// - //Takes an array of elements and parses any found attributes - Parser.prototype.parseTagAttribs = function Parser$parseTagAttribs (elements) { - var idxEnd = elements.length; - var idx = 0; - - while (idx < idxEnd) { - var element = elements[idx++]; - if (element.type == ElementType.Tag || element.type == ElementType.Script || element.type == ElementType.style) - this.parseAttribs(element); - } - - return(elements); - } - - //Takes an element and adds an "attribs" property for any element attributes found - Parser.prototype.parseAttribs = function Parser$parseAttribs (element) { - //Only parse attributes for tags - if (element.type != ElementType.Script && element.type != ElementType.Style && element.type != ElementType.Tag) - return; - - var tagName = element.data.split(Parser._reWhitespace, 1)[0]; - var attribRaw = element.data.substring(tagName.length); - if (attribRaw.length < 1) - return; - - var match; - Parser._reAttrib.lastIndex = 0; - while (match = Parser._reAttrib.exec(attribRaw)) { - if (element.attribs == undefined) - element.attribs = {}; - - if (typeof match[1] == "string" && match[1].length) { - element.attribs[match[1]] = match[2]; - } else if (typeof match[3] == "string" && match[3].length) { - element.attribs[match[3].toString()] = match[4].toString(); - } else if (typeof match[5] == "string" && match[5].length) { - element.attribs[match[5]] = match[6]; - } else if (typeof match[7] == "string" && match[7].length) { - element.attribs[match[7]] = match[7]; - } - } - } - - //Extracts the base tag name from the data value of an element - Parser.prototype.parseTagName = function Parser$parseTagName (data) { - if (data == null || data == "") - return(""); - var match = Parser._reTagName.exec(data); - if (!match) - return(""); - return((match[1] ? "/" : "") + match[2]); - } - - //Parses through HTML text and returns an array of found elements - //I admit, this function is rather large but splitting up had an noticeable impact on speed - Parser.prototype.parseTags = function Parser$parseTags () { - var bufferEnd = this._buffer.length - 1; - while (Parser._reTags.test(this._buffer)) { - this._next = Parser._reTags.lastIndex - 1; - var tagSep = this._buffer.charAt(this._next); //The currently found tag marker - var rawData = this._buffer.substring(this._current, this._next); //The next chunk of data to parse - - //A new element to eventually be appended to the element list - var element = { - raw: rawData - , data: (this._parseState == ElementType.Text) ? rawData : rawData.replace(Parser._reTrim, "") - , type: this._parseState - }; - - var elementName = this.parseTagName(element.data); - - //This section inspects the current tag stack and modifies the current - //element if we're actually parsing a special area (script/comment/style tag) - if (this._tagStack.length) { //We're parsing inside a script/comment/style tag - if (this._tagStack[this._tagStack.length - 1] == ElementType.Script) { //We're currently in a script tag - if (elementName.toLowerCase() == "/script") //Actually, we're no longer in a script tag, so pop it off the stack - this._tagStack.pop(); - else { //Not a closing script tag - if (element.raw.indexOf("!--") != 0) { //Make sure we're not in a comment - //All data from here to script close is now a text element - element.type = ElementType.Text; - //If the previous element is text, append the current text to it - if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Text) { - var prevElement = this._elements[this._elements.length - 1]; - prevElement.raw = prevElement.data = prevElement.raw + this._prevTagSep + element.raw; - element.raw = element.data = ""; //This causes the current element to not be added to the element list - } - } - } - } - else if (this._tagStack[this._tagStack.length - 1] == ElementType.Style) { //We're currently in a style tag - if (elementName.toLowerCase() == "/style") //Actually, we're no longer in a style tag, so pop it off the stack - this._tagStack.pop(); - else { - if (element.raw.indexOf("!--") != 0) { //Make sure we're not in a comment - //All data from here to style close is now a text element - element.type = ElementType.Text; - //If the previous element is text, append the current text to it - if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Text) { - var prevElement = this._elements[this._elements.length - 1]; - if (element.raw != "") { - prevElement.raw = prevElement.data = prevElement.raw + this._prevTagSep + element.raw; - element.raw = element.data = ""; //This causes the current element to not be added to the element list - } else { //Element is empty, so just append the last tag marker found - prevElement.raw = prevElement.data = prevElement.raw + this._prevTagSep; - } - } else { //The previous element was not text - if (element.raw != "") { - element.raw = element.data = element.raw; - } - } - } - } - } - else if (this._tagStack[this._tagStack.length - 1] == ElementType.Comment) { //We're currently in a comment tag - var rawLen = element.raw.length; - if (element.raw.charAt(rawLen - 2) == "-" && element.raw.charAt(rawLen - 1) == "-" && tagSep == ">") { - //Actually, we're no longer in a style tag, so pop it off the stack - this._tagStack.pop(); - //If the previous element is a comment, append the current text to it - if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Comment) { - var prevElement = this._elements[this._elements.length - 1]; - prevElement.raw = prevElement.data = (prevElement.raw + element.raw).replace(Parser._reTrimComment, ""); - element.raw = element.data = ""; //This causes the current element to not be added to the element list - element.type = ElementType.Text; - } - else //Previous element not a comment - element.type = ElementType.Comment; //Change the current element's type to a comment - } - else { //Still in a comment tag - element.type = ElementType.Comment; - //If the previous element is a comment, append the current text to it - if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Comment) { - var prevElement = this._elements[this._elements.length - 1]; - prevElement.raw = prevElement.data = prevElement.raw + element.raw + tagSep; - element.raw = element.data = ""; //This causes the current element to not be added to the element list - element.type = ElementType.Text; - } - else - element.raw = element.data = element.raw + tagSep; - } - } - } - - //Processing of non-special tags - if (element.type == ElementType.Tag) { - element.name = elementName; - var elementNameCI = elementName.toLowerCase(); - - if (element.raw.indexOf("!--") == 0) { //This tag is really comment - element.type = ElementType.Comment; - delete element["name"]; - var rawLen = element.raw.length; - //Check if the comment is terminated in the current element - if (element.raw.charAt(rawLen - 1) == "-" && element.raw.charAt(rawLen - 2) == "-" && tagSep == ">") - element.raw = element.data = element.raw.replace(Parser._reTrimComment, ""); - else { //It's not so push the comment onto the tag stack - element.raw += tagSep; - this._tagStack.push(ElementType.Comment); - } - } - else if (element.raw.indexOf("!") == 0 || element.raw.indexOf("?") == 0) { - element.type = ElementType.Directive; - //TODO: what about CDATA? - } - else if (elementNameCI == "script") { - element.type = ElementType.Script; - //Special tag, push onto the tag stack if not terminated - if (element.data.charAt(element.data.length - 1) != "/") - this._tagStack.push(ElementType.Script); - } - else if (elementNameCI == "/script") - element.type = ElementType.Script; - else if (elementNameCI == "style") { - element.type = ElementType.Style; - //Special tag, push onto the tag stack if not terminated - if (element.data.charAt(element.data.length - 1) != "/") - this._tagStack.push(ElementType.Style); - } - else if (elementNameCI == "/style") - element.type = ElementType.Style; - if (element.name && element.name.charAt(0) == "/") - element.data = element.name; - } - - //Add all tags and non-empty text elements to the element list - if (element.raw != "" || element.type != ElementType.Text) { - if (this._options.includeLocation && !element.location) { - element.location = this.getLocation(element.type == ElementType.Tag); - } - this.parseAttribs(element); - this._elements.push(element); - //If tag self-terminates, add an explicit, separate closing tag - if ( - element.type != ElementType.Text - && - element.type != ElementType.Comment - && - element.type != ElementType.Directive - && - element.data.charAt(element.data.length - 1) == "/" - ) - this._elements.push({ - raw: "/" + element.name - , data: "/" + element.name - , name: "/" + element.name - , type: element.type - }); - } - this._parseState = (tagSep == "<") ? ElementType.Tag : ElementType.Text; - this._current = this._next + 1; - this._prevTagSep = tagSep; - } - - if (this._options.includeLocation) { - this.getLocation(); - this._location.row += this._location.inBuffer; - this._location.inBuffer = 0; - this._location.charOffset = 0; - } - this._buffer = (this._current <= bufferEnd) ? this._buffer.substring(this._current) : ""; - this._current = 0; - - this.writeHandler(); - } - - Parser.prototype.getLocation = function Parser$getLocation (startTag) { - var c, - l = this._location, - end = this._current - (startTag ? 1 : 0), - chunk = startTag && l.charOffset == 0 && this._current == 0; - - for (; l.charOffset < end; l.charOffset++) { - c = this._buffer.charAt(l.charOffset); - if (c == '\n') { - l.inBuffer++; - l.col = 0; - } else if (c != '\r') { - l.col++; - } - } - return { - line: l.row + l.inBuffer + 1 - , col: l.col + (chunk ? 0: 1) - }; - } - - //Checks the handler to make it is an object with the right "interface" - Parser.prototype.validateHandler = function Parser$validateHandler (handler) { - if ((typeof handler) != "object") - throw new Error("Handler is not an object"); - if ((typeof handler.reset) != "function") - throw new Error("Handler method 'reset' is invalid"); - if ((typeof handler.done) != "function") - throw new Error("Handler method 'done' is invalid"); - if ((typeof handler.writeTag) != "function") - throw new Error("Handler method 'writeTag' is invalid"); - if ((typeof handler.writeText) != "function") - throw new Error("Handler method 'writeText' is invalid"); - if ((typeof handler.writeComment) != "function") - throw new Error("Handler method 'writeComment' is invalid"); - if ((typeof handler.writeDirective) != "function") - throw new Error("Handler method 'writeDirective' is invalid"); - } - - //Writes parsed elements out to the handler - Parser.prototype.writeHandler = function Parser$writeHandler (forceFlush) { - forceFlush = !!forceFlush; - if (this._tagStack.length && !forceFlush) - return; - while (this._elements.length) { - var element = this._elements.shift(); - switch (element.type) { - case ElementType.Comment: - this._handler.writeComment(element); - break; - case ElementType.Directive: - this._handler.writeDirective(element); - break; - case ElementType.Text: - this._handler.writeText(element); - break; - default: - this._handler.writeTag(element); - break; - } - } - } - - Parser.prototype.handleError = function Parser$handleError (error) { - if ((typeof this._handler.error) == "function") - this._handler.error(error); - else - throw error; - } - -//TODO: make this a trully streamable handler -function RssHandler (callback) { - RssHandler.super_.call(this, callback, { ignoreWhitespace: true, verbose: false, enforceEmptyTags: false }); -} -inherits(RssHandler, DefaultHandler); - - RssHandler.prototype.done = function RssHandler$done () { - var feed = { }; - var feedRoot; - - var found = DomUtils.getElementsByTagName(function (value) { return(value == "rss" || value == "feed"); }, this.dom, false); - if (found.length) { - feedRoot = found[0]; - } - if (feedRoot) { - if (feedRoot.name == "rss") { - feed.type = "rss"; - feedRoot = feedRoot.children[0]; // - feed.id = ""; - try { - feed.title = DomUtils.getElementsByTagName("title", feedRoot.children, false)[0].children[0].data; - } catch (ex) { } - try { - feed.link = DomUtils.getElementsByTagName("link", feedRoot.children, false)[0].children[0].data; - } catch (ex) { } - try { - feed.description = DomUtils.getElementsByTagName("description", feedRoot.children, false)[0].children[0].data; - } catch (ex) { } - try { - feed.updated = new Date(DomUtils.getElementsByTagName("lastBuildDate", feedRoot.children, false)[0].children[0].data); - } catch (ex) { } - try { - feed.author = DomUtils.getElementsByTagName("managingEditor", feedRoot.children, false)[0].children[0].data; - } catch (ex) { } - feed.items = []; - DomUtils.getElementsByTagName("item", feedRoot.children).forEach(function (item, index, list) { - var entry = {}; - try { - entry.id = DomUtils.getElementsByTagName("guid", item.children, false)[0].children[0].data; - } catch (ex) { } - try { - entry.title = DomUtils.getElementsByTagName("title", item.children, false)[0].children[0].data; - } catch (ex) { } - try { - entry.link = DomUtils.getElementsByTagName("link", item.children, false)[0].children[0].data; - } catch (ex) { } - try { - entry.description = DomUtils.getElementsByTagName("description", item.children, false)[0].children[0].data; - } catch (ex) { } - try { - entry.pubDate = new Date(DomUtils.getElementsByTagName("pubDate", item.children, false)[0].children[0].data); - } catch (ex) { } - feed.items.push(entry); - }); - } else { - feed.type = "atom"; - try { - feed.id = DomUtils.getElementsByTagName("id", feedRoot.children, false)[0].children[0].data; - } catch (ex) { } - try { - feed.title = DomUtils.getElementsByTagName("title", feedRoot.children, false)[0].children[0].data; - } catch (ex) { } - try { - feed.link = DomUtils.getElementsByTagName("link", feedRoot.children, false)[0].attribs.href; - } catch (ex) { } - try { - feed.description = DomUtils.getElementsByTagName("subtitle", feedRoot.children, false)[0].children[0].data; - } catch (ex) { } - try { - feed.updated = new Date(DomUtils.getElementsByTagName("updated", feedRoot.children, false)[0].children[0].data); - } catch (ex) { } - try { - feed.author = DomUtils.getElementsByTagName("email", feedRoot.children, true)[0].children[0].data; - } catch (ex) { } - feed.items = []; - DomUtils.getElementsByTagName("entry", feedRoot.children).forEach(function (item, index, list) { - var entry = {}; - try { - entry.id = DomUtils.getElementsByTagName("id", item.children, false)[0].children[0].data; - } catch (ex) { } - try { - entry.title = DomUtils.getElementsByTagName("title", item.children, false)[0].children[0].data; - } catch (ex) { } - try { - entry.link = DomUtils.getElementsByTagName("link", item.children, false)[0].attribs.href; - } catch (ex) { } - try { - entry.description = DomUtils.getElementsByTagName("summary", item.children, false)[0].children[0].data; - } catch (ex) { } - try { - entry.pubDate = new Date(DomUtils.getElementsByTagName("updated", item.children, false)[0].children[0].data); - } catch (ex) { } - feed.items.push(entry); - }); - } - - this.dom = feed; - } - RssHandler.super_.prototype.done.call(this); - } - -/////////////////////////////////////////////////// - -function DefaultHandler (callback, options) { - this.reset(); - this._options = options ? options : { }; - if (this._options.ignoreWhitespace == undefined) - this._options.ignoreWhitespace = false; //Keep whitespace-only text nodes - if (this._options.verbose == undefined) - this._options.verbose = true; //Keep data property for tags and raw property for all - if (this._options.enforceEmptyTags == undefined) - this._options.enforceEmptyTags = true; //Don't allow children for HTML tags defined as empty in spec - if ((typeof callback) == "function") - this._callback = callback; -} - - //**"Static"**// - //HTML Tags that shouldn't contain child nodes - DefaultHandler._emptyTags = { - area: 1 - , base: 1 - , basefont: 1 - , br: 1 - , col: 1 - , frame: 1 - , hr: 1 - , img: 1 - , input: 1 - , isindex: 1 - , link: 1 - , meta: 1 - , param: 1 - , embed: 1 - } - //Regex to detect whitespace only text nodes - DefaultHandler.reWhitespace = /^\s*$/; - - //**Public**// - //Properties// - DefaultHandler.prototype.dom = null; //The hierarchical object containing the parsed HTML - //Methods// - //Resets the handler back to starting state - DefaultHandler.prototype.reset = function DefaultHandler$reset() { - this.dom = []; - this._done = false; - this._tagStack = []; - this._tagStack.last = function DefaultHandler$_tagStack$last () { - return(this.length ? this[this.length - 1] : null); - } - } - //Signals the handler that parsing is done - DefaultHandler.prototype.done = function DefaultHandler$done () { - this._done = true; - this.handleCallback(null); - } - DefaultHandler.prototype.writeTag = function DefaultHandler$writeTag (element) { - this.handleElement(element); - } - DefaultHandler.prototype.writeText = function DefaultHandler$writeText (element) { - if (this._options.ignoreWhitespace) - if (DefaultHandler.reWhitespace.test(element.data)) - return; - this.handleElement(element); - } - DefaultHandler.prototype.writeComment = function DefaultHandler$writeComment (element) { - this.handleElement(element); - } - DefaultHandler.prototype.writeDirective = function DefaultHandler$writeDirective (element) { - this.handleElement(element); - } - DefaultHandler.prototype.error = function DefaultHandler$error (error) { - this.handleCallback(error); - } - - //**Private**// - //Properties// - DefaultHandler.prototype._options = null; //Handler options for how to behave - DefaultHandler.prototype._callback = null; //Callback to respond to when parsing done - DefaultHandler.prototype._done = false; //Flag indicating whether handler has been notified of parsing completed - DefaultHandler.prototype._tagStack = null; //List of parents to the currently element being processed - //Methods// - DefaultHandler.prototype.handleCallback = function DefaultHandler$handleCallback (error) { - if ((typeof this._callback) != "function") - if (error) - throw error; - else - return; - this._callback(error, this.dom); - } - - DefaultHandler.prototype.isEmptyTag = function(element) { - var name = element.name.toLowerCase(); - if (name.charAt(0) == '/') { - name = name.substring(1); - } - return this._options.enforceEmptyTags && !!DefaultHandler._emptyTags[name]; - }; - - DefaultHandler.prototype.handleElement = function DefaultHandler$handleElement (element) { - if (this._done) - this.handleCallback(new Error("Writing to the handler after done() called is not allowed without a reset()")); - if (!this._options.verbose) { -// element.raw = null; //FIXME: Not clean - //FIXME: Serious performance problem using delete - delete element.raw; - if (element.type == "tag" || element.type == "script" || element.type == "style") - delete element.data; - } - if (!this._tagStack.last()) { //There are no parent elements - //If the element can be a container, add it to the tag stack and the top level list - if (element.type != ElementType.Text && element.type != ElementType.Comment && element.type != ElementType.Directive) { - if (element.name.charAt(0) != "/") { //Ignore closing tags that obviously don't have an opening tag - this.dom.push(element); - if (!this.isEmptyTag(element)) { //Don't add tags to the tag stack that can't have children - this._tagStack.push(element); - } - } - } - else //Otherwise just add to the top level list - this.dom.push(element); - } - else { //There are parent elements - //If the element can be a container, add it as a child of the element - //on top of the tag stack and then add it to the tag stack - if (element.type != ElementType.Text && element.type != ElementType.Comment && element.type != ElementType.Directive) { - if (element.name.charAt(0) == "/") { - //This is a closing tag, scan the tagStack to find the matching opening tag - //and pop the stack up to the opening tag's parent - var baseName = element.name.substring(1); - if (!this.isEmptyTag(element)) { - var pos = this._tagStack.length - 1; - while (pos > -1 && this._tagStack[pos--].name != baseName) { } - if (pos > -1 || this._tagStack[0].name == baseName) - while (pos < this._tagStack.length - 1) - this._tagStack.pop(); - } - } - else { //This is not a closing tag - if (!this._tagStack.last().children) - this._tagStack.last().children = []; - this._tagStack.last().children.push(element); - if (!this.isEmptyTag(element)) //Don't add tags to the tag stack that can't have children - this._tagStack.push(element); - } - } - else { //This is not a container element - if (!this._tagStack.last().children) - this._tagStack.last().children = []; - this._tagStack.last().children.push(element); - } - } - } - - var DomUtils = { - testElement: function DomUtils$testElement (options, element) { - if (!element) { - return false; - } - - for (var key in options) { - if (key == "tag_name") { - if (element.type != "tag" && element.type != "script" && element.type != "style") { - return false; - } - if (!options["tag_name"](element.name)) { - return false; - } - } else if (key == "tag_type") { - if (!options["tag_type"](element.type)) { - return false; - } - } else if (key == "tag_contains") { - if (element.type != "text" && element.type != "comment" && element.type != "directive") { - return false; - } - if (!options["tag_contains"](element.data)) { - return false; - } - } else { - if (!element.attribs || !options[key](element.attribs[key])) { - return false; - } - } - } - - return true; - } - - , getElements: function DomUtils$getElements (options, currentElement, recurse, limit) { - recurse = (recurse === undefined || recurse === null) || !!recurse; - limit = isNaN(parseInt(limit)) ? -1 : parseInt(limit); - - if (!currentElement) { - return([]); - } - - var found = []; - var elementList; - - function getTest (checkVal) { - return(function (value) { return(value == checkVal); }); - } - for (var key in options) { - if ((typeof options[key]) != "function") { - options[key] = getTest(options[key]); - } - } - - if (DomUtils.testElement(options, currentElement)) { - found.push(currentElement); - } - - if (limit >= 0 && found.length >= limit) { - return(found); - } - - if (recurse && currentElement.children) { - elementList = currentElement.children; - } else if (currentElement instanceof Array) { - elementList = currentElement; - } else { - return(found); - } - - for (var i = 0; i < elementList.length; i++) { - found = found.concat(DomUtils.getElements(options, elementList[i], recurse, limit)); - if (limit >= 0 && found.length >= limit) { - break; - } - } - - return(found); - } - - , getElementById: function DomUtils$getElementById (id, currentElement, recurse) { - var result = DomUtils.getElements({ id: id }, currentElement, recurse, 1); - return(result.length ? result[0] : null); - } - - , getElementsByTagName: function DomUtils$getElementsByTagName (name, currentElement, recurse, limit) { - return(DomUtils.getElements({ tag_name: name }, currentElement, recurse, limit)); - } - - , getElementsByTagType: function DomUtils$getElementsByTagType (type, currentElement, recurse, limit) { - return(DomUtils.getElements({ tag_type: type }, currentElement, recurse, limit)); - } - } - - function inherits (ctor, superCtor) { - var tempCtor = function(){}; - tempCtor.prototype = superCtor.prototype; - ctor.super_ = superCtor; - ctor.prototype = new tempCtor(); - ctor.prototype.constructor = ctor; - } - -exports.Parser = Parser; - -exports.DefaultHandler = DefaultHandler; - -exports.RssHandler = RssHandler; - -exports.ElementType = ElementType; - -exports.DomUtils = DomUtils; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/lib/htmlparser.min.js b/node_modules/jsdom/node_modules/htmlparser/lib/htmlparser.min.js deleted file mode 100644 index c1281c5..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/lib/htmlparser.min.js +++ /dev/null @@ -1,22 +0,0 @@ -/*********************************************** -Copyright 2010, 2011, Chris Winberry . All rights reserved. -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. -***********************************************/ -/* v1.7.6 */ -(function(){function e(a,c){this._options=c?c:{};void 0==this._options.includeLocation&&(this._options.includeLocation=!1);this.validateHandler(a);this._handler=a;this.reset()}function j(a){j.super_.call(this,a,{ignoreWhitespace:!0,verbose:!1,enforceEmptyTags:!1})}function g(a,c){this.reset();this._options=c?c:{};void 0==this._options.ignoreWhitespace&&(this._options.ignoreWhitespace=!1);void 0==this._options.verbose&&(this._options.verbose=!0);void 0==this._options.enforceEmptyTags&&(this._options.enforceEmptyTags= !0);"function"==typeof a&&(this._callback=a)}if(!("function"==typeof require&&"object"==typeof exports&&"object"==typeof module&&"string"==typeof __filename&&"string"==typeof __dirname)){if(this.Tautologistics){if(this.Tautologistics.NodeHtmlParser)return}else this.Tautologistics={};this.Tautologistics.NodeHtmlParser={};exports=this.Tautologistics.NodeHtmlParser}var d={Text:"text",Directive:"directive",Comment:"comment",Script:"script",Style:"style",Tag:"tag"};e._reTrim=/(^\s+|\s+$)/g;e._reTrimComment= /(^\!--|--$)/g;e._reWhitespace=/\s/g;e._reTagName=/^\s*(\/?)\s*([^\s\/]+)/;e._reAttrib=/([^=<>\"\'\s]+)\s*=\s*"([^"]*)"|([^=<>\"\'\s]+)\s*=\s*'([^']*)'|([^=<>\"\'\s]+)\s*=\s*([^'"\s]+)|([^=<>\"\'\s\/]+)/g;e._reTags=/[\<\>]/g;e.prototype.parseComplete=function(a){this.reset();this.parseChunk(a);this.done()};e.prototype.parseChunk=function(a){this._done&&this.handleError(Error("Attempted to parse chunk after parsing already done"));this._buffer+=a;this.parseTags()};e.prototype.done=function(){if(!this._done){this._done= !0;if(this._buffer.length){var a=this._buffer;this._buffer="";a={raw:a,data:this._parseState==d.Text?a:a.replace(e._reTrim,""),type:this._parseState};if(this._parseState==d.Tag||this._parseState==d.Script||this._parseState==d.Style)a.name=this.parseTagName(a.data);this.parseAttribs(a);this._elements.push(a)}this.writeHandler();this._handler.done()}};e.prototype.reset=function(){this._buffer="";this._done=!1;this._elements=[];this._next=this._current=this._elementsCurrent=0;this._location={row:0,col:0, charOffset:0,inBuffer:0};this._parseState=d.Text;this._prevTagSep="";this._tagStack=[];this._handler.reset()};e.prototype._options=null;e.prototype._handler=null;e.prototype._buffer=null;e.prototype._done=!1;e.prototype._elements=null;e.prototype._elementsCurrent=0;e.prototype._current=0;e.prototype._next=0;e.prototype._location=null;e.prototype._parseState=d.Text;e.prototype._prevTagSep="";e.prototype._tagStack=null;e.prototype.parseTagAttribs=function(a){for(var c=a.length,b=0;bc.length)){var b;for(e._reAttrib.lastIndex=0;b=e._reAttrib.exec(c);)void 0==a.attribs&&(a.attribs={}),"string"==typeof b[1]&&b[1].length?a.attribs[b[1]]=b[2]:"string"==typeof b[3]&&b[3].length?a.attribs[b[3].toString()]=b[4].toString():"string"==typeof b[5]&& b[5].length?a.attribs[b[5]]=b[6]:"string"==typeof b[7]&&b[7].length&&(a.attribs[b[7]]=b[7])}}};e.prototype.parseTagName=function(a){if(null==a||""==a)return"";a=e._reTagName.exec(a);return!a?"":(a[1]?"/":"")+a[2]};e.prototype.parseTags=function(){for(var a=this._buffer.length-1;e._reTags.test(this._buffer);){this._next=e._reTags.lastIndex-1;var c=this._buffer.charAt(this._next),b=this._buffer.substring(this._current,this._next),b={raw:b,data:this._parseState==d.Text?b:b.replace(e._reTrim,""),type:this._parseState}, f=this.parseTagName(b.data);if(this._tagStack.length)if(this._tagStack[this._tagStack.length-1]==d.Script)if("/script"==f.toLowerCase())this._tagStack.pop();else{if(0!=b.raw.indexOf("!--")&&(b.type=d.Text,this._elements.length&&this._elements[this._elements.length-1].type==d.Text)){var h=this._elements[this._elements.length-1];h.raw=h.data=h.raw+this._prevTagSep+b.raw;b.raw=b.data=""}}else this._tagStack[this._tagStack.length-1]==d.Style?"/style"==f.toLowerCase()?this._tagStack.pop():0!=b.raw.indexOf("!--")&& (b.type=d.Text,this._elements.length&&this._elements[this._elements.length-1].type==d.Text?(h=this._elements[this._elements.length-1],""!=b.raw?(h.raw=h.data=h.raw+this._prevTagSep+b.raw,b.raw=b.data=""):h.raw=h.data=h.raw+this._prevTagSep):""!=b.raw&&(b.raw=b.data=b.raw)):this._tagStack[this._tagStack.length-1]==d.Comment&&(h=b.raw.length,"-"==b.raw.charAt(h-2)&&"-"==b.raw.charAt(h-1)&&">"==c?(this._tagStack.pop(),this._elements.length&&this._elements[this._elements.length-1].type==d.Comment?(h= this._elements[this._elements.length-1],h.raw=h.data=(h.raw+b.raw).replace(e._reTrimComment,""),b.raw=b.data="",b.type=d.Text):b.type=d.Comment):(b.type=d.Comment,this._elements.length&&this._elements[this._elements.length-1].type==d.Comment?(h=this._elements[this._elements.length-1],h.raw=h.data=h.raw+b.raw+c,b.raw=b.data="",b.type=d.Text):b.raw=b.data=b.raw+c));if(b.type==d.Tag&&(b.name=f,f=f.toLowerCase(),0==b.raw.indexOf("!--")?(b.type=d.Comment,delete b.name,h=b.raw.length,"-"==b.raw.charAt(h- 1)&&"-"==b.raw.charAt(h-2)&&">"==c?b.raw=b.data=b.raw.replace(e._reTrimComment,""):(b.raw+=c,this._tagStack.push(d.Comment))):0==b.raw.indexOf("!")||0==b.raw.indexOf("?")?b.type=d.Directive:"script"==f?(b.type=d.Script,"/"!=b.data.charAt(b.data.length-1)&&this._tagStack.push(d.Script)):"/script"==f?b.type=d.Script:"style"==f?(b.type=d.Style,"/"!=b.data.charAt(b.data.length-1)&&this._tagStack.push(d.Style)):"/style"==f&&(b.type=d.Style),b.name&&"/"==b.name.charAt(0)))b.data=b.name;if(""!=b.raw||b.type!= d.Text)this._options.includeLocation&&!b.location&&(b.location=this.getLocation(b.type==d.Tag)),this.parseAttribs(b),this._elements.push(b),b.type!=d.Text&&b.type!=d.Comment&&b.type!=d.Directive&&"/"==b.data.charAt(b.data.length-1)&&this._elements.push({raw:"/"+b.name,data:"/"+b.name,name:"/"+b.name,type:b.type});this._parseState="<"==c?d.Tag:d.Text;this._current=this._next+1;this._prevTagSep=c}this._options.includeLocation&&(this.getLocation(),this._location.row+=this._location.inBuffer,this._location.inBuffer= 0,this._location.charOffset=0);this._buffer=this._current<=a?this._buffer.substring(this._current):"";this._current=0;this.writeHandler()};e.prototype.getLocation=function(a){for(var c=this._location,b=this._current-(a?1:0),d=a&&0==c.charOffset&&0==this._current;c.charOffset=d)return g;if(b&&c.children)c= c.children;else if(!(c instanceof Array))return g;for(i=0;i=d);i++);return g},getElementById:function(a,c,b){a=f.getElements({id:a},c,b,1);return a.length?a[0]:null},getElementsByTagName:function(a,c,b,d){return f.getElements({tag_name:a},c,b,d)},getElementsByTagType:function(a,c,b,d){return f.getElements({tag_type:a},c,b,d)}};exports.Parser=e;exports.DefaultHandler=g;exports.RssHandler=j;exports.ElementType=d;exports.DomUtils=f})(); \ No newline at end of file diff --git a/node_modules/jsdom/node_modules/htmlparser/lib/node-htmlparser.js b/node_modules/jsdom/node_modules/htmlparser/lib/node-htmlparser.js deleted file mode 100644 index 1fc03ea..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/lib/node-htmlparser.js +++ /dev/null @@ -1,6 +0,0 @@ -var htmlparser = require("./htmlparser"); -exports.Parser = htmlparser.Parser; -exports.DefaultHandler = htmlparser.DefaultHandler; -exports.RssHandler = htmlparser.RssHandler; -exports.ElementType = htmlparser.ElementType; -exports.DomUtils = htmlparser.DomUtils; diff --git a/node_modules/jsdom/node_modules/htmlparser/lib/node-htmlparser.min.js b/node_modules/jsdom/node_modules/htmlparser/lib/node-htmlparser.min.js deleted file mode 100644 index 27d5eea..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/lib/node-htmlparser.min.js +++ /dev/null @@ -1,6 +0,0 @@ -var htmlparser = require("./htmlparser.min"); -exports.Parser = htmlparser.Parser; -exports.DefaultHandler = htmlparser.DefaultHandler; -exports.RssHandler = htmlparser.RssHandler; -exports.ElementType = htmlparser.ElementType; -exports.DomUtils = htmlparser.DomUtils; diff --git a/node_modules/jsdom/node_modules/htmlparser/libxmljs.node b/node_modules/jsdom/node_modules/htmlparser/libxmljs.node deleted file mode 100755 index 07e08c87c96e0c9a735bbb71e757fb3df8574f77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102420 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 diff --git a/node_modules/jsdom/node_modules/htmlparser/new/a b/node_modules/jsdom/node_modules/htmlparser/new/a deleted file mode 100644 index 4506b37..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/new/a +++ /dev/null @@ -1,6 +0,0 @@ -[ -{"type":"tag","name":"script","name_raw":"script","raw":"script language='javascript'"}, -{"type":"attr","name":"langauge","name_raw":"language","value":"javascript"}, -{"type":"text","data":"\nvar foo = 'xxx';\n"}, -{"type":"tag","name":"/script","name_raw":"/script","raw":"/script"} -] diff --git a/node_modules/jsdom/node_modules/htmlparser/new/b b/node_modules/jsdom/node_modules/htmlparser/new/b deleted file mode 100644 index 759c80f..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/new/b +++ /dev/null @@ -1,6 +0,0 @@ -[ -{"type":"tag","name":"script","name_raw":"script","raw":"script language='javascript'"}, -{"type":"attr","name":"language","name_raw":"language","value":"javascript"}, -{"type":"text","data":"\nvar foo = 'xxx';\n"}, -{"type":"tag","name":"/script","name_raw":"/script","raw":"/script"} -] diff --git a/node_modules/jsdom/node_modules/htmlparser/new/compat.js b/node_modules/jsdom/node_modules/htmlparser/new/compat.js deleted file mode 100644 index eb1f4e7..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/new/compat.js +++ /dev/null @@ -1,954 +0,0 @@ -var htmlparser_old = require('../lib/htmlparser'); -var htmlparser_new = require('./htmlparser'); - -var tests = { - - 'plain text': { - data: ['This is the text'] - , expected: [{ type: 'text', data: 'This is the text' }] - } - - , 'split text': { - data: ['This is', ' the text'] - , expected: [{ type: 'text', data: 'This is the text' }] - } - - , 'simple tag': { - data: ['
    '] - , expected: [{ type: 'tag', name: 'div', raw: 'div' }] - } - - , 'simple comment': { - data: [''] - , expected: [{ type: 'comment', data: ' content ' }] - } - - , 'simple cdata': { - data: [''] - , expected: [{ type: 'cdata', data: ' content ' }] - } - - , 'split simple tag #1': { - data: ['<', 'div>'] - , expected: [{ type: 'tag', name: 'div', raw: 'div' }] - } - - , 'split simple tag #2': { - data: [''] - , expected: [{ type: 'tag', name: 'div', raw: 'div' }] - } - - , 'split simple tag #3': { - data: [''] - , expected: [{ type: 'tag', name: 'div', raw: 'div' }] - } - - , 'text before tag': { - data: ['xxx
    '] - , expected: [ - { type: 'text', data: 'xxx'}, - { type: 'tag', name: 'div', raw: 'div' } - ] - } - - , 'text after tag': { - data: ['
    xxx'] - , expected: [ - { type: 'tag', name: 'div', raw: 'div' }, - { type: 'text', data: 'xxx'} - ] - } - - , 'text inside tag': { - data: ['
    xxx
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div' }, - { type: 'text', data: 'xxx'}, - { type: 'tag', name: '/div', raw: '/div' } - ] - } - - , 'attribute with single quotes': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div a=\'1\'' }, - { type: 'attr', name:'a', data: '1'} - ] - } - - , 'attribute with double quotes': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div a="1"' }, - { type: 'attr', name:'a', data: '1'} - ] - } - - , 'attribute with no quotes': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div a=1' }, - { type: 'attr', name:'a', data: '1'} - ] - } - - , 'attribute with no value': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div wierd' }, - { type: 'attr', name:'wierd', data: null} - ] - } - - , 'attribute with no value, trailing text': { - data: ['
    xxx'] - , expected: [ - { type: 'tag', name: 'div', raw: 'div wierd' }, - { type: 'attr', name:'wierd', data: null}, - { type: 'text', data: 'xxx' } - ] - } - - , 'tag with multiple attributes': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div a="1" b="2"' }, - { type: 'attr', name:'a', data: '1'}, - { type: 'attr', name:'b', data: '2'} - ] - } - - , 'tag with multiple attributes, trailing text': { - data: ['
    xxx'] - , expected: [ - { type: 'tag', name: 'div', raw: 'div a="1" b="2"' }, - { type: 'attr', name:'a', data: '1'}, - { type: 'attr', name:'b', data: '2'}, - { type: 'text', data: 'xxx' } - ] - } - - , 'tag with mixed attributes #1': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div a=1 b=\'2\' c="3"' }, - { type: 'attr', name:'a', data: '1'}, - { type: 'attr', name:'b', data: '2'}, - { type: 'attr', name:'c', data: '3'} - ] - } - - , 'tag with mixed attributes #2': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div a=1 b="2" c=\'3\'' }, - { type: 'attr', name:'a', data: '1'}, - { type: 'attr', name:'b', data: '2'}, - { type: 'attr', name:'c', data: '3'} - ] - } - - , 'tag with mixed attributes #3': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div a=\'1\' b=2 c="3"' }, - { type: 'attr', name:'a', data: '1'}, - { type: 'attr', name:'b', data: '2'}, - { type: 'attr', name:'c', data: '3'} - ] - } - - , 'tag with mixed attributes #4': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div a=\'1\' b="2" c=3' }, - { type: 'attr', name:'a', data: '1'}, - { type: 'attr', name:'b', data: '2'}, - { type: 'attr', name:'c', data: '3'} - ] - } - - , 'tag with mixed attributes #5': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div a="1" b=2 c=\'3\'' }, - { type: 'attr', name:'a', data: '1'}, - { type: 'attr', name:'b', data: '2'}, - { type: 'attr', name:'c', data: '3'} - ] - } - - , 'tag with mixed attributes #6': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div a="1" b=\'2\' c="3"' }, - { type: 'attr', name:'a', data: '1'}, - { type: 'attr', name:'b', data: '2'}, - { type: 'attr', name:'c', data: '3'} - ] - } - - , 'tag with mixed attributes, trailing text': { - data: ['
    xxx'] - , expected: [ - { type: 'tag', name: 'div', raw: 'div a=1 b=\'2\' c="3"' }, - { type: 'attr', name:'a', data: '1'}, - { type: 'attr', name:'b', data: '2'}, - { type: 'attr', name:'c', data: '3'}, - { type: 'text', data: 'xxx' } - ] - } - - , 'self closing tag': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div/' }, - { type: 'tag', name: '/div', raw: null } - ] - } - - , 'self closing tag, trailing text': { - data: ['
    xxx'] - , expected: [ - { type: 'tag', name: 'div', raw: 'div/' }, - { type: 'tag', name: '/div', raw: null }, - { type: 'text', data: 'xxx' } - ] - } - - , 'self closing tag with spaces #1': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div /' }, - { type: 'tag', name: '/div', raw: null } - ] - } - - , 'self closing tag with spaces #2': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div/ ' }, - { type: 'tag', name: '/div', raw: null } - ] - } - - , 'self closing tag with spaces #3': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div / ' }, - { type: 'tag', name: '/div', raw: null } - ] - } - - , 'self closing tag with spaces, trailing text': { - data: ['
    xxx'] - , expected: [ - { type: 'tag', name: 'div', raw: 'div / ' }, - { type: 'tag', name: '/div', raw: null }, - { type: 'text', data: 'xxx' } - ] - } - - , 'self closing tag with attribute': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div a=b /' }, - { type: 'attr', name:'a', data: 'b'}, - { type: 'tag', name: '/div', raw: null } - ] - } - - , 'self closing tag with attribute, trailing text': { - data: ['
    xxx'] - , expected: [ - { type: 'tag', name: 'div', raw: 'div a=b /' }, - { type: 'attr', name:'a', data: 'b'}, - { type: 'tag', name: '/div', raw: null }, - { type: 'text', data: 'xxx' } - ] - } - - , 'self closing tag split #1': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div/' }, - { type: 'tag', name: '/div', raw: null } - ] - } - - , 'self closing tag split #2': { - data: [''] - , expected: [ - { type: 'tag', name: 'div', raw: 'div/' }, - { type: 'tag', name: '/div', raw: null } - ] - } - - , 'attribute missing close quote': { - data: ['
    xxx'] - , expected: [ - { type: 'tag', name: 'div', raw: 'div a="1>'] - , expected: [ - { type: 'tag', name: 'div', raw: 'div xxx="yyy"' }, - { type: 'attr', name:'xxx', data: 'yyy'} - ] - } - - , 'split attribute #2': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div xxx="yyy"' }, - { type: 'attr', name:'xxx', data: 'yyy'} - ] - } - - , 'split attribute #3': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div xxx="yyy"' }, - { type: 'attr', name:'xxx', data: 'yyy'} - ] - } - - , 'split attribute #4': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div xxx="yyy"' }, - { type: 'attr', name:'xxx', data: 'yyy'} - ] - } - - , 'split attribute #5': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div xxx="yyy"' }, - { type: 'attr', name:'xxx', data: 'yyy'} - ] - } - - , 'split attribute #6': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div xxx="yyy"' }, - { type: 'attr', name:'xxx', data: 'yyy'} - ] - } - - , 'attribute split from tag #1': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div xxx="yyy"' }, - { type: 'attr', name:'xxx', data: 'yyy'} - ] - } - - , 'attribute split from tag #2': { - data: [''] - , expected: [ - { type: 'tag', name: 'div', raw: 'div xxx="yyy"' }, - { type: 'attr', name:'xxx', data: 'yyy'} - ] - } - - , 'text before complex tag': { - data: ['xxx
    '] - , expected: [ - { type: 'text', data: 'xxx' }, - { type: 'tag', name: 'div', raw: 'div yyy="123"'}, - { type: 'attr', name: 'yyy', data: '123' } - ] - } - - , 'text after complex tag': { - data: ['
    xxx'] - , expected: [ - { type: 'tag', name: 'div', raw: 'div yyy="123"'}, - { type: 'attr', name: 'yyy', data: '123' }, - { type: 'text', data: 'xxx' } - ] - } - - , 'text inside complex tag': { - data: ['
    xxx
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div yyy="123"'}, - { type: 'attr', name: 'yyy', data: '123' }, - { type: 'text', data: 'xxx' }, - { type: 'tag', name: '/div', raw: '/div'} - ] - } - - , 'nested tags': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div'}, - { type: 'tag', name: 'span', raw: 'span'}, - { type: 'tag', name: '/span', raw: '/span'}, - { type: 'tag', name: '/div', raw: '/div'} - ] - } - - , 'nested tags with attributes': { - data: ['
    xxx
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div aaa="bbb"'}, - { type: 'attr', name: 'aaa', data: 'bbb' }, - { type: 'tag', name: 'span', raw: 'span 123=\'456\''}, - { type: 'attr', name: '123', data: '456' }, - { type: 'text', data: 'xxx' }, - { type: 'tag', name: '/span', raw: '/span'}, - { type: 'tag', name: '/div', raw: '/div'} - ] - } - - , 'comment inside tag': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div'}, - { type: 'comment', data: ' comment text '}, - { type: 'tag', name: '/div', raw: '/div'} - ] - } - - , 'cdata inside tag': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div'}, - { type: 'cdata', data: ' CData content '}, - { type: 'tag', name: '/div', raw: '/div'} - ] - } - - , 'html inside comment': { - data: [''] - , expected: [{ type: 'comment', data: '
    foo
    '}] - } - - , 'html inside cdata': { - data: ['foo
    ]]>'] - , expected: [{ type: 'cdata', data: '
    foo
    '}] - } - - , 'quotes in attribute #1': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div xxx=\'a"b\''}, - { type: 'attr', name: 'xxx', data: 'a"b' } - ] - } - - , 'quotes in attribute #2': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div xxx="a\'b"'}, - { type: 'attr', name: 'xxx', data: 'a\'b' } - ] - } - - , 'brackets in attribute': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', raw: 'div xxx="
    "'}, - { type: 'attr', name: 'xxx', data: '
    ' } - ] - } - - , 'split comment #1': { - data: ['<','!-- comment text -->xxx'] - , expected: [ - { type: 'comment', data: ' comment text '}, - { type: 'text', data: 'xxx' } - ] - } - - , 'split comment #2': { - data: ['xxx'] - , expected: [ - { type: 'comment', data: ' comment text '}, - { type: 'text', data: 'xxx' } - ] - } - - , 'split comment #3': { - data: ['xxx'] - , expected: [ - { type: 'comment', data: ' comment text '}, - { type: 'text', data: 'xxx' } - ] - } - - , 'split comment #4': { - data: ['xxx'] - , expected: [ - { type: 'comment', data: ' comment text '}, - { type: 'text', data: 'xxx' } - ] - } - - , 'split comment #5': { - data: ['xxx'] - , expected: [ - { type: 'comment', data: ' comment text '}, - { type: 'text', data: 'xxx' } - ] - } - - , 'split comment #6': { - data: ['xxx'] - , expected: [ - { type: 'comment', data: ' comment text '}, - { type: 'text', data: 'xxx' } - ] - } - - , 'split comment #7': { - data: ['"] - , expected: [ - { type: 'comment', data: "\ncomment text\n" } - ] - } - - , 'cdata comment': { - data: [""] - , expected: [ - { type: 'cdata', data: "\nCData content\n" } - ] - } - - , 'multiline attribute #1': { - data: ["
    "] - , expected: [ - { type: 'tag', name: 'div', raw: "div id='\nxxx\nyyy\n'" }, - { type: 'attr', name: 'id', data: "\nxxx\nyyy\n" } - ] - } - - , 'multiline attribute #2': { - data: ["
    "] - , expected: [ - { type: 'tag', name: 'div', raw: "div id=\"\nxxx\nyyy\n\"" }, - { type: 'attr', name: 'id', data: "\nxxx\nyyy\n" } - ] - } - - , 'tags in script tag code': { - data: [""] - , expected: [ - { type: 'tag', name: 'script', raw: "script language='javascript'" }, - { type: 'attr', name: 'language', data: 'javascript' }, - { type: 'text', data: "\nvar foo = 'xxx';\n" }, - { type: 'tag', name: '/script', raw: "/script" }, - ] - } - - , 'closing script tag in script tag code': { - data: ["';\n"] - , expected: [ - { type: 'tag', name: 'script', raw: "script language='javascript'" }, - { type: 'attr', name: 'language', data: 'javascript' }, - { type: 'text', data: "\nvar foo = '" }, - { type: 'tag', name: '/script', raw: "/script" }, - { type: 'text', data: "';\n" }, - { type: 'tag', name: '/script', raw: "/script" } - ] - } - - , 'comment in script tag code': { - data: [""] - , expected: [ - { type: 'tag', name: 'script', raw: "script language='javascript'" }, - { type: 'attr', name: 'language', data: 'javascript' }, - { type: 'text', data: "\nvar foo = '';\n" }, - { type: 'tag', name: '/script', raw: "/script" }, - ] - } - - , 'cdata in script tag code': { - data: [""] - , expected: [ - { type: 'tag', name: 'script', raw: "script language='javascript'" }, - { type: 'attr', name: 'language', data: 'javascript' }, - { type: 'text', data: "\nvar foo = '';\n" }, - { type: 'tag', name: '/script', raw: "/script" }, - ] - } - - , 'commented script tag code': { - data: [""] - , expected: [ - { type: 'tag', name: 'script', raw: "script language='javascript'" }, - { type: 'attr', name: 'language', data: 'javascript' }, - { type: 'text', data: "\n\n" }, - { type: 'tag', name: '/script', raw: "/script" }, - ] - } - - , 'cdata in script tag': { - data: [""] - , expected: [ - { type: 'tag', name: 'script', raw: "script language='javascript'" }, - { type: 'attr', name: 'language', data: 'javascript' }, - { type: 'text', data: "\nxxx';\n]]>\n" }, - { type: 'tag', name: '/script', raw: "/script" }, - ] - } - -}; - -function runTests (permutator) { - var callback = function handlerCallback (err) { - if (err) { - console.log('Handler error', err); - } - } - var handler = new htmlparser_new.HtmlHandler(callback); - var parser = new htmlparser_new.Parser(handler); - - var passed = 0; - var failed = 0; - - console.time('Tests'); - for (var testName in tests) { - var test = permutator ? permutator(tests[testName]) : tests[testName]; - process.stdout.write('[TEST] ' + testName + ' : '); - parser.reset(); - for (var i = 0, len = test.data.length; i < len; i++) { - parser.parseChunk(test.data[i]); - } - parser.done(); - var expected = JSON.stringify(test.expected); - var result = JSON.stringify(parser.state.output); - if (expected !== result) { - failed++; - process.stdout.write("FAIL\n"); - console.log(' [EXPECTED]', expected); - console.log(' [ RESULT ]', result); - } else { - passed++; - process.stdout.write("Ok\n"); - } - } - console.timeEnd('Tests'); - console.log('Passed tests: ' + passed + '/' + (passed + failed) + ' (' + Math.round(passed / (passed + failed) * 100) + '%)'); -} - -runTests(); -runTests(function (test) { - test.data = test.data.join('').split(''); - return test; -}); - -function handlerCallback (err, dom) { - console.log(err || dom); -} - -var handlerOld = new htmlparser_old.DefaultHandler(handlerCallback); -var parserOld = new htmlparser_old.Parser(handlerOld); - -var handlerNew = new htmlparser_new.HtmlHandler(null, handlerCallback); -var parserNew = new htmlparser_new.Parser(handlerNew); -parserNew.parseComplete(''); - diff --git a/node_modules/jsdom/node_modules/htmlparser/new/htmlparser.js b/node_modules/jsdom/node_modules/htmlparser/new/htmlparser.js deleted file mode 100644 index 6b9bfe9..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/new/htmlparser.js +++ /dev/null @@ -1,645 +0,0 @@ -(function () { - -function runningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!runningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - else if (this.Tautologistics.NodeHtmlParser) - return; //NodeHtmlParser already defined! - this.Tautologistics.NodeHtmlParser = {}; - exports = this.Tautologistics.NodeHtmlParser; -} - -var Mode = { - Text: 'text', - Tag: 'tag', - Attr: 'attr', - CData: 'cdata', - Comment: 'comment' -}; - -var re_parseText_scriptClose = /<\s*\/\s*script/ig; -function parseText (state) { - var foundPos; - if (state.isScript) { - re_parseText_scriptClose.lastIndex = state.pos; - foundPos = re_parseText_scriptClose.exec(state.data); - foundPos = (foundPos) ? - foundPos.index - : - -1 - ; - } else { - foundPos = state.data.indexOf('<', state.pos); - } - var text = (foundPos === -1) ? state.data.substring(state.pos, state.data.length) : state.data.substring(state.pos, foundPos); - if (foundPos < 0 && state.done) { - foundPos = state.data.length; - } - if (foundPos < 0) { - if (state.isScript) { - state.needData = true; - return; - } - if (!state.pendingText) { - state.pendingText = []; - } - state.pendingText.push(state.data.substring(state.pos, state.data.length)); - state.pos = state.data.length; - } else { - if (state.pendingText) { - state.pendingText.push(state.data.substring(state.pos, foundPos)); - text = state.pendingText.join(''); - state.pendingText = null; - } else { - text = state.data.substring(state.pos, foundPos); - } - if (text !== '') { - state.output.push({ type: Mode.Text, data: text }); - } - state.pos = foundPos + 1; - state.mode = Mode.Tag; - } -} - -var re_parseTag = /\s*(\/?)\s*([^\s>\/]+)(\s*)(>?)/g; -function parseTag (state) { - re_parseTag.lastIndex = state.pos; - var match = re_parseTag.exec(state.data); - if (match) { - if (!match[1] && match[2].substr(0, 3) === '!--') { - state.mode = Mode.Comment; - state.pos += 3; - return; - } - if (!match[1] && match[2].substr(0, 8) === '![CDATA[') { - state.mode = Mode.CData; - state.pos += 8; - return; - } - if (!state.done && (state.pos + match[0].length) === state.data.length) { - //We're at the and of the data, might be incomplete - state.needData = true; - return; - } - var raw; - if (match[4] === '>') { - state.mode = Mode.Text; - raw = match[0].substr(0, match[0].length - 1); - } else { - state.mode = Mode.Attr; - raw = match[0]; - } - state.pos += match[0].length; - var tag = { type: Mode.Tag, name: match[1] + match[2], raw: raw }; - if (state.mode === Mode.Attr) { - state.lastTag = tag; - } - if (tag.name.toLowerCase() === 'script') { - state.isScript = true; - } else if (tag.name.toLowerCase() === '/script') { - state.isScript = false; - } - state.output.push(tag); - } else { - //TODO: end of tag? - //TODO: push to pending? - state.needData = true; - } -} - -var re_parseAttr_findName = /\s*([^=<>\s'"\/]+)\s*/g; -function parseAttr_findName (state) { - re_parseAttr_findName.lastIndex = state.pos; - var match = re_parseAttr_findName.exec(state.data); - if (!match) { - return null; - } - if (state.pos + match[0].length !== re_parseAttr_findName.lastIndex) { - return null; - } - return { - match: match[0] - , name: match[1] - }; -} -var re_parseAttr_findValue = /\s*=\s*(?:'([^']*)'|"([^"]*)"|([^'"\s\/>]+))\s*/g; -var re_parseAttr_findValue_last = /\s*=\s*['"]?(.*)$/g; -function parseAttr_findValue (state) { - re_parseAttr_findValue.lastIndex = state.pos; - var match = re_parseAttr_findValue.exec(state.data); - if (!match) { - if (!state.done) { - return null; - } - re_parseAttr_findValue_last.lastIndex = state.pos; - match = re_parseAttr_findValue_last.exec(state.data); - if (!match) { - return null; - } - return { - match: match[0] - , value: (match[1] !== '') ? match[1] : null - }; - } - if (state.pos + match[0].length !== re_parseAttr_findValue.lastIndex) { - return null; - } - return { - match: match[0] - , value: match[1] || match[2] || match[3] - }; -} -var re_parseAttr_splitValue = /\s*=\s*['"]?/g; -var re_parseAttr_selfClose = /(\s*\/\s*)(>?)/g; -function parseAttr (state) { - var name_data = parseAttr_findName(state); - if (!name_data) { - re_parseAttr_selfClose.lastIndex = state.pos; - var matchTrailingSlash = re_parseAttr_selfClose.exec(state.data); - if (matchTrailingSlash && matchTrailingSlash.index === state.pos) { - if (!state.done && !matchTrailingSlash[2] && state.pos + matchTrailingSlash[0].length === state.data.length) { - state.needData = true; - return; - } - state.lastTag.raw += matchTrailingSlash[1]; - state.output.push({ type: Mode.Tag, name: '/' + state.lastTag.name, raw: null }); - state.pos += matchTrailingSlash[1].length; - } - var foundPos = state.data.indexOf('>', state.pos); - if (foundPos < 0) { - if (state.done) { //TODO: is this needed? - state.lastTag.raw += state.data.substr(state.pos); - state.pos = state.data.length; - return; - } - state.needData = true; - } else { - // state.lastTag = null; - state.pos = foundPos + 1; - state.mode = Mode.Text; - } - return; - } - if (!state.done && state.pos + name_data.match.length === state.data.length) { - state.needData = true; - return null; - } - state.pos += name_data.match.length; - var value_data = parseAttr_findValue(state); - if (value_data) { - if (!state.done && state.pos + value_data.match.length === state.data.length) { - state.needData = true; - state.pos -= name_data.match.length; - return; - } - state.pos += value_data.match.length; - } else { - re_parseAttr_splitValue.lastIndex = state.pos; - if (re_parseAttr_splitValue.exec(state.data)) { - state.needData = true; - state.pos -= name_data.match.length; - return; - } - value_data = { - match: '' - , value: null - }; - } - state.lastTag.raw += name_data.match + value_data.match; - - state.output.push({ type: Mode.Attr, name: name_data.name, data: value_data.value }); -} - -var re_parseCData_findEnding = /\]{1,2}$/; -function parseCData (state) { - var foundPos = state.data.indexOf(']]>', state.pos); - if (foundPos < 0 && state.done) { - foundPos = state.data.length; - } - if (foundPos < 0) { - re_parseCData_findEnding.lastIndex = state.pos; - var matchPartialCDataEnd = re_parseCData_findEnding.exec(state.data); - if (matchPartialCDataEnd) { - state.needData = true; - return; - } - if (!state.pendingText) { - state.pendingText = []; - } - state.pendingText.push(state.data.substr(state.pos, state.data.length)); - state.pos = state.data.length; - state.needData = true; - } else { - var text; - if (state.pendingText) { - state.pendingText.push(state.data.substring(state.pos, foundPos)); - text = state.pendingText.join(''); - state.pendingText = null; - } else { - text = state.data.substring(state.pos, foundPos); - } - state.output.push({ type: Mode.CData, data: text }); - state.mode = Mode.Text; - state.pos = foundPos + 3; - } -} - -var re_parseComment_findEnding = /\-{1,2}$/; -function parseComment (state) { - var foundPos = state.data.indexOf('-->', state.pos); - if (foundPos < 0 && state.done) { - foundPos = state.data.length; - } - if (foundPos < 0) { - re_parseComment_findEnding.lastIndex = state.pos; - var matchPartialCommentEnd = re_parseComment_findEnding.exec(state.data); - if (matchPartialCommentEnd) { - state.needData = true; - return; - } - if (!state.pendingText) { - state.pendingText = []; - } - state.pendingText.push(state.data.substr(state.pos, state.data.length)); - state.pos = state.data.length; - state.needData = true; - } else { - var text; - if (state.pendingText) { - state.pendingText.push(state.data.substring(state.pos, foundPos)); - text = state.pendingText.join(''); - state.pendingText = null; - } else { - text = state.data.substring(state.pos, foundPos); - } - state.output.push({ type: Mode.Comment, data: text }); - state.mode = Mode.Text; - state.pos = foundPos + 3; - } -} - -function parse (state) { - switch (state.mode) { - case Mode.Text: - return parseText(state); - case Mode.Tag: - return parseTag(state); - case Mode.Attr: - return parseAttr(state); - case Mode.CData: - return parseCData(state); - case Mode.Comment: - return parseComment(state); - } -} - -function Parser (handler, options) { - this._options = options ? options : { }; - if (this._options.includeLocation == undefined) { - this._options.includeLocation = false; //Do not track element position in document by default - } - - this.validateHandler(handler); - var self = this; - this._handler = handler; - this.reset(); -} - - Parser.prototype.reset = function Parser$reset () { - this.state = { - mode: Mode.Text, - pos: 0, - data: null, - pendingText: null, - lastTag: null, - isScript: false, - needData: false, - // output: [], - done: false - }; - }; - - Parser.prototype.parseChunk = function Parser$parseChunk (chunk) { - this.state.needData = false; - this.state.data = (this.state.data !== null) ? - this.state.data.substr(this.pos) + chunk - : - chunk - ; - while (this.state.pos < this.state.data.length && !this.state.needData) { - parse(this.state); - } - }; - - Parser.prototype.parseComplete = function Parser$parseComplete (data) { - this.reset(); - this.parseChunk(data); - this.done(); - } - - Parser.prototype.done = function Parser$done () { - this.state.done = true; - parse(this.state); - - }; - - Parser.prototype.validateHandler = function Parser$validateHandler (handler) { - if ((typeof handler) != "object") { - throw new Error("Handler is not an object"); - } - if ((typeof handler.reset) != "function") { - throw new Error("Handler method 'reset' is invalid"); - } - if ((typeof handler.done) != "function") { - throw new Error("Handler method 'done' is invalid"); - } - if ((typeof handler.write) != "function") { - throw new Error("Handler method 'write' is invalid"); - } - if ((typeof handler.error) != "function") { - throw new Error("Handler method 'error' is invalid"); - } - } - -// Parser.prototype.done_old = function Parser$done_old () { -// if (this.state.pendingText) { -// this.state.output.push({ type: this.state.mode, data: this.state.pendingText.join('') }); -// this.state.pendingText = null; -// } -// console.log(this.state); - -// var buffer = []; -// var lastType; -// for (var i = 0, len = this.state.output.length; i < len; i++) { -// var node = this.state.output[i]; -// if ((lastType === Mode.Attr && node.type !== Mode.Attr) || (lastType === Mode.Tag && node.type !== Mode.Attr)) { -// buffer.push('>'); -// } -// switch (node.type) { - -// case Mode.Text: -// buffer.push(node.data); -// break; - -// case Mode.Comment: -// buffer.push(''); -// break; - -// case Mode.CData: -// buffer.push(''); -// break; - -// case Mode.Tag: -// buffer.push('<', node.name); -// break; - -// case Mode.Attr: -// var quoteChar = (node.value.indexOf('\'') < 0) ? '\'' : '"'; -// buffer.push(' ', node.name, '=', quoteChar, node.value, quoteChar); -// break; - -// } -// lastType = node.type; -// } -// if (lastType === Mode.Tag || lastType === Mode.Attr) { -// buffer.push('>'); -// } -// console.log(buffer.join('')); -// }; - -function HtmlHandler (options, callback) { - this.reset(); - this._options = options ? options : { }; - if (this._options.ignoreWhitespace == undefined) { - this._options.ignoreWhitespace = false; //Keep whitespace-only text nodes - } - if (this._options.trackPosition == undefined) { - this._options.trackPosition = false; //Include position of element (row, col) on nodes - } - if (this._options.verbose == undefined) { - this._options.verbose = true; //Keep data property for tags and raw property for all - } - if (this._options.enforceEmptyTags == undefined) { - this._options.enforceEmptyTags = true; //Don't allow children for HTML tags defined as empty in spec - } - if (this._options.caseSensitiveTags == undefined) { - this._options.caseSensitiveTags = false; //Lowercase all tag names - } - if (this._options.caseSensitiveAttr == undefined) { - this._options.caseSensitiveAttr = false; //Lowercase all attribute names - } - if ((typeof callback) == "function") { - this._callback = callback; - } -} - - //**"Static"**// - //HTML Tags that shouldn't contain child nodes - HtmlHandler._emptyTags = { - area: 1 - , base: 1 - , basefont: 1 - , br: 1 - , col: 1 - , frame: 1 - , hr: 1 - , img: 1 - , input: 1 - , isindex: 1 - , link: 1 - , meta: 1 - , param: 1 - , embed: 1 - } - //Regex to detect whitespace only text nodes - HtmlHandler.reWhitespace = /^\s*$/; - - //**Public**// - //Properties// - HtmlHandler.prototype.dom = null; //The hierarchical object containing the parsed HTML - //Methods// - //Resets the handler back to starting state - HtmlHandler.prototype.reset = function HtmlHandler$reset() { - this.dom = []; - this._done = false; - this._tagStack = []; - this._tagStack.last = function HtmlHandler$_tagStack$last () { - return(this.length ? this[this.length - 1] : null); - } - } - //Signals the handler that parsing is done - HtmlHandler.prototype.done = function HtmlHandler$done () { - this._done = true; - this.handleCallback(null); - } - - HtmlHandler.prototype.error = function HtmlHandler$error (error) { - this.handleCallback(error); - } - - HtmlHandler.prototype.handleCallback = function HtmlHandler$handleCallback (error) { - if ((typeof this._callback) != "function") - if (error) - throw error; - else - return; - this._callback(error, this.dom); - } - - HtmlHandler.prototype.isEmptyTag = function HtmlHandler$isEmptyTag (element) { - var name = element.name.toLowerCase(); - if (name.charAt(0) == '/') { - name = name.substring(1); - } - return this._options.enforceEmptyTags && !!HtmlHandler._emptyTags[name]; - }; - - HtmlHandler.prototype._copyElement = function HtmlHandler$_copyElement (element) { - var newElement = { type: element.type }; - - if (this._options.verbose && element['raw'] !== undefined) { - newElement.raw = element.raw; - } - if (element['name'] !== undefined) { - switch (element.type) { - - case Mode.Tag: - newElement.name = this._options.caseSensitiveTags ? - element.name - : - element.name.toLowerCase() - ; - break; - - case Mode.Attr: - newElement.name = this._options.caseSensitiveAttr ? - element.name - : - element.name.toLowerCase() - ; - break; - - default: - newElement.name = this._options.caseSensitiveTags ? - element.name - : - element.name.toLowerCase() - ; - break; - - } - } - if (element['data'] !== undefined) { - newElement.data = element.name; - } - - return newElement; - } - - HtmlHandler.prototype.write = function HtmlHandler$write (element) { - if (this._done) { - this.handleCallback(new Error("Writing to the handler after done() called is not allowed without a reset()")); - } - if (element.type === Mode.Text && this._options.ignoreWhitespace) { - if (HtmlHandler.reWhitespace.test(element.data)) { - return; - } - } - var node; - if (!this._options.verbose) { -// element.raw = null; //FIXME: Not clean - //FIXME: Serious performance problem using delete - delete element.raw; - if (element.type == "tag" || element.type == "script" || element.type == "style") { - delete element.data; - } - } - if (!this._tagStack.last()) { //There are no parent elements - //If the element can be a container, add it to the tag stack and the top level list - if (element.type != Mode.Text && element.type != Mode.Comment && element.type != Mode.CData) { - if (element.name.charAt(0) != "/") { //Ignore closing tags that obviously don't have an opening tag - node = this._copyElement(element); - this.dom.push(node); - if (!this.isEmptyTag(node)) { //Don't add tags to the tag stack that can't have children - this._tagStack.push(node); - } - } - } - else //Otherwise just add to the top level list - this.dom.push(this._copyElement(element)); - } - else { //There are parent elements - //If the element can be a container, add it as a child of the element - //on top of the tag stack and then add it to the tag stack - if (element.type != Mode.Text && element.type != Mode.Comment && element.type != Mode.CData) { - if (element.name.charAt(0) == "/") { - //This is a closing tag, scan the tagStack to find the matching opening tag - //and pop the stack up to the opening tag's parent - var baseName = this._options.caseSensitiveTags ? - element.name.substring(1) - : - element.name.substring(1).toLowerCase() - ; - if (!this.isEmptyTag(element)) { - var pos = this._tagStack.length - 1; - while (pos > -1 && this._tagStack[pos--].name != baseName) { } - if (pos > -1 || this._tagStack[0].name == baseName) { - while (pos < this._tagStack.length - 1) { - this._tagStack.pop(); - } - } - } - } - else { //This is not a closing tag - if (!this._tagStack.last().children) { - this._tagStack.last().children = []; - } - node = this._copyElement(element); - this._tagStack.last().children.push(node); - if (!this.isEmptyTag(node)) { //Don't add tags to the tag stack that can't have children - this._tagStack.push(node); - } - } - } - else { //This is not a container element - if (!this._tagStack.last().children) - this._tagStack.last().children = []; - this._tagStack.last().children.push(this._copyElement(element)); - } - } - } - - - //**Private**// - //Properties// - HtmlHandler.prototype._options = null; //Handler options for how to behave - HtmlHandler.prototype._callback = null; //Callback to respond to when parsing done - HtmlHandler.prototype._done = false; //Flag indicating whether handler has been notified of parsing completed - HtmlHandler.prototype._tagStack = null; //List of parents to the currently element being processed - //Methods// - -exports.Parser = Parser; - -exports.HtmlHandler = HtmlHandler; - -// exports.RssHandler = RssHandler; - -exports.ElementType = Mode; - -// exports.DomUtils = DomUtils; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/new/parser.zip b/node_modules/jsdom/node_modules/htmlparser/new/parser.zip deleted file mode 100644 index c562a64512784d95e30aa3980b51a05325ba1305..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6706 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 Kw=(&k?!N%TNN0fn diff --git a/node_modules/jsdom/node_modules/htmlparser/new/test01.js b/node_modules/jsdom/node_modules/htmlparser/new/test01.js deleted file mode 100644 index 3582584..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/new/test01.js +++ /dev/null @@ -1,258 +0,0 @@ -var data = "\ -starting text\n\ -aaabbb\n\ -\n\ -< htmL >\n\ - \n\ -
    \n\ -
    xxx
    \n\ -
    yyyyyyyyyyyy
    \n\ -
    zzzz zzz
    \n\ -
    aaaa
    \n\ - \n\ -\n\ -ending text\ -]+)(\s*)(>?)/g; -function parseTag (state) { - // console.log('parseTag', state); - // console.log('parseTag'); - re_parseTag.lastIndex = state.pos; - var match = re_parseTag.exec(state.data); - if (match) { - if (match[2].substr(0, 3) === '!--') { - state.mode = Mode.Comment; - state.pos += 3; - return; - } - if (match[2].substr(0, 8) === '![CDATA[') { - state.mode = Mode.CData; - state.pos += 8; - return; - } - var raw; - if (match[4] === '>') { - state.mode = Mode.Text; - raw = match[0].substr(0, match[0].length - 1); - } else { - state.mode = Mode.Attr; - raw = match[0]; - } - state.pos += match[0].length; - var tag = { type: Mode.Tag, name: match[2].toLowerCase(), name_raw: match[2], raw: raw }; - if (state.mode === Mode.Attr) { - state.lastTag = tag; - } - state.output.push(tag); - } else { - //TODO: end of tag? - //TODO: push to pending? - state.needData = true; - } -} - -var re_parseAttr_findName = /\s*([^=<>\s'"]+)\s*/g; -function parseAttr_findName (state) { - re_parseAttr_findName.lastIndex = state.pos; - var match = re_parseAttr_findName.exec(state.data); - if (!match) { - return null; - } - if (state.pos + match[0].length !== re_parseAttr_findName.lastIndex) { - return null; - } - state.pos += match[0].length; - state.lastTag.raw += match[0]; - return match[1]; -} -var re_parseAttr_findValue = /\s*=\s*(?:'([^']*)'|"([^"]*)"|([^'"\s>]*))/g; -function parseAttr_findValue (state) { - re_parseAttr_findValue.lastIndex = state.pos; - var match = re_parseAttr_findValue.exec(state.data); - if (!match) { - return null; - } - if (state.pos + match[0].length !== re_parseAttr_findValue.lastIndex) { - return null; - } - state.pos += match[0].length; - state.lastTag.raw += match[0]; - return match[1] || match[2] || match[3]; -}; -function parseAttr (state) { - // console.log('parseAttr', state); - // console.log('parseAttr'); - var name = parseAttr_findName(state); - if (!name) { - var foundPos = state.data.indexOf('>', state.pos); - if (foundPos < 0) { - state.needData = true; - } else { - state.lastTag = null; - state.pos = foundPos + 1; - state.mode = Mode.Text; - } - return; - } - state.output.push({ type: Mode.Attr, name: name, name_raw: name.toLowerCase(), value: parseAttr_findValue(state) }); -} - -function parseCData (state) { - // console.log('parseCData', state); - // console.log('parseCData'); - var foundPos = state.data.indexOf(']]>', state.pos); - if (foundPos < 0) { - if (!state.pendingText) { - state.pendingText = []; - } - state.pendingText.push(state.data.substr(state.pos, state.data.length)); - state.pos = state.data.length; - state.needData = true; - } else { - var text; - if (state.pendingText) { - state.pendingText.push(state.data.substring(state.pos, foundPos)); - text = state.pendingText.join(''); - state.pendingText = null; - } else { - text = state.data.substring(state.pos, foundPos); - } - state.output.push({ type: Mode.CData, data: text }); - state.mode = Mode.Text; - state.pos = foundPos + 3; - } -} - -function parseComment (state) { - // console.log('parseComment', state); - // console.log('parseComment'); - var foundPos = state.data.indexOf('-->', state.pos); - if (foundPos < 0) { - if (!state.pendingText) { - state.pendingText = []; - } - state.pendingText.push(state.data.substr(state.pos, state.data.length)); - state.pos = state.data.length; - state.needData = true; - } else { - var text; - if (state.pendingText) { - state.pendingText.push(state.data.substring(state.pos, foundPos)); - text = state.pendingText.join(''); - state.pendingText = null; - } else { - text = state.data.substring(state.pos, foundPos); - } - state.output.push({ type: Mode.Comment, data: text }); - state.mode = Mode.Text; - state.pos = foundPos + 3; - } -} - -while (state.pos < state.data.length && !state.needData) { - parse(state); -} -if (state.pendingText) { - state.output.push({ type: state.mode, data: state.pendingText }); - state.pendingText = null; -} -console.log(state); - -var buffer = []; -var lastType; -for (var i = 0, len = state.output.length; i < len; i++) { - var node = state.output[i]; - if ((lastType === Mode.Attr && node.type !== Mode.Attr) || (lastType === Mode.Tag && node.type !== Mode.Attr)) { - buffer.push('>'); - } - switch (node.type) { - - case Mode.Text: - buffer.push(node.data); - break; - - case Mode.Comment: - buffer.push(''); - break; - - case Mode.CData: - buffer.push(''); - break; - - case Mode.Tag: - buffer.push('<', node.name); - break; - - case Mode.Attr: - var quoteChar = (node.value.indexOf('\'') < 0) ? '\'' : '"'; - buffer.push(' ', node.name, '=', quoteChar, node.value, quoteChar); - break; - - } - lastType = node.type; -} -if (lastType === Mode.Tag || lastType === Mode.Attr) { - buffer.push('>'); -} -console.log(buffer.join('')); diff --git a/node_modules/jsdom/node_modules/htmlparser/new/test02.js b/node_modules/jsdom/node_modules/htmlparser/new/test02.js deleted file mode 100644 index 6221c95..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/new/test02.js +++ /dev/null @@ -1,856 +0,0 @@ -var htmlparser = require('./htmlparser'); - -var tests = { - - 'plain text': { - data: ['This is the text'] - , expected: [{ type: 'text', data: 'This is the text' }] - } - - , 'split text': { - data: ['This is', ' the text'] - , expected: [{ type: 'text', data: 'This is the text' }] - } - - , 'simple tag': { - data: ['
    '] - , expected: [{ type: 'tag', name: 'div', name_raw: 'div', raw: 'div' }] - } - - , 'simple comment': { - data: [''] - , expected: [{ type: 'comment', data: ' content ' }] - } - - , 'simple cdata': { - data: [''] - , expected: [{ type: 'cdata', data: ' content ' }] - } - - , 'split simple tag #1': { - data: ['<', 'div>'] - , expected: [{ type: 'tag', name: 'div', name_raw: 'div', raw: 'div' }] - } - - , 'split simple tag #2': { - data: [''] - , expected: [{ type: 'tag', name: 'div', name_raw: 'div', raw: 'div' }] - } - - , 'split simple tag #3': { - data: [''] - , expected: [{ type: 'tag', name: 'div', name_raw: 'div', raw: 'div' }] - } - - , 'text before tag': { - data: ['xxx
    '] - , expected: [ - { type: 'text', data: 'xxx'}, - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div' } - ] - } - - , 'text after tag': { - data: ['
    xxx'] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div' }, - { type: 'text', data: 'xxx'} - ] - } - - , 'text inside tag': { - data: ['
    xxx
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div' }, - { type: 'text', data: 'xxx'}, - { type: 'tag', name: '/div', name_raw: '/div', raw: '/div' } - ] - } - - , 'attribute with single quotes': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a=\'1\'' }, - { type: 'attr', name:'a', name_raw: 'a', value: '1'} - ] - } - - , 'attribute with double quotes': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a="1"' }, - { type: 'attr', name:'a', name_raw: 'a', value: '1'} - ] - } - - , 'attribute with no quotes': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a=1' }, - { type: 'attr', name:'a', name_raw: 'a', value: '1'} - ] - } - - , 'attribute with no value': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div wierd' }, - { type: 'attr', name:'wierd', name_raw: 'wierd', value: null} - ] - } - - , 'attribute with no value, trailing text': { - data: ['
    xxx'] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div wierd' }, - { type: 'attr', name:'wierd', name_raw: 'wierd', value: null}, - { type: 'text', data: 'xxx' } - ] - } - - , 'tag with multiple attributes': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a="1" b="2"' }, - { type: 'attr', name:'a', name_raw: 'a', value: '1'}, - { type: 'attr', name:'b', name_raw: 'b', value: '2'} - ] - } - - , 'tag with multiple attributes, trailing text': { - data: ['
    xxx'] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a="1" b="2"' }, - { type: 'attr', name:'a', name_raw: 'a', value: '1'}, - { type: 'attr', name:'b', name_raw: 'b', value: '2'}, - { type: 'text', data: 'xxx' } - ] - } - - , 'tag with mixed attributes #1': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a=1 b=\'2\' c="3"' }, - { type: 'attr', name:'a', name_raw: 'a', value: '1'}, - { type: 'attr', name:'b', name_raw: 'b', value: '2'}, - { type: 'attr', name:'c', name_raw: 'c', value: '3'} - ] - } - - , 'tag with mixed attributes #2': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a=1 b="2" c=\'3\'' }, - { type: 'attr', name:'a', name_raw: 'a', value: '1'}, - { type: 'attr', name:'b', name_raw: 'b', value: '2'}, - { type: 'attr', name:'c', name_raw: 'c', value: '3'} - ] - } - - , 'tag with mixed attributes #3': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a=\'1\' b=2 c="3"' }, - { type: 'attr', name:'a', name_raw: 'a', value: '1'}, - { type: 'attr', name:'b', name_raw: 'b', value: '2'}, - { type: 'attr', name:'c', name_raw: 'c', value: '3'} - ] - } - - , 'tag with mixed attributes #4': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a=\'1\' b="2" c=3' }, - { type: 'attr', name:'a', name_raw: 'a', value: '1'}, - { type: 'attr', name:'b', name_raw: 'b', value: '2'}, - { type: 'attr', name:'c', name_raw: 'c', value: '3'} - ] - } - - , 'tag with mixed attributes #5': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a="1" b=2 c=\'3\'' }, - { type: 'attr', name:'a', name_raw: 'a', value: '1'}, - { type: 'attr', name:'b', name_raw: 'b', value: '2'}, - { type: 'attr', name:'c', name_raw: 'c', value: '3'} - ] - } - - , 'tag with mixed attributes #6': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a="1" b=\'2\' c="3"' }, - { type: 'attr', name:'a', name_raw: 'a', value: '1'}, - { type: 'attr', name:'b', name_raw: 'b', value: '2'}, - { type: 'attr', name:'c', name_raw: 'c', value: '3'} - ] - } - - , 'tag with mixed attributes, trailing text': { - data: ['
    xxx'] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a=1 b=\'2\' c="3"' }, - { type: 'attr', name:'a', name_raw: 'a', value: '1'}, - { type: 'attr', name:'b', name_raw: 'b', value: '2'}, - { type: 'attr', name:'c', name_raw: 'c', value: '3'}, - { type: 'text', data: 'xxx' } - ] - } - - , 'self closing tag': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div/' }, - { type: 'tag', name: '/div', name_raw: '/div', raw: null } - ] - } - - , 'self closing tag, trailing text': { - data: ['
    xxx'] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div/' }, - { type: 'tag', name: '/div', name_raw: '/div', raw: null }, - { type: 'text', data: 'xxx' } - ] - } - - , 'self closing tag with spaces #1': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div /' }, - { type: 'tag', name: '/div', name_raw: '/div', raw: null } - ] - } - - , 'self closing tag with spaces #2': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div/ ' }, - { type: 'tag', name: '/div', name_raw: '/div', raw: null } - ] - } - - , 'self closing tag with spaces #3': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div / ' }, - { type: 'tag', name: '/div', name_raw: '/div', raw: null } - ] - } - - , 'self closing tag with spaces, trailing text': { - data: ['
    xxx'] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div / ' }, - { type: 'tag', name: '/div', name_raw: '/div', raw: null }, - { type: 'text', data: 'xxx' } - ] - } - - , 'self closing tag with attribute': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a=b /' }, - { type: 'attr', name:'a', name_raw: 'a', value: 'b'}, - { type: 'tag', name: '/div', name_raw: '/div', raw: null } - ] - } - - , 'self closing tag with attribute, trailing text': { - data: ['
    xxx'] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a=b /' }, - { type: 'attr', name:'a', name_raw: 'a', value: 'b'}, - { type: 'tag', name: '/div', name_raw: '/div', raw: null }, - { type: 'text', data: 'xxx' } - ] - } - - , 'self closing tag split #1': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div/' }, - { type: 'tag', name: '/div', name_raw: '/div', raw: null } - ] - } - - , 'self closing tag split #2': { - data: [''] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div/' }, - { type: 'tag', name: '/div', name_raw: '/div', raw: null } - ] - } - - , 'attribute missing close quote': { - data: ['
    xxx'] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div a="1>'] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx="yyy"' }, - { type: 'attr', name:'xxx', name_raw: 'xxx', value: 'yyy'} - ] - } - - , 'split attribute #2': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx="yyy"' }, - { type: 'attr', name:'xxx', name_raw: 'xxx', value: 'yyy'} - ] - } - - , 'split attribute #3': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx="yyy"' }, - { type: 'attr', name:'xxx', name_raw: 'xxx', value: 'yyy'} - ] - } - - , 'split attribute #4': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx="yyy"' }, - { type: 'attr', name:'xxx', name_raw: 'xxx', value: 'yyy'} - ] - } - - , 'split attribute #5': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx="yyy"' }, - { type: 'attr', name:'xxx', name_raw: 'xxx', value: 'yyy'} - ] - } - - , 'split attribute #6': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx="yyy"' }, - { type: 'attr', name:'xxx', name_raw: 'xxx', value: 'yyy'} - ] - } - - , 'attribute split from tag #1': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx="yyy"' }, - { type: 'attr', name:'xxx', name_raw: 'xxx', value: 'yyy'} - ] - } - - , 'attribute split from tag #2': { - data: [''] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx="yyy"' }, - { type: 'attr', name:'xxx', name_raw: 'xxx', value: 'yyy'} - ] - } - - , 'text before complex tag': { - data: ['xxx
    '] - , expected: [ - { type: 'text', data: 'xxx' }, - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div yyy="123"'}, - { type: 'attr', name: 'yyy', name_raw: 'yyy', value: '123' } - ] - } - - , 'text after complex tag': { - data: ['
    xxx'] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div yyy="123"'}, - { type: 'attr', name: 'yyy', name_raw: 'yyy', value: '123' }, - { type: 'text', data: 'xxx' } - ] - } - - , 'text inside complex tag': { - data: ['
    xxx
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div yyy="123"'}, - { type: 'attr', name: 'yyy', name_raw: 'yyy', value: '123' }, - { type: 'text', data: 'xxx' }, - { type: 'tag', name: '/div', name_raw: '/div', raw: '/div'} - ] - } - - , 'nested tags': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div'}, - { type: 'tag', name: 'span', name_raw: 'span', raw: 'span'}, - { type: 'tag', name: '/span', name_raw: '/span', raw: '/span'}, - { type: 'tag', name: '/div', name_raw: '/div', raw: '/div'} - ] - } - - , 'nested tags with attributes': { - data: ['
    xxx
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div aaa="bbb"'}, - { type: 'attr', name: 'aaa', name_raw: 'aaa', value: 'bbb' }, - { type: 'tag', name: 'span', name_raw: 'span', raw: 'span 123=\'456\''}, - { type: 'attr', name: '123', name_raw: '123', value: '456' }, - { type: 'text', data: 'xxx' }, - { type: 'tag', name: '/span', name_raw: '/span', raw: '/span'}, - { type: 'tag', name: '/div', name_raw: '/div', raw: '/div'} - ] - } - - , 'comment inside tag': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div'}, - { type: 'comment', data: ' comment text '}, - { type: 'tag', name: '/div', name_raw: '/div', raw: '/div'} - ] - } - - , 'cdata inside tag': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div'}, - { type: 'cdata', data: ' CData content '}, - { type: 'tag', name: '/div', name_raw: '/div', raw: '/div'} - ] - } - - , 'html inside comment': { - data: [''] - , expected: [{ type: 'comment', data: '
    foo
    '}] - } - - , 'html inside cdata': { - data: ['foo
    ]]>'] - , expected: [{ type: 'cdata', data: '
    foo
    '}] - } - - , 'quotes in attribute #1': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx=\'a"b\''}, - { type: 'attr', name: 'xxx', name_raw: 'xxx', value: 'a"b' } - ] - } - - , 'quotes in attribute #2': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx="a\'b"'}, - { type: 'attr', name: 'xxx', name_raw: 'xxx', value: 'a\'b' } - ] - } - - , 'brackets in attribute': { - data: ['
    '] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: 'div xxx="
    "'}, - { type: 'attr', name: 'xxx', name_raw: 'xxx', value: '
    ' } - ] - } - - , 'split comment #1': { - data: ['<','!-- comment text -->xxx'] - , expected: [ - { type: 'comment', data: ' comment text '}, - { type: 'text', data: 'xxx' } - ] - } - - , 'split comment #2': { - data: ['xxx'] - , expected: [ - { type: 'comment', data: ' comment text '}, - { type: 'text', data: 'xxx' } - ] - } - - , 'split comment #3': { - data: ['xxx'] - , expected: [ - { type: 'comment', data: ' comment text '}, - { type: 'text', data: 'xxx' } - ] - } - - , 'split comment #4': { - data: ['xxx'] - , expected: [ - { type: 'comment', data: ' comment text '}, - { type: 'text', data: 'xxx' } - ] - } - - , 'split comment #5': { - data: ['xxx'] - , expected: [ - { type: 'comment', data: ' comment text '}, - { type: 'text', data: 'xxx' } - ] - } - - , 'split comment #6': { - data: ['xxx'] - , expected: [ - { type: 'comment', data: ' comment text '}, - { type: 'text', data: 'xxx' } - ] - } - - , 'split comment #7': { - data: ['"] - , expected: [ - { type: 'comment', data: "\ncomment text\n" } - ] - } - - , 'cdata comment': { - data: [""] - , expected: [ - { type: 'cdata', data: "\nCData content\n" } - ] - } - - , 'multiline attribute #1': { - data: ["
    "] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: "div id='\nxxx\nyyy\n'" }, - { type: 'attr', name: 'id', name_raw: 'id', value: "\nxxx\nyyy\n" } - ] - } - - , 'multiline attribute #2': { - data: ["
    "] - , expected: [ - { type: 'tag', name: 'div', name_raw: 'div', raw: "div id=\"\nxxx\nyyy\n\"" }, - { type: 'attr', name: 'id', name_raw: 'id', value: "\nxxx\nyyy\n" } - ] - } - - // script tags - // style tags - -}; - -function runTests (permutator) { - var parser = new htmlparser(); - - var passed = 0; - var failed = 0; - - console.time('Tests'); - for (var testName in tests) { - var test = permutator ? permutator(tests[testName]) : tests[testName]; - process.stdout.write('[TEST] ' + testName + ' : '); - parser.reset(); - for (var i = 0, len = test.data.length; i < len; i++) { - parser.parse(test.data[i]); - } - parser.done(); - var expected = JSON.stringify(test.expected); - var result = JSON.stringify(parser.state.output); - if (expected !== result) { - failed++; - process.stdout.write("FAIL\n"); - console.log(' [EXPECTED]', expected); - console.log(' [ RESULT ]', result); - } else { - passed++; - process.stdout.write("Ok\n"); - } - } - console.timeEnd('Tests'); - console.log('Passed tests: ' + passed + '/' + (passed + failed) + ' (' + Math.round(passed / (passed + failed) * 100) + '%)'); -} - -runTests(); -runTests(function (test) { - test.data = test.data.join('').split(''); - return test; -}); diff --git a/node_modules/jsdom/node_modules/htmlparser/newparser.js b/node_modules/jsdom/node_modules/htmlparser/newparser.js deleted file mode 100644 index 2487f23..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/newparser.js +++ /dev/null @@ -1,54 +0,0 @@ -//node --prof --prof_auto profile.js -//deps/v8/tools/mac-tick-processor v8.log -var sys = require("sys"); -var fs = require("fs"); - -var testHtml = "./testdata/api.html"; //Test HTML file to load -var testIterations = 100; //Number of test loops to run - -var html = fs.readFileSync(testHtml).toString(); - -function getMillisecs () { - return((new Date()).getTime()); -} - -function timeExecutions (loops, func) { - var start = getMillisecs(); - - while (loops--) - func(); - - return(getMillisecs() - start); -} - -sys.puts("HTML Length: " + html.length); - -sys.puts("Test 1: " + timeExecutions(testIterations, function () { -// function parseText (data) { -// // -// } -// function parseTag (data) { -// // -// } -// function parseAttrib (data) { -// // -// } -// function parseComment (data) { -// // -// } - var data = html.split(""); - data.meta = { - length: data.length - , pos: 0 - } - while (data.meta.length > data.meta.pos && data[data.meta.pos++] !== ""); -// sys.puts("Found: " + [data.meta.pos, data[data.meta.pos]]); -}) + "ms"); - -sys.puts("Test 2: " + timeExecutions(testIterations, function () { - var data = html; - var dataLen = data.length; - var pos = 0; - while (dataLen > pos && data.charAt(pos++) !== ""); -// sys.puts("Found: " + [pos, data.charAt(pos)]); -}) + "ms"); diff --git a/node_modules/jsdom/node_modules/htmlparser/node-htmlparser.old.js b/node_modules/jsdom/node_modules/htmlparser/node-htmlparser.old.js deleted file mode 100644 index cfc1664..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/node-htmlparser.old.js +++ /dev/null @@ -1,754 +0,0 @@ -/*********************************************** -Copyright 2010, Chris Winberry . All rights reserved. -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. -***********************************************/ -/* v1.5.0 */ - -(function () { - -function runningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!runningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - else if (this.Tautologistics.NodeHtmlParser) - return; //NodeHtmlParser already defined! - this.Tautologistics.NodeHtmlParser = {}; - exports = this.Tautologistics.NodeHtmlParser; -} - -//Types of elements found in the DOM -var ElementType = { - Text: "text" //Plain text - , Directive: "directive" //Special tag - , Comment: "comment" //Special tag - , Script: "script" //Special tag - , Style: "style" //Special tag - , Tag: "tag" //Any tag that isn't special -} - -function Parser (handler) { - this.validateHandler(handler); - this._handler = handler; - this.reset(); -} - - //**"Static"**// - //Regular expressions used for cleaning up and parsing (stateless) - Parser._reTrim = /(^\s+|\s+$)/g; //Trim leading/trailing whitespace - Parser._reTrimComment = /(^\!--|--$)/g; //Remove comment tag markup from comment contents - Parser._reWhitespace = /\s/g; //Used to find any whitespace to split on - Parser._reTagName = /^\s*(\/?)\s*([^\s\/]+)/; //Used to find the tag name for an element - - //Regular expressions used for parsing (stateful) - Parser._reAttrib = //Find attributes in a tag - /([^=<>\"\'\s]+)\s*=\s*"([^"]*)"|([^=<>\"\'\s]+)\s*=\s*'([^']*)'|([^=<>\"\'\s]+)\s*=\s*([^'"\s]+)|([^=<>\"\'\s\/]+)/g; - Parser._reTags = /[\<\>]/g; //Find tag markers - - //**Public**// - //Methods// - //Parses a complete HTML and pushes it to the handler - Parser.prototype.parseComplete = function Parser$parseComplete (data) { - this.reset(); - this.parseChunk(data); - this.done(); - } - - //Parses a piece of an HTML document - Parser.prototype.parseChunk = function Parser$parseChunk (data) { - if (this._done) - this.handleError(new Error("Attempted to parse chunk after parsing already done")); - this._buffer += data; //FIXME: this can be a bottleneck - this.parseTags(); - } - - //Tells the parser that the HTML being parsed is complete - Parser.prototype.done = function Parser$done () { - if (this._done) - return; - this._done = true; - - //Push any unparsed text into a final element in the element list - if (this._buffer.length) { - var rawData = this._buffer; - this._buffer = ""; - var element = { - raw: rawData - , data: (this._parseState == ElementType.Text) ? rawData : rawData.replace(Parser._reTrim, "") - , type: this._parseState - }; - if (this._parseState == ElementType.Tag || this._parseState == ElementType.Script || this._parseState == ElementType.Style) - element.name = this.parseTagName(element.data); - this.parseAttribs(element); - this._elements.push(element); - } - - this.writeHandler(); - this._handler.done(); - } - - //Resets the parser to a blank state, ready to parse a new HTML document - Parser.prototype.reset = function Parser$reset () { - this._buffer = ""; - this._done = false; - this._elements = []; - this._elementsCurrent = 0; - this._current = 0; - this._next = 0; - this._parseState = ElementType.Text; - this._prevTagSep = ''; - this._tagStack = []; - this._handler.reset(); - } - - //**Private**// - //Properties// - Parser.prototype._handler = null; //Handler for parsed elements - Parser.prototype._buffer = null; //Buffer of unparsed data - Parser.prototype._done = false; //Flag indicating whether parsing is done - Parser.prototype._elements = null; //Array of parsed elements - Parser.prototype._elementsCurrent = 0; //Pointer to last element in _elements that has been processed - Parser.prototype._current = 0; //Position in data that has already been parsed - Parser.prototype._next = 0; //Position in data of the next tag marker (<>) - Parser.prototype._parseState = ElementType.Text; //Current type of element being parsed - Parser.prototype._prevTagSep = ''; //Previous tag marker found - //Stack of element types previously encountered; keeps track of when - //parsing occurs inside a script/comment/style tag - Parser.prototype._tagStack = null; - - //Methods// - //Takes an array of elements and parses any found attributes - Parser.prototype.parseTagAttribs = function Parser$parseTagAttribs (elements) { - var idxEnd = elements.length; - var idx = 0; - - while (idx < idxEnd) { - var element = elements[idx++]; - if (element.type == ElementType.Tag || element.type == ElementType.Script || element.type == ElementType.style) - this.parseAttribs(element); - } - - return(elements); - } - - //Takes an element and adds an "attribs" property for any element attributes found - Parser.prototype.parseAttribs = function Parser$parseAttribs (element) { - //Only parse attributes for tags - if (element.type != ElementType.Script && element.type != ElementType.Style && element.type != ElementType.Tag) - return; - - var tagName = element.data.split(Parser._reWhitespace, 1)[0]; - var attribRaw = element.data.substring(tagName.length); - if (attribRaw.length < 1) - return; - - var match; - Parser._reAttrib.lastIndex = 0; - while (match = Parser._reAttrib.exec(attribRaw)) { - if (element.attribs == undefined) - element.attribs = {}; - - if (typeof match[1] == "string" && match[1].length) { - element.attribs[match[1]] = match[2]; - } else if (typeof match[3] == "string" && match[3].length) { - element.attribs[match[3].toString()] = match[4].toString(); - } else if (typeof match[5] == "string" && match[5].length) { - element.attribs[match[5]] = match[6]; - } else if (typeof match[7] == "string" && match[7].length) { - element.attribs[match[7]] = match[7]; - } - } - } - - //Extracts the base tag name from the data value of an element - Parser.prototype.parseTagName = function Parser$parseTagName (data) { - if (data == null || data == "") - return(""); - var match = Parser._reTagName.exec(data); - if (!match) - return(""); - return((match[1] ? "/" : "") + match[2]); - } - - //Parses through HTML text and returns an array of found elements - //I admit, this function is rather large but splitting up had an noticeable impact on speed - Parser.prototype.parseTags = function Parser$parseTags () { - var bufferEnd = this._buffer.length - 1; - while (Parser._reTags.test(this._buffer)) { - this._next = Parser._reTags.lastIndex - 1; - var tagSep = this._buffer.charAt(this._next); //The currently found tag marker - var rawData = this._buffer.substring(this._current, this._next); //The next chunk of data to parse - - //A new element to eventually be appended to the element list - var element = { - raw: rawData - , data: (this._parseState == ElementType.Text) ? rawData : rawData.replace(Parser._reTrim, "") - , type: this._parseState - }; - - var elementName = this.parseTagName(element.data); - - //This section inspects the current tag stack and modifies the current - //element if we're actually parsing a special area (script/comment/style tag) - if (this._tagStack.length) { //We're parsing inside a script/comment/style tag - if (this._tagStack[this._tagStack.length - 1] == ElementType.Script) { //We're currently in a script tag - if (elementName == "/script") //Actually, we're no longer in a script tag, so pop it off the stack - this._tagStack.pop(); - else { //Not a closing script tag - if (element.raw.indexOf("!--") != 0) { //Make sure we're not in a comment - //All data from here to script close is now a text element - element.type = ElementType.Text; - //If the previous element is text, append the current text to it - if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Text) { - var prevElement = this._elements[this._elements.length - 1]; - prevElement.raw = prevElement.data = prevElement.raw + this._prevTagSep + element.raw; - element.raw = element.data = ""; //This causes the current element to not be added to the element list - } - } - } - } - else if (this._tagStack[this._tagStack.length - 1] == ElementType.Style) { //We're currently in a style tag - if (elementName == "/style") //Actually, we're no longer in a style tag, so pop it off the stack - this._tagStack.pop(); - else { - if (element.raw.indexOf("!--") != 0) { //Make sure we're not in a comment - //All data from here to style close is now a text element - element.type = ElementType.Text; - //If the previous element is text, append the current text to it - if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Text) { - if (element.raw != "") { - var prevElement = this._elements[this._elements.length - 1]; - prevElement.raw = prevElement.data = prevElement.raw + this._prevTagSep + element.raw; - element.raw = element.data = ""; //This causes the current element to not be added to the element list - } - else //Element is empty, so just append the last tag marker found - prevElement.raw = prevElement.data = prevElement.raw + this._prevTagSep; - } - else //The previous element was not text - if (element.raw != "") - element.raw = element.data = element.raw; - } - } - } - else if (this._tagStack[this._tagStack.length - 1] == ElementType.Comment) { //We're currently in a comment tag - var rawLen = element.raw.length; - if (element.raw.charAt(rawLen - 2) == "-" && element.raw.charAt(rawLen - 1) == "-" && tagSep == ">") { - //Actually, we're no longer in a style tag, so pop it off the stack - this._tagStack.pop(); - //If the previous element is a comment, append the current text to it - if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Comment) { - var prevElement = this._elements[this._elements.length - 1]; - prevElement.raw = prevElement.data = (prevElement.raw + element.raw).replace(Parser._reTrimComment, ""); - element.raw = element.data = ""; //This causes the current element to not be added to the element list - element.type = ElementType.Text; - } - else //Previous element not a comment - element.type = ElementType.Comment; //Change the current element's type to a comment - } - else { //Still in a comment tag - element.type = ElementType.Comment; - //If the previous element is a comment, append the current text to it - if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Comment) { - var prevElement = this._elements[this._elements.length - 1]; - prevElement.raw = prevElement.data = prevElement.raw + element.raw + tagSep; - element.raw = element.data = ""; //This causes the current element to not be added to the element list - element.type = ElementType.Text; - } - else - element.raw = element.data = element.raw + tagSep; - } - } - } - - //Processing of non-special tags - if (element.type == ElementType.Tag) { - element.name = elementName; - - if (element.raw.indexOf("!--") == 0) { //This tag is really comment - element.type = ElementType.Comment; - delete element["name"]; - var rawLen = element.raw.length; - //Check if the comment is terminated in the current element - if (element.raw.charAt(rawLen - 1) == "-" && element.raw.charAt(rawLen - 2) == "-" && tagSep == ">") - element.raw = element.data = element.raw.replace(Parser._reTrimComment, ""); - else { //It's not so push the comment onto the tag stack - element.raw += tagSep; - this._tagStack.push(ElementType.Comment); - } - } - else if (element.raw.indexOf("!") == 0 || element.raw.indexOf("?") == 0) { - element.type = ElementType.Directive; - //TODO: what about CDATA? - } - else if (element.name == "script") { - element.type = ElementType.Script; - //Special tag, push onto the tag stack if not terminated - if (element.data.charAt(element.data.length - 1) != "/") - this._tagStack.push(ElementType.Script); - } - else if (element.name == "/script") - element.type = ElementType.Script; - else if (element.name == "style") { - element.type = ElementType.Style; - //Special tag, push onto the tag stack if not terminated - if (element.data.charAt(element.data.length - 1) != "/") - this._tagStack.push(ElementType.Style); - } - else if (element.name == "/style") - element.type = ElementType.Style; - if (element.name && element.name.charAt(0) == "/") - element.data = element.name; - } - - //Add all tags and non-empty text elements to the element list - if (element.raw != "" || element.type != ElementType.Text) { - this.parseAttribs(element); - this._elements.push(element); - //If tag self-terminates, add an explicit, separate closing tag - if ( - element.type != ElementType.Text - && - element.type != ElementType.Comment - && - element.type != ElementType.Directive - && - element.data.charAt(element.data.length - 1) == "/" - ) - this._elements.push({ - raw: "/" + element.name - , data: "/" + element.name - , name: "/" + element.name - , type: element.type - }); - } - this._parseState = (tagSep == "<") ? ElementType.Tag : ElementType.Text; - this._current = this._next + 1; - this._prevTagSep = tagSep; - } - - this._buffer = (this._current <= bufferEnd) ? this._buffer.substring(this._current) : ""; - this._current = 0; - - this.writeHandler(); - } - - //Checks the handler to make it is an object with the right "interface" - Parser.prototype.validateHandler = function Parser$validateHandler (handler) { - if ((typeof handler) != "object") - throw new Error("Handler is not an object"); - if ((typeof handler.reset) != "function") - throw new Error("Handler method 'reset' is invalid"); - if ((typeof handler.done) != "function") - throw new Error("Handler method 'done' is invalid"); - if ((typeof handler.writeTag) != "function") - throw new Error("Handler method 'writeTag' is invalid"); - if ((typeof handler.writeText) != "function") - throw new Error("Handler method 'writeText' is invalid"); - if ((typeof handler.writeComment) != "function") - throw new Error("Handler method 'writeComment' is invalid"); - if ((typeof handler.writeDirective) != "function") - throw new Error("Handler method 'writeDirective' is invalid"); - } - - //Writes parsed elements out to the handler - Parser.prototype.writeHandler = function Parser$writeHandler (forceFlush) { - forceFlush = !!forceFlush; - if (this._tagStack.length && !forceFlush) - return; - while (this._elements.length) { - var element = this._elements.shift(); - switch (element.type) { - case ElementType.Comment: - this._handler.writeComment(element); - break; - case ElementType.Directive: - this._handler.writeDirective(element); - break; - case ElementType.Text: - this._handler.writeText(element); - break; - default: - this._handler.writeTag(element); - break; - } - } - } - - Parser.prototype.handleError = function Parser$handleError (error) { - if ((typeof this._handler.error) == "function") - this._handler.error(error); - else - throw error; - } - -//TODO: make this a trully streamable handler -function RssHandler (callback) { - RssHandler.super_.call(this, callback, { ignoreWhitespace: true, verbose: false, enforceEmptyTags: false }); -} -inherits(RssHandler, DefaultHandler); - - RssHandler.prototype.done = function RssHandler$done () { - var feed = { }; - var feedRoot; - - var found = DomUtils.getElementsByTagName(function (value) { return(value == "rss" || value == "feed"); }, this.dom, false); - if (found.length) { - feedRoot = found[0]; - } - if (feedRoot) { - if (feedRoot.name == "rss") { - feed.type = "rss"; - feedRoot = feedRoot.children[0]; // - feed.id = ""; -// require("sys").debug(require("sys").inspect(feedRoot, false, null)); -// require("sys").debug(require("sys").inspect(DomUtils.getElementsByTagName("title", feedRoot.children, false)[0].children[0].data, false, null)); - try { - feed.title = DomUtils.getElementsByTagName("title", feedRoot.children, false)[0].children[0].data; - } catch (ex) { } - try { - feed.link = DomUtils.getElementsByTagName("link", feedRoot.children, false)[0].children[0].data; - } catch (ex) { } - try { - feed.description = DomUtils.getElementsByTagName("description", feedRoot.children, false)[0].children[0].data; - } catch (ex) { } - try { - feed.updated = new Date(DomUtils.getElementsByTagName("lastBuildDate", feedRoot.children, false)[0].children[0].data); - } catch (ex) { } - try { - feed.author = DomUtils.getElementsByTagName("managingEditor", feedRoot.children, false)[0].children[0].data; - } catch (ex) { } - feed.items = []; - DomUtils.getElementsByTagName("item", feedRoot.children).forEach(function (item, index, list) { - var entry = {}; - try { - entry.id = DomUtils.getElementsByTagName("guid", item.children, false)[0].children[0].data; - } catch (ex) { } - try { - entry.title = DomUtils.getElementsByTagName("title", item.children, false)[0].children[0].data; - } catch (ex) { } - try { - entry.link = DomUtils.getElementsByTagName("link", item.children, false)[0].children[0].data; - } catch (ex) { } - try { - entry.description = DomUtils.getElementsByTagName("description", item.children, false)[0].children[0].data; - } catch (ex) { } - try { - entry.pubDate = new Date(DomUtils.getElementsByTagName("pubDate", item.children, false)[0].children[0].data); - } catch (ex) { } - feed.items.push(entry); - }); - } else { - feed.type = "atom"; - try { - feed.id = DomUtils.getElementsByTagName("id", feedRoot.children, false)[0].children[0].data; - } catch (ex) { } - try { - feed.title = DomUtils.getElementsByTagName("title", feedRoot.children, false)[0].children[0].data; - } catch (ex) { } - try { - feed.link = DomUtils.getElementsByTagName("link", feedRoot.children, false)[0].attribs.href; - } catch (ex) { } - try { - feed.description = DomUtils.getElementsByTagName("subtitle", feedRoot.children, false)[0].children[0].data; - } catch (ex) { } - try { - feed.updated = new Date(DomUtils.getElementsByTagName("updated", feedRoot.children, false)[0].children[0].data); - } catch (ex) { } - try { - feed.author = DomUtils.getElementsByTagName("email", feedRoot.children, true)[0].children[0].data; - } catch (ex) { } - feed.items = []; - DomUtils.getElementsByTagName("entry", feedRoot.children).forEach(function (item, index, list) { - var entry = {}; - try { - entry.id = DomUtils.getElementsByTagName("id", item.children, false)[0].children[0].data; - } catch (ex) { } - try { - entry.title = DomUtils.getElementsByTagName("title", item.children, false)[0].children[0].data; - } catch (ex) { } - try { - entry.link = DomUtils.getElementsByTagName("link", item.children, false)[0].attribs.href; - } catch (ex) { } - try { - entry.description = DomUtils.getElementsByTagName("summary", item.children, false)[0].children[0].data; - } catch (ex) { } - try { - entry.pubDate = new Date(DomUtils.getElementsByTagName("updated", item.children, false)[0].children[0].data); - } catch (ex) { } - feed.items.push(entry); - }); - } - - this.dom = feed; - } - RssHandler.super_.prototype.done.call(this); - } - -/////////////////////////////////////////////////// - -function DefaultHandler (callback, options) { - this.reset(); - this._options = options ? options : { }; - if (this._options.ignoreWhitespace == undefined) - this._options.ignoreWhitespace = false; //Keep whitespace-only text nodes - if (this._options.verbose == undefined) - this._options.verbose = true; //Keep data property for tags and raw property for all - if (this._options.enforceEmptyTags == undefined) - this._options.enforceEmptyTags = true; //Don't allow children for HTML tags defined as empty in spec - if ((typeof callback) == "function") - this._callback = callback; -} - - //**"Static"**// - //HTML Tags that shouldn't contain child nodes - DefaultHandler._emptyTags = { - area: 1 - , base: 1 - , basefont: 1 - , br: 1 - , col: 1 - , frame: 1 - , hr: 1 - , img: 1 - , input: 1 - , isindex: 1 - , link: 1 - , meta: 1 - , param: 1 - , embed: 1 - } - //Regex to detect whitespace only text nodes - DefaultHandler.reWhitespace = /^\s*$/; - - //**Public**// - //Properties// - DefaultHandler.prototype.dom = null; //The hierarchical object containing the parsed HTML - //Methods// - //Resets the handler back to starting state - DefaultHandler.prototype.reset = function DefaultHandler$reset() { - this.dom = []; - this._done = false; - this._tagStack = []; - this._tagStack.last = function DefaultHandler$_tagStack$last () { - return(this.length ? this[this.length - 1] : null); - } - } - //Signals the handler that parsing is done - DefaultHandler.prototype.done = function DefaultHandler$done () { - this._done = true; - this.handleCallback(null); - } - DefaultHandler.prototype.writeTag = function DefaultHandler$writeTag (element) { - this.handleElement(element); - } - DefaultHandler.prototype.writeText = function DefaultHandler$writeText (element) { - if (this._options.ignoreWhitespace) - if (DefaultHandler.reWhitespace.test(element.data)) - return; - this.handleElement(element); - } - DefaultHandler.prototype.writeComment = function DefaultHandler$writeComment (element) { - this.handleElement(element); - } - DefaultHandler.prototype.writeDirective = function DefaultHandler$writeDirective (element) { - this.handleElement(element); - } - DefaultHandler.prototype.error = function DefaultHandler$error (error) { - this.handleCallback(error); - } - - //**Private**// - //Properties// - DefaultHandler.prototype._options = null; //Handler options for how to behave - DefaultHandler.prototype._callback = null; //Callback to respond to when parsing done - DefaultHandler.prototype._done = false; //Flag indicating whether handler has been notified of parsing completed - DefaultHandler.prototype._tagStack = null; //List of parents to the currently element being processed - //Methods// - DefaultHandler.prototype.handleCallback = function DefaultHandler$handleCallback (error) { - if ((typeof this._callback) != "function") - if (error) - throw error; - else - return; - this._callback(error, this.dom); - } - DefaultHandler.prototype.handleElement = function DefaultHandler$handleElement (element) { - if (this._done) - this.handleCallback(new Error("Writing to the handler after done() called is not allowed without a reset()")); - if (!this._options.verbose) { -// element.raw = null; //FIXME: Not clean - //FIXME: Serious performance problem using delete - delete element.raw; - if (element.type == "tag" || element.type == "script" || element.type == "style") - delete element.data; - } - if (!this._tagStack.last()) { //There are no parent elements - //If the element can be a container, add it to the tag stack and the top level list - if (element.type != ElementType.Text && element.type != ElementType.Comment && element.type != ElementType.Directive) { - if (element.name.charAt(0) != "/") { //Ignore closing tags that obviously don't have an opening tag - this.dom.push(element); - if (!this._options.enforceEmptyTags || !DefaultHandler._emptyTags[element.name]) { //Don't add tags to the tag stack that can't have children - this._tagStack.push(element); - } - } - } - else //Otherwise just add to the top level list - this.dom.push(element); - } - else { //There are parent elements - //If the element can be a container, add it as a child of the element - //on top of the tag stack and then add it to the tag stack - if (element.type != ElementType.Text && element.type != ElementType.Comment && element.type != ElementType.Directive) { - if (element.name.charAt(0) == "/") { - //This is a closing tag, scan the tagStack to find the matching opening tag - //and pop the stack up to the opening tag's parent - var baseName = element.name.substring(1); - if (!this._options.enforceEmptyTags || !DefaultHandler._emptyTags[baseName]) { - var pos = this._tagStack.length - 1; - while (pos > -1 && this._tagStack[pos--].name != baseName) { } - if (pos > -1 || this._tagStack[0].name == baseName) - while (pos < this._tagStack.length - 1) - this._tagStack.pop(); - } - } - else { //This is not a closing tag - if (!this._tagStack.last().children) - this._tagStack.last().children = []; - this._tagStack.last().children.push(element); - if (!this._options.enforceEmptyTags || !DefaultHandler._emptyTags[element.name]) //Don't add tags to the tag stack that can't have children - this._tagStack.push(element); - } - } - else { //This is not a container element - if (!this._tagStack.last().children) - this._tagStack.last().children = []; - this._tagStack.last().children.push(element); - } - } - } - - var DomUtils = { - testElement: function DomUtils$testElement (options, element) { - if (!element) { - return(false); - } - - for (var key in options) { - if (key == "tag_name") { - if (element.type != "tag" && element.type != "script" && element.type != "style") { - return(false); - } - return(options["tag_name"](element.name)); - } else if (key == "tag_type") { - return(options["tag_type"](element.type)); - } else if (key == "tag_contains") { - if (element.type != "text" && element.type != "comment" && element.type != "directive") { - return(false); - } - return(options["tag_contains"](element.data)); - } else { - return(element.attribs && options[key](element.attribs[key])); - } - } - - return(true); - } - - , getElements: function DomUtils$getElements (options, currentElement, recurse) { - recurse = (recurse === undefined || recurse === null) || !!recurse; - - if (!currentElement) { - return([]); - } - - var found = []; - var elementList; - - function getTest (checkVal) { - return(((typeof options[key]) == "function") ? checkVal : function (value) { return(value == checkVal); }); - } - for (var key in options) { - options[key] = getTest(options[key]); - } - - if (DomUtils.testElement(options, currentElement)) { - found.push(currentElement); - } - - if (recurse && currentElement.children) - elementList = currentElement.children; - else if (currentElement instanceof Array) - elementList = currentElement; - else - return(found); - - for (var i = 0; i < elementList.length; i++) - found = found.concat(DomUtils.getElements(options, elementList[i], recurse)); - - return(found); - } - - , getElementById: function DomUtils$getElementById (id, currentElement, recurse) { - recurse = (recurse === undefined || recurse === null) || !!recurse; - var result = DomUtils.getElements({ id: id }, currentElement, recurse); - return(result.length ? result[0] : null); - } - - , getElementsByTagName: function DomUtils$getElementsByTagName (name, currentElement, recurse) { - recurse = (recurse === undefined || recurse === null) || !!recurse; - return(DomUtils.getElements({ tag_name: name }, currentElement, recurse)); - } - - , getElementsByTagType: function DomUtils$getElementsByTagType (type, currentElement, recurse) { - recurse = (recurse === undefined || recurse === null) || !!recurse; - return(DomUtils.getElements({ tag_type: type }, currentElement, recurse)); - } - } - - function inherits (ctor, superCtor) { - var tempCtor = function(){}; - tempCtor.prototype = superCtor.prototype; - ctor.super_ = superCtor; - ctor.prototype = new tempCtor(); - ctor.prototype.constructor = ctor; - } - -exports.Parser = Parser; - -exports.DefaultHandler = DefaultHandler; - -exports.RssHandler = RssHandler; - -exports.ElementType = ElementType; - -exports.DomUtils = DomUtils; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/package.json b/node_modules/jsdom/node_modules/htmlparser/package.json deleted file mode 100644 index 9e3a64a..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "htmlparser", - "description": "Forgiving HTML/XML/RSS Parser in JS for *both* Node and Browsers", - "version": "1.7.6", - "author": { - "name": "Chris Winberry", - "email": "chris@winberry.net" - }, - "contributors": [], - "repository": { - "type": "git", - "url": "https://github.com/tautologistics/node-htmlparser" - }, - "keywords": [ - "html", - "xml", - "rss", - "parser" - ], - "directories": { - "lib": "./lib/" - }, - "main": "./lib/htmlparser", - "homepage": "http://github.com/tautologistics/node-htmlparser", - "bugs": { - "mail": "chris@winberry.net", - "url": "http://github.com/tautologistics/node-htmlparser/issues" - }, - "engines": { - "node": ">=0.1.33" - }, - "licenses": [ - { - "type": "MIT", - "url": "http://github.com/tautologistics/node-htmlparser/raw/master/LICENSE" - } - ], - "readme": "#NodeHtmlParser\nA forgiving HTML/XML/RSS parser written in JS for both the browser and NodeJS (yes, despite the name it works just fine in any modern browser). The parser can handle streams (chunked data) and supports custom handlers for writing custom DOMs/output.\n\n##Installing\n\n\tnpm install htmlparser\n\n##Running Tests\n\n###Run tests under node:\n\tnode runtests.js\n\n###Run tests in browser:\nView runtests.html in any browser\n\n##Usage In Node\n\n```javascript\nvar htmlparser = require(\"htmlparser\");\nvar rawHtml = \"Xyz - , Style: "style" //Special tag - , Tag: "tag" //Any tag that isn't special - } - - function Parser (handler) { - this.validateHandler(handler); - this._handler = handler; - this.reset(); - } - - //**"Static"**// - //Regular expressions used for cleaning up and parsing (stateless) - Parser._reTrim = /(^\s+|\s+$)/g; //Trim leading/trailing whitespace - Parser._reTrimComment = /(^\!--|--$)/g; //Remove comment tag markup from comment contents - Parser._reWhitespace = /\s/g; //Used to find any whitespace to split on - Parser._reTagName = /^\s*(\/?)\s*([^\s\/]+)/; //Used to find the tag name for an element - - //Regular expressions used for parsing (stateful) - Parser._reAttrib = //Find attributes in a tag - /([^=<>\"\'\s]+)\s*=\s*"([^"]*)"|([^=<>\"\'\s]+)\s*=\s*'([^']*)'|([^=<>\"\'\s]+)\s*=\s*([^'"\s]+)|([^=<>\"\'\s\/]+)/g; -Parser._reTags = /[\<\>]/g; //Find tag markers - -//**Public**// -//Methods// -//Parses a complete HTML and pushes it to the handler -Parser.prototype.parseComplete = function Parser$parseComplete (data) { - this.reset(); - this.parseChunk(data); - this.done(); -} - -//Parses a piece of an HTML document -Parser.prototype.parseChunk = function Parser$parseChunk (data) { - if (this._done) - this.handleError(new Error("Attempted to parse chunk after parsing already done")); - this._buffer += data; //FIXME: this can be a bottleneck - this.parseTags(); -} - -//Tells the parser that the HTML being parsed is complete -Parser.prototype.done = function Parser$done () { - if (this._done) - return; - this._done = true; - - //Push any unparsed text into a final element in the element list - if (this._buffer.length) { - var rawData = this._buffer; - this._buffer = ""; - var element = { - raw: rawData - , data: (this._parseState == ElementType.Text) ? rawData : rawData.replace(Parser._reTrim, "") - , type: this._parseState - }; - if (this._parseState == ElementType.Tag || this._parseState == ElementType.Script || this._parseState == ElementType.Style) - element.name = this.parseTagName(element.data); - this.parseAttribs(element); - this._elements.push(element); - } - - this.writeHandler(); - this._handler.done(); -} - -//Resets the parser to a blank state, ready to parse a new HTML document -Parser.prototype.reset = function Parser$reset () { - this._buffer = ""; - this._done = false; - this._elements = []; - this._elementsCurrent = 0; - this._current = 0; - this._next = 0; - this._parseState = ElementType.Text; - this._prevTagSep = ''; - this._tagStack = []; - this._handler.reset(); -} - -//**Private**// -//Properties// -Parser.prototype._handler = null; //Handler for parsed elements -Parser.prototype._buffer = null; //Buffer of unparsed data -Parser.prototype._done = false; //Flag indicating whether parsing is done -Parser.prototype._elements = null; //Array of parsed elements -Parser.prototype._elementsCurrent = 0; //Pointer to last element in _elements that has been processed -Parser.prototype._current = 0; //Position in data that has already been parsed -Parser.prototype._next = 0; //Position in data of the next tag marker (<>) -Parser.prototype._parseState = ElementType.Text; //Current type of element being parsed -Parser.prototype._prevTagSep = ''; //Previous tag marker found -//Stack of element types previously encountered; keeps track of when -//parsing occurs inside a script/comment/style tag -Parser.prototype._tagStack = null; - -//Methods// -//Takes an array of elements and parses any found attributes -Parser.prototype.parseTagAttribs = function Parser$parseTagAttribs (elements) { - var idxEnd = elements.length; - var idx = 0; - - while (idx < idxEnd) { - var element = elements[idx++]; - if (element.type == ElementType.Tag || element.type == ElementType.Script || element.type == ElementType.style) - this.parseAttribs(element); - } - - return(elements); -} - -//Takes an element and adds an "attribs" property for any element attributes found -Parser.prototype.parseAttribs = function Parser$parseAttribs (element) { - //Only parse attributes for tags - if (element.type != ElementType.Script && element.type != ElementType.Style && element.type != ElementType.Tag) - return; - - var tagName = element.data.split(Parser._reWhitespace, 1)[0]; - var attribRaw = element.data.substring(tagName.length); - if (attribRaw.length < 1) - return; - - var match; - Parser._reAttrib.lastIndex = 0; - while (match = Parser._reAttrib.exec(attribRaw)) { - if (element.attribs == undefined) - element.attribs = {}; - - if (typeof match[1] == "string" && match[1].length) { - element.attribs[match[1]] = match[2]; - } else if (typeof match[3] == "string" && match[3].length) { - element.attribs[match[3].toString()] = match[4].toString(); - } else if (typeof match[5] == "string" && match[5].length) { - element.attribs[match[5]] = match[6]; - } else if (typeof match[7] == "string" && match[7].length) { - element.attribs[match[7]] = match[7]; - } - } -} - -//Extracts the base tag name from the data value of an element -Parser.prototype.parseTagName = function Parser$parseTagName (data) { - if (data == null || data == "") - return(""); - var match = Parser._reTagName.exec(data); - if (!match) - return(""); - return((match[1] ? "/" : "") + match[2]); -} - -//Parses through HTML text and returns an array of found elements -//I admit, this function is rather large but splitting up had an noticeable impact on speed -Parser.prototype.parseTags = function Parser$parseTags () { - var bufferEnd = this._buffer.length - 1; - while (Parser._reTags.test(this._buffer)) { - this._next = Parser._reTags.lastIndex - 1; - var tagSep = this._buffer.charAt(this._next); //The currently found tag marker - var rawData = this._buffer.substring(this._current, this._next); //The next chunk of data to parse - - //A new element to eventually be appended to the element list - var element = { - raw: rawData - , data: (this._parseState == ElementType.Text) ? rawData : rawData.replace(Parser._reTrim, "") - , type: this._parseState - }; - - var elementName = this.parseTagName(element.data); - - //This section inspects the current tag stack and modifies the current - //element if we're actually parsing a special area (script/comment/style tag) - if (this._tagStack.length) { //We're parsing inside a script/comment/style tag - if (this._tagStack[this._tagStack.length - 1] == ElementType.Script) { //We're currently in a script tag - if (elementName == "/script") //Actually, we're no longer in a script tag, so pop it off the stack - this._tagStack.pop(); - else { //Not a closing script tag - if (element.raw.indexOf("!--") != 0) { //Make sure we're not in a comment - //All data from here to script close is now a text element - element.type = ElementType.Text; - //If the previous element is text, append the current text to it - if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Text) { - var prevElement = this._elements[this._elements.length - 1]; - prevElement.raw = prevElement.data = prevElement.raw + this._prevTagSep + element.raw; - element.raw = element.data = ""; //This causes the current element to not be added to the element list - } - } - } - } - else if (this._tagStack[this._tagStack.length - 1] == ElementType.Style) { //We're currently in a style tag - if (elementName == "/style") //Actually, we're no longer in a style tag, so pop it off the stack - this._tagStack.pop(); - else { - if (element.raw.indexOf("!--") != 0) { //Make sure we're not in a comment - //All data from here to style close is now a text element - element.type = ElementType.Text; - //If the previous element is text, append the current text to it - if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Text) { - if (element.raw != "") { - var prevElement = this._elements[this._elements.length - 1]; - prevElement.raw = prevElement.data = prevElement.raw + this._prevTagSep + element.raw; - element.raw = element.data = ""; //This causes the current element to not be added to the element list - } - else{ //Element is empty, so just append the last tag marker found - if (prevElement) { - prevElement.raw = prevElement.data = prevElement.raw + this._prevTagSep; - } - } - } - else //The previous element was not text - if (element.raw != "") - element.raw = element.data = element.raw; - } - } - } - else if (this._tagStack[this._tagStack.length - 1] == ElementType.Comment) { //We're currently in a comment tag - var rawLen = element.raw.length; - if (element.raw.charAt(rawLen - 2) == "-" && element.raw.charAt(rawLen - 1) == "-" && tagSep == ">") { - //Actually, we're no longer in a style tag, so pop it off the stack - this._tagStack.pop(); - //If the previous element is a comment, append the current text to it - if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Comment) { - var prevElement = this._elements[this._elements.length - 1]; - prevElement.raw = prevElement.data = (prevElement.raw + element.raw).replace(Parser._reTrimComment, ""); - element.raw = element.data = ""; //This causes the current element to not be added to the element list - element.type = ElementType.Text; - } - else //Previous element not a comment - element.type = ElementType.Comment; //Change the current element's type to a comment - } - else { //Still in a comment tag - element.type = ElementType.Comment; - //If the previous element is a comment, append the current text to it - if (this._elements.length && this._elements[this._elements.length - 1].type == ElementType.Comment) { - var prevElement = this._elements[this._elements.length - 1]; - prevElement.raw = prevElement.data = prevElement.raw + element.raw + tagSep; - element.raw = element.data = ""; //This causes the current element to not be added to the element list - element.type = ElementType.Text; - } - else - element.raw = element.data = element.raw + tagSep; - } - } - } - - //Processing of non-special tags - if (element.type == ElementType.Tag) { - element.name = elementName; - - if (element.raw.indexOf("!--") == 0) { //This tag is really comment - element.type = ElementType.Comment; - delete element["name"]; - var rawLen = element.raw.length; - //Check if the comment is terminated in the current element - if (element.raw.charAt(rawLen - 1) == "-" && element.raw.charAt(rawLen - 2) == "-" && tagSep == ">") - element.raw = element.data = element.raw.replace(Parser._reTrimComment, ""); - else { //It's not so push the comment onto the tag stack - element.raw += tagSep; - this._tagStack.push(ElementType.Comment); - } - } - else if (element.raw.indexOf("!") == 0 || element.raw.indexOf("?") == 0) { - element.type = ElementType.Directive; - //TODO: what about CDATA? - } - else if (element.name == "script") { - element.type = ElementType.Script; - //Special tag, push onto the tag stack if not terminated - if (element.data.charAt(element.data.length - 1) != "/") - this._tagStack.push(ElementType.Script); - } - else if (element.name == "/script") - element.type = ElementType.Script; - else if (element.name == "style") { - element.type = ElementType.Style; - //Special tag, push onto the tag stack if not terminated - if (element.data.charAt(element.data.length - 1) != "/") - this._tagStack.push(ElementType.Style); - } - else if (element.name == "/style") - element.type = ElementType.Style; - if (element.name && element.name.charAt(0) == "/") - element.data = element.name; - } - - //Add all tags and non-empty text elements to the element list - if (element.raw != "" || element.type != ElementType.Text) { - this.parseAttribs(element); - this._elements.push(element); - //If tag self-terminates, add an explicit, separate closing tag - if ( - element.type != ElementType.Text - && - element.type != ElementType.Comment - && - element.type != ElementType.Directive - && - element.data.charAt(element.data.length - 1) == "/" - ) - this._elements.push({ - raw: "/" + element.name - , data: "/" + element.name - , name: "/" + element.name - , type: element.type - }); - } - this._parseState = (tagSep == "<") ? ElementType.Tag : ElementType.Text; - this._current = this._next + 1; - this._prevTagSep = tagSep; - } - - this._buffer = (this._current <= bufferEnd) ? this._buffer.substring(this._current) : ""; - this._current = 0; - - this.writeHandler(); -} - -//Checks the handler to make it is an object with the right "interface" -Parser.prototype.validateHandler = function Parser$validateHandler (handler) { - if ((typeof handler) != "object") - throw new Error("Handler is not an object"); - if ((typeof handler.reset) != "function") - throw new Error("Handler method 'reset' is invalid"); - if ((typeof handler.done) != "function") - throw new Error("Handler method 'done' is invalid"); - if ((typeof handler.writeTag) != "function") - throw new Error("Handler method 'writeTag' is invalid"); - if ((typeof handler.writeText) != "function") - throw new Error("Handler method 'writeText' is invalid"); - if ((typeof handler.writeComment) != "function") - throw new Error("Handler method 'writeComment' is invalid"); - if ((typeof handler.writeDirective) != "function") - throw new Error("Handler method 'writeDirective' is invalid"); -} - -//Writes parsed elements out to the handler -Parser.prototype.writeHandler = function Parser$writeHandler (forceFlush) { - forceFlush = !!forceFlush; - if (this._tagStack.length && !forceFlush) - return; - while (this._elements.length) { - var element = this._elements.shift(); - switch (element.type) { - case ElementType.Comment: - this._handler.writeComment(element); - break; - case ElementType.Directive: - this._handler.writeDirective(element); - break; - case ElementType.Text: - this._handler.writeText(element); - break; - default: - this._handler.writeTag(element); - break; - } - } -} - -Parser.prototype.handleError = function Parser$handleError (error) { - if ((typeof this._handler.error) == "function") - this._handler.error(error); - else - throw error; -} - -//TODO: make this a trully streamable handler -function RssHandler (callback) { - RssHandler.super_.call(this, callback, { ignoreWhitespace: true, verbose: false, enforceEmptyTags: false }); -} -inherits(RssHandler, DefaultHandler); - -RssHandler.prototype.done = function RssHandler$done () { - var feed = { }; - var feedRoot; - - var found = DomUtils.getElementsByTagName(function (value) { return(value == "rss" || value == "feed"); }, this.dom, false); - if (found.length) { - feedRoot = found[0]; - } - if (feedRoot) { - if (feedRoot.name == "rss") { - feed.type = "rss"; - feedRoot = feedRoot.children[0]; // - feed.id = ""; - try { - feed.title = DomUtils.getElementsByTagName("title", feedRoot.children, false)[0].children[0].data; - } catch (ex) { } - try { - feed.link = DomUtils.getElementsByTagName("link", feedRoot.children, false)[0].children[0].data; - } catch (ex) { } - try { - feed.description = DomUtils.getElementsByTagName("description", feedRoot.children, false)[0].children[0].data; - } catch (ex) { } - try { - feed.updated = new Date(DomUtils.getElementsByTagName("lastBuildDate", feedRoot.children, false)[0].children[0].data); - } catch (ex) { } - try { - feed.author = DomUtils.getElementsByTagName("managingEditor", feedRoot.children, false)[0].children[0].data; - } catch (ex) { } - feed.items = []; - DomUtils.getElementsByTagName("item", feedRoot.children).forEach(function (item, index, list) { - var entry = {}; - try { - entry.id = DomUtils.getElementsByTagName("guid", item.children, false)[0].children[0].data; - } catch (ex) { } - try { - entry.title = DomUtils.getElementsByTagName("title", item.children, false)[0].children[0].data; - } catch (ex) { } - try { - entry.link = DomUtils.getElementsByTagName("link", item.children, false)[0].children[0].data; - } catch (ex) { } - try { - entry.description = DomUtils.getElementsByTagName("description", item.children, false)[0].children[0].data; - } catch (ex) { } - try { - entry.pubDate = new Date(DomUtils.getElementsByTagName("pubDate", item.children, false)[0].children[0].data); - } catch (ex) { } - feed.items.push(entry); - }); - } else { - feed.type = "atom"; - try { - feed.id = DomUtils.getElementsByTagName("id", feedRoot.children, false)[0].children[0].data; - } catch (ex) { } - try { - feed.title = DomUtils.getElementsByTagName("title", feedRoot.children, false)[0].children[0].data; - } catch (ex) { } - try { - feed.link = DomUtils.getElementsByTagName("link", feedRoot.children, false)[0].attribs.href; - } catch (ex) { } - try { - feed.description = DomUtils.getElementsByTagName("subtitle", feedRoot.children, false)[0].children[0].data; - } catch (ex) { } - try { - feed.updated = new Date(DomUtils.getElementsByTagName("updated", feedRoot.children, false)[0].children[0].data); - } catch (ex) { } - try { - feed.author = DomUtils.getElementsByTagName("email", feedRoot.children, true)[0].children[0].data; - } catch (ex) { } - feed.items = []; - DomUtils.getElementsByTagName("entry", feedRoot.children).forEach(function (item, index, list) { - var entry = {}; - try { - entry.id = DomUtils.getElementsByTagName("id", item.children, false)[0].children[0].data; - } catch (ex) { } - try { - entry.title = DomUtils.getElementsByTagName("title", item.children, false)[0].children[0].data; - } catch (ex) { } - try { - entry.link = DomUtils.getElementsByTagName("link", item.children, false)[0].attribs.href; - } catch (ex) { } - try { - entry.description = DomUtils.getElementsByTagName("summary", item.children, false)[0].children[0].data; - } catch (ex) { } - try { - entry.pubDate = new Date(DomUtils.getElementsByTagName("updated", item.children, false)[0].children[0].data); - } catch (ex) { } - feed.items.push(entry); - }); - } - - this.dom = feed; - } - RssHandler.super_.prototype.done.call(this); -} - -/////////////////////////////////////////////////// - -function DefaultHandler (callback, options) { - this.reset(); - this._options = options ? options : { }; - if (this._options.ignoreWhitespace == undefined) - this._options.ignoreWhitespace = false; //Keep whitespace-only text nodes - if (this._options.verbose == undefined) - this._options.verbose = true; //Keep data property for tags and raw property for all - if (this._options.enforceEmptyTags == undefined) - this._options.enforceEmptyTags = true; //Don't allow children for HTML tags defined as empty in spec - if ((typeof callback) == "function") - this._callback = callback; -} - -//**"Static"**// -//HTML Tags that shouldn't contain child nodes -DefaultHandler._emptyTags = { - area: 1 - , base: 1 - , basefont: 1 - , br: 1 - , col: 1 - , frame: 1 - , hr: 1 - , img: 1 - , input: 1 - , isindex: 1 - , link: 1 - , meta: 1 - , param: 1 - , embed: 1 -} -//Regex to detect whitespace only text nodes -DefaultHandler.reWhitespace = /^\s*$/; - -//**Public**// -//Properties// -DefaultHandler.prototype.dom = null; //The hierarchical object containing the parsed HTML -//Methods// -//Resets the handler back to starting state -DefaultHandler.prototype.reset = function DefaultHandler$reset() { - this.dom = []; - this._done = false; - this._tagStack = []; - this._tagStack.last = function DefaultHandler$_tagStack$last () { - return(this.length ? this[this.length - 1] : null); - } -} -//Signals the handler that parsing is done -DefaultHandler.prototype.done = function DefaultHandler$done () { - this._done = true; - this.handleCallback(null); -} -DefaultHandler.prototype.writeTag = function DefaultHandler$writeTag (element) { - this.handleElement(element); -} -DefaultHandler.prototype.writeText = function DefaultHandler$writeText (element) { - if (this._options.ignoreWhitespace) - if (DefaultHandler.reWhitespace.test(element.data)) - return; - this.handleElement(element); -} -DefaultHandler.prototype.writeComment = function DefaultHandler$writeComment (element) { - this.handleElement(element); -} -DefaultHandler.prototype.writeDirective = function DefaultHandler$writeDirective (element) { - this.handleElement(element); -} -DefaultHandler.prototype.error = function DefaultHandler$error (error) { - this.handleCallback(error); -} - -//**Private**// -//Properties// -DefaultHandler.prototype._options = null; //Handler options for how to behave -DefaultHandler.prototype._callback = null; //Callback to respond to when parsing done -DefaultHandler.prototype._done = false; //Flag indicating whether handler has been notified of parsing completed -DefaultHandler.prototype._tagStack = null; //List of parents to the currently element being processed -//Methods// -DefaultHandler.prototype.handleCallback = function DefaultHandler$handleCallback (error) { - if ((typeof this._callback) != "function") - if (error) - throw error; - else - return; - this._callback(error, this.dom); -} -DefaultHandler.prototype.handleElement = function DefaultHandler$handleElement (element) { - if (this._done) - this.handleCallback(new Error("Writing to the handler after done() called is not allowed without a reset()")); - if (!this._options.verbose) { - // element.raw = null; //FIXME: Not clean - //FIXME: Serious performance problem using delete - delete element.raw; - if (element.type == "tag" || element.type == "script" || element.type == "style") - delete element.data; - } - if (!this._tagStack.last()) { //There are no parent elements - //If the element can be a container, add it to the tag stack and the top level list - if (element.type != ElementType.Text && element.type != ElementType.Comment && element.type != ElementType.Directive) { - if (element.name.charAt(0) != "/") { //Ignore closing tags that obviously don't have an opening tag - this.dom.push(element); - if (!this._options.enforceEmptyTags || !DefaultHandler._emptyTags[element.name]) { //Don't add tags to the tag stack that can't have children - this._tagStack.push(element); - } - } - } - else //Otherwise just add to the top level list - this.dom.push(element); - } - else { //There are parent elements - //If the element can be a container, add it as a child of the element - //on top of the tag stack and then add it to the tag stack - if (element.type != ElementType.Text && element.type != ElementType.Comment && element.type != ElementType.Directive) { - if (element.name.charAt(0) == "/") { - //This is a closing tag, scan the tagStack to find the matching opening tag - //and pop the stack up to the opening tag's parent - var baseName = element.name.substring(1); - if (!this._options.enforceEmptyTags || !DefaultHandler._emptyTags[baseName]) { - var pos = this._tagStack.length - 1; - while (pos > -1 && this._tagStack[pos--].name != baseName) { } - if (pos > -1 || this._tagStack[0].name == baseName) - while (pos < this._tagStack.length - 1) - this._tagStack.pop(); - } - } - else { //This is not a closing tag - if (!this._tagStack.last().children) - this._tagStack.last().children = []; - this._tagStack.last().children.push(element); - if (!this._options.enforceEmptyTags || !DefaultHandler._emptyTags[element.name]) //Don't add tags to the tag stack that can't have children - this._tagStack.push(element); - } - } - else { //This is not a container element - if (!this._tagStack.last().children) - this._tagStack.last().children = []; - this._tagStack.last().children.push(element); - } - } -} - -var DomUtils = { - testElement: function DomUtils$testElement (options, element) { - if (!element) { - return false; - } - - for (var key in options) { - if (key == "tag_name") { - if (element.type != "tag" && element.type != "script" && element.type != "style") { - return false; - } - if (!options["tag_name"](element.name)) { - return false; - } - } else if (key == "tag_type") { - if (!options["tag_type"](element.type)) { - return false; - } - } else if (key == "tag_contains") { - if (element.type != "text" && element.type != "comment" && element.type != "directive") { - return false; - } - if (!options["tag_contains"](element.data)) { - return false; - } - } else { - if (!element.attribs || !options[key](element.attribs[key])) { - return false; - } - } - } - - return true; - } - - , getElements: function DomUtils$getElements (options, currentElement, recurse, limit) { - recurse = (recurse === undefined || recurse === null) || !!recurse; - limit = isNaN(parseInt(limit)) ? -1 : parseInt(limit); - - if (!currentElement) { - return([]); - } - - var found = []; - var elementList; - - function getTest (checkVal) { - return(function (value) { return(value == checkVal); }); - } - for (var key in options) { - if ((typeof options[key]) != "function") { - options[key] = getTest(options[key]); - } - } - - if (DomUtils.testElement(options, currentElement)) { - found.push(currentElement); - } - - if (limit >= 0 && found.length >= limit) { - return(found); - } - - if (recurse && currentElement.children) { - elementList = currentElement.children; - } else if (currentElement instanceof Array) { - elementList = currentElement; - } else { - return(found); - } - - for (var i = 0; i < elementList.length; i++) { - found = found.concat(DomUtils.getElements(options, elementList[i], recurse, limit)); - if (limit >= 0 && found.length >= limit) { - break; - } - } - - return(found); - } - - , getElementById: function DomUtils$getElementById (id, currentElement, recurse) { - var result = DomUtils.getElements({ id: id }, currentElement, recurse, 1); - return(result.length ? result[0] : null); - } - - , getElementsByTagName: function DomUtils$getElementsByTagName (name, currentElement, recurse, limit) { - return(DomUtils.getElements({ tag_name: name }, currentElement, recurse, limit)); - } - - , getElementsByTagType: function DomUtils$getElementsByTagType (type, currentElement, recurse, limit) { - return(DomUtils.getElements({ tag_type: type }, currentElement, recurse, limit)); - } -} - -function inherits (ctor, superCtor) { - var tempCtor = function(){}; - tempCtor.prototype = superCtor.prototype; - ctor.super_ = superCtor; - ctor.prototype = new tempCtor(); - ctor.prototype.constructor = ctor; -} - -exports.Parser = Parser; - -exports.DefaultHandler = DefaultHandler; - -exports.RssHandler = RssHandler; - -exports.ElementType = ElementType; - -exports.DomUtils = DomUtils; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/lib/node-htmlparser.min.js b/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/lib/node-htmlparser.min.js deleted file mode 100644 index 5ab1e72..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/lib/node-htmlparser.min.js +++ /dev/null @@ -1,22 +0,0 @@ -/*********************************************** -Copyright 2010, Chris Winberry . All rights reserved. -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. -***********************************************/ -/* v1.6.3 */ -(function(){function e(a){this.validateHandler(a);this._handler=a;this.reset()}function n(a){n.super_.call(this,a,{ignoreWhitespace:true,verbose:false,enforceEmptyTags:false})}function g(a,c){this.reset();this._options=c?c:{};if(this._options.ignoreWhitespace==undefined)this._options.ignoreWhitespace=false;if(this._options.verbose==undefined)this._options.verbose=true;if(this._options.enforceEmptyTags==undefined)this._options.enforceEmptyTags=true;if(typeof a=="function")this._callback=a}if(!(typeof require== "function"&&typeof exports=="object"&&typeof module=="object"&&typeof __filename=="string"&&typeof __dirname=="string")){if(this.Tautologistics){if(this.Tautologistics.NodeHtmlParser)return}else this.Tautologistics={};this.Tautologistics.NodeHtmlParser={};exports=this.Tautologistics.NodeHtmlParser}var d={Text:"text",Directive:"directive",Comment:"comment",Script:"script",Style:"style",Tag:"tag"};e._reTrim=/(^\s+|\s+$)/g;e._reTrimComment=/(^\!--|--$)/g;e._reWhitespace=/\s/g;e._reTagName=/^\s*(\/?)\s*([^\s\/]+)/; e._reAttrib=/([^=<>\"\'\s]+)\s*=\s*"([^"]*)"|([^=<>\"\'\s]+)\s*=\s*'([^']*)'|([^=<>\"\'\s]+)\s*=\s*([^'"\s]+)|([^=<>\"\'\s\/]+)/g;e._reTags=/[\<\>]/g;e.prototype.parseComplete=function(a){this.reset();this.parseChunk(a);this.done()};e.prototype.parseChunk=function(a){this._done&&this.handleError(Error("Attempted to parse chunk after parsing already done"));this._buffer+=a;this.parseTags()};e.prototype.done=function(){if(!this._done){this._done=true;if(this._buffer.length){var a=this._buffer;this._buffer= "";a={raw:a,data:this._parseState==d.Text?a:a.replace(e._reTrim,""),type:this._parseState};if(this._parseState==d.Tag||this._parseState==d.Script||this._parseState==d.Style)a.name=this.parseTagName(a.data);this.parseAttribs(a);this._elements.push(a)}this.writeHandler();this._handler.done()}};e.prototype.reset=function(){this._buffer="";this._done=false;this._elements=[];this._next=this._current=this._elementsCurrent=0;this._parseState=d.Text;this._prevTagSep="";this._tagStack=[];this._handler.reset()}; e.prototype._handler=null;e.prototype._buffer=null;e.prototype._done=false;e.prototype._elements=null;e.prototype._elementsCurrent=0;e.prototype._current=0;e.prototype._next=0;e.prototype._parseState=d.Text;e.prototype._prevTagSep="";e.prototype._tagStack=null;e.prototype.parseTagAttribs=function(a){for(var c=a.length,b=0;b"){this._tagStack.pop();if(this._elements.length&&this._elements[this._elements.length-1].type==d.Comment){i=this._elements[this._elements.length-1];i.raw=i.data=(i.raw+b.raw).replace(e._reTrimComment, "");b.raw=b.data="";b.type=d.Text}else b.type=d.Comment}else{b.type=d.Comment;if(this._elements.length&&this._elements[this._elements.length-1].type==d.Comment){i=this._elements[this._elements.length-1];i.raw=i.data=i.raw+b.raw+c;b.raw=b.data="";b.type=d.Text}else b.raw=b.data=b.raw+c}}if(b.type==d.Tag){b.name=h;if(b.raw.indexOf("!--")==0){b.type=d.Comment;delete b.name;j=b.raw.length;if(b.raw.charAt(j-1)=="-"&&b.raw.charAt(j-2)=="-"&&c==">")b.raw=b.data=b.raw.replace(e._reTrimComment,"");else{b.raw+= c;this._tagStack.push(d.Comment)}}else if(b.raw.indexOf("!")==0||b.raw.indexOf("?")==0)b.type=d.Directive;else if(b.name=="script"){b.type=d.Script;b.data.charAt(b.data.length-1)!="/"&&this._tagStack.push(d.Script)}else if(b.name=="/script")b.type=d.Script;else if(b.name=="style"){b.type=d.Style;b.data.charAt(b.data.length-1)!="/"&&this._tagStack.push(d.Style)}else if(b.name=="/style")b.type=d.Style;if(b.name&&b.name.charAt(0)=="/")b.data=b.name}if(b.raw!=""||b.type!=d.Text){this.parseAttribs(b); this._elements.push(b);b.type!=d.Text&&b.type!=d.Comment&&b.type!=d.Directive&&b.data.charAt(b.data.length-1)=="/"&&this._elements.push({raw:"/"+b.name,data:"/"+b.name,name:"/"+b.name,type:b.type})}this._parseState=c=="<"?d.Tag:d.Text;this._current=this._next+1;this._prevTagSep=c}this._buffer=this._current<=a?this._buffer.substring(this._current):"";this._current=0;this.writeHandler()};e.prototype.validateHandler=function(a){if(typeof a!="object")throw Error("Handler is not an object");if(typeof a.reset!= "function")throw Error("Handler method 'reset' is invalid");if(typeof a.done!="function")throw Error("Handler method 'done' is invalid");if(typeof a.writeTag!="function")throw Error("Handler method 'writeTag' is invalid");if(typeof a.writeText!="function")throw Error("Handler method 'writeText' is invalid");if(typeof a.writeComment!="function")throw Error("Handler method 'writeComment' is invalid");if(typeof a.writeDirective!="function")throw Error("Handler method 'writeDirective' is invalid");}; e.prototype.writeHandler=function(a){a=!!a;if(!(this._tagStack.length&&!a))for(;this._elements.length;){a=this._elements.shift();switch(a.type){case d.Comment:this._handler.writeComment(a);break;case d.Directive:this._handler.writeDirective(a);break;case d.Text:this._handler.writeText(a);break;default:this._handler.writeTag(a)}}};e.prototype.handleError=function(a){if(typeof this._handler.error=="function")this._handler.error(a);else throw a;};(function(a,c){var b=function(){};b.prototype=c.prototype; a.super_=c;a.prototype=new b;a.prototype.constructor=a})(n,g);n.prototype.done=function(){var a={},c,b=f.getElementsByTagName(function(k){return k=="rss"||k=="feed"},this.dom,false);if(b.length)c=b[0];if(c){if(c.name=="rss"){a.type="rss";c=c.children[0];a.id="";try{a.title=f.getElementsByTagName("title",c.children,false)[0].children[0].data}catch(h){}try{a.link=f.getElementsByTagName("link",c.children,false)[0].children[0].data}catch(i){}try{a.description=f.getElementsByTagName("description",c.children, false)[0].children[0].data}catch(j){}try{a.updated=new Date(f.getElementsByTagName("lastBuildDate",c.children,false)[0].children[0].data)}catch(m){}try{a.author=f.getElementsByTagName("managingEditor",c.children,false)[0].children[0].data}catch(o){}a.items=[];f.getElementsByTagName("item",c.children).forEach(function(k){var l={};try{l.id=f.getElementsByTagName("guid",k.children,false)[0].children[0].data}catch(q){}try{l.title=f.getElementsByTagName("title",k.children,false)[0].children[0].data}catch(r){}try{l.link= f.getElementsByTagName("link",k.children,false)[0].children[0].data}catch(s){}try{l.description=f.getElementsByTagName("description",k.children,false)[0].children[0].data}catch(t){}try{l.pubDate=new Date(f.getElementsByTagName("pubDate",k.children,false)[0].children[0].data)}catch(u){}a.items.push(l)})}else{a.type="atom";try{a.id=f.getElementsByTagName("id",c.children,false)[0].children[0].data}catch(p){}try{a.title=f.getElementsByTagName("title",c.children,false)[0].children[0].data}catch(v){}try{a.link= f.getElementsByTagName("link",c.children,false)[0].attribs.href}catch(w){}try{a.description=f.getElementsByTagName("subtitle",c.children,false)[0].children[0].data}catch(x){}try{a.updated=new Date(f.getElementsByTagName("updated",c.children,false)[0].children[0].data)}catch(y){}try{a.author=f.getElementsByTagName("email",c.children,true)[0].children[0].data}catch(z){}a.items=[];f.getElementsByTagName("entry",c.children).forEach(function(k){var l={};try{l.id=f.getElementsByTagName("id",k.children, false)[0].children[0].data}catch(q){}try{l.title=f.getElementsByTagName("title",k.children,false)[0].children[0].data}catch(r){}try{l.link=f.getElementsByTagName("link",k.children,false)[0].attribs.href}catch(s){}try{l.description=f.getElementsByTagName("summary",k.children,false)[0].children[0].data}catch(t){}try{l.pubDate=new Date(f.getElementsByTagName("updated",k.children,false)[0].children[0].data)}catch(u){}a.items.push(l)})}this.dom=a}n.super_.prototype.done.call(this)};g._emptyTags={area:1, base:1,basefont:1,br:1,col:1,frame:1,hr:1,img:1,input:1,isindex:1,link:1,meta:1,param:1,embed:1};g.reWhitespace=/^\s*$/;g.prototype.dom=null;g.prototype.reset=function(){this.dom=[];this._done=false;this._tagStack=[];this._tagStack.last=function(){return this.length?this[this.length-1]:null}};g.prototype.done=function(){this._done=true;this.handleCallback(null)};g.prototype.writeTag=function(a){this.handleElement(a)};g.prototype.writeText=function(a){if(this._options.ignoreWhitespace)if(g.reWhitespace.test(a.data))return; this.handleElement(a)};g.prototype.writeComment=function(a){this.handleElement(a)};g.prototype.writeDirective=function(a){this.handleElement(a)};g.prototype.error=function(a){this.handleCallback(a)};g.prototype._options=null;g.prototype._callback=null;g.prototype._done=false;g.prototype._tagStack=null;g.prototype.handleCallback=function(a){if(typeof this._callback!="function")if(a)throw a;else return;this._callback(a,this.dom)};g.prototype.handleElement=function(a){this._done&&this.handleCallback(Error("Writing to the handler after done() called is not allowed without a reset()")); if(!this._options.verbose){delete a.raw;if(a.type=="tag"||a.type=="script"||a.type=="style")delete a.data}if(this._tagStack.last())if(a.type!=d.Text&&a.type!=d.Comment&&a.type!=d.Directive)if(a.name.charAt(0)=="/"){a=a.name.substring(1);if(!this._options.enforceEmptyTags||!g._emptyTags[a]){for(var c=this._tagStack.length-1;c>-1&&this._tagStack[c--].name!=a;);if(c>-1||this._tagStack[0].name==a)for(;c=0&&j.length>=h)return j;if(b&&c.children)c=c.children;else if(c instanceof Array)c=c;else return j;for(m=0;m=0&&j.length>=h)break}return j},getElementById:function(a,c,b){a=f.getElements({id:a},c,b,1);return a.length?a[0]:null},getElementsByTagName:function(a,c,b,h){return f.getElements({tag_name:a},c,b,h)},getElementsByTagType:function(a, c,b,h){return f.getElements({tag_type:a},c,b,h)}};exports.Parser=e;exports.DefaultHandler=g;exports.RssHandler=n;exports.ElementType=d;exports.DomUtils=f})(); \ No newline at end of file diff --git a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/package.json b/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/package.json deleted file mode 100644 index ced4c0a..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/package.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "htmlparser" - , "description": "Forgiving HTML/XML/RSS Parser in JS for *both* Node and Browsers" - , "version": "1.6.2" - , "author": "Chris Winberry " - , "contributors": [] - , "repository": { - "type": "git" - , "url": "git://github.com/tautologistics/node-htmlparser.git" - } - , "bugs": { - "mail": "chris@winberry.net" - , "web": "http://github.com/tautologistics/node-htmlparser/issues" - } - , "os": [ "linux", "darwin", "freebsd" ] - , "directories": { "lib": "./lib/" } - , "main": "./lib/node-htmlparser" - , "engines": { "node": ">=0.1.33" } - , "licenses": [{ - "type": "MIT" - , "url": "http://github.com/tautologistics/node-htmlparser/raw/master/LICENSE" - }] -} diff --git a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/profile.js b/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/profile.js deleted file mode 100644 index c5a474e..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/profile.js +++ /dev/null @@ -1,63 +0,0 @@ -//node --prof --prof_auto profile.js -//deps/v8/tools/mac-tick-processor v8.log -var sys = require("sys"); -var fs = require("fs"); -var http = require("http"); -var htmlparser = require("./node-htmlparser"); -var libxml = require('./libxmljs'); - -var testNHP = true; //Should node-htmlparser be exercised? -var testLXJS = true; //Should libxmljs be exercised? -var testIterations = 100; //Number of test loops to run - -var testHost = "nodejs.org"; //Host to fetch test HTML from -var testPort = 80; //Port on host to fetch test HTML from -var testPath = "/api.html"; //Path on host to fetch HTML from - -function getMillisecs () { - return((new Date()).getTime()); -} - -function timeExecutions (loops, func) { - var start = getMillisecs(); - - while (loops--) - func(); - - return(getMillisecs() - start); -} - -var html = ""; -http.createClient(testPort, testHost) - .request("GET", testPath, { host: testHost }) - .addListener("response", function (response) { - if (response.statusCode == "200") { - response.setEncoding("utf8"); - response.addListener("data", function (chunk) { - html += chunk; - }).addListener("end", function() { - var timeNodeHtmlParser = !testNHP ? 0 : timeExecutions(testIterations, function () { - var handler = new htmlparser.DefaultHandler(function(err, dom) { - if (err) - sys.debug("Error: " + err); - }); - var parser = new htmlparser.Parser(handler); - parser.parseComplete(html); - }) - - var timeLibXmlJs = !testLXJS ? 0 : timeExecutions(testIterations, function () { - var dom = libxml.parseHtmlString(html); - }) - - if (testNHP) - sys.debug("NodeHtmlParser: " + timeNodeHtmlParser); - if (testLXJS) - sys.debug("LibXmlJs: " + timeLibXmlJs); - if (testNHP && testLXJS) - sys.debug("Difference: " + ((timeNodeHtmlParser - timeLibXmlJs) / timeLibXmlJs) * 100); - }); - } - else - sys.debug("Error: got response status " + response.statusCode); - }) - .end(); diff --git a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/runtests.html b/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/runtests.html deleted file mode 100644 index 3543adc..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/runtests.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - Node.js HTML Parser - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/runtests.js b/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/runtests.js deleted file mode 100644 index c59393c..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/runtests.js +++ /dev/null @@ -1,75 +0,0 @@ -/*********************************************** -Copyright 2010, Chris Winberry . All rights reserved. -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 sys = require("sys"); -var fs = require("fs"); -var htmlparser = require("./lib/node-htmlparser"); - -var testFolder = "./tests"; -var chunkSize = 5; - -var testFiles = fs.readdirSync(testFolder); -var testCount = 0; -var failedCount = 0; -for (var i in testFiles) { - testCount++; - var fileParts = testFiles[i].split("."); - fileParts.pop(); - var moduleName = fileParts.join("."); - var test = require(testFolder + "/" + moduleName); - var handlerCallback = function handlerCallback (error) { - if (error) - sys.puts("Handler error: " + error); - } - var handler = (test.type == "rss") ? - new htmlparser.RssHandler(handlerCallback, test.options) - : - new htmlparser.DefaultHandler(handlerCallback, test.options) - ; - var parser = new htmlparser.Parser(handler); - parser.parseComplete(test.html); - var resultComplete = handler.dom; - var chunkPos = 0; - parser.reset(); - while (chunkPos < test.html.length) { - parser.parseChunk(test.html.substring(chunkPos, chunkPos + chunkSize)); - chunkPos += chunkSize; - } - parser.done(); - var resultChunk = handler.dom; - var testResult = - sys.inspect(resultComplete, false, null) === sys.inspect(test.expected, false, null) - && - sys.inspect(resultChunk, false, null) === sys.inspect(test.expected, false, null) - ; - sys.puts("[" + test.name + "\]: " + (testResult ? "passed" : "FAILED")); - if (!testResult) { - failedCount++; - sys.puts("== Complete =="); - sys.puts(sys.inspect(resultComplete, false, null)); - sys.puts("== Chunked =="); - sys.puts(sys.inspect(resultChunk, false, null)); - sys.puts("== Expected =="); - sys.puts(sys.inspect(test.expected, false, null)); - } -} -sys.puts("Total tests: " + testCount); -sys.puts("Failed tests: " + failedCount); diff --git a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/runtests.min.html b/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/runtests.min.html deleted file mode 100644 index 2ec9e8f..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/runtests.min.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - Node.js HTML Parser - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/runtests.min.js b/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/runtests.min.js deleted file mode 100644 index d32c3aa..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/runtests.min.js +++ /dev/null @@ -1,75 +0,0 @@ -/*********************************************** -Copyright 2010, Chris Winberry . All rights reserved. -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 sys = require("sys"); -var fs = require("fs"); -var htmlparser = require("./lib/node-htmlparser.min"); - -var testFolder = "./tests"; -var chunkSize = 5; - -var testFiles = fs.readdirSync(testFolder); -var testCount = 0; -var failedCount = 0; -for (var i in testFiles) { - testCount++; - var fileParts = testFiles[i].split("."); - fileParts.pop(); - var moduleName = fileParts.join("."); - var test = require(testFolder + "/" + moduleName); - var handlerCallback = function handlerCallback (error) { - if (error) - sys.puts("Handler error: " + error); - } - var handler = (test.type == "rss") ? - new htmlparser.RssHandler(handlerCallback, test.options) - : - new htmlparser.DefaultHandler(handlerCallback, test.options) - ; - var parser = new htmlparser.Parser(handler); - parser.parseComplete(test.html); - var resultComplete = handler.dom; - var chunkPos = 0; - parser.reset(); - while (chunkPos < test.html.length) { - parser.parseChunk(test.html.substring(chunkPos, chunkPos + chunkSize)); - chunkPos += chunkSize; - } - parser.done(); - var resultChunk = handler.dom; - var testResult = - sys.inspect(resultComplete, false, null) === sys.inspect(test.expected, false, null) - && - sys.inspect(resultChunk, false, null) === sys.inspect(test.expected, false, null) - ; - sys.puts("[" + test.name + "\]: " + (testResult ? "passed" : "FAILED")); - if (!testResult) { - failedCount++; - sys.puts("== Complete =="); - sys.puts(sys.inspect(resultComplete, false, null)); - sys.puts("== Chunked =="); - sys.puts(sys.inspect(resultChunk, false, null)); - sys.puts("== Expected =="); - sys.puts(sys.inspect(test.expected, false, null)); - } -} -sys.puts("Total tests: " + testCount); -sys.puts("Failed tests: " + failedCount); diff --git a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/snippet.js b/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/snippet.js deleted file mode 100644 index 2f54b36..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/snippet.js +++ /dev/null @@ -1,15 +0,0 @@ -//node --prof --prof_auto profile.js -//deps/v8/tools/mac-tick-processor v8.log -var sys = require("sys"); -var htmlparser = require("./node-htmlparser"); - -var html = "text"; - -var handler = new htmlparser.DefaultHandler(function(err, dom) { - if (err) - sys.debug("Error: " + err); - else - sys.debug(sys.inspect(dom, false, null)); -}, { enforceEmptyTags: true }); -var parser = new htmlparser.Parser(handler); -parser.parseComplete(html); diff --git a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/01-basic.js b/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/01-basic.js deleted file mode 100644 index 57de7dc..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/01-basic.js +++ /dev/null @@ -1,57 +0,0 @@ -(function () { - -function RunningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!RunningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - if (!this.Tautologistics.NodeHtmlParser) - this.Tautologistics.NodeHtmlParser = {}; - if (!this.Tautologistics.NodeHtmlParser.Tests) - this.Tautologistics.NodeHtmlParser.Tests = []; - exports = {}; - this.Tautologistics.NodeHtmlParser.Tests.push(exports); -} - -exports.name = "Basic test"; -exports.html = "The TitleHello world"; -exports.expected = - [ { raw: 'html' - , data: 'html' - , type: 'tag' - , name: 'html' - , children: - [ { raw: 'title' - , data: 'title' - , type: 'tag' - , name: 'title' - , children: [ { raw: 'The Title', data: 'The Title', type: 'text' } ] - } - , { raw: 'body' - , data: 'body' - , type: 'tag' - , name: 'body' - , children: - [ { raw: 'Hello world' - , data: 'Hello world' - , type: 'text' - } - ] - } - ] - } - ]; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/02-single_tag_1.js b/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/02-single_tag_1.js deleted file mode 100644 index 8af04d9..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/02-single_tag_1.js +++ /dev/null @@ -1,35 +0,0 @@ -(function () { - -function RunningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!RunningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - if (!this.Tautologistics.NodeHtmlParser) - this.Tautologistics.NodeHtmlParser = {}; - if (!this.Tautologistics.NodeHtmlParser.Tests) - this.Tautologistics.NodeHtmlParser.Tests = []; - exports = {}; - this.Tautologistics.NodeHtmlParser.Tests.push(exports); -} - -exports.name = "Single Tag 1"; -exports.html = "
    text
    "; -exports.expected = - [ { raw: 'br', data: 'br', type: 'tag', name: 'br' } - , { raw: 'text', data: 'text', type: 'text' } - ]; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/03-single_tag_2.js b/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/03-single_tag_2.js deleted file mode 100644 index beae642..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/03-single_tag_2.js +++ /dev/null @@ -1,36 +0,0 @@ -(function () { - -function RunningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!RunningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - if (!this.Tautologistics.NodeHtmlParser) - this.Tautologistics.NodeHtmlParser = {}; - if (!this.Tautologistics.NodeHtmlParser.Tests) - this.Tautologistics.NodeHtmlParser.Tests = []; - exports = {}; - this.Tautologistics.NodeHtmlParser.Tests.push(exports); -} - -exports.name = "Single Tag 2"; -exports.html = "
    text
    "; -exports.expected = - [ { raw: 'br', data: 'br', type: 'tag', name: 'br' } - , { raw: 'text', data: 'text', type: 'text' } - , { raw: 'br', data: 'br', type: 'tag', name: 'br' } - ]; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/04-unescaped_in_script.js b/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/04-unescaped_in_script.js deleted file mode 100644 index 1a23385..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/04-unescaped_in_script.js +++ /dev/null @@ -1,52 +0,0 @@ -(function () { - -function RunningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!RunningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - if (!this.Tautologistics.NodeHtmlParser) - this.Tautologistics.NodeHtmlParser = {}; - if (!this.Tautologistics.NodeHtmlParser.Tests) - this.Tautologistics.NodeHtmlParser.Tests = []; - exports = {}; - this.Tautologistics.NodeHtmlParser.Tests.push(exports); -} - -exports.name = "Unescaped chars in script"; -exports.html = ""; -exports.expected = -[ { raw: 'head' - , data: 'head' - , type: 'tag' - , name: 'head' - , children: - [ { raw: 'script language="Javascript"' - , data: 'script language="Javascript"' - , type: 'script' - , name: 'script' - , attribs: { language: 'Javascript' } - , children: - [ { raw: 'var foo = ""; alert(2 > foo); var baz = 10 << 2; var zip = 10 >> 1; var yap = \"<<>>>><<\";' - , data: 'var foo = ""; alert(2 > foo); var baz = 10 << 2; var zip = 10 >> 1; var yap = \"<<>>>><<\";' - , type: 'text' - } - ] - } - ] - } -]; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/05-tags_in_comment.js b/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/05-tags_in_comment.js deleted file mode 100644 index 79fdd8c..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/05-tags_in_comment.js +++ /dev/null @@ -1,44 +0,0 @@ -(function () { - -function RunningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!RunningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - if (!this.Tautologistics.NodeHtmlParser) - this.Tautologistics.NodeHtmlParser = {}; - if (!this.Tautologistics.NodeHtmlParser.Tests) - this.Tautologistics.NodeHtmlParser.Tests = []; - exports = {}; - this.Tautologistics.NodeHtmlParser.Tests.push(exports); -} - -exports.name = "Special char in comment"; -exports.html = ""; -exports.expected = -[ { raw: 'head' - , data: 'head' - , type: 'tag' - , name: 'head' - , children: - [ { raw: ' commented out tags Test' - , data: ' commented out tags Test' - , type: 'comment' - } - ] - } -]; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/06-comment_in_script.js b/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/06-comment_in_script.js deleted file mode 100644 index 7737f38..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/06-comment_in_script.js +++ /dev/null @@ -1,44 +0,0 @@ -(function () { - -function RunningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!RunningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - if (!this.Tautologistics.NodeHtmlParser) - this.Tautologistics.NodeHtmlParser = {}; - if (!this.Tautologistics.NodeHtmlParser.Tests) - this.Tautologistics.NodeHtmlParser.Tests = []; - exports = {}; - this.Tautologistics.NodeHtmlParser.Tests.push(exports); -} - -exports.name = "Script source in comment"; -exports.html = ""; -exports.expected = -[ { raw: 'script' - , data: 'script' - , type: 'script' - , name: 'script' - , children: - [ { raw: 'var foo = 1;' - , data: 'var foo = 1;' - , type: 'comment' - } - ] - } -]; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/07-unescaped_in_style.js b/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/07-unescaped_in_style.js deleted file mode 100644 index fe4efad..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/07-unescaped_in_style.js +++ /dev/null @@ -1,45 +0,0 @@ -(function () { - -function RunningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!RunningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - if (!this.Tautologistics.NodeHtmlParser) - this.Tautologistics.NodeHtmlParser = {}; - if (!this.Tautologistics.NodeHtmlParser.Tests) - this.Tautologistics.NodeHtmlParser.Tests = []; - exports = {}; - this.Tautologistics.NodeHtmlParser.Tests.push(exports); -} - -exports.name = "Unescaped chars in style"; -exports.html = ""; -exports.expected = -[ { raw: 'style type="text/css"' - , data: 'style type="text/css"' - , type: 'style' - , name: 'style' - , attribs: { type: 'text/css' } - , children: - [ { raw: '\n body > p\n { font-weight: bold; }' - , data: '\n body > p\n { font-weight: bold; }' - , type: 'text' - } - ] - } -]; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/08-extra_spaces_in_tag.js b/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/08-extra_spaces_in_tag.js deleted file mode 100644 index 84192af..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/08-extra_spaces_in_tag.js +++ /dev/null @@ -1,45 +0,0 @@ -(function () { - -function RunningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!RunningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - if (!this.Tautologistics.NodeHtmlParser) - this.Tautologistics.NodeHtmlParser = {}; - if (!this.Tautologistics.NodeHtmlParser.Tests) - this.Tautologistics.NodeHtmlParser.Tests = []; - exports = {}; - this.Tautologistics.NodeHtmlParser.Tests.push(exports); -} - -exports.name = "Extra spaces in tag"; -exports.html = "<\n font \n size='14' \n>the text<\n / \nfont \n>"; -exports.expected = -[ { raw: '\n font \n size=\'14\' \n' - , data: 'font \n size=\'14\'' - , type: 'tag' - , name: 'font' - , attribs: { size: '14' } - , children: - [ { raw: 'the text' - , data: 'the text' - , type: 'text' - } - ] - } -]; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/09-unquoted_attrib.js b/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/09-unquoted_attrib.js deleted file mode 100644 index 3ad54e6..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/09-unquoted_attrib.js +++ /dev/null @@ -1,45 +0,0 @@ -(function () { - -function RunningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!RunningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - if (!this.Tautologistics.NodeHtmlParser) - this.Tautologistics.NodeHtmlParser = {}; - if (!this.Tautologistics.NodeHtmlParser.Tests) - this.Tautologistics.NodeHtmlParser.Tests = []; - exports = {}; - this.Tautologistics.NodeHtmlParser.Tests.push(exports); -} - -exports.name = "Unquoted attributes"; -exports.html = "the text"; -exports.expected = -[ { raw: 'font size= 14' - , data: 'font size= 14' - , type: 'tag' - , name: 'font' - , attribs: { size: '14' } - , children: - [ { raw: 'the text' - , data: 'the text' - , type: 'text' - } - ] - } -]; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/10-singular_attribute.js b/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/10-singular_attribute.js deleted file mode 100644 index 37897dc..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/pulls/node-htmlparser/tests/10-singular_attribute.js +++ /dev/null @@ -1,39 +0,0 @@ -(function () { - -function RunningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!RunningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - if (!this.Tautologistics.NodeHtmlParser) - this.Tautologistics.NodeHtmlParser = {}; - if (!this.Tautologistics.NodeHtmlParser.Tests) - this.Tautologistics.NodeHtmlParser.Tests = []; - exports = {}; - this.Tautologistics.NodeHtmlParser.Tests.push(exports); -} - -exports.name = "Singular attribute"; -exports.html = "
    - - - - - - diff --git a/node_modules/jsdom/node_modules/htmlparser/testdata/.tmp_trackerchecker.html.76922~ b/node_modules/jsdom/node_modules/htmlparser/testdata/.tmp_trackerchecker.html.76922~ deleted file mode 100644 index b499243..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/testdata/.tmp_trackerchecker.html.76922~ +++ /dev/null @@ -1,10 +0,0 @@ - - - - -Insert title here - - - - - \ No newline at end of file diff --git a/node_modules/jsdom/node_modules/htmlparser/testdata/.tmp_trackerchecker.html.80022~ b/node_modules/jsdom/node_modules/htmlparser/testdata/.tmp_trackerchecker.html.80022~ deleted file mode 100644 index e000284..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/testdata/.tmp_trackerchecker.html.80022~ +++ /dev/null @@ -1,2948 +0,0 @@ - - - -www.trackerchecker.com - We check your trackers - - - - - - -
    - - - - - - - -
    Home || Add a tracker || Latest trackers
    -
    - - -
    -follow us on Twitter
    -Follow trackerchecker on Twitter --> @trackerchecker. -
    - -
    - - -
    -
    - TrackerList
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     TrackerNameHistoryLastCheckedStatus
    1337x.orgview history2010-03-29 03:56:03Open
    420project.orgview history2010-03-29 04:28:13Closed
    acehd.netview history2010-03-29 04:31:58Closed
    acetorrents.netview history2010-03-29 03:59:08Open
    adult-cinema-network.netview history2010-03-29 04:00:08Open
    all4nothin.netview history2010-03-29 04:01:08Open
    allgirltorrents.comview history2010-03-29 03:50:57Closed
    allotracker.comview history2010-03-29 03:58:09Open
    appz.bitshock.orgview history2010-03-29 03:57:12Open
    appzuniverse.orgview history2010-03-29 04:18:04Closed
    arabfilms.orgview history2010-03-29 04:08:50Closed
    arabseries.orgview history2010-03-29 03:59:39Closed
    araditracker.comview history2010-03-29 04:22:25Closed
    arena-tr.comview history2010-03-29 04:12:10Closed
    arenabg.comview history2010-03-29 03:51:00Closed
    artofmisdirection.comview history2010-03-29 04:01:04Closed
    asiandvdclub.orgview history2010-03-29 04:18:15Open
    at-tracker.orgview history2010-03-29 04:15:08Offline
    atomico-torrent.comview history2010-03-29 03:56:05Closed
    audionews.ruview history2010-03-29 04:01:02Closed
    audiotracer.comview history2010-03-29 04:05:08Closed
    audiozonetorrents.comview history2010-03-29 03:56:09Open
    avatarbg.infoview history2010-03-29 03:49:14Closed
    awesome-hd.comview history2010-03-29 03:51:07Closed
    awesome-hd.netview history2010-03-29 03:55:09Closed
    baltracker.netview history2010-03-29 04:15:09Open
    bestmmatorrents.comview history2010-03-29 04:15:04Closed
    bestshare.roview history2010-03-29 03:56:11Closed
    bestxvid.orgview history2010-03-29 03:50:57Closed
    bit-hdtv.comview history2010-03-29 03:58:10Closed
    bitaddict.orgview history2010-03-29 03:50:45Closed
    bitchil.comview history2010-03-29 03:56:09Open
    bitflamers.comview history2010-03-29 04:01:12Closed
    bitgamer.comview history2010-03-29 04:12:08Closed
    bithq.orgview history2010-03-29 03:58:08Open
    bithumen.ath.cxview history2010-03-29 04:22:20Closed
    bitlove.huview history2010-03-29 04:25:10Closed
    bitme.orgview history2010-03-29 04:12:06Closed
    bitmetv.orgview history2010-03-29 03:49:16Closed
    bitmusic.huview history2010-03-29 03:58:11Closed
    bitnation.comview history2010-03-29 03:59:08Closed
    bitseduce.comview history2010-03-29 04:05:08Closed
    bitseek.orgview history2010-03-29 04:28:05Closed
    bitseek.orgview history2010-03-29 04:18:05Closed
    bitshock.orgview history2010-03-29 04:00:03Open
    bitshock.orgview history2010-03-29 03:55:14Closed
    bitsoup.orgview history2010-03-29 03:59:07Open
    bitSpyder.netview history2010-03-29 03:56:06Closed
    bittorrents.roview history2010-03-29 04:00:14Closed
    bitturk.netview history2010-03-29 03:56:05Closed
    biztorrents.comview history2010-03-29 04:15:07Open
    blackcats-games.netview history2010-03-29 03:58:06Closed
    blades-heaven.comview history2010-03-29 04:08:56Open
    blue-bytez.comview history2010-03-29 04:32:01Closed
    blue-whitegt.comview history2010-03-29 04:28:13Closed
    bmtorrents.netview history2010-03-29 03:58:10Closed
    bootytape.comview history2010-03-29 03:58:02Open
    bootytorrents.comview history2010-03-29 03:57:07Closed
    boxtorrents.comview history2010-03-29 04:08:59Closed
    bt.avistaz.comview history2010-03-29 04:15:08Closed
    bt.davka.infoview history2010-03-29 04:08:50Open
    bt.xbox-sky.ccview history2010-03-29 03:49:08Closed
    bt.xbox-sky.comview history2010-03-29 03:50:42Closed
    btgigs.infoview history2010-03-29 04:18:15Closed
    bwtorrents.comview history2010-03-29 03:56:10Closed
    bytelist.orgview history2010-03-29 04:05:07Offline
    cartoonchaos.orgview history2010-03-29 04:18:15Closed
    ccfbits.orgview history2010-03-29 04:22:19Closed
    chdbits.orgview history2010-03-29 04:15:11Closed
    cheggit.net/view history2010-03-29 04:09:00Open
    chilebt.comview history2010-03-29 04:22:11Closed
    christiantorrents.comview history2010-03-29 04:28:13Closed
    chronictracker.comview history2010-03-29 04:01:13Closed
    cinema-obscura.comview history2010-03-29 03:57:06Closed
    cinemageddon.orgview history2010-03-29 04:22:27Closed
    cinematik.netview history2010-03-29 03:57:11Closed
    cleanvobs.orgview history2010-03-29 03:49:43Closed
    colombo-bt.orgview history2010-03-29 03:50:55Closed
    contego.wsview history2010-03-29 04:22:12Closed
    crazytorrent.euview history2010-03-29 04:08:49Closed
    czone.roview history2010-03-29 04:24:09Closed
    danger.lvview history2010-03-29 03:55:15Closed
    demonoid.comview history2010-03-29 04:18:15Closed
    devilwolfs.comview history2010-03-29 04:31:55Closed
    diablotorrent.huview history2010-03-29 03:56:01Closed
    dididave.comview history2010-03-29 04:00:03Closed
    digitalhive.orgview history2010-03-29 03:50:44Closed
    dimeadozen.orgview history2010-03-29 04:05:06Open
    dnbtracker.orgview history2010-03-29 04:01:11Open
    docs.torrents.roview history2010-03-29 04:01:14Closed
    dvdseed.orgview history2010-03-29 04:32:01Closed
    dvdtreasure.euview history2010-03-29 04:05:04Closed
    ebookvortex.comview history2010-03-29 04:05:07Open
    eclipsetorrents.orgview history2010-03-29 04:12:09Closed
    egytorrent.comview history2010-03-29 03:49:06Closed
    egytorrent.comview history2010-03-29 04:01:05Closed
    elbitz.netview history2010-03-29 04:18:13Closed
    elektronik.roview history2010-03-29 03:55:02Closed
    empornium.usview history2010-03-29 03:57:07Open
    eroticsource.plview history2010-03-29 04:28:19Closed
    estrenoslatinos.comview history2010-03-29 03:49:10Closed
    ethor.netview history2010-03-29 03:51:08Closed
    evopt.orgview history2010-03-29 04:15:06Closed
    Exigomusicview history2010-03-29 03:50:45Closed
    extremebits.orgview history2010-03-29 04:28:05Closed
    extremeshare.orgview history2010-03-29 03:59:03Open
    faplife.netview history2010-03-29 03:50:46Closed
    feedthe.netview history2010-03-29 04:22:09Closed
    filebits.orgview history2010-03-29 03:57:08Closed
    filelist.orgview history2010-03-29 04:22:25Closed
    filelist.roview history2010-03-29 03:56:09Closed
    filemp3.orgview history2010-03-29 03:50:46Closed
    fileporn.orgview history2010-03-29 03:51:10Closed
    flashtorrents.com.arview history2010-03-29 03:59:40Closed
    Free The Scene (FTS)view history2010-03-29 04:05:04Closed
    Fresh On TV (TvT)view history2010-03-29 03:59:37Open
    frztracker.sytes.netview history2010-03-29 04:25:08Closed
    fst.omnilounge.co.ukview history2010-03-29 04:08:50Closed
    fullcontactzone.comview history2010-03-29 03:56:09Closed
    gamecrook.comview history2010-03-29 04:18:05Closed
    gbvnet.roview history2010-03-29 04:25:08Open
    gettorrents.orgview history2010-03-29 04:11:06Closed
    gfxnews.ruview history2010-03-29 04:12:07Closed
    gigatorrents.wsview history2010-03-29 03:57:05Closed
    globus-tracker.comview history2010-03-29 04:30:51Closed
    goem.orgview history2010-03-29 03:56:07Closed
    gormogon.comview history2010-03-29 04:25:05Open
    greek-tracker.comview history2010-03-29 03:51:06Closed
    grimetorrent.comview history2010-03-29 04:28:15Closed
    grtorrent.comview history2010-03-29 04:12:08Closed
    guiks.netview history2010-03-29 04:05:04Closed
    h264torrents.comview history2010-03-29 03:57:01Closed
    h33t.comview history2010-03-29 03:51:06Open
    hd-bits.roview history2010-03-29 04:18:09Closed
    hd-torrents.orgview history2010-03-29 04:05:05Closed
    hdbits.orgview history2010-03-29 04:12:07Closed
    hdchina.orgview history2010-03-29 03:59:37Closed
    hdfrench.comview history2010-03-29 04:09:01Closed
    hdme.euview history2010-03-29 03:55:09Open
    hdpre.comview history2010-03-29 04:12:09Closed
    hdsource.bizview history2010-03-29 03:49:13Closed
    hdstar.orgview history2010-03-29 03:51:02Closed
    hdvnbits.orgview history2010-03-29 03:56:03Closed
    heaventracker.orgview history2010-03-29 03:57:02Closed
    hermeticos.orgview history2010-03-29 04:25:12Closed
    horrorcharnel.kicks-ass.orgview history2010-03-29 03:58:05Closed
    hungercity.orgview history2010-03-29 04:31:05Open
    ifyounotknow.comview history2010-03-29 03:58:07Closed
    ilovetorrents.comview history2010-03-29 03:56:06Open
    indeep.bizview history2010-03-29 03:56:08Closed
    indietorrents.comview history2010-03-29 04:00:14Closed
    iplay.roview history2010-03-29 03:59:03Closed
    ipodnova.tvview history2010-03-29 04:04:12Closed
    iptorrents.comview history2010-03-29 03:51:06Closed
    joompalace.comview history2010-03-29 03:57:04Closed
    karagarga.netview history2010-03-29 04:17:07Closed
    killawaves.netview history2010-03-29 04:05:05Closed
    kinozal.wsview history2010-03-29 04:28:16Open
    kludd.comview history2010-03-29 03:55:11Closed
    lasttorrents.orgview history2010-03-29 04:32:02Open
    leecherslair.comview history2010-03-29 04:18:08Closed
    libble.comview history2010-03-29 04:25:11Closed
    libitina.netview history2010-03-29 04:18:11Closed
    linuxmafia.netview history2010-03-29 04:22:07Offline
    linuxtracker.orgview history2010-03-29 04:22:24Closed
    lostfilm.tvview history2010-03-29 04:00:07Open
    magiciantorrents.comview history2010-03-29 03:55:14Closed
    masterstb.comview history2010-03-29 03:56:12Closed
    mazetorrents.netview history2010-03-29 04:17:07Offline
    medioteka.comview history2010-03-29 04:17:07Closed
    mega-bits.comview history2010-03-29 03:51:52Closed
    mentol.roview history2010-03-29 04:12:04Closed
    metal.iplay.roview history2010-03-29 04:18:03Closed
    metalbits.orgview history2010-03-29 04:00:02Closed
    midnight-scene.comview history2010-03-29 03:58:06Closed
    midnight-torrents.comview history2010-03-29 04:31:05Closed
    mma-central.org.ukview history2010-03-29 03:56:05Closed
    mma-tracker.netview history2010-03-29 03:50:43Closed
    mp3nerds.orgview history2010-03-29 04:18:07Closed
    mucis-vid.comview history2010-03-29 03:56:06Closed
    musicplace.lvview history2010-03-29 04:05:04Closed
    mytorrent.tvview history2010-03-29 03:57:07Closed
    norbits.netview history2010-03-29 04:12:05Closed
    nordic-t.orgview history2010-03-29 03:55:02Closed
    nordicbits.orgview history2010-03-29 04:18:07Offline
    novaro.infoview history2010-03-29 03:49:16Closed
    novaro.infoview history2010-03-29 03:55:02Closed
    noviteti.comview history2010-03-29 04:15:05Offline
    ntorrents.netview history2010-03-29 03:59:08Closed
    nutorrent.comview history2010-03-29 04:25:12Open
    opennetwork.roview history2010-03-29 04:08:49Closed
    overtopropetorrents.comview history2010-03-29 04:00:14Closed
    ozone-torrents.orgview history2010-03-29 04:32:00Closed
    Pedros btmusicview history2010-03-29 04:08:54Closed
    pianosheets.orgview history2010-03-29 03:49:17Closed
    pinkytorrents.comview history2010-03-29 03:56:08Open
    piranha.excom.usview history2010-03-29 04:08:07Open
    Pirate The Net (PtN)view history2010-03-29 03:49:15Closed
    piratebits.orgview history2010-03-29 04:09:01Closed
    piratefiles.seview history2010-03-29 04:25:05Closed
    piratetorrents.nuview history2010-03-29 03:56:04Closed
    pisexy.orgview history2010-03-29 04:01:06Closed
    polishbytes.netview history2010-03-29 04:31:55Open
    polishtracker.orgview history2010-03-29 03:56:09Closed
    pornbay.orgview history2010-03-29 03:57:12Closed
    PotUKview history2010-03-29 04:08:54Closed
    powerscene.orgview history2010-03-29 03:57:11Closed
    pretome.netview history2010-03-29 04:32:01Closed
    proaudiotorrents.orgview history2010-03-29 04:15:14Closed
    psytorrents.infoview history2010-03-29 03:49:08Closed
    ptfiles.orgview history2010-03-29 04:18:09Closed
    punkhc.dyndns.orgview history2010-03-29 04:01:09Closed
    puretna.comview history2010-03-29 04:05:06Open
    pussytorrents.orgview history2010-03-29 03:52:02Open
    rapthe.netview history2010-03-29 04:12:09Closed
    rarbg.comview history2010-03-29 03:58:11Open
    reload-paradise.netview history2010-03-29 04:00:07Closed
    revolutiontt.netview history2010-03-29 03:56:07Closed
    rmvbustersview history2010-03-29 04:15:08Open
    rmvbusters.plview history2010-03-29 03:56:05Open
    scaliwags.orgview history2010-03-29 03:59:04Closed
    scene-gold.infoview history2010-03-29 04:17:08Offline
    scene-inspired.comview history2010-03-29 03:51:07Open
    sceneaccess.orgview history2010-03-29 03:55:09Closed
    scenebytes.clview history2010-03-29 04:22:20Closed
    scenehd.orgview history2010-03-29 04:28:09Closed
    sceneleech.orgview history2010-03-29 03:57:05Closed
    SceneLife (ScL)view history2010-03-29 04:00:08Closed
    scenetorrents.orgview history2010-03-29 04:12:05Closed
    scenetuga.orgview history2010-03-29 03:51:04Closed
    sciencehd.netview history2010-03-29 04:00:15Closed
    scifitorrents.netview history2010-03-29 03:56:10Closed
    secret-cinema.netview history2010-03-29 04:28:13Closed
    seedgames.orgview history2010-03-29 04:18:16Closed
    seedmore.orgview history2010-03-29 03:56:11Closed
    sharetorrents.plview history2010-03-29 04:01:13Closed
    sharing-torrents.comview history2010-03-29 03:58:14Closed
    slosoul.netview history2010-03-29 03:51:00Closed
    snowtigers.netview history2010-03-29 03:49:43Closed
    softmp3.orgview history2010-03-29 04:18:02Closed
    softmupparna.netview history2010-03-29 04:31:05Closed
    sounddamage.comview history2010-03-29 03:49:14Closed
    spanishtracker.comview history2010-03-29 04:25:07Open
    spank-d-monkey.comview history2010-03-29 04:17:09Closed
    special.pwtorrents.netview history2010-03-29 03:56:06Closed
    speed.cdview history2010-03-29 03:52:02Closed
    spiryt.ath.cxview history2010-03-29 04:12:07Closed
    sport-scene.netview history2010-03-29 03:55:15Closed
    sportbit.orgview history2010-03-29 04:25:08Closed
    sportleech.netview history2010-03-29 04:28:08Closed
    stmusic.orgview history2010-03-29 04:05:04Open
    supertorrents.orgview history2010-03-29 04:05:08Open
    swebits.orgview history2010-03-29 04:15:05Closed
    sweninjaz.orgview history2010-03-29 04:32:02Closed
    swep2p.orgview history2010-03-29 03:51:52Closed
    swepiracy.orgview history2010-03-29 04:05:07Open
    swetorrents.no-ip.orgview history2010-03-29 04:31:05Closed
    taiphimhd.comview history2010-03-29 03:55:07Closed
    tastetherainbow.wsview history2010-03-29 04:00:04Closed
    teamofgreekz.comview history2010-03-29 04:18:03Closed
    tehconnection.euview history2010-03-29 04:28:06Closed
    the-zomb.comview history2010-03-29 04:08:55Open
    thebox.bzview history2010-03-29 03:51:06Open
    thedvdclub.orgview history2010-03-29 04:25:07Open
    thegt.netview history2010-03-29 04:31:58Closed
    themixingbowl.orgview history2010-03-29 04:22:25Closed
    theoccult.bzview history2010-03-29 03:51:02Closed
    thepeerhub.comview history2010-03-29 04:00:12Open
    theplace.bzview history2010-03-29 04:08:56Closed
    thepokerbay.orgview history2010-03-29 03:59:37Open
    thevault.bzview history2010-03-29 03:59:39Closed
    titaniumtorrents.netview history2010-03-29 04:18:11Offline
    tmtorrents.orgview history2010-03-29 03:49:12Closed
    topbytes.netview history2010-03-29 03:49:08Closed
    topbytes.netview history2010-03-29 04:05:05Closed
    tophos.orgview history2010-03-29 03:58:09Closed
    torrent-damage.netview history2010-03-29 03:50:45Closed
    torrent.itview history2010-03-29 04:25:12Closed
    torrent411.comview history2010-03-29 04:15:08Open
    torrentbits.roview history2010-03-29 04:31:57Closed
    torrentbully.comview history2010-03-29 03:55:08Closed
    torrentdownloads.netview history2010-03-29 04:15:05Open
    torrentgaming.netview history2010-03-29 04:28:18Closed
    torrentgeeks.comview history2010-03-29 03:51:02Offline
    torrenthr.orgview history2010-03-29 04:21:10Open
    torrentkings.orgview history2010-03-29 03:49:05Closed
    torrentleech.orgview history2010-03-29 04:01:09Closed
    torrentseed.orgview history2010-03-29 03:56:10Closed
    torrentsforall.netview history2010-03-29 04:15:07Open
    torrentsmd.comview history2010-03-29 04:00:09Closed
    torrentvault.orgview history2010-03-29 03:49:12Closed
    torrentzilla.orgview history2010-03-29 03:57:04Open
    torrentzone.netview history2010-03-29 04:18:03Open
    totaltorrents.comview history2010-03-29 04:05:05Closed
    trancebits.comview history2010-03-29 04:25:09Closed
    trancebooster.netview history2010-03-29 04:05:03Closed
    trancetraffic.comview history2010-03-29 04:12:10Closed
    tri-tavern.comview history2010-03-29 04:17:07Closed
    tribalmixes.comview history2010-03-29 04:15:07Open
    tugaleech.comview history2010-03-29 03:59:05Closed
    tunebully.comview history2010-03-29 04:25:09Closed
    tv.torrents.roview history2010-03-29 03:58:06Closed
    tvtorrents.comview history2010-03-29 04:18:05Open
    ugstorrents.comview history2010-03-29 04:28:11Closed
    uknova.comview history2010-03-29 04:22:26Closed
    underground-gamer.comview history2010-03-29 04:17:07Open
    victorrent.netview history2010-03-29 04:01:09Closed
    vortexnetwork.orgview history2010-03-29 03:56:08Offline
    waffles.fmview history2010-03-29 03:56:11Closed
    wantedfiles.roview history2010-03-29 04:18:06Open
    warezbros.orgview history2010-03-29 04:08:59Closed
    what.cdview history2010-03-29 04:22:27Closed
    wild-bytes.orgview history2010-03-29 04:12:07Closed
    wolfbits.orgview history2010-03-29 04:22:07Closed
    worldboxingvideoarchive.comview history2010-03-29 04:05:06Open
    www.bt-pt.netview history2010-03-29 03:56:05Open
    www.llywot.comview history2010-03-29 03:59:38Closed
    xbitz.orgview history2010-03-29 04:18:14Open
    xider.huview history2010-03-29 04:05:02Open
    xtremespeeds.netview history2010-03-29 04:01:04Closed
    xtremewrestlingtorrents.netview history2010-03-29 03:51:05Closed
    xtremezone.roview history2010-03-29 03:58:08Closed
    yuwabits.netview history2010-03-29 04:05:07Open
    zanettetorrent.comview history2010-03-29 04:00:10Open
    zinebytes.orgview history2010-03-29 04:25:10Closed
    -
    -


    - - - -
    - - - - - - diff --git a/node_modules/jsdom/node_modules/htmlparser/testdata/.tmp_trackerchecker2.html.51378~ b/node_modules/jsdom/node_modules/htmlparser/testdata/.tmp_trackerchecker2.html.51378~ deleted file mode 100644 index e000284..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/testdata/.tmp_trackerchecker2.html.51378~ +++ /dev/null @@ -1,2948 +0,0 @@ - - - -www.trackerchecker.com - We check your trackers - - - - - - -
    - - - - - - - -
    Home || Add a tracker || Latest trackers
    -
    - - -
    -follow us on Twitter
    -Follow trackerchecker on Twitter --> @trackerchecker. -
    - -
    - - -
    -
    - TrackerList
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     TrackerNameHistoryLastCheckedStatus
    1337x.orgview history2010-03-29 03:56:03Open
    420project.orgview history2010-03-29 04:28:13Closed
    acehd.netview history2010-03-29 04:31:58Closed
    acetorrents.netview history2010-03-29 03:59:08Open
    adult-cinema-network.netview history2010-03-29 04:00:08Open
    all4nothin.netview history2010-03-29 04:01:08Open
    allgirltorrents.comview history2010-03-29 03:50:57Closed
    allotracker.comview history2010-03-29 03:58:09Open
    appz.bitshock.orgview history2010-03-29 03:57:12Open
    appzuniverse.orgview history2010-03-29 04:18:04Closed
    arabfilms.orgview history2010-03-29 04:08:50Closed
    arabseries.orgview history2010-03-29 03:59:39Closed
    araditracker.comview history2010-03-29 04:22:25Closed
    arena-tr.comview history2010-03-29 04:12:10Closed
    arenabg.comview history2010-03-29 03:51:00Closed
    artofmisdirection.comview history2010-03-29 04:01:04Closed
    asiandvdclub.orgview history2010-03-29 04:18:15Open
    at-tracker.orgview history2010-03-29 04:15:08Offline
    atomico-torrent.comview history2010-03-29 03:56:05Closed
    audionews.ruview history2010-03-29 04:01:02Closed
    audiotracer.comview history2010-03-29 04:05:08Closed
    audiozonetorrents.comview history2010-03-29 03:56:09Open
    avatarbg.infoview history2010-03-29 03:49:14Closed
    awesome-hd.comview history2010-03-29 03:51:07Closed
    awesome-hd.netview history2010-03-29 03:55:09Closed
    baltracker.netview history2010-03-29 04:15:09Open
    bestmmatorrents.comview history2010-03-29 04:15:04Closed
    bestshare.roview history2010-03-29 03:56:11Closed
    bestxvid.orgview history2010-03-29 03:50:57Closed
    bit-hdtv.comview history2010-03-29 03:58:10Closed
    bitaddict.orgview history2010-03-29 03:50:45Closed
    bitchil.comview history2010-03-29 03:56:09Open
    bitflamers.comview history2010-03-29 04:01:12Closed
    bitgamer.comview history2010-03-29 04:12:08Closed
    bithq.orgview history2010-03-29 03:58:08Open
    bithumen.ath.cxview history2010-03-29 04:22:20Closed
    bitlove.huview history2010-03-29 04:25:10Closed
    bitme.orgview history2010-03-29 04:12:06Closed
    bitmetv.orgview history2010-03-29 03:49:16Closed
    bitmusic.huview history2010-03-29 03:58:11Closed
    bitnation.comview history2010-03-29 03:59:08Closed
    bitseduce.comview history2010-03-29 04:05:08Closed
    bitseek.orgview history2010-03-29 04:28:05Closed
    bitseek.orgview history2010-03-29 04:18:05Closed
    bitshock.orgview history2010-03-29 04:00:03Open
    bitshock.orgview history2010-03-29 03:55:14Closed
    bitsoup.orgview history2010-03-29 03:59:07Open
    bitSpyder.netview history2010-03-29 03:56:06Closed
    bittorrents.roview history2010-03-29 04:00:14Closed
    bitturk.netview history2010-03-29 03:56:05Closed
    biztorrents.comview history2010-03-29 04:15:07Open
    blackcats-games.netview history2010-03-29 03:58:06Closed
    blades-heaven.comview history2010-03-29 04:08:56Open
    blue-bytez.comview history2010-03-29 04:32:01Closed
    blue-whitegt.comview history2010-03-29 04:28:13Closed
    bmtorrents.netview history2010-03-29 03:58:10Closed
    bootytape.comview history2010-03-29 03:58:02Open
    bootytorrents.comview history2010-03-29 03:57:07Closed
    boxtorrents.comview history2010-03-29 04:08:59Closed
    bt.avistaz.comview history2010-03-29 04:15:08Closed
    bt.davka.infoview history2010-03-29 04:08:50Open
    bt.xbox-sky.ccview history2010-03-29 03:49:08Closed
    bt.xbox-sky.comview history2010-03-29 03:50:42Closed
    btgigs.infoview history2010-03-29 04:18:15Closed
    bwtorrents.comview history2010-03-29 03:56:10Closed
    bytelist.orgview history2010-03-29 04:05:07Offline
    cartoonchaos.orgview history2010-03-29 04:18:15Closed
    ccfbits.orgview history2010-03-29 04:22:19Closed
    chdbits.orgview history2010-03-29 04:15:11Closed
    cheggit.net/view history2010-03-29 04:09:00Open
    chilebt.comview history2010-03-29 04:22:11Closed
    christiantorrents.comview history2010-03-29 04:28:13Closed
    chronictracker.comview history2010-03-29 04:01:13Closed
    cinema-obscura.comview history2010-03-29 03:57:06Closed
    cinemageddon.orgview history2010-03-29 04:22:27Closed
    cinematik.netview history2010-03-29 03:57:11Closed
    cleanvobs.orgview history2010-03-29 03:49:43Closed
    colombo-bt.orgview history2010-03-29 03:50:55Closed
    contego.wsview history2010-03-29 04:22:12Closed
    crazytorrent.euview history2010-03-29 04:08:49Closed
    czone.roview history2010-03-29 04:24:09Closed
    danger.lvview history2010-03-29 03:55:15Closed
    demonoid.comview history2010-03-29 04:18:15Closed
    devilwolfs.comview history2010-03-29 04:31:55Closed
    diablotorrent.huview history2010-03-29 03:56:01Closed
    dididave.comview history2010-03-29 04:00:03Closed
    digitalhive.orgview history2010-03-29 03:50:44Closed
    dimeadozen.orgview history2010-03-29 04:05:06Open
    dnbtracker.orgview history2010-03-29 04:01:11Open
    docs.torrents.roview history2010-03-29 04:01:14Closed
    dvdseed.orgview history2010-03-29 04:32:01Closed
    dvdtreasure.euview history2010-03-29 04:05:04Closed
    ebookvortex.comview history2010-03-29 04:05:07Open
    eclipsetorrents.orgview history2010-03-29 04:12:09Closed
    egytorrent.comview history2010-03-29 03:49:06Closed
    egytorrent.comview history2010-03-29 04:01:05Closed
    elbitz.netview history2010-03-29 04:18:13Closed
    elektronik.roview history2010-03-29 03:55:02Closed
    empornium.usview history2010-03-29 03:57:07Open
    eroticsource.plview history2010-03-29 04:28:19Closed
    estrenoslatinos.comview history2010-03-29 03:49:10Closed
    ethor.netview history2010-03-29 03:51:08Closed
    evopt.orgview history2010-03-29 04:15:06Closed
    Exigomusicview history2010-03-29 03:50:45Closed
    extremebits.orgview history2010-03-29 04:28:05Closed
    extremeshare.orgview history2010-03-29 03:59:03Open
    faplife.netview history2010-03-29 03:50:46Closed
    feedthe.netview history2010-03-29 04:22:09Closed
    filebits.orgview history2010-03-29 03:57:08Closed
    filelist.orgview history2010-03-29 04:22:25Closed
    filelist.roview history2010-03-29 03:56:09Closed
    filemp3.orgview history2010-03-29 03:50:46Closed
    fileporn.orgview history2010-03-29 03:51:10Closed
    flashtorrents.com.arview history2010-03-29 03:59:40Closed
    Free The Scene (FTS)view history2010-03-29 04:05:04Closed
    Fresh On TV (TvT)view history2010-03-29 03:59:37Open
    frztracker.sytes.netview history2010-03-29 04:25:08Closed
    fst.omnilounge.co.ukview history2010-03-29 04:08:50Closed
    fullcontactzone.comview history2010-03-29 03:56:09Closed
    gamecrook.comview history2010-03-29 04:18:05Closed
    gbvnet.roview history2010-03-29 04:25:08Open
    gettorrents.orgview history2010-03-29 04:11:06Closed
    gfxnews.ruview history2010-03-29 04:12:07Closed
    gigatorrents.wsview history2010-03-29 03:57:05Closed
    globus-tracker.comview history2010-03-29 04:30:51Closed
    goem.orgview history2010-03-29 03:56:07Closed
    gormogon.comview history2010-03-29 04:25:05Open
    greek-tracker.comview history2010-03-29 03:51:06Closed
    grimetorrent.comview history2010-03-29 04:28:15Closed
    grtorrent.comview history2010-03-29 04:12:08Closed
    guiks.netview history2010-03-29 04:05:04Closed
    h264torrents.comview history2010-03-29 03:57:01Closed
    h33t.comview history2010-03-29 03:51:06Open
    hd-bits.roview history2010-03-29 04:18:09Closed
    hd-torrents.orgview history2010-03-29 04:05:05Closed
    hdbits.orgview history2010-03-29 04:12:07Closed
    hdchina.orgview history2010-03-29 03:59:37Closed
    hdfrench.comview history2010-03-29 04:09:01Closed
    hdme.euview history2010-03-29 03:55:09Open
    hdpre.comview history2010-03-29 04:12:09Closed
    hdsource.bizview history2010-03-29 03:49:13Closed
    hdstar.orgview history2010-03-29 03:51:02Closed
    hdvnbits.orgview history2010-03-29 03:56:03Closed
    heaventracker.orgview history2010-03-29 03:57:02Closed
    hermeticos.orgview history2010-03-29 04:25:12Closed
    horrorcharnel.kicks-ass.orgview history2010-03-29 03:58:05Closed
    hungercity.orgview history2010-03-29 04:31:05Open
    ifyounotknow.comview history2010-03-29 03:58:07Closed
    ilovetorrents.comview history2010-03-29 03:56:06Open
    indeep.bizview history2010-03-29 03:56:08Closed
    indietorrents.comview history2010-03-29 04:00:14Closed
    iplay.roview history2010-03-29 03:59:03Closed
    ipodnova.tvview history2010-03-29 04:04:12Closed
    iptorrents.comview history2010-03-29 03:51:06Closed
    joompalace.comview history2010-03-29 03:57:04Closed
    karagarga.netview history2010-03-29 04:17:07Closed
    killawaves.netview history2010-03-29 04:05:05Closed
    kinozal.wsview history2010-03-29 04:28:16Open
    kludd.comview history2010-03-29 03:55:11Closed
    lasttorrents.orgview history2010-03-29 04:32:02Open
    leecherslair.comview history2010-03-29 04:18:08Closed
    libble.comview history2010-03-29 04:25:11Closed
    libitina.netview history2010-03-29 04:18:11Closed
    linuxmafia.netview history2010-03-29 04:22:07Offline
    linuxtracker.orgview history2010-03-29 04:22:24Closed
    lostfilm.tvview history2010-03-29 04:00:07Open
    magiciantorrents.comview history2010-03-29 03:55:14Closed
    masterstb.comview history2010-03-29 03:56:12Closed
    mazetorrents.netview history2010-03-29 04:17:07Offline
    medioteka.comview history2010-03-29 04:17:07Closed
    mega-bits.comview history2010-03-29 03:51:52Closed
    mentol.roview history2010-03-29 04:12:04Closed
    metal.iplay.roview history2010-03-29 04:18:03Closed
    metalbits.orgview history2010-03-29 04:00:02Closed
    midnight-scene.comview history2010-03-29 03:58:06Closed
    midnight-torrents.comview history2010-03-29 04:31:05Closed
    mma-central.org.ukview history2010-03-29 03:56:05Closed
    mma-tracker.netview history2010-03-29 03:50:43Closed
    mp3nerds.orgview history2010-03-29 04:18:07Closed
    mucis-vid.comview history2010-03-29 03:56:06Closed
    musicplace.lvview history2010-03-29 04:05:04Closed
    mytorrent.tvview history2010-03-29 03:57:07Closed
    norbits.netview history2010-03-29 04:12:05Closed
    nordic-t.orgview history2010-03-29 03:55:02Closed
    nordicbits.orgview history2010-03-29 04:18:07Offline
    novaro.infoview history2010-03-29 03:49:16Closed
    novaro.infoview history2010-03-29 03:55:02Closed
    noviteti.comview history2010-03-29 04:15:05Offline
    ntorrents.netview history2010-03-29 03:59:08Closed
    nutorrent.comview history2010-03-29 04:25:12Open
    opennetwork.roview history2010-03-29 04:08:49Closed
    overtopropetorrents.comview history2010-03-29 04:00:14Closed
    ozone-torrents.orgview history2010-03-29 04:32:00Closed
    Pedros btmusicview history2010-03-29 04:08:54Closed
    pianosheets.orgview history2010-03-29 03:49:17Closed
    pinkytorrents.comview history2010-03-29 03:56:08Open
    piranha.excom.usview history2010-03-29 04:08:07Open
    Pirate The Net (PtN)view history2010-03-29 03:49:15Closed
    piratebits.orgview history2010-03-29 04:09:01Closed
    piratefiles.seview history2010-03-29 04:25:05Closed
    piratetorrents.nuview history2010-03-29 03:56:04Closed
    pisexy.orgview history2010-03-29 04:01:06Closed
    polishbytes.netview history2010-03-29 04:31:55Open
    polishtracker.orgview history2010-03-29 03:56:09Closed
    pornbay.orgview history2010-03-29 03:57:12Closed
    PotUKview history2010-03-29 04:08:54Closed
    powerscene.orgview history2010-03-29 03:57:11Closed
    pretome.netview history2010-03-29 04:32:01Closed
    proaudiotorrents.orgview history2010-03-29 04:15:14Closed
    psytorrents.infoview history2010-03-29 03:49:08Closed
    ptfiles.orgview history2010-03-29 04:18:09Closed
    punkhc.dyndns.orgview history2010-03-29 04:01:09Closed
    puretna.comview history2010-03-29 04:05:06Open
    pussytorrents.orgview history2010-03-29 03:52:02Open
    rapthe.netview history2010-03-29 04:12:09Closed
    rarbg.comview history2010-03-29 03:58:11Open
    reload-paradise.netview history2010-03-29 04:00:07Closed
    revolutiontt.netview history2010-03-29 03:56:07Closed
    rmvbustersview history2010-03-29 04:15:08Open
    rmvbusters.plview history2010-03-29 03:56:05Open
    scaliwags.orgview history2010-03-29 03:59:04Closed
    scene-gold.infoview history2010-03-29 04:17:08Offline
    scene-inspired.comview history2010-03-29 03:51:07Open
    sceneaccess.orgview history2010-03-29 03:55:09Closed
    scenebytes.clview history2010-03-29 04:22:20Closed
    scenehd.orgview history2010-03-29 04:28:09Closed
    sceneleech.orgview history2010-03-29 03:57:05Closed
    SceneLife (ScL)view history2010-03-29 04:00:08Closed
    scenetorrents.orgview history2010-03-29 04:12:05Closed
    scenetuga.orgview history2010-03-29 03:51:04Closed
    sciencehd.netview history2010-03-29 04:00:15Closed
    scifitorrents.netview history2010-03-29 03:56:10Closed
    secret-cinema.netview history2010-03-29 04:28:13Closed
    seedgames.orgview history2010-03-29 04:18:16Closed
    seedmore.orgview history2010-03-29 03:56:11Closed
    sharetorrents.plview history2010-03-29 04:01:13Closed
    sharing-torrents.comview history2010-03-29 03:58:14Closed
    slosoul.netview history2010-03-29 03:51:00Closed
    snowtigers.netview history2010-03-29 03:49:43Closed
    softmp3.orgview history2010-03-29 04:18:02Closed
    softmupparna.netview history2010-03-29 04:31:05Closed
    sounddamage.comview history2010-03-29 03:49:14Closed
    spanishtracker.comview history2010-03-29 04:25:07Open
    spank-d-monkey.comview history2010-03-29 04:17:09Closed
    special.pwtorrents.netview history2010-03-29 03:56:06Closed
    speed.cdview history2010-03-29 03:52:02Closed
    spiryt.ath.cxview history2010-03-29 04:12:07Closed
    sport-scene.netview history2010-03-29 03:55:15Closed
    sportbit.orgview history2010-03-29 04:25:08Closed
    sportleech.netview history2010-03-29 04:28:08Closed
    stmusic.orgview history2010-03-29 04:05:04Open
    supertorrents.orgview history2010-03-29 04:05:08Open
    swebits.orgview history2010-03-29 04:15:05Closed
    sweninjaz.orgview history2010-03-29 04:32:02Closed
    swep2p.orgview history2010-03-29 03:51:52Closed
    swepiracy.orgview history2010-03-29 04:05:07Open
    swetorrents.no-ip.orgview history2010-03-29 04:31:05Closed
    taiphimhd.comview history2010-03-29 03:55:07Closed
    tastetherainbow.wsview history2010-03-29 04:00:04Closed
    teamofgreekz.comview history2010-03-29 04:18:03Closed
    tehconnection.euview history2010-03-29 04:28:06Closed
    the-zomb.comview history2010-03-29 04:08:55Open
    thebox.bzview history2010-03-29 03:51:06Open
    thedvdclub.orgview history2010-03-29 04:25:07Open
    thegt.netview history2010-03-29 04:31:58Closed
    themixingbowl.orgview history2010-03-29 04:22:25Closed
    theoccult.bzview history2010-03-29 03:51:02Closed
    thepeerhub.comview history2010-03-29 04:00:12Open
    theplace.bzview history2010-03-29 04:08:56Closed
    thepokerbay.orgview history2010-03-29 03:59:37Open
    thevault.bzview history2010-03-29 03:59:39Closed
    titaniumtorrents.netview history2010-03-29 04:18:11Offline
    tmtorrents.orgview history2010-03-29 03:49:12Closed
    topbytes.netview history2010-03-29 03:49:08Closed
    topbytes.netview history2010-03-29 04:05:05Closed
    tophos.orgview history2010-03-29 03:58:09Closed
    torrent-damage.netview history2010-03-29 03:50:45Closed
    torrent.itview history2010-03-29 04:25:12Closed
    torrent411.comview history2010-03-29 04:15:08Open
    torrentbits.roview history2010-03-29 04:31:57Closed
    torrentbully.comview history2010-03-29 03:55:08Closed
    torrentdownloads.netview history2010-03-29 04:15:05Open
    torrentgaming.netview history2010-03-29 04:28:18Closed
    torrentgeeks.comview history2010-03-29 03:51:02Offline
    torrenthr.orgview history2010-03-29 04:21:10Open
    torrentkings.orgview history2010-03-29 03:49:05Closed
    torrentleech.orgview history2010-03-29 04:01:09Closed
    torrentseed.orgview history2010-03-29 03:56:10Closed
    torrentsforall.netview history2010-03-29 04:15:07Open
    torrentsmd.comview history2010-03-29 04:00:09Closed
    torrentvault.orgview history2010-03-29 03:49:12Closed
    torrentzilla.orgview history2010-03-29 03:57:04Open
    torrentzone.netview history2010-03-29 04:18:03Open
    totaltorrents.comview history2010-03-29 04:05:05Closed
    trancebits.comview history2010-03-29 04:25:09Closed
    trancebooster.netview history2010-03-29 04:05:03Closed
    trancetraffic.comview history2010-03-29 04:12:10Closed
    tri-tavern.comview history2010-03-29 04:17:07Closed
    tribalmixes.comview history2010-03-29 04:15:07Open
    tugaleech.comview history2010-03-29 03:59:05Closed
    tunebully.comview history2010-03-29 04:25:09Closed
    tv.torrents.roview history2010-03-29 03:58:06Closed
    tvtorrents.comview history2010-03-29 04:18:05Open
    ugstorrents.comview history2010-03-29 04:28:11Closed
    uknova.comview history2010-03-29 04:22:26Closed
    underground-gamer.comview history2010-03-29 04:17:07Open
    victorrent.netview history2010-03-29 04:01:09Closed
    vortexnetwork.orgview history2010-03-29 03:56:08Offline
    waffles.fmview history2010-03-29 03:56:11Closed
    wantedfiles.roview history2010-03-29 04:18:06Open
    warezbros.orgview history2010-03-29 04:08:59Closed
    what.cdview history2010-03-29 04:22:27Closed
    wild-bytes.orgview history2010-03-29 04:12:07Closed
    wolfbits.orgview history2010-03-29 04:22:07Closed
    worldboxingvideoarchive.comview history2010-03-29 04:05:06Open
    www.bt-pt.netview history2010-03-29 03:56:05Open
    www.llywot.comview history2010-03-29 03:59:38Closed
    xbitz.orgview history2010-03-29 04:18:14Open
    xider.huview history2010-03-29 04:05:02Open
    xtremespeeds.netview history2010-03-29 04:01:04Closed
    xtremewrestlingtorrents.netview history2010-03-29 03:51:05Closed
    xtremezone.roview history2010-03-29 03:58:08Closed
    yuwabits.netview history2010-03-29 04:05:07Open
    zanettetorrent.comview history2010-03-29 04:00:10Open
    zinebytes.orgview history2010-03-29 04:25:10Closed
    -
    -


    - - - -
    - - - - - - diff --git a/node_modules/jsdom/node_modules/htmlparser/testdata/.tmp_trackerchecker2.html.75287~ b/node_modules/jsdom/node_modules/htmlparser/testdata/.tmp_trackerchecker2.html.75287~ deleted file mode 100644 index 1eea80d..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/testdata/.tmp_trackerchecker2.html.75287~ +++ /dev/null @@ -1,2947 +0,0 @@ - - -www.trackerchecker.com - We check your trackers - - - - - - -
    - - - - - - - -
    Home || Add a tracker || Latest trackers
    -
    - - -
    -follow us on Twitter
    -Follow trackerchecker on Twitter --> @trackerchecker. -
    - -
    - - -
    -
    - TrackerList
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     TrackerNameHistoryLastCheckedStatus
    1337x.orgview history2010-03-29 03:56:03Open
    420project.orgview history2010-03-29 04:28:13Closed
    acehd.netview history2010-03-29 04:31:58Closed
    acetorrents.netview history2010-03-29 03:59:08Open
    adult-cinema-network.netview history2010-03-29 04:00:08Open
    all4nothin.netview history2010-03-29 04:01:08Open
    allgirltorrents.comview history2010-03-29 03:50:57Closed
    allotracker.comview history2010-03-29 03:58:09Open
    appz.bitshock.orgview history2010-03-29 03:57:12Open
    appzuniverse.orgview history2010-03-29 04:18:04Closed
    arabfilms.orgview history2010-03-29 04:08:50Closed
    arabseries.orgview history2010-03-29 03:59:39Closed
    araditracker.comview history2010-03-29 04:22:25Closed
    arena-tr.comview history2010-03-29 04:12:10Closed
    arenabg.comview history2010-03-29 03:51:00Closed
    artofmisdirection.comview history2010-03-29 04:01:04Closed
    asiandvdclub.orgview history2010-03-29 04:18:15Open
    at-tracker.orgview history2010-03-29 04:15:08Offline
    atomico-torrent.comview history2010-03-29 03:56:05Closed
    audionews.ruview history2010-03-29 04:01:02Closed
    audiotracer.comview history2010-03-29 04:05:08Closed
    audiozonetorrents.comview history2010-03-29 03:56:09Open
    avatarbg.infoview history2010-03-29 03:49:14Closed
    awesome-hd.comview history2010-03-29 03:51:07Closed
    awesome-hd.netview history2010-03-29 03:55:09Closed
    baltracker.netview history2010-03-29 04:15:09Open
    bestmmatorrents.comview history2010-03-29 04:15:04Closed
    bestshare.roview history2010-03-29 03:56:11Closed
    bestxvid.orgview history2010-03-29 03:50:57Closed
    bit-hdtv.comview history2010-03-29 03:58:10Closed
    bitaddict.orgview history2010-03-29 03:50:45Closed
    bitchil.comview history2010-03-29 03:56:09Open
    bitflamers.comview history2010-03-29 04:01:12Closed
    bitgamer.comview history2010-03-29 04:12:08Closed
    bithq.orgview history2010-03-29 03:58:08Open
    bithumen.ath.cxview history2010-03-29 04:22:20Closed
    bitlove.huview history2010-03-29 04:25:10Closed
    bitme.orgview history2010-03-29 04:12:06Closed
    bitmetv.orgview history2010-03-29 03:49:16Closed
    bitmusic.huview history2010-03-29 03:58:11Closed
    bitnation.comview history2010-03-29 03:59:08Closed
    bitseduce.comview history2010-03-29 04:05:08Closed
    bitseek.orgview history2010-03-29 04:28:05Closed
    bitseek.orgview history2010-03-29 04:18:05Closed
    bitshock.orgview history2010-03-29 04:00:03Open
    bitshock.orgview history2010-03-29 03:55:14Closed
    bitsoup.orgview history2010-03-29 03:59:07Open
    bitSpyder.netview history2010-03-29 03:56:06Closed
    bittorrents.roview history2010-03-29 04:00:14Closed
    bitturk.netview history2010-03-29 03:56:05Closed
    biztorrents.comview history2010-03-29 04:15:07Open
    blackcats-games.netview history2010-03-29 03:58:06Closed
    blades-heaven.comview history2010-03-29 04:08:56Open
    blue-bytez.comview history2010-03-29 04:32:01Closed
    blue-whitegt.comview history2010-03-29 04:28:13Closed
    bmtorrents.netview history2010-03-29 03:58:10Closed
    bootytape.comview history2010-03-29 03:58:02Open
    bootytorrents.comview history2010-03-29 03:57:07Closed
    boxtorrents.comview history2010-03-29 04:08:59Closed
    bt.avistaz.comview history2010-03-29 04:15:08Closed
    bt.davka.infoview history2010-03-29 04:08:50Open
    bt.xbox-sky.ccview history2010-03-29 03:49:08Closed
    bt.xbox-sky.comview history2010-03-29 03:50:42Closed
    btgigs.infoview history2010-03-29 04:18:15Closed
    bwtorrents.comview history2010-03-29 03:56:10Closed
    bytelist.orgview history2010-03-29 04:05:07Offline
    cartoonchaos.orgview history2010-03-29 04:18:15Closed
    ccfbits.orgview history2010-03-29 04:22:19Closed
    chdbits.orgview history2010-03-29 04:15:11Closed
    cheggit.net/view history2010-03-29 04:09:00Open
    chilebt.comview history2010-03-29 04:22:11Closed
    christiantorrents.comview history2010-03-29 04:28:13Closed
    chronictracker.comview history2010-03-29 04:01:13Closed
    cinema-obscura.comview history2010-03-29 03:57:06Closed
    cinemageddon.orgview history2010-03-29 04:22:27Closed
    cinematik.netview history2010-03-29 03:57:11Closed
    cleanvobs.orgview history2010-03-29 03:49:43Closed
    colombo-bt.orgview history2010-03-29 03:50:55Closed
    contego.wsview history2010-03-29 04:22:12Closed
    crazytorrent.euview history2010-03-29 04:08:49Closed
    czone.roview history2010-03-29 04:24:09Closed
    danger.lvview history2010-03-29 03:55:15Closed
    demonoid.comview history2010-03-29 04:18:15Closed
    devilwolfs.comview history2010-03-29 04:31:55Closed
    diablotorrent.huview history2010-03-29 03:56:01Closed
    dididave.comview history2010-03-29 04:00:03Closed
    digitalhive.orgview history2010-03-29 03:50:44Closed
    dimeadozen.orgview history2010-03-29 04:05:06Open
    dnbtracker.orgview history2010-03-29 04:01:11Open
    docs.torrents.roview history2010-03-29 04:01:14Closed
    dvdseed.orgview history2010-03-29 04:32:01Closed
    dvdtreasure.euview history2010-03-29 04:05:04Closed
    ebookvortex.comview history2010-03-29 04:05:07Open
    eclipsetorrents.orgview history2010-03-29 04:12:09Closed
    egytorrent.comview history2010-03-29 03:49:06Closed
    egytorrent.comview history2010-03-29 04:01:05Closed
    elbitz.netview history2010-03-29 04:18:13Closed
    elektronik.roview history2010-03-29 03:55:02Closed
    empornium.usview history2010-03-29 03:57:07Open
    eroticsource.plview history2010-03-29 04:28:19Closed
    estrenoslatinos.comview history2010-03-29 03:49:10Closed
    ethor.netview history2010-03-29 03:51:08Closed
    evopt.orgview history2010-03-29 04:15:06Closed
    Exigomusicview history2010-03-29 03:50:45Closed
    extremebits.orgview history2010-03-29 04:28:05Closed
    extremeshare.orgview history2010-03-29 03:59:03Open
    faplife.netview history2010-03-29 03:50:46Closed
    feedthe.netview history2010-03-29 04:22:09Closed
    filebits.orgview history2010-03-29 03:57:08Closed
    filelist.orgview history2010-03-29 04:22:25Closed
    filelist.roview history2010-03-29 03:56:09Closed
    filemp3.orgview history2010-03-29 03:50:46Closed
    fileporn.orgview history2010-03-29 03:51:10Closed
    flashtorrents.com.arview history2010-03-29 03:59:40Closed
    Free The Scene (FTS)view history2010-03-29 04:05:04Closed
    Fresh On TV (TvT)view history2010-03-29 03:59:37Open
    frztracker.sytes.netview history2010-03-29 04:25:08Closed
    fst.omnilounge.co.ukview history2010-03-29 04:08:50Closed
    fullcontactzone.comview history2010-03-29 03:56:09Closed
    gamecrook.comview history2010-03-29 04:18:05Closed
    gbvnet.roview history2010-03-29 04:25:08Open
    gettorrents.orgview history2010-03-29 04:11:06Closed
    gfxnews.ruview history2010-03-29 04:12:07Closed
    gigatorrents.wsview history2010-03-29 03:57:05Closed
    globus-tracker.comview history2010-03-29 04:30:51Closed
    goem.orgview history2010-03-29 03:56:07Closed
    gormogon.comview history2010-03-29 04:25:05Open
    greek-tracker.comview history2010-03-29 03:51:06Closed
    grimetorrent.comview history2010-03-29 04:28:15Closed
    grtorrent.comview history2010-03-29 04:12:08Closed
    guiks.netview history2010-03-29 04:05:04Closed
    h264torrents.comview history2010-03-29 03:57:01Closed
    h33t.comview history2010-03-29 03:51:06Open
    hd-bits.roview history2010-03-29 04:18:09Closed
    hd-torrents.orgview history2010-03-29 04:05:05Closed
    hdbits.orgview history2010-03-29 04:12:07Closed
    hdchina.orgview history2010-03-29 03:59:37Closed
    hdfrench.comview history2010-03-29 04:09:01Closed
    hdme.euview history2010-03-29 03:55:09Open
    hdpre.comview history2010-03-29 04:12:09Closed
    hdsource.bizview history2010-03-29 03:49:13Closed
    hdstar.orgview history2010-03-29 03:51:02Closed
    hdvnbits.orgview history2010-03-29 03:56:03Closed
    heaventracker.orgview history2010-03-29 03:57:02Closed
    hermeticos.orgview history2010-03-29 04:25:12Closed
    horrorcharnel.kicks-ass.orgview history2010-03-29 03:58:05Closed
    hungercity.orgview history2010-03-29 04:31:05Open
    ifyounotknow.comview history2010-03-29 03:58:07Closed
    ilovetorrents.comview history2010-03-29 03:56:06Open
    indeep.bizview history2010-03-29 03:56:08Closed
    indietorrents.comview history2010-03-29 04:00:14Closed
    iplay.roview history2010-03-29 03:59:03Closed
    ipodnova.tvview history2010-03-29 04:04:12Closed
    iptorrents.comview history2010-03-29 03:51:06Closed
    joompalace.comview history2010-03-29 03:57:04Closed
    karagarga.netview history2010-03-29 04:17:07Closed
    killawaves.netview history2010-03-29 04:05:05Closed
    kinozal.wsview history2010-03-29 04:28:16Open
    kludd.comview history2010-03-29 03:55:11Closed
    lasttorrents.orgview history2010-03-29 04:32:02Open
    leecherslair.comview history2010-03-29 04:18:08Closed
    libble.comview history2010-03-29 04:25:11Closed
    libitina.netview history2010-03-29 04:18:11Closed
    linuxmafia.netview history2010-03-29 04:22:07Offline
    linuxtracker.orgview history2010-03-29 04:22:24Closed
    lostfilm.tvview history2010-03-29 04:00:07Open
    magiciantorrents.comview history2010-03-29 03:55:14Closed
    masterstb.comview history2010-03-29 03:56:12Closed
    mazetorrents.netview history2010-03-29 04:17:07Offline
    medioteka.comview history2010-03-29 04:17:07Closed
    mega-bits.comview history2010-03-29 03:51:52Closed
    mentol.roview history2010-03-29 04:12:04Closed
    metal.iplay.roview history2010-03-29 04:18:03Closed
    metalbits.orgview history2010-03-29 04:00:02Closed
    midnight-scene.comview history2010-03-29 03:58:06Closed
    midnight-torrents.comview history2010-03-29 04:31:05Closed
    mma-central.org.ukview history2010-03-29 03:56:05Closed
    mma-tracker.netview history2010-03-29 03:50:43Closed
    mp3nerds.orgview history2010-03-29 04:18:07Closed
    mucis-vid.comview history2010-03-29 03:56:06Closed
    musicplace.lvview history2010-03-29 04:05:04Closed
    mytorrent.tvview history2010-03-29 03:57:07Closed
    norbits.netview history2010-03-29 04:12:05Closed
    nordic-t.orgview history2010-03-29 03:55:02Closed
    nordicbits.orgview history2010-03-29 04:18:07Offline
    novaro.infoview history2010-03-29 03:49:16Closed
    novaro.infoview history2010-03-29 03:55:02Closed
    noviteti.comview history2010-03-29 04:15:05Offline
    ntorrents.netview history2010-03-29 03:59:08Closed
    nutorrent.comview history2010-03-29 04:25:12Open
    opennetwork.roview history2010-03-29 04:08:49Closed
    overtopropetorrents.comview history2010-03-29 04:00:14Closed
    ozone-torrents.orgview history2010-03-29 04:32:00Closed
    Pedros btmusicview history2010-03-29 04:08:54Closed
    pianosheets.orgview history2010-03-29 03:49:17Closed
    pinkytorrents.comview history2010-03-29 03:56:08Open
    piranha.excom.usview history2010-03-29 04:08:07Open
    Pirate The Net (PtN)view history2010-03-29 03:49:15Closed
    piratebits.orgview history2010-03-29 04:09:01Closed
    piratefiles.seview history2010-03-29 04:25:05Closed
    piratetorrents.nuview history2010-03-29 03:56:04Closed
    pisexy.orgview history2010-03-29 04:01:06Closed
    polishbytes.netview history2010-03-29 04:31:55Open
    polishtracker.orgview history2010-03-29 03:56:09Closed
    pornbay.orgview history2010-03-29 03:57:12Closed
    PotUKview history2010-03-29 04:08:54Closed
    powerscene.orgview history2010-03-29 03:57:11Closed
    pretome.netview history2010-03-29 04:32:01Closed
    proaudiotorrents.orgview history2010-03-29 04:15:14Closed
    psytorrents.infoview history2010-03-29 03:49:08Closed
    ptfiles.orgview history2010-03-29 04:18:09Closed
    punkhc.dyndns.orgview history2010-03-29 04:01:09Closed
    puretna.comview history2010-03-29 04:05:06Open
    pussytorrents.orgview history2010-03-29 03:52:02Open
    rapthe.netview history2010-03-29 04:12:09Closed
    rarbg.comview history2010-03-29 03:58:11Open
    reload-paradise.netview history2010-03-29 04:00:07Closed
    revolutiontt.netview history2010-03-29 03:56:07Closed
    rmvbustersview history2010-03-29 04:15:08Open
    rmvbusters.plview history2010-03-29 03:56:05Open
    scaliwags.orgview history2010-03-29 03:59:04Closed
    scene-gold.infoview history2010-03-29 04:17:08Offline
    scene-inspired.comview history2010-03-29 03:51:07Open
    sceneaccess.orgview history2010-03-29 03:55:09Closed
    scenebytes.clview history2010-03-29 04:22:20Closed
    scenehd.orgview history2010-03-29 04:28:09Closed
    sceneleech.orgview history2010-03-29 03:57:05Closed
    SceneLife (ScL)view history2010-03-29 04:00:08Closed
    scenetorrents.orgview history2010-03-29 04:12:05Closed
    scenetuga.orgview history2010-03-29 03:51:04Closed
    sciencehd.netview history2010-03-29 04:00:15Closed
    scifitorrents.netview history2010-03-29 03:56:10Closed
    secret-cinema.netview history2010-03-29 04:28:13Closed
    seedgames.orgview history2010-03-29 04:18:16Closed
    seedmore.orgview history2010-03-29 03:56:11Closed
    sharetorrents.plview history2010-03-29 04:01:13Closed
    sharing-torrents.comview history2010-03-29 03:58:14Closed
    slosoul.netview history2010-03-29 03:51:00Closed
    snowtigers.netview history2010-03-29 03:49:43Closed
    softmp3.orgview history2010-03-29 04:18:02Closed
    softmupparna.netview history2010-03-29 04:31:05Closed
    sounddamage.comview history2010-03-29 03:49:14Closed
    spanishtracker.comview history2010-03-29 04:25:07Open
    spank-d-monkey.comview history2010-03-29 04:17:09Closed
    special.pwtorrents.netview history2010-03-29 03:56:06Closed
    speed.cdview history2010-03-29 03:52:02Closed
    spiryt.ath.cxview history2010-03-29 04:12:07Closed
    sport-scene.netview history2010-03-29 03:55:15Closed
    sportbit.orgview history2010-03-29 04:25:08Closed
    sportleech.netview history2010-03-29 04:28:08Closed
    stmusic.orgview history2010-03-29 04:05:04Open
    supertorrents.orgview history2010-03-29 04:05:08Open
    swebits.orgview history2010-03-29 04:15:05Closed
    sweninjaz.orgview history2010-03-29 04:32:02Closed
    swep2p.orgview history2010-03-29 03:51:52Closed
    swepiracy.orgview history2010-03-29 04:05:07Open
    swetorrents.no-ip.orgview history2010-03-29 04:31:05Closed
    taiphimhd.comview history2010-03-29 03:55:07Closed
    tastetherainbow.wsview history2010-03-29 04:00:04Closed
    teamofgreekz.comview history2010-03-29 04:18:03Closed
    tehconnection.euview history2010-03-29 04:28:06Closed
    the-zomb.comview history2010-03-29 04:08:55Open
    thebox.bzview history2010-03-29 03:51:06Open
    thedvdclub.orgview history2010-03-29 04:25:07Open
    thegt.netview history2010-03-29 04:31:58Closed
    themixingbowl.orgview history2010-03-29 04:22:25Closed
    theoccult.bzview history2010-03-29 03:51:02Closed
    thepeerhub.comview history2010-03-29 04:00:12Open
    theplace.bzview history2010-03-29 04:08:56Closed
    thepokerbay.orgview history2010-03-29 03:59:37Open
    thevault.bzview history2010-03-29 03:59:39Closed
    titaniumtorrents.netview history2010-03-29 04:18:11Offline
    tmtorrents.orgview history2010-03-29 03:49:12Closed
    topbytes.netview history2010-03-29 03:49:08Closed
    topbytes.netview history2010-03-29 04:05:05Closed
    tophos.orgview history2010-03-29 03:58:09Closed
    torrent-damage.netview history2010-03-29 03:50:45Closed
    torrent.itview history2010-03-29 04:25:12Closed
    torrent411.comview history2010-03-29 04:15:08Open
    torrentbits.roview history2010-03-29 04:31:57Closed
    torrentbully.comview history2010-03-29 03:55:08Closed
    torrentdownloads.netview history2010-03-29 04:15:05Open
    torrentgaming.netview history2010-03-29 04:28:18Closed
    torrentgeeks.comview history2010-03-29 03:51:02Offline
    torrenthr.orgview history2010-03-29 04:21:10Open
    torrentkings.orgview history2010-03-29 03:49:05Closed
    torrentleech.orgview history2010-03-29 04:01:09Closed
    torrentseed.orgview history2010-03-29 03:56:10Closed
    torrentsforall.netview history2010-03-29 04:15:07Open
    torrentsmd.comview history2010-03-29 04:00:09Closed
    torrentvault.orgview history2010-03-29 03:49:12Closed
    torrentzilla.orgview history2010-03-29 03:57:04Open
    torrentzone.netview history2010-03-29 04:18:03Open
    totaltorrents.comview history2010-03-29 04:05:05Closed
    trancebits.comview history2010-03-29 04:25:09Closed
    trancebooster.netview history2010-03-29 04:05:03Closed
    trancetraffic.comview history2010-03-29 04:12:10Closed
    tri-tavern.comview history2010-03-29 04:17:07Closed
    tribalmixes.comview history2010-03-29 04:15:07Open
    tugaleech.comview history2010-03-29 03:59:05Closed
    tunebully.comview history2010-03-29 04:25:09Closed
    tv.torrents.roview history2010-03-29 03:58:06Closed
    tvtorrents.comview history2010-03-29 04:18:05Open
    ugstorrents.comview history2010-03-29 04:28:11Closed
    uknova.comview history2010-03-29 04:22:26Closed
    underground-gamer.comview history2010-03-29 04:17:07Open
    victorrent.netview history2010-03-29 04:01:09Closed
    vortexnetwork.orgview history2010-03-29 03:56:08Offline
    waffles.fmview history2010-03-29 03:56:11Closed
    wantedfiles.roview history2010-03-29 04:18:06Open
    warezbros.orgview history2010-03-29 04:08:59Closed
    what.cdview history2010-03-29 04:22:27Closed
    wild-bytes.orgview history2010-03-29 04:12:07Closed
    wolfbits.orgview history2010-03-29 04:22:07Closed
    worldboxingvideoarchive.comview history2010-03-29 04:05:06Open
    www.bt-pt.netview history2010-03-29 03:56:05Open
    www.llywot.comview history2010-03-29 03:59:38Closed
    xbitz.orgview history2010-03-29 04:18:14Open
    xider.huview history2010-03-29 04:05:02Open
    xtremespeeds.netview history2010-03-29 04:01:04Closed
    xtremewrestlingtorrents.netview history2010-03-29 03:51:05Closed
    xtremezone.roview history2010-03-29 03:58:08Closed
    yuwabits.netview history2010-03-29 04:05:07Open
    zanettetorrent.comview history2010-03-29 04:00:10Open
    zinebytes.orgview history2010-03-29 04:25:10Closed
    -
    -


    - ---> - -
    - - - - - - diff --git a/node_modules/jsdom/node_modules/htmlparser/testdata/api.html b/node_modules/jsdom/node_modules/htmlparser/testdata/api.html deleted file mode 100644 index e7a71c4..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/testdata/api.html +++ /dev/null @@ -1,3311 +0,0 @@ - - - - - node(1) -- evented I/O for V8 JavaScript - - - - - -
    -
    Node v0.1.99
    - -
    -
    -
    -

    node(1)

    - -
      -
    1. node(1)
    2. - -
    3. -
    4. node(1)
    5. -
    -

    NAME

    -

    node -- evented I/O for V8 JavaScript

    - -

    Synopsis

    - -

    An example of a web server written with Node which responds with 'Hello -World':

    - -
    var sys = require('sys'),
    -  http = require('http');
    -
    -http.createServer(function (request, response) {
    -  response.writeHead(200, {'Content-Type': 'text/plain'});
    -  response.end('Hello World\n');
    -}).listen(8124);
    -
    -sys.puts('Server running at http://127.0.0.1:8124/');
    -
    - -

    To run the server, put the code into a file called example.js and execute -it with the node program

    - -
    > node example.js
    -Server running at http://127.0.0.1:8124/
    -
    - -

    All of the examples in the documentation can be run similarly.

    - -

    Standard Modules

    - -

    Node comes with a number of modules that are compiled in to the process, -most of which are documented below. The most common way to use these modules -is with require('name') and then assigning the return value to a local -variable with the same name as the module.

    - -

    Example:

    - -
    var sys = require('sys');
    -
    - -

    It is possible to extend node with other modules. See 'Modules'

    - -

    Buffers

    - -

    Pure Javascript is Unicode friendly but not nice to binary data. When -dealing with TCP streams or the file system, it's necessary to handle octet -streams. Node has several strategies for manipulating, creating, and -consuming octet streams.

    - -

    Raw data is stored in instances of the Buffer class. A Buffer is similar -to an array of integers but corresponds to a raw memory allocation outside -the V8 heap. A Buffer cannot be resized. -Access the class with require('buffer').Buffer.

    - -

    Converting between Buffers and JavaScript string objects requires an explicit encoding -method. Node supports 3 string encodings: UTF-8 ('utf8'), ASCII ('ascii'), and -Binary ('binary').

    - -
      -
    • 'ascii' - for 7 bit ASCII data only. This encoding method is very fast, and will -strip the high bit if set.

    • -
    • 'binary' - for 8 bit binary data such as images.

    • -
    • 'utf8' - Unicode characters. Many web pages and other document formats use UTF-8.

    • -
    - - -

    new Buffer(size)

    - -

    Allocates a new buffer of size octets.

    - -

    new Buffer(array)

    - -

    Allocates a new buffer using an array of octets.

    - -

    new Buffer(str, encoding = 'utf8')

    - -

    Allocates a new buffer containing the given str.

    - -

    buffer.write(string, encoding, offset)

    - -

    Writes string to the buffer at offset using the given encoding. Returns -number of octets written. If buffer did not contain enough space to fit -the entire string it will write a partial amount of the string. In the case -of 'utf8' encoding, the method will not write partial characters.

    - -

    Example: write a utf8 string into a buffer, then print it

    - -
    var sys = require('sys'),
    -  Buffer = require('buffer').Buffer,
    -  buf = new Buffer(256),
    -  len;
    -
    -len = buf.write('\u00bd + \u00bc = \u00be', 'utf8', 0);
    -sys.puts(len + " bytes: " + buf.toString('utf8', 0, len));
    -
    -// 12 bytes: ½ + ¼ = ¾
    -
    - -

    buffer.toString(encoding, start, end)

    - -

    Decodes and returns a string from buffer data encoded with encoding -beginning at start and ending at end.

    - -

    See buffer.write() example, above.

    - -

    buffer[index]

    - -

    Get and set the octet at index. The values refer to individual bytes, -so the legal range is between 0x00 and 0xFF hex or 0 and 255.

    - -

    Example: copy an ASCII string into a buffer, one byte at a time:

    - -
    var sys = require('sys'),
    -  Buffer = require('buffer').Buffer,
    -  str = "node.js",
    -  buf = new Buffer(str.length),
    -  i;
    -
    -for (i = 0; i < str.length ; i += 1) {
    -  buf[i] = str.charCodeAt(i);
    -}
    -
    -sys.puts(buf);
    -
    -// node.js
    -
    - -

    Buffer.byteLength(string, encoding)

    - -

    Gives the actual byte length of a string. This is not the same as -String.prototype.length since that returns the number of characters in a -string.

    - -

    Example:

    - -
    var sys = require('sys'),
    -  Buffer = require('buffer').Buffer,
    -  str = '\u00bd + \u00bc = \u00be';
    -
    -sys.puts(str + ": " + str.length + " characters, " + 
    -  Buffer.byteLength(str, 'utf8') + " bytes");
    -
    -// ½ + ¼ = ¾: 9 characters, 12 bytes
    -
    - -

    buffer.length

    - -

    The size of the buffer in bytes. Note that this is not necessarily the size -of the contents. length refers to the amount of memory allocated for the -buffer object. It does not change when the contents of the buffer are changed.

    - -
    var sys = require('sys'),
    -  Buffer = require('buffer').Buffer,
    -  buf = new Buffer(1234);
    -
    -sys.puts(buf.length);
    -buf.write("some string", "ascii", 0);
    -sys.puts(buf.length);
    -
    -// 1234
    -// 1234
    -
    - -

    buffer.copy(targetBuffer, targetStart, sourceStart, sourceEnd)

    - -

    Does a memcpy() between buffers.

    - -

    Example: build two Buffers, then copy buf1 from byte 16 through byte 20 -into buf2, starting at the 8th byte in buf2.

    - -
    var sys = require('sys'),
    -  Buffer = require('buffer').Buffer,
    -  buf1 = new Buffer(26),
    -  buf2 = new Buffer(26),
    -  i;
    -
    -for (i = 0 ; i < 26 ; i += 1) {
    -  buf1[i] = i + 97; // 97 is ASCII a
    -  buf2[i] = 33; // ASCII !
    -}
    -
    -buf1.copy(buf2, 8, 16, 20);
    -sys.puts(buf2.toString('ascii', 0, 25));
    -
    -// !!!!!!!!qrst!!!!!!!!!!!!!
    -
    - -

    buffer.slice(start, end)

    - -

    Returns a new buffer which references the -same memory as the old, but offset and cropped by the start and end -indexes.

    - -

    Modifying the new buffer slice will modify memory in the original buffer!

    - -

    Example: build a Buffer with the ASCII alphabet, take a slice, then modify one byte -from the original Buffer.

    - -
    var sys = require('sys'),
    -  Buffer = require('buffer').Buffer,
    -  buf1 = new Buffer(26), buf2,
    -  i;
    -
    -for (i = 0 ; i < 26 ; i += 1) {
    -  buf1[i] = i + 97; // 97 is ASCII a
    -}
    -
    -buf2 = buf1.slice(0, 3);
    -sys.puts(buf2.toString('ascii', 0, buf2.length));
    -buf1[0] = 33;
    -sys.puts(buf2.toString('ascii', 0, buf2.length));
    -
    -// abc
    -// !bc
    -
    - -

    EventEmitter

    - -

    Many objects in Node emit events: a TCP server emits an event each time -there is a stream, a child process emits an event when it exits. All -objects which emit events are instances of events.EventEmitter.

    - -

    Events are represented by a camel-cased string. Here are some examples: -'stream', 'data', 'messageBegin'.

    - -

    Functions can be then be attached to objects, to be executed when an event -is emitted. These functions are called listeners.

    - -

    require('events').EventEmitter to access the EventEmitter class.

    - -

    All EventEmitters emit the event 'newListener' when new listeners are -added.

    - -

    When an EventEmitter experiences an error, the typical action is to emit an -'error' event. Error events are special--if there is no handler for them -they will print a stack trace and exit the program.

    - -

    Event: 'newListener'

    - -

    function (event, listener) { }

    - -

    This event is made any time someone adds a new listener.

    - -

    Event: 'error'

    - -

    function (exception) { }

    - -

    If an error was encountered, then this event is emitted. This event is -special - when there are no listeners to receive the error Node will -terminate execution and display the exception's stack trace.

    - -

    emitter.addListener(event, listener)

    - -

    Adds a listener to the end of the listeners array for the specified event.

    - -
    server.addListener('stream', function (stream) {
    -  sys.puts('someone connected!');
    -});
    -
    - -

    emitter.removeListener(event, listener)

    - -

    Remove a listener from the listener array for the specified event. -Caution: changes array indices in the listener array behind the listener.

    - -

    emitter.removeAllListeners(event)

    - -

    Removes all listeners from the listener array for the specified event.

    - -

    emitter.listeners(event)

    - -

    Returns an array of listeners for the specified event. This array can be -manipulated, e.g. to remove listeners.

    - -

    emitter.emit(event, arg1, arg2, ...)

    - -

    Execute each of the listeners in order with the supplied arguments.

    - -

    Streams

    - -

    A stream is an abstract interface implemented by various objects in Node. -For example a request to an HTTP server is a stream, as is stdout. Streams -are readable, writable, or both. All streams are instances of EventEmitter.

    - -

    Readable Stream

    - -

    A readable stream has the following methods, members, and events.

    - -

    Event: 'data'

    - -

    function (data) { }

    - -

    The 'data' event emits either a Buffer (by default) or a string if -setEncoding() was used.

    - -

    Event: 'end'

    - -

    function () { }

    - -

    Emitted when the stream has received an EOF (FIN in TCP terminology). -Indicates that no more 'data' events will happen. If the stream is also -writable, it may be possible to continue writing.

    - -

    Event: 'error'

    - -

    function (exception) { }

    - -

    Emitted if there was an error receiving data.

    - -

    Event: 'close'

    - -

    function () { }

    - -

    Emitted when the underlying file descriptor has be closed. Not all streams -will emit this. (For example, an incoming HTTP request will not emit -'close'.)

    - -

    stream.setEncoding(encoding)

    - -

    Makes the data event emit a string instead of a Buffer. encoding can be -'utf8', 'ascii', or 'binary'.

    - -

    stream.pause()

    - -

    Pauses the incoming 'data' events.

    - -

    stream.resume()

    - -

    Resumes the incoming 'data' events after a pause().

    - -

    stream.destroy()

    - -

    Closes the underlying file descriptor. Stream will not emit any more events.

    - -

    Writable Stream

    - -

    A writable stream has the following methods, members, and events.

    - -

    Event: 'drain'

    - -

    function () { }

    - -

    Emitted after a write() method was called that returned false to -indicate that it is safe to write again.

    - -

    Event: 'error'

    - -

    function (exception) { }

    - -

    Emitted on error with the exception exception.

    - -

    Event: 'close'

    - -

    function () { }

    - -

    Emitted when the underlying file descriptor has been closed.

    - -

    stream.write(string, encoding)

    - -

    Writes string with the given encoding to the stream. Returns true if -the string has been flushed to the kernel buffer. Returns false to -indicate that the kernel buffer is full, and the data will be sent out in -the future. The 'drain' event will indicate when the kernel buffer is -empty again. The encoding defaults to 'utf8'.

    - -

    stream.write(buffer)

    - -

    Same as the above except with a raw buffer.

    - -

    stream.end()

    - -

    Terminates the stream with EOF or FIN.

    - -

    stream.end(string, encoding)

    - -

    Sends string with the given encoding and terminates the stream with EOF -or FIN. This is useful to reduce the number of packets sent.

    - -

    stream.end(buffer)

    - -

    Same as above but with a buffer.

    - -

    stream.destroy()

    - -

    Closes the underlying file descriptor. Stream will not emit any more events.

    - -

    Global Objects

    - -

    These object are available in the global scope and can be accessed from anywhere.

    - -

    global

    - -

    The global namespace object.

    - -

    process

    - -

    The process object. Most stuff lives in here. See the 'process object' -section.

    - -

    require()

    - -

    To require modules. See the 'Modules' section.

    - -

    require.paths

    - -

    An array of search paths for require(). This array can be modified to add custom paths.

    - -

    Example: add a new path to the beginning of the search list

    - -
    var sys = require('sys');
    -
    -require.paths.unshift('/usr/local/node');
    -sys.puts(require.paths);
    -// /usr/local/node,/Users/mjr/.node_libraries
    -
    - -

    __filename

    - -

    The filename of the script being executed. This is the absolute path, and not necessarily -the same filename passed in as a command line argument.

    - -

    __dirname

    - -

    The dirname of the script being executed.

    - -

    Example: running node example.js from /Users/mjr

    - -
    var sys = require('sys');
    -sys.puts(__filename);
    -sys.puts(__dirname);
    -// /Users/mjr/example.js
    -// /Users/mjr
    -
    - -

    module

    - -

    A reference to the current module (of type process.Module). In particular -module.exports is the same as the exports object. See src/process.js -for more information.

    - -

    process

    - -

    The process object is a global object and can be accessed from anywhere. -It is an instance of EventEmitter.

    - -

    Event: 'exit'

    - -

    function () {}

    - -

    Emitted when the process is about to exit. This is a good hook to perform -constant time checks of the module's state (like for unit tests). The main -event loop will no longer be run after the 'exit' callback finishes, so -timers may not be scheduled.

    - -

    Example of listening for exit:

    - -
    var sys = require('sys');
    -
    -process.addListener('exit', function () {
    -  process.nextTick(function () {
    -   sys.puts('This will not run');
    -  });
    -  sys.puts('About to exit.');
    -});
    -
    - -

    Event: 'uncaughtException'

    - -

    function (err) { }

    - -

    Emitted when an exception bubbles all the way back to the event loop. If a -listener is added for this exception, the default action (which is to print -a stack trace and exit) will not occur.

    - -

    Example of listening for uncaughtException:

    - -
    var sys = require('sys');
    -
    -process.addListener('uncaughtException', function (err) {
    -  sys.puts('Caught exception: ' + err);
    -});
    -
    -setTimeout(function () {
    -  sys.puts('This will still run.');
    -}, 500);
    -
    -// Intentionally cause an exception, but don't catch it.
    -nonexistentFunc();
    -sys.puts('This will not run.');
    -
    - -

    Note that uncaughtException is a very crude mechanism for exception -handling. Using try / catch in your program will give you more control over -your program's flow. Especially for server programs that are designed to -stay running forever, uncaughtException can be a useful safety mechanism.

    - -

    Signal Events

    - -

    function () {}

    - -

    Emitted when the processes receives a signal. See sigaction(2) for a list of -standard POSIX signal names such as SIGINT, SIGUSR1, etc.

    - -

    Example of listening for SIGINT:

    - -
    var sys = require('sys'),
    -    stdin = process.openStdin();
    -
    -process.addListener('SIGINT', function () {
    -  sys.puts('Got SIGINT.  Press Control-D to exit.');
    -});
    -
    - -

    An easy way to send the SIGINT signal is with Control-C in most terminal -programs.

    - -

    process.stdout

    - -

    A writable stream to stdout.

    - -

    Example: the definition of sys.puts

    - -
    exports.puts = function (d) {
    -  process.stdout.write(d + '\n');
    -};
    -
    - -

    process.openStdin()

    - -

    Opens the standard input stream, returns a readable stream.

    - -

    Example of opening standard input and listening for both events:

    - -
    var stdin = process.openStdin();
    -
    -stdin.setEncoding('utf8');
    -
    -stdin.addListener('data', function (chunk) {
    -  process.stdout.write('data: ' + chunk);
    -});
    -
    -stdin.addListener('end', function () {
    -  process.stdout.write('end');
    -});
    -
    - -

    process.argv

    - -

    An array containing the command line arguments. The first element will be -'node', the second element will be the name of the JavaScript file. The -next elements will be any additional command line arguments.

    - -
    // print process.argv
    -var sys = require('sys');
    -
    -process.argv.forEach(function (val, index, array) {
    -  sys.puts(index + ': ' + val);
    -});
    -
    - -

    This will generate:

    - -
    $ node process-2.js one two=three four
    -0: node
    -1: /Users/mjr/work/node/process-2.js
    -2: one
    -3: two=three
    -4: four
    -
    - -

    process.chdir(directory)

    - -

    Changes the current working directory of the process or throws an exception if that fails.

    - -
    var sys = require('sys');
    -
    -sys.puts('Starting directory: ' + process.cwd());
    -try {
    -  process.chdir('/tmp');
    -  sys.puts('New directory: ' + process.cwd());
    -}
    -catch (err) {
    -  sys.puts('chdir: ' + err);
    -}
    -
    - -

    process.compile(code, filename)

    - -

    Similar to eval except that you can specify a filename for better -error reporting and the code cannot see the local scope. The value of filename -will be used as a filename if a stack trace is generated by the compiled code.

    - -

    Example of using process.compile and eval to run the same code:

    - -
    var sys = require('sys'),
    -    localVar = 123,
    -    compiled, evaled;
    -
    -compiled = process.compile('localVar = 1;', 'myfile.js');
    -sys.puts('localVar: ' + localVar + ', compiled: ' + compiled);
    -evaled = eval('localVar = 1;');
    -sys.puts('localVar: ' + localVar + ', evaled: ' + evaled);
    -
    -// localVar: 123, compiled: 1
    -// localVar: 1, evaled: 1
    -
    - -

    process.compile does not have access to the local scope, so localVar is unchanged. -eval does have access to the local scope, so localVar is changed.

    - -

    In case of syntax error in code, process.compile exits node.

    - -

    See also: Script

    - -

    process.cwd()

    - -

    Returns the current working directory of the process.

    - -
    require('sys').puts('Current directory: ' + process.cwd());
    -
    - -

    process.env

    - -

    An object containing the user environment. See environ(7).

    - -

    process.exit(code)

    - -

    Ends the process with the specified code. If omitted, exit uses the -'success' code 0.

    - -

    To exit with a 'failure' code:

    - -
    process.exit(1);
    -
    - -

    The shell that executed node should see the exit code as 1.

    - -

    process.getgid(), process.setgid(id)

    - -

    Gets/sets the group identity of the process. (See setgid(2).) This is the numerical group id, not the group name.

    - -
    var sys = require('sys');
    -
    -sys.puts('Current gid: ' + process.getgid());
    -try {
    -  process.setgid(501);
    -  sys.puts('New gid: ' + process.getgid());
    -}
    -catch (err) {
    -  sys.puts('Failed to set gid: ' + err);
    -}
    -
    - -

    process.getuid(), process.setuid(id)

    - -

    Gets/sets the user identity of the process. (See setuid(2).) This is the numerical userid, not the username.

    - -
    var sys = require('sys');
    -
    -sys.puts('Current uid: ' + process.getuid());
    -try {
    -  process.setuid(501);
    -  sys.puts('New uid: ' + process.getuid());
    -}
    -catch (err) {
    -  sys.puts('Failed to set uid: ' + err);
    -}
    -
    - -

    process.version

    - -

    A compiled-in property that exposes NODE_VERSION.

    - -
    require('sys').puts('Version: ' + process.version);
    -
    - -

    process.installPrefix

    - -

    A compiled-in property that exposes NODE_PREFIX.

    - -
    require('sys').puts('Prefix: ' + process.installPrefix);
    -
    - -

    process.kill(pid, signal)

    - -

    Send a signal to a process. pid is the process id and signal is the -string describing the signal to send. Signal names are strings like -'SIGINT' or 'SIGUSR1'. If omitted, the signal will be 'SIGINT'. -See kill(2) for more information.

    - -

    Note that just because the name of this function is process.kill, it is -really just a signal sender, like the kill system call. The signal sent -may do something other than kill the target process.

    - -

    Example of sending a signal to yourself:

    - -
    var sys = require('sys');
    -
    -process.addListener('SIGHUP', function () {
    -  sys.puts('Got SIGHUP signal.');
    -});
    -
    -setTimeout(function () {
    -  sys.puts('Exiting.');
    -  process.exit(0);
    -}, 100);
    -
    -process.kill(process.pid, 'SIGHUP');
    -
    - -

    process.pid

    - -

    The PID of the process.

    - -
    require('sys').puts('This process is pid ' + process.pid);
    -
    - -

    process.platform

    - -

    What platform you're running on. 'linux2', 'darwin', etc.

    - -
    require('sys').puts('This platform is ' + process.platform);
    -
    - -

    process.memoryUsage()

    - -

    Returns an object describing the memory usage of the Node process.

    - -
    var sys = require('sys');
    -
    -sys.puts(sys.inspect(process.memoryUsage()));
    -
    - -

    This will generate:

    - -
    { rss: 4935680
    -, vsize: 41893888
    -, heapTotal: 1826816
    -, heapUsed: 650472
    -}
    -
    - -

    heapTotal and heapUsed refer to V8's memory usage.

    - -

    process.nextTick(callback)

    - -

    On the next loop around the event loop call this callback. -This is not a simple alias to setTimeout(fn, 0), it's much more -efficient.

    - -
    var sys = require('sys');
    -
    -process.nextTick(function () {
    -  sys.puts('nextTick callback');
    -});
    -
    - -

    process.umask(mask)

    - -

    Sets or read the process's file mode creation mask. Child processes inherit -the mask from the parent process. Returns the old mask if mask argument is -given, otherwise returns the current mask.

    - -
    var sys = require('sys'),
    -    oldmask, newmask = 0644;
    -
    -oldmask = process.umask(newmask);
    -sys.puts('Changed umask from: ' + oldmask.toString(8) +
    -         ' to ' + newmask.toString(8));
    -
    - -

    sys

    - -

    These functions are in the module 'sys'. Use require('sys') to access -them.

    - -

    sys.puts(string)

    - -

    Outputs string and a trailing newline to stdout.

    - -
    require('sys').puts('String with a newline');
    -
    - -

    sys.print(string)

    - -

    Like puts() but without the trailing newline.

    - -
    require('sys').print('String with no newline');
    -
    - -

    sys.debug(string)

    - -

    A synchronous output function. Will block the process and -output string immediately to stderr.

    - -
    require('sys').debug('message on stderr');
    -
    - -

    sys.log(string)

    - -

    Output with timestamp on stdout.

    - -
    require('sys').log('Timestmaped message.');
    -
    - -

    sys.inspect(object, showHidden, depth)

    - -

    Return a string representation of object, which is useful for debugging.

    - -

    If showHidden is true, then the object's non-enumerable properties will be -shown too.

    - -

    If depth is provided, it tells inspect how many times to recurse while -formatting the object. This is useful for inspecting large complicated objects.

    - -

    The default is to only recurse twice. To make it recurse indefinitely, pass -in null for depth.

    - -

    Example of inspecting all properties of the sys object:

    - -
    var sys = require('sys');
    -
    -sys.puts(sys.inspect(sys, true, null));
    -
    - -

    Timers

    - -

    setTimeout(callback, delay, [arg, ...])

    - -

    To schedule execution of callback after delay milliseconds. Returns a -timeoutId for possible use with clearTimeout().

    - -

    clearTimeout(timeoutId)

    - -

    Prevents a timeout from triggering.

    - -

    setInterval(callback, delay, [arg, ...])

    - -

    To schedule the repeated execution of callback every delay milliseconds. -Returns a intervalId for possible use with clearInterval().

    - -

    Optionally, you can also pass arguments to the callback.

    - -

    clearInterval(intervalId)

    - -

    Stops a interval from triggering.

    - -

    Child Processes

    - -

    Node provides a tri-directional popen(3) facility through the ChildProcess -class.

    - -

    It is possible to stream data through the child's stdin, stdout, and -stderr in a fully non-blocking way.

    - -

    To create a child process use require('child_process').spawn().

    - -

    Child processes always have three streams associated with them. child.stdin, -child.stdout, and child.stderr.

    - -

    ChildProcess is an EventEmitter.

    - -

    Event: 'exit'

    - -

    function (code, signal) {}

    - -

    This event is emitted after the child process ends. If the process terminated -normally, code is the final exit code of the process, otherwise null. If -the process terminated due to receipt of a signal, signal is the string name -of the signal, otherwise null.

    - -

    After this event is emitted, the 'output' and 'error' callbacks will no -longer be made.

    - -

    See waitpid(2).

    - -

    child_process.spawn(command, args, env)

    - -

    Launches a new process with the given command, command line arguments, and -environment variables. If omitted, args defaults to an empty Array, and env -defaults to process.env.

    - -

    Example of running ls -lh /usr, capturing stdout, stderr, and the exit code:

    - -
    var sys   = require('sys'),
    -    spawn = require('child_process').spawn,
    -    ls    = spawn('ls', ['-lh', '/usr']);
    -
    -ls.stdout.addListener('data', function (data) {
    -  sys.print('stdout: ' + data);
    -});
    -
    -ls.stderr.addListener('data', function (data) {
    -  sys.print('stderr: ' + data);
    -});
    -
    -ls.addListener('exit', function (code) {
    -  sys.puts('child process exited with code ' + code);
    -});
    -
    - -

    Example of checking for failed exec:

    - -
    var sys   = require('sys'),
    -    spawn = require('child_process').spawn,
    -    child = spawn('bad_command');
    -
    -child.stderr.addListener('data', function (data) {
    -  if (/^execvp\(\)/.test(data.asciiSlice(0,data.length))) {
    -    sys.puts('Failed to start child process.');
    -  }
    -});
    -
    - -

    See also: child_process.exec()

    - -

    child.kill(signal)

    - -

    Send a signal to the child process. If no argument is given, the process will -be sent 'SIGTERM'. See signal(7) for a list of available signals.

    - -
    var sys   = require('sys'),
    -    spawn = require('child_process').spawn,
    -    grep  = spawn('grep', ['ssh']);
    -
    -grep.addListener('exit', function (code, signal) {
    -  sys.puts('child process terminated due to receipt of signal '+signal);
    -});
    -
    -// send SIGHUP to process
    -grep.kill('SIGHUP');
    -
    - -

    Note that while the function is called kill, the signal delivered to the child -process may not actually kill it. kill really just sends a signal to a process.

    - -

    See kill(2)

    - -

    child.pid

    - -

    The PID of the child process.

    - -

    Example:

    - -
    var sys   = require('sys'),
    -    spawn = require('child_process').spawn,
    -    grep  = spawn('grep', ['ssh']);
    -
    -sys.puts('Spawned child pid: ' + grep.pid);
    -grep.stdin.end();
    -
    - -

    child.stdin.write(data, encoding)

    - -

    Write data to the child process's stdin. The second argument is optional and -specifies the encoding: possible values are 'utf8', 'ascii', and -'binary'.

    - -

    Example: A very elaborate way to run 'ps ax | grep ssh'

    - -
    var sys   = require('sys'),
    -    spawn = require('child_process').spawn,
    -    ps    = spawn('ps', ['ax']),
    -    grep  = spawn('grep', ['ssh']);
    -
    -ps.stdout.addListener('data', function (data) {
    -  grep.stdin.write(data);
    -});
    -
    -ps.stderr.addListener('data', function (data) {
    -  sys.print('ps stderr: ' + data);
    -});
    -
    -ps.addListener('exit', function (code) {
    -  if (code !== 0) {
    -    sys.puts('ps process exited with code ' + code);
    -  }
    -  grep.stdin.end();
    -});
    -
    -grep.stdout.addListener('data', function (data) {
    -  sys.print(data);
    -});
    -
    -grep.stderr.addListener('data', function (data) {
    -  sys.print('grep stderr: ' + data);
    -});
    -
    -grep.addListener('exit', function (code) {
    -  if (code !== 0) {
    -    sys.puts('grep process exited with code ' + code);
    -  }
    -});
    -
    - -

    child.stdin.end()

    - -

    Closes the child process's stdin stream. This often causes the child process to terminate.

    - -

    Example:

    - -
    var sys   = require('sys'),
    -    spawn = require('child_process').spawn,
    -    grep  = spawn('grep', ['ssh']);
    -
    -grep.addListener('exit', function (code) {
    -  sys.puts('child process exited with code ' + code);
    -});
    -
    -grep.stdin.end();
    -
    - -

    child_process.exec(command, [options, ] callback)

    - -

    High-level way to execute a command as a child process, buffer the -output, and return it all in a callback.

    - -
    var sys   = require('sys'),
    -    exec  = require('child_process').exec,
    -    child;
    -
    -child = exec('cat *.js bad_file | wc -l', 
    -  function (error, stdout, stderr) {
    -    sys.print('stdout: ' + stdout);
    -    sys.print('stderr: ' + stderr);
    -    if (error !== null) {
    -      sys.puts('exec error: ' + error);
    -    }
    -  });
    -
    - -

    The callback gets the arguments (error, stdout, stderr). On success, error -will be null. On error, error will be an instance of Error and err.code -will be the exit code of the child process, and err.signal will be set to the -signal that terminated the process.

    - -

    There is a second optional argument to specify several options. The default options are

    - -
    { encoding: 'utf8'
    -, timeout: 0
    -, maxBuffer: 200*1024
    -, killSignal: 'SIGKILL'
    -}
    -
    - -

    If timeout is greater than 0, then it will kill the child process -if it runs longer than timeout milliseconds. The child process is killed with -killSignal (default: 'SIGKILL'). maxBuffer specifies the largest -amount of data allowed on stdout or stderr - if this value is exceeded then -the child process is killed.

    - -

    Script

    - -

    Script class compiles and runs JavaScript code. You can access this class with:

    - -
    var Script = process.binding('evals').Script;
    -
    - -

    New JavaScript code can be compiled and run immediately or compiled, saved, and run later.

    - -

    Script.runInThisContext(code, filename)

    - -

    Similar to process.compile. Script.runInThisContext compiles code as if it were loaded from filename, -runs it and returns the result. Running code does not have access to local scope. filename is optional.

    - -

    Example of using Script.runInThisContext and eval to run the same code:

    - -
    var sys = require('sys'),
    -    localVar = 123,
    -    usingscript, evaled,
    -    Script = process.binding('evals').Script;
    -
    -usingscript = Script.runInThisContext('localVar = 1;',
    -  'myfile.js');
    -sys.puts('localVar: ' + localVar + ', usingscript: ' +
    -  usingscript);
    -evaled = eval('localVar = 1;');
    -sys.puts('localVar: ' + localVar + ', evaled: ' +
    -  evaled);
    -
    -// localVar: 123, usingscript: 1
    -// localVar: 1, evaled: 1
    -
    - -

    Script.runInThisContext does not have access to the local scope, so localVar is unchanged. -eval does have access to the local scope, so localVar is changed.

    - -

    In case of syntax error in code, Script.runInThisContext emits the syntax error to stderr -and throws.an exception.

    - -

    Script.runInNewContext(code, sandbox, filename)

    - -

    Script.runInNewContext compiles code to run in sandbox as if it were loaded from filename, -then runs it and returns the result. Running code does not have access to local scope and -the object sandbox will be used as the global object for code. -sandbox and filename are optional.

    - -

    Example: compile and execute code that increments a global variable and sets a new one. -These globals are contained in the sandbox.

    - -
    var sys = require('sys'),
    -    Script = process.binding('evals').Script,
    -    sandbox = {
    -      animal: 'cat',
    -      count: 2
    -    };
    -
    -Script.runInNewContext(
    -  'count += 1; name = "kitty"', sandbox, 'myfile.js');
    -sys.puts(sys.inspect(sandbox));
    -
    -// { animal: 'cat', count: 3, name: 'kitty' }
    -
    - -

    Note that running untrusted code is a tricky business requiring great care. To prevent accidental -global variable leakage, Script.runInNewContext is quite useful, but safely running untrusted code -requires a separate process.

    - -

    In case of syntax error in code, Script.runInThisContext emits the syntax error to stderr -and throws an exception.

    - -

    new Script(code, filename)

    - -

    new Script compiles code as if it were loaded from filename, -but does not run it. Instead, it returns a Script object representing this compiled code. -This script can be run later many times using methods below. -The returned script is not bound to any global object. -It is bound before each run, just for that run. filename is optional.

    - -

    In case of syntax error in code, new Script emits the syntax error to stderr -and throws an exception.

    - -

    script.runInThisContext()

    - -

    Similar to Script.runInThisContext (note capital 'S'), but now being a method of a precompiled Script object. -script.runInThisContext runs the code of script and returns the result. -Running code does not have access to local scope, but does have access to the global object -(v8: in actual context).

    - -

    Example of using script.runInThisContext to compile code once and run it multiple times:

    - -
    var sys = require('sys'),
    -    Script = process.binding('evals').Script,
    -    scriptObj, i;
    -
    -globalVar = 0;
    -
    -scriptObj = new Script('globalVar += 1', 'myfile.js');
    -
    -for (i = 0; i < 1000 ; i += 1) {
    -  scriptObj.runInThisContext();
    -}
    -
    -sys.puts(globalVar);
    -
    -// 1000
    -
    - -

    script.runInNewContext(sandbox)

    - -

    Similar to Script.runInNewContext (note capital 'S'), but now being a method of a precompiled Script object. -script.runInNewContext runs the code of script with sandbox as the global object and returns the result. -Running code does not have access to local scope. sandbox is optional.

    - -

    Example: compile code that increments a global variable and sets one, then execute this code multiple times. -These globals are contained in the sandbox.

    - -
    var sys = require('sys'),
    -    Script = process.binding('evals').Script,
    -    scriptObj, i,
    -    sandbox = {
    -      animal: 'cat',
    -      count: 2
    -    };
    -
    -scriptObj = new Script(
    -    'count += 1; name = "kitty"', 'myfile.js');
    -
    -for (i = 0; i < 10 ; i += 1) {
    -  scriptObj.runInNewContext(sandbox);
    -}
    -
    -sys.puts(sys.inspect(sandbox));
    -
    -// { animal: 'cat', count: 12, name: 'kitty' }
    -
    - -

    Note that running untrusted code is a tricky business requiring great care. To prevent accidental -global variable leakage, script.runInNewContext is quite useful, but safely running untrusted code -requires a separate process.

    - -

    File System

    - -

    File I/O is provided by simple wrappers around standard POSIX functions. To -use this module do require('fs'). All the methods have asynchronous and -synchronous forms.

    - -

    The asynchronous form always take a completion callback as its last argument. -The arguments passed to the completion callback depend on the method, but the -first argument is always reserved for an exception. If the operation was -completed successfully, then the first argument will be null or undefined.

    - -

    Here is an example of the asynchronous version:

    - -
    var fs = require('fs'),
    -    sys = require('sys');
    -
    -fs.unlink('/tmp/hello', function (err) {
    -  if (err) throw err;
    -  sys.puts('successfully deleted /tmp/hello');
    -});
    -
    - -

    Here is the synchronous version:

    - -
    var fs = require('fs'),
    -    sys = require('sys');
    -
    -fs.unlinkSync('/tmp/hello')
    -sys.puts('successfully deleted /tmp/hello');
    -
    - -

    With the asynchronous methods there is no guaranteed ordering. So the -following is prone to error:

    - -
    fs.rename('/tmp/hello', '/tmp/world', function (err) {
    -  if (err) throw err;
    -  sys.puts('renamed complete');
    -});
    -fs.stat('/tmp/world', function (err, stats) {
    -  if (err) throw err;
    -  sys.puts('stats: ' + JSON.stringify(stats));
    -});
    -
    - -

    It could be that fs.stat is executed before fs.rename. -The correct way to do this is to chain the callbacks.

    - -
    fs.rename('/tmp/hello', '/tmp/world', function (err) {
    -  if (err) throw err;
    -  fs.stat('/tmp/world', function (err, stats) {
    -    if (err) throw err;
    -    sys.puts('stats: ' + JSON.stringify(stats));
    -  });
    -});
    -
    - -

    In busy processes, the programmer is strongly encouraged to use the -asynchronous versions of these calls. The synchronous versions will block -the entire process until they complete--halting all connections.

    - -

    fs.rename(path1, path2, callback)

    - -

    Asynchronous rename(2). No arguments other than a possible exception are given to the completion callback.

    - -

    fs.renameSync(path1, path2)

    - -

    Synchronous rename(2).

    - -

    fs.truncate(fd, len, callback)

    - -

    Asynchronous ftruncate(2). No arguments other than a possible exception are given to the completion callback.

    - -

    fs.truncateSync(fd, len)

    - -

    Synchronous ftruncate(2).

    - -

    fs.chmod(path, mode, callback)

    - -

    Asynchronous chmod(2). No arguments other than a possible exception are given to the completion callback.

    - -

    fs.chmodSync(path, mode)

    - -

    Synchronous chmod(2).

    - -

    fs.stat(path, callback), fs.lstat(path, callback), fs.fstat(fd, callback)

    - -

    Asynchronous stat(2), lstat(2) or fstat(2). The callback gets two arguments (err, stats) where stats is a fs.Stats object. It looks like this:

    - -
    { dev: 2049
    -, ino: 305352
    -, mode: 16877
    -, nlink: 12
    -, uid: 1000
    -, gid: 1000
    -, rdev: 0
    -, size: 4096
    -, blksize: 4096
    -, blocks: 8
    -, atime: '2009-06-29T11:11:55Z'
    -, mtime: '2009-06-29T11:11:40Z'
    -, ctime: '2009-06-29T11:11:40Z' 
    -}
    -
    - -

    See the fs.Stats section below for more information.

    - -

    fs.statSync(path), fs.lstatSync(path), fs.fstatSync(fd)

    - -

    Synchronous stat(2), lstat(2) or fstat(2). Returns an instance of fs.Stats.

    - -

    fs.link(srcpath, dstpath, callback)

    - -

    Asynchronous link(2). No arguments other than a possible exception are given to the completion callback.

    - -

    fs.linkSync(dstpath, srcpath)

    - -

    Synchronous link(2).

    - -

    fs.symlink(linkdata, path, callback)

    - -

    Asynchronous symlink(2). No arguments other than a possible exception are given to the completion callback.

    - -

    fs.symlinkSync(linkdata, path)

    - -

    Synchronous symlink(2).

    - -

    fs.readlink(path, callback)

    - -

    Asynchronous readlink(2). The callback gets two arguments (err, resolvedPath).

    - -

    fs.readlinkSync(path)

    - -

    Synchronous readlink(2). Returns the resolved path.

    - -

    fs.realpath(path, callback)

    - -

    Asynchronous realpath(2). The callback gets two arguments (err, resolvedPath).

    - -

    fs.realpathSync(path)

    - -

    Synchronous realpath(2). Returns the resolved path.

    - -

    fs.unlink(path, callback)

    - -

    Asynchronous unlink(2). No arguments other than a possible exception are given to the completion callback.

    - -

    fs.unlinkSync(path)

    - -

    Synchronous unlink(2).

    - -

    fs.rmdir(path, callback)

    - -

    Asynchronous rmdir(2). No arguments other than a possible exception are given to the completion callback.

    - -

    fs.rmdirSync(path)

    - -

    Synchronous rmdir(2).

    - -

    fs.mkdir(path, mode, callback)

    - -

    Asynchronous mkdir(2). No arguments other than a possible exception are given to the completion callback.

    - -

    fs.mkdirSync(path, mode)

    - -

    Synchronous mkdir(2).

    - -

    fs.readdir(path, callback)

    - -

    Asynchronous readdir(3). Reads the contents of a directory. -The callback gets two arguments (err, files) where files is an array of -the names of the files in the directory excluding '.' and '..'.

    - -

    fs.readdirSync(path)

    - -

    Synchronous readdir(3). Returns an array of filenames excluding '.' and -'..'.

    - -

    fs.close(fd, callback)

    - -

    Asynchronous close(2). No arguments other than a possible exception are given to the completion callback.

    - -

    fs.closeSync(fd)

    - -

    Synchronous close(2).

    - -

    fs.open(path, flags, mode, callback)

    - -

    Asynchronous file open. See open(2). Flags can be 'r', 'r+', 'w', 'w+', 'a', -or 'a+'. The callback gets two arguments (err, fd).

    - -

    fs.openSync(path, flags, mode)

    - -

    Synchronous open(2).

    - -

    fs.write(fd, buffer, offset, length, position, callback)

    - -

    Write buffer to the file specified by fd.

    - -

    offset and length determine the part of the buffer to be written.

    - -

    position refers to the offset from the beginning of the file where this data -should be written. If position is null, the data will be written at the -current position. -See pwrite(2).

    - -

    The callback will be given two arguments (err, written) where written -specifies how many bytes were written.

    - -

    fs.writeSync(fd, data, position, encoding)

    - -

    Synchronous version of fs.write(). Returns the number of bytes written.

    - -

    fs.read(fd, buffer, offset, length, position, callback)

    - -

    Read data from the file specified by fd.

    - -

    buffer is the buffer that the data will be written to.

    - -

    offset is offset within the buffer where writing will start.

    - -

    length is an integer specifying the number of bytes to read.

    - -

    position is an integer specifying where to begin reading from in the file. -If position is null, data will be read from the current file position.

    - -

    The callback is given the two arguments, (err, bytesRead).

    - -

    fs.readSync(fd, buffer, offset, length, position)

    - -

    Synchronous version of fs.read. Returns the number of bytesRead.

    - -

    fs.readFile(filename, [encoding,] callback)

    - -

    Asynchronously reads the entire contents of a file. Example:

    - -
    fs.readFile('/etc/passwd', function (err, data) {
    -  if (err) throw err;
    -  sys.puts(data);
    -});
    -
    - -

    The callback is passed two arguments (err, data), where data is the -contents of the file.

    - -

    If no encoding is specified, then the raw buffer is returned.

    - -

    fs.readFileSync(filename [, encoding])

    - -

    Synchronous version of fs.readFile. Returns the contents of the filename.

    - -

    If encoding is specified then this function returns a string. Otherwise it -returns a buffer.

    - -

    fs.writeFile(filename, data, encoding='utf8', callback)

    - -

    Asynchronously writes data to a file. Example:

    - -
    fs.writeFile('message.txt', 'Hello Node', function (err) {
    -  if (err) throw err;
    -  sys.puts('It\'s saved!');
    -});
    -
    - -

    fs.writeFileSync(filename, data, encoding='utf8')

    - -

    The synchronous version of fs.writeFile.

    - -

    fs.watchFile(filename, [options,] listener)

    - -

    Watch for changes on filename. The callback listener will be called each -time the file changes.

    - -

    The second argument is optional. The options if provided should be an object -containing two members a boolean, persistent, and interval, a polling -value in milliseconds. The default is {persistent: true, interval: 0}.

    - -

    The listener gets two arguments the current stat object and the previous -stat object:

    - -
    fs.watchFile(f, function (curr, prev) {
    -  sys.puts('the current mtime is: ' + curr.mtime);
    -  sys.puts('the previous mtime was: ' + prev.mtime);
    -});
    -
    - -

    These stat objects are instances of fs.Stat.

    - -

    fs.unwatchFile(filename)

    - -

    Stop watching for changes on filename.

    - -

    fs.Stats

    - -

    Objects returned from fs.stat() and fs.lstat() are of this type.

    - -
      -
    • stats.isFile()
    • -
    • stats.isDirectory()
    • -
    • stats.isBlockDevice()
    • -
    • stats.isCharacterDevice()
    • -
    • stats.isSymbolicLink() (only valid with fs.lstat())
    • -
    • stats.isFIFO()
    • -
    • stats.isSocket()
    • -
    - - -

    fs.ReadStream

    - -

    ReadStream is a readable stream.

    - -

    fs.createReadStream(path, [options])

    - -

    Returns a new ReadStream object.

    - -

    options is an object with the following defaults:

    - -
    { 'flags': 'r'
    -, 'encoding': 'binary'
    -, 'mode': 0666
    -, 'bufferSize': 4 * 1024
    -}
    -
    - -

    readStream.readable

    - -

    A boolean that is true by default, but turns false after an 'error' -occured, the stream came to an 'end', or destroy() was called.

    - -

    readStream.pause()

    - -

    Stops the stream from reading further data. No 'data' event will be fired -until the stream is resumed.

    - -

    readStream.resume()

    - -

    Resumes the stream. Together with pause() this useful to throttle reading.

    - -

    readStream.destroy()

    - -

    Allows to close the stream before the 'end' is reached. No more events other -than 'close' will be fired after this method has been called.

    - -

    fs.WriteStream

    - -

    WriteStream is a writable stream.

    - -

    fs.createWriteStream(path, [options])

    - -

    Returns a new WriteStream object. -options is an object with the following defaults:

    - -
    { 'flags': 'w'
    -, 'encoding': 'binary'
    -, 'mode': 0666
    -}
    -
    - -

    writeStream.writeable

    - -

    A boolean that is true by default, but turns false after an 'error' -occurred or end() / destroy() was called.

    - -

    writeStream.write(data, encoding='utf8')

    - -

    Returns true if the data was flushed to the kernel, and false if it was -queued up for being written later. A 'drain' will fire after all queued data -has been written.

    - -

    The second optional parameter specifies the encoding of for the string.

    - -

    writeStream.end()

    - -

    Closes the stream right after all queued write() calls have finished.

    - -

    writeStream.destroy()

    - -

    Allows to close the stream regardless of its current state.

    - -

    HTTP

    - -

    To use the HTTP server and client one must require('http').

    - -

    The HTTP interfaces in Node are designed to support many features -of the protocol which have been traditionally difficult to use. -In particular, large, possibly chunk-encoded, messages. The interface is -careful to never buffer entire requests or responses--the -user is able to stream data.

    - -

    HTTP message headers are represented by an object like this:

    - -
    { 'content-length': '123'
    -, 'content-type': 'text/plain'
    -, 'stream': 'keep-alive'
    -, 'accept': '*/*'
    -}
    -
    - -

    Keys are lowercased. Values are not modified.

    - -

    In order to support the full spectrum of possible HTTP applications, Node's -HTTP API is very low-level. It deals with stream handling and message -parsing only. It parses a message into headers and body but it does not -parse the actual headers or the body.

    - -

    HTTPS is supported if OpenSSL is available on the underlying platform.

    - -

    http.Server

    - -

    This is an EventEmitter with the following events:

    - -

    Event: 'request'

    - -

    function (request, response) { }

    - -

    request is an instance of http.ServerRequest and response is - an instance of http.ServerResponse

    - -

    Event: 'connection'

    - -

    function (stream) { }

    - -

    When a new TCP stream is established. stream is an object of type - net.Stream. Usually users will not want to access this event. The - stream can also be accessed at request.connection.

    - -

    Event: 'close'

    - -

    function (errno) { }

    - -

    Emitted when the server closes.

    - -

    http.createServer(requestListener, [options])

    - -

    Returns a new web server object.

    - -

    The options argument is optional. The -options argument accepts the same values as the -options argument for net.Server.

    - -

    The requestListener is a function which is automatically -added to the 'request' event.

    - -

    Event: 'request'

    - -

    function (request, response) {}

    - -

    Emitted each time there is request. Note that there may be multiple requests -per connection (in the case of keep-alive connections).

    - -

    Event: 'upgrade'

    - -

    function (request, socket, head)

    - -

    Emitted each time a client requests a http upgrade. If this event isn't -listened for, then clients requesting an upgrade will have their connections -closed.

    - -
      -
    • request is the arguments for the http request, as it is in the request event.
    • -
    • socket is the network socket between the server and client.
    • -
    • head is an instance of Buffer, the first packet of the upgraded stream, this may be empty.
    • -
    - - -

    After this event is emitted, the request's socket will not have a data -event listener, meaning you will need to bind to it in order to handle data -sent to the server on that socket.

    - -

    Event: 'clientError'

    - -

    function (exception) {}

    - -

    If a client connection emits an 'error' event - it will forwarded here.

    - -

    server.listen(port, hostname=null, callback=null)

    - -

    Begin accepting connections on the specified port and hostname. If the -hostname is omitted, the server will accept connections directed to any -IPv4 address (INADDR_ANY).

    - -

    To listen to a unix socket, supply a filename instead of port and hostname.

    - -

    This function is asynchronous. The last parameter callback will be called -when the server has been bound to the port.

    - -

    server.listen(path, callback=null)

    - -

    Start a UNIX socket server listening for connections on the given path.

    - -

    This function is asynchronous. The last parameter callback will be called -when the server has been bound.

    - -

    server.setSecure(credentials)

    - -

    Enables HTTPS support for the server, with the crypto module credentials specifying the private key and certificate of the server, and optionally the CA certificates for use in client authentication.

    - -

    If the credentials hold one or more CA certificates, then the server will request for the client to submit a client certificate as part of the HTTPS connection handshake. The validity and content of this can be accessed via verifyPeer() and getPeerCertificate() from the server's request.connection.

    - -

    server.close()

    - -

    Stops the server from accepting new connections.

    - -

    http.ServerRequest

    - -

    This object is created internally by a HTTP server--not by -the user--and passed as the first argument to a 'request' listener.

    - -

    This is an EventEmitter with the following events:

    - -

    Event: 'data'

    - -

    function (chunk) { }

    - -

    Emitted when a piece of the message body is received.

    - -

    Example: A chunk of the body is given as the single -argument. The transfer-encoding has been decoded. The -body chunk is a string. The body encoding is set with -request.setBodyEncoding().

    - -

    Event: 'end'

    - -

    function () { }

    - -

    Emitted exactly once for each message. No arguments. After -emitted no other events will be emitted on the request.

    - -

    request.method

    - -

    The request method as a string. Read only. Example: -'GET', 'DELETE'.

    - -

    request.url

    - -

    Request URL string. This contains only the URL that is -present in the actual HTTP request. If the request is:

    - -
    GET /status?name=ryan HTTP/1.1\r\n
    -Accept: text/plain\r\n
    -\r\n
    -
    - -

    Then request.url will be:

    - -
    '/status?name=ryan'
    -
    - -

    If you would like to parse the URL into its parts, you can use -require('url').parse(request.url). Example:

    - -
    node> require('url').parse('/status?name=ryan')
    -{ href: '/status?name=ryan'
    -, search: '?name=ryan'
    -, query: 'name=ryan'
    -, pathname: '/status'
    -}
    -
    - -

    If you would like to extract the params from the query string, -you can use the require('querystring').parse function, or pass -true as the second argument to require('url').parse. Example:

    - -
    node> require('url').parse('/status?name=ryan', true)
    -{ href: '/status?name=ryan'
    -, search: '?name=ryan'
    -, query: { name: 'ryan' }
    -, pathname: '/status'
    -}
    -
    - -

    request.headers

    - -

    Read only.

    - -

    request.httpVersion

    - -

    The HTTP protocol version as a string. Read only. Examples: -'1.1', '1.0'. -Also request.httpVersionMajor is the first integer and -request.httpVersionMinor is the second.

    - -

    request.setEncoding(encoding='binary')

    - -

    Set the encoding for the request body. Either 'utf8' or 'binary'. Defaults -to 'binary'.

    - -

    request.pause()

    - -

    Pauses request from emitting events. Useful to throttle back an upload.

    - -

    request.resume()

    - -

    Resumes a paused request.

    - -

    request.connection

    - -

    The net.Stream object assocated with the connection.

    - -

    With HTTPS support, use request.connection.verifyPeer() and -request.connection.getPeerCertificate() to obtain the client's -authentication details.

    - -

    http.ServerResponse

    - -

    This object is created internally by a HTTP server--not by the user. It is -passed as the second parameter to the 'request' event. It is a writable stream.

    - -

    response.writeHead(statusCode[, reasonPhrase] , headers)

    - -

    Sends a response header to the request. The status code is a 3-digit HTTP -status code, like 404. The last argument, headers, are the response headers. -Optionally one can give a human-readable reasonPhrase as the second -argument.

    - -

    Example:

    - -
    var body = 'hello world';
    -response.writeHead(200, {
    -  'Content-Length': body.length,
    -  'Content-Type': 'text/plain'
    -});
    -
    - -

    This method must only be called once on a message and it must -be called before response.end() is called.

    - -

    response.write(chunk, encoding)

    - -

    This method must be called after writeHead was -called. It sends a chunk of the response body. This method may -be called multiple times to provide successive parts of the body.

    - -

    If chunk is a string, the second parameter -specifies how to encode it into a byte stream. By default the -encoding is 'ascii'.

    - -

    Note: This is the raw HTTP body and has nothing to do with -higher-level multi-part body encodings that may be used.

    - -

    The first time response.write() is called, it will send the buffered -header information and the first body to the client. The second time -response.write() is called, Node assumes you're going to be streaming -data, and sends that separately. That is, the response is buffered up to the -first chunk of body.

    - -

    response.end()

    - -

    This method signals to the server that all of the response headers and body -has been sent; that server should consider this message complete. -The method, response.end(), MUST be called on each -response.

    - -

    http.Client

    - -

    An HTTP client is constructed with a server address as its -argument, the returned handle is then used to issue one or more -requests. Depending on the server connected to, the client might -pipeline the requests or reestablish the stream after each -stream. Currently the implementation does not pipeline requests.

    - -

    Example of connecting to google.com:

    - -
    var sys = require('sys'),
    -   http = require('http');
    -var google = http.createClient(80, 'www.google.com');
    -var request = google.request('GET', '/',
    -  {'host': 'www.google.com'});
    -request.end();
    -request.addListener('response', function (response) {
    -  sys.puts('STATUS: ' + response.statusCode);
    -  sys.puts('HEADERS: ' + JSON.stringify(response.headers));
    -  response.setEncoding('utf8');
    -  response.addListener('data', function (chunk) {
    -    sys.puts('BODY: ' + chunk);
    -  });
    -});
    -
    - -

    http.createClient(port, host, secure, credentials)

    - -

    Constructs a new HTTP client. port and -host refer to the server to be connected to. A -stream is not established until a request is issued.

    - -

    secure is an optional boolean flag to enable https support and credentials is an optional credentials object from the crypto module, which may hold the client's private key, certificate, and a list of trusted CA certificates.

    - -

    If the connection is secure, but no explicit CA certificates are passed in the credentials, then node.js will default to the publicly trusted list of CA certificates, as given in http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt

    - -

    client.request([method], path, [request_headers])

    - -

    Issues a request; if necessary establishes stream. Returns a http.ClientRequest instance.

    - -

    method is optional and defaults to 'GET' if omitted.

    - -

    request_headers is optional. -Additional request headers might be added internally -by Node. Returns a ClientRequest object.

    - -

    Do remember to include the Content-Length header if you -plan on sending a body. If you plan on streaming the body, perhaps -set Transfer-Encoding: chunked.

    - -

    NOTE: the request is not complete. This method only sends the header of -the request. One needs to call request.end() to finalize the request and -retrieve the response. (This sounds convoluted but it provides a chance for -the user to stream a body to the server with request.write().)

    - -

    client.verifyPeer()

    - -

    Returns true or false depending on the validity of the server's certificate in the context of the defined or default list of trusted CA certificates.

    - -

    client.getPeerCertificate()

    - -

    Returns a JSON structure detailing the server's certificate, containing a dictionary with keys for the certificate 'subject', 'issuer', 'valid_from' and 'valid_to'

    - -

    http.ClientRequest

    - -

    This object is created internally and returned from the request() method -of a http.Client. It represents an in-progress request whose header has -already been sent.

    - -

    To get the response, add a listener for 'response' to the request object. -'response' will be emitted from the request object when the response -headers have been received. The 'response' event is executed with one -argument which is an instance of http.ClientResponse.

    - -

    During the 'response' event, one can add listeners to the -response object; particularly to listen for the 'data' event. Note that -the 'response' event is called before any part of the response body is received, -so there is no need to worry about racing to catch the first part of the -body. As long as a listener for 'data' is added during the 'response' -event, the entire body will be caught.

    - -
    // Good
    -request.addListener('response', function (response) {
    -  response.addListener('data', function (chunk) {
    -    sys.puts('BODY: ' + chunk);
    -  });
    -});
    -
    -// Bad - misses all or part of the body
    -request.addListener('response', function (response) {
    -  setTimeout(function () {
    -    response.addListener('data', function (chunk) {
    -      sys.puts('BODY: ' + chunk);
    -    });
    -  }, 10);
    -});
    -
    - -

    This is a writable stream.

    - -

    This is an EventEmitter with the following events:

    - -

    Event 'response'

    - -

    function (response) { }

    - -

    Emitted when a response is received to this request. This event is emitted only once. The -response argument will be an instance of http.ClientResponse.

    - -

    request.write(chunk, encoding='ascii')

    - -

    Sends a chunk of the body. By calling this method -many times, the user can stream a request body to a -server--in that case it is suggested to use the -['Transfer-Encoding', 'chunked'] header line when -creating the request.

    - -

    The chunk argument should be an array of integers -or a string.

    - -

    The encoding argument is optional and only -applies when chunk is a string. The encoding -argument should be either 'utf8' or -'ascii'. By default the body uses ASCII encoding, -as it is faster.

    - -

    request.end()

    - -

    Finishes sending the request. If any parts of the body are -unsent, it will flush them to the stream. If the request is -chunked, this will send the terminating '0\r\n\r\n'.

    - -

    http.ClientResponse

    - -

    This object is created when making a request with http.Client. It is -passed to the 'response' event of the request object.

    - -

    The response implements the readable stream interface.

    - -

    Event: 'data'

    - -

    function (chunk) {}

    - -

    Emitted when a piece of the message body is received.

    - -
    Example: A chunk of the body is given as the single
    -argument. The transfer-encoding has been decoded.  The
    -body chunk a String.  The body encoding is set with
    -`response.setBodyEncoding()`.
    -
    - -

    Event: 'end'

    - -

    function () {}

    - -

    Emitted exactly once for each message. No arguments. After -emitted no other events will be emitted on the response.

    - -

    response.statusCode

    - -

    The 3-digit HTTP response status code. E.G. 404.

    - -

    response.httpVersion

    - -

    The HTTP version of the connected-to server. Probably either -'1.1' or '1.0'. -Also response.httpVersionMajor is the first integer and -response.httpVersionMinor is the second.

    - -

    response.headers

    - -

    The response headers.

    - -

    response.setEncoding(encoding)

    - -

    Set the encoding for the response body. Either 'utf8' or 'binary'. -Defaults to 'binary'.

    - -

    response.pause()

    - -

    Pauses response from emitting events. Useful to throttle back a download.

    - -

    response.resume()

    - -

    Resumes a paused response.

    - -

    response.client

    - -

    A reference to the http.Client that this response belongs to.

    - -

    net.Server

    - -

    This class is used to create a TCP or UNIX server.

    - -

    Here is an example of a echo server which listens for connections -on port 8124:

    - -
    var net = require('net');
    -var server = net.createServer(function (stream) {
    -  stream.setEncoding('utf8');
    -  stream.addListener('connect', function () {
    -    stream.write('hello\r\n');
    -  });
    -  stream.addListener('data', function (data) {
    -    stream.write(data);
    -  });
    -  stream.addListener('end', function () {
    -    stream.write('goodbye\r\n');
    -    stream.end();
    -  });
    -});
    -server.listen(8124, 'localhost');
    -
    - -

    To listen on the socket '/tmp/echo.sock', the last line would just be -changed to

    - -
    server.listen('/tmp/echo.sock');
    -
    - -

    This is an EventEmitter with the following events:

    - -

    Event: 'connection'

    - -

    function (stream) {}

    - -

    Emitted when a new connection is made. stream is an instance of -net.Stream.

    - -

    Event: 'close'

    - -

    function () {}

    - -

    Emitted when the server closes.

    - -

    net.createServer(connectionListener)

    - -

    Creates a new TCP server. The connection_listener argument is -automatically set as a listener for the 'connection' event.

    - -

    server.listen(port, host=null, callback=null)

    - -

    Begin accepting connections on the specified port and host. If the -host is omitted, the server will accept connections directed to any -IPv4 address (INADDR_ANY).

    - -

    This function is asynchronous. The last parameter callback will be called -when the server has been bound.

    - -

    server.listen(path, callback=null)

    - -

    Start a UNIX socket server listening for connections on the given path.

    - -

    This function is asynchronous. The last parameter callback will be called -when the server has been bound.

    - -

    server.close()

    - -

    Stops the server from accepting new connections. This function is -asynchronous, the server is finally closed when the server emits a 'close' -event.

    - -

    net.Stream

    - -

    This object is an abstraction of of a TCP or UNIX socket. net.Stream -instance implement a duplex stream interface. They can be created by the -user and used as a client (with connect()) or they can be created by Node -and passed to the user through the 'connection' event of a server.

    - -

    net.Stream instances are an EventEmitters with the following events:

    - -

    Event: 'connect'

    - -

    function () { }

    - -

    Emitted when a stream connection successfully is established. -See connect().

    - -

    Event: 'secure'

    - -

    function () { }

    - -

    Emitted when a stream connection successfully establishes a HTTPS handshake with its peer.

    - -

    Event: 'data'

    - -

    function (data) { }

    - -

    Emitted when data is received. The argument data will be a Buffer or -String. Encoding of data is set by stream.setEncoding(). -(See the section on Readable Streams for more infromation.)

    - -

    Event: 'end'

    - -

    function () { }

    - -

    Emitted when the other end of the stream sends a FIN packet. After this is -emitted the readyState will be 'writeOnly'. One should probably just -call stream.end() when this event is emitted.

    - -

    Event: 'timeout'

    - -

    function () { }

    - -

    Emitted if the stream times out from inactivity. This is only to notify that -the stream has been idle. The user must manually close the connection.

    - -

    See also: stream.setTimeout()

    - -

    Event: 'drain'

    - -

    function () { }

    - -

    Emitted when the write buffer becomes empty. Can be used to throttle uploads.

    - -

    Event: 'error'

    - -

    function (exception) { }

    - -

    Emitted when an error occurs. The 'close' event will be called directly -following this event.

    - -

    Event: 'close'

    - -

    function () { }

    - -

    Emitted once the stream is fully closed. The argument had_error is a boolean which says if -the stream was closed due to a transmission -error.

    - -

    net.createConnection(port, host='127.0.0.1')

    - -

    Construct a new stream object and opens a stream to the specified port -and host. If the second parameter is omitted, localhost is assumed.

    - -

    When the stream is established the 'connect' event will be emitted.

    - -

    stream.connect(port, host='127.0.0.1')

    - -

    Opens a stream to the specified port and host. createConnection() -also opens a stream; normally this method is not needed. Use this only if -a stream is closed and you want to reuse the object to connect to another -server.

    - -

    This function is asynchronous. When the 'connect' event is emitted the -stream is established. If there is a problem connecting, the 'connect' -event will not be emitted, the 'error' event will be emitted with -the exception.

    - -

    stream.remoteAddress

    - -

    The string representation of the remote IP address. For example, -'74.125.127.100' or '2001:4860:a005::68'.

    - -

    This member is only present in server-side connections.

    - -

    stream.readyState

    - -

    Either 'closed', 'open', 'opening', 'readOnly', or 'writeOnly'.

    - -

    stream.setEncoding(encoding)

    - -

    Sets the encoding (either 'ascii', 'utf8', or 'binary') for data that is -received.

    - -

    stream.setSecure(credentials)

    - -

    Enables HTTPS support for the stream, with the crypto module credentials specifying the private key and certificate of the stream, and optionally the CA certificates for use in peer authentication.

    - -

    If the credentials hold one ore more CA certificates, then the stream will request for the peer to submit a client certificate as part of the HTTPS connection handshake. The validity and content of this can be accessed via verifyPeer() and getPeerCertificate().

    - -

    stream.verifyPeer()

    - -

    Returns true or false depending on the validity of the peers's certificate in the context of the defined or default list of trusted CA certificates.

    - -

    stream.getPeerCertificate()

    - -

    Returns a JSON structure detailing the peer's certificate, containing a dictionary with keys for the certificate 'subject', 'issuer', 'valid_from' and 'valid_to'

    - -

    stream.write(data, encoding='ascii')

    - -

    Sends data on the stream. The second parameter specifies the encoding in -the case of a string--it defaults to ASCII because encoding to UTF8 is rather -slow.

    - -

    Returns true if the entire data was flushed successfully to the kernel -buffer. Returns false if all or part of the data was queued in user memory. -'drain' will be emitted when the buffer is again free.

    - -

    stream.end()

    - -

    Half-closes the stream. I.E., it sends a FIN packet. It is possible the -server will still send some data. After calling this readyState will be -'readOnly'.

    - -

    stream.destroy()

    - -

    Ensures that no more I/O activity happens on this stream. Only necessary in -case of errors (parse error or so).

    - -

    stream.pause()

    - -

    Pauses the reading of data. That is, 'data' events will not be emitted. -Useful to throttle back an upload.

    - -

    stream.resume()

    - -

    Resumes reading after a call to pause().

    - -

    stream.setTimeout(timeout)

    - -

    Sets the stream to timeout after timeout milliseconds of inactivity on -the stream. By default net.Stream do not have a timeout.

    - -

    When an idle timeout is triggered the stream will receive a 'timeout' -event but the connection will not be severed. The user must manually end() -or destroy() the stream.

    - -

    If timeout is 0, then the existing idle timeout is disabled.

    - -

    stream.setNoDelay(noDelay=true)

    - -

    Disables the Nagle algorithm. By default TCP connections use the Nagle -algorithm, they buffer data before sending it off. Setting noDelay will -immediately fire off data each time stream.write() is called.

    - -

    stream.setKeepAlive(enable=false, initialDelay)

    - -

    Enable/disable keep-alive functionality, and optionally set the initial -delay before the first keepalive probe is sent on an idle stream. -Set initialDelay (in milliseconds) to set the delay between the last -data packet received and the first keepalive probe. Setting 0 for -initialDelay will leave the value unchanged from the default -(or previous) setting.

    - -

    Crypto

    - -

    Use require('crypto') to access this module.

    - -

    The crypto module requires OpenSSL to be available on the underlying platform. It offers a way of encapsulating secure credentials to be used as part of a secure HTTPS net or http connection.

    - -

    It also offers a set of wrappers for OpenSSL's hash, hmac, cipher, decipher, sign and verify methods.

    - -

    crypto.createCredentials(details)

    - -

    Creates a credentials object, with the optional details being a dictionary with keys:

    - -

    key : a string holding the PEM encoded private key

    - -

    cert : a string holding the PEM encoded certificate

    - -

    ca : either a string or list of strings of PEM encoded CA certificates to trust.

    - -

    If no 'ca' details are given, then node.js will use the default publicly trusted list of CAs as given in -http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt

    - -

    crypto.createHash(algorithm)

    - -

    Creates and returns a hash object, a cryptographic hash with the given algorithm which can be used to generate hash digests.

    - -

    algorithm is dependent on the available algorithms supported by the version of OpenSSL on the platform. Examples are sha1, md5, sha256, sha512, etc. On recent releases, openssl list-message-digest-algorithms will display the available digest algorithms.

    - -

    hash.update(data)

    - -

    Updates the hash content with the given data. This can be called many times with new data as it is streamed.

    - -

    hash.digest(encoding)

    - -

    Calculates the digest of all of the passed data to be hashed. The encoding can be 'hex', 'binary' or 'base64'.

    - -

    crypto.createHmac(algorithm, key)

    - -

    Creates and returns a hmac object, a cryptographic hmac with the given algorithm and key.

    - -

    algorithm is dependent on the available algorithms supported by OpenSSL - see createHash above. -key is the hmac key to be used.

    - -

    hmac.update(data)

    - -

    Update the hmac content with the given data. This can be called many times with new data as it is streamed.

    - -

    hmac.digest(encoding)

    - -

    Calculates the digest of all of the passed data to the hmac. The encoding can be 'hex', 'binary' or 'base64'.

    - -

    crypto.createCipher(algorithm, key)

    - -

    Creates and returns a cipher object, with the given algorithm and key.

    - -

    algorithm is dependent on OpenSSL, examples are aes192, etc. On recent releases, openssl list-cipher-algorithms will display the available cipher algorithms.

    - -

    cipher.update(data, input_encoding, output_encoding)

    - -

    Updates the cipher with data, the encoding of which is given in input_encoding and can be 'utf8', 'ascii' or 'binary'. The output_encoding specifies the output format of the enciphered data, and can be 'binary', 'base64' or 'hex'.

    - -

    Returns the enciphered contents, and can be called many times with new data as it is streamed.

    - -

    cipher.final(output_encoding)

    - -

    Returns any remaining enciphered contents, with output_encoding as update above.

    - -

    crypto.createDecipher(algorithm, key)

    - -

    Creates and returns a decipher object, with the given algorithm and key. This is the mirror of the cipher object above.

    - -

    decipher.update(data, input_encoding, output_encoding)

    - -

    Updates the decipher with data, which is encoded in 'binary', 'base64' or 'hex'. The output_decoding specifies in what format to return the deciphered plaintext - either 'binary', 'ascii' or 'utf8'.

    - -

    decipher.final(output_encoding)

    - -

    Returns any remaining plaintext which is deciphered, with `output_encoding' as update above.

    - -

    crypto.createSign(algorithm)

    - -

    Creates and returns a signing object, with the given algorithm. On recent OpenSSL releases, openssl list-public-key-algorithms will display the available signing algorithms. Examples are 'RSA-SHA256'.

    - -

    signer.update(data)

    - -

    Updates the signer object with data. This can be called many times with new data as it is streamed.

    - -

    signer.sign(private_key, output_format)

    - -

    Calculates the signature on all the updated data passed through the signer. private_key is a string containing the PEM encoded private key for signing.

    - -

    Returns the signature in output_format which can be 'binary', 'hex' or 'base64'

    - -

    crypto.createVerify(algorithm)

    - -

    Creates and returns a verification object, with the given algorithm. This is the mirror of the signing object above.

    - -

    verifier.update(data)

    - -

    Updates the verifyer object with data. This can be called many times with new data as it is streamed.

    - -

    verifier.verify(public_key, signature, signature_format)

    - -

    Verifies the signed data by using the public_key which is a string containing the PEM encoded public key, and signature, which is the previously calculates signature for the data, in the signature_format which can be 'binary', 'hex' or 'base64'.

    - -

    Returns true or false depending on the validity of the signature for the data and public key.

    - -

    DNS

    - -

    Use require('dns') to access this module.

    - -

    Here is an example which resolves 'www.google.com' then reverse -resolves the IP addresses which are returned.

    - -
    var dns = require('dns'),
    -    sys = require('sys');
    -
    -dns.resolve4('www.google.com', function (err, addresses) {
    -  if (err) throw err;
    -
    -  sys.puts('addresses: ' + JSON.stringify(addresses));
    -
    -  for (var i = 0; i < addresses.length; i++) {
    -    var a = addresses[i];
    -    dns.reverse(a, function (err, domains) {
    -      if (err) {
    -        sys.puts('reverse for ' + a + ' failed: ' + 
    -          err.message);
    -      } else {
    -        sys.puts('reverse for ' + a + ': ' + 
    -          JSON.stringify(domains));
    -      }
    -    });
    -  }
    -});
    -
    - -

    dns.resolve(domain, rrtype = 'A', callback)

    - -

    Resolves a domain (e.g. 'google.com') into an array of the record types -specified by rrtype. Valid rrtypes are A (IPV4 addresses), AAAA (IPV6 -addresses), MX (mail exchange records), TXT (text records), SRV (SRV -records), and PTR (used for reverse IP lookups).

    - -

    The callback has arguments (err, addresses). The type of each item -in addresses is determined by the record type, and described in the -documentation for the corresponding lookup methods below.

    - -

    On error, err would be an instanceof Error object, where err.errno is -one of the error codes listed below and err.message is a string describing -the error in English.

    - -

    dns.resolve4(domain, callback)

    - -

    The same as dns.resolve(), but only for IPv4 queries (A records). -addresses is an array of IPv4 addresses (e.g.
    -['74.125.79.104', '74.125.79.105', '74.125.79.106']).

    - -

    dns.resolve6(domain, callback)

    - -

    The same as dns.resolve4() except for IPv6 queries (an AAAA query).

    - -

    dns.resolveMx(domain, callback)

    - -

    The same as dns.resolve(), but only for mail exchange queries (MX records).

    - -

    addresses is an array of MX records, each with a priority and an exchange -attribute (e.g. [{'priority': 10, 'exchange': 'mx.example.com'},...]).

    - -

    dns.resolveTxt(domain, callback)

    - -

    The same as dns.resolve(), but only for text queries (TXT records). -addresses is an array of the text records available for domain (e.g., -['v=spf1 ip4:0.0.0.0 ~all']).

    - -

    dns.resolveSrv(domain, callback)

    - -

    The same as dns.resolve(), but only for service records (SRV records). -addresses is an array of the SRV records available for domain. Properties -of SRV records are priority, weight, port, and name (e.g., -[{'priority': 10, {'weight': 5, 'port': 21223, 'name': 'service.example.com'}, ...]).

    - -

    dns.reverse(ip, callback)

    - -

    Reverse resolves an ip address to an array of domain names.

    - -

    The callback has arguments (err, domains).

    - -

    If there an an error, err will be non-null and an instanceof the Error -object.

    - -

    Each DNS query can return an error code.

    - -
      -
    • dns.TEMPFAIL: timeout, SERVFAIL or similar.
    • -
    • dns.PROTOCOL: got garbled reply.
    • -
    • dns.NXDOMAIN: domain does not exists.
    • -
    • dns.NODATA: domain exists but no data of reqd type.
    • -
    • dns.NOMEM: out of memory while processing.
    • -
    • dns.BADQUERY: the query is malformed.
    • -
    - - -

    Assert

    - -

    This module is used for writing unit tests for your applications, you can -access it with require('assert').

    - -

    assert.fail(actual, expected, message, operator)

    - -

    Tests if actual is equal to expected using the operator provided.

    - -

    assert.ok(value, message)

    - -

    Tests if value is a true value, it is equivalent to assert.equal(true, value, message);

    - -

    assert.equal(actual, expected, message)

    - -

    Tests shallow, coercive equality with the equal comparison operator ( == ).

    - -

    assert.notEqual(actual, expected, message)

    - -

    Tests shallow, coercive non-equality with the not equal comparison operator ( != ).

    - -

    assert.deepEqual(actual, expected, message)

    - -

    Tests for deep equality.

    - -

    assert.notDeepEqual(actual, expected, message)

    - -

    Tests for any deep inequality.

    - -

    assert.strictEqual(actual, expected, message)

    - -

    Tests strict equality, as determined by the strict equality operator ( === )

    - -

    assert.notStrictEqual(actual, expected, message)

    - -

    Tests strict non-equality, as determined by the strict not equal operator ( !== )

    - -

    assert.throws(block, error, message)

    - -

    Expects block to throw an error.

    - -

    assert.doesNotThrow(block, error, message)

    - -

    Expects block not to throw an error.

    - -

    assert.ifError(value)

    - -

    Tests if value is not a false value, throws if it is a true value. Useful when testing the first argument, error in callbacks.

    - -

    Path

    - -

    This module contains utilities for dealing with file paths. Use -require('path') to use it. It provides the following methods:

    - -

    path.join(/ path1, path2, ... /)

    - -

    Join all arguments together and resolve the resulting path. Example:

    - -
    node> require('path').join(
    -...   '/foo', 'bar', 'baz/asdf', 'quux', '..')
    -'/foo/bar/baz/asdf'
    -
    - -

    path.normalizeArray(arr)

    - -

    Normalize an array of path parts, taking care of '..' and '.' parts. Example:

    - -
    path.normalizeArray(['', 
    -  'foo', 'bar', 'baz', 'asdf', 'quux', '..'])
    -// returns
    -[ '', 'foo', 'bar', 'baz', 'asdf' ]
    -
    - -

    path.normalize(p)

    - -

    Normalize a string path, taking care of '..' and '.' parts. Example:

    - -
    path.normalize('/foo/bar/baz/asdf/quux/..')
    -// returns
    -'/foo/bar/baz/asdf'
    -
    - -

    path.dirname(p)

    - -

    Return the directory name of a path. Similar to the Unix dirname command. Example:

    - -
    path.dirname('/foo/bar/baz/asdf/quux')
    -// returns
    -'/foo/bar/baz/asdf'
    -
    - -

    path.basename(p, ext)

    - -

    Return the last portion of a path. Similar to the Unix basename command. Example:

    - -
    path.basename('/foo/bar/baz/asdf/quux.html')
    -// returns
    -'quux.html'
    -
    -path.basename('/foo/bar/baz/asdf/quux.html', '.html')
    -// returns
    -'quux'
    -
    - -

    path.extname(p)

    - -

    Return the extension of the path. Everything after the last '.' in the last portion -of the path. If there is no '.' in the last portion of the path or the only '.' is -the first character, then it returns an empty string. Examples:

    - -
    path.extname('index.html')
    -// returns 
    -'.html'
    -
    -path.extname('index')
    -// returns
    -''
    -
    - -

    path.exists(p, callback)

    - -

    Test whether or not the given path exists. Then, call the callback argument with either true or false. Example:

    - -
    path.exists('/etc/passwd', function (exists) {
    -  sys.debug(exists ? "it's there" : "no passwd!");
    -});
    -
    - -

    URL

    - -

    This module has utilities for URL resolution and parsing. -Call require('url') to use it.

    - -

    Parsed URL objects have some or all of the following fields, depending on -whether or not they exist in the URL string. Any parts that are not in the URL -string will not be in the parsed object. Examples are shown for the URL

    - -

    'http://user:pass@host.com:8080/p/a/t/h?query=string#hash'

    - -
      -
    • href

      - -

      The full URL that was originally parsed. Example: -'http://user:pass@host.com:8080/p/a/t/h?query=string#hash'

    • -
    • protocol

      - -

      The request protocol. Example: 'http:'

    • -
    • host

      - -

      The full host portion of the URL, including port and authentication information. Example: -'user:pass@host.com:8080'

    • -
    • auth

      - -

      The authentication information portion of a URL. Example: 'user:pass'

    • -
    • hostname

      - -

      Just the hostname portion of the host. Example: 'host.com'

    • -
    • port

      - -

      The port number portion of the host. Example: '8080'

    • -
    • pathname

      - -

      The path section of the URL, that comes after the host and before the query, including the initial slash if present. Example: '/p/a/t/h'

    • -
    • search

      - -

      The 'query string' portion of the URL, including the leading question mark. Example: '?query=string'

    • -
    • query

      - -

      Either the 'params' portion of the query string, or a querystring-parsed object. Example: -'query=string' or {'query':'string'}

    • -
    • hash

      - -

      The 'fragment' portion of the URL including the pound-sign. Example: '#hash'

    • -
    - - -

    The following methods are provided by the URL module:

    - -

    url.parse(urlStr, parseQueryString=false)

    - -

    Take a URL string, and return an object. Pass true as the second argument to also parse -the query string using the querystring module.

    - -

    url.format(urlObj)

    - -

    Take a parsed URL object, and return a formatted URL string.

    - -

    url.resolve(from, to)

    - -

    Take a base URL, and a href URL, and resolve them as a browser would for an anchor tag.

    - -

    Query String

    - -

    This module provides utilities for dealing with query strings. It provides the following methods:

    - -

    querystring.stringify(obj, sep='&', eq='=', munge=true)

    - -

    Serialize an object to a query string. Optionally override the default separator and assignment characters. -Example:

    - -
    querystring.stringify({foo: 'bar'})
    -// returns
    -'foo=bar'
    -
    -querystring.stringify({foo: 'bar', baz: 'bob'}, ';', ':')
    -// returns
    -'foo:bar;baz:bob'
    -
    - -

    By default, this function will perform PHP/Rails-style parameter mungeing for arrays and objects used as -values within obj. -Example:

    - -
    querystring.stringify({foo: 'bar', foo: 'baz', foo: 'boz'})
    -// returns
    -'foo[]=bar&foo[]=baz&foo[]=boz'
    -
    -querystring.stringify({foo: {bar: 'baz'}})
    -// returns
    -'foo[bar]=baz'
    -
    - -

    If you wish to disable the array mungeing (e.g. when generating parameters for a Java servlet), you -can set the munge argument to false. -Example:

    - -
    querystring.stringify({foo: 'bar', foo: 'baz', foo: 'boz'}, '&', '=', false)
    -// returns
    -'foo=bar&foo=baz&foo=boz'
    -
    - -

    Note that when munge is false, parameter names with object values will still be munged.

    - -

    querystring.parse(str, sep='&', eq='=')

    - -

    Deserialize a query string to an object. Optionally override the default separator and assignment characters.

    - -
    querystring.parse('a=b&b=c')
    -// returns
    -{ 'a': 'b'
    -, 'b': 'c'
    -}
    -
    - -

    This function can parse both munged and unmunged query strings (see stringify for details).

    - -

    querystring.escape

    - -

    The escape function used by querystring.stringify, provided so that it could be overridden if necessary.

    - -

    querystring.unescape

    - -

    The unescape function used by querystring.parse, provided so that it could be overridden if necessary.

    - -

    REPL

    - -

    A Read-Eval-Print-Loop (REPL) is available both as a standalone program and easily -includable in other programs. REPL provides a way to interactively run -JavaScript and see the results. It can be used for debugging, testing, or -just trying things out.

    - -

    By executing node without any arguments from the command-line you will be -dropped into the REPL. It has simplistic emacs line-editting.

    - -
    mjr:~$ node
    -Type '.help' for options.
    -node> a = [ 1, 2, 3];
    -[ 1, 2, 3 ]
    -node> a.forEach(function (v) {
    -...   sys.puts(v);
    -...   });
    -1
    -2
    -3
    -
    - -

    For advanced line-editors, start node with the environmental variable NODE_NO_READLINE=1. -This will start the REPL in canonical terminal settings which will allow you to use with rlwrap.

    - -

    For example, you could add this to your bashrc file:

    - -
    alias node="env NODE_NO_READLINE=1 rlwrap node"
    -
    - -

    repl.start(prompt, stream)

    - -

    Starts a REPL with prompt as the prompt and stream for all I/O. prompt -is optional and defaults to node>. stream is optional and defaults to -process.openStdin().

    - -

    Multiple REPLs may be started against the same running instance of node. Each -will share the same global object but will have unique I/O.

    - -

    Here is an example that starts a REPL on stdin, a Unix socket, and a TCP socket:

    - -
    var sys = require("sys"),
    -    net = require("net"),
    -    repl = require("repl");
    -
    -connections = 0;
    -
    -repl.start("node via stdin> ");
    -
    -net.createServer(function (socket) {
    -  connections += 1;
    -  repl.start("node via Unix socket> ", socket);
    -}).listen("/tmp/node-repl-sock");
    -
    -net.createServer(function (socket) {
    -  connections += 1;
    -  repl.start("node via TCP socket> ", socket);
    -}).listen(5001);
    -
    - -

    Running this program from the command line will start a REPL on stdin. Other -REPL clients may connect through the Unix socket or TCP socket. telnet is useful -for connecting to TCP sockets, and socat can be used to connect to both Unix and -TCP sockets.

    - -

    By starting a REPL from a Unix socket-based server instead of stdin, you can -connect to a long-running node process without restarting it.

    - -

    REPL Features

    - -

    Inside the REPL, Control+D will exit. Multi-line expressions can be input.

    - -

    The special variable _ (underscore) contains the result of the last expression.

    - -
    node> [ "a", "b", "c" ]
    -[ 'a', 'b', 'c' ]
    -node> _.length 
    -3
    -node> _ += 1
    -4
    -
    - -

    The REPL provides access to any variables in the global scope. You can expose a variable -to the REPL explicitly by assigning it to the scope object associated with each -REPLServer. For example:

    - -
    // repl_test.js
    -var repl = require("repl"),
    -    msg = "message";
    -
    -repl.start().scope.m = msg;
    -
    - -

    Things in the scope object appear as local within the REPL:

    - -
    mjr:~$ node repl_test.js 
    -node> m
    -'message'
    -
    - -

    There are a few special REPL commands:

    - -
      -
    • .break - While inputting a multi-line expression, sometimes you get lost or just don't care -about completing it. .break will start over.

    • -
    • .clear - Resets the scope object to an empty object and clears any multi-line expression.

    • -
    • .exit - Close the I/O stream, which will cause the REPL to exit.

    • -
    • .help - Show this list of special commands.

    • -
    - - -

    Modules

    - -

    Node uses the CommonJS module system.

    - -

    Node has a simple module loading system. In Node, files and modules are in -one-to-one correspondence. As an example, foo.js loads the module -circle.js in the same directory.

    - -

    The contents of foo.js:

    - -
    var circle = require('./circle'),
    -    sys = require('sys');
    -sys.puts( 'The area of a circle of radius 4 is '
    -  + circle.area(4));
    -
    - -

    The contents of circle.js:

    - -
    var PI = 3.14;
    -
    -exports.area = function (r) {
    -  return PI * r * r;
    -};
    -
    -exports.circumference = function (r) {
    -  return 2 * PI * r;
    -};
    -
    - -

    The module circle.js has exported the functions area() and -circumference(). To export an object, add to the special exports -object. (Alternatively, one can use this instead of exports.) Variables -local to the module will be private. In this example the variable PI is -private to circle.js. The function puts() comes from the module 'sys', -which is a built-in module. Modules which are not prefixed by './' are -built-in module--more about this later.

    - -

    A module prefixed with './' is relative to the file calling require(). -That is, circle.js must be in the same directory as foo.js for -require('./circle') to find it.

    - -

    Without the leading './', like require('assert') the module is searched -for in the require.paths array. require.paths on my system looks like -this:

    - -

    [ '/home/ryan/.node_libraries' ]

    - -

    That is, when require('assert') is called Node looks for:

    - -
      -
    • 1: /home/ryan/.node_libraries/assert.js
    • -
    • 2: /home/ryan/.node_libraries/assert.node
    • -
    • 3: /home/ryan/.node_libraries/assert/index.js
    • -
    • 4: /home/ryan/.node_libraries/assert/index.node
    • -
    - - -

    interrupting once a file is found. Files ending in '.node' are binary Addon -Modules; see 'Addons' below. 'index.js' allows one to package a module as -a directory.

    - -

    require.paths can be modified at runtime by simply unshifting new -paths onto it, or at startup with the NODE_PATH environmental -variable (which should be a list of paths, colon separated).

    - -

    Addons

    - -

    Addons are dynamically linked shared objects. They can provide glue to C and -C++ libraries. The API (at the moment) is rather complex, involving -knowledge of several libraries:

    - -
      -
    • V8 JavaScript, a C++ library. Used for interfacing with JavaScript: -creating objects, calling functions, etc. Documented mostly in the -v8.h header file (deps/v8/include/v8.h in the Node source tree).

    • -
    • libev, C event loop library. Anytime one needs to wait for a file -descriptor to become readable, wait for a timer, or wait for a signal to -received one will need to interface with libev. That is, if you perform -any I/O, libev will need to be used. Node uses the EV_DEFAULT event -loop. Documentation can be found http:/cvs.schmorp.de/libev/ev.html[here].

    • -
    • libeio, C thread pool library. Used to execute blocking POSIX system -calls asynchronously. Mostly wrappers already exist for such calls, in -src/file.cc so you will probably not need to use it. If you do need it, -look at the header file deps/libeio/eio.h.

    • -
    • Internal Node libraries. Most importantly is the node::ObjectWrap -class which you will likely want to derive from.

    • -
    • Others. Look in deps/ for what else is available.

    • -
    - - -

    Node statically compiles all its dependencies into the executable. When -compiling your module, you don't need to worry about linking to any of these -libraries.

    - -

    To get started let's make a small Addon which does the following except in -C++:

    - -
    exports.hello = 'world';
    -
    - -

    To get started we create a file hello.cc:

    - -
    #include <v8.h>
    -
    -using namespace v8;
    -
    -extern 'C' void
    -init (Handle<Object> target) 
    -{
    -  HandleScope scope;
    -  target->Set(String::New("hello"), String::New("World"));
    -}
    -
    - -

    This source code needs to be built into hello.node, the binary Addon. To -do this we create a file called wscript which is python code and looks -like this:

    - -
    srcdir = '.'
    -blddir = 'build'
    -VERSION = '0.0.1'
    -
    -def set_options(opt):
    -  opt.tool_options('compiler_cxx')
    -
    -def configure(conf):
    -  conf.check_tool('compiler_cxx')
    -  conf.check_tool('node_addon')
    -
    -def build(bld):
    -  obj = bld.new_task_gen('cxx', 'shlib', 'node_addon')
    -  obj.target = 'hello'
    -  obj.source = 'hello.cc'
    -
    - -

    Running node-waf configure build will create a file -build/default/hello.node which is our Addon.

    - -

    node-waf is just http://code.google.com/p/waf/[WAF], the python-based build system. node-waf is -provided for the ease of users.

    - -

    All Node addons must export a function called init with this signature:

    - -
    extern 'C' void init (Handle<Object> target)
    -
    - -

    For the moment, that is all the documentation on addons. Please see -http://github.com/ry/node_postgres for a real example.

    -
    -
    - - - - - - \ No newline at end of file diff --git a/node_modules/jsdom/node_modules/htmlparser/testdata/getelement.html b/node_modules/jsdom/node_modules/htmlparser/testdata/getelement.html deleted file mode 100644 index 423d135..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/testdata/getelement.html +++ /dev/null @@ -1,3460 +0,0 @@ - - - - - - - Stack Overflow - - - - - - - - - - - - - - - - -
    - - - - - -
    -
    - - -
    - -
    - -
    -

    Top Questions

    - -
    -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    11
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    10
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    0
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    2
    -
    votes
    -
    -
    -
    5
    -
    answers
    -
    -
    -
    88
    -
    views
    -
    -
    -
    -

    how to create folder ?

    - -
    - -
    -
    - - 20s ago - Luc M 1,261 -
    -
    -
    - -
    -
    -
    -
    4
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    11
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    1
    -
    vote
    -
    -
    -
    2
    -
    answers
    -
    -
    -
    18
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    4
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    -2
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    49
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    2
    -
    votes
    -
    -
    -
    4
    -
    answers
    -
    -
    -
    44
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    6
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    3
    -
    votes
    -
    -
    -
    3
    -
    answers
    -
    -
    -
    3
    -
    kviews
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    1
    -
    view
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    4
    -
    answers
    -
    -
    -
    41
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    1
    -
    view
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    20
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    3
    -
    answers
    -
    -
    -
    33
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    1
    -
    vote
    -
    -
    -
    2
    -
    answers
    -
    -
    -
    18
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    3
    -
    answers
    -
    -
    -
    12
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    10
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    1
    -
    vote
    -
    -
    -
    3
    -
    answers
    -
    -
    -
    18
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    9
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    2
    -
    answers
    -
    -
    -
    6
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    5
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    7
    -
    votes
    -
    -
    -
    9
    -
    answers
    -
    -
    -
    155
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    1
    -
    view
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    1
    -
    view
    -
    -
    -
    -

    Drupal Features include Theme

    - -
    - -
    -
    - 2m ago - Linda 93 -
    -
    -
    - -
    -
    -
    -
    3
    -
    votes
    -
    -
    -
    3
    -
    answers
    -
    -
    -
    29
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    8
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    4
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    8
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    4
    -
    answers
    -
    -
    -
    34
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    1
    -
    view
    -
    -
    -
    -

    writing hbase reports

    - - -
    - 3m ago - sammy 1 -
    -
    -
    - -
    -
    -
    -
    2
    -
    votes
    -
    -
    -
    2
    -
    answers
    -
    -
    -
    7
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    14
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    1
    -
    vote
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    8
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    3
    -
    answers
    -
    -
    -
    23
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    14
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    9
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    2
    -
    answers
    -
    -
    -
    14
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    12
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    5
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    2
    -
    answers
    -
    -
    -
    14
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    4
    -
    answers
    -
    -
    -
    50
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    6
    -
    answers
    -
    -
    -
    100
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    1
    -
    vote
    -
    -
    -
    13
    -
    answers
    -
    -
    -
    133
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    5
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    5
    -
    votes
    -
    -
    -
    3
    -
    answers
    -
    -
    -
    24
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    2
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    1
    -
    vote
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    14
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    4
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    32
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    1
    -
    vote
    -
    -
    -
    4
    -
    answers
    -
    -
    -
    10
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    5
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    39
    -
    votes
    -
    -
    -
    16
    -
    answers
    -
    -
    -
    16
    -
    kviews
    -
    -
    - -
    - -
    -
    -
    -
    3
    -
    votes
    -
    -
    -
    6
    -
    answers
    -
    -
    -
    1
    -
    kviews
    -
    -
    - -
    - -
    -
    -
    -
    6
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    72
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    2
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    18
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    4
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    3
    -
    answers
    -
    -
    -
    20
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    2
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    6
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    2
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    17
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    -1
    -
    votes
    -
    -
    -
    2
    -
    answers
    -
    -
    -
    13
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    1
    -
    vote
    -
    -
    -
    3
    -
    answers
    -
    -
    -
    43
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    5
    -
    votes
    -
    -
    -
    5
    -
    answers
    -
    -
    -
    345
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    6
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    3
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    2
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    67
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    3
    -
    answers
    -
    -
    -
    11
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    1
    -
    kvotes
    -
    -
    -
    290
    -
    answers
    -
    -
    -
    101
    -
    kviews
    -
    -
    - -
    - -
    -
    -
    -
    1
    -
    vote
    -
    -
    -
    2
    -
    answers
    -
    -
    -
    23
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    5
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    2
    -
    votes
    -
    -
    -
    2
    -
    answers
    -
    -
    -
    28
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    2
    -
    answers
    -
    -
    -
    33
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    7
    -
    votes
    -
    -
    -
    5
    -
    answers
    -
    -
    -
    2
    -
    kviews
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    13
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    3
    -
    votes
    -
    -
    -
    4
    -
    answers
    -
    -
    -
    409
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    7
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    3
    -
    votes
    -
    -
    -
    4
    -
    answers
    -
    -
    -
    58
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    2
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    10
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    19
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    2
    -
    answers
    -
    -
    -
    29
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    2
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    22
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    2
    -
    answers
    -
    -
    -
    35
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    6
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    4
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    1
    -
    vote
    -
    -
    -
    2
    -
    answers
    -
    -
    -
    33
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    2
    -
    answers
    -
    -
    -
    12
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    1
    -
    vote
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    12
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    1
    -
    answer
    -
    -
    -
    9
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    4
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    2
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    2
    -
    answers
    -
    -
    -
    32
    -
    views
    -
    -
    - -
    - -
    -
    -
    -
    0
    -
    votes
    -
    -
    -
    0
    -
    answers
    -
    -
    -
    3
    -
    views
    -
    -
    - -
    - -
    - -

    Looking for more? Browse the complete list of questions, or popular tags. Help us answer unanswered questions.

    - -
    - - - - - - -
    -
    - - - - - - - - - - - \ No newline at end of file diff --git a/node_modules/jsdom/node_modules/htmlparser/testdata/trackerchecker.html b/node_modules/jsdom/node_modules/htmlparser/testdata/trackerchecker.html deleted file mode 100644 index 2dfb1a0..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/testdata/trackerchecker.html +++ /dev/null @@ -1,2733 +0,0 @@ - - - -www.trackerchecker.com - We check your trackers - - - - - - -
    - - - - - - -
    Home || Add a tracker || Latest trackers
    -
    - - -
    -follow us on Twitter
    -Follow trackerchecker on Twitter --> @trackerchecker. -
    -
    - - - - - - - -
    -We need your input!
    We're developing a new version of Trackerchecker and we want to know what functionality the users like to see in Trackerchecker V3! :) Contribute please and tell us what you like to see in Trackerchecker V3! -
    Name:
    E-mail:
    Suggestion
    -
    -
    - - -
    -
    - TrackerList
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     TrackerNameHistoryLastCheckedStatus
    1337x.orgview history2010-04-15 18:14:14Open
    420project.orgview history2010-04-15 18:23:46Closed
    acehd.netview history2010-04-15 18:05:34Closed
    acetorrents.netview history2010-04-15 18:09:10Open
    adult-cinema-network.netview history2010-04-15 18:21:21Open
    all4nothin.netview history2010-04-15 17:35:20Open
    allgirltorrents.comview history2010-04-15 17:45:50Closed
    allotracker.comview history2010-04-15 17:38:15Open
    appz.bitshock.orgview history2010-04-15 17:53:16Open
    appzuniverse.orgview history2010-04-15 17:49:10Closed
    arabfilms.orgview history2010-04-15 17:36:29Closed
    arabseries.orgview history2010-04-15 17:53:15Closed
    araditracker.comview history2010-04-15 17:37:17Closed
    arena-tr.comview history2010-04-15 18:21:22Closed
    arenabg.comview history2010-04-15 17:36:30Closed
    artofmisdirection.comview history2010-04-15 17:49:51Closed
    asiandvdclub.orgview history2010-04-15 17:35:13Open
    at-tracker.orgview history2010-04-15 18:09:40Offline
    atomico-torrent.comview history2010-04-15 18:00:09Closed
    audionews.ruview history2010-04-15 17:57:00Closed
    audiotracer.comview history2010-04-15 18:09:12Closed
    audiozonetorrents.comview history2010-04-15 18:22:18Open
    avatarbg.infoview history2010-04-15 18:09:40Closed
    awesome-hd.comview history2010-04-15 18:03:09Closed
    awesome-hd.netview history2010-04-15 18:09:25Closed
    baltracker.netview history2010-04-15 18:14:10Open
    bestmmatorrents.comview history2010-04-15 18:09:18Closed
    bestshare.roview history2010-04-15 17:37:02Closed
    bestxvid.orgview history2010-04-15 17:35:13Closed
    bit-hdtv.comview history2010-04-15 18:14:09Closed
    bitaddict.orgview history2010-04-15 17:45:11Closed
    bitchil.comview history2010-04-15 17:45:16Open
    bitflamers.comview history2010-04-15 18:21:13Closed
    bitgamer.comview history2010-04-15 18:05:52Closed
    bithq.orgview history2010-04-15 18:05:56Open
    bithumen.ath.cxview history2010-04-15 17:44:41Closed
    bitlove.huview history2010-04-15 17:35:02Closed
    bitme.orgview history2010-04-15 17:35:16Closed
    bitmetv.orgview history2010-04-15 17:40:50Closed
    bitmusic.huview history2010-04-15 18:22:56Closed
    bitnation.comview history2010-04-15 18:22:18Closed
    bitseduce.comview history2010-04-15 17:49:53Closed
    bitseek.orgview history2010-04-15 18:21:12Closed
    bitseek.orgview history2010-04-15 18:03:09Closed
    bitshock.orgview history2010-04-15 17:35:11Closed
    bitshock.orgview history2010-04-15 17:56:11Closed
    bitsoup.orgview history2010-04-15 17:35:20Closed
    bitSpyder.netview history2010-04-15 17:38:08Closed
    bittorrents.roview history2010-04-15 17:36:29Closed
    bitturk.netview history2010-04-15 18:09:18Closed
    biztorrents.comview history2010-04-15 17:45:11Open
    blackcats-games.netview history2010-04-15 17:36:28Closed
    blades-heaven.comview history2010-04-15 18:24:28Open
    blue-bytez.comview history2010-04-15 18:23:03Closed
    blue-whitegt.comview history2010-04-15 18:09:29Closed
    bmtorrents.netview history2010-04-15 17:38:13Closed
    bootytape.comview history2010-04-15 17:45:17Open
    bootytorrents.comview history2010-04-15 18:22:21Closed
    boxtorrents.comview history2010-04-15 18:22:19Closed
    bt.avistaz.comview history2010-04-15 18:14:10Closed
    bt.davka.infoview history2010-04-15 17:56:15Open
    bt.xbox-sky.ccview history2010-04-15 18:06:25Closed
    bt.xbox-sky.comview history2010-04-15 18:21:45Closed
    btgigs.infoview history2010-04-15 18:24:22Closed
    bwtorrents.comview history2010-04-15 18:05:56Closed
    bytelist.orgview history2010-04-15 17:53:12Offline
    cartoonchaos.orgview history2010-04-15 17:53:13Closed
    ccfbits.orgview history2010-04-15 17:56:59Closed
    chdbits.orgview history2010-04-15 18:13:08Open
    cheggit.net/view history2010-04-15 17:35:14Open
    chilebt.comview history2010-04-15 17:38:18Closed
    christiantorrents.comview history2010-04-15 17:56:54Closed
    chronictracker.comview history2010-04-15 18:00:23Closed
    cinema-obscura.comview history2010-04-15 18:17:13Closed
    cinemageddon.orgview history2010-04-15 17:45:11Closed
    cinematik.netview history2010-04-15 18:21:20Closed
    cleanvobs.orgview history2010-04-15 18:04:32Closed
    colombo-bt.orgview history2010-04-15 17:37:16Closed
    contego.wsview history2010-04-15 17:45:15Closed
    crazytorrent.euview history2010-04-15 18:22:17Closed
    czone.roview history2010-04-15 17:49:08Closed
    danger.lvview history2010-04-15 18:09:16Closed
    definitive-scene.comview history2010-04-15 18:23:46Open
    demonoid.comview history2010-04-15 17:45:48Closed
    devilwolfs.comview history2010-04-15 18:14:43Open
    diablotorrent.huview history2010-04-15 18:04:34Closed
    dididave.comview history2010-04-15 17:36:36Closed
    digitalhive.orgview history2010-04-15 17:45:10Open
    dimeadozen.orgview history2010-04-15 17:40:53Closed
    dnbtracker.orgview history2010-04-15 18:17:16Open
    docs.torrents.roview history2010-04-15 17:49:53Closed
    dvdseed.orgview history2010-04-15 17:56:11Closed
    dvdtreasure.euview history2010-04-15 17:53:16Closed
    ebookvortex.comview history2010-04-15 17:38:12Open
    eclipsetorrents.orgview history2010-04-15 17:40:45Closed
    egytorrent.comview history2010-04-15 17:49:09Closed
    egytorrent.comview history2010-04-15 18:16:07Open
    elbitz.netview history2010-04-15 18:09:35Closed
    elektronik.roview history2010-04-15 17:45:16Closed
    empornium.usview history2010-04-15 18:10:02Open
    eroticsource.plview history2010-04-15 18:06:22Closed
    estrenoslatinos.comview history2010-04-15 17:49:09Closed
    ethor.netview history2010-04-15 18:09:38Closed
    evopt.orgview history2010-04-15 17:49:03Closed
    Exigomusicview history2010-04-15 18:17:18Closed
    extremebits.orgview history2010-04-15 18:17:19Closed
    extremeshare.orgview history2010-04-15 17:36:35Open
    faplife.netview history2010-04-15 17:36:44Closed
    feedthe.netview history2010-04-15 17:37:23Closed
    filebits.orgview history2010-04-15 17:56:52Closed
    filelist.orgview history2010-04-15 18:09:17Closed
    filelist.roview history2010-04-15 17:49:53Closed
    filemp3.orgview history2010-04-15 17:36:43Closed
    fileporn.orgview history2010-04-15 17:53:11Closed
    flashtorrents.com.arview history2010-04-15 17:56:15Closed
    Free The Scene (FTS)view history2010-04-15 18:22:19Closed
    Fresh On TV (TvT)view history2010-04-15 18:17:13Open
    frztracker.sytes.netview history2010-04-15 18:03:49Closed
    fst.omnilounge.co.ukview history2010-04-15 17:36:29Closed
    fullcontactzone.comview history2010-04-15 18:03:17Closed
    gamecrook.comview history2010-04-15 17:42:03Closed
    gbvnet.roview history2010-04-15 17:38:09Closed
    gettorrents.orgview history2010-04-15 17:45:03Open
    gfxnews.ruview history2010-04-15 17:36:28Open
    gigatorrents.wsview history2010-04-15 18:14:10Closed
    glabella.orgview history2010-04-15 17:35:12Open
    globus-tracker.comview history2010-04-15 17:45:46Closed
    goem.orgview history2010-04-15 17:40:51Closed
    gormogon.comview history2010-04-15 18:09:29Open
    greek-tracker.comview history2010-04-15 17:35:15Closed
    grimetorrent.comview history2010-04-15 18:00:31Closed
    grtorrent.comview history2010-04-15 18:24:19Closed
    guiks.netview history2010-04-15 17:37:19Open
    h264torrents.comview history2010-04-15 18:21:54Closed
    h33t.comview history2010-04-15 18:17:20Open
    hd-bits.roview history2010-04-15 17:37:21Closed
    hd-torrents.orgview history2010-04-15 17:56:15Closed
    hdbits.orgview history2010-04-15 17:45:47Closed
    hdchina.orgview history2010-04-15 18:24:15Closed
    hdfrench.comview history2010-04-15 17:53:15Closed
    hdme.euview history2010-04-15 18:00:28Closed
    hdpre.comview history2010-04-15 17:35:03Closed
    hdsource.bizview history2010-04-15 18:04:34Closed
    hdstar.orgview history2010-04-15 17:45:12Closed
    hdvnbits.orgview history2010-04-15 17:49:50Closed
    heaventracker.orgview history2010-04-15 17:36:33Closed
    hermeticos.orgview history2010-04-15 18:14:44Closed
    horrorcharnel.kicks-ass.orgview history2010-04-15 18:21:15Closed
    hungercity.orgview history2010-04-15 17:34:14Open
    ifyounotknow.comview history2010-04-15 18:21:19Closed
    ilovetorrents.comview history2010-04-15 18:16:08Open
    indeep.bizview history2010-04-15 18:17:18Closed
    indietorrents.comview history2010-04-15 18:24:30Closed
    iplay.roview history2010-04-15 18:09:41Closed
    ipodnova.tvview history2010-04-15 17:36:36Closed
    iptorrents.comview history2010-04-15 18:23:02Closed
    joompalace.comview history2010-04-15 18:24:21Closed
    karagarga.netview history2010-04-15 18:09:40Closed
    killawaves.netview history2010-04-15 18:06:23Closed
    killawaves.orgview history2010-04-15 17:45:13Closed
    kinozal.wsview history2010-04-15 18:22:18Open
    kludd.comview history2010-04-15 18:00:23Closed
    lasttorrents.orgview history2010-04-15 18:09:38Open
    leecherslair.comview history2010-04-15 17:49:52Closed
    libble.comview history2010-04-15 18:03:18Closed
    libitina.netview history2010-04-15 18:21:16Closed
    linuxmafia.netview history2010-04-15 17:40:43Offline
    linuxtracker.orgview history2010-04-15 17:56:11Closed
    lostfilm.tvview history2010-04-15 18:03:20Open
    magiciantorrents.comview history2010-04-15 17:49:07Closed
    masterstb.comview history2010-04-15 17:34:17Closed
    mazetorrents.netview history2010-04-15 17:40:43Offline
    medioteka.comview history2010-04-15 17:37:02Closed
    mega-bits.comview history2010-04-15 17:34:16Closed
    mentol.roview history2010-04-15 17:36:42Closed
    metal.iplay.roview history2010-04-15 18:21:21Closed
    metalbits.orgview history2010-04-15 17:45:09Closed
    midnight-scene.comview history2010-04-15 18:23:43Closed
    midnight-torrents.comview history2010-04-15 17:38:14Closed
    mma-central.org.ukview history2010-04-15 17:36:27Closed
    mma-tracker.netview history2010-04-15 17:38:15Closed
    mp3nerds.orgview history2010-04-15 18:22:21Closed
    mucis-vid.comview history2010-04-15 17:35:16Closed
    musicplace.lvview history2010-04-15 17:53:17Closed
    mytorrent.tvview history2010-04-15 17:35:14Closed
    norbits.netview history2010-04-15 18:00:21Closed
    nordic-t.orgview history2010-04-15 18:00:22Closed
    nordicbits.orgview history2010-04-15 18:24:26Closed
    novaro.infoview history2010-04-15 18:16:56Closed
    novaro.infoview history2010-04-15 18:07:02Closed
    noviteti.comview history2010-04-15 18:09:35Closed
    ntorrents.netview history2010-04-15 17:34:13Closed
    nutorrent.comview history2010-04-15 18:14:45Open
    opennetwork.roview history2010-04-15 17:40:42Closed
    overtopropetorrents.comview history2010-04-15 17:49:55Closed
    ozone-torrents.orgview history2010-04-15 18:00:26Closed
    packme.inview history2010-04-15 17:49:54Closed
    Pedros btmusicview history2010-04-15 18:17:17Closed
    pianosheets.orgview history2010-04-15 18:17:16Closed
    pinkytorrents.comview history2010-04-15 18:03:11Open
    piranha.excom.usview history2010-04-15 17:40:43Open
    Pirate The Net (PtN)view history2010-04-15 17:40:45Closed
    piratebits.orgview history2010-04-15 17:44:14Closed
    piratefiles.seview history2010-04-15 18:17:11Closed
    piratetorrents.nuview history2010-04-15 18:00:28Closed
    pisexy.orgview history2010-04-15 17:56:16Closed
    polishbytes.netview history2010-04-15 17:57:00Open
    polishtracker.orgview history2010-04-15 18:05:34Closed
    pornbay.orgview history2010-04-15 18:09:11Open
    PotUKview history2010-04-15 17:37:21Closed
    powerscene.orgview history2010-04-15 18:14:14Closed
    pretome.netview history2010-04-15 17:40:44Closed
    proaudiotorrents.orgview history2010-04-15 18:03:17Closed
    psytorrents.infoview history2010-04-15 17:49:54Closed
    ptfiles.orgview history2010-04-15 18:03:49Closed
    punkhc.dyndns.orgview history2010-04-15 17:56:12Closed
    puretna.comview history2010-04-15 17:40:53Open
    pussytorrents.orgview history2010-04-15 18:05:34Open
    rapthe.netview history2010-04-15 18:21:22Closed
    rarbg.comview history2010-04-15 18:04:33Open
    reload-paradise.netview history2010-04-15 18:05:55Closed
    revolutiontt.netview history2010-04-15 18:21:55Closed
    rmvbustersview history2010-04-15 18:00:23Open
    rmvbusters.plview history2010-04-15 18:03:09Open
    scaliwags.orgview history2010-04-15 18:09:42Closed
    scene-gold.infoview history2010-04-15 17:37:27Offline
    scene-inspired.comview history2010-04-15 18:03:18Open
    sceneaccess.orgview history2010-04-15 17:40:44Closed
    scenebytes.clview history2010-04-15 17:38:10Closed
    scenehd.orgview history2010-04-15 17:45:03Closed
    sceneleech.orgview history2010-04-15 17:57:00Closed
    SceneLife (ScL)view history2010-04-15 18:23:43Closed
    scenetorrents.orgview history2010-04-15 18:23:44Closed
    scenetuga.orgview history2010-04-15 18:09:37Closed
    sciencehd.netview history2010-04-15 17:53:14Closed
    scifitorrents.netview history2010-04-15 17:45:16Offline
    secret-cinema.netview history2010-04-15 18:09:44Closed
    seductiongr.comview history2010-04-15 18:22:20Closed
    seedgames.orgview history2010-04-15 18:10:01Open
    seedmore.orgview history2010-04-15 17:49:07Closed
    sendthatshit.orgview history2010-04-15 18:23:44Open
    sharetorrents.plview history2010-04-15 17:34:13Closed
    sharing-torrents.comview history2010-04-15 18:21:18Closed
    slosoul.netview history2010-04-15 17:35:19Closed
    snowtigers.netview history2010-04-15 17:49:49Closed
    softmp3.orgview history2010-04-15 18:14:44Closed
    softmupparna.netview history2010-04-15 18:09:11Closed
    sounddamage.comview history2010-04-15 18:09:25Closed
    spanishtracker.comview history2010-04-15 17:37:27Open
    spank-d-monkey.comview history2010-04-15 18:24:23Closed
    special.pwtorrents.netview history2010-04-15 18:17:19Closed
    speed.cdview history2010-04-15 17:53:17Closed
    spiryt.ath.cxview history2010-04-15 17:49:49Closed
    sport-scene.netview history2010-04-15 18:17:19Closed
    sportbit.orgview history2010-04-15 18:09:09Closed
    sportleech.netview history2010-04-15 17:40:48Closed
    stmusic.orgview history2010-04-15 18:09:23Open
    supertorrents.orgview history2010-04-15 17:57:00Open
    swebits.orgview history2010-04-15 17:49:54Closed
    sweninjaz.orgview history2010-04-15 18:21:15Closed
    swep2p.orgview history2010-04-15 17:37:25Closed
    swepiracy.orgview history2010-04-15 18:24:22Closed
    swetorrents.no-ip.orgview history2010-04-15 17:35:10Closed
    taiphimhd.comview history2010-04-15 17:40:49Open
    tastetherainbow.wsview history2010-04-15 17:56:13Closed
    teamofgreekz.comview history2010-04-15 18:23:46Closed
    tehconnection.euview history2010-04-15 18:06:22Closed
    the-zomb.comview history2010-04-15 17:38:13Open
    thebox.bzview history2010-04-15 18:09:44Open
    thedvdclub.orgview history2010-04-15 17:49:50Open
    thegt.netview history2010-04-15 18:00:20Closed
    themixingbowl.orgview history2010-04-15 17:38:10Closed
    theoccult.bzview history2010-04-15 17:56:12Closed
    thepeerhub.comview history2010-04-15 18:24:16Open
    theplace.bzview history2010-04-15 18:09:17Closed
    thepokerbay.orgview history2010-04-15 17:36:33Open
    thevault.bzview history2010-04-15 18:14:45Closed
    titaniumtorrents.netview history2010-04-15 17:45:48Offline
    tmtorrents.orgview history2010-04-15 18:00:21Closed
    topbytes.netview history2010-04-15 17:37:17Closed
    topbytes.netview history2010-04-15 18:14:15Closed
    tophos.orgview history2010-04-15 18:24:22Closed
    torrent-damage.netview history2010-04-15 18:22:22Closed
    torrent.itview history2010-04-15 18:24:16Closed
    torrent411.comview history2010-04-15 17:45:12Open
    torrentbits.roview history2010-04-15 17:37:20Closed
    torrentbully.comview history2010-04-15 18:17:15Closed
    torrentdownloads.netview history2010-04-15 18:05:55Open
    torrentgaming.netview history2010-04-15 18:24:19Closed
    torrentgeeks.comview history2010-04-15 18:17:20Offline
    torrenthr.orgview history2010-04-15 18:24:16Open
    torrentkings.orgview history2010-04-15 17:53:09Closed
    torrentleech.orgview history2010-04-15 18:22:46Closed
    torrentseed.orgview history2010-04-15 17:35:15Closed
    torrentsforall.netview history2010-04-15 17:45:47Open
    torrentsmd.comview history2010-04-15 18:00:20Open
    torrentvault.orgview history2010-04-15 17:40:51Closed
    torrentzilla.orgview history2010-04-15 18:24:11Open
    torrentzone.netview history2010-04-15 17:45:04Open
    totaltorrents.comview history2010-04-15 17:37:31Closed
    trancebits.comview history2010-04-15 18:05:34Closed
    trancebooster.netview history2010-04-15 17:56:11Closed
    trancetraffic.comview history2010-04-15 17:37:18Closed
    tri-tavern.comview history2010-04-15 18:23:19Closed
    tribalmixes.comview history2010-04-15 18:20:39Open
    tugaleech.comview history2010-04-15 18:24:25Closed
    tunebully.comview history2010-04-15 17:49:08Closed
    tv.torrents.roview history2010-04-15 17:35:11Closed
    tvtorrents.comview history2010-04-15 17:38:02Open
    ugstorrents.comview history2010-04-15 18:09:15Closed
    uknova.comview history2010-04-15 18:14:15Closed
    underground-gamer.comview history2010-04-15 17:49:06Open
    victorrent.netview history2010-04-15 17:45:14Closed
    vortexnetwork.orgview history2010-04-15 17:53:16Offline
    waffles.fmview history2010-04-15 17:53:12Closed
    wantedfiles.roview history2010-04-15 17:49:07Open
    warezbros.orgview history2010-04-15 18:03:20Closed
    what.cdview history2010-04-15 17:53:12Closed
    wild-bytes.orgview history2010-04-15 18:00:27Closed
    wolfbits.orgview history2010-04-15 18:14:09Closed
    worldboxingvideoarchive.comview history2010-04-15 18:09:10Open
    www.bt-pt.netview history2010-04-15 18:09:45Closed
    www.llywot.comview history2010-04-15 17:53:13Closed
    xbitz.orgview history2010-04-15 18:21:21Open
    xider.huview history2010-04-15 18:05:34Open
    xtremespeeds.netview history2010-04-15 18:04:33Closed
    xtremewrestlingtorrents.netview history2010-04-15 18:00:27Open
    xtremezone.roview history2010-04-15 18:14:43Closed
    yuwabits.netview history2010-04-15 17:45:17Open
    zanettetorrent.comview history2010-04-15 18:17:12Closed
    zinebytes.orgview history2010-04-15 17:34:18Closed
    -
    -


    - - -
    - - - - - - diff --git a/node_modules/jsdom/node_modules/htmlparser/tests/01-basic.js b/node_modules/jsdom/node_modules/htmlparser/tests/01-basic.js deleted file mode 100644 index 7846898..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/tests/01-basic.js +++ /dev/null @@ -1,61 +0,0 @@ -(function () { - -function RunningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!RunningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - if (!this.Tautologistics.NodeHtmlParser) - this.Tautologistics.NodeHtmlParser = {}; - if (!this.Tautologistics.NodeHtmlParser.Tests) - this.Tautologistics.NodeHtmlParser.Tests = []; - exports = {}; - this.Tautologistics.NodeHtmlParser.Tests.push(exports); -} - -exports.name = "Basic test"; -exports.options = { - handler: {} - , parser: {} -}; -exports.html = "The TitleHello world"; -exports.expected = - [ { raw: 'html' - , data: 'html' - , type: 'tag' - , name: 'html' - , children: - [ { raw: 'title' - , data: 'title' - , type: 'tag' - , name: 'title' - , children: [ { raw: 'The Title', data: 'The Title', type: 'text' } ] - } - , { raw: 'body' - , data: 'body' - , type: 'tag' - , name: 'body' - , children: - [ { raw: 'Hello world' - , data: 'Hello world' - , type: 'text' - } - ] - } - ] - } - ]; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/tests/02-single_tag_1.js b/node_modules/jsdom/node_modules/htmlparser/tests/02-single_tag_1.js deleted file mode 100644 index 1735b5e..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/tests/02-single_tag_1.js +++ /dev/null @@ -1,39 +0,0 @@ -(function () { - -function RunningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!RunningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - if (!this.Tautologistics.NodeHtmlParser) - this.Tautologistics.NodeHtmlParser = {}; - if (!this.Tautologistics.NodeHtmlParser.Tests) - this.Tautologistics.NodeHtmlParser.Tests = []; - exports = {}; - this.Tautologistics.NodeHtmlParser.Tests.push(exports); -} - -exports.name = "Single Tag 1"; -exports.options = { - handler: {} - , parser: {} -}; -exports.html = "
    text
    "; -exports.expected = - [ { raw: 'br', data: 'br', type: 'tag', name: 'br' } - , { raw: 'text', data: 'text', type: 'text' } - ]; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/tests/03-single_tag_2.js b/node_modules/jsdom/node_modules/htmlparser/tests/03-single_tag_2.js deleted file mode 100644 index 2e6e92c..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/tests/03-single_tag_2.js +++ /dev/null @@ -1,40 +0,0 @@ -(function () { - -function RunningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!RunningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - if (!this.Tautologistics.NodeHtmlParser) - this.Tautologistics.NodeHtmlParser = {}; - if (!this.Tautologistics.NodeHtmlParser.Tests) - this.Tautologistics.NodeHtmlParser.Tests = []; - exports = {}; - this.Tautologistics.NodeHtmlParser.Tests.push(exports); -} - -exports.name = "Single Tag 2"; -exports.options = { - handler: {} - , parser: {} -}; -exports.html = "
    text
    "; -exports.expected = - [ { raw: 'br', data: 'br', type: 'tag', name: 'br' } - , { raw: 'text', data: 'text', type: 'text' } - , { raw: 'br', data: 'br', type: 'tag', name: 'br' } - ]; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/tests/04-unescaped_in_script.js b/node_modules/jsdom/node_modules/htmlparser/tests/04-unescaped_in_script.js deleted file mode 100644 index fb2cc3a..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/tests/04-unescaped_in_script.js +++ /dev/null @@ -1,56 +0,0 @@ -(function () { - -function RunningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!RunningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - if (!this.Tautologistics.NodeHtmlParser) - this.Tautologistics.NodeHtmlParser = {}; - if (!this.Tautologistics.NodeHtmlParser.Tests) - this.Tautologistics.NodeHtmlParser.Tests = []; - exports = {}; - this.Tautologistics.NodeHtmlParser.Tests.push(exports); -} - -exports.name = "Unescaped chars in script"; -exports.options = { - handler: {} - , parser: {} -}; -exports.html = ""; -exports.expected = -[ { raw: 'head' - , data: 'head' - , type: 'tag' - , name: 'head' - , children: - [ { raw: 'script language="Javascript"' - , data: 'script language="Javascript"' - , type: 'script' - , name: 'script' - , attribs: { language: 'Javascript' } - , children: - [ { raw: 'var foo = ""; alert(2 > foo); var baz = 10 << 2; var zip = 10 >> 1; var yap = \"<<>>>><<\";' - , data: 'var foo = ""; alert(2 > foo); var baz = 10 << 2; var zip = 10 >> 1; var yap = \"<<>>>><<\";' - , type: 'text' - } - ] - } - ] - } -]; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/tests/05-tags_in_comment.js b/node_modules/jsdom/node_modules/htmlparser/tests/05-tags_in_comment.js deleted file mode 100644 index 68a0779..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/tests/05-tags_in_comment.js +++ /dev/null @@ -1,48 +0,0 @@ -(function () { - -function RunningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!RunningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - if (!this.Tautologistics.NodeHtmlParser) - this.Tautologistics.NodeHtmlParser = {}; - if (!this.Tautologistics.NodeHtmlParser.Tests) - this.Tautologistics.NodeHtmlParser.Tests = []; - exports = {}; - this.Tautologistics.NodeHtmlParser.Tests.push(exports); -} - -exports.name = "Special char in comment"; -exports.options = { - handler: {} - , parser: {} -}; -exports.html = ""; -exports.expected = -[ { raw: 'head' - , data: 'head' - , type: 'tag' - , name: 'head' - , children: - [ { raw: ' commented out tags Test' - , data: ' commented out tags Test' - , type: 'comment' - } - ] - } -]; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/tests/06-comment_in_script.js b/node_modules/jsdom/node_modules/htmlparser/tests/06-comment_in_script.js deleted file mode 100644 index 2d04ec0..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/tests/06-comment_in_script.js +++ /dev/null @@ -1,48 +0,0 @@ -(function () { - -function RunningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!RunningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - if (!this.Tautologistics.NodeHtmlParser) - this.Tautologistics.NodeHtmlParser = {}; - if (!this.Tautologistics.NodeHtmlParser.Tests) - this.Tautologistics.NodeHtmlParser.Tests = []; - exports = {}; - this.Tautologistics.NodeHtmlParser.Tests.push(exports); -} - -exports.name = "Script source in comment"; -exports.options = { - handler: {} - , parser: {} -}; -exports.html = ""; -exports.expected = -[ { raw: 'script' - , data: 'script' - , type: 'script' - , name: 'script' - , children: - [ { raw: 'var foo = 1;' - , data: 'var foo = 1;' - , type: 'comment' - } - ] - } -]; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/tests/07-unescaped_in_style.js b/node_modules/jsdom/node_modules/htmlparser/tests/07-unescaped_in_style.js deleted file mode 100644 index 563a64a..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/tests/07-unescaped_in_style.js +++ /dev/null @@ -1,49 +0,0 @@ -(function () { - -function RunningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!RunningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - if (!this.Tautologistics.NodeHtmlParser) - this.Tautologistics.NodeHtmlParser = {}; - if (!this.Tautologistics.NodeHtmlParser.Tests) - this.Tautologistics.NodeHtmlParser.Tests = []; - exports = {}; - this.Tautologistics.NodeHtmlParser.Tests.push(exports); -} - -exports.name = "Unescaped chars in style"; -exports.options = { - handler: {} - , parser: {} -}; -exports.html = ""; -exports.expected = -[ { raw: 'style type="text/css"' - , data: 'style type="text/css"' - , type: 'style' - , name: 'style' - , attribs: { type: 'text/css' } - , children: - [ { raw: '\n body > p\n { font-weight: bold; }' - , data: '\n body > p\n { font-weight: bold; }' - , type: 'text' - } - ] - } -]; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/tests/08-extra_spaces_in_tag.js b/node_modules/jsdom/node_modules/htmlparser/tests/08-extra_spaces_in_tag.js deleted file mode 100644 index 1767565..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/tests/08-extra_spaces_in_tag.js +++ /dev/null @@ -1,49 +0,0 @@ -(function () { - -function RunningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!RunningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - if (!this.Tautologistics.NodeHtmlParser) - this.Tautologistics.NodeHtmlParser = {}; - if (!this.Tautologistics.NodeHtmlParser.Tests) - this.Tautologistics.NodeHtmlParser.Tests = []; - exports = {}; - this.Tautologistics.NodeHtmlParser.Tests.push(exports); -} - -exports.name = "Extra spaces in tag"; -exports.options = { - handler: {} - , parser: {} -}; -exports.html = "<\n font \n size='14' \n>the text<\n / \nfont \n>"; -exports.expected = -[ { raw: '\n font \n size=\'14\' \n' - , data: 'font \n size=\'14\'' - , type: 'tag' - , name: 'font' - , attribs: { size: '14' } - , children: - [ { raw: 'the text' - , data: 'the text' - , type: 'text' - } - ] - } -]; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/tests/09-unquoted_attrib.js b/node_modules/jsdom/node_modules/htmlparser/tests/09-unquoted_attrib.js deleted file mode 100644 index da6bac7..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/tests/09-unquoted_attrib.js +++ /dev/null @@ -1,49 +0,0 @@ -(function () { - -function RunningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!RunningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - if (!this.Tautologistics.NodeHtmlParser) - this.Tautologistics.NodeHtmlParser = {}; - if (!this.Tautologistics.NodeHtmlParser.Tests) - this.Tautologistics.NodeHtmlParser.Tests = []; - exports = {}; - this.Tautologistics.NodeHtmlParser.Tests.push(exports); -} - -exports.name = "Unquoted attributes"; -exports.options = { - handler: {} - , parser: {} -}; -exports.html = "the text"; -exports.expected = -[ { raw: 'font size= 14' - , data: 'font size= 14' - , type: 'tag' - , name: 'font' - , attribs: { size: '14' } - , children: - [ { raw: 'the text' - , data: 'the text' - , type: 'text' - } - ] - } -]; - -})(); diff --git a/node_modules/jsdom/node_modules/htmlparser/tests/10-singular_attribute.js b/node_modules/jsdom/node_modules/htmlparser/tests/10-singular_attribute.js deleted file mode 100644 index 6c22e1a..0000000 --- a/node_modules/jsdom/node_modules/htmlparser/tests/10-singular_attribute.js +++ /dev/null @@ -1,43 +0,0 @@ -(function () { - -function RunningInNode () { - return( - (typeof require) == "function" - && - (typeof exports) == "object" - && - (typeof module) == "object" - && - (typeof __filename) == "string" - && - (typeof __dirname) == "string" - ); -} - -if (!RunningInNode()) { - if (!this.Tautologistics) - this.Tautologistics = {}; - if (!this.Tautologistics.NodeHtmlParser) - this.Tautologistics.NodeHtmlParser = {}; - if (!this.Tautologistics.NodeHtmlParser.Tests) - this.Tautologistics.NodeHtmlParser.Tests = []; - exports = {}; - this.Tautologistics.NodeHtmlParser.Tests.push(exports); -} - -exports.name = "Singular attribute"; -exports.options = { - handler: {} - , parser: {} -}; -exports.html = "
    etc. - break; - tokenizer = tag_open_state; - break; - case 0x0000: // NULL - // Usually null characters emitted by the tokenizer will be - // ignored by the tree builder, but sometimes they'll be - // converted to \uFFFD. I don't want to have the search every - // string emitted to replace NULs, so I'll set a flag - // if I've emitted a NUL. - push(textrun,c); - textIncludesNUL = true; - break; - case EOF: - emitEOF(); - break; - default: - // Instead of just pushing a single character and then - // coming back to the very same place, lookahead and - // emit everything we can at once. - emitCharsWhile(DATATEXT) || push(textrun, c); - break; - } - } - - function character_reference_in_data_state(c, lookahead, eof) { - var char = parseCharRef(lookahead, false); - if (char !== null) { - if (typeof char === "number") push(textrun,char); - else pushAll(textrun, char); // An array of characters - } - else - push(textrun,0x0026); // AMPERSAND; - - tokenizer = data_state; - } - character_reference_in_data_state.lookahead = CHARREF; - - function rcdata_state(c) { - // Save the open tag so we can find a matching close tag - switch(c) { - case 0x0026: // AMPERSAND - tokenizer = character_reference_in_rcdata_state; - break; - case 0x003C: // LESS-THAN SIGN - tokenizer = rcdata_less_than_sign_state; - break; - case 0x0000: // NULL - push(textrun,0xFFFD); // REPLACEMENT CHARACTER - textIncludesNUL = true; - break; - case EOF: - emitEOF(); - break; - default: - push(textrun,c); - break; - } - } - - function character_reference_in_rcdata_state(c, lookahead, eof) { - var char = parseCharRef(lookahead, false); - if (char !== null) { - if (typeof char === "number") push(textrun,char); - else pushAll(textrun, char); // An array of characters - } - else - push(textrun,0x0026); // AMPERSAND; - - tokenizer = rcdata_state; - } - character_reference_in_rcdata_state.lookahead = CHARREF; - - function rawtext_state(c) { - switch(c) { - case 0x003C: // LESS-THAN SIGN - tokenizer = rawtext_less_than_sign_state; - break; - case 0x0000: // NULL - push(textrun,0xFFFD); // REPLACEMENT CHARACTER - break; - case EOF: - emitEOF(); - break; - default: - emitCharsWhile(RAWTEXT) || push(textrun, c); - break; - } - } - - function script_data_state(c) { - switch(c) { - case 0x003C: // LESS-THAN SIGN - tokenizer = script_data_less_than_sign_state; - break; - case 0x0000: // NULL - push(textrun,0xFFFD); // REPLACEMENT CHARACTER - break; - case EOF: - emitEOF(); - break; - default: - emitCharsWhile(RAWTEXT) || push(textrun, c); - break; - } - } - - function plaintext_state(c) { - switch(c) { - case 0x0000: // NULL - push(textrun,0xFFFD); // REPLACEMENT CHARACTER - break; - case EOF: - emitEOF(); - break; - default: - emitCharsWhile(PLAINTEXT) || push(textrun, c); - break; - } - } - - function tag_open_state(c) { - switch(c) { - case 0x0021: // EXCLAMATION MARK - tokenizer = markup_declaration_open_state; - break; - case 0x002F: // SOLIDUS - tokenizer = end_tag_open_state; - break; - case 0x0041: // [A-Z] - case 0x0042:case 0x0043:case 0x0044:case 0x0045:case 0x0046: - case 0x0047:case 0x0048:case 0x0049:case 0x004A:case 0x004B: - case 0x004C:case 0x004D:case 0x004E:case 0x004F:case 0x0050: - case 0x0051:case 0x0052:case 0x0053:case 0x0054:case 0x0055: - case 0x0056:case 0x0057:case 0x0058:case 0x0059:case 0x005A: - c += 0x20; // to lowercase - /* falls through */ - - case 0x0061: // [a-z] - case 0x0062:case 0x0063:case 0x0064:case 0x0065:case 0x0066: - case 0x0067:case 0x0068:case 0x0069:case 0x006A:case 0x006B: - case 0x006C:case 0x006D:case 0x006E:case 0x006F:case 0x0070: - case 0x0071:case 0x0072:case 0x0073:case 0x0074:case 0x0075: - case 0x0076:case 0x0077:case 0x0078:case 0x0079:case 0x007A: - beginTagName(); - appendChar(tagnamebuf, c); - tokenizer = tag_name_state; - break; - case 0x003F: // QUESTION MARK - nextchar--; // pushback - tokenizer = bogus_comment_state; - break; - default: - push(textrun,0x003C); // LESS-THAN SIGN - nextchar--; // pushback - tokenizer = data_state; - break; - } - } - - function end_tag_open_state(c) { - switch(c) { - case 0x0041: // [A-Z] - case 0x0042:case 0x0043:case 0x0044:case 0x0045:case 0x0046: - case 0x0047:case 0x0048:case 0x0049:case 0x004A:case 0x004B: - case 0x004C:case 0x004D:case 0x004E:case 0x004F:case 0x0050: - case 0x0051:case 0x0052:case 0x0053:case 0x0054:case 0x0055: - case 0x0056:case 0x0057:case 0x0058:case 0x0059:case 0x005A: - c += 0x20; // to lowercase - /* falls through */ - - case 0x0061: // [a-z] - case 0x0062:case 0x0063:case 0x0064:case 0x0065:case 0x0066: - case 0x0067:case 0x0068:case 0x0069:case 0x006A:case 0x006B: - case 0x006C:case 0x006D:case 0x006E:case 0x006F:case 0x0070: - case 0x0071:case 0x0072:case 0x0073:case 0x0074:case 0x0075: - case 0x0076:case 0x0077:case 0x0078:case 0x0079:case 0x007A: - beginEndTagName(); - appendChar(tagnamebuf, c); - tokenizer = tag_name_state; - break; - case 0x003E: // GREATER-THAN SIGN - tokenizer = data_state; - break; - case EOF: - push(textrun,0x003C); // LESS-THAN SIGN - push(textrun,0x002F); // SOLIDUS - nextchar--; // pushback - tokenizer = data_state; - break; - default: - nextchar--; // pushback - tokenizer = bogus_comment_state; - break; - } - } - - function tag_name_state(c) { - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - tokenizer = before_attribute_name_state; - break; - case 0x002F: // SOLIDUS - tokenizer = self_closing_start_tag_state; - break; - case 0x003E: // GREATER-THAN SIGN - tokenizer = data_state; - emitTag(); - break; - case 0x0041: // [A-Z] - case 0x0042:case 0x0043:case 0x0044:case 0x0045:case 0x0046: - case 0x0047:case 0x0048:case 0x0049:case 0x004A:case 0x004B: - case 0x004C:case 0x004D:case 0x004E:case 0x004F:case 0x0050: - case 0x0051:case 0x0052:case 0x0053:case 0x0054:case 0x0055: - case 0x0056:case 0x0057:case 0x0058:case 0x0059:case 0x005A: - appendChar(tagnamebuf, c + 0x0020); - break; - case 0x0000: // NULL - appendChar(tagnamebuf, 0xFFFD /* REPLACEMENT CHARACTER */); - break; - case EOF: - nextchar--; // pushback - tokenizer = data_state; - break; - default: - appendChar(tagnamebuf, c); - // appendCharsWhile(tagnamebuf, TAGNAMECHARS) || appendChar(tagnamebuf, c); - break; - } - } - - function rcdata_less_than_sign_state(c) { - /* identical to the RAWTEXT less-than sign state, except s/RAWTEXT/RCDATA/g */ - if (c === 0x002F) { // SOLIDUS - beginTempBuf(); - tokenizer = rcdata_end_tag_open_state; - } - else { - push(textrun,0x003C); // LESS-THAN SIGN - nextchar--; // pushback - tokenizer = rcdata_state; - } - } - - function rcdata_end_tag_open_state(c) { - /* identical to the RAWTEXT (and Script data) end tag open state, except s/RAWTEXT/RCDATA/g */ - switch(c) { - case 0x0041: // [A-Z] - case 0x0042:case 0x0043:case 0x0044:case 0x0045:case 0x0046: - case 0x0047:case 0x0048:case 0x0049:case 0x004A:case 0x004B: - case 0x004C:case 0x004D:case 0x004E:case 0x004F:case 0x0050: - case 0x0051:case 0x0052:case 0x0053:case 0x0054:case 0x0055: - case 0x0056:case 0x0057:case 0x0058:case 0x0059:case 0x005A: - beginEndTagName(); - appendChar(tagnamebuf, c + 0x0020); - appendChar(tempbuf, c); - tokenizer = rcdata_end_tag_name_state; - break; - case 0x0061: // [a-z] - case 0x0062:case 0x0063:case 0x0064:case 0x0065:case 0x0066: - case 0x0067:case 0x0068:case 0x0069:case 0x006A:case 0x006B: - case 0x006C:case 0x006D:case 0x006E:case 0x006F:case 0x0070: - case 0x0071:case 0x0072:case 0x0073:case 0x0074:case 0x0075: - case 0x0076:case 0x0077:case 0x0078:case 0x0079:case 0x007A: - beginEndTagName(); - appendChar(tagnamebuf, c); - appendChar(tempbuf, c); - tokenizer = rcdata_end_tag_name_state; - break; - default: - push(textrun,0x003C); // LESS-THAN SIGN - push(textrun,0x002F); // SOLIDUS - nextchar--; // pushback - tokenizer = rcdata_state; - break; - } - } - - function rcdata_end_tag_name_state(c) { - /* identical to the RAWTEXT (and Script data) end tag name state, except s/RAWTEXT/RCDATA/g */ - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - if (appropriateEndTag(tagnamebuf)) { - tokenizer = before_attribute_name_state; - return; - } - break; - case 0x002F: // SOLIDUS - if (appropriateEndTag(tagnamebuf)) { - tokenizer = self_closing_start_tag_state; - return; - } - break; - case 0x003E: // GREATER-THAN SIGN - if (appropriateEndTag(tagnamebuf)) { - tokenizer = data_state; - emitTag(); - return; - } - break; - case 0x0041: // [A-Z] - case 0x0042:case 0x0043:case 0x0044:case 0x0045:case 0x0046: - case 0x0047:case 0x0048:case 0x0049:case 0x004A:case 0x004B: - case 0x004C:case 0x004D:case 0x004E:case 0x004F:case 0x0050: - case 0x0051:case 0x0052:case 0x0053:case 0x0054:case 0x0055: - case 0x0056:case 0x0057:case 0x0058:case 0x0059:case 0x005A: - - appendChar(tagnamebuf, c + 0x0020); - appendChar(tempbuf, c); - return; - case 0x0061: // [a-z] - case 0x0062:case 0x0063:case 0x0064:case 0x0065:case 0x0066: - case 0x0067:case 0x0068:case 0x0069:case 0x006A:case 0x006B: - case 0x006C:case 0x006D:case 0x006E:case 0x006F:case 0x0070: - case 0x0071:case 0x0072:case 0x0073:case 0x0074:case 0x0075: - case 0x0076:case 0x0077:case 0x0078:case 0x0079:case 0x007A: - - appendChar(tagnamebuf, c); - appendChar(tempbuf, c); - return; - default: - break; - } - - // If we don't return in one of the cases above, then this was not - // an appropriately matching close tag, so back out by emitting all - // the characters as text - push(textrun,0x003C); // LESS-THAN SIGN - push(textrun,0x002F); // SOLIDUS - pushAll(textrun, tempbuf); - nextchar--; // pushback - tokenizer = rcdata_state; - } - - function rawtext_less_than_sign_state(c) { - /* identical to the RCDATA less-than sign state, except s/RCDATA/RAWTEXT/g - */ - if (c === 0x002F) { // SOLIDUS - beginTempBuf(); - tokenizer = rawtext_end_tag_open_state; - } - else { - push(textrun,0x003C); // LESS-THAN SIGN - nextchar--; // pushback - tokenizer = rawtext_state; - } - } - - function rawtext_end_tag_open_state(c) { - /* identical to the RCDATA (and Script data) end tag open state, except s/RCDATA/RAWTEXT/g */ - switch(c) { - case 0x0041: // [A-Z] - case 0x0042:case 0x0043:case 0x0044:case 0x0045:case 0x0046: - case 0x0047:case 0x0048:case 0x0049:case 0x004A:case 0x004B: - case 0x004C:case 0x004D:case 0x004E:case 0x004F:case 0x0050: - case 0x0051:case 0x0052:case 0x0053:case 0x0054:case 0x0055: - case 0x0056:case 0x0057:case 0x0058:case 0x0059:case 0x005A: - beginEndTagName(); - appendChar(tagnamebuf, c + 0x0020); - appendChar(tempbuf, c); - tokenizer = rawtext_end_tag_name_state; - break; - case 0x0061: // [a-z] - case 0x0062:case 0x0063:case 0x0064:case 0x0065:case 0x0066: - case 0x0067:case 0x0068:case 0x0069:case 0x006A:case 0x006B: - case 0x006C:case 0x006D:case 0x006E:case 0x006F:case 0x0070: - case 0x0071:case 0x0072:case 0x0073:case 0x0074:case 0x0075: - case 0x0076:case 0x0077:case 0x0078:case 0x0079:case 0x007A: - beginEndTagName(); - appendChar(tagnamebuf, c); - appendChar(tempbuf, c); - tokenizer = rawtext_end_tag_name_state; - break; - default: - push(textrun,0x003C); // LESS-THAN SIGN - push(textrun,0x002F); // SOLIDUS - nextchar--; // pushback - tokenizer = rawtext_state; - break; - } - } - - function rawtext_end_tag_name_state(c) { - /* identical to the RCDATA (and Script data) end tag name state, except s/RCDATA/RAWTEXT/g */ - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - if (appropriateEndTag(tagnamebuf)) { - tokenizer = before_attribute_name_state; - return; - } - break; - case 0x002F: // SOLIDUS - if (appropriateEndTag(tagnamebuf)) { - tokenizer = self_closing_start_tag_state; - return; - } - break; - case 0x003E: // GREATER-THAN SIGN - if (appropriateEndTag(tagnamebuf)) { - tokenizer = data_state; - emitTag(); - return; - } - break; - case 0x0041: // [A-Z] - case 0x0042:case 0x0043:case 0x0044:case 0x0045:case 0x0046: - case 0x0047:case 0x0048:case 0x0049:case 0x004A:case 0x004B: - case 0x004C:case 0x004D:case 0x004E:case 0x004F:case 0x0050: - case 0x0051:case 0x0052:case 0x0053:case 0x0054:case 0x0055: - case 0x0056:case 0x0057:case 0x0058:case 0x0059:case 0x005A: - appendChar(tagnamebuf, c + 0x0020); - appendChar(tempbuf, c); - return; - case 0x0061: // [a-z] - case 0x0062:case 0x0063:case 0x0064:case 0x0065:case 0x0066: - case 0x0067:case 0x0068:case 0x0069:case 0x006A:case 0x006B: - case 0x006C:case 0x006D:case 0x006E:case 0x006F:case 0x0070: - case 0x0071:case 0x0072:case 0x0073:case 0x0074:case 0x0075: - case 0x0076:case 0x0077:case 0x0078:case 0x0079:case 0x007A: - appendChar(tagnamebuf, c); - appendChar(tempbuf, c); - return; - default: - break; - } - - // If we don't return in one of the cases above, then this was not - // an appropriately matching close tag, so back out by emitting all - // the characters as text - push(textrun,0x003C); // LESS-THAN SIGN - push(textrun,0x002F); // SOLIDUS - pushAll(textrun,tempbuf); - nextchar--; // pushback - tokenizer = rawtext_state; - } - - function script_data_less_than_sign_state(c) { - switch(c) { - case 0x002F: // SOLIDUS - beginTempBuf(); - tokenizer = script_data_end_tag_open_state; - break; - case 0x0021: // EXCLAMATION MARK - tokenizer = script_data_escape_start_state; - push(textrun,0x003C); // LESS-THAN SIGN - push(textrun,0x0021); // EXCLAMATION MARK - break; - default: - push(textrun,0x003C); // LESS-THAN SIGN - nextchar--; // pushback - tokenizer = script_data_state; - break; - } - } - - function script_data_end_tag_open_state(c) { - /* identical to the RCDATA (and RAWTEXT) end tag open state, except s/RCDATA/Script data/g */ - switch(c) { - case 0x0041: // [A-Z] - case 0x0042:case 0x0043:case 0x0044:case 0x0045:case 0x0046: - case 0x0047:case 0x0048:case 0x0049:case 0x004A:case 0x004B: - case 0x004C:case 0x004D:case 0x004E:case 0x004F:case 0x0050: - case 0x0051:case 0x0052:case 0x0053:case 0x0054:case 0x0055: - case 0x0056:case 0x0057:case 0x0058:case 0x0059:case 0x005A: - beginEndTagName(); - appendChar(tagnamebuf, c + 0x0020); - appendChar(tempbuf, c); - tokenizer = script_data_end_tag_name_state; - break; - case 0x0061: // [a-z] - case 0x0062:case 0x0063:case 0x0064:case 0x0065:case 0x0066: - case 0x0067:case 0x0068:case 0x0069:case 0x006A:case 0x006B: - case 0x006C:case 0x006D:case 0x006E:case 0x006F:case 0x0070: - case 0x0071:case 0x0072:case 0x0073:case 0x0074:case 0x0075: - case 0x0076:case 0x0077:case 0x0078:case 0x0079:case 0x007A: - beginEndTagName(); - appendChar(tagnamebuf, c); - appendChar(tempbuf, c); - tokenizer = script_data_end_tag_name_state; - break; - default: - push(textrun,0x003C); // LESS-THAN SIGN - push(textrun,0x002F); // SOLIDUS - nextchar--; // pushback - tokenizer = script_data_state; - break; - } - } - - function script_data_end_tag_name_state(c) { - /* identical to the RCDATA (and RAWTEXT) end tag name state, except s/RCDATA/Script data/g */ - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - if (appropriateEndTag(tagnamebuf)) { - tokenizer = before_attribute_name_state; - return; - } - break; - case 0x002F: // SOLIDUS - if (appropriateEndTag(tagnamebuf)) { - tokenizer = self_closing_start_tag_state; - return; - } - break; - case 0x003E: // GREATER-THAN SIGN - if (appropriateEndTag(tagnamebuf)) { - tokenizer = data_state; - emitTag(); - return; - } - break; - case 0x0041: // [A-Z] - case 0x0042:case 0x0043:case 0x0044:case 0x0045:case 0x0046: - case 0x0047:case 0x0048:case 0x0049:case 0x004A:case 0x004B: - case 0x004C:case 0x004D:case 0x004E:case 0x004F:case 0x0050: - case 0x0051:case 0x0052:case 0x0053:case 0x0054:case 0x0055: - case 0x0056:case 0x0057:case 0x0058:case 0x0059:case 0x005A: - - appendChar(tagnamebuf, c + 0x0020); - appendChar(tempbuf, c); - return; - case 0x0061: // [a-z] - case 0x0062:case 0x0063:case 0x0064:case 0x0065:case 0x0066: - case 0x0067:case 0x0068:case 0x0069:case 0x006A:case 0x006B: - case 0x006C:case 0x006D:case 0x006E:case 0x006F:case 0x0070: - case 0x0071:case 0x0072:case 0x0073:case 0x0074:case 0x0075: - case 0x0076:case 0x0077:case 0x0078:case 0x0079:case 0x007A: - - appendChar(tagnamebuf, c); - appendChar(tempbuf, c); - return; - default: - break; - } - - // If we don't return in one of the cases above, then this was not - // an appropriately matching close tag, so back out by emitting all - // the characters as text - push(textrun,0x003C); // LESS-THAN SIGN - push(textrun,0x002F); // SOLIDUS - pushAll(textrun,tempbuf); - nextchar--; // pushback - tokenizer = script_data_state; - } - - function script_data_escape_start_state(c) { - if (c === 0x002D) { // HYPHEN-MINUS - tokenizer = script_data_escape_start_dash_state; - push(textrun,0x002D); // HYPHEN-MINUS - } - else { - nextchar--; // pushback - tokenizer = script_data_state; - } - } - - function script_data_escape_start_dash_state(c) { - if (c === 0x002D) { // HYPHEN-MINUS - tokenizer = script_data_escaped_dash_dash_state; - push(textrun,0x002D); // HYPHEN-MINUS - } - else { - nextchar--; // pushback - tokenizer = script_data_state; - } - } - - function script_data_escaped_state(c) { - switch(c) { - case 0x002D: // HYPHEN-MINUS - tokenizer = script_data_escaped_dash_state; - push(textrun,0x002D); // HYPHEN-MINUS - break; - case 0x003C: // LESS-THAN SIGN - tokenizer = script_data_escaped_less_than_sign_state; - break; - case 0x0000: // NULL - push(textrun,0xFFFD); // REPLACEMENT CHARACTER - break; - case EOF: - nextchar--; // pushback - tokenizer = data_state; - break; - default: - push(textrun,c); - break; - } - } - - function script_data_escaped_dash_state(c) { - switch(c) { - case 0x002D: // HYPHEN-MINUS - tokenizer = script_data_escaped_dash_dash_state; - push(textrun,0x002D); // HYPHEN-MINUS - break; - case 0x003C: // LESS-THAN SIGN - tokenizer = script_data_escaped_less_than_sign_state; - break; - case 0x0000: // NULL - tokenizer = script_data_escaped_state; - push(textrun,0xFFFD); // REPLACEMENT CHARACTER - break; - case EOF: - nextchar--; // pushback - tokenizer = data_state; - break; - default: - tokenizer = script_data_escaped_state; - push(textrun,c); - break; - } - } - - function script_data_escaped_dash_dash_state(c) { - switch(c) { - case 0x002D: // HYPHEN-MINUS - push(textrun,0x002D); // HYPHEN-MINUS - break; - case 0x003C: // LESS-THAN SIGN - tokenizer = script_data_escaped_less_than_sign_state; - break; - case 0x003E: // GREATER-THAN SIGN - tokenizer = script_data_state; - push(textrun,0x003E); // GREATER-THAN SIGN - break; - case 0x0000: // NULL - tokenizer = script_data_escaped_state; - push(textrun,0xFFFD); // REPLACEMENT CHARACTER - break; - case EOF: - nextchar--; // pushback - tokenizer = data_state; - break; - default: - tokenizer = script_data_escaped_state; - push(textrun,c); - break; - } - } - - function script_data_escaped_less_than_sign_state(c) { - switch(c) { - case 0x002F: // SOLIDUS - beginTempBuf(); - tokenizer = script_data_escaped_end_tag_open_state; - break; - case 0x0041: // [A-Z] - case 0x0042:case 0x0043:case 0x0044:case 0x0045:case 0x0046: - case 0x0047:case 0x0048:case 0x0049:case 0x004A:case 0x004B: - case 0x004C:case 0x004D:case 0x004E:case 0x004F:case 0x0050: - case 0x0051:case 0x0052:case 0x0053:case 0x0054:case 0x0055: - case 0x0056:case 0x0057:case 0x0058:case 0x0059:case 0x005A: - beginTempBuf(); - appendChar(tempbuf, c + 0x0020); - tokenizer = script_data_double_escape_start_state; - push(textrun,0x003C); // LESS-THAN SIGN - push(textrun,c); - break; - case 0x0061: // [a-z] - case 0x0062:case 0x0063:case 0x0064:case 0x0065:case 0x0066: - case 0x0067:case 0x0068:case 0x0069:case 0x006A:case 0x006B: - case 0x006C:case 0x006D:case 0x006E:case 0x006F:case 0x0070: - case 0x0071:case 0x0072:case 0x0073:case 0x0074:case 0x0075: - case 0x0076:case 0x0077:case 0x0078:case 0x0079:case 0x007A: - beginTempBuf(); - appendChar(tempbuf, c); - tokenizer = script_data_double_escape_start_state; - push(textrun,0x003C); // LESS-THAN SIGN - push(textrun,c); - break; - default: - push(textrun,0x003C); // LESS-THAN SIGN - nextchar--; // pushback - tokenizer = script_data_escaped_state; - break; - } - } - - function script_data_escaped_end_tag_open_state(c) { - switch(c) { - case 0x0041: // [A-Z] - case 0x0042:case 0x0043:case 0x0044:case 0x0045:case 0x0046: - case 0x0047:case 0x0048:case 0x0049:case 0x004A:case 0x004B: - case 0x004C:case 0x004D:case 0x004E:case 0x004F:case 0x0050: - case 0x0051:case 0x0052:case 0x0053:case 0x0054:case 0x0055: - case 0x0056:case 0x0057:case 0x0058:case 0x0059:case 0x005A: - beginEndTagName(); - appendChar(tagnamebuf, c + 0x0020); - appendChar(tempbuf, c); - tokenizer = script_data_escaped_end_tag_name_state; - break; - case 0x0061: // [a-z] - case 0x0062:case 0x0063:case 0x0064:case 0x0065:case 0x0066: - case 0x0067:case 0x0068:case 0x0069:case 0x006A:case 0x006B: - case 0x006C:case 0x006D:case 0x006E:case 0x006F:case 0x0070: - case 0x0071:case 0x0072:case 0x0073:case 0x0074:case 0x0075: - case 0x0076:case 0x0077:case 0x0078:case 0x0079:case 0x007A: - beginEndTagName(); - appendChar(tagnamebuf, c); - appendChar(tempbuf, c); - tokenizer = script_data_escaped_end_tag_name_state; - break; - default: - push(textrun,0x003C); // LESS-THAN SIGN - push(textrun,0x002F); // SOLIDUS - nextchar--; // pushback - tokenizer = script_data_escaped_state; - break; - } - } - - function script_data_escaped_end_tag_name_state(c) { - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - if (appropriateEndTag(tagnamebuf)) { - tokenizer = before_attribute_name_state; - return; - } - break; - case 0x002F: // SOLIDUS - if (appropriateEndTag(tagnamebuf)) { - tokenizer = self_closing_start_tag_state; - return; - } - break; - case 0x003E: // GREATER-THAN SIGN - if (appropriateEndTag(tagnamebuf)) { - tokenizer = data_state; - emitTag(); - return; - } - break; - case 0x0041: // [A-Z] - case 0x0042:case 0x0043:case 0x0044:case 0x0045:case 0x0046: - case 0x0047:case 0x0048:case 0x0049:case 0x004A:case 0x004B: - case 0x004C:case 0x004D:case 0x004E:case 0x004F:case 0x0050: - case 0x0051:case 0x0052:case 0x0053:case 0x0054:case 0x0055: - case 0x0056:case 0x0057:case 0x0058:case 0x0059:case 0x005A: - appendChar(tagnamebuf, c + 0x0020); - appendChar(tempbuf, c); - return; - case 0x0061: // [a-z] - case 0x0062:case 0x0063:case 0x0064:case 0x0065:case 0x0066: - case 0x0067:case 0x0068:case 0x0069:case 0x006A:case 0x006B: - case 0x006C:case 0x006D:case 0x006E:case 0x006F:case 0x0070: - case 0x0071:case 0x0072:case 0x0073:case 0x0074:case 0x0075: - case 0x0076:case 0x0077:case 0x0078:case 0x0079:case 0x007A: - appendChar(tagnamebuf, c); - appendChar(tempbuf, c); - return; - default: - break; - } - - // We get here in the default case, and if the closing tagname - // is not an appropriate tagname. - push(textrun,0x003C); // LESS-THAN SIGN - push(textrun,0x002F); // SOLIDUS - pushAll(textrun,tempbuf); - nextchar--; // pushback - tokenizer = script_data_escaped_state; - } - - function script_data_double_escape_start_state(c) { - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - case 0x002F: // SOLIDUS - case 0x003E: // GREATER-THAN SIGN - if (buf2str(tempbuf) === "script") { - tokenizer = script_data_double_escaped_state; - } - else { - tokenizer = script_data_escaped_state; - } - push(textrun,c); - break; - case 0x0041: // [A-Z] - case 0x0042:case 0x0043:case 0x0044:case 0x0045:case 0x0046: - case 0x0047:case 0x0048:case 0x0049:case 0x004A:case 0x004B: - case 0x004C:case 0x004D:case 0x004E:case 0x004F:case 0x0050: - case 0x0051:case 0x0052:case 0x0053:case 0x0054:case 0x0055: - case 0x0056:case 0x0057:case 0x0058:case 0x0059:case 0x005A: - appendChar(tempbuf, c + 0x0020); - push(textrun,c); - break; - case 0x0061: // [a-z] - case 0x0062:case 0x0063:case 0x0064:case 0x0065:case 0x0066: - case 0x0067:case 0x0068:case 0x0069:case 0x006A:case 0x006B: - case 0x006C:case 0x006D:case 0x006E:case 0x006F:case 0x0070: - case 0x0071:case 0x0072:case 0x0073:case 0x0074:case 0x0075: - case 0x0076:case 0x0077:case 0x0078:case 0x0079:case 0x007A: - appendChar(tempbuf, c); - push(textrun,c); - break; - default: - nextchar--; // pushback - tokenizer = script_data_escaped_state; - break; - } - } - - function script_data_double_escaped_state(c) { - switch(c) { - case 0x002D: // HYPHEN-MINUS - tokenizer = script_data_double_escaped_dash_state; - push(textrun,0x002D); // HYPHEN-MINUS - break; - case 0x003C: // LESS-THAN SIGN - tokenizer = script_data_double_escaped_less_than_sign_state; - push(textrun,0x003C); // LESS-THAN SIGN - break; - case 0x0000: // NULL - push(textrun,0xFFFD); // REPLACEMENT CHARACTER - break; - case EOF: - nextchar--; // pushback - tokenizer = data_state; - break; - default: - push(textrun,c); - break; - } - } - - function script_data_double_escaped_dash_state(c) { - switch(c) { - case 0x002D: // HYPHEN-MINUS - tokenizer = script_data_double_escaped_dash_dash_state; - push(textrun,0x002D); // HYPHEN-MINUS - break; - case 0x003C: // LESS-THAN SIGN - tokenizer = script_data_double_escaped_less_than_sign_state; - push(textrun,0x003C); // LESS-THAN SIGN - break; - case 0x0000: // NULL - tokenizer = script_data_double_escaped_state; - push(textrun,0xFFFD); // REPLACEMENT CHARACTER - break; - case EOF: - nextchar--; // pushback - tokenizer = data_state; - break; - default: - tokenizer = script_data_double_escaped_state; - push(textrun,c); - break; - } - } - - function script_data_double_escaped_dash_dash_state(c) { - switch(c) { - case 0x002D: // HYPHEN-MINUS - push(textrun,0x002D); // HYPHEN-MINUS - break; - case 0x003C: // LESS-THAN SIGN - tokenizer = script_data_double_escaped_less_than_sign_state; - push(textrun,0x003C); // LESS-THAN SIGN - break; - case 0x003E: // GREATER-THAN SIGN - tokenizer = script_data_state; - push(textrun,0x003E); // GREATER-THAN SIGN - break; - case 0x0000: // NULL - tokenizer = script_data_double_escaped_state; - push(textrun,0xFFFD); // REPLACEMENT CHARACTER - break; - case EOF: - nextchar--; // pushback - tokenizer = data_state; - break; - default: - tokenizer = script_data_double_escaped_state; - push(textrun,c); - break; - } - } - - function script_data_double_escaped_less_than_sign_state(c) { - if (c === 0x002F) { // SOLIDUS - beginTempBuf(); - tokenizer = script_data_double_escape_end_state; - push(textrun,0x002F); // SOLIDUS - } - else { - nextchar--; // pushback - tokenizer = script_data_double_escaped_state; - } - } - - function script_data_double_escape_end_state(c) { - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - case 0x002F: // SOLIDUS - case 0x003E: // GREATER-THAN SIGN - if (buf2str(tempbuf) === "script") { - tokenizer = script_data_escaped_state; - } - else { - tokenizer = script_data_double_escaped_state; - } - push(textrun,c); - break; - case 0x0041: // [A-Z] - case 0x0042:case 0x0043:case 0x0044:case 0x0045:case 0x0046: - case 0x0047:case 0x0048:case 0x0049:case 0x004A:case 0x004B: - case 0x004C:case 0x004D:case 0x004E:case 0x004F:case 0x0050: - case 0x0051:case 0x0052:case 0x0053:case 0x0054:case 0x0055: - case 0x0056:case 0x0057:case 0x0058:case 0x0059:case 0x005A: - appendChar(tempbuf, c + 0x0020); - push(textrun,c); - break; - case 0x0061: // [a-z] - case 0x0062:case 0x0063:case 0x0064:case 0x0065:case 0x0066: - case 0x0067:case 0x0068:case 0x0069:case 0x006A:case 0x006B: - case 0x006C:case 0x006D:case 0x006E:case 0x006F:case 0x0070: - case 0x0071:case 0x0072:case 0x0073:case 0x0074:case 0x0075: - case 0x0076:case 0x0077:case 0x0078:case 0x0079:case 0x007A: - appendChar(tempbuf, c); - push(textrun,c); - break; - default: - nextchar--; // pushback - tokenizer = script_data_double_escaped_state; - break; - } - } - - function before_attribute_name_state(c) { - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - /* Ignore the character. */ - break; - case 0x002F: // SOLIDUS - tokenizer = self_closing_start_tag_state; - break; - case 0x003E: // GREATER-THAN SIGN - tokenizer = data_state; - emitTag(); - break; - case 0x0041: // [A-Z] - case 0x0042:case 0x0043:case 0x0044:case 0x0045:case 0x0046: - case 0x0047:case 0x0048:case 0x0049:case 0x004A:case 0x004B: - case 0x004C:case 0x004D:case 0x004E:case 0x004F:case 0x0050: - case 0x0051:case 0x0052:case 0x0053:case 0x0054:case 0x0055: - case 0x0056:case 0x0057:case 0x0058:case 0x0059:case 0x005A: - beginAttrName(); - appendChar(attrnamebuf, c + 0x0020); - tokenizer = attribute_name_state; - break; - case 0x0000: // NULL - beginAttrName(); - appendChar(attrnamebuf, 0xFFFD); - tokenizer = attribute_name_state; - break; - case EOF: - nextchar--; // pushback - tokenizer = data_state; - break; - case 0x0022: // QUOTATION MARK - case 0x0027: // APOSTROPHE - case 0x003C: // LESS-THAN SIGN - case 0x003D: // EQUALS SIGN - /* falls through */ - default: - if (handleSimpleAttribute()) break; - beginAttrName(); - appendChar(attrnamebuf, c); - tokenizer = attribute_name_state; - break; - } - } - - function attribute_name_state(c) { - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - tokenizer = after_attribute_name_state; - break; - case 0x002F: // SOLIDUS - addAttribute(attrnamebuf); - tokenizer = self_closing_start_tag_state; - break; - case 0x003D: // EQUALS SIGN - beginAttrValue(); - tokenizer = before_attribute_value_state; - break; - case 0x003E: // GREATER-THAN SIGN - addAttribute(attrnamebuf); - tokenizer = data_state; - emitTag(); - break; - case 0x0041: // [A-Z] - case 0x0042:case 0x0043:case 0x0044:case 0x0045:case 0x0046: - case 0x0047:case 0x0048:case 0x0049:case 0x004A:case 0x004B: - case 0x004C:case 0x004D:case 0x004E:case 0x004F:case 0x0050: - case 0x0051:case 0x0052:case 0x0053:case 0x0054:case 0x0055: - case 0x0056:case 0x0057:case 0x0058:case 0x0059:case 0x005A: - appendChar(attrnamebuf, c + 0x0020); - break; - case 0x0000: // NULL - appendChar(attrnamebuf, 0xFFFD /* REPLACEMENT CHARACTER */); - break; - case EOF: - nextchar--; // pushback - tokenizer = data_state; - break; - case 0x0022: // QUOTATION MARK - case 0x0027: // APOSTROPHE - case 0x003C: // LESS-THAN SIGN - /* falls through */ - default: - appendChar(attrnamebuf, c); - break; - } - } - - function after_attribute_name_state(c) { - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - /* Ignore the character. */ - break; - case 0x002F: // SOLIDUS - addAttribute(attrnamebuf); - tokenizer = self_closing_start_tag_state; - break; - case 0x003D: // EQUALS SIGN - beginAttrValue(); - tokenizer = before_attribute_value_state; - break; - case 0x003E: // GREATER-THAN SIGN - tokenizer = data_state; - addAttribute(attrnamebuf); - emitTag(); - break; - case 0x0041: // [A-Z] - case 0x0042:case 0x0043:case 0x0044:case 0x0045:case 0x0046: - case 0x0047:case 0x0048:case 0x0049:case 0x004A:case 0x004B: - case 0x004C:case 0x004D:case 0x004E:case 0x004F:case 0x0050: - case 0x0051:case 0x0052:case 0x0053:case 0x0054:case 0x0055: - case 0x0056:case 0x0057:case 0x0058:case 0x0059:case 0x005A: - addAttribute(attrnamebuf); - beginAttrName(); - appendChar(attrnamebuf, c + 0x0020); - tokenizer = attribute_name_state; - break; - case 0x0000: // NULL - addAttribute(attrnamebuf); - beginAttrName(); - appendChar(attrnamebuf, 0xFFFD); - tokenizer = attribute_name_state; - break; - case EOF: - nextchar--; // pushback - tokenizer = data_state; - break; - case 0x0022: // QUOTATION MARK - case 0x0027: // APOSTROPHE - case 0x003C: // LESS-THAN SIGN - /* falls through */ - default: - addAttribute(attrnamebuf); - beginAttrName(); - appendChar(attrnamebuf, c); - tokenizer = attribute_name_state; - break; - } - } - - function before_attribute_value_state(c) { - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - /* Ignore the character. */ - break; - case 0x0022: // QUOTATION MARK - tokenizer = attribute_value_double_quoted_state; - break; - case 0x0026: // AMPERSAND - nextchar--; // pushback - tokenizer = attribute_value_unquoted_state; - break; - case 0x0027: // APOSTROPHE - tokenizer = attribute_value_single_quoted_state; - break; - case 0x0000: // NULL - appendChar(attrvaluebuf, 0xFFFD /* REPLACEMENT CHARACTER */); - tokenizer = attribute_value_unquoted_state; - break; - case 0x003E: // GREATER-THAN SIGN - addAttribute(attrnamebuf); - emitTag(); - tokenizer = data_state; - break; - case EOF: - nextchar--; // pushback - tokenizer = data_state; - break; - case 0x003C: // LESS-THAN SIGN - case 0x003D: // EQUALS SIGN - case 0x0060: // GRAVE ACCENT - /* falls through */ - default: - appendChar(attrvaluebuf, c); - tokenizer = attribute_value_unquoted_state; - break; - } - } - - function attribute_value_double_quoted_state(c) { - switch(c) { - case 0x0022: // QUOTATION MARK - addAttribute(attrnamebuf, attrvaluebuf); - tokenizer = after_attribute_value_quoted_state; - break; - case 0x0026: // AMPERSAND - pushState(); - tokenizer = character_reference_in_attribute_value_state; - break; - case 0x0000: // NULL - appendChar(attrvaluebuf, 0xFFFD /* REPLACEMENT CHARACTER */); - break; - case EOF: - nextchar--; // pushback - tokenizer = data_state; - break; - default: - appendChar(attrvaluebuf, c); - // appendCharsWhile(attrvaluebuf, DBLQUOTEATTRVAL); - break; - } - } - - function attribute_value_single_quoted_state(c) { - switch(c) { - case 0x0027: // APOSTROPHE - addAttribute(attrnamebuf, attrvaluebuf); - tokenizer = after_attribute_value_quoted_state; - break; - case 0x0026: // AMPERSAND - pushState(); - tokenizer = character_reference_in_attribute_value_state; - break; - case 0x0000: // NULL - appendChar(attrvaluebuf, 0xFFFD /* REPLACEMENT CHARACTER */); - break; - case EOF: - nextchar--; // pushback - tokenizer = data_state; - break; - default: - appendChar(attrvaluebuf, c); - // appendCharsWhile(attrvaluebuf, SINGLEQUOTEATTRVAL); - break; - } - } - - function attribute_value_unquoted_state(c) { - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - addAttribute(attrnamebuf, attrvaluebuf); - tokenizer = before_attribute_name_state; - break; - case 0x0026: // AMPERSAND - pushState(); - tokenizer = character_reference_in_attribute_value_state; - break; - case 0x003E: // GREATER-THAN SIGN - addAttribute(attrnamebuf, attrvaluebuf); - tokenizer = data_state; - emitTag(); - break; - case 0x0000: // NULL - appendChar(attrvaluebuf, 0xFFFD /* REPLACEMENT CHARACTER */); - break; - case EOF: - nextchar--; // pushback - tokenizer = data_state; - break; - case 0x0022: // QUOTATION MARK - case 0x0027: // APOSTROPHE - case 0x003C: // LESS-THAN SIGN - case 0x003D: // EQUALS SIGN - case 0x0060: // GRAVE ACCENT - /* falls through */ - default: - appendChar(attrvaluebuf, c); - // appendCharsWhile(attrvaluebuf, UNQUOTEDATTRVAL); - break; - } - } - - function character_reference_in_attribute_value_state(c, lookahead, eof) { - var char = parseCharRef(lookahead, true); - if (char !== null) { - if (typeof char === "number") - appendChar(attrvaluebuf, char); - else { - // An array of numbers - for(var i = 0; i < char.length; i++) { - appendChar(attrvaluebuf, char[i]); - } - } - } - else { - appendChar(attrvaluebuf, 0x0026); // AMPERSAND; - } - - popState(); - } - character_reference_in_attribute_value_state.lookahead = ATTRCHARREF; - - function after_attribute_value_quoted_state(c) { - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - tokenizer = before_attribute_name_state; - break; - case 0x002F: // SOLIDUS - tokenizer = self_closing_start_tag_state; - break; - case 0x003E: // GREATER-THAN SIGN - tokenizer = data_state; - emitTag(); - break; - case EOF: - nextchar--; // pushback - tokenizer = data_state; - break; - default: - nextchar--; // pushback - tokenizer = before_attribute_name_state; - break; - } - } - - function self_closing_start_tag_state(c) { - switch(c) { - case 0x003E: // GREATER-THAN SIGN - // Set the self-closing flag of the current tag token. - tokenizer = data_state; - emitSelfClosingTag(true); - break; - case EOF: - nextchar--; // pushback - tokenizer = data_state; - break; - default: - nextchar--; // pushback - tokenizer = before_attribute_name_state; - break; - } - } - - function bogus_comment_state(c, lookahead, eof) { - var len = lookahead.length; - - if (eof) { - nextchar += len-1; // don't consume the eof - } - else { - nextchar += len; - } - - var comment = substring(lookahead, 0, len-1); - - comment = replace(comment, /\u0000/g,"\uFFFD"); - comment = replace(comment, /\u000D\u000A/g,"\u000A"); - comment = replace(comment, /\u000D/g,"\u000A"); - - insertToken(COMMENT, comment); - tokenizer = data_state; - } - bogus_comment_state.lookahead = ">"; - - function markup_declaration_open_state(c, lookahead, eof) { - if (lookahead[0] === "-" && lookahead[1] === "-") { - nextchar += 2; - beginComment(); - tokenizer = comment_start_state; - return; - } - - if (toUpperCase(lookahead) === "DOCTYPE") { - nextchar += 7; - tokenizer = doctype_state; - } - else if (lookahead === "[CDATA[" && cdataAllowed()) { - nextchar += 7; - tokenizer = cdata_section_state; - } - else { - tokenizer = bogus_comment_state; - } - } - markup_declaration_open_state.lookahead = 7; - - function comment_start_state(c) { - beginComment(); - switch(c) { - case 0x002D: // HYPHEN-MINUS - tokenizer = comment_start_dash_state; - break; - case 0x0000: // NULL - appendChar(commentbuf, 0xFFFD /* REPLACEMENT CHARACTER */); - tokenizer = comment_state; - break; - case 0x003E: // GREATER-THAN SIGN - tokenizer = data_state; - insertToken(COMMENT, buf2str(commentbuf)); - break; /* see comment in comment end state */ - case EOF: - insertToken(COMMENT, buf2str(commentbuf)); - nextchar--; // pushback - tokenizer = data_state; - break; - default: - appendChar(commentbuf, c); - tokenizer = comment_state; - break; - } - } - - function comment_start_dash_state(c) { - switch(c) { - case 0x002D: // HYPHEN-MINUS - tokenizer = comment_end_state; - break; - case 0x0000: // NULL - appendChar(commentbuf, 0x002D /* HYPHEN-MINUS */); - appendChar(commentbuf, 0xFFFD); - tokenizer = comment_state; - break; - case 0x003E: // GREATER-THAN SIGN - tokenizer = data_state; - insertToken(COMMENT, buf2str(commentbuf)); - break; - case EOF: - insertToken(COMMENT, buf2str(commentbuf)); - nextchar--; // pushback - tokenizer = data_state; - break; /* see comment in comment end state */ - default: - appendChar(commentbuf, 0x002D /* HYPHEN-MINUS */); - appendChar(commentbuf, c); - tokenizer = comment_state; - break; - } - } - - function comment_state(c) { - switch(c) { - case 0x002D: // HYPHEN-MINUS - tokenizer = comment_end_dash_state; - break; - case 0x0000: // NULL - appendChar(commentbuf, 0xFFFD /* REPLACEMENT CHARACTER */); - break; - case EOF: - insertToken(COMMENT, buf2str(commentbuf)); - nextchar--; // pushback - tokenizer = data_state; - break; /* see comment in comment end state */ - default: - appendChar(commentbuf, c); - break; - } - } - - function comment_end_dash_state(c) { - switch(c) { - case 0x002D: // HYPHEN-MINUS - tokenizer = comment_end_state; - break; - case 0x0000: // NULL - appendChar(commentbuf, 0x002D /* HYPHEN-MINUS */); - appendChar(commentbuf, 0xFFFD); - tokenizer = comment_state; - break; - case EOF: - insertToken(COMMENT, buf2str(commentbuf)); - nextchar--; // pushback - tokenizer = data_state; - break; /* see comment in comment end state */ - default: - appendChar(commentbuf, 0x002D /* HYPHEN-MINUS */); - appendChar(commentbuf, c); - tokenizer = comment_state; - break; - } - } - - function comment_end_state(c) { - switch(c) { - case 0x003E: // GREATER-THAN SIGN - tokenizer = data_state; - insertToken(COMMENT, buf2str(commentbuf)); - break; - case 0x0000: // NULL - appendChar(commentbuf, 0x002D); - appendChar(commentbuf, 0x002D); - appendChar(commentbuf, 0xFFFD); - tokenizer = comment_state; - break; - case 0x0021: // EXCLAMATION MARK - tokenizer = comment_end_bang_state; - break; - case 0x002D: // HYPHEN-MINUS - appendChar(commentbuf, 0x002D); - break; - case EOF: - insertToken(COMMENT, buf2str(commentbuf)); - nextchar--; // pushback - tokenizer = data_state; - break; /* For security reasons: otherwise, hostile user could put a script in a comment e.g. in a blog comment and then DOS the server so that the end tag isn't read, and then the commented script tag would be treated as live code */ - default: - appendChar(commentbuf, 0x002D); - appendChar(commentbuf, 0x002D); - appendChar(commentbuf, c); - tokenizer = comment_state; - break; - } - } - - function comment_end_bang_state(c) { - switch(c) { - case 0x002D: // HYPHEN-MINUS - appendChar(commentbuf, 0x002D); - appendChar(commentbuf, 0x002D); - appendChar(commentbuf, 0x0021); - tokenizer = comment_end_dash_state; - break; - case 0x003E: // GREATER-THAN SIGN - tokenizer = data_state; - insertToken(COMMENT, buf2str(commentbuf)); - break; - case 0x0000: // NULL - appendChar(commentbuf, 0x002D); - appendChar(commentbuf, 0x002D); - appendChar(commentbuf, 0x0021); - appendChar(commentbuf, 0xFFFD); - tokenizer = comment_state; - break; - case EOF: - insertToken(COMMENT, buf2str(commentbuf)); - nextchar--; // pushback - tokenizer = data_state; - break; /* see comment in comment end state */ - default: - appendChar(commentbuf, 0x002D); - appendChar(commentbuf, 0x002D); - appendChar(commentbuf, 0x0021); - appendChar(commentbuf, c); - tokenizer = comment_state; - break; - } - } - - function doctype_state(c) { - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - tokenizer = before_doctype_name_state; - break; - case EOF: - beginDoctype(); - forcequirks(); - emitDoctype(); - nextchar--; // pushback - tokenizer = data_state; - break; - default: - nextchar--; // pushback - tokenizer = before_doctype_name_state; - break; - } - } - - function before_doctype_name_state(c) { - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - /* Ignore the character. */ - break; - case 0x0041: // [A-Z] - case 0x0042:case 0x0043:case 0x0044:case 0x0045:case 0x0046: - case 0x0047:case 0x0048:case 0x0049:case 0x004A:case 0x004B: - case 0x004C:case 0x004D:case 0x004E:case 0x004F:case 0x0050: - case 0x0051:case 0x0052:case 0x0053:case 0x0054:case 0x0055: - case 0x0056:case 0x0057:case 0x0058:case 0x0059:case 0x005A: - beginDoctype(); - appendChar(doctypenamebuf, c + 0x0020); - tokenizer = doctype_name_state; - break; - case 0x0000: // NULL - beginDoctype(); - appendChar(doctypenamebuf, 0xFFFD); - tokenizer = doctype_name_state; - break; - case 0x003E: // GREATER-THAN SIGN - beginDoctype(); - tokenizer = data_state; - forcequirks(); - emitDoctype(); - break; - case EOF: - beginDoctype(); - forcequirks(); - emitDoctype(); - nextchar--; // pushback - tokenizer = data_state; - break; - default: - beginDoctype(); - appendChar(doctypenamebuf, c); - tokenizer = doctype_name_state; - break; - } - } - - function doctype_name_state(c) { - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - tokenizer = after_doctype_name_state; - break; - case 0x003E: // GREATER-THAN SIGN - tokenizer = data_state; - emitDoctype(); - break; - case 0x0041: // [A-Z] - case 0x0042:case 0x0043:case 0x0044:case 0x0045:case 0x0046: - case 0x0047:case 0x0048:case 0x0049:case 0x004A:case 0x004B: - case 0x004C:case 0x004D:case 0x004E:case 0x004F:case 0x0050: - case 0x0051:case 0x0052:case 0x0053:case 0x0054:case 0x0055: - case 0x0056:case 0x0057:case 0x0058:case 0x0059:case 0x005A: - appendChar(doctypenamebuf, c + 0x0020); - break; - case 0x0000: // NULL - appendChar(doctypenamebuf, 0xFFFD /* REPLACEMENT CHARACTER */); - break; - case EOF: - forcequirks(); - emitDoctype(); - nextchar--; // pushback - tokenizer = data_state; - break; - default: - appendChar(doctypenamebuf, c); - break; - } - } - - function after_doctype_name_state(c, lookahead, eof) { - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - /* Ignore the character. */ - nextchar += 1; - break; - case 0x003E: // GREATER-THAN SIGN - tokenizer = data_state; - nextchar += 1; - emitDoctype(); - break; - case EOF: - forcequirks(); - emitDoctype(); - tokenizer = data_state; - break; - default: - lookahead = toUpperCase(lookahead); - if (lookahead === "PUBLIC") { - nextchar += 6; - tokenizer = after_doctype_public_keyword_state; - } - else if (lookahead === "SYSTEM") { - nextchar += 6; - tokenizer = after_doctype_system_keyword_state; - } - else { - forcequirks(); - tokenizer = bogus_doctype_state; - } - break; - } - } - after_doctype_name_state.lookahead = 6; - - function after_doctype_public_keyword_state(c) { - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - tokenizer = before_doctype_public_identifier_state; - break; - case 0x0022: // QUOTATION MARK - beginDoctypePublicId(); - tokenizer = doctype_public_identifier_double_quoted_state; - break; - case 0x0027: // APOSTROPHE - beginDoctypePublicId(); - tokenizer = doctype_public_identifier_single_quoted_state; - break; - case 0x003E: // GREATER-THAN SIGN - forcequirks(); - tokenizer = data_state; - emitDoctype(); - break; - case EOF: - forcequirks(); - emitDoctype(); - nextchar--; // pushback - tokenizer = data_state; - break; - default: - forcequirks(); - tokenizer = bogus_doctype_state; - break; - } - } - - function before_doctype_public_identifier_state(c) { - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - /* Ignore the character. */ - break; - case 0x0022: // QUOTATION MARK - beginDoctypePublicId(); - tokenizer = doctype_public_identifier_double_quoted_state; - break; - case 0x0027: // APOSTROPHE - beginDoctypePublicId(); - tokenizer = doctype_public_identifier_single_quoted_state; - break; - case 0x003E: // GREATER-THAN SIGN - forcequirks(); - tokenizer = data_state; - emitDoctype(); - break; - case EOF: - forcequirks(); - emitDoctype(); - nextchar--; // pushback - tokenizer = data_state; - break; - default: - forcequirks(); - tokenizer = bogus_doctype_state; - break; - } - } - - function doctype_public_identifier_double_quoted_state(c) { - switch(c) { - case 0x0022: // QUOTATION MARK - tokenizer = after_doctype_public_identifier_state; - break; - case 0x0000: // NULL - appendChar(doctypepublicbuf, 0xFFFD /* REPLACEMENT CHARACTER */); - break; - case 0x003E: // GREATER-THAN SIGN - forcequirks(); - tokenizer = data_state; - emitDoctype(); - break; - case EOF: - forcequirks(); - emitDoctype(); - nextchar--; // pushback - tokenizer = data_state; - break; - default: - appendChar(doctypepublicbuf, c); - break; - } - } - - function doctype_public_identifier_single_quoted_state(c) { - switch(c) { - case 0x0027: // APOSTROPHE - tokenizer = after_doctype_public_identifier_state; - break; - case 0x0000: // NULL - appendChar(doctypepublicbuf, 0xFFFD /* REPLACEMENT CHARACTER */); - break; - case 0x003E: // GREATER-THAN SIGN - forcequirks(); - tokenizer = data_state; - emitDoctype(); - break; - case EOF: - forcequirks(); - emitDoctype(); - nextchar--; // pushback - tokenizer = data_state; - break; - default: - appendChar(doctypepublicbuf, c); - break; - } - } - - function after_doctype_public_identifier_state(c) { - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - tokenizer = between_doctype_public_and_system_identifiers_state; - break; - case 0x003E: // GREATER-THAN SIGN - tokenizer = data_state; - emitDoctype(); - break; - case 0x0022: // QUOTATION MARK - beginDoctypeSystemId(); - tokenizer = doctype_system_identifier_double_quoted_state; - break; - case 0x0027: // APOSTROPHE - beginDoctypeSystemId(); - tokenizer = doctype_system_identifier_single_quoted_state; - break; - case EOF: - forcequirks(); - emitDoctype(); - nextchar--; // pushback - tokenizer = data_state; - break; - default: - forcequirks(); - tokenizer = bogus_doctype_state; - break; - } - } - - function between_doctype_public_and_system_identifiers_state(c) { - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE Ignore the character. - break; - case 0x003E: // GREATER-THAN SIGN - tokenizer = data_state; - emitDoctype(); - break; - case 0x0022: // QUOTATION MARK - beginDoctypeSystemId(); - tokenizer = doctype_system_identifier_double_quoted_state; - break; - case 0x0027: // APOSTROPHE - beginDoctypeSystemId(); - tokenizer = doctype_system_identifier_single_quoted_state; - break; - case EOF: - forcequirks(); - emitDoctype(); - nextchar--; // pushback - tokenizer = data_state; - break; - default: - forcequirks(); - tokenizer = bogus_doctype_state; - break; - } - } - - function after_doctype_system_keyword_state(c) { - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - tokenizer = before_doctype_system_identifier_state; - break; - case 0x0022: // QUOTATION MARK - beginDoctypeSystemId(); - tokenizer = doctype_system_identifier_double_quoted_state; - break; - case 0x0027: // APOSTROPHE - beginDoctypeSystemId(); - tokenizer = doctype_system_identifier_single_quoted_state; - break; - case 0x003E: // GREATER-THAN SIGN - forcequirks(); - tokenizer = data_state; - emitDoctype(); - break; - case EOF: - forcequirks(); - emitDoctype(); - nextchar--; // pushback - tokenizer = data_state; - break; - default: - forcequirks(); - tokenizer = bogus_doctype_state; - break; - } - } - - function before_doctype_system_identifier_state(c) { - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE Ignore the character. - break; - case 0x0022: // QUOTATION MARK - beginDoctypeSystemId(); - tokenizer = doctype_system_identifier_double_quoted_state; - break; - case 0x0027: // APOSTROPHE - beginDoctypeSystemId(); - tokenizer = doctype_system_identifier_single_quoted_state; - break; - case 0x003E: // GREATER-THAN SIGN - forcequirks(); - tokenizer = data_state; - emitDoctype(); - break; - case EOF: - forcequirks(); - emitDoctype(); - nextchar--; // pushback - tokenizer = data_state; - break; - default: - forcequirks(); - tokenizer = bogus_doctype_state; - break; - } - } - - function doctype_system_identifier_double_quoted_state(c) { - switch(c) { - case 0x0022: // QUOTATION MARK - tokenizer = after_doctype_system_identifier_state; - break; - case 0x0000: // NULL - appendChar(doctypesystembuf, 0xFFFD /* REPLACEMENT CHARACTER */); - break; - case 0x003E: // GREATER-THAN SIGN - forcequirks(); - tokenizer = data_state; - emitDoctype(); - break; - case EOF: - forcequirks(); - emitDoctype(); - nextchar--; // pushback - tokenizer = data_state; - break; - default: - appendChar(doctypesystembuf, c); - break; - } - } - - function doctype_system_identifier_single_quoted_state(c) { - switch(c) { - case 0x0027: // APOSTROPHE - tokenizer = after_doctype_system_identifier_state; - break; - case 0x0000: // NULL - appendChar(doctypesystembuf, 0xFFFD /* REPLACEMENT CHARACTER */); - break; - case 0x003E: // GREATER-THAN SIGN - forcequirks(); - tokenizer = data_state; - emitDoctype(); - break; - case EOF: - forcequirks(); - emitDoctype(); - nextchar--; // pushback - tokenizer = data_state; - break; - default: - appendChar(doctypesystembuf, c); - break; - } - } - - function after_doctype_system_identifier_state(c) { - switch(c) { - case 0x0009: // CHARACTER TABULATION (tab) - case 0x000A: // LINE FEED (LF) - case 0x000C: // FORM FEED (FF) - case 0x0020: // SPACE - /* Ignore the character. */ - break; - case 0x003E: // GREATER-THAN SIGN - tokenizer = data_state; - emitDoctype(); - break; - case EOF: - forcequirks(); - emitDoctype(); - nextchar--; // pushback - tokenizer = data_state; - break; - default: - tokenizer = bogus_doctype_state; - /* This does *not* set the DOCTYPE token's force-quirks flag. */ - break; - } - } - - function bogus_doctype_state(c) { - switch(c) { - case 0x003E: // GREATER-THAN SIGN - tokenizer = data_state; - emitDoctype(); - break; - case EOF: - emitDoctype(); - nextchar--; // pushback - tokenizer = data_state; - break; - default: - /* Ignore the character. */ - break; - } - } - - function cdata_section_state(c, lookahead, eof) { - var len = lookahead.length; - var output; - if (eof) { - nextchar += len-1; // leave the EOF in the scanner - output = substring(lookahead,0, len-1); // don't include the EOF - } - else { - nextchar += len; - output = substring(lookahead,0,len-3); // don't emit the ]]> - } - - if (output.length > 0) { - if (output.indexOf("\u0000") !== -1) - textIncludesNUL = true; - - // XXX Have to deal with CR and CRLF here? - if (output.indexOf("\r") !== -1) { - output = output.replace(/\r\n/, "\n").replace(/\r/, "\n"); - } - - emitCharString(output); - } - - tokenizer = data_state; - } - cdata_section_state.lookahead = "]]>"; - - - /*** - * The tree builder insertion modes - */ - - // 11.2.5.4.1 The "initial" insertion mode - function initial_mode(t, value, arg3, arg4) { - switch(t) { - case TEXT: - value = replace(value,LEADINGWS, ""); // Ignore spaces - if (value.length === 0) return; // Are we done? - break; // Handle anything non-space text below - case COMMENT: - doc.appendChild(doc.createComment(value)); - return; - case DOCTYPE: - var name = value; - var publicid = arg3; - var systemid = arg4; - // Use the constructor directly instead of - // implementation.createDocumentType because the create - // function throws errors on invalid characters, and - // we don't want the parser to throw them. - doc.appendChild(new impl.DocumentType(name,publicid, systemid)); - - // Note that there is no public API for setting quirks mode We can - // do this here because we have access to implementation details - if (force_quirks || - toLowerCase(name) !== "html" || - test(quirkyPublicIds, publicid) || - (systemid && toLowerCase(systemid) === quirkySystemId) || - (systemid === undefined && - test(conditionallyQuirkyPublicIds, publicid))) - doc._quirks = true; - else if (test(limitedQuirkyPublicIds, publicid) || - (systemid !== undefined && - test(conditionallyQuirkyPublicIds, publicid))) - doc._limitedQuirks = true; - parser = before_html_mode; - return; - } - - // tags or non-whitespace text - doc._quirks = true; - parser = before_html_mode; - parser(t,value,arg3,arg4); - } - - // 11.2.5.4.2 The "before html" insertion mode - function before_html_mode(t,value,arg3,arg4) { - var elt; - switch(t) { - case TEXT: - value = replace(value, LEADINGWS, ""); // Ignore spaces - if (value.length === 0) return; // Are we done? - break; // Handle anything non-space text below - case DOCTYPE: - /* ignore the token */ - return; - case COMMENT: - doc.appendChild(doc.createComment(value)); - return; - case TAG: - if (value === "html") { - elt = createHTMLElt(value, arg3); - stack.push(elt); - doc.appendChild(elt); - // XXX: handle application cache here - parser = before_head_mode; - return; - } - break; - case ENDTAG: - switch(value) { - case "html": - case "head": - case "body": - case "br": - break; // fall through on these - default: - return; // ignore most end tags - } - } - - // Anything that didn't get handled above is handled like this: - elt = createHTMLElt("html", null); - stack.push(elt); - doc.appendChild(elt); - // XXX: handle application cache here - parser = before_head_mode; - parser(t,value,arg3,arg4); - } - - // 11.2.5.4.3 The "before head" insertion mode - function before_head_mode(t,value,arg3,arg4) { - switch(t) { - case TEXT: - value = replace(value, LEADINGWS, ""); // Ignore spaces - if (value.length === 0) return; // Are we done? - break; // Handle anything non-space text below - case DOCTYPE: - /* ignore the token */ - return; - case COMMENT: - insertComment(value); - return; - case TAG: - switch(value) { - case "html": - in_body_mode(t,value,arg3,arg4); - return; - case "head": - var elt = insertHTMLElement(value, arg3); - head_element_pointer = elt; - parser = in_head_mode; - return; - } - break; - case ENDTAG: - switch(value) { - case "html": - case "head": - case "body": - case "br": - break; - default: - return; // ignore most end tags - } - } - - // If not handled explicitly above - before_head_mode(TAG, "head", null); // create a head tag - parser(t, value, arg3, arg4); // then try again with this token - } - - function in_head_mode(t, value, arg3, arg4) { - switch(t) { - case TEXT: - var ws = match(value, LEADINGWS); - if (ws) { - insertText(ws[0]); - value = substring(value,ws[0].length); - } - if (value.length === 0) return; - break; // Handle non-whitespace below - case COMMENT: - insertComment(value); - return; - case DOCTYPE: - return; - case TAG: - switch(value) { - case "html": - in_body_mode(t, value, arg3, arg4); - return; - case "meta": - // XXX: - // May need to change the encoding based on this tag - /* falls through */ - case "base": - case "basefont": - case "bgsound": - case "command": - case "link": - insertHTMLElement(value, arg3); - stack.pop(); - return; - case "title": - parseRCDATA(value, arg3); - return; - case "noscript": - if (!scripting_enabled) { - insertHTMLElement(value, arg3); - parser = in_head_noscript_mode; - return; - } - // Otherwise, if scripting is enabled... - /* falls through */ - case "noframes": - case "style": - parseRawText(value,arg3); - return; - case "script": - var elt = createHTMLElt(value, arg3); - elt._parser_inserted = true; - elt._force_async = false; - if (fragment) elt._already_started = true; - flushText(); - stack.top.appendChild(elt); - stack.push(elt); - tokenizer = script_data_state; - originalInsertionMode = parser; - parser = text_mode; - return; - case "head": - return; // ignore it - } - break; - case ENDTAG: - switch(value) { - case "head": - stack.pop(); - parser = after_head_mode; - return; - case "body": - case "html": - case "br": - break; // handle these at the bottom of the function - default: - // ignore any other end tag - return; - } - break; - } - - // If not handled above - in_head_mode(ENDTAG, "head", null); // synthetic - parser(t, value, arg3, arg4); // Then redo this one - } - - // 13.2.5.4.5 The "in head noscript" insertion mode - function in_head_noscript_mode(t, value, arg3, arg4) { - switch(t) { - case DOCTYPE: - return; - case COMMENT: - in_head_mode(t, value); - return; - case TEXT: - var ws = match(value, LEADINGWS); - if (ws) { - in_head_mode(t, ws[0]); - value = substring(value,ws[0].length); - } - if (value.length === 0) return; // no more text - break; // Handle non-whitespace below - case TAG: - switch(value) { - case "html": - in_body_mode(t, value, arg3, arg4); - return; - case "basefont": - case "bgsound": - case "link": - case "meta": - case "noframes": - case "style": - in_head_mode(t, value, arg3); - return; - case "head": - case "noscript": - return; - } - break; - case ENDTAG: - switch(value) { - case "noscript": - stack.pop(); - parser = in_head_mode; - return; - case "br": - break; // goes to the outer default - default: - return; // ignore other end tags - } - break; - } - - // If not handled above - in_head_noscript_mode(ENDTAG, "noscript", null); - parser(t, value, arg3, arg4); - } - - function after_head_mode(t, value, arg3, arg4) { - switch(t) { - case TEXT: - var ws = match(value, LEADINGWS); - if (ws) { - insertText(ws[0]); - value = substring(value,ws[0].length); - } - if (value.length === 0) return; - break; // Handle non-whitespace below - case COMMENT: - insertComment(value); - return; - case DOCTYPE: - return; - case TAG: - switch(value) { - case "html": - in_body_mode(t, value, arg3, arg4); - return; - case "body": - insertHTMLElement(value, arg3); - frameset_ok = false; - parser = in_body_mode; - return; - case "frameset": - insertHTMLElement(value, arg3); - parser = in_frameset_mode; - return; - case "base": - case "basefont": - case "bgsound": - case "link": - case "meta": - case "noframes": - case "script": - case "style": - case "title": - stack.push(head_element_pointer); - in_head_mode(TAG, value, arg3); - stack.removeElement(head_element_pointer); - return; - case "head": - return; - } - break; - case ENDTAG: - switch(value) { - case "body": - case "html": - case "br": - break; - default: - return; // ignore any other end tag - } - break; - } - - after_head_mode(TAG, "body", null); - frameset_ok = true; - parser(t, value, arg3, arg4); - } - - // 13.2.5.4.7 The "in body" insertion mode - function in_body_mode(t,value,arg3,arg4) { - var body, i, node; - switch(t) { - case TEXT: - if (textIncludesNUL) { - value = replace(value, NULCHARS, ""); - if (value.length === 0) return; - } - // If any non-space characters - if (frameset_ok && test(NONWS, value)) - frameset_ok = false; - afereconstruct(); - insertText(value); - return; - case DOCTYPE: - return; - case COMMENT: - insertComment(value); - return; - case EOF: - stopParsing(); - return; - case TAG: - switch(value) { - case "html": - transferAttributes(arg3, stack.elements[0]); - return; - case "base": - case "basefont": - case "bgsound": - case "command": - case "link": - case "meta": - case "noframes": - case "script": - case "style": - case "title": - in_head_mode(TAG, value, arg3); - return; - case "body": - body = stack.elements[1]; - if (!body || !(body instanceof impl.HTMLBodyElement)) - return; - frameset_ok = false; - transferAttributes(arg3, body); - return; - case "frameset": - if (!frameset_ok) return; - body = stack.elements[1]; - if (!body || !(body instanceof impl.HTMLBodyElement)) - return; - if (body.parentNode) body.parentNode.removeChild(body); - while(!(stack.top instanceof impl.HTMLHtmlElement)) - stack.pop(); - insertHTMLElement(value, arg3); - parser = in_frameset_mode; - return; - - case "address": - case "article": - case "aside": - case "blockquote": - case "center": - case "details": - case "dir": - case "div": - case "dl": - case "fieldset": - case "figcaption": - case "figure": - case "footer": - case "header": - case "hgroup": - case "menu": - case "nav": - case "ol": - case "p": - case "section": - case "summary": - case "ul": - if (stack.inButtonScope("p")) in_body_mode(ENDTAG, "p"); - insertHTMLElement(value, arg3); - return; - - case "h1": - case "h2": - case "h3": - case "h4": - case "h5": - case "h6": - if (stack.inButtonScope("p")) in_body_mode(ENDTAG, "p"); - if (stack.top instanceof impl.HTMLHeadingElement) - stack.pop(); - insertHTMLElement(value, arg3); - return; - - case "pre": - case "listing": - if (stack.inButtonScope("p")) in_body_mode(ENDTAG, "p"); - insertHTMLElement(value, arg3); - ignore_linefeed = true; - frameset_ok = false; - return; - - case "form": - if (form_element_pointer) return; - if (stack.inButtonScope("p")) in_body_mode(ENDTAG, "p"); - form_element_pointer = insertHTMLElement(value, arg3); - return; - - case "li": - frameset_ok = false; - for(i = stack.elements.length-1; i >= 0; i--) { - node = stack.elements[i]; - if (node instanceof impl.HTMLLIElement) { - in_body_mode(ENDTAG, "li"); - break; - } - if (isA(node, specialSet) && !isA(node, addressdivpSet)) - break; - } - if (stack.inButtonScope("p")) in_body_mode(ENDTAG, "p"); - insertHTMLElement(value, arg3); - return; - - case "dd": - case "dt": - frameset_ok = false; - for(i = stack.elements.length-1; i >= 0; i--) { - node = stack.elements[i]; - if (isA(node, dddtSet)) { - in_body_mode(ENDTAG, node.localName); - break; - } - if (isA(node, specialSet) && !isA(node, addressdivpSet)) - break; - } - if (stack.inButtonScope("p")) in_body_mode(ENDTAG, "p"); - insertHTMLElement(value, arg3); - return; - - case "plaintext": - if (stack.inButtonScope("p")) in_body_mode(ENDTAG, "p"); - insertHTMLElement(value, arg3); - tokenizer = plaintext_state; - return; - - case "button": - if (stack.inScope("button")) { - in_body_mode(ENDTAG, "button"); - parser(t, value, arg3, arg4); - } - else { - afereconstruct(); - insertHTMLElement(value, arg3); - frameset_ok = false; - } - return; - - case "a": - var activeElement = afe.findElementByTag("a"); - if (activeElement) { - in_body_mode(ENDTAG, value); - afe.remove(activeElement); - stack.removeElement(activeElement); - } - /* falls through */ - - case "b": - case "big": - case "code": - case "em": - case "font": - case "i": - case "s": - case "small": - case "strike": - case "strong": - case "tt": - case "u": - afereconstruct(); - afe.push(insertHTMLElement(value,arg3), arg3); - return; - - case "nobr": - afereconstruct(); - - if (stack.inScope(value)) { - in_body_mode(ENDTAG, value); - afereconstruct(); - } - afe.push(insertHTMLElement(value,arg3), arg3); - return; - - case "applet": - case "marquee": - case "object": - afereconstruct(); - insertHTMLElement(value,arg3); - afe.insertMarker(); - frameset_ok = false; - return; - - case "table": - if (!doc._quirks && stack.inButtonScope("p")) { - in_body_mode(ENDTAG, "p"); - } - insertHTMLElement(value,arg3); - frameset_ok = false; - parser = in_table_mode; - return; - - case "area": - case "br": - case "embed": - case "img": - case "keygen": - case "wbr": - afereconstruct(); - insertHTMLElement(value,arg3); - stack.pop(); - frameset_ok = false; - return; - - case "input": - afereconstruct(); - var elt = insertHTMLElement(value,arg3); - stack.pop(); - var type = elt.getAttribute("type"); - if (!type || toLowerCase(type) !== "hidden") - frameset_ok = false; - return; - - case "param": - case "source": - case "track": - insertHTMLElement(value,arg3); - stack.pop(); - return; - - case "hr": - if (stack.inButtonScope("p")) in_body_mode(ENDTAG, "p"); - insertHTMLElement(value,arg3); - stack.pop(); - frameset_ok = false; - return; - - case "image": - in_body_mode(TAG, "img", arg3, arg4); - return; - - case "isindex": - if (form_element_pointer) return; - (function handleIsIndexTag(attrs) { - var prompt = null; - var formattrs = []; - var newattrs = [["name", "isindex"]]; - for(var i = 0; i < attrs.length; i++) { - var a = attrs[i]; - if (a[0] === "action") { - push(formattrs, a); - } - else if (a[0] === "prompt") { - prompt = a[1]; - } - else if (a[0] !== "name") { - push(newattrs, a); - } - } - - // This default prompt presumably needs localization. - // The space after the colon in this prompt is required - // by the html5lib test cases - if (!prompt) - prompt = "This is a searchable index. " + - "Enter search keywords: "; - - parser(TAG, "form", formattrs); - parser(TAG, "hr", null); - parser(TAG, "label", null); - parser(TEXT, prompt); - parser(TAG, "input", newattrs); - parser(ENDTAG, "label"); - parser(TAG, "hr", null); - parser(ENDTAG, "form"); - }(arg3)); - return; - - case "textarea": - insertHTMLElement(value,arg3); - ignore_linefeed = true; - frameset_ok = false; - tokenizer = rcdata_state; - originalInsertionMode = parser; - parser = text_mode; - return; - - case "xmp": - if (stack.inButtonScope("p")) in_body_mode(ENDTAG, "p"); - afereconstruct(); - frameset_ok = false; - parseRawText(value, arg3); - return; - - case "iframe": - frameset_ok = false; - parseRawText(value, arg3); - return; - - case "noembed": - parseRawText(value,arg3); - return; - - case "noscript": - if (scripting_enabled) { - parseRawText(value,arg3); - return; - } - break; // XXX Otherwise treat it as any other open tag? - - case "select": - afereconstruct(); - insertHTMLElement(value,arg3); - frameset_ok = false; - if (parser === in_table_mode || - parser === in_caption_mode || - parser === in_table_body_mode || - parser === in_row_mode || - parser === in_cell_mode) - parser = in_select_in_table_mode; - else - parser = in_select_mode; - return; - - case "optgroup": - case "option": - if (stack.top instanceof impl.HTMLOptionElement) { - in_body_mode(ENDTAG, "option"); - } - afereconstruct(); - insertHTMLElement(value,arg3); - return; - - case "rp": - case "rt": - if (stack.inScope("ruby")) { - stack.generateImpliedEndTags(); - } - insertHTMLElement(value,arg3); - return; - - case "math": - afereconstruct(); - adjustMathMLAttributes(arg3); - adjustForeignAttributes(arg3); - insertForeignElement(value, arg3, MATHML_NAMESPACE); - if (arg4) // self-closing flag - stack.pop(); - return; - - case "svg": - afereconstruct(); - adjustSVGAttributes(arg3); - adjustForeignAttributes(arg3); - insertForeignElement(value, arg3, SVG_NAMESPACE); - if (arg4) // self-closing flag - stack.pop(); - return; - - case "caption": - case "col": - case "colgroup": - case "frame": - case "head": - case "tbody": - case "td": - case "tfoot": - case "th": - case "thead": - case "tr": - // Ignore table tags if we're not in_table mode - return; - } - - // Handle any other start tag here - // (and also noscript tags when scripting is disabled) - afereconstruct(); - insertHTMLElement(value,arg3); - return; - - case ENDTAG: - switch(value) { - case "body": - if (!stack.inScope("body")) return; - parser = after_body_mode; - return; - case "html": - if (!stack.inScope("body")) return; - parser = after_body_mode; - parser(t, value, arg3); - return; - - case "address": - case "article": - case "aside": - case "blockquote": - case "button": - case "center": - case "details": - case "dir": - case "div": - case "dl": - case "fieldset": - case "figcaption": - case "figure": - case "footer": - case "header": - case "hgroup": - case "listing": - case "menu": - case "nav": - case "ol": - case "pre": - case "section": - case "summary": - case "ul": - // Ignore if there is not a matching open tag - if (!stack.inScope(value)) return; - stack.generateImpliedEndTags(); - stack.popTag(value); - return; - - case "form": - var openform = form_element_pointer; - form_element_pointer = null; - if (!openform || !stack.elementInScope(openform)) return; - stack.generateImpliedEndTags(); - stack.removeElement(openform); - return; - - case "p": - if (!stack.inButtonScope(value)) { - in_body_mode(TAG, value, null); - parser(t, value, arg3, arg4); - } - else { - stack.generateImpliedEndTags(value); - stack.popTag(value); - } - return; - - case "li": - if (!stack.inListItemScope(value)) return; - stack.generateImpliedEndTags(value); - stack.popTag(value); - return; - - case "dd": - case "dt": - if (!stack.inScope(value)) return; - stack.generateImpliedEndTags(value); - stack.popTag(value); - return; - - case "h1": - case "h2": - case "h3": - case "h4": - case "h5": - case "h6": - if (!stack.elementTypeInScope(impl.HTMLHeadingElement)) return; - stack.generateImpliedEndTags(); - stack.popElementType(impl.HTMLHeadingElement); - return; - - case "a": - case "b": - case "big": - case "code": - case "em": - case "font": - case "i": - case "nobr": - case "s": - case "small": - case "strike": - case "strong": - case "tt": - case "u": - var result = adoptionAgency(value); - if (result) return; // If we did something we're done - break; // Go to the "any other end tag" case - - case "applet": - case "marquee": - case "object": - if (!stack.inScope(value)) return; - stack.generateImpliedEndTags(); - stack.popTag(value); - afe.clearToMarker(); - return; - - case "br": - in_body_mode(TAG, value, null); // Turn
    into
    - return; - } - - // Any other end tag goes here - for(i = stack.elements.length-1; i >= 0; i--) { - node = stack.elements[i]; - if (node.localName === value) { - stack.generateImpliedEndTags(value); - stack.popElement(node); - break; - } - else if (isA(node, specialSet)) { - return; - } - } - - return; - } - } - - function text_mode(t, value, arg3, arg4) { - switch(t) { - case TEXT: - insertText(value); - return; - case EOF: - if (stack.top instanceof impl.HTMLScriptElement) - stack.top._already_started = true; - stack.pop(); - parser = originalInsertionMode; - parser(t); - return; - case ENDTAG: - if (value === "script") { - handleScriptEnd(); - } - else { - stack.pop(); - parser = originalInsertionMode; - } - return; - default: - // We should never get any other token types - return; - } - } - - function in_table_mode(t, value, arg3, arg4) { - function getTypeAttr(attrs) { - for(var i = 0, n = attrs.length; i < n; i++) { - if (attrs[i][0] === "type") - return toLowerCase(attrs[i][1]); - } - return null; - } - - switch(t) { - case TEXT: - // XXX the text_integration_mode stuff is - // just a hack I made up - if (text_integration_mode) { - in_body_mode(t, value, arg3, arg4) - } - else { - pending_table_text = []; - originalInsertionMode = parser; - parser = in_table_text_mode; - parser(t, value, arg3, arg4); - } - return; - case COMMENT: - insertComment(value); - return; - case DOCTYPE: - return; - case TAG: - switch(value) { - case "caption": - stack.clearToContext(impl.HTMLTableElement); - afe.insertMarker(); - insertHTMLElement(value,arg3); - parser = in_caption_mode; - return; - case "colgroup": - stack.clearToContext(impl.HTMLTableElement); - insertHTMLElement(value,arg3); - parser = in_column_group_mode; - return; - case "col": - in_table_mode(TAG, "colgroup", null); - parser(t, value, arg3, arg4); - return; - case "tbody": - case "tfoot": - case "thead": - stack.clearToContext(impl.HTMLTableElement); - insertHTMLElement(value,arg3); - parser = in_table_body_mode; - return; - case "td": - case "th": - case "tr": - in_table_mode(TAG, "tbody", null); - parser(t, value, arg3, arg4); - return; - - case "table": - var repro = stack.inTableScope(value); - in_table_mode(ENDTAG, value); - if (repro) parser(t, value, arg3, arg4); - return; - - case "style": - case "script": - in_head_mode(t, value, arg3, arg4); - return; - - case "input": - var type = getTypeAttr(arg3); - if (type !== "hidden") break; // to the anything else case - insertHTMLElement(value,arg3); - stack.pop(); - return; - - case "form": - if (form_element_pointer) return; - form_element_pointer = insertHTMLElement(value, arg3); - stack.pop(); - return; - } - break; - case ENDTAG: - switch(value) { - case "table": - if (!stack.inTableScope(value)) return; - stack.popTag(value); - resetInsertionMode(); - return; - case "body": - case "caption": - case "col": - case "colgroup": - case "html": - case "tbody": - case "td": - case "tfoot": - case "th": - case "thead": - case "tr": - return; - } - - break; - case EOF: - stopParsing(); - return; - } - - // This is the anything else case - foster_parent_mode = true; - in_body_mode(t, value, arg3, arg4); - foster_parent_mode = false; - } - - function in_table_text_mode(t, value, arg3, arg4) { - if (t === TEXT) { - if (textIncludesNUL) { - value = replace(value, NULCHARS, ""); - if (value.length === 0) return; - } - push(pending_table_text,value); - } - else { - var s = join(pending_table_text,""); - pending_table_text.length = 0; - if (test(NONWS, s)) { // If any non-whitespace characters - // This must be the same code as the "anything else" - // case of the in_table mode above. - foster_parent_mode = true; - in_body_mode(TEXT, s); - foster_parent_mode = false; - } - else { - insertText(s); - } - parser = originalInsertionMode; - parser(t, value, arg3, arg4); - } - } - - - function in_caption_mode(t, value, arg3, arg4) { - function end_caption() { - if (!stack.inTableScope("caption")) return false; - stack.generateImpliedEndTags(); - stack.popTag("caption"); - afe.clearToMarker(); - parser = in_table_mode; - return true; - } - - switch(t) { - case TAG: - switch(value) { - case "caption": - case "col": - case "colgroup": - case "tbody": - case "td": - case "tfoot": - case "th": - case "thead": - case "tr": - if (end_caption()) parser(t, value, arg3, arg4); - return; - } - break; - case ENDTAG: - switch(value) { - case "caption": - end_caption(); - return; - case "table": - if (end_caption()) parser(t, value, arg3, arg4); - return; - case "body": - case "col": - case "colgroup": - case "html": - case "tbody": - case "td": - case "tfoot": - case "th": - case "thead": - case "tr": - return; - } - break; - } - - // The Anything Else case - in_body_mode(t, value, arg3, arg4); - } - - function in_column_group_mode(t, value, arg3, arg4) { - switch(t) { - case TEXT: - var ws = match(value, LEADINGWS); - if (ws) { - insertText(ws[0]); - value = substring(value,ws[0].length); - } - if (value.length === 0) return; - break; // Handle non-whitespace below - - case COMMENT: - insertComment(value); - return; - case DOCTYPE: - return; - case TAG: - switch(value) { - case "html": - in_body_mode(t, value, arg3, arg4); - return; - case "col": - insertHTMLElement(value, arg3); - stack.pop(); - return; - } - break; - case ENDTAG: - switch(value) { - case "colgroup": - if (stack.top instanceof impl.HTMLHtmlElement) return; - stack.pop(); - parser = in_table_mode; - return; - case "col": - return; - } - break; - case EOF: - if (stack.top instanceof impl.HTMLHtmlElement) { - stopParsing(); - return; - } - break; - } - - // Anything else - if (!(stack.top instanceof impl.HTMLHtmlElement)) { - in_column_group_mode(ENDTAG, "colgroup"); - parser(t, value, arg3, arg4); - } - } - - function in_table_body_mode(t, value, arg3, arg4) { - function endsect() { - if (!stack.inTableScope("tbody") && - !stack.inTableScope("thead") && - !stack.inTableScope("tfoot")) - return; - stack.clearToContext(impl.HTMLTableSectionElement); - in_table_body_mode(ENDTAG, stack.top.localName, null); - parser(t, value, arg3, arg4); - } - - switch(t) { - case TAG: - switch(value) { - case "tr": - stack.clearToContext(impl.HTMLTableSectionElement); - insertHTMLElement(value, arg3); - parser = in_row_mode; - return; - case "th": - case "td": - in_table_body_mode(TAG, "tr", null); - parser(t, value, arg3, arg4); - return; - case "caption": - case "col": - case "colgroup": - case "tbody": - case "tfoot": - case "thead": - endsect(); - return; - } - break; - case ENDTAG: - switch(value) { - case "table": - endsect(); - return; - case "tbody": - case "tfoot": - case "thead": - if (stack.inTableScope(value)) { - stack.clearToContext(impl.HTMLTableSectionElement); - stack.pop(); - parser = in_table_mode; - } - return; - case "body": - case "caption": - case "col": - case "colgroup": - case "html": - case "td": - case "th": - case "tr": - return; - } - break; - } - - // Anything else: - in_table_mode(t, value, arg3, arg4); - } - - function in_row_mode(t, value, arg3, arg4) { - function endrow() { - if (!stack.inTableScope("tr")) return false; - stack.clearToContext(impl.HTMLTableRowElement); - stack.pop(); - parser = in_table_body_mode; - return true; - } - - switch(t) { - case TAG: - switch(value) { - case "th": - case "td": - stack.clearToContext(impl.HTMLTableRowElement); - insertHTMLElement(value, arg3); - parser = in_cell_mode; - afe.insertMarker(); - return; - case "caption": - case "col": - case "colgroup": - case "tbody": - case "tfoot": - case "thead": - case "tr": - if (endrow()) parser(t, value, arg3, arg4); - return; - } - break; - case ENDTAG: - switch(value) { - case "tr": - endrow(); - return; - case "table": - if (endrow()) parser(t, value, arg3, arg4); - return; - case "tbody": - case "tfoot": - case "thead": - if (stack.inTableScope(value)) { - in_row_mode(ENDTAG, "tr"); - parser(t, value, arg3, arg4); - } - return; - case "body": - case "caption": - case "col": - case "colgroup": - case "html": - case "td": - case "th": - return; - } - break; - } - - // anything else - in_table_mode(t, value, arg3, arg4); - } - - function in_cell_mode(t, value, arg3, arg4) { - switch(t) { - case TAG: - switch(value) { - case "caption": - case "col": - case "colgroup": - case "tbody": - case "td": - case "tfoot": - case "th": - case "thead": - case "tr": - if (stack.inTableScope("td")) { - in_cell_mode(ENDTAG, "td"); - parser(t, value, arg3, arg4); - } - else if (stack.inTableScope("th")) { - in_cell_mode(ENDTAG, "th"); - parser(t, value, arg3, arg4); - } - return; - } - break; - case ENDTAG: - switch(value) { - case "td": - case "th": - if (!stack.inTableScope(value)) return; - stack.generateImpliedEndTags(); - stack.popTag(value); - afe.clearToMarker(); - parser = in_row_mode; - return; - - case "body": - case "caption": - case "col": - case "colgroup": - case "html": - return; - - case "table": - case "tbody": - case "tfoot": - case "thead": - case "tr": - if (!stack.inTableScope(value)) return; - in_cell_mode(ENDTAG, stack.inTableScope("td") ? "td" : "th"); - parser(t, value, arg3, arg4); - return; - } - break; - } - - // anything else - in_body_mode(t, value, arg3, arg4); - } - - function in_select_mode(t, value, arg3, arg4) { - switch(t) { - case TEXT: - if (textIncludesNUL) { - value = replace(value, NULCHARS, ""); - if (value.length === 0) return; - } - insertText(value); - return; - case COMMENT: - insertComment(value); - return; - case DOCTYPE: - return; - case EOF: - stopParsing(); - return; - case TAG: - switch(value) { - case "html": - in_body_mode(t, value, arg3, arg4); - return; - case "option": - if (stack.top instanceof impl.HTMLOptionElement) - in_select_mode(ENDTAG, value); - insertHTMLElement(value, arg3); - return; - case "optgroup": - if (stack.top instanceof impl.HTMLOptionElement) - in_select_mode(ENDTAG, "option"); - if (stack.top instanceof impl.HTMLOptGroupElement) - in_select_mode(ENDTAG, value); - insertHTMLElement(value, arg3); - return; - case "select": - in_select_mode(ENDTAG, value); // treat it as a close tag - return; - - case "input": - case "keygen": - case "textarea": - if (!stack.inSelectScope("select")) return; - in_select_mode(ENDTAG, "select"); - parser(t, value, arg3, arg4); - return; - - case "script": - in_head_mode(t, value, arg3, arg4); - return; - } - break; - case ENDTAG: - switch(value) { - case "optgroup": - if (stack.top instanceof impl.HTMLOptionElement && - stack.elements[stack.elements.length-2] instanceof - impl.HTMLOptGroupElement) { - in_select_mode(ENDTAG, "option"); - } - if (stack.top instanceof impl.HTMLOptGroupElement) - stack.pop(); - - return; - - case "option": - if (stack.top instanceof impl.HTMLOptionElement) - stack.pop(); - return; - - case "select": - if (!stack.inSelectScope(value)) return; - stack.popTag(value); - resetInsertionMode(); - return; - } - - break; - } - - // anything else: just ignore the token - } - - function in_select_in_table_mode(t, value, arg3, arg4) { - switch(value) { - case "caption": - case "table": - case "tbody": - case "tfoot": - case "thead": - case "tr": - case "td": - case "th": - switch(t) { - case TAG: - in_select_in_table_mode(ENDTAG, "select"); - parser(t, value, arg3, arg4); - return; - case ENDTAG: - if (stack.inTableScope(value)) { - in_select_in_table_mode(ENDTAG, "select"); - parser(t, value, arg3, arg4); - } - return; - } - } - - // anything else - in_select_mode(t, value, arg3, arg4); - } - - function after_body_mode(t, value, arg3, arg4) { - switch(t) { - case TEXT: - // If any non-space chars, handle below - if (test(NONWS, value)) break; - in_body_mode(t, value); - return; - case COMMENT: - // Append it to the element - stack.elements[0].appendChild(doc.createComment(value)); - return; - case DOCTYPE: - return; - case EOF: - stopParsing(); - return; - case TAG: - if (value === "html") { - in_body_mode(t, value, arg3, arg4); - return; - } - break; // for any other tags - case ENDTAG: - if (value === "html") { - if (fragment) return; - parser = after_after_body_mode; - return; - } - break; // for any other tags - } - - // anything else - parser = in_body_mode; - parser(t, value, arg3, arg4); - } - - function in_frameset_mode(t, value, arg3, arg4) { - switch(t) { - case TEXT: - // Ignore any non-space characters - value = replace(value, ALLNONWS, ""); - if (value.length > 0) insertText(value); - return; - case COMMENT: - insertComment(value); - return; - case DOCTYPE: - return; - case EOF: - stopParsing(); - return; - case TAG: - switch(value) { - case "html": - in_body_mode(t, value, arg3, arg4); - return; - case "frameset": - insertHTMLElement(value, arg3); - return; - case "frame": - insertHTMLElement(value, arg3); - stack.pop(); - return; - case "noframes": - in_head_mode(t, value, arg3, arg4); - return; - } - break; - case ENDTAG: - if (value === "frameset") { - if (fragment && stack.top instanceof impl.HTMLHtmlElement) - return; - stack.pop(); - if (!fragment && - !(stack.top instanceof impl.HTMLFrameSetElement)) - parser = after_frameset_mode; - return; - } - break; - } - - // ignore anything else - } - - function after_frameset_mode(t, value, arg3, arg4) { - switch(t) { - case TEXT: - // Ignore any non-space characters - value = replace(value, ALLNONWS, ""); - if (value.length > 0) insertText(value); - return; - case COMMENT: - insertComment(value); - return; - case DOCTYPE: - return; - case EOF: - stopParsing(); - return; - case TAG: - switch(value) { - case "html": - in_body_mode(t, value, arg3, arg4); - return; - case "noframes": - in_head_mode(t, value, arg3, arg4); - return; - } - break; - case ENDTAG: - if (value === "html") { - parser = after_after_frameset_mode; - return; - } - break; - } - - // ignore anything else - } - - function after_after_body_mode(t, value, arg3, arg4) { - switch(t) { - case TEXT: - // If any non-space chars, handle below - if (test(NONWS, value)) break; - in_body_mode(t, value, arg3, arg4); - return; - case COMMENT: - doc.appendChild(doc.createComment(value)); - return; - case DOCTYPE: - in_body_mode(t, value, arg3, arg4); - return; - case EOF: - stopParsing(); - return; - case TAG: - if (value === "html") { - in_body_mode(t, value, arg3, arg4); - return; - } - break; - } - - // anything else - parser = in_body_mode; - parser(t, value, arg3, arg4); - } - - function after_after_frameset_mode(t, value, arg3, arg4) { - switch(t) { - case TEXT: - // Ignore any non-space characters - value = replace(value, ALLNONWS, ""); - if (value.length > 0) - in_body_mode(t, value, arg3, arg4); - return; - case COMMENT: - doc.appendChild(doc.createComment(value)); - return; - case DOCTYPE: - in_body_mode(t, value, arg3, arg4); - return; - case EOF: - stopParsing(); - return; - case TAG: - switch(value) { - case "html": - in_body_mode(t, value, arg3, arg4); - return; - case "noframes": - in_head_mode(t, value, arg3, arg4); - return; - } - break; - } - - // ignore anything else - } - - - // 13.2.5.5 The rules for parsing tokens in foreign content - // - // This is like one of the insertion modes above, but is - // invoked somewhat differently when the current token is not HTML. - // See the insertToken() function. - function insertForeignToken(t, value, arg3, arg4) { - // A tag is an HTML font tag if it has a color, font, or size - // attribute. Otherwise we assume it is foreign content - function isHTMLFont(attrs) { - for(var i = 0, n = attrs.length; i < n; i++) { - switch(attrs[i][0]) { - case "color": - case "font": - case "size": - return true; - } - } - return false; - } - - var current; - - switch(t) { - case TEXT: - // If any non-space, non-nul characters - if (frameset_ok && test(NONWSNONNUL, value)) - frameset_ok = false; - if (textIncludesNUL) { - value = replace(value, NULCHARS, "\uFFFD"); - } - insertText(value); - return; - case COMMENT: - insertComment(value); - return; - case DOCTYPE: - // ignore it - return; - case TAG: - switch(value) { - case "font": - if (!isHTMLFont(arg3)) break; - /* falls through */ - case "b": - case "big": - case "blockquote": - case "body": - case "br": - case "center": - case "code": - case "dd": - case "div": - case "dl": - case "dt": - case "em": - case "embed": - case "h1": - case "h2": - case "h3": - case "h4": - case "h5": - case "h6": - case "head": - case "hr": - case "i": - case "img": - case "li": - case "listing": - case "menu": - case "meta": - case "nobr": - case "ol": - case "p": - case "pre": - case "ruby": - case "s": - case "small": - case "span": - case "strong": - case "strike": - case "sub": - case "sup": - case "table": - case "tt": - case "u": - case "ul": - case "var": - do { - stack.pop(); - current = stack.top; - } while(current.namespaceURI !== HTML_NAMESPACE && - !isMathmlTextIntegrationPoint(current) && - !isHTMLIntegrationPoint(current)); - - insertToken(t, value, arg3, arg4); // reprocess - return; - } - - // Any other start tag case goes here - current = stack.top; - if (current.namespaceURI === MATHML_NAMESPACE) { - adjustMathMLAttributes(arg3); - } - else if (current.namespaceURI === SVG_NAMESPACE) { - value = adjustSVGTagName(value); - adjustSVGAttributes(arg3); - } - adjustForeignAttributes(arg3) - - insertForeignElement(value, arg3, current.namespaceURI); - if (arg4) // the self-closing flag - stack.pop(); - return; - - case ENDTAG: - current = stack.top; - if (value === "script" && - current.namespaceURI === SVG_NAMESPACE && - current.localName === "script") { - - stack.pop(); - - // XXX - // Deal with SVG scripts here - } - else { - // The any other end tag case - var i = stack.elements.length-1; - var node = stack.elements[i]; - for(;;) { - if (toLowerCase(node.localName) === value) { - stack.popElement(node); - break; - } - node = stack.elements[--i]; - // If non-html, keep looping - if (node.namespaceURI !== HTML_NAMESPACE) - continue; - // Otherwise process the end tag as html - parser(t, value, arg3, arg4); - break; - } - } - return; - } - } - - - /*** - * parsing code for character references - */ - - // Parse a character reference from s and return a codepoint or an - // array of codepoints or null if there is no valid char ref in s. - function parseCharRef(s, isattr) { - var len = s.length; - var rv; - if (len === 0) return null; // No character reference matched - - if (s[0] === "#") { // Numeric character reference - var codepoint; - - if (s[1] === "x" || s[1] === "X") { - // Hex - codepoint = parseInt(substring(s,2), 16); - } - else { - // Decimal - codepoint = parseInt(substring(s,1), 10); - } - - if (s[len-1] === ";") // If the string ends with a semicolon - nextchar += len; // Consume all the chars - else - nextchar += len-1; // Otherwise, all but the last character - - if (codepoint in numericCharRefReplacements) { - codepoint = numericCharRefReplacements[codepoint]; - } - else if (codepoint > 0x10FFFF || - (codepoint >= 0xD800 && codepoint < 0xE000)) { - codepoint = 0xFFFD; - } - - if (codepoint <= 0xFFFF) return codepoint; - - codepoint = codepoint - 0x10000; - return [0xD800 + (codepoint >> 10), - 0xDC00 + (codepoint & 0x03FF)]; - } - else { // Named character reference - // We have to be able to parse some named char refs even when - // the semicolon is omitted, but have to match the longest one - // possible. So if the lookahead doesn't end with semicolon - // then we have to loop backward looking for longest to shortest - // matches. Fortunately, the names that don't require semis - // are all between 2 and 6 characters long. - - if (s[len-1] === ";") { - rv = namedCharRefs[s]; - if (rv !== undefined) { - nextchar += len; // consume all the characters - return rv; - } - } - - // If it didn't end with a semicolon, see if we can match - // everything but the terminating character - len--; // Ignore whatever the terminating character is - rv = namedCharRefsNoSemi[substring(s,0, len)]; - if (rv !== undefined) { - nextchar += len; - return rv; - } - - // If it still didn't match, and we're not parsing a - // character reference in an attribute value, then try - // matching shorter substrings. - if (!isattr) { - len--; - if (len > 6) len = 6; // Maximum possible match length - while(len >= 2) { - rv = namedCharRefsNoSemi[substring(s,0, len)]; - if (rv !== undefined) { - nextchar += len; - return rv; - } - len--; - } - } - - // Couldn't find any match - return null; - } - } - - - /*** - * Finally, this is the end of the HTMLParser() factory function. - * It returns the htmlparser object with the append() and end() methods. - */ - - // Sneak another method into the htmlparser object to allow us to run - // tokenizer tests. This can be commented out in production code. - // This is a hook for testing the tokenizer. It has to be here - // because the tokenizer details are all hidden away within the closure. - // It should return an array of tokens generated while parsing the - // input string. - htmlparser.testTokenizer = function(input, initialState, - lastStartTag, charbychar) - { - var tokens = []; - - switch(initialState) { - case "PCDATA state": - tokenizer = data_state; - break; - case "RCDATA state": - tokenizer = rcdata_state; - break; - case "RAWTEXT state": - tokenizer = rawtext_state; - break; - case "PLAINTEXT state": - tokenizer = plaintext_state; - break; - } - - if (lastStartTag) { - lasttagname = lastStartTag; - } - - insertToken = function(t, value, arg3, arg4) { - flushText(); - switch(t) { - case TEXT: - if (tokens.length > 0 && - tokens[tokens.length-1][0] === "Character") { - tokens[tokens.length-1][1] += value; - } - else push(tokens, ["Character", value]); - break; - case COMMENT: - push(tokens,["Comment", value]); - break; - case DOCTYPE: - push(tokens,["DOCTYPE", value, - arg3 === undefined ? null : arg3, - arg4 === undefined ? null : arg4, - !force_quirks]); - break; - case TAG: - var attrs = {}; - for(var i = 0; i < arg3.length; i++) { - // XXX: does attribute order matter? - var a = arg3[i]; - if (a.length === 1) { - attrs[a[0]] = ""; - } - else { - attrs[a[0]] = a[1]; - } - } - var token = ["StartTag", value, attrs]; - if (arg4) push(token, true); - push(tokens,token); - break; - case ENDTAG: - push(tokens,["EndTag", value]); - break; - case EOF: - break; - } - } - - if (!charbychar) { - this.parse(input, true); - } - else { - for(var i = 0; i < input.length; i++) { - this.parse(input[i]); - } - this.parse("", true); - } - return tokens; - }; - - // Return the parser object from the HTMLParser() factory function - return htmlparser; - } - - // Return the HTMLParser factory function from the containing - // closure that holds all the details. - return HTMLParser; -}()); - - -/************************************************************************ - * src/impl/CSSStyleDeclaration.js - ************************************************************************/ - -//@line 1 "src/impl/CSSStyleDeclaration.js" -defineLazyProperty(impl, "CSSStyleDeclaration", function() { - function CSSStyleDeclaration(elt) { - this._element = elt; - } - - // Utility function for parsing style declarations - // Pass in a string like "margin-left: 5px; border-style: solid" - // and this function returns an object like - // {"margin-left":"5px", "border-style":"solid"} - function parseStyles(s) { - var parser = new parserlib.css.Parser(); - var result = {}; - parser.addListener("property", function(e) { - if (e.invalid) return; // Skip errors - result[e.property.text] = e.value.text; - if (e.important) result.important[name] = e.important; - }); - parser.parseStyleAttribute(s); - return result; - } - - CSSStyleDeclaration.prototype = O.create(Object.prototype, { - _idlName: constant("CSSStyleDeclaration"), - - // Return the parsed form of the element's style attribute. - // If the element's style attribute has never been parsed - // or if it has changed since the last parse, then reparse it - // Note that the styles don't get parsed until they're actually needed - _parsed: attribute(function() { - if (!this._parsedStyles || this.cssText !== this._lastParsedText) { - var text = this.cssText; - this._parsedStyles = parseStyles(text); - this._lastParsedText = text; - delete this._names; - } - return this._parsedStyles; - }), - - // Call this method any time the parsed representation of the - // style changes. It converts the style properties to a string and - // sets cssText and the element's style attribute - _serialize: constant(function() { - var styles = this._parsed; - var s = ""; - - for(var name in styles) { - if (s) s += "; "; - s += name + ":" + styles[name] - } - - this.cssText = s; // also sets the style attribute - this._lastParsedText = s; // so we don't reparse - delete this._names; - }), - - cssText: attribute( - function() { - // XXX: this is a CSSStyleDeclaration for an element. - // A different impl might be necessary for a set of styles - // associated returned by getComputedStyle(), e.g. - return this._element.getAttribute("style"); - }, - function(value) { - // XXX: I should parse and serialize the value to - // normalize it and remove errors. FF and chrome do that. - this._element.setAttribute("style", value); - } - ), - - length: attribute(function() { - if (!this._names) - this._names = Object.getOwnPropertyNames(this._parsed); - return this._names.length; - }), - - item: constant(function(n) { - if (!this._names) - this._names = Object.getOwnPropertyNames(this._parsed); - return this._names[n]; - }), - - getPropertyValue: constant(function(property) { - return this._parsed[toLowerCase(property)]; - }), - - // XXX: for now we ignore !important declarations - getPropertyPriority: constant(function(property) { - return ""; - }), - - // XXX the priority argument is ignored for now - setProperty: constant(function(property, value, priority) { - property = toLowerCase(property); - if (value === "") { - this.removeProperty(property); - return; - } - - // XXX are there other legal priority values? - if (priority !== undefined && priority !== "important") - return; - - // We don't just accept the property value. Instead - // we parse it to ensure that it is something valid. - // If it contains a semicolon it is invalid - if (value.indexOf(";") !== -1) return; - - var props = parseStyles(property + ":" + value); - var newvalue = props[property]; - // If there is no value now, it wasn't valid - if (!newvalue) return; - - var styles = this._parsed; - - // If the value didn't change, return without doing anything. - var oldvalue = styles[property]; - if (newvalue === oldvalue) return; - - styles[property] = value; - - // Serialize and update cssText and element.style! - this._serialize(); - }), - - removeProperty: constant(function(property) { - property = toLowerCase(property); - var styles = this._parsed; - if (property in styles) { - delete styles[property]; - - // Serialize and update cssText and element.style! - this._serialize(); - } - }), - }); - - var cssProperties = { - background: "background", - backgroundAttachment: "background-attachment", - backgroundColor: "background-color", - backgroundImage: "background-image", - backgroundPosition: "background-position", - backgroundRepeat: "background-repeat", - border: "border", - borderCollapse: "border-collapse", - borderColor: "border-color", - borderSpacing: "border-spacing", - borderStyle: "border-style", - borderTop: "border-top", - borderRight: "border-right", - borderBottom: "border-bottom", - borderLeft: "border-left", - borderTopColor: "border-top-color", - borderRightColor: "border-right-color", - borderBottomColor: "border-bottom-color", - borderLeftColor: "border-left-color", - borderTopStyle: "border-top-style", - borderRightStyle: "border-right-style", - borderBottomStyle: "border-bottom-style", - borderLeftStyle: "border-left-style", - borderTopWidth: "border-top-width", - borderRightWidth: "border-right-width", - borderBottomWidth: "border-bottom-width", - borderLeftWidth: "border-left-width", - borderWidth: "border-width", - bottom: "bottom", - captionSide: "caption-side", - clear: "clear", - clip: "clip", - color: "color", - content: "content", - counterIncrement: "counter-increment", - counterReset: "counter-reset", - cursor: "cursor", - direction: "direction", - display: "display", - emptyCells: "empty-cells", - cssFloat: "float", - font: "font", - fontFamily: "font-family", - fontSize: "font-size", - fontSizeAdjust: "font-size-adjust", - fontStretch: "font-stretch", - fontStyle: "font-style", - fontVariant: "font-variant", - fontWeight: "font-weight", - height: "height", - left: "left", - letterSpacing: "letter-spacing", - lineHeight: "line-height", - listStyle: "list-style", - listStyleImage: "list-style-image", - listStylePosition: "list-style-position", - listStyleType: "list-style-type", - margin: "margin", - marginTop: "margin-top", - marginRight: "margin-right", - marginBottom: "margin-bottom", - marginLeft: "margin-left", - markerOffset: "marker-offset", - marks: "marks", - maxHeight: "max-height", - maxWidth: "max-width", - minHeight: "min-height", - minWidth: "min-width", - opacity: "opacity", - orphans: "orphans", - outline: "outline", - outlineColor: "outline-color", - outlineStyle: "outline-style", - outlineWidth: "outline-width", - overflow: "overflow", - padding: "padding", - paddingTop: "padding-top", - paddingRight: "padding-right", - paddingBottom: "padding-bottom", - paddingLeft: "padding-left", - page: "page", - pageBreakAfter: "page-break-after", - pageBreakBefore: "page-break-before", - pageBreakInside: "page-break-inside", - position: "position", - quotes: "quotes", - right: "right", - size: "size", - tableLayout: "table-layout", - textAlign: "text-align", - textDecoration: "text-decoration", - textIndent: "text-indent", - textShadow: "text-shadow", - textTransform: "text-transform", - top: "top", - unicodeBidi: "unicode-bidi", - verticalAlign: "vertical-align", - visibility: "visibility", - whiteSpace: "white-space", - widows: "widows", - width: "width", - wordSpacing: "word-spacing", - zIndex: "z-index", - }; - - for(var prop in cssProperties) defineStyleProperty(prop); - - function defineStyleProperty(jsname) { - var cssname = cssProperties[jsname]; - Object.defineProperty(CSSStyleDeclaration.prototype, jsname, { - get: function() { - return this.getPropertyValue(cssname); - }, - set: function(value) { - if (value === "" || value == null) { // XXX? - this.removeProperty(cssname); - } - else { - // XXX Handle important declarations here! - this.setProperty(cssname, value); - } - } - }); - } - - return CSSStyleDeclaration; -}); - - -/************************************************************************ - * src/impl/cssparser.js - ************************************************************************/ - -//@line 1 "src/impl/cssparser.js" -/*! -Parser-Lib -Copyright (c) 2009-2011 Nicholas C. Zakas. All rights reserved. - -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. - -*/ -/* Build time: 29-November-2012 03:43:26 */ -var parserlib = {}; -(function(){ - -/** - * A generic base to inherit from for any object - * that needs event handling. - * @class EventTarget - * @constructor - */ -function EventTarget(){ - - /** - * The array of listeners for various events. - * @type Object - * @property _listeners - * @private - */ - this._listeners = {}; -} - -EventTarget.prototype = { - - //restore constructor - constructor: EventTarget, - - /** - * Adds a listener for a given event type. - * @param {String} type The type of event to add a listener for. - * @param {Function} listener The function to call when the event occurs. - * @return {void} - * @method addListener - */ - addListener: function(type, listener){ - if (!this._listeners[type]){ - this._listeners[type] = []; - } - - this._listeners[type].push(listener); - }, - - /** - * Fires an event based on the passed-in object. - * @param {Object|String} event An object with at least a 'type' attribute - * or a string indicating the event name. - * @return {void} - * @method fire - */ - fire: function(event){ - if (typeof event == "string"){ - event = { type: event }; - } - if (typeof event.target != "undefined"){ - event.target = this; - } - - if (typeof event.type == "undefined"){ - throw new Error("Event object missing 'type' property."); - } - - if (this._listeners[event.type]){ - - //create a copy of the array and use that so listeners can't chane - var listeners = this._listeners[event.type].concat(); - for (var i=0, len=listeners.length; i < len; i++){ - listeners[i].call(this, event); - } - } - }, - - /** - * Removes a listener for a given event type. - * @param {String} type The type of event to remove a listener from. - * @param {Function} listener The function to remove from the event. - * @return {void} - * @method removeListener - */ - removeListener: function(type, listener){ - if (this._listeners[type]){ - var listeners = this._listeners[type]; - for (var i=0, len=listeners.length; i < len; i++){ - if (listeners[i] === listener){ - listeners.splice(i, 1); - break; - } - } - - - } - } -}; -/** - * Convenient way to read through strings. - * @namespace parserlib.util - * @class StringReader - * @constructor - * @param {String} text The text to read. - */ -function StringReader(text){ - - /** - * The input text with line endings normalized. - * @property _input - * @type String - * @private - */ - this._input = text.replace(/\n\r?/g, "\n"); - - - /** - * The row for the character to be read next. - * @property _line - * @type int - * @private - */ - this._line = 1; - - - /** - * The column for the character to be read next. - * @property _col - * @type int - * @private - */ - this._col = 1; - - /** - * The index of the character in the input to be read next. - * @property _cursor - * @type int - * @private - */ - this._cursor = 0; -} - -StringReader.prototype = { - - //restore constructor - constructor: StringReader, - - //------------------------------------------------------------------------- - // Position info - //------------------------------------------------------------------------- - - /** - * Returns the column of the character to be read next. - * @return {int} The column of the character to be read next. - * @method getCol - */ - getCol: function(){ - return this._col; - }, - - /** - * Returns the row of the character to be read next. - * @return {int} The row of the character to be read next. - * @method getLine - */ - getLine: function(){ - return this._line ; - }, - - /** - * Determines if you're at the end of the input. - * @return {Boolean} True if there's no more input, false otherwise. - * @method eof - */ - eof: function(){ - return (this._cursor == this._input.length); - }, - - //------------------------------------------------------------------------- - // Basic reading - //------------------------------------------------------------------------- - - /** - * Reads the next character without advancing the cursor. - * @param {int} count How many characters to look ahead (default is 1). - * @return {String} The next character or null if there is no next character. - * @method peek - */ - peek: function(count){ - var c = null; - count = (typeof count == "undefined" ? 1 : count); - - //if we're not at the end of the input... - if (this._cursor < this._input.length){ - - //get character and increment cursor and column - c = this._input.charAt(this._cursor + count - 1); - } - - return c; - }, - - /** - * Reads the next character from the input and adjusts the row and column - * accordingly. - * @return {String} The next character or null if there is no next character. - * @method read - */ - read: function(){ - var c = null; - - //if we're not at the end of the input... - if (this._cursor < this._input.length){ - - //if the last character was a newline, increment row count - //and reset column count - if (this._input.charAt(this._cursor) == "\n"){ - this._line++; - this._col=1; - } else { - this._col++; - } - - //get character and increment cursor and column - c = this._input.charAt(this._cursor++); - } - - return c; - }, - - //------------------------------------------------------------------------- - // Misc - //------------------------------------------------------------------------- - - /** - * Saves the current location so it can be returned to later. - * @method mark - * @return {void} - */ - mark: function(){ - this._bookmark = { - cursor: this._cursor, - line: this._line, - col: this._col - }; - }, - - reset: function(){ - if (this._bookmark){ - this._cursor = this._bookmark.cursor; - this._line = this._bookmark.line; - this._col = this._bookmark.col; - delete this._bookmark; - } - }, - - //------------------------------------------------------------------------- - // Advanced reading - //------------------------------------------------------------------------- - - /** - * Reads up to and including the given string. Throws an error if that - * string is not found. - * @param {String} pattern The string to read. - * @return {String} The string when it is found. - * @throws Error when the string pattern is not found. - * @method readTo - */ - readTo: function(pattern){ - - var buffer = "", - c; - - /* - * First, buffer must be the same length as the pattern. - * Then, buffer must end with the pattern or else reach the - * end of the input. - */ - while (buffer.length < pattern.length || buffer.lastIndexOf(pattern) != buffer.length - pattern.length){ - c = this.read(); - if (c){ - buffer += c; - } else { - throw new Error("Expected \"" + pattern + "\" at line " + this._line + ", col " + this._col + "."); - } - } - - return buffer; - - }, - - /** - * Reads characters while each character causes the given - * filter function to return true. The function is passed - * in each character and either returns true to continue - * reading or false to stop. - * @param {Function} filter The function to read on each character. - * @return {String} The string made up of all characters that passed the - * filter check. - * @method readWhile - */ - readWhile: function(filter){ - - var buffer = "", - c = this.read(); - - while(c !== null && filter(c)){ - buffer += c; - c = this.read(); - } - - return buffer; - - }, - - /** - * Reads characters that match either text or a regular expression and - * returns those characters. If a match is found, the row and column - * are adjusted; if no match is found, the reader's state is unchanged. - * reading or false to stop. - * @param {String|RegExp} matchter If a string, then the literal string - * value is searched for. If a regular expression, then any string - * matching the pattern is search for. - * @return {String} The string made up of all characters that matched or - * null if there was no match. - * @method readMatch - */ - readMatch: function(matcher){ - - var source = this._input.substring(this._cursor), - value = null; - - //if it's a string, just do a straight match - if (typeof matcher == "string"){ - if (source.indexOf(matcher) === 0){ - value = this.readCount(matcher.length); - } - } else if (matcher instanceof RegExp){ - if (matcher.test(source)){ - value = this.readCount(RegExp.lastMatch.length); - } - } - - return value; - }, - - - /** - * Reads a given number of characters. If the end of the input is reached, - * it reads only the remaining characters and does not throw an error. - * @param {int} count The number of characters to read. - * @return {String} The string made up the read characters. - * @method readCount - */ - readCount: function(count){ - var buffer = ""; - - while(count--){ - buffer += this.read(); - } - - return buffer; - } - -}; -/** - * Type to use when a syntax error occurs. - * @class SyntaxError - * @namespace parserlib.util - * @constructor - * @param {String} message The error message. - * @param {int} line The line at which the error occurred. - * @param {int} col The column at which the error occurred. - */ -function SyntaxError(message, line, col){ - - /** - * The column at which the error occurred. - * @type int - * @property col - */ - this.col = col; - - /** - * The line at which the error occurred. - * @type int - * @property line - */ - this.line = line; - - /** - * The text representation of the unit. - * @type String - * @property text - */ - this.message = message; - -} - -//inherit from Error -SyntaxError.prototype = new Error(); -/** - * Base type to represent a single syntactic unit. - * @class SyntaxUnit - * @namespace parserlib.util - * @constructor - * @param {String} text The text of the unit. - * @param {int} line The line of text on which the unit resides. - * @param {int} col The column of text on which the unit resides. - */ -function SyntaxUnit(text, line, col, type){ - - - /** - * The column of text on which the unit resides. - * @type int - * @property col - */ - this.col = col; - - /** - * The line of text on which the unit resides. - * @type int - * @property line - */ - this.line = line; - - /** - * The text representation of the unit. - * @type String - * @property text - */ - this.text = text; - - /** - * The type of syntax unit. - * @type int - * @property type - */ - this.type = type; -} - -/** - * Create a new syntax unit based solely on the given token. - * Convenience method for creating a new syntax unit when - * it represents a single token instead of multiple. - * @param {Object} token The token object to represent. - * @return {parserlib.util.SyntaxUnit} The object representing the token. - * @static - * @method fromToken - */ -SyntaxUnit.fromToken = function(token){ - return new SyntaxUnit(token.value, token.startLine, token.startCol); -}; - -SyntaxUnit.prototype = { - - //restore constructor - constructor: SyntaxUnit, - - /** - * Returns the text representation of the unit. - * @return {String} The text representation of the unit. - * @method valueOf - */ - valueOf: function(){ - return this.toString(); - }, - - /** - * Returns the text representation of the unit. - * @return {String} The text representation of the unit. - * @method toString - */ - toString: function(){ - return this.text; - } - -}; -/** - * Generic TokenStream providing base functionality. - * @class TokenStreamBase - * @namespace parserlib.util - * @constructor - * @param {String|StringReader} input The text to tokenize or a reader from - * which to read the input. - */ -function TokenStreamBase(input, tokenData){ - - /** - * The string reader for easy access to the text. - * @type StringReader - * @property _reader - * @private - */ - //this._reader = (typeof input == "string") ? new StringReader(input) : input; - this._reader = input ? new StringReader(input.toString()) : null; - - /** - * Token object for the last consumed token. - * @type Token - * @property _token - * @private - */ - this._token = null; - - /** - * The array of token information. - * @type Array - * @property _tokenData - * @private - */ - this._tokenData = tokenData; - - /** - * Lookahead token buffer. - * @type Array - * @property _lt - * @private - */ - this._lt = []; - - /** - * Lookahead token buffer index. - * @type int - * @property _ltIndex - * @private - */ - this._ltIndex = 0; - - this._ltIndexCache = []; -} - -/** - * Accepts an array of token information and outputs - * an array of token data containing key-value mappings - * and matching functions that the TokenStream needs. - * @param {Array} tokens An array of token descriptors. - * @return {Array} An array of processed token data. - * @method createTokenData - * @static - */ -TokenStreamBase.createTokenData = function(tokens){ - - var nameMap = [], - typeMap = {}, - tokenData = tokens.concat([]), - i = 0, - len = tokenData.length+1; - - tokenData.UNKNOWN = -1; - tokenData.unshift({name:"EOF"}); - - for (; i < len; i++){ - nameMap.push(tokenData[i].name); - tokenData[tokenData[i].name] = i; - if (tokenData[i].text){ - typeMap[tokenData[i].text] = i; - } - } - - tokenData.name = function(tt){ - return nameMap[tt]; - }; - - tokenData.type = function(c){ - return typeMap[c]; - }; - - return tokenData; -}; - -TokenStreamBase.prototype = { - - //restore constructor - constructor: TokenStreamBase, - - //------------------------------------------------------------------------- - // Matching methods - //------------------------------------------------------------------------- - - /** - * Determines if the next token matches the given token type. - * If so, that token is consumed; if not, the token is placed - * back onto the token stream. You can pass in any number of - * token types and this will return true if any of the token - * types is found. - * @param {int|int[]} tokenTypes Either a single token type or an array of - * token types that the next token might be. If an array is passed, - * it's assumed that the token can be any of these. - * @param {variant} channel (Optional) The channel to read from. If not - * provided, reads from the default (unnamed) channel. - * @return {Boolean} True if the token type matches, false if not. - * @method match - */ - match: function(tokenTypes, channel){ - - //always convert to an array, makes things easier - if (!(tokenTypes instanceof Array)){ - tokenTypes = [tokenTypes]; - } - - var tt = this.get(channel), - i = 0, - len = tokenTypes.length; - - while(i < len){ - if (tt == tokenTypes[i++]){ - return true; - } - } - - //no match found, put the token back - this.unget(); - return false; - }, - - /** - * Determines if the next token matches the given token type. - * If so, that token is consumed; if not, an error is thrown. - * @param {int|int[]} tokenTypes Either a single token type or an array of - * token types that the next token should be. If an array is passed, - * it's assumed that the token must be one of these. - * @param {variant} channel (Optional) The channel to read from. If not - * provided, reads from the default (unnamed) channel. - * @return {void} - * @method mustMatch - */ - mustMatch: function(tokenTypes, channel){ - - var token; - - //always convert to an array, makes things easier - if (!(tokenTypes instanceof Array)){ - tokenTypes = [tokenTypes]; - } - - if (!this.match.apply(this, arguments)){ - token = this.LT(1); - throw new SyntaxError("Expected " + this._tokenData[tokenTypes[0]].name + - " at line " + token.startLine + ", col " + token.startCol + ".", token.startLine, token.startCol); - } - }, - - //------------------------------------------------------------------------- - // Consuming methods - //------------------------------------------------------------------------- - - /** - * Keeps reading from the token stream until either one of the specified - * token types is found or until the end of the input is reached. - * @param {int|int[]} tokenTypes Either a single token type or an array of - * token types that the next token should be. If an array is passed, - * it's assumed that the token must be one of these. - * @param {variant} channel (Optional) The channel to read from. If not - * provided, reads from the default (unnamed) channel. - * @return {void} - * @method advance - */ - advance: function(tokenTypes, channel){ - - while(this.LA(0) != 0 && !this.match(tokenTypes, channel)){ - this.get(); - } - - return this.LA(0); - }, - - /** - * Consumes the next token from the token stream. - * @return {int} The token type of the token that was just consumed. - * @method get - */ - get: function(channel){ - - var tokenInfo = this._tokenData, - reader = this._reader, - value, - i =0, - len = tokenInfo.length, - found = false, - token, - info; - - //check the lookahead buffer first - if (this._lt.length && this._ltIndex >= 0 && this._ltIndex < this._lt.length){ - - i++; - this._token = this._lt[this._ltIndex++]; - info = tokenInfo[this._token.type]; - - //obey channels logic - while((info.channel !== undefined && channel !== info.channel) && - this._ltIndex < this._lt.length){ - this._token = this._lt[this._ltIndex++]; - info = tokenInfo[this._token.type]; - i++; - } - - //here be dragons - if ((info.channel === undefined || channel === info.channel) && - this._ltIndex <= this._lt.length){ - this._ltIndexCache.push(i); - return this._token.type; - } - } - - //call token retriever method - token = this._getToken(); - - //if it should be hidden, don't save a token - if (token.type > -1 && !tokenInfo[token.type].hide){ - - //apply token channel - token.channel = tokenInfo[token.type].channel; - - //save for later - this._token = token; - this._lt.push(token); - - //save space that will be moved (must be done before array is truncated) - this._ltIndexCache.push(this._lt.length - this._ltIndex + i); - - //keep the buffer under 5 items - if (this._lt.length > 5){ - this._lt.shift(); - } - - //also keep the shift buffer under 5 items - if (this._ltIndexCache.length > 5){ - this._ltIndexCache.shift(); - } - - //update lookahead index - this._ltIndex = this._lt.length; - } - - /* - * Skip to the next token if: - * 1. The token type is marked as hidden. - * 2. The token type has a channel specified and it isn't the current channel. - */ - info = tokenInfo[token.type]; - if (info && - (info.hide || - (info.channel !== undefined && channel !== info.channel))){ - return this.get(channel); - } else { - //return just the type - return token.type; - } - }, - - /** - * Looks ahead a certain number of tokens and returns the token type at - * that position. This will throw an error if you lookahead past the - * end of input, past the size of the lookahead buffer, or back past - * the first token in the lookahead buffer. - * @param {int} The index of the token type to retrieve. 0 for the - * current token, 1 for the next, -1 for the previous, etc. - * @return {int} The token type of the token in the given position. - * @method LA - */ - LA: function(index){ - var total = index, - tt; - if (index > 0){ - //TODO: Store 5 somewhere - if (index > 5){ - throw new Error("Too much lookahead."); - } - - //get all those tokens - while(total){ - tt = this.get(); - total--; - } - - //unget all those tokens - while(total < index){ - this.unget(); - total++; - } - } else if (index < 0){ - - if(this._lt[this._ltIndex+index]){ - tt = this._lt[this._ltIndex+index].type; - } else { - throw new Error("Too much lookbehind."); - } - - } else { - tt = this._token.type; - } - - return tt; - - }, - - /** - * Looks ahead a certain number of tokens and returns the token at - * that position. This will throw an error if you lookahead past the - * end of input, past the size of the lookahead buffer, or back past - * the first token in the lookahead buffer. - * @param {int} The index of the token type to retrieve. 0 for the - * current token, 1 for the next, -1 for the previous, etc. - * @return {Object} The token of the token in the given position. - * @method LA - */ - LT: function(index){ - - //lookahead first to prime the token buffer - this.LA(index); - - //now find the token, subtract one because _ltIndex is already at the next index - return this._lt[this._ltIndex+index-1]; - }, - - /** - * Returns the token type for the next token in the stream without - * consuming it. - * @return {int} The token type of the next token in the stream. - * @method peek - */ - peek: function(){ - return this.LA(1); - }, - - /** - * Returns the actual token object for the last consumed token. - * @return {Token} The token object for the last consumed token. - * @method token - */ - token: function(){ - return this._token; - }, - - /** - * Returns the name of the token for the given token type. - * @param {int} tokenType The type of token to get the name of. - * @return {String} The name of the token or "UNKNOWN_TOKEN" for any - * invalid token type. - * @method tokenName - */ - tokenName: function(tokenType){ - if (tokenType < 0 || tokenType > this._tokenData.length){ - return "UNKNOWN_TOKEN"; - } else { - return this._tokenData[tokenType].name; - } - }, - - /** - * Returns the token type value for the given token name. - * @param {String} tokenName The name of the token whose value should be returned. - * @return {int} The token type value for the given token name or -1 - * for an unknown token. - * @method tokenName - */ - tokenType: function(tokenName){ - return this._tokenData[tokenName] || -1; - }, - - /** - * Returns the last consumed token to the token stream. - * @method unget - */ - unget: function(){ - //if (this._ltIndex > -1){ - if (this._ltIndexCache.length){ - this._ltIndex -= this._ltIndexCache.pop();//--; - this._token = this._lt[this._ltIndex - 1]; - } else { - throw new Error("Too much lookahead."); - } - } - -}; - - -parserlib.util = { -StringReader: StringReader, -SyntaxError : SyntaxError, -SyntaxUnit : SyntaxUnit, -EventTarget : EventTarget, -TokenStreamBase : TokenStreamBase -}; -})(); -/* -Parser-Lib -Copyright (c) 2009-2011 Nicholas C. Zakas. All rights reserved. - -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. - -*/ -/* Build time: 29-November-2012 03:43:26 */ -(function(){ -var EventTarget = parserlib.util.EventTarget, -TokenStreamBase = parserlib.util.TokenStreamBase, -StringReader = parserlib.util.StringReader, -SyntaxError = parserlib.util.SyntaxError, -SyntaxUnit = parserlib.util.SyntaxUnit; - -var Colors = { - aliceblue :"#f0f8ff", - antiquewhite :"#faebd7", - aqua :"#00ffff", - aquamarine :"#7fffd4", - azure :"#f0ffff", - beige :"#f5f5dc", - bisque :"#ffe4c4", - black :"#000000", - blanchedalmond :"#ffebcd", - blue :"#0000ff", - blueviolet :"#8a2be2", - brown :"#a52a2a", - burlywood :"#deb887", - cadetblue :"#5f9ea0", - chartreuse :"#7fff00", - chocolate :"#d2691e", - coral :"#ff7f50", - cornflowerblue :"#6495ed", - cornsilk :"#fff8dc", - crimson :"#dc143c", - cyan :"#00ffff", - darkblue :"#00008b", - darkcyan :"#008b8b", - darkgoldenrod :"#b8860b", - darkgray :"#a9a9a9", - darkgreen :"#006400", - darkkhaki :"#bdb76b", - darkmagenta :"#8b008b", - darkolivegreen :"#556b2f", - darkorange :"#ff8c00", - darkorchid :"#9932cc", - darkred :"#8b0000", - darksalmon :"#e9967a", - darkseagreen :"#8fbc8f", - darkslateblue :"#483d8b", - darkslategray :"#2f4f4f", - darkturquoise :"#00ced1", - darkviolet :"#9400d3", - deeppink :"#ff1493", - deepskyblue :"#00bfff", - dimgray :"#696969", - dodgerblue :"#1e90ff", - firebrick :"#b22222", - floralwhite :"#fffaf0", - forestgreen :"#228b22", - fuchsia :"#ff00ff", - gainsboro :"#dcdcdc", - ghostwhite :"#f8f8ff", - gold :"#ffd700", - goldenrod :"#daa520", - gray :"#808080", - green :"#008000", - greenyellow :"#adff2f", - honeydew :"#f0fff0", - hotpink :"#ff69b4", - indianred :"#cd5c5c", - indigo :"#4b0082", - ivory :"#fffff0", - khaki :"#f0e68c", - lavender :"#e6e6fa", - lavenderblush :"#fff0f5", - lawngreen :"#7cfc00", - lemonchiffon :"#fffacd", - lightblue :"#add8e6", - lightcoral :"#f08080", - lightcyan :"#e0ffff", - lightgoldenrodyellow :"#fafad2", - lightgrey :"#d3d3d3", - lightgreen :"#90ee90", - lightpink :"#ffb6c1", - lightsalmon :"#ffa07a", - lightseagreen :"#20b2aa", - lightskyblue :"#87cefa", - lightslategray :"#778899", - lightsteelblue :"#b0c4de", - lightyellow :"#ffffe0", - lime :"#00ff00", - limegreen :"#32cd32", - linen :"#faf0e6", - magenta :"#ff00ff", - maroon :"#800000", - mediumaquamarine:"#66cdaa", - mediumblue :"#0000cd", - mediumorchid :"#ba55d3", - mediumpurple :"#9370d8", - mediumseagreen :"#3cb371", - mediumslateblue :"#7b68ee", - mediumspringgreen :"#00fa9a", - mediumturquoise :"#48d1cc", - mediumvioletred :"#c71585", - midnightblue :"#191970", - mintcream :"#f5fffa", - mistyrose :"#ffe4e1", - moccasin :"#ffe4b5", - navajowhite :"#ffdead", - navy :"#000080", - oldlace :"#fdf5e6", - olive :"#808000", - olivedrab :"#6b8e23", - orange :"#ffa500", - orangered :"#ff4500", - orchid :"#da70d6", - palegoldenrod :"#eee8aa", - palegreen :"#98fb98", - paleturquoise :"#afeeee", - palevioletred :"#d87093", - papayawhip :"#ffefd5", - peachpuff :"#ffdab9", - peru :"#cd853f", - pink :"#ffc0cb", - plum :"#dda0dd", - powderblue :"#b0e0e6", - purple :"#800080", - red :"#ff0000", - rosybrown :"#bc8f8f", - royalblue :"#4169e1", - saddlebrown :"#8b4513", - salmon :"#fa8072", - sandybrown :"#f4a460", - seagreen :"#2e8b57", - seashell :"#fff5ee", - sienna :"#a0522d", - silver :"#c0c0c0", - skyblue :"#87ceeb", - slateblue :"#6a5acd", - slategray :"#708090", - snow :"#fffafa", - springgreen :"#00ff7f", - steelblue :"#4682b4", - tan :"#d2b48c", - teal :"#008080", - thistle :"#d8bfd8", - tomato :"#ff6347", - turquoise :"#40e0d0", - violet :"#ee82ee", - wheat :"#f5deb3", - white :"#ffffff", - whitesmoke :"#f5f5f5", - yellow :"#ffff00", - yellowgreen :"#9acd32" -}; -/** - * Represents a selector combinator (whitespace, +, >). - * @namespace parserlib.css - * @class Combinator - * @extends parserlib.util.SyntaxUnit - * @constructor - * @param {String} text The text representation of the unit. - * @param {int} line The line of text on which the unit resides. - * @param {int} col The column of text on which the unit resides. - */ -function Combinator(text, line, col){ - - SyntaxUnit.call(this, text, line, col, Parser.COMBINATOR_TYPE); - - /** - * The type of modifier. - * @type String - * @property type - */ - this.type = "unknown"; - - //pretty simple - if (/^\s+$/.test(text)){ - this.type = "descendant"; - } else if (text == ">"){ - this.type = "child"; - } else if (text == "+"){ - this.type = "adjacent-sibling"; - } else if (text == "~"){ - this.type = "sibling"; - } - -} - -Combinator.prototype = new SyntaxUnit(); -Combinator.prototype.constructor = Combinator; - -/** - * Represents a media feature, such as max-width:500. - * @namespace parserlib.css - * @class MediaFeature - * @extends parserlib.util.SyntaxUnit - * @constructor - * @param {SyntaxUnit} name The name of the feature. - * @param {SyntaxUnit} value The value of the feature or null if none. - */ -function MediaFeature(name, value){ - - SyntaxUnit.call(this, "(" + name + (value !== null ? ":" + value : "") + ")", name.startLine, name.startCol, Parser.MEDIA_FEATURE_TYPE); - - /** - * The name of the media feature - * @type String - * @property name - */ - this.name = name; - - /** - * The value for the feature or null if there is none. - * @type SyntaxUnit - * @property value - */ - this.value = value; -} - -MediaFeature.prototype = new SyntaxUnit(); -MediaFeature.prototype.constructor = MediaFeature; - -/** - * Represents an individual media query. - * @namespace parserlib.css - * @class MediaQuery - * @extends parserlib.util.SyntaxUnit - * @constructor - * @param {String} modifier The modifier "not" or "only" (or null). - * @param {String} mediaType The type of media (i.e., "print"). - * @param {Array} parts Array of selectors parts making up this selector. - * @param {int} line The line of text on which the unit resides. - * @param {int} col The column of text on which the unit resides. - */ -function MediaQuery(modifier, mediaType, features, line, col){ - - SyntaxUnit.call(this, (modifier ? modifier + " ": "") + (mediaType ? mediaType + " " : "") + features.join(" and "), line, col, Parser.MEDIA_QUERY_TYPE); - - /** - * The media modifier ("not" or "only") - * @type String - * @property modifier - */ - this.modifier = modifier; - - /** - * The mediaType (i.e., "print") - * @type String - * @property mediaType - */ - this.mediaType = mediaType; - - /** - * The parts that make up the selector. - * @type Array - * @property features - */ - this.features = features; - -} - -MediaQuery.prototype = new SyntaxUnit(); -MediaQuery.prototype.constructor = MediaQuery; - -/** - * A CSS3 parser. - * @namespace parserlib.css - * @class Parser - * @constructor - * @param {Object} options (Optional) Various options for the parser: - * starHack (true|false) to allow IE6 star hack as valid, - * underscoreHack (true|false) to interpret leading underscores - * as IE6-7 targeting for known properties, ieFilters (true|false) - * to indicate that IE < 8 filters should be accepted and not throw - * syntax errors. - */ -function Parser(options){ - - //inherit event functionality - EventTarget.call(this); - - - this.options = options || {}; - - this._tokenStream = null; -} - -//Static constants -Parser.DEFAULT_TYPE = 0; -Parser.COMBINATOR_TYPE = 1; -Parser.MEDIA_FEATURE_TYPE = 2; -Parser.MEDIA_QUERY_TYPE = 3; -Parser.PROPERTY_NAME_TYPE = 4; -Parser.PROPERTY_VALUE_TYPE = 5; -Parser.PROPERTY_VALUE_PART_TYPE = 6; -Parser.SELECTOR_TYPE = 7; -Parser.SELECTOR_PART_TYPE = 8; -Parser.SELECTOR_SUB_PART_TYPE = 9; - -Parser.prototype = function(){ - - var proto = new EventTarget(), //new prototype - prop, - additions = { - - //restore constructor - constructor: Parser, - - //instance constants - yuck - DEFAULT_TYPE : 0, - COMBINATOR_TYPE : 1, - MEDIA_FEATURE_TYPE : 2, - MEDIA_QUERY_TYPE : 3, - PROPERTY_NAME_TYPE : 4, - PROPERTY_VALUE_TYPE : 5, - PROPERTY_VALUE_PART_TYPE : 6, - SELECTOR_TYPE : 7, - SELECTOR_PART_TYPE : 8, - SELECTOR_SUB_PART_TYPE : 9, - - //----------------------------------------------------------------- - // Grammar - //----------------------------------------------------------------- - - _stylesheet: function(){ - - /* - * stylesheet - * : [ CHARSET_SYM S* STRING S* ';' ]? - * [S|CDO|CDC]* [ import [S|CDO|CDC]* ]* - * [ namespace [S|CDO|CDC]* ]* - * [ [ ruleset | media | page | font_face | keyframes ] [S|CDO|CDC]* ]* - * ; - */ - - var tokenStream = this._tokenStream, - charset = null, - token, - tt; - - this.fire("startstylesheet"); - - //try to read character set - this._charset(); - - this._skipCruft(); - - //try to read imports - may be more than one - while (tokenStream.peek() == Tokens.IMPORT_SYM){ - this._import(); - this._skipCruft(); - } - - //try to read namespaces - may be more than one - while (tokenStream.peek() == Tokens.NAMESPACE_SYM){ - this._namespace(); - this._skipCruft(); - } - - //get the next token - tt = tokenStream.peek(); - - //try to read the rest - while(tt > Tokens.EOF){ - - try { - - switch(tt){ - case Tokens.MEDIA_SYM: - this._media(); - this._skipCruft(); - break; - case Tokens.PAGE_SYM: - this._page(); - this._skipCruft(); - break; - case Tokens.FONT_FACE_SYM: - this._font_face(); - this._skipCruft(); - break; - case Tokens.KEYFRAMES_SYM: - this._keyframes(); - this._skipCruft(); - break; - case Tokens.S: - this._readWhitespace(); - break; - default: - if(!this._ruleset()){ - - //error handling for known issues - switch(tt){ - case Tokens.CHARSET_SYM: - token = tokenStream.LT(1); - this._charset(false); - throw new SyntaxError("@charset not allowed here.", token.startLine, token.startCol); - case Tokens.IMPORT_SYM: - token = tokenStream.LT(1); - this._import(false); - throw new SyntaxError("@import not allowed here.", token.startLine, token.startCol); - case Tokens.NAMESPACE_SYM: - token = tokenStream.LT(1); - this._namespace(false); - throw new SyntaxError("@namespace not allowed here.", token.startLine, token.startCol); - default: - tokenStream.get(); //get the last token - this._unexpectedToken(tokenStream.token()); - } - - } - } - } catch(ex) { - if (ex instanceof SyntaxError && !this.options.strict){ - this.fire({ - type: "error", - error: ex, - message: ex.message, - line: ex.line, - col: ex.col - }); - } else { - throw ex; - } - } - - tt = tokenStream.peek(); - } - - if (tt != Tokens.EOF){ - this._unexpectedToken(tokenStream.token()); - } - - this.fire("endstylesheet"); - }, - - _charset: function(emit){ - var tokenStream = this._tokenStream, - charset, - token, - line, - col; - - if (tokenStream.match(Tokens.CHARSET_SYM)){ - line = tokenStream.token().startLine; - col = tokenStream.token().startCol; - - this._readWhitespace(); - tokenStream.mustMatch(Tokens.STRING); - - token = tokenStream.token(); - charset = token.value; - - this._readWhitespace(); - tokenStream.mustMatch(Tokens.SEMICOLON); - - if (emit !== false){ - this.fire({ - type: "charset", - charset:charset, - line: line, - col: col - }); - } - } - }, - - _import: function(emit){ - /* - * import - * : IMPORT_SYM S* - * [STRING|URI] S* media_query_list? ';' S* - */ - - var tokenStream = this._tokenStream, - tt, - uri, - importToken, - mediaList = []; - - //read import symbol - tokenStream.mustMatch(Tokens.IMPORT_SYM); - importToken = tokenStream.token(); - this._readWhitespace(); - - tokenStream.mustMatch([Tokens.STRING, Tokens.URI]); - - //grab the URI value - uri = tokenStream.token().value.replace(/(?:url\()?["']([^"']+)["']\)?/, "$1"); - - this._readWhitespace(); - - mediaList = this._media_query_list(); - - //must end with a semicolon - tokenStream.mustMatch(Tokens.SEMICOLON); - this._readWhitespace(); - - if (emit !== false){ - this.fire({ - type: "import", - uri: uri, - media: mediaList, - line: importToken.startLine, - col: importToken.startCol - }); - } - - }, - - _namespace: function(emit){ - /* - * namespace - * : NAMESPACE_SYM S* [namespace_prefix S*]? [STRING|URI] S* ';' S* - */ - - var tokenStream = this._tokenStream, - line, - col, - prefix, - uri; - - //read import symbol - tokenStream.mustMatch(Tokens.NAMESPACE_SYM); - line = tokenStream.token().startLine; - col = tokenStream.token().startCol; - this._readWhitespace(); - - //it's a namespace prefix - no _namespace_prefix() method because it's just an IDENT - if (tokenStream.match(Tokens.IDENT)){ - prefix = tokenStream.token().value; - this._readWhitespace(); - } - - tokenStream.mustMatch([Tokens.STRING, Tokens.URI]); - /*if (!tokenStream.match(Tokens.STRING)){ - tokenStream.mustMatch(Tokens.URI); - }*/ - - //grab the URI value - uri = tokenStream.token().value.replace(/(?:url\()?["']([^"']+)["']\)?/, "$1"); - - this._readWhitespace(); - - //must end with a semicolon - tokenStream.mustMatch(Tokens.SEMICOLON); - this._readWhitespace(); - - if (emit !== false){ - this.fire({ - type: "namespace", - prefix: prefix, - uri: uri, - line: line, - col: col - }); - } - - }, - - _media: function(){ - /* - * media - * : MEDIA_SYM S* media_query_list S* '{' S* ruleset* '}' S* - * ; - */ - var tokenStream = this._tokenStream, - line, - col, - mediaList;// = []; - - //look for @media - tokenStream.mustMatch(Tokens.MEDIA_SYM); - line = tokenStream.token().startLine; - col = tokenStream.token().startCol; - - this._readWhitespace(); - - mediaList = this._media_query_list(); - - tokenStream.mustMatch(Tokens.LBRACE); - this._readWhitespace(); - - this.fire({ - type: "startmedia", - media: mediaList, - line: line, - col: col - }); - - while(true) { - if (tokenStream.peek() == Tokens.PAGE_SYM){ - this._page(); - } else if (!this._ruleset()){ - break; - } - } - - tokenStream.mustMatch(Tokens.RBRACE); - this._readWhitespace(); - - this.fire({ - type: "endmedia", - media: mediaList, - line: line, - col: col - }); - }, - - - //CSS3 Media Queries - _media_query_list: function(){ - /* - * media_query_list - * : S* [media_query [ ',' S* media_query ]* ]? - * ; - */ - var tokenStream = this._tokenStream, - mediaList = []; - - - this._readWhitespace(); - - if (tokenStream.peek() == Tokens.IDENT || tokenStream.peek() == Tokens.LPAREN){ - mediaList.push(this._media_query()); - } - - while(tokenStream.match(Tokens.COMMA)){ - this._readWhitespace(); - mediaList.push(this._media_query()); - } - - return mediaList; - }, - - /* - * Note: "expression" in the grammar maps to the _media_expression - * method. - - */ - _media_query: function(){ - /* - * media_query - * : [ONLY | NOT]? S* media_type S* [ AND S* expression ]* - * | expression [ AND S* expression ]* - * ; - */ - var tokenStream = this._tokenStream, - type = null, - ident = null, - token = null, - expressions = []; - - if (tokenStream.match(Tokens.IDENT)){ - ident = tokenStream.token().value.toLowerCase(); - - //since there's no custom tokens for these, need to manually check - if (ident != "only" && ident != "not"){ - tokenStream.unget(); - ident = null; - } else { - token = tokenStream.token(); - } - } - - this._readWhitespace(); - - if (tokenStream.peek() == Tokens.IDENT){ - type = this._media_type(); - if (token === null){ - token = tokenStream.token(); - } - } else if (tokenStream.peek() == Tokens.LPAREN){ - if (token === null){ - token = tokenStream.LT(1); - } - expressions.push(this._media_expression()); - } - - if (type === null && expressions.length === 0){ - return null; - } else { - this._readWhitespace(); - while (tokenStream.match(Tokens.IDENT)){ - if (tokenStream.token().value.toLowerCase() != "and"){ - this._unexpectedToken(tokenStream.token()); - } - - this._readWhitespace(); - expressions.push(this._media_expression()); - } - } - - return new MediaQuery(ident, type, expressions, token.startLine, token.startCol); - }, - - //CSS3 Media Queries - _media_type: function(){ - /* - * media_type - * : IDENT - * ; - */ - return this._media_feature(); - }, - - /** - * Note: in CSS3 Media Queries, this is called "expression". - * Renamed here to avoid conflict with CSS3 Selectors - * definition of "expression". Also note that "expr" in the - * grammar now maps to "expression" from CSS3 selectors. - * @method _media_expression - * @private - */ - _media_expression: function(){ - /* - * expression - * : '(' S* media_feature S* [ ':' S* expr ]? ')' S* - * ; - */ - var tokenStream = this._tokenStream, - feature = null, - token, - expression = null; - - tokenStream.mustMatch(Tokens.LPAREN); - - feature = this._media_feature(); - this._readWhitespace(); - - if (tokenStream.match(Tokens.COLON)){ - this._readWhitespace(); - token = tokenStream.LT(1); - expression = this._expression(); - } - - tokenStream.mustMatch(Tokens.RPAREN); - this._readWhitespace(); - - return new MediaFeature(feature, (expression ? new SyntaxUnit(expression, token.startLine, token.startCol) : null)); - }, - - //CSS3 Media Queries - _media_feature: function(){ - /* - * media_feature - * : IDENT - * ; - */ - var tokenStream = this._tokenStream; - - tokenStream.mustMatch(Tokens.IDENT); - - return SyntaxUnit.fromToken(tokenStream.token()); - }, - - //CSS3 Paged Media - _page: function(){ - /* - * page: - * PAGE_SYM S* IDENT? pseudo_page? S* - * '{' S* [ declaration | margin ]? [ ';' S* [ declaration | margin ]? ]* '}' S* - * ; - */ - var tokenStream = this._tokenStream, - line, - col, - identifier = null, - pseudoPage = null; - - //look for @page - tokenStream.mustMatch(Tokens.PAGE_SYM); - line = tokenStream.token().startLine; - col = tokenStream.token().startCol; - - this._readWhitespace(); - - if (tokenStream.match(Tokens.IDENT)){ - identifier = tokenStream.token().value; - - //The value 'auto' may not be used as a page name and MUST be treated as a syntax error. - if (identifier.toLowerCase() === "auto"){ - this._unexpectedToken(tokenStream.token()); - } - } - - //see if there's a colon upcoming - if (tokenStream.peek() == Tokens.COLON){ - pseudoPage = this._pseudo_page(); - } - - this._readWhitespace(); - - this.fire({ - type: "startpage", - id: identifier, - pseudo: pseudoPage, - line: line, - col: col - }); - - this._readDeclarations(true, true); - - this.fire({ - type: "endpage", - id: identifier, - pseudo: pseudoPage, - line: line, - col: col - }); - - }, - - //CSS3 Paged Media - _margin: function(){ - /* - * margin : - * margin_sym S* '{' declaration [ ';' S* declaration? ]* '}' S* - * ; - */ - var tokenStream = this._tokenStream, - line, - col, - marginSym = this._margin_sym(); - - if (marginSym){ - line = tokenStream.token().startLine; - col = tokenStream.token().startCol; - - this.fire({ - type: "startpagemargin", - margin: marginSym, - line: line, - col: col - }); - - this._readDeclarations(true); - - this.fire({ - type: "endpagemargin", - margin: marginSym, - line: line, - col: col - }); - return true; - } else { - return false; - } - }, - - //CSS3 Paged Media - _margin_sym: function(){ - - /* - * margin_sym : - * TOPLEFTCORNER_SYM | - * TOPLEFT_SYM | - * TOPCENTER_SYM | - * TOPRIGHT_SYM | - * TOPRIGHTCORNER_SYM | - * BOTTOMLEFTCORNER_SYM | - * BOTTOMLEFT_SYM | - * BOTTOMCENTER_SYM | - * BOTTOMRIGHT_SYM | - * BOTTOMRIGHTCORNER_SYM | - * LEFTTOP_SYM | - * LEFTMIDDLE_SYM | - * LEFTBOTTOM_SYM | - * RIGHTTOP_SYM | - * RIGHTMIDDLE_SYM | - * RIGHTBOTTOM_SYM - * ; - */ - - var tokenStream = this._tokenStream; - - if(tokenStream.match([Tokens.TOPLEFTCORNER_SYM, Tokens.TOPLEFT_SYM, - Tokens.TOPCENTER_SYM, Tokens.TOPRIGHT_SYM, Tokens.TOPRIGHTCORNER_SYM, - Tokens.BOTTOMLEFTCORNER_SYM, Tokens.BOTTOMLEFT_SYM, - Tokens.BOTTOMCENTER_SYM, Tokens.BOTTOMRIGHT_SYM, - Tokens.BOTTOMRIGHTCORNER_SYM, Tokens.LEFTTOP_SYM, - Tokens.LEFTMIDDLE_SYM, Tokens.LEFTBOTTOM_SYM, Tokens.RIGHTTOP_SYM, - Tokens.RIGHTMIDDLE_SYM, Tokens.RIGHTBOTTOM_SYM])) - { - return SyntaxUnit.fromToken(tokenStream.token()); - } else { - return null; - } - - }, - - _pseudo_page: function(){ - /* - * pseudo_page - * : ':' IDENT - * ; - */ - - var tokenStream = this._tokenStream; - - tokenStream.mustMatch(Tokens.COLON); - tokenStream.mustMatch(Tokens.IDENT); - - //TODO: CSS3 Paged Media says only "left", "center", and "right" are allowed - - return tokenStream.token().value; - }, - - _font_face: function(){ - /* - * font_face - * : FONT_FACE_SYM S* - * '{' S* declaration [ ';' S* declaration ]* '}' S* - * ; - */ - var tokenStream = this._tokenStream, - line, - col; - - //look for @page - tokenStream.mustMatch(Tokens.FONT_FACE_SYM); - line = tokenStream.token().startLine; - col = tokenStream.token().startCol; - - this._readWhitespace(); - - this.fire({ - type: "startfontface", - line: line, - col: col - }); - - this._readDeclarations(true); - - this.fire({ - type: "endfontface", - line: line, - col: col - }); - }, - - _operator: function(){ - - /* - * operator - * : '/' S* | ',' S* | /( empty )/ - * ; - */ - - var tokenStream = this._tokenStream, - token = null; - - if (tokenStream.match([Tokens.SLASH, Tokens.COMMA])){ - token = tokenStream.token(); - this._readWhitespace(); - } - return token ? PropertyValuePart.fromToken(token) : null; - - }, - - _combinator: function(){ - - /* - * combinator - * : PLUS S* | GREATER S* | TILDE S* | S+ - * ; - */ - - var tokenStream = this._tokenStream, - value = null, - token; - - if(tokenStream.match([Tokens.PLUS, Tokens.GREATER, Tokens.TILDE])){ - token = tokenStream.token(); - value = new Combinator(token.value, token.startLine, token.startCol); - this._readWhitespace(); - } - - return value; - }, - - _unary_operator: function(){ - - /* - * unary_operator - * : '-' | '+' - * ; - */ - - var tokenStream = this._tokenStream; - - if (tokenStream.match([Tokens.MINUS, Tokens.PLUS])){ - return tokenStream.token().value; - } else { - return null; - } - }, - - _property: function(){ - - /* - * property - * : IDENT S* - * ; - */ - - var tokenStream = this._tokenStream, - value = null, - hack = null, - tokenValue, - token, - line, - col; - - //check for star hack - throws error if not allowed - if (tokenStream.peek() == Tokens.STAR && this.options.starHack){ - tokenStream.get(); - token = tokenStream.token(); - hack = token.value; - line = token.startLine; - col = token.startCol; - } - - if(tokenStream.match(Tokens.IDENT)){ - token = tokenStream.token(); - tokenValue = token.value; - - //check for underscore hack - no error if not allowed because it's valid CSS syntax - if (tokenValue.charAt(0) == "_" && this.options.underscoreHack){ - hack = "_"; - tokenValue = tokenValue.substring(1); - } - - value = new PropertyName(tokenValue, hack, (line||token.startLine), (col||token.startCol)); - this._readWhitespace(); - } - - return value; - }, - - //Augmented with CSS3 Selectors - _ruleset: function(){ - /* - * ruleset - * : selectors_group - * '{' S* declaration? [ ';' S* declaration? ]* '}' S* - * ; - */ - - var tokenStream = this._tokenStream, - tt, - selectors; - - - /* - * Error Recovery: If even a single selector fails to parse, - * then the entire ruleset should be thrown away. - */ - try { - selectors = this._selectors_group(); - } catch (ex){ - if (ex instanceof SyntaxError && !this.options.strict){ - - //fire error event - this.fire({ - type: "error", - error: ex, - message: ex.message, - line: ex.line, - col: ex.col - }); - - //skip over everything until closing brace - tt = tokenStream.advance([Tokens.RBRACE]); - if (tt == Tokens.RBRACE){ - //if there's a right brace, the rule is finished so don't do anything - } else { - //otherwise, rethrow the error because it wasn't handled properly - throw ex; - } - - } else { - //not a syntax error, rethrow it - throw ex; - } - - //trigger parser to continue - return true; - } - - //if it got here, all selectors parsed - if (selectors){ - - this.fire({ - type: "startrule", - selectors: selectors, - line: selectors[0].line, - col: selectors[0].col - }); - - this._readDeclarations(true); - - this.fire({ - type: "endrule", - selectors: selectors, - line: selectors[0].line, - col: selectors[0].col - }); - - } - - return selectors; - - }, - - //CSS3 Selectors - _selectors_group: function(){ - - /* - * selectors_group - * : selector [ COMMA S* selector ]* - * ; - */ - var tokenStream = this._tokenStream, - selectors = [], - selector; - - selector = this._selector(); - if (selector !== null){ - - selectors.push(selector); - while(tokenStream.match(Tokens.COMMA)){ - this._readWhitespace(); - selector = this._selector(); - if (selector !== null){ - selectors.push(selector); - } else { - this._unexpectedToken(tokenStream.LT(1)); - } - } - } - - return selectors.length ? selectors : null; - }, - - //CSS3 Selectors - _selector: function(){ - /* - * selector - * : simple_selector_sequence [ combinator simple_selector_sequence ]* - * ; - */ - - var tokenStream = this._tokenStream, - selector = [], - nextSelector = null, - combinator = null, - ws = null; - - //if there's no simple selector, then there's no selector - nextSelector = this._simple_selector_sequence(); - if (nextSelector === null){ - return null; - } - - selector.push(nextSelector); - - do { - - //look for a combinator - combinator = this._combinator(); - - if (combinator !== null){ - selector.push(combinator); - nextSelector = this._simple_selector_sequence(); - - //there must be a next selector - if (nextSelector === null){ - this._unexpectedToken(this.LT(1)); - } else { - - //nextSelector is an instance of SelectorPart - selector.push(nextSelector); - } - } else { - - //if there's not whitespace, we're done - if (this._readWhitespace()){ - - //add whitespace separator - ws = new Combinator(tokenStream.token().value, tokenStream.token().startLine, tokenStream.token().startCol); - - //combinator is not required - combinator = this._combinator(); - - //selector is required if there's a combinator - nextSelector = this._simple_selector_sequence(); - if (nextSelector === null){ - if (combinator !== null){ - this._unexpectedToken(tokenStream.LT(1)); - } - } else { - - if (combinator !== null){ - selector.push(combinator); - } else { - selector.push(ws); - } - - selector.push(nextSelector); - } - } else { - break; - } - - } - } while(true); - - return new Selector(selector, selector[0].line, selector[0].col); - }, - - //CSS3 Selectors - _simple_selector_sequence: function(){ - /* - * simple_selector_sequence - * : [ type_selector | universal ] - * [ HASH | class | attrib | pseudo | negation ]* - * | [ HASH | class | attrib | pseudo | negation ]+ - * ; - */ - - var tokenStream = this._tokenStream, - - //parts of a simple selector - elementName = null, - modifiers = [], - - //complete selector text - selectorText= "", - - //the different parts after the element name to search for - components = [ - //HASH - function(){ - return tokenStream.match(Tokens.HASH) ? - new SelectorSubPart(tokenStream.token().value, "id", tokenStream.token().startLine, tokenStream.token().startCol) : - null; - }, - this._class, - this._attrib, - this._pseudo, - this._negation - ], - i = 0, - len = components.length, - component = null, - found = false, - line, - col; - - - //get starting line and column for the selector - line = tokenStream.LT(1).startLine; - col = tokenStream.LT(1).startCol; - - elementName = this._type_selector(); - if (!elementName){ - elementName = this._universal(); - } - - if (elementName !== null){ - selectorText += elementName; - } - - while(true){ - - //whitespace means we're done - if (tokenStream.peek() === Tokens.S){ - break; - } - - //check for each component - while(i < len && component === null){ - component = components[i++].call(this); - } - - if (component === null){ - - //we don't have a selector - if (selectorText === ""){ - return null; - } else { - break; - } - } else { - i = 0; - modifiers.push(component); - selectorText += component.toString(); - component = null; - } - } - - - return selectorText !== "" ? - new SelectorPart(elementName, modifiers, selectorText, line, col) : - null; - }, - - //CSS3 Selectors - _type_selector: function(){ - /* - * type_selector - * : [ namespace_prefix ]? element_name - * ; - */ - - var tokenStream = this._tokenStream, - ns = this._namespace_prefix(), - elementName = this._element_name(); - - if (!elementName){ - /* - * Need to back out the namespace that was read due to both - * type_selector and universal reading namespace_prefix - * first. Kind of hacky, but only way I can figure out - * right now how to not change the grammar. - */ - if (ns){ - tokenStream.unget(); - if (ns.length > 1){ - tokenStream.unget(); - } - } - - return null; - } else { - if (ns){ - elementName.text = ns + elementName.text; - elementName.col -= ns.length; - } - return elementName; - } - }, - - //CSS3 Selectors - _class: function(){ - /* - * class - * : '.' IDENT - * ; - */ - - var tokenStream = this._tokenStream, - token; - - if (tokenStream.match(Tokens.DOT)){ - tokenStream.mustMatch(Tokens.IDENT); - token = tokenStream.token(); - return new SelectorSubPart("." + token.value, "class", token.startLine, token.startCol - 1); - } else { - return null; - } - - }, - - //CSS3 Selectors - _element_name: function(){ - /* - * element_name - * : IDENT - * ; - */ - - var tokenStream = this._tokenStream, - token; - - if (tokenStream.match(Tokens.IDENT)){ - token = tokenStream.token(); - return new SelectorSubPart(token.value, "elementName", token.startLine, token.startCol); - - } else { - return null; - } - }, - - //CSS3 Selectors - _namespace_prefix: function(){ - /* - * namespace_prefix - * : [ IDENT | '*' ]? '|' - * ; - */ - var tokenStream = this._tokenStream, - value = ""; - - //verify that this is a namespace prefix - if (tokenStream.LA(1) === Tokens.PIPE || tokenStream.LA(2) === Tokens.PIPE){ - - if(tokenStream.match([Tokens.IDENT, Tokens.STAR])){ - value += tokenStream.token().value; - } - - tokenStream.mustMatch(Tokens.PIPE); - value += "|"; - - } - - return value.length ? value : null; - }, - - //CSS3 Selectors - _universal: function(){ - /* - * universal - * : [ namespace_prefix ]? '*' - * ; - */ - var tokenStream = this._tokenStream, - value = "", - ns; - - ns = this._namespace_prefix(); - if(ns){ - value += ns; - } - - if(tokenStream.match(Tokens.STAR)){ - value += "*"; - } - - return value.length ? value : null; - - }, - - //CSS3 Selectors - _attrib: function(){ - /* - * attrib - * : '[' S* [ namespace_prefix ]? IDENT S* - * [ [ PREFIXMATCH | - * SUFFIXMATCH | - * SUBSTRINGMATCH | - * '=' | - * INCLUDES | - * DASHMATCH ] S* [ IDENT | STRING ] S* - * ]? ']' - * ; - */ - - var tokenStream = this._tokenStream, - value = null, - ns, - token; - - if (tokenStream.match(Tokens.LBRACKET)){ - token = tokenStream.token(); - value = token.value; - value += this._readWhitespace(); - - ns = this._namespace_prefix(); - - if (ns){ - value += ns; - } - - tokenStream.mustMatch(Tokens.IDENT); - value += tokenStream.token().value; - value += this._readWhitespace(); - - if(tokenStream.match([Tokens.PREFIXMATCH, Tokens.SUFFIXMATCH, Tokens.SUBSTRINGMATCH, - Tokens.EQUALS, Tokens.INCLUDES, Tokens.DASHMATCH])){ - - value += tokenStream.token().value; - value += this._readWhitespace(); - - tokenStream.mustMatch([Tokens.IDENT, Tokens.STRING]); - value += tokenStream.token().value; - value += this._readWhitespace(); - } - - tokenStream.mustMatch(Tokens.RBRACKET); - - return new SelectorSubPart(value + "]", "attribute", token.startLine, token.startCol); - } else { - return null; - } - }, - - //CSS3 Selectors - _pseudo: function(){ - - /* - * pseudo - * : ':' ':'? [ IDENT | functional_pseudo ] - * ; - */ - - var tokenStream = this._tokenStream, - pseudo = null, - colons = ":", - line, - col; - - if (tokenStream.match(Tokens.COLON)){ - - if (tokenStream.match(Tokens.COLON)){ - colons += ":"; - } - - if (tokenStream.match(Tokens.IDENT)){ - pseudo = tokenStream.token().value; - line = tokenStream.token().startLine; - col = tokenStream.token().startCol - colons.length; - } else if (tokenStream.peek() == Tokens.FUNCTION){ - line = tokenStream.LT(1).startLine; - col = tokenStream.LT(1).startCol - colons.length; - pseudo = this._functional_pseudo(); - } - - if (pseudo){ - pseudo = new SelectorSubPart(colons + pseudo, "pseudo", line, col); - } - } - - return pseudo; - }, - - //CSS3 Selectors - _functional_pseudo: function(){ - /* - * functional_pseudo - * : FUNCTION S* expression ')' - * ; - */ - - var tokenStream = this._tokenStream, - value = null; - - if(tokenStream.match(Tokens.FUNCTION)){ - value = tokenStream.token().value; - value += this._readWhitespace(); - value += this._expression(); - tokenStream.mustMatch(Tokens.RPAREN); - value += ")"; - } - - return value; - }, - - //CSS3 Selectors - _expression: function(){ - /* - * expression - * : [ [ PLUS | '-' | DIMENSION | NUMBER | STRING | IDENT ] S* ]+ - * ; - */ - - var tokenStream = this._tokenStream, - value = ""; - - while(tokenStream.match([Tokens.PLUS, Tokens.MINUS, Tokens.DIMENSION, - Tokens.NUMBER, Tokens.STRING, Tokens.IDENT, Tokens.LENGTH, - Tokens.FREQ, Tokens.ANGLE, Tokens.TIME, - Tokens.RESOLUTION])){ - - value += tokenStream.token().value; - value += this._readWhitespace(); - } - - return value.length ? value : null; - - }, - - //CSS3 Selectors - _negation: function(){ - /* - * negation - * : NOT S* negation_arg S* ')' - * ; - */ - - var tokenStream = this._tokenStream, - line, - col, - value = "", - arg, - subpart = null; - - if (tokenStream.match(Tokens.NOT)){ - value = tokenStream.token().value; - line = tokenStream.token().startLine; - col = tokenStream.token().startCol; - value += this._readWhitespace(); - arg = this._negation_arg(); - value += arg; - value += this._readWhitespace(); - tokenStream.match(Tokens.RPAREN); - value += tokenStream.token().value; - - subpart = new SelectorSubPart(value, "not", line, col); - subpart.args.push(arg); - } - - return subpart; - }, - - //CSS3 Selectors - _negation_arg: function(){ - /* - * negation_arg - * : type_selector | universal | HASH | class | attrib | pseudo - * ; - */ - - var tokenStream = this._tokenStream, - args = [ - this._type_selector, - this._universal, - function(){ - return tokenStream.match(Tokens.HASH) ? - new SelectorSubPart(tokenStream.token().value, "id", tokenStream.token().startLine, tokenStream.token().startCol) : - null; - }, - this._class, - this._attrib, - this._pseudo - ], - arg = null, - i = 0, - len = args.length, - elementName, - line, - col, - part; - - line = tokenStream.LT(1).startLine; - col = tokenStream.LT(1).startCol; - - while(i < len && arg === null){ - - arg = args[i].call(this); - i++; - } - - //must be a negation arg - if (arg === null){ - this._unexpectedToken(tokenStream.LT(1)); - } - - //it's an element name - if (arg.type == "elementName"){ - part = new SelectorPart(arg, [], arg.toString(), line, col); - } else { - part = new SelectorPart(null, [arg], arg.toString(), line, col); - } - - return part; - }, - - _declaration: function(){ - - /* - * declaration - * : property ':' S* expr prio? - * | /( empty )/ - * ; - */ - - var tokenStream = this._tokenStream, - property = null, - expr = null, - prio = null, - error = null, - invalid = null; - - property = this._property(); - if (property !== null){ - - tokenStream.mustMatch(Tokens.COLON); - this._readWhitespace(); - - expr = this._expr(); - - //if there's no parts for the value, it's an error - if (!expr || expr.length === 0){ - this._unexpectedToken(tokenStream.LT(1)); - } - - prio = this._prio(); - - try { - this._validateProperty(property, expr); - } catch (ex) { - invalid = ex; - } - - this.fire({ - type: "property", - property: property, - value: expr, - important: prio, - line: property.line, - col: property.col, - invalid: invalid - }); - - return true; - } else { - return false; - } - }, - - _prio: function(){ - /* - * prio - * : IMPORTANT_SYM S* - * ; - */ - - var tokenStream = this._tokenStream, - result = tokenStream.match(Tokens.IMPORTANT_SYM); - - this._readWhitespace(); - return result; - }, - - _expr: function(){ - /* - * expr - * : term [ operator term ]* - * ; - */ - - var tokenStream = this._tokenStream, - values = [], - //valueParts = [], - value = null, - operator = null; - - value = this._term(); - if (value !== null){ - - values.push(value); - - do { - operator = this._operator(); - - //if there's an operator, keep building up the value parts - if (operator){ - values.push(operator); - } /*else { - //if there's not an operator, you have a full value - values.push(new PropertyValue(valueParts, valueParts[0].line, valueParts[0].col)); - valueParts = []; - }*/ - - value = this._term(); - - if (value === null){ - break; - } else { - values.push(value); - } - } while(true); - } - - //cleanup - /*if (valueParts.length){ - values.push(new PropertyValue(valueParts, valueParts[0].line, valueParts[0].col)); - }*/ - - return values.length > 0 ? new PropertyValue(values, values[0].startLine, values[0].startCol) : null; - }, - - _term: function(){ - - /* - * term - * : unary_operator? - * [ NUMBER S* | PERCENTAGE S* | LENGTH S* | ANGLE S* | - * TIME S* | FREQ S* | function | ie_function ] - * | STRING S* | IDENT S* | URI S* | UNICODERANGE S* | hexcolor - * ; - */ - - var tokenStream = this._tokenStream, - unary = null, - value = null, - line, - col; - - //returns the operator or null - unary = this._unary_operator(); - if (unary !== null){ - line = tokenStream.token().startLine; - col = tokenStream.token().startCol; - } - - //exception for IE filters - if (tokenStream.peek() == Tokens.IE_FUNCTION && this.options.ieFilters){ - - value = this._ie_function(); - if (unary === null){ - line = tokenStream.token().startLine; - col = tokenStream.token().startCol; - } - - //see if there's a simple match - } else if (tokenStream.match([Tokens.NUMBER, Tokens.PERCENTAGE, Tokens.LENGTH, - Tokens.ANGLE, Tokens.TIME, - Tokens.FREQ, Tokens.STRING, Tokens.IDENT, Tokens.URI, Tokens.UNICODE_RANGE])){ - - value = tokenStream.token().value; - if (unary === null){ - line = tokenStream.token().startLine; - col = tokenStream.token().startCol; - } - this._readWhitespace(); - } else { - - //see if it's a color - value = this._hexcolor(); - if (value === null){ - - //if there's no unary, get the start of the next token for line/col info - if (unary === null){ - line = tokenStream.LT(1).startLine; - col = tokenStream.LT(1).startCol; - } - - //has to be a function - if (value === null){ - - /* - * This checks for alpha(opacity=0) style of IE - * functions. IE_FUNCTION only presents progid: style. - */ - if (tokenStream.LA(3) == Tokens.EQUALS && this.options.ieFilters){ - value = this._ie_function(); - } else { - value = this._function(); - } - } - - /*if (value === null){ - return null; - //throw new Error("Expected identifier at line " + tokenStream.token().startLine + ", character " + tokenStream.token().startCol + "."); - }*/ - - } else { - if (unary === null){ - line = tokenStream.token().startLine; - col = tokenStream.token().startCol; - } - } - - } - - return value !== null ? - new PropertyValuePart(unary !== null ? unary + value : value, line, col) : - null; - - }, - - _function: function(){ - - /* - * function - * : FUNCTION S* expr ')' S* - * ; - */ - - var tokenStream = this._tokenStream, - functionText = null, - expr = null, - lt; - - if (tokenStream.match(Tokens.FUNCTION)){ - functionText = tokenStream.token().value; - this._readWhitespace(); - expr = this._expr(); - functionText += expr; - - //START: Horrible hack in case it's an IE filter - if (this.options.ieFilters && tokenStream.peek() == Tokens.EQUALS){ - do { - - if (this._readWhitespace()){ - functionText += tokenStream.token().value; - } - - //might be second time in the loop - if (tokenStream.LA(0) == Tokens.COMMA){ - functionText += tokenStream.token().value; - } - - tokenStream.match(Tokens.IDENT); - functionText += tokenStream.token().value; - - tokenStream.match(Tokens.EQUALS); - functionText += tokenStream.token().value; - - //functionText += this._term(); - lt = tokenStream.peek(); - while(lt != Tokens.COMMA && lt != Tokens.S && lt != Tokens.RPAREN){ - tokenStream.get(); - functionText += tokenStream.token().value; - lt = tokenStream.peek(); - } - } while(tokenStream.match([Tokens.COMMA, Tokens.S])); - } - - //END: Horrible Hack - - tokenStream.match(Tokens.RPAREN); - functionText += ")"; - this._readWhitespace(); - } - - return functionText; - }, - - _ie_function: function(){ - - /* (My own extension) - * ie_function - * : IE_FUNCTION S* IDENT '=' term [S* ','? IDENT '=' term]+ ')' S* - * ; - */ - - var tokenStream = this._tokenStream, - functionText = null, - expr = null, - lt; - - //IE function can begin like a regular function, too - if (tokenStream.match([Tokens.IE_FUNCTION, Tokens.FUNCTION])){ - functionText = tokenStream.token().value; - - do { - - if (this._readWhitespace()){ - functionText += tokenStream.token().value; - } - - //might be second time in the loop - if (tokenStream.LA(0) == Tokens.COMMA){ - functionText += tokenStream.token().value; - } - - tokenStream.match(Tokens.IDENT); - functionText += tokenStream.token().value; - - tokenStream.match(Tokens.EQUALS); - functionText += tokenStream.token().value; - - //functionText += this._term(); - lt = tokenStream.peek(); - while(lt != Tokens.COMMA && lt != Tokens.S && lt != Tokens.RPAREN){ - tokenStream.get(); - functionText += tokenStream.token().value; - lt = tokenStream.peek(); - } - } while(tokenStream.match([Tokens.COMMA, Tokens.S])); - - tokenStream.match(Tokens.RPAREN); - functionText += ")"; - this._readWhitespace(); - } - - return functionText; - }, - - _hexcolor: function(){ - /* - * There is a constraint on the color that it must - * have either 3 or 6 hex-digits (i.e., [0-9a-fA-F]) - * after the "#"; e.g., "#000" is OK, but "#abcd" is not. - * - * hexcolor - * : HASH S* - * ; - */ - - var tokenStream = this._tokenStream, - token, - color = null; - - if(tokenStream.match(Tokens.HASH)){ - - //need to do some validation here - - token = tokenStream.token(); - color = token.value; - if (!/#[a-f0-9]{3,6}/i.test(color)){ - throw new SyntaxError("Expected a hex color but found '" + color + "' at line " + token.startLine + ", col " + token.startCol + ".", token.startLine, token.startCol); - } - this._readWhitespace(); - } - - return color; - }, - - //----------------------------------------------------------------- - // Animations methods - //----------------------------------------------------------------- - - _keyframes: function(){ - - /* - * keyframes: - * : KEYFRAMES_SYM S* keyframe_name S* '{' S* keyframe_rule* '}' { - * ; - */ - var tokenStream = this._tokenStream, - token, - tt, - name; - - tokenStream.mustMatch(Tokens.KEYFRAMES_SYM); - this._readWhitespace(); - name = this._keyframe_name(); - - this._readWhitespace(); - tokenStream.mustMatch(Tokens.LBRACE); - - this.fire({ - type: "startkeyframes", - name: name, - line: name.line, - col: name.col - }); - - this._readWhitespace(); - tt = tokenStream.peek(); - - //check for key - while(tt == Tokens.IDENT || tt == Tokens.PERCENTAGE) { - this._keyframe_rule(); - this._readWhitespace(); - tt = tokenStream.peek(); - } - - this.fire({ - type: "endkeyframes", - name: name, - line: name.line, - col: name.col - }); - - this._readWhitespace(); - tokenStream.mustMatch(Tokens.RBRACE); - - }, - - _keyframe_name: function(){ - - /* - * keyframe_name: - * : IDENT - * | STRING - * ; - */ - var tokenStream = this._tokenStream, - token; - - tokenStream.mustMatch([Tokens.IDENT, Tokens.STRING]); - return SyntaxUnit.fromToken(tokenStream.token()); - }, - - _keyframe_rule: function(){ - - /* - * keyframe_rule: - * : key_list S* - * '{' S* declaration [ ';' S* declaration ]* '}' S* - * ; - */ - var tokenStream = this._tokenStream, - token, - keyList = this._key_list(); - - this.fire({ - type: "startkeyframerule", - keys: keyList, - line: keyList[0].line, - col: keyList[0].col - }); - - this._readDeclarations(true); - - this.fire({ - type: "endkeyframerule", - keys: keyList, - line: keyList[0].line, - col: keyList[0].col - }); - - }, - - _key_list: function(){ - - /* - * key_list: - * : key [ S* ',' S* key]* - * ; - */ - var tokenStream = this._tokenStream, - token, - key, - keyList = []; - - //must be least one key - keyList.push(this._key()); - - this._readWhitespace(); - - while(tokenStream.match(Tokens.COMMA)){ - this._readWhitespace(); - keyList.push(this._key()); - this._readWhitespace(); - } - - return keyList; - }, - - _key: function(){ - /* - * There is a restriction that IDENT can be only "from" or "to". - * - * key - * : PERCENTAGE - * | IDENT - * ; - */ - - var tokenStream = this._tokenStream, - token; - - if (tokenStream.match(Tokens.PERCENTAGE)){ - return SyntaxUnit.fromToken(tokenStream.token()); - } else if (tokenStream.match(Tokens.IDENT)){ - token = tokenStream.token(); - - if (/from|to/i.test(token.value)){ - return SyntaxUnit.fromToken(token); - } - - tokenStream.unget(); - } - - //if it gets here, there wasn't a valid token, so time to explode - this._unexpectedToken(tokenStream.LT(1)); - }, - - //----------------------------------------------------------------- - // Helper methods - //----------------------------------------------------------------- - - /** - * Not part of CSS grammar, but useful for skipping over - * combination of white space and HTML-style comments. - * @return {void} - * @method _skipCruft - * @private - */ - _skipCruft: function(){ - while(this._tokenStream.match([Tokens.S, Tokens.CDO, Tokens.CDC])){ - //noop - } - }, - - /** - * Not part of CSS grammar, but this pattern occurs frequently - * in the official CSS grammar. Split out here to eliminate - * duplicate code. - * @param {Boolean} checkStart Indicates if the rule should check - * for the left brace at the beginning. - * @param {Boolean} readMargins Indicates if the rule should check - * for margin patterns. - * @return {void} - * @method _readDeclarations - * @private - */ - _readDeclarations: function(checkStart, readMargins){ - /* - * Reads the pattern - * S* '{' S* declaration [ ';' S* declaration ]* '}' S* - * or - * S* '{' S* [ declaration | margin ]? [ ';' S* [ declaration | margin ]? ]* '}' S* - * Note that this is how it is described in CSS3 Paged Media, but is actually incorrect. - * A semicolon is only necessary following a delcaration is there's another declaration - * or margin afterwards. - */ - var tokenStream = this._tokenStream, - tt; - - - this._readWhitespace(); - - if (checkStart){ - tokenStream.mustMatch(Tokens.LBRACE); - } - - this._readWhitespace(); - - try { - - while(true){ - - if (readMargins && this._margin()){ - //noop - } else if (this._declaration()){ - if (!tokenStream.match(Tokens.SEMICOLON)){ - break; - } - } else { - break; - } - - //if ((!this._margin() && !this._declaration()) || !tokenStream.match(Tokens.SEMICOLON)){ - // break; - //} - this._readWhitespace(); - } - - tokenStream.mustMatch(Tokens.RBRACE); - this._readWhitespace(); - - } catch (ex) { - if (ex instanceof SyntaxError && !this.options.strict){ - - //fire error event - this.fire({ - type: "error", - error: ex, - message: ex.message, - line: ex.line, - col: ex.col - }); - - //see if there's another declaration - tt = tokenStream.advance([Tokens.SEMICOLON, Tokens.RBRACE]); - if (tt == Tokens.SEMICOLON){ - //if there's a semicolon, then there might be another declaration - this._readDeclarations(false, readMargins); - } else if (tt == Tokens.RBRACE){ - //if there's a right brace, the rule is finished so don't do anything - } else { - //otherwise, rethrow the error because it wasn't handled properly - throw ex; - } - - } else { - //not a syntax error, rethrow it - throw ex; - } - } - - }, - - /** - * In some cases, you can end up with two white space tokens in a - * row. Instead of making a change in every function that looks for - * white space, this function is used to match as much white space - * as necessary. - * @method _readWhitespace - * @return {String} The white space if found, empty string if not. - * @private - */ - _readWhitespace: function(){ - - var tokenStream = this._tokenStream, - ws = ""; - - while(tokenStream.match(Tokens.S)){ - ws += tokenStream.token().value; - } - - return ws; - }, - - - /** - * Throws an error when an unexpected token is found. - * @param {Object} token The token that was found. - * @method _unexpectedToken - * @return {void} - * @private - */ - _unexpectedToken: function(token){ - throw new SyntaxError("Unexpected token '" + token.value + "' at line " + token.startLine + ", col " + token.startCol + ".", token.startLine, token.startCol); - }, - - /** - * Helper method used for parsing subparts of a style sheet. - * @return {void} - * @method _verifyEnd - * @private - */ - _verifyEnd: function(){ - if (this._tokenStream.LA(1) != Tokens.EOF){ - this._unexpectedToken(this._tokenStream.LT(1)); - } - }, - - //----------------------------------------------------------------- - // Validation methods - //----------------------------------------------------------------- - _validateProperty: function(property, value){ - var name = property.text.toLowerCase(), - validation, - i, len; - - if (Properties[name]){ - - if (typeof Properties[name] == "function"){ - Properties[name](value); - } - - //otherwise, no validation available yet - } else if (name.indexOf("-") !== 0){ //vendor prefixed are ok - throw new ValidationError("Unknown property '" + property + "'.", property.line, property.col); - } - }, - - //----------------------------------------------------------------- - // Parsing methods - //----------------------------------------------------------------- - - parse: function(input){ - this._tokenStream = new TokenStream(input, Tokens); - this._stylesheet(); - }, - - parseStyleSheet: function(input){ - //just passthrough - return this.parse(input); - }, - - parseMediaQuery: function(input){ - this._tokenStream = new TokenStream(input, Tokens); - var result = this._media_query(); - - //if there's anything more, then it's an invalid selector - this._verifyEnd(); - - //otherwise return result - return result; - }, - - /** - * Parses a property value (everything after the semicolon). - * @return {parserlib.css.PropertyValue} The property value. - * @throws parserlib.util.SyntaxError If an unexpected token is found. - * @method parserPropertyValue - */ - parsePropertyValue: function(input){ - - this._tokenStream = new TokenStream(input, Tokens); - this._readWhitespace(); - - var result = this._expr(); - - //okay to have a trailing white space - this._readWhitespace(); - - //if there's anything more, then it's an invalid selector - this._verifyEnd(); - - //otherwise return result - return result; - }, - - /** - * Parses a complete CSS rule, including selectors and - * properties. - * @param {String} input The text to parser. - * @return {Boolean} True if the parse completed successfully, false if not. - * @method parseRule - */ - parseRule: function(input){ - this._tokenStream = new TokenStream(input, Tokens); - - //skip any leading white space - this._readWhitespace(); - - var result = this._ruleset(); - - //skip any trailing white space - this._readWhitespace(); - - //if there's anything more, then it's an invalid selector - this._verifyEnd(); - - //otherwise return result - return result; - }, - - /** - * Parses a single CSS selector (no comma) - * @param {String} input The text to parse as a CSS selector. - * @return {Selector} An object representing the selector. - * @throws parserlib.util.SyntaxError If an unexpected token is found. - * @method parseSelector - */ - parseSelector: function(input){ - - this._tokenStream = new TokenStream(input, Tokens); - - //skip any leading white space - this._readWhitespace(); - - var result = this._selector(); - - //skip any trailing white space - this._readWhitespace(); - - //if there's anything more, then it's an invalid selector - this._verifyEnd(); - - //otherwise return result - return result; - }, - - /** - * Parses an HTML style attribute: a set of CSS declarations - * separated by semicolons. - * @param {String} input The text to parse as a style attribute - * @return {void} - * @method parseStyleAttribute - */ - parseStyleAttribute: function(input){ - input += "}"; // for error recovery in _readDeclarations() - this._tokenStream = new TokenStream(input, Tokens); - this._readDeclarations(); - } - }; - - //copy over onto prototype - for (prop in additions){ - proto[prop] = additions[prop]; - } - - return proto; -}(); - - -/* -nth - : S* [ ['-'|'+']? INTEGER? {N} [ S* ['-'|'+'] S* INTEGER ]? | - ['-'|'+']? INTEGER | {O}{D}{D} | {E}{V}{E}{N} ] S* - ; -*/ -//This file will likely change a lot! Very experimental! - -var ValidationType = { - - "absolute-size": function(part){ - return this.identifier(part, "xx-small | x-small | small | medium | large | x-large | xx-large"); - }, - - "attachment": function(part){ - return this.identifier(part, "scroll | fixed | local"); - }, - - "box": function(part){ - return this.identifier(part, "padding-box | border-box | content-box"); - }, - - "relative-size": function(part){ - return this.identifier(part, "smaller | larger"); - }, - - "identifier": function(part, options){ - var text = part.text.toString().toLowerCase(), - args = options.split(" | "), - i, len, found = false; - - - for (i=0,len=args.length; i < len && !found; i++){ - if (text == args[i]){ - found = true; - } - } - - return found; - }, - - "length": function(part){ - return part.type == "length" || part.type == "number" || part.type == "integer" || part == "0"; - }, - - "color": function(part){ - return part.type == "color" || part == "transparent"; - }, - - "number": function(part){ - return part.type == "number" || this.integer(part); - }, - - "integer": function(part){ - return part.type == "integer"; - }, - - "angle": function(part){ - return part.type == "angle"; - }, - - "uri": function(part){ - return part.type == "uri"; - }, - - "image": function(part){ - return this.uri(part); - }, - - "bg-image": function(part){ - return this.image(part) || part == "none"; - }, - - "percentage": function(part){ - return part.type == "percentage" || part == "0"; - }, - - "border-width": function(part){ - return this.length(part) || this.identifier(part, "thin | medium | thick"); - }, - - "border-style": function(part){ - return this.identifier(part, "none | hidden | dotted | dashed | solid | double | groove | ridge | inset | outset"); - }, - - "margin-width": function(part){ - return this.length(part) || this.percentage(part) || this.identifier(part, "auto"); - }, - - "padding-width": function(part){ - return this.length(part) || this.percentage(part); - } -}; - - - - - - - -var Properties = { - - //A - "alignment-adjust": 1, - "alignment-baseline": 1, - "animation": 1, - "animation-delay": 1, - "animation-direction": { multi: [ "normal | alternate" ], separator: "," }, - "animation-duration": 1, - "animation-fill-mode": 1, - "animation-iteration-count": { multi: [ "number", "infinite"], separator: "," }, - "animation-name": 1, - "animation-play-state": { multi: [ "running | paused" ], separator: "," }, - "animation-timing-function": 1, - "appearance": 1, - "azimuth": 1, - - //B - "backface-visibility": 1, - "background": 1, - "background-attachment": { multi: [ "attachment" ], separator: "," }, - "background-break": 1, - "background-clip": { multi: [ "box" ], separator: "," }, - "background-color": [ "color", "inherit" ], - "background-image": { multi: [ "bg-image" ], separator: "," }, - "background-origin": { multi: [ "box" ], separator: "," }, - "background-position": 1, - "background-repeat": [ "repeat | repeat-x | repeat-y | no-repeat | inherit" ], - "background-size": 1, - "baseline-shift": 1, - "binding": 1, - "bleed": 1, - "bookmark-label": 1, - "bookmark-level": 1, - "bookmark-state": 1, - "bookmark-target": 1, - "border": 1, - "border-bottom": 1, - "border-bottom-color": 1, - "border-bottom-left-radius": 1, - "border-bottom-right-radius": 1, - "border-bottom-style": [ "border-style" ], - "border-bottom-width": [ "border-width" ], - "border-collapse": [ "collapse | separate | inherit" ], - "border-color": { multi: [ "color", "inherit" ], max: 4 }, - "border-image": 1, - "border-image-outset": { multi: [ "length", "number" ], max: 4 }, - "border-image-repeat": { multi: [ "stretch | repeat | round" ], max: 2 }, - "border-image-slice": 1, - "border-image-source": [ "image", "none" ], - "border-image-width": { multi: [ "length", "percentage", "number", "auto" ], max: 4 }, - "border-left": 1, - "border-left-color": [ "color", "inherit" ], - "border-left-style": [ "border-style" ], - "border-left-width": [ "border-width" ], - "border-radius": 1, - "border-right": 1, - "border-right-color": [ "color", "inherit" ], - "border-right-style": [ "border-style" ], - "border-right-width": [ "border-width" ], - "border-spacing": 1, - "border-style": { multi: [ "border-style" ], max: 4 }, - "border-top": 1, - "border-top-color": [ "color", "inherit" ], - "border-top-left-radius": 1, - "border-top-right-radius": 1, - "border-top-style": [ "border-style" ], - "border-top-width": [ "border-width" ], - "border-width": { multi: [ "border-width" ], max: 4 }, - "bottom": [ "margin-width", "inherit" ], - "box-align": [ "start | end | center | baseline | stretch" ], //http://www.w3.org/TR/2009/WD-css3-flexbox-20090723/ - "box-decoration-break": [ "slice |clone" ], - "box-direction": [ "normal | reverse | inherit" ], - "box-flex": [ "number" ], - "box-flex-group": [ "integer" ], - "box-lines": [ "single | multiple" ], - "box-ordinal-group": [ "integer" ], - "box-orient": [ "horizontal | vertical | inline-axis | block-axis | inherit" ], - "box-pack": [ "start | end | center | justify" ], - "box-shadow": 1, - "box-sizing": [ "content-box | border-box | inherit" ], - "break-after": [ "auto | always | avoid | left | right | page | column | avoid-page | avoid-column" ], - "break-before": [ "auto | always | avoid | left | right | page | column | avoid-page | avoid-column" ], - "break-inside": [ "auto | avoid | avoid-page | avoid-column" ], - - //C - "caption-side": [ "top | bottom | inherit" ], - "clear": [ "none | right | left | both | inherit" ], - "clip": 1, - "color": [ "color", "inherit" ], - "color-profile": 1, - "column-count": [ "integer", "auto" ], //http://www.w3.org/TR/css3-multicol/ - "column-fill": [ "auto | balance" ], - "column-gap": [ "length", "normal" ], - "column-rule": 1, - "column-rule-color": [ "color" ], - "column-rule-style": [ "border-style" ], - "column-rule-width": [ "border-width" ], - "column-span": [ "none | all" ], - "column-width": [ "length", "auto" ], - "columns": 1, - "content": 1, - "counter-increment": 1, - "counter-reset": 1, - "crop": 1, - "cue": [ "cue-after | cue-before | inherit" ], - "cue-after": 1, - "cue-before": 1, - "cursor": 1, - - //D - "direction": [ "ltr | rtl | inherit" ], - "display": [ "inline | block | list-item | inline-block | table | inline-table | table-row-group | table-header-group | table-footer-group | table-row | table-column-group | table-column | table-cell | table-caption | box | inline-box | grid | inline-grid", "none | inherit" ], - "dominant-baseline": 1, - "drop-initial-after-adjust": 1, - "drop-initial-after-align": 1, - "drop-initial-before-adjust": 1, - "drop-initial-before-align": 1, - "drop-initial-size": 1, - "drop-initial-value": 1, - - //E - "elevation": 1, - "empty-cells": [ "show | hide | inherit" ], - - //F - "filter": 1, - "fit": [ "fill | hidden | meet | slice" ], - "fit-position": 1, - "float": [ "left | right | none | inherit" ], - "float-offset": 1, - "font": 1, - "font-family": 1, - "font-size": [ "absolute-size", "relative-size", "length", "percentage", "inherit" ], - "font-size-adjust": 1, - "font-stretch": 1, - "font-style": [ "normal | italic | oblique | inherit" ], - "font-variant": [ "normal | small-caps | inherit" ], - "font-weight": [ "normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | inherit" ], - - //G - "grid-cell-stacking": [ "columns | rows | layer" ], - "grid-column": 1, - "grid-columns": 1, - "grid-column-align": [ "start | end | center | stretch" ], - "grid-column-sizing": 1, - "grid-column-span": [ "integer" ], - "grid-flow": [ "none | rows | columns" ], - "grid-layer": [ "integer" ], - "grid-row": 1, - "grid-rows": 1, - "grid-row-align": [ "start | end | center | stretch" ], - "grid-row-span": [ "integer" ], - "grid-row-sizing": 1, - - //H - "hanging-punctuation": 1, - "height": [ "margin-width", "inherit" ], - "hyphenate-after": 1, - "hyphenate-before": 1, - "hyphenate-character": [ "string", "auto" ], - "hyphenate-lines": 1, - "hyphenate-resource": 1, - "hyphens": [ "none | manual | auto" ], - - //I - "icon": 1, - "image-orientation": [ "angle", "auto" ], - "image-rendering": 1, - "image-resolution": 1, - "inline-box-align": 1, - - //L - "left": [ "margin-width", "inherit" ], - "letter-spacing": [ "length", "normal | inherit" ], - "line-height": [ "number", "length", "percentage", "normal | inherit"], - "line-break": [ "auto | loose | normal | strict" ], - "line-stacking": 1, - "line-stacking-ruby": 1, - "line-stacking-shift": 1, - "line-stacking-strategy": 1, - "list-style": 1, - "list-style-image": [ "uri", "none | inherit" ], - "list-style-position": [ "inside | outside | inherit" ], - "list-style-type": [ "disc | circle | square | decimal | decimal-leading-zero | lower-roman | upper-roman | lower-greek | lower-latin | upper-latin | armenian | georgian | lower-alpha | upper-alpha | none | inherit" ], - - //M - "margin": { multi: [ "margin-width", "inherit" ], max: 4 }, - "margin-bottom": [ "margin-width", "inherit" ], - "margin-left": [ "margin-width", "inherit" ], - "margin-right": [ "margin-width", "inherit" ], - "margin-top": [ "margin-width", "inherit" ], - "mark": 1, - "mark-after": 1, - "mark-before": 1, - "marks": 1, - "marquee-direction": 1, - "marquee-play-count": 1, - "marquee-speed": 1, - "marquee-style": 1, - "max-height": [ "length", "percentage", "none | inherit" ], - "max-width": [ "length", "percentage", "none | inherit" ], - "min-height": [ "length", "percentage", "inherit" ], - "min-width": [ "length", "percentage", "inherit" ], - "move-to": 1, - - //N - "nav-down": 1, - "nav-index": 1, - "nav-left": 1, - "nav-right": 1, - "nav-up": 1, - - //O - "opacity": [ "number", "inherit" ], - "orphans": [ "integer", "inherit" ], - "outline": 1, - "outline-color": [ "color", "invert | inherit" ], - "outline-offset": 1, - "outline-style": [ "border-style", "inherit" ], - "outline-width": [ "border-width", "inherit" ], - "overflow": [ "visible | hidden | scroll | auto | inherit" ], - "overflow-style": 1, - "overflow-x": 1, - "overflow-y": 1, - - //P - "padding": { multi: [ "padding-width", "inherit" ], max: 4 }, - "padding-bottom": [ "padding-width", "inherit" ], - "padding-left": [ "padding-width", "inherit" ], - "padding-right": [ "padding-width", "inherit" ], - "padding-top": [ "padding-width", "inherit" ], - "page": 1, - "page-break-after": [ "auto | always | avoid | left | right | inherit" ], - "page-break-before": [ "auto | always | avoid | left | right | inherit" ], - "page-break-inside": [ "auto | avoid | inherit" ], - "page-policy": 1, - "pause": 1, - "pause-after": 1, - "pause-before": 1, - "perspective": 1, - "perspective-origin": 1, - "phonemes": 1, - "pitch": 1, - "pitch-range": 1, - "play-during": 1, - "position": [ "static | relative | absolute | fixed | inherit" ], - "presentation-level": 1, - "punctuation-trim": 1, - - //Q - "quotes": 1, - - //R - "rendering-intent": 1, - "resize": 1, - "rest": 1, - "rest-after": 1, - "rest-before": 1, - "richness": 1, - "right": [ "margin-width", "inherit" ], - "rotation": 1, - "rotation-point": 1, - "ruby-align": 1, - "ruby-overhang": 1, - "ruby-position": 1, - "ruby-span": 1, - - //S - "size": 1, - "speak": [ "normal | none | spell-out | inherit" ], - "speak-header": [ "once | always | inherit" ], - "speak-numeral": [ "digits | continuous | inherit" ], - "speak-punctuation": [ "code | none | inherit" ], - "speech-rate": 1, - "src" : 1, - "stress": 1, - "string-set": 1, - - "table-layout": [ "auto | fixed | inherit" ], - "tab-size": [ "integer", "length" ], - "target": 1, - "target-name": 1, - "target-new": 1, - "target-position": 1, - "text-align": [ "left | right | center | justify | inherit" ], - "text-align-last": 1, - "text-decoration": 1, - "text-emphasis": 1, - "text-height": 1, - "text-indent": [ "length", "percentage", "inherit" ], - "text-justify": [ "auto | none | inter-word | inter-ideograph | inter-cluster | distribute | kashida" ], - "text-outline": 1, - "text-overflow": 1, - "text-shadow": 1, - "text-transform": [ "capitalize | uppercase | lowercase | none | inherit" ], - "text-wrap": [ "normal | none | avoid" ], - "top": [ "margin-width", "inherit" ], - "transform": 1, - "transform-origin": 1, - "transform-style": 1, - "transition": 1, - "transition-delay": 1, - "transition-duration": 1, - "transition-property": 1, - "transition-timing-function": 1, - - //U - "unicode-bidi": [ "normal | embed | bidi-override | inherit" ], - "user-modify": [ "read-only | read-write | write-only | inherit" ], - "user-select": [ "none | text | toggle | element | elements | all | inherit" ], - - //V - "vertical-align": [ "percentage", "length", "baseline | sub | super | top | text-top | middle | bottom | text-bottom | inherit" ], - "visibility": [ "visible | hidden | collapse | inherit" ], - "voice-balance": 1, - "voice-duration": 1, - "voice-family": 1, - "voice-pitch": 1, - "voice-pitch-range": 1, - "voice-rate": 1, - "voice-stress": 1, - "voice-volume": 1, - "volume": 1, - - //W - "white-space": [ "normal | pre | nowrap | pre-wrap | pre-line | inherit" ], - "white-space-collapse": 1, - "widows": [ "integer", "inherit" ], - "width": [ "length", "percentage", "auto", "inherit" ], - "word-break": [ "normal | keep-all | break-all" ], - "word-spacing": [ "length", "normal | inherit" ], - "word-wrap": 1, - - //Z - "z-index": [ "integer", "auto | inherit" ], - "zoom": [ "number", "percentage", "normal" ] -}; - -//Create validation functions for strings -(function(){ - var prop; - for (prop in Properties){ - if (Properties.hasOwnProperty(prop)){ - if (Properties[prop] instanceof Array){ - Properties[prop] = (function(values){ - return function(value){ - var valid = false, - msg = [], - part = value.parts[0]; - - if (value.parts.length != 1){ - throw new ValidationError("Expected 1 value but found " + value.parts.length + ".", value.line, value.col); - } - - for (var i=0, len=values.length; i < len && !valid; i++){ - if (typeof ValidationType[values[i]] == "undefined"){ - valid = valid || ValidationType.identifier(part, values[i]); - msg.push("one of (" + values[i] + ")"); - } else { - valid = valid || ValidationType[values[i]](part); - msg.push(values[i]); - } - } - - if (!valid){ - throw new ValidationError("Expected " + msg.join(" or ") + " but found '" + value + "'.", value.line, value.col); - } - }; - })(Properties[prop]); - } else if (typeof Properties[prop] == "object"){ - Properties[prop] = (function(spec){ - return function(value){ - var valid, - i, len, j, count, - msg, - values, - last, - parts = value.parts; - - //if there's a maximum set, use it (max can't be 0) - if (spec.max) { - if (parts.length > spec.max){ - throw new ValidationError("Expected a max of " + spec.max + " property values but found " + parts.length + ".", value.line, value.col); - } - } - - if (spec.multi){ - values = spec.multi; - } - - for (i=0, len=parts.length; i < len; i++){ - msg = []; - valid = false; - - if (spec.separator && parts[i].type == "operator"){ - - //two operators in a row - not allowed? - if ((last && last.type == "operator")){ - msg = msg.concat(values); - } else if (i == len-1){ - msg = msg.concat("end of line"); - } else if (parts[i] != spec.separator){ - msg.push("'" + spec.separator + "'"); - } else { - valid = true; - } - } else { - - for (j=0, count=values.length; j < count; j++){ - if (typeof ValidationType[values[j]] == "undefined"){ - if(ValidationType.identifier(parts[i], values[j])){ - valid = true; - break; - } - msg.push("one of (" + values[j] + ")"); - } else { - if (ValidationType[values[j]](parts[i])){ - valid = true; - break; - } - msg.push(values[j]); - } - } - } - - - if (!valid) { - throw new ValidationError("Expected " + msg.join(" or ") + " but found '" + parts[i] + "'.", value.line, value.col); - } - - - last = parts[i]; - } - - }; - })(Properties[prop]); - } - } - } -})(); -/** - * Represents a selector combinator (whitespace, +, >). - * @namespace parserlib.css - * @class PropertyName - * @extends parserlib.util.SyntaxUnit - * @constructor - * @param {String} text The text representation of the unit. - * @param {String} hack The type of IE hack applied ("*", "_", or null). - * @param {int} line The line of text on which the unit resides. - * @param {int} col The column of text on which the unit resides. - */ -function PropertyName(text, hack, line, col){ - - SyntaxUnit.call(this, text, line, col, Parser.PROPERTY_NAME_TYPE); - - /** - * The type of IE hack applied ("*", "_", or null). - * @type String - * @property hack - */ - this.hack = hack; - -} - -PropertyName.prototype = new SyntaxUnit(); -PropertyName.prototype.constructor = PropertyName; -PropertyName.prototype.toString = function(){ - return (this.hack ? this.hack : "") + this.text; -}; -/** - * Represents a single part of a CSS property value, meaning that it represents - * just everything single part between ":" and ";". If there are multiple values - * separated by commas, this type represents just one of the values. - * @param {String[]} parts An array of value parts making up this value. - * @param {int} line The line of text on which the unit resides. - * @param {int} col The column of text on which the unit resides. - * @namespace parserlib.css - * @class PropertyValue - * @extends parserlib.util.SyntaxUnit - * @constructor - */ -function PropertyValue(parts, line, col){ - - SyntaxUnit.call(this, parts.join(" "), line, col, Parser.PROPERTY_VALUE_TYPE); - - /** - * The parts that make up the selector. - * @type Array - * @property parts - */ - this.parts = parts; - -} - -PropertyValue.prototype = new SyntaxUnit(); -PropertyValue.prototype.constructor = PropertyValue; - -/** - * Represents a single part of a CSS property value, meaning that it represents - * just one part of the data between ":" and ";". - * @param {String} text The text representation of the unit. - * @param {int} line The line of text on which the unit resides. - * @param {int} col The column of text on which the unit resides. - * @namespace parserlib.css - * @class PropertyValuePart - * @extends parserlib.util.SyntaxUnit - * @constructor - */ -function PropertyValuePart(text, line, col){ - - SyntaxUnit.call(this, text, line, col, Parser.PROPERTY_VALUE_PART_TYPE); - - /** - * Indicates the type of value unit. - * @type String - * @property type - */ - this.type = "unknown"; - - //figure out what type of data it is - - var temp; - - //it is a measurement? - if (/^([+\-]?[\d\.]+)([a-z]+)$/i.test(text)){ //dimension - this.type = "dimension"; - this.value = +RegExp.$1; - this.units = RegExp.$2; - - //try to narrow down - switch(this.units.toLowerCase()){ - - case "em": - case "rem": - case "ex": - case "px": - case "cm": - case "mm": - case "in": - case "pt": - case "pc": - this.type = "length"; - break; - - case "deg": - case "rad": - case "grad": - this.type = "angle"; - break; - - case "ms": - case "s": - this.type = "time"; - break; - - case "hz": - case "khz": - this.type = "frequency"; - break; - - case "dpi": - case "dpcm": - this.type = "resolution"; - break; - - //default - - } - - } else if (/^([+\-]?[\d\.]+)%$/i.test(text)){ //percentage - this.type = "percentage"; - this.value = +RegExp.$1; - } else if (/^([+\-]?[\d\.]+)%$/i.test(text)){ //percentage - this.type = "percentage"; - this.value = +RegExp.$1; - } else if (/^([+\-]?\d+)$/i.test(text)){ //integer - this.type = "integer"; - this.value = +RegExp.$1; - } else if (/^([+\-]?[\d\.]+)$/i.test(text)){ //number - this.type = "number"; - this.value = +RegExp.$1; - - } else if (/^#([a-f0-9]{3,6})/i.test(text)){ //hexcolor - this.type = "color"; - temp = RegExp.$1; - if (temp.length == 3){ - this.red = parseInt(temp.charAt(0)+temp.charAt(0),16); - this.green = parseInt(temp.charAt(1)+temp.charAt(1),16); - this.blue = parseInt(temp.charAt(2)+temp.charAt(2),16); - } else { - this.red = parseInt(temp.substring(0,2),16); - this.green = parseInt(temp.substring(2,4),16); - this.blue = parseInt(temp.substring(4,6),16); - } - } else if (/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/i.test(text)){ //rgb() color with absolute numbers - this.type = "color"; - this.red = +RegExp.$1; - this.green = +RegExp.$2; - this.blue = +RegExp.$3; - } else if (/^rgb\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)/i.test(text)){ //rgb() color with percentages - this.type = "color"; - this.red = +RegExp.$1 * 255 / 100; - this.green = +RegExp.$2 * 255 / 100; - this.blue = +RegExp.$3 * 255 / 100; - } else if (/^rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*([\d\.]+)\s*\)/i.test(text)){ //rgba() color with absolute numbers - this.type = "color"; - this.red = +RegExp.$1; - this.green = +RegExp.$2; - this.blue = +RegExp.$3; - this.alpha = +RegExp.$4; - } else if (/^rgba\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*,\s*([\d\.]+)\s*\)/i.test(text)){ //rgba() color with percentages - this.type = "color"; - this.red = +RegExp.$1 * 255 / 100; - this.green = +RegExp.$2 * 255 / 100; - this.blue = +RegExp.$3 * 255 / 100; - this.alpha = +RegExp.$4; - } else if (/^hsl\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)/i.test(text)){ //hsl() - this.type = "color"; - this.hue = +RegExp.$1; - this.saturation = +RegExp.$2 / 100; - this.lightness = +RegExp.$3 / 100; - } else if (/^hsla\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*,\s*([\d\.]+)\s*\)/i.test(text)){ //hsla() color with percentages - this.type = "color"; - this.hue = +RegExp.$1; - this.saturation = +RegExp.$2 / 100; - this.lightness = +RegExp.$3 / 100; - this.alpha = +RegExp.$4; - } else if (/^url\(["']?([^\)"']+)["']?\)/i.test(text)){ //URI - this.type = "uri"; - this.uri = RegExp.$1; - } else if (/^["'][^"']*["']/.test(text)){ //string - this.type = "string"; - this.value = eval(text); - } else if (Colors[text.toLowerCase()]){ //named color - this.type = "color"; - temp = Colors[text.toLowerCase()].substring(1); - this.red = parseInt(temp.substring(0,2),16); - this.green = parseInt(temp.substring(2,4),16); - this.blue = parseInt(temp.substring(4,6),16); - } else if (/^[\,\/]$/.test(text)){ - this.type = "operator"; - this.value = text; - } else if (/^[a-z\-\u0080-\uFFFF][a-z0-9\-\u0080-\uFFFF]*$/i.test(text)){ - this.type = "identifier"; - this.value = text; - } - -} - -PropertyValuePart.prototype = new SyntaxUnit(); -PropertyValuePart.prototype.constructor = PropertyValue; - -/** - * Create a new syntax unit based solely on the given token. - * Convenience method for creating a new syntax unit when - * it represents a single token instead of multiple. - * @param {Object} token The token object to represent. - * @return {parserlib.css.PropertyValuePart} The object representing the token. - * @static - * @method fromToken - */ -PropertyValuePart.fromToken = function(token){ - return new PropertyValuePart(token.value, token.startLine, token.startCol); -}; -var Pseudos = { - ":first-letter": 1, - ":first-line": 1, - ":before": 1, - ":after": 1 -}; - -Pseudos.ELEMENT = 1; -Pseudos.CLASS = 2; - -Pseudos.isElement = function(pseudo){ - return pseudo.indexOf("::") === 0 || Pseudos[pseudo.toLowerCase()] == Pseudos.ELEMENT; -}; -/** - * Represents an entire single selector, including all parts but not - * including multiple selectors (those separated by commas). - * @namespace parserlib.css - * @class Selector - * @extends parserlib.util.SyntaxUnit - * @constructor - * @param {Array} parts Array of selectors parts making up this selector. - * @param {int} line The line of text on which the unit resides. - * @param {int} col The column of text on which the unit resides. - */ -function Selector(parts, line, col){ - - SyntaxUnit.call(this, parts.join(" "), line, col, Parser.SELECTOR_TYPE); - - /** - * The parts that make up the selector. - * @type Array - * @property parts - */ - this.parts = parts; - - /** - * The specificity of the selector. - * @type parserlib.css.Specificity - * @property specificity - */ - this.specificity = Specificity.calculate(this); - -} - -Selector.prototype = new SyntaxUnit(); -Selector.prototype.constructor = Selector; - -/** - * Represents a single part of a selector string, meaning a single set of - * element name and modifiers. This does not include combinators such as - * spaces, +, >, etc. - * @namespace parserlib.css - * @class SelectorPart - * @extends parserlib.util.SyntaxUnit - * @constructor - * @param {String} elementName The element name in the selector or null - * if there is no element name. - * @param {Array} modifiers Array of individual modifiers for the element. - * May be empty if there are none. - * @param {String} text The text representation of the unit. - * @param {int} line The line of text on which the unit resides. - * @param {int} col The column of text on which the unit resides. - */ -function SelectorPart(elementName, modifiers, text, line, col){ - - SyntaxUnit.call(this, text, line, col, Parser.SELECTOR_PART_TYPE); - - /** - * The tag name of the element to which this part - * of the selector affects. - * @type String - * @property elementName - */ - this.elementName = elementName; - - /** - * The parts that come after the element name, such as class names, IDs, - * pseudo classes/elements, etc. - * @type Array - * @property modifiers - */ - this.modifiers = modifiers; - -} - -SelectorPart.prototype = new SyntaxUnit(); -SelectorPart.prototype.constructor = SelectorPart; - -/** - * Represents a selector modifier string, meaning a class name, element name, - * element ID, pseudo rule, etc. - * @namespace parserlib.css - * @class SelectorSubPart - * @extends parserlib.util.SyntaxUnit - * @constructor - * @param {String} text The text representation of the unit. - * @param {String} type The type of selector modifier. - * @param {int} line The line of text on which the unit resides. - * @param {int} col The column of text on which the unit resides. - */ -function SelectorSubPart(text, type, line, col){ - - SyntaxUnit.call(this, text, line, col, Parser.SELECTOR_SUB_PART_TYPE); - - /** - * The type of modifier. - * @type String - * @property type - */ - this.type = type; - - /** - * Some subparts have arguments, this represents them. - * @type Array - * @property args - */ - this.args = []; - -} - -SelectorSubPart.prototype = new SyntaxUnit(); -SelectorSubPart.prototype.constructor = SelectorSubPart; - -/** - * Represents a selector's specificity. - * @namespace parserlib.css - * @class Specificity - * @constructor - * @param {int} a Should be 1 for inline styles, zero for stylesheet styles - * @param {int} b Number of ID selectors - * @param {int} c Number of classes and pseudo classes - * @param {int} d Number of element names and pseudo elements - */ -function Specificity(a, b, c, d){ - this.a = a; - this.b = b; - this.c = c; - this.d = d; -} - -Specificity.prototype = { - constructor: Specificity, - - /** - * Compare this specificity to another. - * @param {Specificity} other The other specificity to compare to. - * @return {int} -1 if the other specificity is larger, 1 if smaller, 0 if equal. - * @method compare - */ - compare: function(other){ - var comps = ["a", "b", "c", "d"], - i, len; - - for (i=0, len=comps.length; i < len; i++){ - if (this[comps[i]] < other[comps[i]]){ - return -1; - } else if (this[comps[i]] > other[comps[i]]){ - return 1; - } - } - - return 0; - }, - - /** - * Creates a numeric value for the specificity. - * @return {int} The numeric value for the specificity. - * @method valueOf - */ - valueOf: function(){ - return (this.a * 1000) + (this.b * 100) + (this.c * 10) + this.d; - }, - - /** - * Returns a string representation for specificity. - * @return {String} The string representation of specificity. - * @method toString - */ - toString: function(){ - return this.a + "," + this.b + "," + this.c + "," + this.d; - } - -}; - -/** - * Calculates the specificity of the given selector. - * @param {parserlib.css.Selector} The selector to calculate specificity for. - * @return {parserlib.css.Specificity} The specificity of the selector. - * @static - * @method calculate - */ -Specificity.calculate = function(selector){ - - var i, len, - b=0, c=0, d=0; - - function updateValues(part){ - - var i, j, len, num, - modifier; - - if (part.elementName && part.text.charAt(part.text.length-1) != "*") { - d++; - } - - for (i=0, len=part.modifiers.length; i < len; i++){ - modifier = part.modifiers[i]; - switch(modifier.type){ - case "class": - case "attribute": - c++; - break; - - case "id": - b++; - break; - - case "pseudo": - if (Pseudos.isElement(modifier.text)){ - d++; - } else { - c++; - } - break; - - case "not": - for (j=0, num=modifier.args.length; j < num; j++){ - updateValues(modifier.args[j]); - } - } - } - } - - for (i=0, len=selector.parts.length; i < len; i++){ - part = selector.parts[i]; - - if (part instanceof SelectorPart){ - updateValues(part); - } - } - - return new Specificity(0, b, c, d); -}; - - -var h = /^[0-9a-fA-F]$/, - nonascii = /^[\u0080-\uFFFF]$/, - nl = /\n|\r\n|\r|\f/; - -//----------------------------------------------------------------------------- -// Helper functions -//----------------------------------------------------------------------------- - - -function isHexDigit(c){ - return c != null && h.test(c); -} - -function isDigit(c){ - return c != null && /\d/.test(c); -} - -function isWhitespace(c){ - return c != null && /\s/.test(c); -} - -function isNewLine(c){ - return c != null && nl.test(c); -} - -function isNameStart(c){ - return c != null && (/[a-z_\u0080-\uFFFF\\]/i.test(c)); -} - -function isNameChar(c){ - return c != null && (isNameStart(c) || /[0-9\-\\]/.test(c)); -} - -function isIdentStart(c){ - return c != null && (isNameStart(c) || /\-\\/.test(c)); -} - -function mix(receiver, supplier){ - for (var prop in supplier){ - if (supplier.hasOwnProperty(prop)){ - receiver[prop] = supplier[prop]; - } - } - return receiver; -} - -//----------------------------------------------------------------------------- -// CSS Token Stream -//----------------------------------------------------------------------------- - - -/** - * A token stream that produces CSS tokens. - * @param {String|Reader} input The source of text to tokenize. - * @constructor - * @class TokenStream - * @namespace parserlib.css - */ -function TokenStream(input){ - TokenStreamBase.call(this, input, Tokens); -} - -TokenStream.prototype = mix(new TokenStreamBase(), { - - /** - * Overrides the TokenStreamBase method of the same name - * to produce CSS tokens. - * @param {variant} channel The name of the channel to use - * for the next token. - * @return {Object} A token object representing the next token. - * @method _getToken - * @private - */ - _getToken: function(channel){ - - var c, - reader = this._reader, - token = null, - startLine = reader.getLine(), - startCol = reader.getCol(); - - c = reader.read(); - - - while(c){ - switch(c){ - - /* - * Potential tokens: - * - COMMENT - * - SLASH - * - CHAR - */ - case "/": - - if(reader.peek() == "*"){ - token = this.commentToken(c, startLine, startCol); - } else { - token = this.charToken(c, startLine, startCol); - } - break; - - /* - * Potential tokens: - * - DASHMATCH - * - INCLUDES - * - PREFIXMATCH - * - SUFFIXMATCH - * - SUBSTRINGMATCH - * - CHAR - */ - case "|": - case "~": - case "^": - case "$": - case "*": - if(reader.peek() == "="){ - token = this.comparisonToken(c, startLine, startCol); - } else { - token = this.charToken(c, startLine, startCol); - } - break; - - /* - * Potential tokens: - * - STRING - * - INVALID - */ - case "\"": - case "'": - token = this.stringToken(c, startLine, startCol); - break; - - /* - * Potential tokens: - * - HASH - * - CHAR - */ - case "#": - if (isNameChar(reader.peek())){ - token = this.hashToken(c, startLine, startCol); - } else { - token = this.charToken(c, startLine, startCol); - } - break; - - /* - * Potential tokens: - * - DOT - * - NUMBER - * - DIMENSION - * - PERCENTAGE - */ - case ".": - if (isDigit(reader.peek())){ - token = this.numberToken(c, startLine, startCol); - } else { - token = this.charToken(c, startLine, startCol); - } - break; - - /* - * Potential tokens: - * - CDC - * - MINUS - * - NUMBER - * - DIMENSION - * - PERCENTAGE - */ - case "-": - if (reader.peek() == "-"){ //could be closing HTML-style comment - token = this.htmlCommentEndToken(c, startLine, startCol); - } else if (isNameStart(reader.peek())){ - token = this.identOrFunctionToken(c, startLine, startCol); - } else { - token = this.charToken(c, startLine, startCol); - } - break; - - /* - * Potential tokens: - * - IMPORTANT_SYM - * - CHAR - */ - case "!": - token = this.importantToken(c, startLine, startCol); - break; - - /* - * Any at-keyword or CHAR - */ - case "@": - token = this.atRuleToken(c, startLine, startCol); - break; - - /* - * Potential tokens: - * - NOT - * - CHAR - */ - case ":": - token = this.notToken(c, startLine, startCol); - break; - - /* - * Potential tokens: - * - CDO - * - CHAR - */ - case "<": - token = this.htmlCommentStartToken(c, startLine, startCol); - break; - - /* - * Potential tokens: - * - UNICODE_RANGE - * - URL - * - CHAR - */ - case "U": - case "u": - if (reader.peek() == "+"){ - token = this.unicodeRangeToken(c, startLine, startCol); - break; - } - /*falls through*/ - - default: - - /* - * Potential tokens: - * - NUMBER - * - DIMENSION - * - LENGTH - * - FREQ - * - TIME - * - EMS - * - EXS - * - ANGLE - */ - if (isDigit(c)){ - token = this.numberToken(c, startLine, startCol); - } else - - /* - * Potential tokens: - * - S - */ - if (isWhitespace(c)){ - token = this.whitespaceToken(c, startLine, startCol); - } else - - /* - * Potential tokens: - * - IDENT - */ - if (isIdentStart(c)){ - token = this.identOrFunctionToken(c, startLine, startCol); - } else - - /* - * Potential tokens: - * - CHAR - * - PLUS - */ - { - token = this.charToken(c, startLine, startCol); - } - - - - - - - } - - //make sure this token is wanted - //TODO: check channel - break; - - c = reader.read(); - } - - if (!token && c == null){ - token = this.createToken(Tokens.EOF,null,startLine,startCol); - } - - return token; - }, - - //------------------------------------------------------------------------- - // Methods to create tokens - //------------------------------------------------------------------------- - - /** - * Produces a token based on available data and the current - * reader position information. This method is called by other - * private methods to create tokens and is never called directly. - * @param {int} tt The token type. - * @param {String} value The text value of the token. - * @param {int} startLine The beginning line for the character. - * @param {int} startCol The beginning column for the character. - * @param {Object} options (Optional) Specifies a channel property - * to indicate that a different channel should be scanned - * and/or a hide property indicating that the token should - * be hidden. - * @return {Object} A token object. - * @method createToken - */ - createToken: function(tt, value, startLine, startCol, options){ - var reader = this._reader; - options = options || {}; - - return { - value: value, - type: tt, - channel: options.channel, - hide: options.hide || false, - startLine: startLine, - startCol: startCol, - endLine: reader.getLine(), - endCol: reader.getCol() - }; - }, - - //------------------------------------------------------------------------- - // Methods to create specific tokens - //------------------------------------------------------------------------- - - /** - * Produces a token for any at-rule. If the at-rule is unknown, then - * the token is for a single "@" character. - * @param {String} first The first character for the token. - * @param {int} startLine The beginning line for the character. - * @param {int} startCol The beginning column for the character. - * @return {Object} A token object. - * @method atRuleToken - */ - atRuleToken: function(first, startLine, startCol){ - var rule = first, - reader = this._reader, - tt = Tokens.CHAR, - valid = false, - ident, - c; - - /* - * First, mark where we are. There are only four @ rules, - * so anything else is really just an invalid token. - * Basically, if this doesn't match one of the known @ - * rules, just return '@' as an unknown token and allow - * parsing to continue after that point. - */ - reader.mark(); - - //try to find the at-keyword - ident = this.readName(); - rule = first + ident; - tt = Tokens.type(rule.toLowerCase()); - - //if it's not valid, use the first character only and reset the reader - if (tt == Tokens.CHAR || tt == Tokens.UNKNOWN){ - tt = Tokens.CHAR; - rule = first; - reader.reset(); - } - - return this.createToken(tt, rule, startLine, startCol); - }, - - /** - * Produces a character token based on the given character - * and location in the stream. If there's a special (non-standard) - * token name, this is used; otherwise CHAR is used. - * @param {String} c The character for the token. - * @param {int} startLine The beginning line for the character. - * @param {int} startCol The beginning column for the character. - * @return {Object} A token object. - * @method charToken - */ - charToken: function(c, startLine, startCol){ - var tt = Tokens.type(c); - - if (tt == -1){ - tt = Tokens.CHAR; - } - - return this.createToken(tt, c, startLine, startCol); - }, - - /** - * Produces a character token based on the given character - * and location in the stream. If there's a special (non-standard) - * token name, this is used; otherwise CHAR is used. - * @param {String} first The first character for the token. - * @param {int} startLine The beginning line for the character. - * @param {int} startCol The beginning column for the character. - * @return {Object} A token object. - * @method commentToken - */ - commentToken: function(first, startLine, startCol){ - var reader = this._reader, - comment = this.readComment(first); - - return this.createToken(Tokens.COMMENT, comment, startLine, startCol); - }, - - /** - * Produces a comparison token based on the given character - * and location in the stream. The next character must be - * read and is already known to be an equals sign. - * @param {String} c The character for the token. - * @param {int} startLine The beginning line for the character. - * @param {int} startCol The beginning column for the character. - * @return {Object} A token object. - * @method comparisonToken - */ - comparisonToken: function(c, startLine, startCol){ - var reader = this._reader, - comparison = c + reader.read(), - tt = Tokens.type(comparison) || Tokens.CHAR; - - return this.createToken(tt, comparison, startLine, startCol); - }, - - /** - * Produces a hash token based on the specified information. The - * first character provided is the pound sign (#) and then this - * method reads a name afterward. - * @param {String} first The first character (#) in the hash name. - * @param {int} startLine The beginning line for the character. - * @param {int} startCol The beginning column for the character. - * @return {Object} A token object. - * @method hashToken - */ - hashToken: function(first, startLine, startCol){ - var reader = this._reader, - name = this.readName(first); - - return this.createToken(Tokens.HASH, name, startLine, startCol); - }, - - /** - * Produces a CDO or CHAR token based on the specified information. The - * first character is provided and the rest is read by the function to determine - * the correct token to create. - * @param {String} first The first character in the token. - * @param {int} startLine The beginning line for the character. - * @param {int} startCol The beginning column for the character. - * @return {Object} A token object. - * @method htmlCommentStartToken - */ - htmlCommentStartToken: function(first, startLine, startCol){ - var reader = this._reader, - text = first; - - reader.mark(); - text += reader.readCount(3); - - if (text == ""){ - return this.createToken(Tokens.CDC, text, startLine, startCol); - } else { - reader.reset(); - return this.charToken(first, startLine, startCol); - } - }, - - /** - * Produces an IDENT or FUNCTION token based on the specified information. The - * first character is provided and the rest is read by the function to determine - * the correct token to create. - * @param {String} first The first character in the identifier. - * @param {int} startLine The beginning line for the character. - * @param {int} startCol The beginning column for the character. - * @return {Object} A token object. - * @method identOrFunctionToken - */ - identOrFunctionToken: function(first, startLine, startCol){ - var reader = this._reader, - ident = this.readName(first), - tt = Tokens.IDENT; - - //if there's a left paren immediately after, it's a URI or function - if (reader.peek() == "("){ - ident += reader.read(); - if (ident.toLowerCase() == "url("){ - tt = Tokens.URI; - ident = this.readURI(ident); - - //didn't find a valid URL or there's no closing paren - if (ident.toLowerCase() == "url("){ - tt = Tokens.FUNCTION; - } - } else { - tt = Tokens.FUNCTION; - } - } else if (reader.peek() == ":"){ //might be an IE function - - //IE-specific functions always being with progid: - if (ident.toLowerCase() == "progid"){ - ident += reader.readTo("("); - tt = Tokens.IE_FUNCTION; - } - } - - return this.createToken(tt, ident, startLine, startCol); - }, - - /** - * Produces an IMPORTANT_SYM or CHAR token based on the specified information. The - * first character is provided and the rest is read by the function to determine - * the correct token to create. - * @param {String} first The first character in the token. - * @param {int} startLine The beginning line for the character. - * @param {int} startCol The beginning column for the character. - * @return {Object} A token object. - * @method importantToken - */ - importantToken: function(first, startLine, startCol){ - var reader = this._reader, - important = first, - tt = Tokens.CHAR, - temp, - c; - - reader.mark(); - c = reader.read(); - - while(c){ - - //there can be a comment in here - if (c == "/"){ - - //if the next character isn't a star, then this isn't a valid !important token - if (reader.peek() != "*"){ - break; - } else { - temp = this.readComment(c); - if (temp == ""){ //broken! - break; - } - } - } else if (isWhitespace(c)){ - important += c + this.readWhitespace(); - } else if (/i/i.test(c)){ - temp = reader.readCount(8); - if (/mportant/i.test(temp)){ - important += c + temp; - tt = Tokens.IMPORTANT_SYM; - - } - break; //we're done - } else { - break; - } - - c = reader.read(); - } - - if (tt == Tokens.CHAR){ - reader.reset(); - return this.charToken(first, startLine, startCol); - } else { - return this.createToken(tt, important, startLine, startCol); - } - - - }, - - /** - * Produces a NOT or CHAR token based on the specified information. The - * first character is provided and the rest is read by the function to determine - * the correct token to create. - * @param {String} first The first character in the token. - * @param {int} startLine The beginning line for the character. - * @param {int} startCol The beginning column for the character. - * @return {Object} A token object. - * @method notToken - */ - notToken: function(first, startLine, startCol){ - var reader = this._reader, - text = first; - - reader.mark(); - text += reader.readCount(4); - - if (text.toLowerCase() == ":not("){ - return this.createToken(Tokens.NOT, text, startLine, startCol); - } else { - reader.reset(); - return this.charToken(first, startLine, startCol); - } - }, - - /** - * Produces a number token based on the given character - * and location in the stream. This may return a token of - * NUMBER, EMS, EXS, LENGTH, ANGLE, TIME, FREQ, DIMENSION, - * or PERCENTAGE. - * @param {String} first The first character for the token. - * @param {int} startLine The beginning line for the character. - * @param {int} startCol The beginning column for the character. - * @return {Object} A token object. - * @method numberToken - */ - numberToken: function(first, startLine, startCol){ - var reader = this._reader, - value = this.readNumber(first), - ident, - tt = Tokens.NUMBER, - c = reader.peek(); - - if (isIdentStart(c)){ - ident = this.readName(reader.read()); - value += ident; - - if (/^em$|^ex$|^px$|^gd$|^rem$|^vw$|^vh$|^vm$|^ch$|^cm$|^mm$|^in$|^pt$|^pc$/i.test(ident)){ - tt = Tokens.LENGTH; - } else if (/^deg|^rad$|^grad$/i.test(ident)){ - tt = Tokens.ANGLE; - } else if (/^ms$|^s$/i.test(ident)){ - tt = Tokens.TIME; - } else if (/^hz$|^khz$/i.test(ident)){ - tt = Tokens.FREQ; - } else if (/^dpi$|^dpcm$/i.test(ident)){ - tt = Tokens.RESOLUTION; - } else { - tt = Tokens.DIMENSION; - } - - } else if (c == "%"){ - value += reader.read(); - tt = Tokens.PERCENTAGE; - } - - return this.createToken(tt, value, startLine, startCol); - }, - - /** - * Produces a string token based on the given character - * and location in the stream. Since strings may be indicated - * by single or double quotes, a failure to match starting - * and ending quotes results in an INVALID token being generated. - * The first character in the string is passed in and then - * the rest are read up to and including the final quotation mark. - * @param {String} first The first character in the string. - * @param {int} startLine The beginning line for the character. - * @param {int} startCol The beginning column for the character. - * @return {Object} A token object. - * @method stringToken - */ - stringToken: function(first, startLine, startCol){ - var delim = first, - string = first, - reader = this._reader, - prev = first, - tt = Tokens.STRING, - c = reader.read(); - - while(c){ - string += c; - - //if the delimiter is found with an escapement, we're done. - if (c == delim && prev != "\\"){ - break; - } - - //if there's a newline without an escapement, it's an invalid string - if (isNewLine(reader.peek()) && c != "\\"){ - tt = Tokens.INVALID; - break; - } - - //save previous and get next - prev = c; - c = reader.read(); - } - - //if c is null, that means we're out of input and the string was never closed - if (c == null){ - tt = Tokens.INVALID; - } - - return this.createToken(tt, string, startLine, startCol); - }, - - unicodeRangeToken: function(first, startLine, startCol){ - var reader = this._reader, - value = first, - temp, - tt = Tokens.CHAR; - - //then it should be a unicode range - if (reader.peek() == "+"){ - reader.mark(); - value += reader.read(); - value += this.readUnicodeRangePart(true); - - //ensure there's an actual unicode range here - if (value.length == 2){ - reader.reset(); - } else { - - tt = Tokens.UNICODE_RANGE; - - //if there's a ? in the first part, there can't be a second part - if (value.indexOf("?") == -1){ - - if (reader.peek() == "-"){ - reader.mark(); - temp = reader.read(); - temp += this.readUnicodeRangePart(false); - - //if there's not another value, back up and just take the first - if (temp.length == 1){ - reader.reset(); - } else { - value += temp; - } - } - - } - } - } - - return this.createToken(tt, value, startLine, startCol); - }, - - /** - * Produces a S token based on the specified information. Since whitespace - * may have multiple characters, this consumes all whitespace characters - * into a single token. - * @param {String} first The first character in the token. - * @param {int} startLine The beginning line for the character. - * @param {int} startCol The beginning column for the character. - * @return {Object} A token object. - * @method whitespaceToken - */ - whitespaceToken: function(first, startLine, startCol){ - var reader = this._reader, - value = first + this.readWhitespace(); - return this.createToken(Tokens.S, value, startLine, startCol); - }, - - - - - //------------------------------------------------------------------------- - // Methods to read values from the string stream - //------------------------------------------------------------------------- - - readUnicodeRangePart: function(allowQuestionMark){ - var reader = this._reader, - part = "", - c = reader.peek(); - - //first read hex digits - while(isHexDigit(c) && part.length < 6){ - reader.read(); - part += c; - c = reader.peek(); - } - - //then read question marks if allowed - if (allowQuestionMark){ - while(c == "?" && part.length < 6){ - reader.read(); - part += c; - c = reader.peek(); - } - } - - //there can't be any other characters after this point - - return part; - }, - - readWhitespace: function(){ - var reader = this._reader, - whitespace = "", - c = reader.peek(); - - while(isWhitespace(c)){ - reader.read(); - whitespace += c; - c = reader.peek(); - } - - return whitespace; - }, - readNumber: function(first){ - var reader = this._reader, - number = first, - hasDot = (first == "."), - c = reader.peek(); - - - while(c){ - if (isDigit(c)){ - number += reader.read(); - } else if (c == "."){ - if (hasDot){ - break; - } else { - hasDot = true; - number += reader.read(); - } - } else { - break; - } - - c = reader.peek(); - } - - return number; - }, - readString: function(){ - var reader = this._reader, - delim = reader.read(), - string = delim, - prev = delim, - c = reader.peek(); - - while(c){ - c = reader.read(); - string += c; - - //if the delimiter is found with an escapement, we're done. - if (c == delim && prev != "\\"){ - break; - } - - //if there's a newline without an escapement, it's an invalid string - if (isNewLine(reader.peek()) && c != "\\"){ - string = ""; - break; - } - - //save previous and get next - prev = c; - c = reader.peek(); - } - - //if c is null, that means we're out of input and the string was never closed - if (c == null){ - string = ""; - } - - return string; - }, - readURI: function(first){ - var reader = this._reader, - uri = first, - inner = "", - c = reader.peek(); - - reader.mark(); - - //skip whitespace before - while(c && isWhitespace(c)){ - reader.read(); - c = reader.peek(); - } - - //it's a string - if (c == "'" || c == "\""){ - inner = this.readString(); - } else { - inner = this.readURL(); - } - - c = reader.peek(); - - //skip whitespace after - while(c && isWhitespace(c)){ - reader.read(); - c = reader.peek(); - } - - //if there was no inner value or the next character isn't closing paren, it's not a URI - if (inner == "" || c != ")"){ - uri = first; - reader.reset(); - } else { - uri += inner + reader.read(); - } - - return uri; - }, - readURL: function(){ - var reader = this._reader, - url = "", - c = reader.peek(); - - //TODO: Check for escape and nonascii - while (/^[!#$%&\\*-~]$/.test(c)){ - url += reader.read(); - c = reader.peek(); - } - - return url; - - }, - readName: function(first){ - var reader = this._reader, - ident = first || "", - c = reader.peek(); - - while(true){ - if (c == "\\"){ - ident += this.readEscape(reader.read()); - c = reader.peek(); - } else if(c && isNameChar(c)){ - ident += reader.read(); - c = reader.peek(); - } else { - break; - } - } - - return ident; - }, - - readEscape: function(first){ - var reader = this._reader, - cssEscape = first || "", - i = 0, - c = reader.peek(); - - if (isHexDigit(c)){ - do { - cssEscape += reader.read(); - c = reader.peek(); - } while(c && isHexDigit(c) && ++i < 6); - } - - if (cssEscape.length == 3 && /\s/.test(c) || - cssEscape.length == 7 || cssEscape.length == 1){ - reader.read(); - } else { - c = ""; - } - - return cssEscape + c; - }, - - readComment: function(first){ - var reader = this._reader, - comment = first || "", - c = reader.read(); - - if (c == "*"){ - while(c){ - comment += c; - - //look for end of comment - if (comment.length > 2 && c == "*" && reader.peek() == "/"){ - comment += reader.read(); - break; - } - - c = reader.read(); - } - - return comment; - } else { - return ""; - } - - } -}); - -var Tokens = [ - - /* - * The following token names are defined in CSS3 Grammar: http://www.w3.org/TR/css3-syntax/#lexical - */ - - //HTML-style comments - { name: "CDO"}, - { name: "CDC"}, - - //ignorables - { name: "S", whitespace: true/*, channel: "ws"*/}, - { name: "COMMENT", comment: true, hide: true, channel: "comment" }, - - //attribute equality - { name: "INCLUDES", text: "~="}, - { name: "DASHMATCH", text: "|="}, - { name: "PREFIXMATCH", text: "^="}, - { name: "SUFFIXMATCH", text: "$="}, - { name: "SUBSTRINGMATCH", text: "*="}, - - //identifier types - { name: "STRING"}, - { name: "IDENT"}, - { name: "HASH"}, - - //at-keywords - { name: "IMPORT_SYM", text: "@import"}, - { name: "PAGE_SYM", text: "@page"}, - { name: "MEDIA_SYM", text: "@media"}, - { name: "FONT_FACE_SYM", text: "@font-face"}, - { name: "CHARSET_SYM", text: "@charset"}, - { name: "NAMESPACE_SYM", text: "@namespace"}, - //{ name: "ATKEYWORD"}, - - //CSS3 animations - { name: "KEYFRAMES_SYM", text: [ "@keyframes", "@-webkit-keyframes", "@-moz-keyframes" ] }, - - //important symbol - { name: "IMPORTANT_SYM"}, - - //measurements - { name: "LENGTH"}, - { name: "ANGLE"}, - { name: "TIME"}, - { name: "FREQ"}, - { name: "DIMENSION"}, - { name: "PERCENTAGE"}, - { name: "NUMBER"}, - - //functions - { name: "URI"}, - { name: "FUNCTION"}, - - //Unicode ranges - { name: "UNICODE_RANGE"}, - - /* - * The following token names are defined in CSS3 Selectors: http://www.w3.org/TR/css3-selectors/#selector-syntax - */ - - //invalid string - { name: "INVALID"}, - - //combinators - { name: "PLUS", text: "+" }, - { name: "GREATER", text: ">"}, - { name: "COMMA", text: ","}, - { name: "TILDE", text: "~"}, - - //modifier - { name: "NOT"}, - - /* - * Defined in CSS3 Paged Media - */ - { name: "TOPLEFTCORNER_SYM", text: "@top-left-corner"}, - { name: "TOPLEFT_SYM", text: "@top-left"}, - { name: "TOPCENTER_SYM", text: "@top-center"}, - { name: "TOPRIGHT_SYM", text: "@top-right"}, - { name: "TOPRIGHTCORNER_SYM", text: "@top-right-corner"}, - { name: "BOTTOMLEFTCORNER_SYM", text: "@bottom-left-corner"}, - { name: "BOTTOMLEFT_SYM", text: "@bottom-left"}, - { name: "BOTTOMCENTER_SYM", text: "@bottom-center"}, - { name: "BOTTOMRIGHT_SYM", text: "@bottom-right"}, - { name: "BOTTOMRIGHTCORNER_SYM", text: "@bottom-right-corner"}, - { name: "LEFTTOP_SYM", text: "@left-top"}, - { name: "LEFTMIDDLE_SYM", text: "@left-middle"}, - { name: "LEFTBOTTOM_SYM", text: "@left-bottom"}, - { name: "RIGHTTOP_SYM", text: "@right-top"}, - { name: "RIGHTMIDDLE_SYM", text: "@right-middle"}, - { name: "RIGHTBOTTOM_SYM", text: "@right-bottom"}, - - /* - * The following token names are defined in CSS3 Media Queries: http://www.w3.org/TR/css3-mediaqueries/#syntax - */ - /*{ name: "MEDIA_ONLY", state: "media"}, - { name: "MEDIA_NOT", state: "media"}, - { name: "MEDIA_AND", state: "media"},*/ - { name: "RESOLUTION", state: "media"}, - - /* - * The following token names are not defined in any CSS specification but are used by the lexer. - */ - - //not a real token, but useful for stupid IE filters - { name: "IE_FUNCTION" }, - - //part of CSS3 grammar but not the Flex code - { name: "CHAR" }, - - //TODO: Needed? - //Not defined as tokens, but might as well be - { - name: "PIPE", - text: "|" - }, - { - name: "SLASH", - text: "/" - }, - { - name: "MINUS", - text: "-" - }, - { - name: "STAR", - text: "*" - }, - - { - name: "LBRACE", - text: "{" - }, - { - name: "RBRACE", - text: "}" - }, - { - name: "LBRACKET", - text: "[" - }, - { - name: "RBRACKET", - text: "]" - }, - { - name: "EQUALS", - text: "=" - }, - { - name: "COLON", - text: ":" - }, - { - name: "SEMICOLON", - text: ";" - }, - - { - name: "LPAREN", - text: "(" - }, - { - name: "RPAREN", - text: ")" - }, - { - name: "DOT", - text: "." - } -]; - -(function(){ - - var nameMap = [], - typeMap = {}; - - Tokens.UNKNOWN = -1; - Tokens.unshift({name:"EOF"}); - for (var i=0, len = Tokens.length; i < len; i++){ - nameMap.push(Tokens[i].name); - Tokens[Tokens[i].name] = i; - if (Tokens[i].text){ - if (Tokens[i].text instanceof Array){ - for (var j=0; j < Tokens[i].text.length; j++){ - typeMap[Tokens[i].text[j]] = i; - } - } else { - typeMap[Tokens[i].text] = i; - } - } - } - - Tokens.name = function(tt){ - return nameMap[tt]; - }; - - Tokens.type = function(c){ - return typeMap[c] || -1; - }; - -})(); - - - -/** - * Type to use when a validation error occurs. - * @class ValidationError - * @namespace parserlib.util - * @constructor - * @param {String} message The error message. - * @param {int} line The line at which the error occurred. - * @param {int} col The column at which the error occurred. - */ -function ValidationError(message, line, col){ - - /** - * The column at which the error occurred. - * @type int - * @property col - */ - this.col = col; - - /** - * The line at which the error occurred. - * @type int - * @property line - */ - this.line = line; - - /** - * The text representation of the unit. - * @type String - * @property text - */ - this.message = message; - -} - -//inherit from Error -ValidationError.prototype = new Error(); - -parserlib.css = { -Colors :Colors, -Combinator :Combinator, -Parser :Parser, -PropertyName :PropertyName, -PropertyValue :PropertyValue, -PropertyValuePart :PropertyValuePart, -MediaFeature :MediaFeature, -MediaQuery :MediaQuery, -Selector :Selector, -SelectorPart :SelectorPart, -SelectorSubPart :SelectorSubPart, -Specificity :Specificity, -TokenStream :TokenStream, -Tokens :Tokens, -ValidationError :ValidationError -}; -})(); - - - -/************************************************************************ - * src/impl/URL.js - ************************************************************************/ - -//@line 1 "src/impl/URL.js" -function URL(url) { - if (!url) return Object.create(URL.prototype); - // Can't use String.trim() since it defines whitespace differently than HTML - this.url = url.replace(/^[ \t\n\r\f]+|[ \t\n\r\f]+$/g, ""); - - // See http://tools.ietf.org/html/rfc3986#appendix-B - var match = URL.pattern.exec(this.url); - if (match) { - if (match[2]) this.scheme = match[2]; - if (match[4]) { - // XXX ignoring userinfo before the hostname - if (match[4].match(URL.portPattern)) { - var pos = S.lastIndexOf(match[4], ":"); - this.host = substring(match[4], 0, pos); - this.port = substring(match[4], pos+1); - } - else { - this.host = match[4]; - } - } - if (match[5]) this.path = match[5]; - if (match[6]) this.query = match[7]; - if (match[8]) this.fragment = match[9]; - } -} - -URL.pattern = /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/; -URL.portPattern = /:\d+$/ -URL.authorityPattern = /^[^:\/?#]+:\/\//; -URL.hierarchyPattern = /^[^:\/?#]+:\//; - -// Return a percentEncoded version of s. -// S should be a single-character string -// XXX: needs to do utf-8 encoding? -URL.percentEncode = function percentEncode(s) { - var c = charCodeAt(s, 0); - if (c < 256) return "%" + c.toString(16); - else throw Error("can't percent-encode codepoints > 255 yet"); -}; - -URL.prototype = { - constructor: URL, - - // XXX: not sure if this is the precise definition of absolute - isAbsolute: function() { return !!this.scheme; }, - isAuthorityBased: function() { - return URL.authorityPattern.test(this.url); - }, - isHierarchical: function() { - return URL.hierarchyPattern.test(this.url); - }, - - toString: function() { - var s = ""; - if (this.scheme !== undefined) s += this.scheme + ":"; - if (this.host !== undefined) s += "//" + this.host; - if (this.port !== undefined) s += ":" + this.port; - if (this.path !== undefined) s += this.path; - if (this.query !== undefined) s += "?" + this.query; - if (this.fragment !== undefined) s += "#" + this.fragment; - return s; - }, - - // See: http://tools.ietf.org/html/rfc3986#section-5.2 - resolve: function(relative) { - var base = this; // The base url we're resolving against - var r = new URL(relative); // The relative reference url to resolve - var t = new URL(); // The absolute target url we will return - - if (r.scheme !== undefined) { - t.scheme = r.scheme; - t.host = r.host; - t.port = r.port; - t.path = remove_dot_segments(r.path); - t.query = r.query; - } - else { - t.scheme = base.scheme; - if (r.host !== undefined) { - t.host = r.host; - t.port = r.port; - t.path = remove_dot_segments(r.path); - t.query = r.query; - } - else { - t.host = base.host; - t.port = base.port; - if (!r.path) { // undefined or empty - t.path = base.path; - if (r.query !== undefined) - t.query = r.query; - else - t.query = base.query; - } - else { - if (r.path.charAt(0) === "/") { - t.path = remove_dot_segments(r.path); - } - else { - t.path = merge(base.path, r.path); - t.path = remove_dot_segments(t.path); - } - t.query = r.query; - } - } - } - t.fragment = r.fragment; - - return t.toString(); - - - function merge(basepath, refpath) { - if (base.host !== undefined && !base.path) - return "/" + refpath; - - var lastslash = basepath.lastIndexOf("/"); - if (lastslash === -1) - return refpath; - else - return basepath.substring(0, lastslash+1) + refpath; - } - - function remove_dot_segments(path) { - if (!path) return path; // For "" or undefined - - var output = ""; - while(path.length > 0) { - if (path === "." || path === "..") { - path = ""; - break; - } - - var twochars = path.substring(0,2); - var threechars = path.substring(0,3); - var fourchars = path.substring(0,4); - if (threechars === "../") { - path = path.substring(3); - } - else if (twochars === "./") { - path = path.substring(2); - } - else if (threechars === "/./") { - path = "/" + path.substring(3); - } - else if (twochars === "/." && path.length === 2) { - path = "/"; - } - else if (fourchars === "/../" || - (threechars === "/.." && path.length === 3)) { - path = "/" + path.substring(4); - - output = output.replace(/\/?[^\/]*$/, ""); - } - else { - var segment = path.match(/(\/?([^\/]*))/)[0]; - output += segment; - path = path.substring(segment.length); - } - } - - - return output; - } - }, -}; - - - -/************************************************************************ - * src/impl/URLDecompositionAttributes.js - ************************************************************************/ - -//@line 1 "src/impl/URLDecompositionAttributes.js" -// This is an abstract superclass for Location, HTMLAnchorElement and -// other types that have the standard complement of "URL decomposition -// IDL attributes". -// Subclasses must define getInput() and setOutput() methods. -// The getter and setter methods parse and rebuild the URL on each -// invocation; there is no attempt to cache the value and be more efficient -function URLDecompositionAttributes() {} -URLDecompositionAttributes.prototype = { - constructor: URLDecompositionAttributes, - - get protocol() { - var url = new URL(this.getInput()); - if (url.isAbsolute()) return url.scheme + ":"; - else return ""; - }, - - get host() { - var url = new URL(this.getInput()); - if (url.isAbsolute() && url.isAuthorityBased()) - return url.host + (url.port ? (":" + url.port) : ""); - else - return ""; - }, - - get hostname() { - var url = new URL(this.getInput()); - if (url.isAbsolute() && url.isAuthorityBased()) - return url.host; - else - return ""; - }, - - get port() { - var url = new URL(this.getInput()); - if (url.isAbsolute() && url.isAuthorityBased() && url.port!==undefined) - return url.port; - else - return ""; - }, - - get pathname() { - var url = new URL(this.getInput()); - if (url.isAbsolute() && url.isHierarchical()) - return url.path; - else - return ""; - }, - - get search() { - var url = new URL(this.getInput()); - if (url.isAbsolute() && url.isHierarchical() && url.query!==undefined) - return "?" + url.query; - else - return ""; - }, - - get hash() { - var url = new URL(this.getInput()); - if (url.isAbsolute() && url.fragment != undefined) - return "#" + url.fragment; - else - return ""; - }, - - - set protocol(v) { - var output = this.getInput(); - var url = new URL(output); - if (url.isAbsolute()) { - v = v.replace(/:+$/, ""); - v = v.replace(/[^-+\.a-zA-z0-9]/g, URL.percentEncode); - if (v.length > 0) { - url.scheme = v; - output = url.toString(); - } - } - this.setOutput(output); - }, - - set host(v) { - var output = this.getInput(); - var url = new URL(output); - if (url.isAbsolute() && url.isAuthorityBased()) { - v = v.replace(/[^-+\._~!$&'()*,;:=a-zA-z0-9]/g, URL.percentEncode); - if (v.length > 0) { - url.host = v; - delete url.port; - output = url.toString(); - } - } - this.setOutput(output); - }, - - set hostname(v) { - var output = this.getInput(); - var url = new URL(output); - if (url.isAbsolute() && url.isAuthorityBased()) { - v = v.replace(/^\/+/, ""); - v = v.replace(/[^-+\._~!$&'()*,;:=a-zA-z0-9]/g, URL.percentEncode); - if (v.length > 0) { - url.host = v; - output = url.toString(); - } - } - this.setOutput(output); - }, - - set port(v) { - var output = this.getInput(); - var url = new URL(output); - if (url.isAbsolute() && url.isAuthorityBased()) { - v = v.replace(/[^0-9].*$/, ""); - v = v.replace(/^0+/, ""); - if (v.length === 0) v = "0"; - if (parseInt(v, 10) <= 65535) { - url.port = v; - output = url.toString(); - } - } - this.setOutput(output); - }, - - set pathname(v) { - var output = this.getInput(); - var url = new URL(output); - if (url.isAbsolute() && url.isHierarchical()) { - if (v.charAt(0) !== "/") - v = "/" + v; - v = v.replace(/[^-+\._~!$&'()*,;:=@\/a-zA-z0-9]/g, - URL.percentEncode); - url.path = v; - output = url.toString(); - } - this.setOutput(output); - }, - - set search(v) { - var output = this.getInput(); - var url = new URL(output); - if (url.isAbsolute() && url.isHierarchical()) { - if (v.charAt(0) !== "?") v = v.substring(1); - v = v.replace(/[^-+\._~!$&'()*,;:=@\/?a-zA-z0-9]/g, - URL.percentEncode); - url.query = v; - output = url.toString(); - } - this.setOutput(output); - }, - - set hash(v) { - var output = this.getInput(); - var url = new URL(output); - if (url.isAbsolute()) { - if (v.charAt(0) !== "#") v = v.substring(1); - v = v.replace(/[^-+\._~!$&'()*,;:=@\/?a-zA-z0-9]/g, - URL.percentEncode); - url.fragment = v; - output = url.toString(); - } - this.setOutput(output); - } -} - - - -/************************************************************************ - * src/impl/Location.js - ************************************************************************/ - -//@line 1 "src/impl/Location.js" -function Location(window, href) { - this._window = window; - this._href = href; -} - -Location.prototype = Object.create(URLDecompositionAttributes.prototype, { - _idlName: constant("Location"), - constructor: constant(Location), - // The concrete methods that the superclass needs - getInput: constant(function() { return this.href; }), - setOutput: constant(function(v) { this.href = v; }), - - // Special behavior when href is set - href: attribute( - function() { return this._href; }, - function(v) { this.assign(v) } - ), - - assign: constant(function(url) { - // Resolve the new url against the current one - // XXX: - // This is not actually correct. It should be resolved against - // the URL of the document of the script. For now, though, I only - // support a single window and there is only one base url. - // So this is good enough for now. - var current = new URL(this._href); - var newurl = current.resolve(url); - var self = this; // for the XHR callback below - - // Save the new url - this._href = newurl; - - // Start loading the new document! - // XXX - // This is just something hacked together. - // The real algorithm is: http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#navigate - var xhr = new XMLHttpRequest(); - - xhr.onload = function() { - var olddoc = self._window.document; - var parser = new HTMLParser(newurl); - var newdoc = unwrap(parser.document()); - newdoc.mutationHandler = olddoc.mutationHandler; - - // Get rid of any current content in the old doc - // XXX - // Should we have a special mutation event that means - // discard the entire document because we're loading a new one? - while(olddoc.hasChildNodes()) olddoc.removeChild(olddoc.firstChild); - - // Make the new document the current document in the window - self._window.document = newdoc; - newdoc.defaultView = self._window; - - // And parse the new file - parser.parse(xhr.responseText, true); - }; - - xhr.open("GET", newurl); - xhr.send(); - - }), - - replace: constant(function(url) { - // XXX - // Since we aren't tracking history yet, replace is the same as assign - this.assign(url); - }), - - reload: constant(function() { - // XXX: - // Actually, the spec is a lot more complicated than this - this.assign(this.href); - }), - - // XXX: Does WebIDL allow the wrapper class to have its own toString - // method? Or do I have to create a proxy just to fake out the string - // conversion? - // In FF, document.location.__proto__.hasOwnProperty("toString") is true - toString: constant(function() { - return this.href; - }), -}); - - - -/************************************************************************ - * src/impl/Window.js - ************************************************************************/ - -//@line 1 "src/impl/Window.js" -// This is a simple constructor for a simple Window implementation -// We'll set things up (in src/main.js for now) so that it unwraps -// to the global object -function Window() { - this.document = new impl.DOMImplementation().createHTMLDocument(""); - this.document._scripting_enabled = true; - this.document.defaultView = this; - this.location = new Location(this, "about:blank"); -} - -Window.prototype = O.create(impl.EventTarget.prototype, { - _idlName: constant("Window"), - - history: constant({ - back: nyi, - forward: nyi, - go: nyi, - _idlName: "History" - }), - - navigator: constant({ - appName: "dom.js", - appVersion: "0.1", - platform: "JavaScript!", - userAgent: "Servo", - _idlName: "Navigator" - }), - - // Self-referential properties - window: attribute(function() { return this; }), - self: attribute(function() { return this; }), - frames: attribute(function() { return this; }), - - // Self-referential properties for a top-level window - parent: attribute(function() { return this; }), - top: attribute(function() { return this; }), - - // We don't support any other windows for now - length: constant(0), // no frames - frameElement: constant(null), // not part of a frame - opener: constant(null), // not opened by another window - - // The onload event handler. - // XXX: need to support a bunch of other event types, too, - // and have them interoperate with document.body. - - onload: attribute( - function() { - return this._getEventHandler("load"); - }, - function(v) { - this._setEventHandler("load", v); - } - ), - - -}); - - - -/************************************************************************ - * src/main.js - ************************************************************************/ - -//@line 1 "src/main.js" -/* -// The document object is the entry point to the entire DOM -defineLazyProperty(global, "document", function() { - var doc = new impl.DOMImplementation().createHTMLDocument(""); - doc._scripting_enabled = true; - return wrap(doc); -}); -*/ - -// Create a window implementation object -var w = new Window(); // See src/impl/Window.js - -// Arrange to have it wrap to the global object -// And have the global object unwrap to w -w._idl = global; -wmset(idlToImplMap, global, w); - -// Now define window properties that do the right thing -// For other wrapper types this is automated by tools/idl2domjs -// but the window object is a special case. - -[ - "window", - "self", - "frames", - "parent", - "top", - "opener", - "document", - "history", - "navigator" -].forEach(function(property) { - Object.defineProperty(global, property, { - get: function() { - return wrap(unwrap(this)[property]); - }, - enumerable: false, - configurable: true, // XXX: check this - }); - }); - -Object.defineProperty(global, "location", { - get: function() { - return wrap(unwrap(this).location); - }, - set: function(v) { - unwrap(this).location.href = v; - }, - enumerable: false, - configurable: true, // XXX: check this -}); - - -Object.defineProperty(global, "onload", { - get: function() { - return unwrap(this).onload; - }, - set: function(v) { - unwrap(this).onload = toCallbackOrNull(v); - }, - enumerable: true, - configurable: true -}); - - -global.addEventListener = function addEventListener(type, listener, capture) { - unwrap(this).addEventListener( - String(type), - toCallbackOrNull(listener), - OptionalBoolean(capture)); -}; - -global.removeEventListener = function addEventListener(type, listener, capture){ - unwrap(this).removeEventListener( - String(type), - toCallbackOrNull(listener), - OptionalBoolean(capture)); -}; - -// XXX -// This is a completely broken implementation put here just to see if we -// can get jQuery animations to work -// -global.getComputedStyle = function getComputedStyle(elt) { - return elt.style; -};}(global)); -}(this)); diff --git a/node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/headless-tests.js b/node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/headless-tests.js deleted file mode 100644 index a18c806..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/headless-tests.js +++ /dev/null @@ -1,4 +0,0 @@ -load("dom.js"); -load("nwmatcher.js"); - -var tmp = NW.Dom.select("*", null, function(e) { print(e.nodeName); }); diff --git a/node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/js b/node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/js deleted file mode 100755 index 5131e4a26e1f7d26bd7c1d0afc04c4f8c504ee48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5500416 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 q8}lZ{ph(OwjN2 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
      Fw3VSE935OVO65*{fl6 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 >r@8h5J1&R? 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%0AbmuBglA4qP`SF@khZ=W<69Me$c=-oFV= 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�fdUZ`b-!wiZ}XUw&Iq~>{DmZR zS`{u4Ze4@~Er=$BCJ}(D0|^B<3R3GdYMO56CaLvLkR`P=Ab+s3aMPaTnZ9u6adfzx zNgM8u@O8@C-}7tOXy+?e?FqSe{h4R~+gR_;_jf&ca|3iVk2ls|RN<5S%g;zY9IAQ0 z?Ohz{I8PqNIBW*qRGEy^bUyLtHE&Gh{5-pY=d`h2b!w4LV>QI)ACErnHNLr%eZ z93xG=^~;N8hv84}Jj|$dzWnjt4|je!0BL+az?geG;G`OY*>S2U+I>Vi}OL`00SasN9nCax%^Y5eK3;48H@|>&D%=zPE+rGuBh3^7Y0}3P79F z5+i%pyve&@yqVVvvWMad92-2JGc!2m;#km|gKh67h))*4gx>bLJFBFoxuoq6i5FO> zteq8F{!~`+_^|wR-683;MxCZ!9^W<_)w7vFWpQ_==*sQJW^$#qnPj9{o9+hg`R+Z+ zYn(XeYnIBBWg2cPE zYT8z-pZU2uWKx*#POiz#0TX?Lj?v?gRQTOyUf{L!lGWp7R#_~&Ok$*|{zkr80tMEM zk`p_3$vm^rDDzhsWqy86nIB;__Az)nQ_Pb1?&PC>r)<)P6VXGjdV|)TXj^w8o?PSD ze{O;hT#$QRA0bHGYXoA(bw(Hk&`UGDVxUmR~tI4T0`3EU6@1lD)Cz4vt<4|>E@%_-{SB~9=F~HaE z6t~YNWPnFXrjOx=B^*Vj{zaGFKq@|ek4q}A3*TX%bWvp~d=|I{^1(C5p=#Pa^REG8 z_L9{4Z6rmSsh4VYB&Jf7XxC)6s4)%e5C z3ny2Qq`)6G!6V%kaoanBCOp7Wo?0~EaJ&fv2D2DO6f_}TN7b2Jr#s-M1sjOPk77aT ztrf&NswI9SXo|Y$Eq4D$SW8X+CBMGn2X5h)W%?0~j(M+40|AD!4NN$cTz^C#I2DXW z+>W1&FkqFq9Y`VNYpmenHGysiyg@e>(J?Ixn(+CmgR z#?t{uLt?-d5Nw#6t5~7Je%Z*Nsd66t*-cshl$$Q?$2_&H$N_t$J{Os6KqFs#Q&d zYHSH!UR!8k30WJ?cfkIe3XEm?XeN%urOCd=<;NuZPFsFOvafRamH2opzjo6z{iXi! zcegJ4Qf3cClI&{=cV@WBe%_3Cn4P@*E6Lw~#PVYZLi%N*)Py^~gwH6!W#S7mEs$JJ zzVwd^cTMLx+mP(5PLyQ6WePn3C4!qp>r*R!%5hiWRjYYQt@wetm$5aq;ycNHPP)EE z$v1yH**7}8`itDt_K?~hB}4YeMeAo-tkr4np~0Dayz58PG#xll&V1t_dq*jqTx&+O ze@4X+_RH~I;%K4ca7~*HJ7uScVDj?p(|6h?b4)1y>s%)vQ;pk3f~S%>>-^gPR?mv= z?S@@%+Gw`yieLQ(XDq>+6lM|C>>Lbtwd>8$-GkTk4B0(+X>Rx6yxi`=*}2_=zr~7V zqGAsL>HWLR*`h~rR$70!>vG`Bj+5nLAQnr7iqUkFsQ(*hDf3f@H z3+5Y_<1V#XKsRc~hSjUJX=A#3Yfku?o76S`_~wm?k~|N6*KFRXpln}e1lB?I+T}@l z&6Fo8@qzOV)dBUGRIIVbrzHChUrrntf)XiU5-mJ{xE`gQnFsh7?)o0TnIH3$>}v_H zxs9@to8L(GO$@JD$4j?!&C4a|qJ90lpth6SU;Y?f>||=2CYZQZ>uOynQmp}ZeyHpD z)FsUMo?|8fNiHHuRlxU&nT)5P4nC}6f(kX9j5v@D&Sl2R9Mowp$=s?rR^K_{uKnCN z@~5!7Qz|lM8>RK!@R=R6UGf}n-?RZS?&EMZ9^BP;Tba(mF1c7|BxQkkUyx!SiCEO- z94o?|U!am=(q$Gn-w}Cf#)P2o-J{al}Ds3=Dok>g5H~b)nj>}DcF}@J-0#BdrGn9F- zph&45V0em({7k;c5Glaq7cC~g2s*AHfyi&Mt_MLQ4#vXa!ZE_(ftd{XEdhHAE%|*B z?738A$#1Dp*LfghmDHEM<@>qDwm}j=Hp@abi|Seg5!Y5-4+_}=LDoE4kR6!GK&Ins zn=NFsfUGtT*?d7ZO_0&4PtNi>H3R0XTaWvV4b<%PbidAat24F29ObIODv{cGXJYr9 zp`yNFI*4t&DmWD?Vkp!g*fORxLs+tZw5Wd`RMf%)iuyKh0F$gUQh^XajpIaHoj2(5*EGLsSeNR41FC(ML@*>PGWORLzD}pfdXTI2Ksh>OxPT^VA zblpqR%x~@I^!pch>F>^`56WpiQ)UYkxGVG=)bn7X2MS-h^Se1ZKnuv>?A8r@avnrW ztZg|0bRR1m8ILMiJHHRX_`3_Ro#jQ|TTYXr;U+HdaExwa|3CKr1wP8^+T+G2WFP}X zo`?~GMj2$(pb>*oC4x0T0+EZLqN2rHs}vP2#TmgPYQiMK!{c~qwOU)Pr&?>zv9?u@ zc&jC%1k|=Ft<~BpYSkG>D`MqZ$@~57{X8?1KoD)u|NoxP=Y`MYx$Vo^Yp=cb+H0@9 zmR*Z-V>cyyyHX~GD}EeQ{4tfamq?jOUYm@YT*fc!SvcSiQk-V4qSL@d9hHRq2+w8A z95V$u|5MlBc^O+47)*HA|9qRd(<)b;z9%_?PESwxRk|Zv?=pq`5dEERRCk>uabNf} z_nw*0l5f3XxiiuxntEzd2aja9tAmj?stOijaMY!OjekmY)@G1{@-_a7{FG~NhNGQV zMy*R7L4z7mP+8hIXR9nztwKZkSujwEW&^Z4<=H?q_Egr>|BN^O4{ z8t`TesPTG_zHuQG;Sm%C;Rc%*v>2kJ6YQ)k|#jU3tA-_6hjRmw&3nS4NYv~ z*6bW+WfyDAsnen3tioC9V|HB5j%6aY`(_3ueU)q~>0vTaQohCCrAjMVd``P{G!%ci zr-H%co1bWLXXO!4(S{suyU*4sCA5!_T(tJBD z_XrN(px9}70ZhOxCuZo$&ze-z-A`!)g=3epX`rZcTDzM-U`}} z4z~mOXkZ0E-#G|siFp}gd$mC=*I<-(rSJF0?qKDIlLxIs})^*y%=%Y;x zY_NIF+}M=q%T0Io%YGjNgfS<_L&N7WSp7vvG5#}@3^2W01^La3ZV=YL^*`E9{^;s~E zzdhq)vVSw*;tK>);u8RhS7krQWv&V`$G<^>J_|~-AG1wz+U#U)pUY0PGOf>G4d-xI zw!O_h{{FD5hpCICCl>7C4=B%kkGDS9+5^Fjv2Ez(dg$vvT){)GLD%4GFbB@}nIv~U z1-x--FgVR_pZi?$ZL?|q$)+LCb%M}L6Jvd2dh3A9%y6AH&5!Sn_2G+3o92584l5F| zX>M+4>)0J~WyfeJjR!WnVP0V8UpW1+eNvVA^+rgN)O)KXzPRP<5qK?pm<{jQwQP9b zNZK3T1x@Fpe%Rd~%sTWYKc)XMqh8ksxsHd4{FUDVn9@>yYx(Kh{xI+p`L*zq1|X>C zA?}~y_eXy3`0vLeLRtN?yop9r7nKJ}Ey7D0W!A2>SJ{4Q`abh%x=C&I$%@@J#m&2L zLQ&pMqwQq-GwyPgjN7eB4zXoLSf1qx?7$yMWu84#0DS-3T>%)BsD6Y^tLRW-zRkt` zqjhH^`7cMI4}D~0)k=3eQ+VqvT z!`a>gaNkv(Ikn}FB71^Mw%VE=S&H3>6{YN!WZG*?NphViYl?b&bWPOhuga9Wa2 zF#$}jNQ35}#y^oS-Ip2(0chb!e|Ep6y!dRIQ|_AitPE=ftXEF@;;1?P8H)pSx{Wva;l%IeL>i6G38;JH5p(%+fwh0gTV{J|_nxFIp= zLv;p2GGGz8T4zZ!uTs-LNp9WSS#lxC zKu4W-(=Ge4iBq(-kI^FPWSZstFdl%dH*_ey!1M~z?ZM|%<0=m9J4>{CQT)X9AMOtoyyr^;zM}DW ze9CFd+IZ+*(RdeMA1rEm@;`w*l-TQ$bq=P|Rs{VKZ=73JuDV9wihQU@9!lT;3{bW& zy+a=|(o$QY%i>~cCF<%A5Or&-X6j;qSYB3%Equa*No`qq|>Fr~qeBiKM z6ymHW2wMAC$c!9gt99{_QWud&&au@^W;qjKYXBxYGrt-+0I)i(M)C^|+v@U62}w|W zl!<8g$8EWPi)Q#0Zh0e3Sk!*}!2ihGbpG~l`P+5=ZGe5hnfs7EecKIIXRy3Kom)pE z>s0E_4_`ARb0?rj%EdIA&J^as6wj@cH+89{FETNJu`#KoH-2dDYEn&O;Vq=7whKMk z4jJSGNJ;EN)jHD_%%$?oH)O{*%wCme?Q2 z12!~=r4OI?837}mR&B-xq@ywe*w4Ps!tS)(#ZD41)d6(V1$btd?ObxLDQdQJ>go;7 zEPi`Vj%L0MbM8`5rC=P8E9hJm#Bj-sC#k>E&Ubp-J9PQ*awU-UgrOm`RVhn|zJCf%L%I=8F-hO{qfars&>4-NI0hNPi4<~#(tkaG>~Sor{!Y9Y+fSU- zYpvCMF~g=eJAO(`FF?Ve^sCqUO>1?OY$VBY?ZdU$&idO~G8T}4Ow&Wq+hZ@Wy?v0N z_4%P+k3r$LgL+zC!Q-0W+e`i4wnfp~ZS*$3fNB>8*j!IhZbG+DxjQw#)2y(FkMxuW~?)p{g=}XgRIOyP?c5pf=s1jt#nF?j1pQ z4AAHN0U^?a(kBRthhi;ksu-=+_ z^Sd?aXI4Tph6;~R{hFT$UT}#P2qRtC@Tabw6e?6D2ejN5+ukf|Uc;E|VIpBocN-&! zzO!U`Jg3ZE_$A_0&QzRAkC=n*C1oy^cZwXA-0HWXE^`%gbhpZj&SYwO{aHY_D#No& zY1&26+$19x`eu^Z^bM>CKGy+9Pp9=xp$_CAMWm0opK^`icVEi2B5P6nQ2Ap63PZp7 z<7&vkB!YrUpW1HDKD^c!L^g0>adomSliX6eVDw{6`ynRY_3Zr0$I$=l?$Uz~q^XMh za(XDS@5YA1A~?;(@IVJ3W{zI^fth*UAua7NM3C`2ydFj7RaBrTF}*oP;Iz);sXL@` z(9vt~y-OQIOCK%33~Pk11hCh9-JYPTp)f-tw%R_%1hZqEHNouV7TaNv^BrhT0D99) zAJzQB!Ja+L&Fthc3f#HIJGuHv9Vj2Nq4%@y$t*2i?|u?y8y7^^Le0B6ph>Tb>-%UfuVjFEIwm*`CHudDsT*lBZm>wKP?KtdF*1L0kN| zz%qGyLXMzl*RkQmud`oqpD6}03Kyc z2eVIe>tog)LUgXVi&wZ@US1R|d>26r!&*ObT27|CWJd|%k&>VBcV%=Xe%pQ93*TC^ zk1=0q8AeL@^&=Fee+=o=wdM&j5f`1wRokj*XD@sF=sBp)FRIMzL3j#+P~epc_W@VP z#LT4-c@8FPP2$@b%}(3~T_?QI7EPD5?w?#z{!>eACcVRxE`E=$AhX}2uP6sl412v( zkE*uJ6d(e5Nc9Oqi>q?n?DCZDWB!KuTV1psXTKaRA$0Mc9o|j0g)^9z4O@)7PdTs_ zrVv=ui%VBBqJ$CEcz$A^5N^p^-bVr0`?Hn~%5E|Jl3Wp?221j=3AbuTUVi9VyTi+I zm(u)+{FJ~Omr{#eVh~6E9U}rB9;E>@kXpu;W|DjcM-K`%$!xIxTR28&^@Y!T+|fZ? z$!OCPCIKsfk4<0wkks0EU81s$SQ;!_jHJ2a3h!GaJp@<1+o$Ywt_mz@on8kZns*F23lqh?f6 zhOA|smj2u|*UDnnS=>t{(_N!JMv1nC26U+=3KG(jbJctwF0a`Udi0D78l2@3zQ|qg zjo?Cjnzq01`}lXsGwc(u^i^+!^YCSTo8R5c3vbGZGRDL#V~$%^?cFP0=iQ*C3FGKq zF8Y_6iC&Yk8)wP-;#k(SMvKyNBzMTpcanr9S~)<<=uBhIys~4?xYJW(CgVaQa}Zf_ z*f7W}wA6^wNoGY*!ABi0E)UqK0>BOkjkAC$i2=;d^e+PT#NT%X*z^Ff#!i6!=;}PihKA}a zU`k>D^E3U6fDPRxU{W2Lt{l|~uwDg##X@5(U`k>D^E3U6fGzt_7&AINU)zWa%)Hu6 zOXEPDg}Se^Dy!vWB{h77Q5rCts~N4I!)Cro5^=DGyScV!>UqqO6Yf3YMOg9|)zHfN zB17>-QLuBZIU``u6cU=+48@~`edEf21N|C~*j{oxLyWvEa066D%*~!();7sq5S3ZW z?UW+@!?c;wZ}082zR8QgDLF!v7C@X_fwMGbN|7>0tbt(%N+=VF!9UiJ1i;K){28$( z^WXLYBJ^~-y=W_ur|a!ysl7CtOZG~9AY9Hb0nd@(qklZk=J$1eXYo6O->Ljg;&%dg zhGj=CBw6+dUL4D>mfu$jX1Xgb*+*p@z;Azk`}lb-B2U2X)33I$mn4q~Ri0tShYK4p z11nKk0n_YHavJg3(xSH1^nWCuDy@BX{uc4GLDZ1hAJ+wb1h~GZ1uCdOU4pB_F*L`o zdM;IG-XstNEb~_GVVPyHOyhPBmT6x3;>isMVlHC&FNaa@GaCWK#3t{?Rw?kYN?uI~ z#6cpXxHR&|4SJC~EoG#f(|`F7vn0BljEb3r3sodF8mWKC4Z4M4o27|cDx7v+mbka$ zNY$)ek5&mkG*uD!5KcVKZEJqhgt_kB^k`T`#t-*pA;PFlK|AS=sWsa}5kNE|5^d`l z5jw!#^~-4BrD6KZK(E;!Dtr|MDSBwli>oqb;=L0oc1Gq=9(*LiWc;WGD{BmiKW5ESLxj^S}< zgz(tR(nPK$#lC`88o40(l<`()WdzeooWz(Xl({2&B;PIOV81u(=yG?v4k%bWY%7jW zOm5pNaaw?9wF6OU7MJv@%fat6pkxM5A^Ey0O$P`D90jeKsSf`;LVR`+6o zc$4`%48Ylz?EEFdm`Q5W)No7OY+a0N{?q)HjFWdjgJEBZF3mwjcf=B4Shxhk8dmA^77D|D z@e0J0!}O2e=`vpV~pOl~U<)>LR%;ztMb8vY;YhZ!gBmRO&- zfC{D`ThxTR)Yi)}yYso4_)sPar2YWyNpU_|=Jm#CO;V)GO^Dbd)%e^Zqk(K&S1spj zGqc@d2Zh^o)&Ydok`vY`sLN}(Ro>*nDkSIw^yH7G_$A$tlE3kjJ+-?&NOfAn!J%f- zIG=@p{Zhac3())fK2^ zMa|PB&UCkB44nqM*=AlVf1c0OPmw!Lx3+DWw^r5`N)(I22|My41DeImKQwgk}%oPFa; zV^wc#w73r2M~ zUSA$zk1MVqI{O+Lu?8itkS2Y_BIEyf6>!j-qm&OF-Co2V{@&e>bCU72h`W`bZ-BHEO;Cw-?LrW^Qq70D zMY+p$A3;Ktd%*Z;VlQS-Q&HYY(j1Hmh+lTX+hkSU-#fwt803hga-JF{Re5F|pGK_c zVn0Jb9%97ABX!>KWq62MU&}yBOafo!srugXohcV6qqtUaHRry$9?i29Aeude{s`A9 zuCjiubdg&&9=we%1J)kDDl*<~XBjJo0MNqm_a9-Mp=}uta2?c5lQ=S)$sEbE*|V^$ zVK(i^tix;>$u^vQzq9>M@`Gx_UuK$(^W3T0xqZw1ldv`t@=4G|3!bpB9WTXB5OblAldZ%&QA0~hU!a6+EtYWJ(sbK? zwy>oia3{1-Vq_5sR5F)P`W_-ckLbwAoWtXY?$9E8FxB(!R4Sqcjsz~>{N;APV557&A zITNdc0bhk}#%s;#fQKP*8t$~7qnj<077*=hkh25{CG<#DDB8ohYqgWC=PBDexrJod zYO4K-JuIS{j453Yi~40ZilJ_NswlqDDkRUE*m9Xp+o(u;~Y|OEj8MB!x5#WPovySb^WT~9f(sJq>Kd9-g;-;;| ziG%5tDDOjm|N6kXJLoqGm14g`*J&x^@%8Zn&=H|b2b75uchmR=-fK7qmB_gwp zt9m}$mg#u(5+$0U)0goCBhAPrW+eE4EnI~m;!55`m8AmET3(Bvtn#x{8SV81+JlhN z-^R=+8`0fF3Z$?ai&Ya<)VjmRLz50%!xfQT5Z1>=GdIC9Tu{_@7AAh118cfmyhc0! zR@(6arevE?BeAR47&U>53bjmjkC)SrsYLm1oB2hww3vc93BtM4ig#gc!WpeFbAL_{ ze{C-CnG+J)M)$BNoEC8>N8It@+G&ybB?+f?V))WNv}qO0;$BY&wlEjHDmsw!3uR_?VjW4~v~yv5M@PTs&ND*ZI~vFd1S0G*x`& zMZ$irm)XNuXnH}L9_e{Q2*nnj0D~)>OLmaA4p9#YPM=m-}P<7ohp)k6h@^K>GcJ0JRT-aY5J+y^Cp|u<~go~-fM`# z3Z4l7;Orc!b_Z9+8Ao^C>w?N8&{=V-2aQc%*Jdq>Pi8U>$cgtNCtcG0F5tcCyAeuZ z+_UBV%NZXL6T+(+diAj2A0QhDgK@Uu6a|j#OCOg+ZOBsud=s0vBh5`fI zCq^kLl$wUuu`W^3Dbr}a=*DX9>y(aby{;)QhG@x*(#UX`0_&L0ml^GRAsYGeiFnXn z!OQwo@(;{J+%@LR8>7~|u{v0oVv2$NqK5UOV_{|o`uPu}R`VIDR}M@;I7j zHW}T%q0pG3#8r-lgkCJ=ppgNoJ*jweSbHQXz5svOu!KsyxDspwU9ni|at?~a$ha1+yfSya~={>$_(-m0={S$$ml_Hs$jQw3h zz_Gl<0jl@sE<|Cb6rGUVIKH?paWE{^eZ`1W-Suc@qiuRrK%AB^ z&NF|1AJo=1Vukj*-yM#?JkM7_W!F_!v|GVg2UZEu$r_K(*PPHtvB zDCz88mccGpuOWi8)qx8+uMbm1TV~(dw##~@!tL4KHw?p*R&nvT2y1*C1XMrP;oxfS z#on)ibF@qf;*qHI8l&Exe%$*0-lR$bM(5;3zL~LsOiu>{i`W>1Nb}964?9+3TkeMV z-rmJ!QkKjF7!pSbP`_HPzXPE=ukW(*_Sdl1f=evK2V|*xLMiYh+qMEykNLee*7Ycg zH+YR@Ols!7)~kznk><-Iv^R2TPoA>H$rWXa_Qt8F3U5yq_5DYGcjQC+g$RJbqWzdq zqK8XpfO1V$cM3}&8sCnqsa0Y0aKFbp(!f;-E-h92zzu(lxMT^_!C$}>g+Er zwz9;!>6or^h)&@dIl?f=^!PQVKBGBgM1E00HE@BanLo3hKU&uf-l5V#iJC5c`f5H$ z=ne`#Q3c=P7rcr!cxUN%K;lyO^<}&8n`9#Qb?Y~&XK3lpoGlsmFrEA+#cT3Dld{zo zfsvB{E5}*>YqsGm(d5%p0wqu#-*blz{KcY{q3Qe267P?{u!}PuR{rxYh%|pDpYQG` ziCPq6T7OrkmaRR^P-B_5Y~2IqPIEAjboK@^>f&@q21&NVJFzsCD006YaW5>lK7t#o z+ukYd{abfVwO`MPa#UW<8gXkg zM3vlp5D|7aAB-fz6WcS@u)N8dvpcWl4iR#0JQIpE!uQXSaRo~emW7=Y4pYK8xr8lN zI8JZGOvjyIwuryYD;i*=7v=`E2-^0lNlmDrk>1#=R`o;IlYa zV(Ba!+nqH?uq4D(8Bg!HuMWU1?DR)x0i4kg{1HuW`}inr2&I^Z#gEPEUoZUCfA#>) zXI4Rwzw5HL_g!H6-syAwQ-#c*{=rc=fU%u(y#zmh3)|fLO)D!lPR;{QTqWh&)wN}^ zEpSk(@z3JnI3k4e9stNtefqoytklw<=gjGLg7EDle#volbB zC#HEeh$hD7Xk7^?>924e*aCqXu#Ag92gRck^VdK#SUXNCb8)$+L#N}S?tGCc${=Y? z?P4fS+cFFC&-3;C&HVGFdOj`xER|?xBF{VH&!w!KqN%fdA95Zd45Ku06tyX}jRV$Ryr2c06p*+Ty`QiblrX4+0&ef$OeemrJH zqHJk*q7iY>daf!d`XvhL70KY-veBnBe{ik9d?o(UjyW1<@L$x6U9=dY`mI{G2)=`)5CnvjCr$@Vs=_`@Vj%Ic*fDw}H zC!5-aqF>anf^koXRONo3a^3ds$ihOFx8vyOkr+hWB-sv$FVBkA zj963i8hs%{cH7fd;~h>-d`Yg=4+%v2_?e$GKpK)AQxgXV$(@!apbfGZ^O~{p5^C)}h!GWtNjtP5Ipjn!<D$XS?!9!O8a?8|Kjdux2e-T48v zZ<7Rjox!FUG9*$39l$XQ{gGjX4*Ntuf==%k>GZ}3aIST_vS%>a-J{FL>~&rHvOEaci8>5b>y$?X*?Af_AIX&WPDi zhxWo0${Q8I`VC?O>=v=nth`NAV#nCnt`&oi|_-fu(RPZ{3h79EZym{^Y*lEZz>3=1o)BzDbJW0#vNyt5ER@S05F><(9Z6SnliQ zYBkrarI~cW<1dtOT6M%bJE|V_ihb*ay5yEhB5GU_3nfZNbl`bzE~jn5ITTPO4eUV6 zyn;?w+cLcn1^Heh6to=HmD%=49I_*`jr+{@g+Ms!Ri3#HkbGJ?mD`NBl@ZjD`2{#i zZkwE}cTvrW@<{Yy>DS11v zo-W**3e3QeV;ZAv|4`O7ytG@qr7GM%7>x@TLplDOWZPM{gZ$Ay0On)?V{!zuQ;)=f zd4vT9RR`?AK9BKnq0NxY*%I>nE-0eJ?pSJo-)6_gce!Z5_Wv1q>Tqf^&e(!9 zO{$iuMl9$Nzwb^bQTn^nOtZGxEl*m(T*zNL%lM5^YAlk)l%U{mPjVXI5$_$s~z@#O%%m=U*9j>U0C${x3_Xj+?0lGnaPyq4=0grrVN)+ zo!2jf=ShB0mgZyVbgf&w5@-1f9;+Gn_JTu_Pi2!^OBNhmeC>^ALZXDM_u1t?N$(eY zB)3_TPfCv`y!Z3@+8Z)6a#>_a3; z9c4>#TK+?8&=U74w0BIz*kzrj-K%efG$EfFa_WCaSmUMBdISV$jggE`+XIx--@&nK zNsV3%y=q>;5DO5U)(&QlOa^lG-y>A$$ovo^mF>oSPrx~LdJ*B$wFU;Igl5o+RMSo0B{8#uhhRqajY`kLpilB@2~O`*lrQcrgx9O|QeI)u zGuUGFhGvglO4r&xg|67WV=D2 zfe2CIv?eLju8zFAa+;wEMI~mvW7s(sjy%`vJvBFSKSiTB2Z1prdT6LsL++}hwAnjf zYJl^Ig&UY9`@5hu$PA{24e1Ni31+eKu-Z!iRlE0D2Z3w9Q=!wf_gTfg_CB>AD!r@r zK1ExJ%QDSmG`q@+RKgp(+*dy2A&q*Af+n*-{74MoByt8^snU>_xRR<%-?~=x0$-|s zwe>aC=(K!KYklrGKcB-(DelHtx!#7sd){l$&L=l_8(|0%gQ4T}<9~+oHJOezmJBaZ zuq`n=*j|I9B0I>UvKml@!>I7f5W^s+Ro2*+Hgc^nMZSzJvtQ)rxQPfTiyi&pD$I;b zPze>kd2Y}$vqBi0YgqvJynHQRh>BUeyo%`NvyS%>O>+{5hrEFvC;2eDAL z&Y(9Rl{f?`Z=S94bCv?Lf>ns2p+a3)>WV6+-c0W{V6?38>mWQ+hSUe!Xh8}0syDzSR+6eALjY_NT{iuf zMX6IF*@M~MS3yDf$T>$PS8T35HIllF_=WhTJh)~>>eMi@eMM?o*tKG|~H{Y-R~G%&rmfzD~qo6t7DC0l~FH%oiJNFYfOy7wL7 z4-tLe)M6>o@D5cJ->03wJam{|$o5y<8=fYGvyFVwKktDT_qQIBLi;C~Gxa3S+aHYa<|5Wu z1Jn%p7`=w)b5&bI>7RVx8u}dwpGGh)+~LrACw<^pkYV;3i%F5XGH(@pke31^^whib zhT4ziNV;ZU#)C=in!oaNJIO+2XP`HJMlD9NxLsuJo8-oi+N~<~_uKakpvmZXldAmn zK3%J17M1ldwu*&LUlH3Yn$|>?8e8>cQ(^~L`TqbA6r(&LtV&m#XD9OiNQsBhUXuTJ z%w$+^wXqd%EVWxWHH1z9;Pja91x=Q^z)NX(r`!K(7RC8ZWm~PMXkI;*L3vGYMGB#B zdUI3cMGL#1@)1#{$6=a5^Ut*;cD+dKaZ%>lw=a6G)ccK66m0=&LjeyIwZ3-MY~?6g z@Qq}9Y3=XlZy*@#Sw2$FBQZ&BH>D?-9sJ6`bTw7quEWoj$@U0)Auox8)2Zq`PIt;qJx*{8c7wY(JHr}pnZ>RE9nm0FA z!43i6y^BN1D>=~C+q*cHB_?`xop&+D`NUhD5UFjj@m3qcqbDfd>V&e|hO+su5pT7j zbo2zpTm3!pRyli$ny$Un{R|N5IZyUmVn;G|IQIl9+>cThmtL05U=P}nTp3aP+P{vT z8>@7Zb-YQP8By)=teedo!83AiW#(-bzXk2L>)SE8^=%cvPcO8p?_b=iksRnxdzQ1G zf|wabCGFdNr_A@ZVr~AId+Mpy*coR#C#+6Q7t8!|6?#n0@?OOoXE{NHH=pLTnn`j( z>`^WIhnmT{J>+gmTy4zwd~%sr3gbN1S>7*o;y-66xAt1lAG4%h@zP}{^w`*jreTgo zjAb8hP+5)=UavRjSo-BYm-1DgBmULI)!JVe5mhTjtAG)yGi2*!7%qQZe!p2>VRO38xHFJ-o*KML2*8Q->Ljx ztAw$xsmvG8EbfEQ;U`n?KF8YxbyD@3&t?;ne$h-}Dx5=w*0p&7&nqm@-K1$_jK6Jy z^K_3Mi)X!?O%rgQZf>Y--VT*zFTyDi=X}8^bPDHB|M}ys(t4obivJ7=RYvORjnhGA zz1elYx#@%+MSeHdVGvzr@7;O+4XZ}x$Ri(J0)b|a6lwizZ}4S7A!eJo;kEkoV(^pR zih3q9hSVcgJbI0&nyH<-qF!+`u{^Cc+7+0FrLO2?8pg@F9ZkayBeM>Pjl?Syf<(&w z#aopUJ#;irwzYXz1~YKP1%9J$34aNd5cZofv)nyPr)$iNq^XqYS-T49?;Zn$X4QQI zBMwbxyJeo<@jKP)Qa$?5Xf6%9(7?jSdJ6aE#~zbi+t5?1vEQCvZBxny#`p#YjkF_T z2SGsP<^TiK{nHl%>J9_TBc_-M<{00E>damUd3k>5+e><1{Pl^A|hvTK%r73rJvnP!$AYeCw1>;!$7Rl0(-x?ClMk`;15JC zy_1ye9{E@}2@3_MMfw9A;Dr(&)t(Vfyl-0_xr(>htAoyfLUZQ;des81nYgC{rmws$ zGqQ-kY02T8U5t3A^>-8}Gtu+8b{hG{4Xh6U%r?(^zFvn{r`JhtRhChVl(Fq~S9_7# zEykYLn^x&Yn!Z{5n;gyt`NPekE;0CGh!9Mc8|ogC;L$_ck$BX=6=R5V|{X!V^3---Q418fihp9$k`1Dp%?9uL%QsY zqs1x!u$AMg9of=U3%@j-d)#*52S6Fy~>UG^|om4~+Sq<`)%zkZU)X--LgxF10IQWotF*{Brd1@z!A zS`0muyUgFmARQIbLxIeY=RiIO7d@QmW`4Z`MWmC@IPP%ax1AN= zGr8^TM9HHU@|f-U=tVki!8#0FxEXJ5QMFsjc~YrJ%*-M-uig<(dm(Py?daQh+xAXb z^E(o6`?4_Lc&{+yO)le{JIes~aKcr%r-j{VWd<`}CJ2-9@+A_m6Gs8I)I6M#FCGSR zGa*S!n=)G>2ai6MgLspMjvNEju7l-rK!~m6`UPx9kOIBROf3=%l#i0vt zY>vFZ5FyG$VzDn3=ZkZKXZyZj3Xo;Ui&Hwz;vpKn(rQ()h1DAk@8B^0k%pNYM%|}Y zN?isSMT`z3ueY)^tF}++S)Mxa9^5-zI^fCkX<%~88S!J1TV^F~L%q26LR` z$r|(Vu=svYjxl$m;(KN9NN)LBqU6chO4#$sIb6J1J*&khUKK6_KB0+8ixm2|t;WY@ z>*WB?h?vPGkblu$T07?){qLKne<-^J8K)EdFYxK#m};{lVa!}!hZefh|E>+~yQhC+ z<84T!MCTULJp{ob%l>wte-X;=(Z4Cy?@}jE|5R`z+TN}ebVvWW`U3jD-lzFkFcRLR zM|MsB(SpW(s=5p5-zcnqQO#SkO7BYlQA__^ME{iq^grB%$HHl~YGd)KVKAYzeS#60 z+b38FdO{T7LhTcbrm1~`6;>z2?8|Ch+!Lalo$$IM%g}$kfd08><`Vty8+Jd-9tgoh zH{4qKx3r%>fwfcG|4nDw|4oke_l5RsVQhdMU z))|SC$IsSexo2|g$=tIM!NmFaIb5*bans)1h*417!Um1yWA~|W@gyeA7Z0(!)IZ`~ zj<@yxt2a#!DyqEG%Dl6}9tW+funcl%hOtagH?wT{;?7`+$+a-%vBvcq_N?5t&Dgs< zHUIwP_OQFkS&ZpRN9Ghwkt;GMaBAR9@QbT)o&SG|UmU(uei5v}#k_*0=Knh9 zxJww_3Fq(-C9S}&S<`S1lzlsJjsRwH5bgC8N~Tkg<4?SwdEQA%K6=b>kS*dMI9Mxr z%;z9m;2@7#4)T~d2$~Gp*?WuZtbVd$>>A^jcNmEQ4@n)wTSEuG=WW}2WzFy?1aIUL zsVgCIZ)zZTk9NmL+>^sNYall#w@SaT;kxy|VfaYFG9}kMd~z%vOxv|@DXx+2<9?Fu zmFv0WqMqe_5+hwilxqsv^en4P+!NHGOzh1iJwSwPnzfnrM)nEVcr^1Nx4u7>Y6P!c z%PW6iZ}9W^&v3Q||F`(hNrIpodF7~sY2QxyPmlRse-_wJSf{wS{5#>#v-_ zp|5{f+y@A{(Lc-<8SIpw6m75Kkbo{C#}s+dCxJMyz*_v39| zo_e>e8C5Cr6zkjqdFr&VT*n^yugg0uKa-?)k2u>NUHD_f^2ZZ)!XFWf#2-tEE zp7IU_?!X_NeR#W5{p|n8ACp_8rR|RhMoljpJyx9IcC`MW6Ix%|jNUfITRRrsQMu*k-q zYoY)a+ckIsf3QdfDv597>uO?j^x~=ua6%Coz4$(i(Gs(eF^r0t10NM=E@Xcg)_&ol zyNzey;m97wx|aoOaM<_*!S=)@#$s2YHO-dKZ6*7Jvbm>gdGZhIMRizjcCh|WlQ(ph z(E>~?^>nJGYV?WW%f@(1j7it(h-+?A-zxX6m+1`#I$t^7HMiDhi*enM^WHMcDbF70 zqLaP2%*2T|s_@Jh<|wTdBI~)X^ow4%$req6O{(NJB$QjIBDw7pX9;Gz+#KO78Lv&T z@#`_CaFYMvo_4cgTjuYA*N66`Hj1#ef~W0G2b!_Ah7MzGpZoGxJ)0HvFSwIx7^-6u z&~7q`bW9vC^XY>IT65uLB*MI8f)3C&lx8YRD6)2vgUVVw|%POT}xDG9j9qu)%{?bzKqO#_8v(>@ZvU1eL@*+OHJ#=p9 zUx9gLtUv>3g{IuD_F3jh z7UKiUvllRiV;N&Pt(&t|jGZmkeUc0&46*w`@2i5lso+V{gxqJ1zy9^f4V#8MYiqMr zxVI?HSUaou=Ei0yrA}R++*-6?e;UKX_i12}~V1ujI)2I_`CfHIll?#1FQUyE&wt0a0{cFeqi@n zyncmC`ak#3{;j*xX+aX|baE5zzOjV9Nbmo=YFv+#yh)MTM(dHIF+6&b^{8(=&W)oh zti!xw7g_Hotx)jZ}Wb=L+hc3L>Rlk-Mplxl{?a$383JiqARlM%%1 zAxD*!zKGKlb|9_b5xSb;EXR}S|CkN#lgNPSozrqWH?-HF%BPnyV>xW&9YZ}f`flE3 zQgNwm^IeDx?V(Ab`xFboCgLWS?Mny2B+&NC%maWNfR)jXbncZ+{&0Jqy3%v6Jg3v~N%am8M7VH1Z6CZ=O1CSV zb_xZM^9eo$sv|N)S<~^O_X*8*hOxhyJ-`^e=FaEjI5o-YOQIkeAIDGF@er8W?CZ@X zJ~v$BTkoLGIK0z&oLze-H5p&$jO%qDqEAk4o)|xlL*`EFDjFb!U2=Os9Q&3s82k#I z)=45HD%}1z-Wt}J`5LcSKLo;$SuM1#pwy<{+{qY6?tG93Z^?Z;AR_J%k@RN120|Uv zjz-lqp>cAb0EC|?zwautsf$FM^a>Tn)Dp+|BHo)f0f zVDE&ecUmb9ftTIOgyXa>;T?WSriC)g^wl(K*F6>Zvm|)we+d+NJVzSdl#(bCay^o| zd>i2EJj`W`j4S2;jF48#jJ$hqQG7%o@X7{kCj#%!$6A4R4s`^XoR*8AXmN$j`#Y_B zfgfnmIQMReHGu;ncbdyhu@;`(7n|Pg zGdOft$cz-ciY`B0Zd& zSIWJ^aV@X8e|K6=p`F2ybJsep5@}`J>C&|BJfdcxXZQJ0?;kU8K!I)|CNC+>K>3VzfhegL7I!r4l@;&<0(wgUL*Wlu9C6D5=|S0#*()K0Jy z^Mvr|@pfYN=>oDhD`_m4FOA9pZ`V*aN?=LIOf29h6|)n|5u$!OeK<)yh-5Q^k+kKE zurJNZ{8eoem8gBTpPQObhF8SE7xA3&ncVJG1tcKCM9B*GT*Mbgfm^npxn~N=n7(%l4(16g=~1;EVw;?{>27`ZwF7)f!}0MopsD73zaF~8bb zj9Z3KTc$iUHk;f$*je%s$Xwd?B!8RMZXfb828mgrS5)!^CQi2?d#-PrlFgtz8W<}XmUz**WB6r+RPia0Z` zx$Ohg5Wg{{cMNHF*CW-;p@z8!>J?mY{aBvPV_rLl7n&W2ED<$&xQtsTFV%Ks>ZfJE{bv6t43lXRFU479?v0x2y z^!GASSkH8y$+Yu17z8VDTW0i$XXl3RC_8+|$Sa;1%(8)njJ_-tnxWj*y2gDjn8=;h z+adGJ2Wa9`Ew&w+wOAzF*#A>jN{Nh&HRX5a?#DSUGv;&iu@ zGH6z2yWgy(b}-R`e|NKD?wn{Q#;UVB{XrH_01{d1KZdXxGutud3BZMKsWDT5JhO&B z1<$+>t3~N+dYRz1rg@pRg3OtR3Lk!2@ZcA70@<^Ppsq}7L5j@6!iS3rAI>UxK!OEh zJ1)KsqvXt0+OW0_XjM&p{fD_cOlar}^DKcljY~z2NZK9;ebIYhbotswRXZ)fS zeNxw!d}rc5Ay!Hwy;G2a|D4=*{DQ%$@$jY|^G7DP?VA|X_I{c3@Jq?9CoI@Ix%HUD zRoVTL+a@IzWCtX-RVLcuSlGY1VjTW@cwr_duql(U(0EdgydIr zPL!as&hi(rk>7g!vPH2m3r@0551l0klcxBITmHtS<2?ac2CdRAj5juEk zx#}XS%8~o4J?MB*bMk4sX;ye1P4;HZA4sk=Z9eP4B9?Ox@hGl!pq8`^c=T(_R3zUV ze0*{X3%P!J`9$oOr13C(`HryTU3*q3dBt zmfoLZeM!m4MN6L|ze(z}oTay?C^SO7H?I2LGWaHCuo-!3#B)ZU7;!f^i#^^D8i#jb zlz{Gr`B&CnSV`!>t0STKU}yQHDlIY<^LlJE2mM%Qg`6cnN8q0APLjjB8a1XAVWKQF z?02lmQ~yy^yPY)GOr-9j7hO(5lpZKYLcL#5_q*e&MSPA1XVqx-vTVcWN5<*}lacCW zZPc4st0LH;Js{a6Z@$YL8(6v;U7uG%-ueBV)?y)RQh0PDw%?m1(7vn)n@fd5Gj8c- z3f9@tFba@L+M2%YpWBV{@D0*DO4F{!Nyr*LG;w&ov0BG{>O6%w*}+w=cS2=yRV8!V z2KUqW=qFo*%J(H>`ki;&=(8j9hbAK4>EY35hvyHHFNG7UhivGLbA`(*QFA{9jk;SB z&uct3R(eFK4z&X_Euih*4S&&{JoRdo+rv1vYE(N`=iOS(vu>@{C*R%f86Qfdje55! zCw)=rZo;+IpKvI(mlxhkGV*E4-zL{qA1C^$?Aj@Ng`JiOYI>ARhmzfQ!!(Hk@SqB* z)vSGsq|vqSC!a0iWmGd;Q9L4NR}GwnGp?)-T@;HBT@;I5w29h|^ukA~wolaogdvds ztD3~K^mldbj3dK|6`6H>vArjqL;6q1Q#G$;XBWJB+Po5*3`LYSHX4<9%LWK7dt^bf z+jGfY{noCt`-iFY!WsjR7%*qp_)c}kReQw^~#o@u^St8;wnUlmY48WDX|pXNNog;pCsAOz;w zL!3pN$7qW>2j=-v&$OnL?JQXBIJliV_DQRb)eyu55RY}oY7{z4h9No3b{ncPm-Ese z-SSjM18Y2)(_Qm7(NmM5s<}|r+}J4GGK});P8UxkZN_(r23Pc5sf|+~7Es*I9jRSo zC@#+7zcLwc><|X+*=S^+O{@((Y8{r`m26uW~XJf zP?2G*8zj7F#(Pcel&^yOAM>eblfnM5HsGxMH7`PI-4Hbp|cq4Y&TtmuZ1zgz4GC$cuYB2wY^Afqv0xv-@!1bYj`;Ebf%6ksTr#xhM#Qe zifbYH4pP)k85kgWAQ(F@RX;Giiuf@_{JB7zpfzqJGhXZqwq)=evv__LB+LYV8u_!7 z1C5uqRIa(2Qj;si?rYp)P;95&OovzxV}f!Pb?HT`9=cEPsy~=3xQ^j!YzpVkkl4ml z)^Z78WNslDWmmf`u^T|1=|QVlOW8MkSjq>Ubn#1@r_xAU*>kmCB4K>ZFV=_8X(?0b zwUq9@pDh954V%4zh-m=@L7#6f6Ga5wF%%c`zk{Zs-^@v5)T^3dKe&a?ORKa{Fo-9;lPo|mz z{M3LEX(>~?z>oGLg`e^qeny+Jy0+3WQ7|%c6XnWBW1Tx?WogIwaGmLDv@9Fzs+*ja zi}_Azbp zD)1?Zq9|6qcAfii;7?K$E(0*4>GzZ!Cfs~&@f!DK80~1_U;x61YU9NW!0i48L%5r2 zFYTBJ>?J;>WKRnCRHLc{^HY5O1br?bj$`YJWC%!P`dVcp4I z_i4fOIDay7kC__hkM*W@LUw@a%SL?;nj>{WIH)#jjOM3*2-3{vG0^6yH??f{rqUVP z-|NUeGW&+UjIRCpHSilpfj9cs&ims}@FmU9?vKMJeyj(yx_9f!KW^`}ce=gRzhxu+ z6>h=VA9Q&l_5zor-AydQK`h2l;Hvjewn`Zg<(mZbmI%^8>e|?yJi2(^-h$`t?~Ssb zKGa-J48Bb1u#dABSj8H_Gm|UAt!q-p{XBbKdJYxNjRG>)MO<`U z=wIXhb)J7UMt6wYO$@En%vk!~*9Vz~?=LvWuA;QrN0njdYo?I&G>Qh^M^%L6xS#g~ z6GpKpH{h11>KnIGg6SXBQkim#FjYf=E}qOc@f-bv_1wyZH=?4|{8CGdSzUcBMxb}5 z?NQ7lBZD1CSe`aWrSeE0@}XTH90~-uS)1HmM_dvEIM$CU4QC8}SQn;GY)3f7{j_;$ zRh&DRp=kSwDVwO>0!OPM&V>)G@j|0-P>`|2fzURa64mUksOao)d#&>eHMubUHy{0% zg#r7Fr)of1wF-0?`jj{ zC&)GLjIpd==&eS5${|II<@6XJai7^GTIQnE{|wpfmkh<^XXR*dJ{yoY!q#s?iIs^m zkjJSaqAJn@PD2fag{anbP1YxR_K@Uf`#7x^^Cqueo>C$&dyRCZvSE|+^PeiCbc?e{ z2(e8R6VrlW=nZzk@GS2McQSD)OvdY$X$n)*IvOk4A^!^%7WvDy#^_~3GT&4JUoxQy(=}f1<~)kVNh_o) zBsPML#8=%P8sS3(XNLrayNz^M9X%`$<8|E2`OO4mIznj+Y^NucJCKt$y?GW`RFyQPq0_zLVXq4(yrWdhIZ z9TJu|NlqhBJt&Apm6r&+Tf8eH?V;0AA-W4A?(f}sQlO*3kfMxWJ6~LZj;d1oVAB<> z2DC&0WuzN%pG&U9Pl!)y{X8))$nB3$!7L8gHSbZ{<3;3s5SR3-cOg1scK(cSN_F=MWU~=!AJD5KldEE!?(f!M5z#|3hYI)X zMv=vvHF%#*`QlUGq$oJS-$=Q%v4@MBl45^bZbpkihP0*8jGPJh{bTi)W7Iq{8F{D* z!N&NP?rb8CoE}PlhO>kb8&%a9NP((mkn=IL6>khJYkoEqdM@e`p?*hQ8XJ|X>SFSq zJ|@7AND2HLsABJ-SpRSgXk+*TUs8Ke1p{`EXv3uG!il5`$iwn?`$VsUaUc1-FzF<-&(b|ASY9To|+Os{D7$ zt|hQC^zv-eTbq~OWbSKTk`tn3-}``qamC&A<~rPO+hi%N#Ud`c_LD}3LSv-s5D7S~ z`-{i7hrQxubv>6h?CBLZ$!^41RyTBM!{PYE-k9k_ie(LlmlpA&Y3lGE@Y!nj!l(@? zHm;gMS1%#8&1LcSGX9v7E5ofTQgukdD?QWI8q9QgnBF(^X&6Vj8V}|S8n|jH97^xa z9;B#XDNpW%7%S{)VYJQe^stKuAly0KWQy>Xi3@5Ie^H;PH>FQZUdtD1x4=XmzN*wC z@Rp=H|OFXUR z;TCUja$Ar2S0&qR>;by4ll>!{_v?y3a9TKZHSq_M9pU&%UWr#{U1YhpA6>vRV?NL9 z)ISl!I&aQ=(vgzVg?V5QYsnEC-Sy2+i|v?sfPND@5I@kxW89*v^x4qX^b*|tEL|Do ze|0KLhSy}z5Q;wspGdkGOL+_vH*Ywl7sb&+AHno23ZqwOMMU$geH1;ID$9p2E6OFho zDo_hWc*ra!$$fcI-hU?(W_mMon7azAI(+N=fI+#jy(qp1)D!iZe5usyrJa)KkkwX* zNNzqkaU$!4BLws$fVQuFQ+>~f5=rZS+1%sPK3H$t_IEb$DRx@!rROPdPZhWYWmon< ze?AHhl^IE7C(Elt5*Hgt&6baMVpO3woF!LkP+6UR`Vff;X0H7WZ%JHF3{{LKhv_L0 ztmdfVCMxdE5HNeH?eFgTLO2_vDxu1#3so1tZKY+I_F{w_w10=t>i9itxr2^^=uAxd zdTdernDlH%xZjR-jIGLnY4G#vBL(=`HCfeQwnF&>B?jz<_!nQWbI~vRP0&`EYP$6h z4iAbmReDWxj$ow2UVSt(Vk7t$CjQ?$pLAqrdakA_m{z6t9g~thSFsnFM}$F-k{d>F zt&$HD_IuDQPDO4W#CD98>gI@k0~zxhB=nCeRvR8+`@_aJWY7gez{HHmuLx(A)Y!3M zU`2vq*`M1AyndY(!{Tum!)Uzp*C8E@54UB)aBG2?KI{S`Z1zts3?Gm<3J5#a4ega& zJ;m)6^htcouDgI}ceXWuENsoqfBOVaaM_WmiPpdCat-_myEvcX6Z0Mv;s;i=?YI2L z`0KUK_Dnl{|M4Ui3xz)lj}>}M|KN>4^n5}CU=ce%*5SKFT#4f8(oAfNLzwy|*u1qd zA4i8!B-$`0Yoa!uN$SjeSQPl%t{nYlO+@p-4^yKpeokNjg zIynQ(oRiqQB9BVV@e?!gOw^*4iN_SrV5!Jf_+{Tu*}2hh%3Ef|Rgv^9 zF>?IH9}jHVGo5rqtgaOFSd&jC3+#|v=qV(77%Zq%Y?&?LOlDG0szSZiBYbe9VQs7EkbK$O>glGH8>o|jN{exyyB=+$* zss$3$?(y4+RW z(LEFQZGfMHsD8KTzD9IkD&D&aWV)-ehZK_WaRC`$z^Nb~azBjG-id)M2o7}@M9r)P z#hPQk-O%dK-snQByVoCs)E~G1N#vR958C;X+G!%2xSJ1D99FkgvXWX+b|Ftj+4pna z;Hi(U%b{fV;x_Fm2j`Gp0t3s=Z625y@2=iMMY2sqwa^9{0fP`?Dx;j9#D@@WMIcWUjx}th2PF2lnmelp zxI_3c?%NYz&FHk;4P8d_cmRP59QAU*1ty5xC-gYBuw0Gd)(;cq?xz{%sZgi!go#>3 zC~}&xy6y zS+TpW8nHB_ok?~{nc*t3Wxjlfd6PG_YOJf6g61$m9Sk(MbB~Y+HIG$X6?XH6RiH7i z3<&#%U%;)a)to$k*fncX49^x9q$W3i)oE$srdtN|QQk9rVfg|7VY^Oxy#3TcD~z-61K;K*4AQgZKc)Q+SY5etprga0Zl+Ff>Z^)Dr(g^j*4Q9fk5&; z&)(X zn1x6s4}>Px>>^brHGTkzA)y)5ePXr`x8{VW`>OoW+%OK7XbwE&;ajrt^fe$seMar|Ix{UQjOHLiY59>@#_dyO<0gRWPTLN1=vLK63Sr zYHbq>JyDGX)FJ}6$YA~E#XZuVH2e*W7l9W9S#rj}sqg6UV@`}gByU{iFxiYw9z}J= z_nC)L_K!&klSP^Mrs9rXi;(&B_A8*ZA<1+Q=U6s+5et?v$)T|CJ$gys*j9N5TmVHT zLkfStsk}kaGk`Y41hmYRcmaz!0++g+HHfed!CWh|zk2)F=rzP4W5Wcb$2wyGE~X1w>rjdf;$&7=hDX0lP=m(hz>A5p2qhteS&DiA;ZKwE4Z9^d z&q;}9XkMDW*!ltkTEr*FMoyMzu7&(fony^0C-K^qTuKV@kE@#@Ps-F_^kxp#W&%Lf&?B9{}m zqzm^*6WFGS_Cy5;T!~NMB^P=G49*1PJQAp7f3Pm(G8ekEBlIYB{yf#46P)h6^_x_8 z9R0x2`;$6o&d%Ho4AR@fHD&T9=5OK6#w^+NY8;wTO<%=10Oe!t)IyK79AlI@etP@4 zTI|=zp|@9P@mCQ@UnH?StI$}SRfH~9WCid$BMb5o4wmp2JPW;$wiDs)4v;w8T3u67 z2=jzw9+~<-e2RN%5QknYTA|qVD6@-PlB+KME89J#kggZr!rfnWZ@&e@7mi9_=vsGL z4L}0Dy;Rw)5Pj45o1Qw$2NWt)n4oO?^`^<0sPOI!s+Z7;9KhZ~I-iTA{&Rch_e0jb#f5zE^{*O?I0)QOY7vqARb_W(h~kMY!q@+`3C@! z({C+S2|B8X$k8ESO-Dj|ASr-bqgf2lnt%!Y%IV5C@rX$9=$(}J63Q}nV2s$?)6&RQ zF#u}&0U`TJ?F+$<4~~t_6CKt9;Evv2h7%rWBwY`IQIA!ZMScxn&;tpWvTU7i4#0^1nBIUB~^2b+& ziR+~>aecBH?k{w^fhcr6~r zt5uF4DXRc4q;QRaDkmlq4KZ%yo8$3FoPbWNMb$0nGy0c>|5-keH0P$f!<=lDt-a2J zxvNyILpYmoMAf?7z?Y53k>5oUC_Rt-I%iev#zzOH8V*%eAUZI4f{cJgL7t3&lXcnr z^~2CuF`*DlTB7ogaF~>++=6~OsLX|W25*BNSzEavg8 zYQt7KQ1}9ujE85d;h#-&^XhECTq>r@z1TX$)fKp`0yYL>Y0#|U0w=vrLYrLTf*dj3 zZ%l`@KzAq8LtPUJ?At0`t|4^?kpx)r8Xj#Jdme3n1z~Fsezf>KY@rfsNR6$fcu#>m z>bJ2)f&1_iATV7g;{?&RaX3dLCd$JdE_t%(QJyTaWfZw!c4QPOP3-NB9#u&GIMEM6 zm}{NLdO<8ZenCR|pz02GRnn}m5(i{~PPnPf)_te^nNXgr`$%p?KBe}wL2_atAE4P1Q=6Z7_Qz}H z-Y_=4ixGtlVQvwdcgXb6c?U529X=XD7Pg?seiqu#68l+fKZEv@ib19?;}c_3j&Ow? zo`P-S`6zz|;^r_8&$(Rk+ID(q!9#qzLz?ShgL*CA_=g}-fk_ceFbaPNexyP!Q@Vyg z#!nG}(%RMMzuBLSHPjqp%lwdvrwGA6z(g)6ikjjtMSQofWN{(iDiv#jF$=jTaT_`{ zs*QA{2?=h0N?I8_;q$s&{p1#3cmF5fxXCxrR`(BvfTqm#D4@!cAXi4m{Lx*z=@)3P zD|+nuy^zRGmR44yr8u`{OG^X4;rv}Ipet?Ix_Dr}W!3$RPdd9MG{ypW(MHUNGyaTy zhPK*YgHyUXIK3V&0ywbMN{mt4DBa~dM?V3Vl<7^B#b4P(fqfnr1cy8^t(6P{H3nEC zRT#^NQ#HA81yV|Fm^-?}-kx+RFE%lxbG&!llJa1aL#?yY^GfFuSEP1Wj_J8+mJDK& zBzEF3+t+Q^VKXIa?+CTka&U97x3~uefiwr;c#`6EZ&g#eRq(ANKYy)n9r^V>{3`A5 zH|*@9t*4-^Y||tKkP%>WV3rvhP0v6dkHXYO)0Fk-+1`_Taigi1)~DMyv?u?NZK3M0?F3Fv-gu{JislLtw(up`slzj$6&d#S0HX zD;OPZd^ZO+=dVZelf_sKT#kcv?Mq)ZEBd;VJJaipO1(5Idb`-2%waRonIKx_!rN{X z8AKys2qdRCL|DD4KtR;Y1EmtX0I0qI$6Tu(Bc72?ZeIR7$}oIj5!%YP5rhpk@U+?T zT(eCYZ(O5{H!S_VPGi-dnP3JChvWf0k;K89=l!NP+bGMXM(PuOmIt0bfz4(lR2+_E zd$rgbh<+l7pApEq5lwLIdVdx;f06hE?556&(XTGjIy)hUD3z5 z=h~dS$eg>?*Zg)b=x-p1oS-+ihnM=ya@cPGh%<1=V-AnqoaY96nw#hwd{(d&rYSdEkGXm12@qW}n-O}G&j@fRj0v<735jv} zVtW31mU;5H!oCve`S2{qyEk=4WlazZ>1{awpjp`e!Nx3M?7j$ z^mhxf{ir-bd4ITs5CG zNa;f3f{4$-la6bpV^{Qt7O=9x1JC{pvpZ61NN587$}b`&B3Q$TC?GMi8RO85Nxm&I zzGa-}PO&w4E+{uDQahz5p;>b6iRM<1OLWOH)OQ-2BAw!5-^X=ayyPx)>1A7b;J>0@ z3#4Q)ANh%4%Z;B%lCS{C0&_YXw1pI7THZs^7qA6jB_sLf3W3nPQv`qq4TwvVhGkO^$z-0zh#c8@& zGaOWrt&`rGZvHu`Vubct^W#lR`fPILdRatCvPoHa<`Z5Qnjkly5}l^E&xKMaaw8(lvU2MblF+QW!?kFj_M>KP-8SL{AWds~ zd6pja%cE}Cd`egl2w+V=()tA!L7O;&qjhGCy@_9BDln!NZt9J2TQfW^Y(s$6#VMiy z%2V(l9Vs)2fKyO`oZ7MijLjWWtuB-?1-!CYH3&YsNd^D_b`Hm9pc~&sb)?-0wT2T^nB^ExMM<)pJp8*KgcKoz8dm_`|$5_co8&>jSd5~z76@&>Y66#%^XznI70GLzKM~kmQ$XJ?_%w{%Ma=Ec0 z2N#|$s?^73MLutv47B>#sPQ2`neCBKE0~E|C*3Dei_joyd5K!URE1FxL*Bfc7!~;! zRN+Gv-soM)-m+rZBILTU4LfcT>W?FJOTBe$9EKtq058e4eu`I+%5&HqXj1OLD+a6_ z5A4ljut+2`2MgnrZ`M^{@|r)%9i;MNYjk&_b+UBJuyj-tk}P*Oi|uV&+>tCJ%UIA$ zI+lDN3n6@BfjJn})acs8gAM80g*o(Xw4_{Mkhc65w&Xx#V>}5!5n0T%G>aLpSj>4L z^mU|LDv)F@6S=f?h|`~0poC%D|9P681ldC42`LsW04@0zX5LbObPDDjn>7W^>qb0& zid|1sGei;(?t1YG(btd)j1itJrYZ})i@nL?M!gRDZcOp&2fPvA1fx6$LeZyn9Y7`* z_9(}52SCb9sD&t<`=TW$$`-{JE9gCj{}t`ZT+Cj(l`Smp-`omR8T1{JzZbs$I|~9e5X>1G-9%(5vy@j4fwLcgky@? zFyNAB(4I4HEEJ#O+hF7YegY^5&AL`2-(`xnJ^3WF(%#;0{Z%yz3F!8sJF$_{Z4M_>BCkhW=V>~KNLxJkRL%kOHCrc)>I&~!veaC# zJ14meGhi%;8O6eH==|OaiRNdaB&Xv+vzFaM)oem07&t)0>%_8+l48vl81j#P4R<8p z8~%LryS;kN_hI7`&K$PE4Q4}hJoE+d&nRu;kEz{2lIDt>0SL`O*>es0(F&Sk-zC!R z0OgE1_~z|Ry#Nb-`4t#2vjM%tEj)KU1j|bNrshF6{eu2cS&F|FidV%8Bq?aGHw%@5 z*Uw|KKYtv&zGaj&BIQ|W$=9*qEPWpFAb-Sy6&#!eIBWKAoKGgTg$`0}HQZuCF0_bV zSM61vL#-3YH(ad~B+~L~AZQFP@ypdmKVxE!z@)k)C)uZU0#yST2+o!eyagYK^jY5k zAtu=$4Gi(yddf8Tns2!4ma;fsH62M77&rTpeHbur&cPxk1G3tYAxlIlmXIwp#arJ= zL6%G~4cS}ZctAq74}Nh)mA7`f$DL|1;tB*BJHZDd3$mDC+CHkTQXO%a=o?LqM>Gud z0?mL`ym|Y#bjN>0xv$&Y9*7R1r)q9rw&jDaQLiUYFsHZ$Oq?g=$^%*_&nj%*>+ic& zOez$g!#@0(vJCr4B|rJ)_+Ems-EL%Qja&5tQ){j?&r9kDJ=)3`s?ZOd5Um8oaL&Kf zAue&bpZiH%O;bZ*ObXgQthKl_Mk)`sm7fWx1|~lC%zDq0ScERt4@`@m=NK6N)+MsA zuXB-pAU|40slPnZ*O(O2rxbdPEZAmZgqp4Xb#J$WCc&%DJ>|VmbhTAv_jX4^P7ybt zh~%K2bqz;dw&kc__Plo18E(|{G3B?+{?8ZNE47Q7k^?gLyOxBEleETNqq_8i7uF2b z4-T%GftyA*p?#p3T|nsMzh~}`=?CXUp4SgvWG8qN3F_WO+99L1k+i#@f4>V4V@W9a zYu2wHJf-F&{b0aO{|M6K`1fr=S7b5L=q-t4t-kp+{orw01NSeb35@ZhyQsc*Zywdv z^^P$wq&1%V1inGG7#jJu-Zd#9+)JbW=`g%Ufcooo?%5)kmZhJI@GV*Dgj4_V^C zJlLm{hm85br`Z&o33^?N?O{)0Q5(Yd(`B7-kftvUx^RAOU-Cp_N=R=`ByMK0u9@d^$UAgj(j)fq+IQo-f%xmMrV*&c?t{waO>|e}OQ} zKwU55$?F7aAv~#s4~osuWPnhGE2zo1 zn>k><{X`G}ROjn<48<$j(}z%Scyn8FG*@UT{vr0E0pV8BDvvrBun{;qiPNZIIQ$SV zf=&5wK4lb@8{3opD(?a~54$6uiZe&#hoH^yF52a1YO{E-Q8*YzXup?M-~iR03rp-t!|TT<&S1@5zndeKu^D4c$-Kg^En|-B4(S2Alp0B)Cbh;xx)Kva)gvjd3LfZaWPo9Zrd?C@;9XH2&9Y(!0kq3sTU`V7KD~c zmssziB9S=qus8>;^6i6G+{JlSV*4)m=on;p2T=-F+6BTB!JJidp%0-7=C>!d5K5ewkZ z2!`4~ai?+7M~U8+bqDgBGg^Hq?>VXQ55E!#h8HW}IiH(e`pzjc7fatci@ z-cl2EfSjPkYJx^qq$g)i#^j{ah=A1F<~VxW98AqK0{w63abU2T5&}}#5Q*_8ha@+#GdVa+>s%zeKKbIU=TZZ^88km0tzsT z^BPjt|K+@{8=RikDg4dkU)ap{QM^TO6%Uhx^;udEf1c9A?*vz}_3-|X@sLcl7)!w& zVvAD7FYk{dg8ik7MG9An?vjatZ7Fs9&4`wh+sF+K-zi?na6sl2JaOsU^$tAnNHoBB6Mqv?1EF9LPR{9WI6Xq5cg>;e0-z6f|Z@Sq6)PbHMuh zns=>>VqGv7YwFr92NB||_RBSYw{^kf#t*uRwpl*`5P1H75>7vQjY$Q@l!e9*2r$s} zpixJnV^rLAXqu3b3K?3<UZ^z@_Kud)PRQOdnW7WiIO(ySlMaKUu3*WA!{=B=JyvPl)vxdJh^jUfp z%+-uyP49HqSZu#ImaR|rE!qZG!I7cp4)h@&eX|!PHe@28{+V zN{Qxad{FeK5WKql$sig(;xeyn(yBdj-LmVwUa+lQ-U@JRKdvH`(Rkd&F#S>tskcpsTRVn4AmwaP?-q zp?_#~0Lo8pWHmebeh8)n6 z;Y;v_Qs7PZpH9UFJMb+VVB`+qRa#cEpJOkI%!H=sL$ZVxKzxR&O&?<%&F%GOKm7gW zYb!5=;Kt?)=#nO*({gbqwmSAHV3o9`B3#(>#4G375Cq}aW4$A{wy0KcIqPqXN6>5} z8Y`BKbYWu+#VFLEAh~lrAr41r#Jg92nCEJ3*o_GOwKnWf0hdK`rjHFQ@tHC%*~^^l zHC!0XT340EDRK*%0$TV0(p|ITclf0c(dP-a6P8h!VcPiSr;G6RB*MV$-c{UkP0e#JHsBw|_%;_D2o)P=qJkVO{#wO{RUcm#IN{WJl4(Xm*!$ zz2n!nxrGMY#R+z99%%T@#T@J^cPK)>TmU-rP0@pY8h!j3y7pf~AM-NkBh}oXkHYg6 zy6D{Ziuw2V)5DTk4n3qg`Dpa;k-HQk^ClD%<2KFWm%t}$e?`KfIsp#T2 zP`}+XGO6F+K>gD6q^G>|zx@8cp5M=(?%?+~@%!!O|3H3!5jy=182|p%OpO13!0$gW z{-gZfKvVu1{C*c&^qvs3U7^sd(HDz709C+!D{Ic+EbN1O?&z|{j zwCjU9?o$M-j_11O0aRMllpG1USgt89z^CL;GyiEk)%EIFsy&Ft3n--`$3O!lZu38i zMRJqUHf^CWp1Hmlh5|)14CJ>(UQ6!iDKE3ZFn5C%!rfkV+Gw^zwiB{__7v^ut*V{2 zXfJm@gH^||ogEWMk2BWhW+8=SdG_Om21!$kvG;eXG0WThfk$lap+7f*PFe1 z>mk^$PV$ON{g1hmkMvv~T_x)Qh5ixRnf$k&?T6lo`)6a=1HB7&z*!Jw)4K{^-93Zm zah=pW9+s;au0pW_#|qcS*2iCZl8^QLd4fM`6G(gp#f8@_&J#PJ+zYo$w{D?uMV>dZ zRBTn!sy~!k03ogDfNt7{<-1?4-bFt5)H3#eURC=I)JH-wA6_2d{?7>NBe%=_A9xPm zF9wY$48gsdchMWzISUxMf%r?&XQ_+)%oyY}83J>UHpA;1_R=nH{(yUF@|)~RH~oy* z?BtJk$=*h$>aFc!M;O?P4Y$3{S8TlXC>?sML2aAeI8XIX=csLBM>1+w#W zegJ0QJy2&R28FOcoi4su75|uBe3o6j{)`t!u|hW4x(w@*9`oftqVJkt?$G;hlz&(LPn3Vr z>2Kfw?~lpk0GaY{=K8K2B z=zq?7LPv`*>HqWehvUosYt|Fj;*j}&fBm6jk^}V+r68~HVW%tz%HCQ|lO8;B)WfeH zQc7qo5309(J}Pl)mkC2Et}uvaYk8S^D^ZVP^`Ji5wT1l9>W5He?e@Dn;!U^ZDt#*5)w*k--1mpys@flZD{_`(7%BZWPM(u5Ro|Ki@4bHP zIk$%2s?IjyUPyyO+a;fdJEH$?Oe*7^^A5DcuB^~uya)a6*7!?e%WcOAG#C0?qaU)N zzAgT62kPsHe6L4+i?AslDTD#1IWy?+z%Q1A2TpXEGyP7?yNJOiRN{3!QI^>4$a7*# zxC8Bj&pK9w_PrH-Shg=x+_P=ABl7O`XZRyu!CEI}$P=@UE>Fy6TbvChr#+zWJ_;=Q zZMm-KFi19XcK}ARwIKG1pWlLR$SV4@PV$}r00MVtu^xcjpDX6&i&-!T4e8JLuy?2Q z-yivLJ3%gzU5rKIO&^n`4 z_I`RYn^nmpXd%egm%}kMgysTtCH7ac@1ie4J^F_JxnAg9{Xcp6K2 zec*O2_6NQUF>dgRH=93!&0AduP2j8Yv6DmZvr`1HW8&y9BLl3A))9#(9{5`qu1Uc_n6-Z`R#p=Z+{~dL*}alS>H!GY zQe(@rI{;9>EAdXL0|0u8Adpc#0Wj`d7g2^yQ@sVXT-paFxZCQIry@-utX1o_J)Y-M zcR$bL9n|=TqafN?6(L12vh(aqg}DI3nIFO}9_7Xz5@{02r}uT~A9)G-$Sr`v9GpiO z;f@xWliYHk0!Z(Wox~Wl5$P^qI+V@U-8kGe379em=>-twP>mEjMgc*Fu>G+4YXyZ& z@q^p*Rt=d9?3fn)qQzT;>5Gj45C^h?nrbssR1pYyHA zSjcVg*aW~4CQIljCu?zT<&>I%gq);S9ibCzgx*AXm&*<%q z)I1SH{0L;qpia5472@t94J&gT>O||Up!B&8r_r?6f@xWJZg0|~vlKnb@Rtsf4q}u` zVq`Z0Czm&KNez$b!0+eL1D{#@7uenC9d4xp;B{>%v?y{3s1D7t`q@TT<8zW(wt>}n z-xM+4r`kNt;Wzrh-c>`fr&{+87Id!gj+$JQ?iU$0lgAA}-=R%;K1v?sY-!r`1~w~5 zPuKW79b1CYCe(>kUd+=X0Y3UN{HV!o<8j8Ne&g1BV`k78SbAZox=_5_{GL~MN48ds z^a7Bu+#l(~DOxzZd_B_7tQhGtTqEX#0gH-}{_$d;hGB#F=J%|RiPAUxG z0g1l^#J?EsYC$FBBnM(j)z`gjHjEQw2P66|xvt1UG@%T#jj^<(`GelQZt;)$*p`R9 zzY*JI0Z_Y02mwC@`6~(mmHHM2Fkoc6efWoU-87#Ym)7zZ7U72XH%7V7C@+DlTX*Zk z(nYydk3tpYvDI4&CQ{r;&!?XJnWigOqZCw~pPm4j#*C6p^HSJcV_}(XXKYsVXAi;s zVD*Nna36d88jZL2OVjQAa7BNwI>GNuhun* zz^^H!;%v2faUr0}3kD02Du^V7yzka6d3KIjTY+&W&*q5J5C+D_5=v8e;5(#j8uE=P z>LR}R0XpfL6)2sRA3YJM-D=}c;z}P~o037@M1C+jkRxqe z#EcvtVnTTGF7$F)LBj~s$dg7q$lO3N+Lr8KtSlPme7G3ti-^6~*niTyn3D515(x<+V%!WML zNquV6HNr92O}8exh2-CY=^Rw|rIUQoJW%8m`uz|CE^T_wz*l3yq8)zmA}}uxJ+A;2 zE(h%@6C*{%K(AOZkR_Bum)(P!R;2BtFm*^DBlAG_IBP;M=ddXj`M^ZLMPC6z_w7-y zKTWi9)*~3Q#HtfKF2h>@u`4snG0gI8&V{iIYa) ztOH0?-MKTcO^bD)sb;yfG3B1d?7*m|Clf$nuD8Qm ztIszs$~6`rUkD$v<2#;t-PMeS`hOWp6D8|j%sRi|e*I{Yf$DEy7PyY}RL=6MaZt??`E5NW^^Ui|4 zpmIDd>#N;#9>T831f#Knk#|nv@4(VEGw`e~NZ_06yW-X654`42Oa2w|bp9AoF~-|k zF@}f;>Nv*Fra@Rh=NLoBL*V_j45A9y=gF0slo}lR069h3XI|oxjBC{%d(R8@nZ>lv z+{jhPX#C?UkK;&@aVQitNg4_AyA2eAHF4Tv3b|VBW4uU+!Yp$pE`pPk3^q|>A`aba ztGUWrghMVBdV4|t(a zivB_*JQgCMI1dvh2eWCQTQ&>#61iW4y_MeN5ATS+hBZxM@3p{Tl$X55ZdLT!qqnGL zT1IPf(HdacIcUXjn3{>rHvYl%eE_@}iECMZFHTx$grH&4oBtMlSM(7zKGr5rNB47x zWM=ynzDoV`SK-+!6P^!d!jl^-M{RvCt)UGW)(7w-kvVZb`tQK=b;P14la2__q3B6D z$kD)Yq)DVuQ%H@b^2dR0fY1%VTR5QmXF_-7H8yl_cA&fL=85f0sS`tx!&<_dhu0Vb7lP{{ee;M>J4uIz4}mtpAhu!Ti6YpC45I&!V4E z^!FR+=RXPmMuV3A_rgDCBgB4kenROGFmLOG$EGfy)-Vb3jFb^B#-cCRc85|tkhzCkOraawKzi?xiqpq$MGDkvC6Brtkyfh zZ$8Gm@u$ZgV{zNN-dDvf(c)(#eq)|2YMBQuN22H;Xu)l}<%cRGOuCF47uS$$VF6vEj(4cV4B%FJuAwxd>f`EXd6Y=c=GL zqQ$4OApG-_Z=n_&iLh0SAFc6tean4%M~>ET3SKu+!ZPmr$#v|^^Ih+58p6uY@v4L! zH)stPpzci+sPvAjwb+UHqIY~xi}NzxO+hBkMpUKo9q%Rxxu~w=N-g%K>`@1x*epLD zzX`?j+f`cZb@iu{Mdlby_D%Vb<9pjm;qjo7vz5Ii?%vD5KxQM;sfR%@}VBv1jX#=%N-ck7x1=;BCfTM&@rk! zm~Lo&k%AS<{~hylL(!t!9K930xEE1sMgW#wGUc)?B&}sqyt=HnS)ZJ`H*0Y^mL*6r z%9k>y8ng?Tn7RtQqnEKT-mNkC;ef~K+CUY6M$-0)1)z!(8Lws#v3gV+b1xR3YOw=I zWOd4vooLqIRGuu9Wg)onI8_sdJVrMQ)?eiJbJ5l3_<00ACp9%*wA>?&ypb`Rs&zB+DtH~-z zd@Mt7BRBonF-$HhlC0D4vuP+IlQT9I@G)@{wv}ATG4_C=wDl@WHi|f)f<82Xjwe+? z@plp2NG+1Z^LU#mGh#Jn+!sEu??jh*hkV%buC}gJYdk%CSc^Y`R1@^go>|eP*lMlC z8_)wILb-oqfBaZ8dAEi{#Fg^vvaIW(w`@E~g+13tzL&fXpRbC3A5Db|kj_Z-TsG+X z=)8@mGk<@TKN6jU=p)Zs@f-(==lma!I49imIn@4E zfG3IcLi}HbvYGBW478K}Haq+?JgFZbyQ8jZVDpDwISb?AXbknYWf-L ze+n9Qd;U4eQR2(yeObo6f5f}CuB^2AgDn01v3)y@^}m-f#pf()%QDu#_%xC)ILBN2 zt|#_-q!Rlt=GGSskf<-R3qHnJf4^ODiF1DMA1psh-`t7fW3Na5Rr<)`(mZp0 zb7Xr1sjqjmjpQl+6rE=4q%u`>iF$C%QBk>i%utUh>M>V6xP^-(3)Ex2dR(m@m#fEO z^;oDL5%suHJ(jD-Qu&bPdMdPv5BxzjLX$&Le+OP#>+h10i00;kTh#wZ#@_41B4#bZ z_*!oIrzm&kqW&R9P0kVZ4*INH472sZKv3O)X-qdk@QU8?u-eiAot$zlg zApU8rQNIeTfdP0&^4GrYUbXrTL^LP*huo{`O$5awcgYl7h*$JMBl(8CMX~x`gs^Ip zDuX}0_(2!8f{m4jd@^#J`E$0%!0iRJPPidgdTl8)#u|6KAge%kpNm}+nk$#fJyz-> zUxXHqDvE&chq`vO*3%yj|61#5H?BhTvY|rqf@TC;>!oH|h61Utp;RcC3UNO3ueH7) z6)H}J$kxq4HE{Mk+KV6`Gq0%}Iqw*HwA*Q=zLfq|AO|?Eor6Z@i6t_}ZxM?e zzgLgHs>j{xagTaDsveK2M*~pG%^5N&2W|!&?qwK26%j!yRS-crCpKQXSxIGLlJ4w7_+33GnZ;l6 zJiOkoLVh^QcPJ8qBvJfBaIFl;;C<=fL+Rjy>0pXV#X=-o{6h((QT#*DAzlbJ$v7EH z!o@$tINiM#6qNGF7r>aq4cJG60ngjM&VoSSOkqYhfH>mYDD5P$E)$iPOg%* z_&(%TX&BvvXya)Kqo&B|kGb1$-5Z2rl+X>FO^Cn_CQEfofyo#t2UT6+T8<(UElcD^ zo(#V>&)LX(2pPqgR%hGJig^3|h2JwobHq#lLpQKBBje6)b? z*+^n{j*j;@LvBC^p9=jIX<(z&8>gIcFRdBFE3T|Jm-ok6h#+pV{|FIcUdS*XW&o}} zOim%(c+N}jXZf3xKK)%c5K;f!z3S33!z9Fv`_v5z@JR%$#uN*fI9dVaF#dDROL==N zJ+M@v^-cy=z89%8ll&pB%Fa|9<&CehC<8^=pM zVD7TqXU-kB3dPceVgYI@G~y4k&B<{4l2ULI?h_Z7bEkQfz4fbF<3*k3Z+E{1CCOn= zRi1t@JCds(>>ts>t=0X^i{Kfv%$(}3dd1M$ClpA#ttohxjlhKlJL##r9OZMzwjzip zRTM*EIR(Q3BrG9}`vsKc6bUjqTMj^-Ez5w@Tv@*iRh~IhyuU z&9t9tM}6h6#i;;H_o9+0UG%bSl4F$WO8k1Tsv~IEp$xLhBE2hH5mV0mPILbJIj`Xj z5c~Hdt6|8FIXi!#f=}N1H~3`9VS=4Z0AP*)&~_dq_=fLv!|h|Pdt0wr0WnKjg}`QK zN_Z|CIG@djcmS<_2(EJP4k}SWx(>%qGm*G!C#Y`FNxzD@kXkd2mDTX@64Suu@f-*+ z&B;Lq9bCyatM=|WKM(t=c6*U_)$@r2%2@T9wr+FXGk-=2)0g=#6=w{DXZl!@|lJYKrfKaxx4qDjCG03UugJCKw)sfWRitmfk?f@ z`%e-2B`MV9Nfrfv6LK~Hqulb!@OLr|!eHa>$;G=!GrtClHRazY*K45Sm*-vGl^dgD$qUeo(+_g2yr z*QwIvuRzGcl7lnp*LYCh06ljfaz+CEp zwyvZ0sW7EXNHyZK=tX)*X{1K)$R@qkV*SyQ(lxTZr}u2{qFSfD2gr70OL0pNN;192 zxVLICT;kkSDGIDB`P2_*Yq4J^WJJ{KTB#1~9=XyxJYp(P*u);$knZaYG?XaUU9DFu^(4LAF^x*jKxA z9e5bb08l&^OF4$P?@_QkSPk`{7h2kjg>N3~WxGI&>o%5bjdTL1 zB4Dn9i9{Ejx#qa4XL7-tUDw?7Dte9G{8PFxR{dT7F2{@J^l)xoF%2x)!>X*O?T%P) zIDx+)AU_dqdV7C{wV1$*Ips_JfQM*Rb*njLZ{2~tsH3V1)d%He9}-LI4s=3CU$sE` zYLso&k#)lu{ETV>q`t3JY)+odLRnDq8YW3zC5I;N;HNhlow$mvE5>zU8Q?CXR0b~uC z7&~K)6dcIM-~lhOvz=0rFL7%W(nAaG;B1Rrhl%dPYz^Xr^bPs;L0ECYw&?rQ;e>p) zZ2to&E*RcfeQc#3&c;c}Ca;j>0$GAa1BE-$a4&0RG4j2u;SR+kdu^1b<;-XLB<<4)2hF=KG9@q4ylxV7^D z-n>SmtT{3`M?~N+a|WJ-g?}&}`EAd5wAfpiqOB5q$YvM+gbTE51Am5YZvHTPBN6?{ zTksQmNt^g42Bp|sBZ)KQtf9>t%kf2v&jNA+)l2vWOUgkR{TV0jY(gwxTVgamh>)>H z(%1c({!6@><2?$3*bfqiC0QM<$m%{V&fb)wMlDta+}1nFfD0vBjC&4x2Np}*#4sm( zxp5rQ0kHFujf zMvG0BBsgG=#nYafPa@bQc36w?z@ATbLZ6NIt;FkEwdWc zbfOxvF}s>CL`&7R)_N8MfWT3BB8hEcpxW`_m#a^$g#WZ`k%$g~1Ar7Y<#fYDi;Op? zbgIhOqT~`?@&dCFB(mm{1XfirclU8}ve9Tt2+j>beOoKEz-Z>H(DI?eC~%AYRz1=k zX;j2+H7*#-%fz$l#2!dk5&b7;fv^@En{NCaHzK@!n)hajr2g*MzFTB`!(tU5Sk#nd zY`WvO*p8^^<9#RyuWF>nD8tgx2uNisY8HXo7aO(nk>hr6LGn^_T&DsEphb8_&n|6P zi^PQ3%@ShGhZH!E46$iqjqGv-x|}1sxS<@`t+m+L4v{Sv#hTa(T;c~PvOlBR^jrL{ z=t&~u=u599YARliTxej4Q3QFo*932*7lg}6j1fgWXGbo|LxqK|H2z|;gv^C09L8jM zzV<0i;qdk5gk1nF%maUg_5n$8HTZohbeZipeK!G3?|Q3kK)VTOn8l9m+icX^K=u*H zs}+#l-iLCc-$7X`YS>7?b%BIyAQ|R-&|-tt%;>Mh52LE^%bMO>#$aA(@q>s;Gv#Nk z5Ahz#BAve)U86pfjf^)S8gMIULtmjqTMYWhf1)Uj`(8A| zqH5cwh?VQRx-7~GtR!+7e)~tKLgKhkN*uHGXT7Qo!b*-$PkXK5CK9_02}DR)KuI5p z$;?Iy^Dadw4uXIdk$`6Aki=BwFt6!U)!bG3`?YAy-;26xvRAIpCg>Wsisza?#GOVM z#V6J9=MHXuCriAbzc;q;%f=7Y@aLYs=%p;>_jMOunB;*c+ZPnyqxNzUb5D!SqRFO(A$^Q zjKsCwH4(jin0Nzv_#)oNe3};L-Vzv3p;aTX3Uv82vE3qrA_~UeMj0Du@6p!q1N?fm z_=||KF2RpvCKD-A+>b9rD;%nf)4(@9b6Tu8-Zxyq$oA1%>=fj~o$Xp&uw0T~>llR6 z2q?BMnP)u%(ZZaVCVpTQDZ+QFBz(^vQfPH#!l$su89~bg!eX)gd&$Wf$?1U$h2`wE zkW#hcWS?2HP_N!TQj_)|?ARW_#Jt!e?pKW0P014TI3-!esxad@!L%4HBsj^mIQN5K z_p2+`TMBBz%Sh6E_IZnn+@4|?r}Ec|W$&TQ5X%a+*c~jYmqysV!io~4BI6}1P232f+ zs#q?*W=bBCSFXyiKEyDQG^ZruZ;;&}5hqBjjw-vgAcZ|G?AdZVk?uG&#E!N)5s{*2 zDD>xex5b|OkAN)ZbX$gz3s!q7&-5zQ3j~m_Oz8dZaY9ETlQlekxBVFaXz0lxX^c*cCM8 zWkRUAXcVr#;dvCZ#v^2Jw8kM)-tMhrm6SfxBy;I#H#Z zi%~g4i_tbrl~noU8H!lMxdUN6jvtBdmrF`IO%{htW3r>Opf6TEz>)ZIfOJu<&m&!o zbEG4e;J1HtGEQ5SRG$ZXtnBD?z18lrIG7xhBB#LSnVgk!1uWu{06tEf?o!Gr5WeI! z=DmuS!(FyMwP)&k(y7g=PSuan$Je3=vhrmT&o&=Y0Kgs_;)SfNRfh5E>M|*WvhStl zGYH8gbg{_T#ree|MID+je1_SCG+aW*Db!QQ42%;p(%#Y{g^`0BZq-)KBLT3%^Gn!T z*?=ZRj(-mv(b|DR6cQ40;w>%S7vmwXpHz)zv=*;KUhBMU5CxOE5sy`X%o5f&Nmze3 ze4zUKQgXTix_ecN_$)csN&Y9GgDfd_o(h2voP&^fD|}GX$I7^KQP0^3=`C4y0sG~J zpqaGieFzENMoVt=snIfT>IQ!;wh)|Ct^~9=`LT}GfShjDO!)Fs0zwMk zr^>joXw6uJ^cJ7pnlG)9Oar7ML^ZtyZ)T0%R;>}&Q>T#|TuzokR!$zMHr|bUzHTA* z$zCPYya70apaojT1&IE*Ueb`5D8}VH>fSIOQP%!`sCKIRfdq@32N zI$dh6MefKk3Mu>P4pNGpM?*`}8S*+Z`JX9@0aBYms;-tp*Zy5KbfaDhcWC-&KC~R9 z!^H8SI5UZTmBvjTUh7sg>Lo110r&)>Hz2PI`*zwryeT_XhmSczGJ&ci zGH(O0+AjZREdLt6y$~_RWy^2GVext7j18cPE}qfT^e!emZ-7!sp`U*FjlC2}E&dt4 zio*(aFxy*wBIc0$rQy3&j5PqS8PgB)Atg&|HGb@=17VX$!-^vp6IG)V;D}~6t}D-u zPNmQ!QCd8oEK@XE5<=i!=Inh4@7A|i)fREsI-d=8)+az99tG%zK0nK#X<+8E0vmk> zRqEiKVtZ86!968Lh&SnVJ z;zPV)wa^V+C|6fqquPL51>N*P5&@Ta96on^CXWJ7=s;!TfOMSl)x^wVv&yDhS|fC& zmbNZY`_ypBsl*G>IjS7Me+)d<01G)DTD*gUwOI}iSn?_8DkXOo zuSz}@;_z&9#`97+o>L@aJ6|%k8T#fdJHso$a%qAmOl`eh%>YNS zsjb|H;z{HZ}@<_r!S;Ib_Z7PG`SU0vGIf8&!qOqL!}1X z4~*@**{I7`aXD0K{GjYUYK}b69I3;uC}Bm-bw-^JiEj4>k_&AWN)@EkJe-fb&&$5o1<@54+q9&bW7 zsWM74^hrWS+A^cWA54Xn!{IXztViO|%OF5%fD|S^2%uZn;0J>M=@%)=8W;`=O zJjuMuKvl!H+iVDHYtugsYQb(Q!K+`x_2|-_zFTrEh`7mrC$;jMQR0W}`-U!?`LlJ935f zH;_YT7-CNJa9}34NDfpFkuq3b8tk7X{b?#v{qt_U`g+-^n;J^e|D*K@&1MU&`6SgD zVEp6fJ;0bjvdoJ*6`d=+XD#xw!WEM4v>sBl>1Y*NuVVah#q43L9(kQ9k;L?XDiFfO zL3~CCSh*LW@NO)GWlRaM@=b)&tA}=LJKjl@V=@J0LQ92^`$dFEoHhMr88-&`pGOGy zY^g?yPU}g$i=;U049Z~YNSZz1`4Vo}a19krsHA#Yiw9*X2P?GrAQ{3`9jC>!?Qm$W z7U!x9^9iwklc7!sRv#j?0SL@Z~>+u|&3ssmq#8u6D_+)goY0h%%DCCsuS^QP3&Pi?iRrC(%@ ztlUAyP9h`LYI$iPWqUVd9NMkM4E|IJerEj`9Y%SVC^LakO_(^-%!|EB=BPBz!}c}K z?PW(sP@m(1NOZaqIkT`xEmWPYG;UVT2`lxkZ1HCF6g8caeZ`wL3@V?z1Qx%yo#Ad8 z-eP|on(7@tqKZqR1CW0VMi5(~(pD58D81(y)cVz>TH7UxvP%MWPZQF>*d&9pj~6o1 zrtESA0o#?oq83K2tZcQ=Z;>^z^>yrEH%UbUsMlOE5Wn-$kboE{ZF|b(wsu`}nsR-B zJ#S_FD9rR?Q>~Az=kPIe<#0*Q`I#{W=Dcq6Q;RL82^(btEq(=px+5Q07vL@YO7$4? zrj-0N4(t4sct^B=?0Od2M09BQ6-?K{YFyL{)HumT%9doV-TUOpy;WymbkiLpGunpQ z%FIbA)-XU@cfip(va$oRvIG62!SIgi0=Z{AEKLwUO&;ge6-q-6l}T#&RjBn~Get*Y zGex^>4VGHD{Rv~&W92phQC0~?Sq^4VlU0atH+j{zALqJA+Gp`5zanG9gLpM==OSuU z8)xB8U^~^ID;ZU3ypSxBdoa+r+2ljXSWG!xz{l z_T!fpz2!IVPM#LK#m)nr@n@&mc~EDu`%C&LnP{706^0VK@Rg=m?V=ZZ;kE`rJjc!w zcIdEpvTAQvN|ld+6plXwg%9e!^vj?@Xa?s>i`ctM_~_0LZhG2 zuznRKUSIOeW-H5BvjcD1I)8Ta+gbYFv3<81cm7$%c-<76@BFBNVzb*D@^J5t%TA+S zqTG*(3i511^1|BHvU$*)UE7VqZzhF@axIVibR#n$i9dsDO#o4lpwSE_$tDtmUBKo`Iio z%!c!bhkFZbF7+ml*7$78QuLrKk;<{vT5%Qso&@U1)Hs|#-AaWA&?|5W!;p%-ipjgTZS-}qCg z91#iyL0JNZM2%5h;mvCI+5C=2{G5%hG_prYVGl%am({`;aYtwvGH)XB!(LE8)0acA zGO;JKTIIObBfp^|5b}N~vpgK4we}{YbHVo}vV4e;d2N<>L}eN8mEXv~#Pg9WD@81H zDllAuF}e~CgW#ls;Ua97g@R50IMubr3gGVhaccuZb* znVv7&#*uKEk~>*z?4@tOOPy){Trw)B`3U^>kLJ;5S!$v~ z-z1?ap6fQzD-3xgQPh8BqMz>2GqH0v0Z{!D^SsoISJGpan(;=wYsG7VzSDL;MspKw%NP?_CZv)gigVLR%q1Hi+m~RDl6MOvYRP7DjYhP*deFB&cioFPE3Gn4CYRxw126mu^$K1Gb5x#1xe`Ng|xCgsc z4JHX|4piyh<(Wk|5#~iJ9%HypIH!2$gq36 z&0UP=o7sMQ2;oEmX?EogfEywAcf7SNAq;b0yJRX%DlH!~6#A zAYL$5+QVEx)^~e)m~Vu}4p?_RM$f##hJ>@LrO-`_QK_W{;8Y}&!ykVKjbP73yQb&J zSZN#68$m9(B*4V8))yFlELA6ANbneo2R5JKkN~-HG08!N^0jya%8zP#Oj?jTJn=i3 zNbjJ4GAAGcGFJuyu8gx3f{{bVTBHsQfa-E-4eO}YfVeig6F|}$evQ{v3%tY1*#Pr= zPgR3G94!^zVJK;7{l@XlkaQt6|M>+vR5|NcQ#uPm3bzR#5R!XH)-HK*A&WAGh=QOb@4u>7ewwOnsMRy?=- zjpPZo$pYkRX&?+4vPtaJR?|HV&eh>Qc4^`IM>jGk(;f6V->eNx1>2k(IyJLCZDRnA zh;z$nUv)0fFZ`DHGV-DITNDM2wd9xTFah)^HL@{|;=@X5;Zj!X&E2@=l&`Y}gAe znL)txx^A34u!rS6YW zl@Hnmb-p8vqmWnyA3$PctP%3;J(eRuV>Pw+X6^|j%HQrb{*^|!Qj}no0c9#&heY=! zPZd~ae=!UPrezb55$Dm8CuJyP62D<{Wa)4~Ki>r>CUOBeL&?qb-pytyt3c*YtYgz; z1{_UkitMy10o4q99_63*65vjeq4+t^?$L4nYOWB>dNL>KKt?qsbGx}yBqFlBgW871AGgg}Z?4;vgg{${_<{;8uor;6p_Il1RXQ;S=i?$)b z;-$znBimd1c2;a#^b}CGt_9KSai*7t45g3qzkEuwx5#&ldR7jZFi=|m3_?*FDCK5i z_qkKmfjJ!7lxb;#CdUWf#E5GmY@LRu&C)g@*kzUC2jzfo5F8TN%1yytJl;xg@;veA z#WRGe5|jS`By4^ZOZ&+6n4>}CCa>OkUSx>gIVUoCQPvHRgPF4) zQTmm|DgIN0gYdN|x-CvS&R&u00L05#EuIS{FoD6X&v(h&EbCpza%z*WF zEn$G9W%j4qRn(i5qw{6h=|YMT?w##;UM|M*+~-2r1>)D*iNZ{2N`*O8X79Mkt@SYW z!6pY}nI&eN9Y^T}rm_ej=Tde{0Iqc_tU_vWTqE|{@kn(LB&Mup4t^m5w&N2*r@^P0 z3Y{4(w|!6KTFPGT;*Yxp-pm~87FF}ZsY?jz!70TFyuu+|GBHBCtMZMjp z)qjvD%O0V{egGp_)B-QZFRKs?v6myIe()Bpp%*%#AN;P?a8L$HwT9s=dh=WQ!2w!B z?Fc{TP zR0zFs5qnSgrihE}GQ5C< zNk1c9SaR~bKy0Nw5k4uoNJ&Dg?u@MB= zp=s`=HDb3R#U;52IS7!SflLTt5%Mc0{DT5Sr(3H(mc_j(uxoM<7K{(!tG(SZfC}ti zGc|bCAoyG3NgW)nviGj+1@7HQK=}eb*qQW?cEJ#+?^j^@r= zV_N6D6k2(f`hpVgz!x~ZaPhiM1p77%`66DirUM5v%=N~=R8Ox(I&OGp_1Nr=y&z{E zRB^Wg+51PoPm8H)nB74Ow}_h8F`_+rrM;(N?Pe*DIWViPA^roWif!XYxdV%L+qzp) z5_58=+J{MA=9ID+?NfR{3?c-PX=sAvdKsHac(+eGNdrc6sclqZeX80EO0jkbvY`PY zi_#9c8rQR;nI=s5k?iPHKA=RxnYFAvAq3 z#|}4Z`n6s(@FcBqI@S<79YYGIU)%6e_3L7UG6sI-@9~a8@G(33xY%q?ID|Q|2ku9} z5xAiv`^=Gj+8J3MRqMl}YFVPy-ouyZM=qH$vOqx|48~3^*M*#SXd@`9_>d}?GquJ( zatkqA8DPl~;NJXANWzUoEjAmW3}b_p7pX6&Yw;R{pq8PPW}zYuVjl_xGL?zp&g2@D z+Aqh%DrD!Q$1_uPQ0c_Dry+BM#bNAPOPx69LUjGTJaK zqYXbNVC^=Ti#nAa4=00(W3iu-&df!>VF!Q_EG>OxEmG46los&)^eu;EMS0>4L-k1Z zO%9b*+@dd5` zYk_{HrQ0@eroGB++YmAd<8ribro$=@03zn}EcWyQoFSF1Ecid{y$g6$)z!y6fdK}L z%z#lwi4yBrgHTO0)kF}21c-tNiVBKAEu~PBb)`F{Vs&)kwA*!sTT^L)=|OU{{n_GRt0*Is+=wbowS zQteYhl3jxZZS)KSPX#?AG9|~_Pl~Sz0Lx2h+BVB&kJuU3&r$_rr=y<#J~&PM#G+?U zrz=l$jVF?Gvmw8H|DCHn?whWq)KqQc#A7ijoM*Ufx{|hs#QF+5T=pbp#G7-o8M9|n zXHq~@8I%^=sT@0qq3q-ANu6No;y9(Vhk1<)bx*FKvK+e&x3-S#sZZHCI;%63VX5Mo z)EYWcv*yZ64TVpJr8q~W&#w^!_&D0T1DObKFt;eas&oAH&WOpZAwo&&%^mIPPR{|K z2OE5H`J-R>r1gB^D<4gh_F4xL?g(1#95v`?w*i*cBOMpb_U<#>^qDSsaB)n191xlP zB1d2+(y8FX<%>UUpw?jgM<25{LabeWeg7HXJ{;-1$2_!F7@wNrAMwR9@YG+(C4HE) zm9Z&zj~E{RXJ_Y#=6`naGB|ZdmhdIw_ST5?->{LWPe*D)Rca2G4CEL0Q5?xOnm@@ZlJ zganjbrm~>%YC_dz50b?$BLemO;1dB;=F(VQ>IEd@_@2w=AM-@9Nh6T=8j{k-djgEn zUgHg+5HE@EexLB*^Mepkh5OhOwc25P()x}u-ggULCp&}DgB(TP)JcYGNG#>m=0z8o*r>_VP5GJtx%*y4cA)Hivfqg6E< zou`BG%S^gFJHO6be3iuG)hV6Ji|--2jRH{Oqe9CB`tl`a`prb370>@eQr{MIjJcMn{z8;{^4svjRGbfab^d0|VG4(X=IETR#s@<}M`D!cnlU(%tj;D^HBXNW^n3g7 z!(?*4U5gVsXLvjQ<5_wPHtLuGfYB!t##+0TrX{3F(z?!k6RF7lj03nKm0r%ql%(nc z)j%g}W%-cwtjPl3?O!P$lf8h88OHA&bjh6QFiwl{Ju!%-X-(G*`onZRF;TuEgT;^7 zIpb%@5VQhr7rxmc-~i_4K4hF}Weo%)b3x)jI}E#eI4=bo|3(JuB*cLIR=FqY`m(_e zvdn_6)A}zjtb-6kOPz5(GPHL703$Nb-pl|yyC8>w z!KL3JPyR69qY?cEiKvtr=8JjTQTK=v$C*S$MH*=maR3T74l;=%h)R=a2;$4U5~@HLwzV&X1T5qBYR z8!RP?N0v^!b&(bCu+MVfHMXs$)>zNP=nWWtcVV$MLAtVg9jV-tRGB;F)2cD zGjF&H8Un3!K1j*MKx6iKk<6&+7^9FZ9@nQWl4Vk`(7b8d77zIoZ=#b8CPl1vEpIr` z+PUOBoqCAh9we#Z@QDmmAG8^I<1Xnu_+zr$UA1K$>Z(laIJp|AP6aAwE2~1oV<#G+ z)n0XA;ZobY0oUEU3AGQHlp#Hc{n@~4u<1Aa6?oz`JvplM6MknvdO8oJqWOgmmU-Mv z{dFkDoX9K&h4bR4d=x;^f3P0UmJ!Fudza-g*YvauR&=~PyCB0&Z>P8iue)4Z8)vz} z%6)ooU822PV(eb)VwhUauMGV8vq|vpYc?^^rjmUP^sUrs;9q3mpHs8_O1xJvmtQW- zp&WJsxYK;ic3v4{-|^rbwEQ;8=AX&2RO#9tnBKH3QE&8L>vDmSx`#hr7upO!zEGSu z01RGLXP8y0fs$4%ntyp>;hGJLxf9msyY|wI3gVtSRP|$--A#0q=~c$;`9hw*x7RED zy|dnc!eBlChCnS*;y>~5w#;NstfG-Y_9Se7>M1xl^P>u%Pu$?j6Btt~K({#%8*HpZ zpq}AWr20$z&Z?0eM(Ho&8^jr`M9dv*G)KEKB4)6u)W|=(PUo@;2&kp*$Z%f(fe+2R zlxM0x_w-pcCfBhZE?3wessoFZG>AgBq0SSs=+5j&M1c4kM`y-Tf|P> zd#aV`V)78HM?Stkku2kE-%TOH$`kb-LIaNaHoUc(;awcp_BmWmdQdy!>C% zbk=HnQt;vKfK&Zwh@6XeHSpK@VBQ08v7n&6+0dzx=o1e%@-a=wGT0`j35qKSW;vxJ zZr56EySj4QtTVYw$$-N*?&0ZodpKjd5ZkOvpeRYVrU^IHks-EJ*LNft@3kvC_CE1& z&8KA1Z;@+P4TMwdUKnhOsDoVYjC0tN`uxQ_Y_v{D@qLeDD`7{7vH^zGunJmvgq+>YE;iB z@l4(FwtO_FaBf*SKJWyMUSg)d?5X}`3A0C@dwj5QhLMfHRpXDz2G-#2i+HQqhU98e zsy&;@LVm$uQPgip&E;MAGUIj>x3{Ne(jBY4bTcQgs>snUxWl2h+Y?yL$CKZ#8m{3} z5L=lu=A=+d-AP`Usgp|8JM2=v)F0j|9M|(Pf}{@Sj{pch(Rg}*=0W1j)Q#lS1k7;% z%LQrfw?OTyyf0AFPK)?nwxX9PEr}k}u3WB^TMvIMQ8c(z3o}Gj;r?+V6O+p{%qet3 zV2!u4?XpN)&YPCR@0%2z3|hupZfCeQwSeClu;!x_$*@s>1RAeMEM9d6UMJ2P{))ot z)&X`vb4K>ZQw&9{_xy&h~8>r;QvL2Bq$1e-p+`F({HsvxA0v4B;b+Pt}|9O*uG z@3%IwsuOgF$RA`A^X?FFo@#t0*mN75(|yo*9xWs&wr=@c7^&lF0(+~Q%*-k?2k>P- zq-?8^@P1KlE;%KPcItI1Fr;Qdwzg0<7OxgV*~7iPL-65)5?3RwBRjrKIwLJEqD39s zfZ-yT*DJsqK1;ao?wt2JSMcs0L0F&N+yV4DMcSOgi7PE{D))--9)JNFW#6IV=Fga~ zmXkBl$K#c-L8{02ANatTtRoZSY_q-co82()t<;SrS!CO&@u^>6r1e@qOot|asJfZ5 zT@8Id%#{5gV-^cGeuv_g`dqSE>bt_UNhB?kl9{sK=2vFQex3J1zOaatee#8+*+ycf zO7Vq@c@tkyRWdhet^}JV@hj8F*}UiX<6HdRXFmpIo0w`UR1>-xRmfFExh975E7QcO zyo>vxbH=J-ggJX47L7zb-%N7~YWYc?l@9Nh#v!ITZKuvKl}nB-=dEU4FkWF&bR6)@ zyk(j?g7-p+;j5(VOJZmoobAsEraJYfgg0@8Qj;RC(3`h>uF#3!>d%oK^yd)1?Xy2` z;dLf~i>Sw@a`op!G(PIj9-cxU@dkLy^yh8f6F7&!Aj;i7CY~u_!E%blLreG)8PH8C z#Y3|y#Y0gi9vUcm7j8anM-j@zH>k!gP8H89h7OcpCGu1wcv{4bmju)3r4yvuTzF$Z(CKv(Bu>#6H{M)&@5a=FVem@!;B z@TqZgahhY_hf`0EeJOt_eeYQ~tl@|E6*aDM)lt z95b$XQDuCWoMU#K9jn}DHAhg5gyoUcl16rm%yhYmeN>neR5Oq8Y791w`v-V4Zlbn- zhk5<`;VMAMtmt^vu%^1*k#edO4Ol#!Z+^!($3c!jJ>XWm(*NyCz>AX$Axs9TieYA1 z7gkblfnm%L!KMZ1EG_Lg+uRCGm>Wq+Eb8RQ`2pFyAU;H6eJ_!>?0?J2X6%1Wb9s}a zhpLioC)jj3Z`!y^>Z@=*NloFmH|Qu@Hz+^MEN1doOTpSSTP1M5>xrs(s!5kA>DRoa zuHa8*@ou7dXKiXFNn+N&H#twkn#7fcyxSU{PTj&g*}iWcRy)GIjFe5?Mp6cnjj6BL z>YgOg+C3lP&6=kOg~ofl8FP~J=hUxwr^26_hl5EEweZGZ(-sN2|3hM?%3Z0yl4Jv^ zJV3fQ0im&*e#3jbIbgc?b5-(!Y&=x5E71OXIc`o%#UdkZ#y7$2 zOZZ*jn~=3@5%O`D;*wUQZF>ARDwVcLW}7a?DAlpHNww8m6SG!U^%3ObRP!=YBMBJ{ zzMs00WMi+zHmWlb2g&{`N~$(K*Hzxp7Gv?v!DuYMiEH-S({Jfw;2Z34+=OUj!v{TK zpj3Uv*80@HOnv3>JbO$=J#XVBZQ%uIYjb5@0@fV?=VLAqWJ8g&-iUCt_M_SF= zat3m`u!_jg@*}}yI>SZ%{*T~8o3b`%93*u5X_DDaDbW30RGYZj8W{2PSTd9^@jVyK zFN+g{z})xuhZBK;C?8ctfYJ1Kexz=tP<+qD(O#U-jvdJ{X%o$~3NEAei~evi3C_nx z6JcyT(ttSI2Q7b+XH1*=fli)R?dmeSssA~4`|K8B6>Gq4JeS86Ve6$pYomUxj(f#f-kPTWS;uEIV3PXYiV*c_;w#$TAD$ zF4pbrK2XpcU??s#SWBj37xIjqSj~-XG!)u zAB-f8&BRO1oSrqrCBeEP(eMC!iu4)Tf*g2%scjuz_PZkuG}ciacT)$vINM{q4k1|4wBEiUlbpbtIQl6jMIz8Z-ttADQhsM<-gBv+(f>RbowzJnk|3B% zI0PA0ozWZdyTIRQoOeJyb(|_#nROwEpF*HVx|d-qM$yFY0=6>Jb9oxnbQ}GbLxiH< z9K@-1gP01IrO)G)bRsbCQ+II`A3@T9*ummI@LgZ(mA?Wa)7LScH3aCR3n|6^^3bA; z?CX80`^ZSy6M{`WsYM%{!`0MqtDY_jK8ykieL{REIYN9z z$N|x3>PLB?K_A?{+y=B~KM!cD$Q<8Y8|#%>4M(WTvp2CCS}mE@o8!=X(M9Qs1Sp^J;-_jhWM)J(H;CMsm-Yk>o|z#dwi*ys%qe z6ZL{UfJE&AH|@Eo`8dzs6n&nK7zgS?zn(nhcOqj;_1ea$B@52TV$*^x?R*um#CxCZO~! z=93>-tBfmKjq|RJpMlmA=#MwhJAd`U@0=t#Cst;hgt^54C*d+7P)@?x$Ui&t3`2^u zV#wQbD$ARfW-yjKh0Kz=txIkxxRQ5n`S zsU3cPGv zg{8SlNt-TbqI4HI+8wSeqtxzn=}1)S1vkW*D)Sl&KD?F<3wrOnRA)}_?eCV_WZIWa zY&uX%PxlZ{#LsGiB|`m!oyy?DxH7yJeCVZ2SYKxkcN4H}RG+8~|F56h9?~z(O$9%` z-lV8sOL!yXp@js;_<1%jR|nk8n*bjv!0-B#5rY8aMUn-`@#4Mv1>~dxKzdWgj^Iw! z0w6w94S0|Ku z`HVGIp5{HxAJLM|j~q*#_WTHozwxQap3T5V$bc#?euM!^%ZkQWYMX#bInC2z@6~u4 z)z8x@EzI&_w)?RQ)j;k%M|?M5_b2;hmgv;mWVWl)ewkqh!cM1-*IrN9u@YJWVo3fT zonq>8B@=H9%CWp@H}e&fBHB5IHxJBIAKo+kaRA~)&h?$s zV0@#|1CyS=pv>px}7Y7ANL2Ay(~7 z>3G!nmf;y%Kv3cuKEZnAOZ~K^wUrBBu+t69H_@5fb>f?cc3W7D2F(7Wv`Ta8Nl zJ;o+ofdoF0uO&Pu@RX4+lN0hRh6VeQC-}EYB5!<@65E3zg~ms2-yZB$YZfpzn!eOp zj%jKS_yr8skzpz{==z#!osr65Nft@e&IzLf0 zf18>!o&SWk@;k4)MGlmDQ;V&9;5l2M;B2~$`u}6y$#3OAu`lt<6Qp41a*DN!w;aqR z9j!1aTD;|Qn=c(*#cwN~c&gY3GmvVVgKF1md8#?8Zhid?Ke>tC+*L~|P+*{0l#w9wr{KYUKKm~bb zCB~C)FS+)+gr(jh7wAV;ETN}jol@yY#G1}CHI0_-XC1=S=X&q+x%xaT`&mS#&u4m{ zC+PE+a&V`PW^u`%OurXm4|HX^g1%)&Xq)<(x280yqWx%_=4MnY-=Q%5L8iOR0DNfJ z7$BhnQC=4&IJbQmlEocj3P)MS;S;51wSUGdGZ$+0N)7N`|$($9wi@ z3BA0Y-}`dI&4&Ctj%m0yfY*We zn{;yO{mUjt&OjbK!$^&G<8m69PwrR(*;ucxp7I#cN{z<|_TW$2?&ZFx`mJ5gzA?_@ zc+)sfFezG4&*DuT4`RX}!n^3#Ovwe0)w?tg);DM_pTgz~)+qKSvt9JU4sXWf*ZfU);iV;Z(U?UIZa7mc;h<U&P={*SQwHaE2r8Y9Sc+YSjuQKvne#?)k8BR4%MsXSXf}S)P@hGb~P?r zd}=md^LSN7PWNzN=XElOq}~#*-iuW4A=De}=erZR@FVt*nSb|tzaRIWEj&-}M^v4! z;&6Qx7V?i(QL{~Y!?&4f_u?Tqz1i;C|d$knR&lOgDB4S51o!oY(z`0d)| zn+dp7v5MR;r#IyH--|D80A3{FE>g5}-f^c34g=>-;H(cmzRtq=2S&rU>7R@D==;1w z1?Nwxx?(+{X)|a@3^e#Y1bh>R=6C`#mAYg7MH~j#_|0(p&v1?>ke=dswGhwC8R>VX z6yIBve#`{r$^*KWshK){GH&IFazJ1tngK4#ymCx#S(A=20zfXZN0+)J<)sndtfHVet=^c7HBb2Vl@!KrM^z z$V_~$8K1Ns>m&3S-ig57?@Q@c4?um+RHjeU?@hO+L-{G4$n18uwOT5^jg;VptAhO- zBRVdwrz8(<&j$0Xi_8u7hhOT?IQ^;Bp9=jc1EdD^ z*b(ld;HRlr_>rlZNuHTxfRXI=)(2W@{NSu|NAjPOgtcf-ryHZ)#AurnwazvoIFs2d z3ORl@*$y7mya1}6i)&`o7aasajkNSvZ)l6Z(4tYjJ+)$WY73 z5;c{MxJ{D>luE_MKgx_V<@uW_-$Z%(VCuU1Vq$@|WNYJC#BZq09M(8x1m@t< z=f$&%@7)_+;0`dHaBw8PCNMU+p7QkcZTGwX65vI#=`ILm#1~ROryM{c%{P>C!rEXo zIkWdWtuum`ubL4ohvUu&UeLTfIGKL{SHWbifM-@YFD%|c-x{E-VU_D2)oc0!Rh4LX zcXeMMF)6lv@?v~v(fkX=HtdJ-YwVQg*IWmh3PHH3S1B62aQ*h+@#|&;PgocH>6+k8 zEl+T!t+jDaaKsD25$njlfU|ew{6Yae$03qG=t&m<_VBQQs~QGS2f{1^sJ4h?$(gIA z<&Mppg@B6q-cGS$EGV?C8NhzYmt5HEomTo(SJTYkmT^0Y2$dy>sro=lHw&%atXNje4N<3&v zM6bxNKi7xvT~kO?OKtAq9q0aGo4P02+=_Bk?^L(c`j^_tVR(g|d;{C?^Er0@QGb1z z?Spji>b=y5dXDp+WAwDr>|>E-yt|E&Mm=tgH1L3}^kboBnSQ!ceD~7Waqfko_yFvVn~ z8s_yk-(huFTiL2$uM1Spu4>71&WBH|X?i8tcqyrgrm2rvhASyy4c{u)H?4}DpJ+P$ zzjNt#k-kzx!Kc#_O;;|;eOjSURHRS+5>3Cz`xMhBF;FdTmE>_Bcy`RWM`qBX2G9N1 z=GH{wBRE<{SmAhCg)=yk40J=p@-wx1+S{Yp3t!CIcGm_TE!i-Mb9MrWh-)CianL?%^uCRKiy$@Y;88XnCW0Y#i5Ux z5*S5+(Nm#^#2DYjDN^ z(?jga`;1+AR|jueYggXw!4b~|N30>R%Q=3t_eqx|n!4su)A^z%AwdIn{K_(_9WW+R zZ?1~n^yciRxwj!P?j!mWUtL`D^t@ea^F;dNaI=Wraf@c@Py;13B#q}my4+_NJ&X^5 zMAOhrV|+_a;2T?+_g95|0PW=C+wSMgbiNqTtW0$+>jZE+08ED$xmWKicN!mQ5d$;= zK|*hhy~M(ZX+@+cr>JF^VH%zY=xx%>c_~x#M7QCcuP`>UuPU#k6SFO__oHOi^Qj0% z^<=6AFLlU1v6{rULhji<_Yyw@Q3_p!Iaa=HarB7F9rqM*tHt)E-M0rDHKt0Bci$E} znd={KUX@Yvu&-|R&j>DB6@R@bE%)(c(RY&C zwWxZUsnw9Ziq!8e9elJERY{eIo7oXrrpjRCkB8l_+IY+wkP1Z3Dv6wPB1mPS5msL2 zFC5Ljn>l*(o15*Bonv~(AjZd;0UDZcuXu>Q+v_irpW4)uTSk~cXc+-v!=J^!Akp}l z%4(-s^1gFL1={}GP{)aQJn!pGd`)v-j){M42Kgeo7tyGlAewN8mBhC#jSY5(g*Z3n zbE}__$Yln7(4$lOmHJ{|HN>7ilVW9wWdC{M*(9~Y>+#Ovw+Y9V|Y6F zu`5G#ej=Wn=%ItjlX#rj_mWnJsA5=DiyAo>7hiD{lY@JB+%U+ZhM(?WZIJ^3!~fdh z=~l7wzLce#VYlJ$I$)%nZmBfe9D&y88{&-FWO0w{zl#%ZThr4+4oBwxo~BPzRH{ zILV@v9Mw--)A+R^U-0IJacCU6l=Fukk;86$A7rI)uiJ8Dt~X|A)5p8rKxLST7v>pC zT=$RrO&_#_u}B6T%hqY)#h)ybDyI$oi=HA`deU{N9{7j5b4%homd1Lyb3^VBcc?pb z(4)O+KU!f<2A0vJW_CESWbb|1CIy6<>xX(xMj#INg3_kvV*!r&-MB75w?c?K+Ev;f zSOr`5egXr^#MXx6`uFn@RNH6iX|PSEcE$dlU?9*zrEv}4srCgM=W3m#!_CRgvsSIV z`qZB%Chlcs1V_Ed9aQdFVbP9zZn^W?rmeI8T%7RtAaleW*rRDnu<^g3b?5!~=Djs? zaSp|L)DVX`*!X>tGs{HS%-2nu$3iBhoJ+&QdDCVv72foI{JA0$!^FD#vehSX`v3L4 z_(+vG+hT{*)E(iE9h^QJCRw*GU1H+#t&M-G_}r1`yYXj>obmxgPCteViDthBTt`^A zj%eBvd$?)6as@{;D~)rOG)ios%l(fR9MPDWUz8zDWi`A-5%(zuF`R_l7yox zUDKTqq1MOFLqDYn6yRCT(@YlGrE%Fg*&T)5B^uB|eoj?7gn*;XUGl#kHTt#^DywEU zJJ;`?Qy~dsR7Kjqc2qSQroncHXw;P1KX$x|nFbN}5Vw=dR$n}-xb^JfhSB~abB&QZ zqS%f3i`H8Fp6&bNDjMAMPV?3P&XY@i$PXsAw=_4u+o@*5;bQvW!JqsYA64IM_hLUQ zmHOmf6LS8sY0K=ViW4Q>+^TNun&;JKhAv=;Y}4!YoBl~h0-MtDXUqjwS$fj|p49&z zM?W?DS;`09s$hI?(fpL)cMcKs>F$I(*x4z1INcfUcQ~H!2U#q15Mig*5&nBolQzQ? z3^HbT`{hzfR{Wt1Uq=Y18W_%-QMWzyqNO`gKQWz6Kr<^7Y-x zoBhW;z}}z6L}kIFEP}P=eg6T|A$Afnf(j} z52oP36fBzmPP)61Ka?E+!j7B+g$2+aigs~_`AKOm<~FM0;F51zsW(6$lj|Q2+x0NF z^5w73YqFGOUkq4ziLkE#Ga{5e#LhpFaZlBI1@*dJkwv$(jD+hTkdHK4zZU!iprI!N zQ(!N(z6&qVZFVK9B0dCB6)k&#e8AaeW=9!Xx`mM2nhsV*}|f{Go3s=hww`-JJ(N*bcb?wiqYUkz#i)ck%^Ll6P^=Q4#K` z>*34`z;X=^YAq`Cj?Qq6}$3GA@^I(YuKjxBb35~=MFy2ICgiSZ$)7nYP2wC#@f*X*9R zW5D?0n%(oas=qZ5|IO?{Si>Z3s#26Ci1ycXR)4lGuhvsiDipwaLK}+%<8?nB;k~)iCwA6lNj0&~eD8-d0sjrgg z%-rVGf5eY+et2-ZHEuT}b2e-sBeUgj?o5>1*a;~y1{ATHWZYC?}2(+9PH^m z>Q#U0SNutw=TCQa&-2GumpGrey@L;*JCo(D{*Err%dwuM2OpjnYTn%0dAa{~_uPN6 z9dY(XN0SZ(aVccUj$yO?u|Ye|IHV}{)!@TtgqmOPj0E{w|7PF`14yFLJTilOMco$f zHqVOz$l2p|rlA*UXgCekhnnB$?7Y~2T`QXicfn4#_Ft46Eatf`{(4YrkOC_iA$I03 z_po7y)s$pX*8Y4?YvmSFj!7RAf1@V>TIcoEB63(_M4)DbKUehZU+rmio8RQ|a{DNhjytSxv-D~_#b92fMg2%*nRs@%fBi9Uq_KHQN2=9w8 znn;>P7EW6ap<8EY#4~`qjVcA4yrihZv>R;F2)ZLDv&eBBs%wVks~VcG5|1H$3dM|r z0ow{*Z&eMjJ6?ZmUk&%YYvhMqIT>%(OgqybZ!SSDA7A3!WHQ0lPzVJdI-^VQp>zGs zZw9)r=8I}_hn0auQ@yDEW0d%F#msL#9^H~{jLw*bu8%aRJ*#(I+h}w^MLZo+wRM|I zeh#Z zJ<^k0M)Sg1L;V~fK(FMP=rsqo(kUbCygaLT%H~_=c8@o2<42f|Xv}z(oBBAOW@Knc z4(VzL?p31RBtP}P-@0rKE!?IS7_UEBA`(ebO+eM?vZ%#Risc&_kz|o1V_rw_?K3`d z&f0c=QTmx+zXnph{f@QSPKEX``%l)W%#>Ici7)W)dnxOMnc3`@BRhthrEKZ1yXBU$ z_!(NtjLCj%!{|9h@Q)o&HpGs-!|$Zvd1u4(#)q2U?ChlaZ*tUB7|xOsY5Q2 zBSQ%idNy1g_91+ZFG*Ls<0m&g&mC*$26&XX=N7w1>{!z&8r-qQ9}UJ=2QU_o52bq{ z-ZL@IH4IG)&=lu_5_kMy=Yp`?UDUR?xol>US<)a#qZW{-Z2Ud{a%gqg$VgUEG!id` zQnx7aqmTGr$+bCbM|W%WGv;!xm09F>4|9)5+-2&U6Dhu<>Mpm99i?$$IrrpC>!%HEy zise1n)m3|YMfa>wqN>O(DQbEi*LsSurLKyVQwEJHj`dpnPvfJ|dC;g(u<(=b;Y|nz@D+GV_rZ<;0Z+cf7EAG*SvxF(&OJ8O8GZv&-9e~u^f;6@RkWR~h z#5qa}Qh6RovA*f^04U6G)~yA_;dGyz{?27>DvG{-kS0;r0dpduW9CFk*jvLOE8H`) zI1?s=O;e#Suci^(I^Mti|M~#Upf6Y-(C3c-@9G0q{?BLY1KQ{>Eq#?jh1G6_dsy?k zel%Xs<05tyFX#`Oo4W)b9#Z+|S$~#ZFuu0aS+Vy}OPFPYZzr?c9T&m^<}T0*CvkpO zs_fLQYiBhpe{-^L_hjXZv(}j;qgqtby2_pHlQzs+b?-N){F4i-46olAe`hZoS6f5N zxaRG_bF?dL-{Z2Y{Wu_c>-`wXwZ4m)WHXT(&y+-Og&zfcGcHw&_%_`@Se)bF!O^Vv zYgyB=t9F&(F^UZVF6Z%GOJhS|UQc6Bk+W3qhDZH;_C@!WmJ(f)CC(QxtaA2v+uwp9x=}vyIhmD znZf116?aY?2x2Sf zM^&4CR21~1AN>HQ-}a{`<-s2t)dB3$lYqM%xCgd@+vsnzL-p(?dY+{knLj2&uC~K;myM7-p%j!HM;HoFR-odd_@4Mt~;CQ^W5>p?iC^DBt#-6 zQ&;zjVrO1)!vZuAN3tre*x4PY_Z9!*Z?q3b_MLl_z$KY|o#IGx=YNHL>0YMaHz^r{ zYFU)Va~X}>4C~KYVaR;A-O^E{z@HUK^0P!5x~orF){(SMwUU zh#Ez={Jzlb7;h;q&w5)538ct`b0~^bwW!8+KfJj$T}p|8d@FQC;OiX97=g6{1Obob zA9ns-!m2hM|2zq;?z}+r`+Xm+g+@>|L^t{YcAD%VU0nah^iYOcE?k;R6#%ZGH^Rpy zH@%Pds*a>eJmX8X%<=5j0?jF}wx?bH275{N&B}5RaFri(Y~8Yu-_EP?&Fmw#I?oh+Y;J3be;S(K-MxP%x!kJXQ9c3)_4GPKqv9QsgX?+P zfQraPoo?D{E!Mr%S3C-8`LQBGCb zp<+*?Z)cFDk2!{5wfh^$_N@^Z=yZ8bVK*}XYTOa1E(1)dl?KR-?u2!Iv~%K`p5p)- zE78w7=x0u3CiJ6?>on74kA5yApmXI8(NA3boE-V|W9k+CP#m97$>WpBMkQrXKm|)p z6^%)^R;_1Zc$iOv5oLMEN4dfojno%Ch}T+<7ci(5@$UwF&ZkW4;dZ@b`yb!l7&~|v z9juD43J)3`n3r}hkqhoo{mbs$?r$LG!-gHY<+2EP7Te0mRxW93Um#I^zO~ z@nL6Nv8%r!XIR*+4>hfK)(xZ?_ zfv3b-{SJT_GjHEsp`+)~Fmab;+NpNCE?y9zroffQxt9mh$GXFd-OlyrGBr*OCqVC z>G?NT_7YLpNK0X34TYg$yW>_2S)H>So7g*AxRZU26I}mh)YP3v2e>>B<79>-4q;Vk z$EPLxd3-vNm^wa7cZEE9A?n+f;g(0EH~=!1j(5KCKC>fubF(pZTE^(T6Uf{Av_$>{~~wfym!>W_ce7z>KOMdB@CvetYs zFQv2-y=@t*Ee5reLuyLa0lVxO$xM+gj)tQMIv$xTeQ*(nj z!Yw|v{V1LY+&K;+A1xX63wg&Q>vK&Ped6>(;7q**`i%bp+xg{ZmatreXT72=4kln4 zE;&_g&wAISY{?SRS9bo9LDw{@9DS?BWH{Be?QsOD+>&|(B(J2m8l5_PABn*XVbFv>a~F=K`E zvU^g^b60gsObIpZhSYk zF+FFP17^_xZZph(T7|w&O9m2ZVr-G9N?k(OuGx5H|Jggj?gD=zdTKax-T^&a{F5yG ztqq%u(BH=3l3&6(DLW9Dw1j$O&98y1H5rF|%TEWI`7;rq>J#%q?nT8&r*#sZhqxC7 z+yU-oKK`Fr_NOI?&(9JX_n_cIvkqGPwwaxi2ZZpcI+W$CY5jt;D_1!^;_DVWXRvWd z%LrA*rqyaOGjjH_+e1u85n97^y;&l!bs+K^?%r(GzXQz@!L(=?{Fku&JlEsrxsGEP z{Oi?&s$VM5Z|D4ZbUVyMooicEOm8O8>v8cN4}YTwNZ`hPvVvswfAtf#?L!UVcu=te5Rnf>1m6 zE2PKH@TR_QpmHOGP`NcRG1UFfv3G%{Rtr_v^uf3#7~qXt!u>_~53TDI-^r$SftIWd z$C}yaYk0)l(O#-ll$or?RmO}_nsCk;on_{Q`_11!g<-XV61n+h>Br)K3jAqeVsyy; zZUOG=-0yn0PyFushR=ofkr}*C?FjFQ8~$Q3jT@Z86K8N<|C{~b{BMNbEx`F%!ue{0 z^JMeuojP|zS=y)-!Uv{X*}?X9YbyWdPV!f#ajxjT$N6(?GrD)zI%5 z?{C+;l0wmrV%(77*q6r*0o z{LG)5hGLHZr|Am5hWT1*=-j&DvqO#w-)4vW0KP&Qe7|@{!L0pH;GMJRbHn=^=H0&F z_4mra>(7I?{ELJ4v1|4XZ+jhs!S8MhuU!AYaUp&uWZ|7~P!7Kf{^twBZ}I1c*TZjz z@aFJ)JNu*zJ*@ln{@^XeP31X+P_0bjhcdOm3;$S+_kua+CGo-yy0Ze!TlzXX3z=5* zOYwzUq2Rt)n!CGaRx>^EQI<6-qsD682;Z-Ur&hJpkyCZ`bZ@%xj&Bu7Kaw$wt5Ku; zERkRe*OzmNFZt-Ha-nG268*Z=t!AH!)cny2d$^?{b`BudQn`%1)`Tg?8ov80%=Z%| z2vIJi-3|HVfv=@kJ7$yb?;}5IU4{oxWRW5T5IJh6FQ!`$85~a`)e!g#{3x;mli(qx6lu)HmpQvW~o#OJG=4f zmmaA!*@V0b*A0QS{64g)cL*{c3Y zzF3KR(#Sf&bFMa^NJk2Grz&r=RsNU<_2^;f(fi<4d1lo1Kp^!KNYoeK));K;%@0Ek z=p~*!W}6P=PBUJo8r^&S28WY998RQeofBZebQd@9jMt-oGb z?l$Mj+09I3JgZ4zaP-ie;I-Di26#2uC9vhT?X4Tq6RBaDt*C)V;(80{^^pboWviXb zD;4PBRjZG@7L%${ys8CLk8PoKgU~k*p2L7m@X$97xUKDDqS*%4g9z=4OoT$-$2qXa zGOiIc_}57Ng`tL?B}Z29k-7qJLj=ju5u=jOo=zvi3M5%Zc3KBxw1Kw80^Nc!3JChU zjRP5Dq&y7FP9C&a&g(Xnun*eO80jOg8Y7WD?r35eQAs!0Q#)9SrF1UlMaNLbuM`nhbO7p@T~l*4G``2sj7ONt@=-Gt2XKR zRj=XDTxDzHD`=c=0|l{zHOIy_BrOG^#xvWB*hm({GG|?z6XaM` zrG;92ZL&3Wp2mM6Yk6+TW7fdiVC}WPv3kf8$&)I^Gl?}~fmtYuDpoyM1pA%ii+%^t zXS#DsIl6bGyP(XS7-^|3Rq>YEh?(5AW%`xwR@wRo{Z6nnfE|qxG++h_XhkW%oPt(t zNAys{3>=zRsfL*oyw0SEb9EW6j*$g0{q88DZdzToA>FA02j-pePl_71#O7)7^5B_a z;9&*c0z7j+3!WYM@HAL>^kAF}JiP?Z77rdeNxwjZ&zTr;=9X3BdFw5?vEDQpb~?43 zVGa?R7%a|^oVAW4P3i&*X}-Ba9C65pRN4|)0pY<6hh zYY#ehCtu?Wi*$}j?%Gqss__|5{g;+%l|YDzuc9abM8hI(JL9Pn!4%9$O0 z*kN2}z0PiPJ<@0xtxBnO_z=VMe^lw^XP3;{ZnmB8H*fCLIp$lTBL;XIXn#M`U-@Zb zZm9dSx&8g{ZRwsZ!>u3n@NH`M-lApCaQ4hj#-Z&5s;?j_84Zk?f}G-MJuSQ4EYm<| zS;?jcWynNLVO1}g{crw$)8YfokUQ#g;X`6Hb1ES!0UwiI%i@Dmq2S|8;lmK4@R7F- z9|1lB_&sa?-M{j$?iK#ZSGE6s-+7k(_ZCYORvWI(H@FxRIfSF6pN$P{n;C3ut=R`Q zo`R(YAF7KS(lI`)zFGJvWlW=O@qxmcPofda0$4gUR!?ZiE4M%+bD^pQXw8m;^<;2U zCfuC)2`3g4$|+Ytad*ni(gV zMMq~AGRs086R);CE0wjio}$)MTkMm9Y2W-$4C2ZK!JOKpUzW^EAo@H5TfX zr%_|$E79HLiMq>|%4ilPp|lKz>PdI2fn^6IuOLUKa}W zS6lCc5$iU|G8%}`>u|*@-0wyu{0@6$GrZk?vyxHLnK)}KkV&!-Pvr#@X*rFUi8MLG z{634nglN6pe2TW`FD|2OdCU=pX6EGPQ+KW_taycaR0A3Gp;suCa~sZs`kP~UhlrZ{ zV}pUFDA4 zNnK?HY?W!l>ZrQH>V?LHr-)h-E{ZwbP)Wq1k=t5E8uJ%B9kUFwi7waitGbN8v!~Cd zbcoV*JWJf#LY}oS5MplW1jJsZrhBS8)oZoqp5^&~s4#~T5! zoRN>lvJ@Awl~>Lfko?Vk}-@HYuIJp>;)gHrL95QXL?Q~#}{ z6n7PT;CdO4IK0Zn70VwEZuGzc1c7dOK0ht(e16UeaB%oQ+>*7mDUn<9)`8iv4;Apq zW&Z=89A$JUo=AlV_2IC5pP!7)L-9mmnfvwkdAm2FO^&^3<=gpM+2oP@dxHveE(!%ju;BVe+D1azd1eC0% zJz-Qbdo@ojAZF{c=I1n?_4hf|`1_oi=kFsh@vOjq$Vm}#Ej9yskzY_&h{WG#NP8Lb zK>U5yK}(sYi}pH4IhVKb_o*-N_ff+oL)7*cXh_V#vn-+nv$^B<|p^yG%y1Ex=Y2W}al7oX{~^CRy0`}h4v0$-^A$oG!Ra^XT{ zN2gzX0sbQkrnblTe*8z4gUNmQW4t9S8~>3i8HYVZ^N+79pqc`HnXi950DqTtQ$9Dm zPk#oy5z&W%*BGunc#}OyIXee~f4r-oJFo;kWvWgLmd7 z`^N7+;Pvp^A-p;KD$YrU9+oxk55M;Ogq$N9w5(tE$YeQ3+_Ry;IpQ%AI~1&M2yC>@ z5mDBY&vcL>k~ze2jUtBjmr}Epv7Zg*Q6Ra_SyPo#UYIZ2h#O_DpP)>(9yh zKMX}5T4DVksyzRP3NR@Dhlp3rG^&|M@reSH=d?^U=bvYRRMWcDfNxdC=V3cP=t_a! zo=P$|1txFhjy`j!34QA^;18M0+IffLx>dQQag{Zc9{csA&Bo_QRwNrDT~~XVO#Z_; z9lS_VI>N#oO%*{iq^$fCClAaKyXA8tHL2$WdSj%4hr`14`%AHCo(U$YqC<=3| zDA;%mxl)smFc{ftGrSp_=0IOG3e@GF&!#z$CKdI<>;eVLCdvCbYi4;nYi4yjYv#82 z4p}qjh}dM!1d?e663?1>VAfSZQVS%tJPpG|hEOoTuFuh=hd|8+Y#>cH%m9oQH4W53MVq{14>JJ{f))PK*+g2nd4 zBlpqgqkmjzX4!}R<3H~2oz0(RUmA@^AG~m1_NCG(|6a%0KMyV4N5{(vd6H+UE|3@h z1N+j(cMrh6Wb6@96c!^3%}Fx(GFQ%KRRtTpF;JQ1bEGk8vLeZ(X>uHNN!FIa0cPUC zc3?l*IRVMV*iY8kH|!_npJePO@14h2Yd^tEm9wAx@-NnYk{`})1 zOUKWhfre=+2ipm67;LeQ?`!U7__yt4@S=A1vhtg?VCUJ(PQmWhfxWCB zI4onu$6{%0rl{w$4CAevJX_gp&sKKhH|PNNE^{jVXi&7woJwD&Q|ajX>Y{xKQRbMV z>P}_4A6e_v?~5qL>2y_{Ii23WR@NfxMzJ6Ke>$#X{9BsPez;2KRo~Pw58oI5bq7uI z`RRcFUB7#A0Jnm#H~-V0_}#T(gL|Vv%-Yl3x_&u(C3x%CfxS|A^R#@J){R*si?_Rf z0N&PYi#;s;r%a`jXt-e!C;5-&SY;v3s@mhMO0a&JB5iQ?@etw6Y6T1Cv)%uBbA+*! zey+k@5V*HUgo)>v&kdtpZQ;epK+f8v5+&Ec9(}TcKK%8t&nU+TWA@{3_pwOH*>6uT zz{lzP!N=q___+1^;G+e6$e4aMEgAS~8LNAXqDRhH(V@MS!{$eMcT#y>&W?|b=g!0{ zbElR9J+f#(TL+#-p_&{NH(L&+CC{Nf6EyxCocbZbXM>UEN{-7fS!7EpEqN#bGxPB_;dnq7+ub=|kF zpnt>tX8+NdGf27dkIGz7F<_Fvd5=F2zIuPnOILMnMGyE=>?Ai(GbwP@0Ow^Cf}LS6 z|5)M9^T&5I#=;|Ip0MGnaIM)EF&IZtox)8-yQMp?EyB6X9MJV> zG*7-5V-^zas>*S9-BFc`p67EdFrToeFrkF`K&7G+E!H7yjvaFa> z&GfJ((_1>&@Yu>QKGjmPbKO}r*PT@`uPRsy!mtCa2-!)s8COs-v%OPo^OJ4!3Ij9^ zs|hn@is|QgfAi~pxN>Q3JtH74ZpQHs8i{;;(yaGIoMfH8X-m^9JR{LQ?%+FVYamUR zJKyy?Co^;dohvy*aA$l?h#`)z+7{DzPP6x~bq54ahZ7}$Jwv)qT#heAVBuU z?4fH5=-~kUPc*~?#Q`MkkIb!2S)Tr4LTll+*!|*`jzw?8(Ur!f#3|+gxebOFw!!eG zJ0nZnv0)sD%=zW<0cSiBeh~&@AEqant+H{Y&CGnuwLV@XF%UeSno{^qvm6(26PxWh zvgw#W19@m(!=K!F2@K*DBkzsLdQ@fkrClEeXX#Oqm&X};8!$E#bD9I&+5GNdE&k;q zzhO1a^R|O%9oTV41_*rmhDOrZkDlf`&6gw^&go^)UJBkqq=cOor_et|CNlsvx`U+@ zqlz-O4-6|~3&H(kiaS~{maSJ}oqMvg?bw1-m{Do-q`dV!*fc;0Jxa+5EGJ(NOntoO z2qiA;4EL+Ith@d@90DA4bxQAmrhv69-V%y8ZwoeE0w;#@!ksyiRI?{~c|ort98W11 z_sr*?qjJk(jeAZ9tD(G^%0-Gf*L0+W9H7fxvm(~)iQVs!&d6}OS9ZN6_B1iF3>W(_ z?wyIvYd>G#EB+$;Pn|0Sl_18>+N=2m^=M|+y7eWSwl=@hsdIJS_@2nLnae6r`Jp?) zU%4T1O`!XWv6QpHL%;5CEop=PQ>eWR?U!{6MLl(GFw5-=x0%0#bSyvsmY5yt{z*o@ zs69~mLYf0S0-3FB^7|c}r8w#TaLMuS{DXZ~y+RHBkFK8pbh)*mV^8?e}0{P`%m`;uS zQi1$Zf&5a=@QC$>X7AJ?)13VBWi^ldGQ?~CZY#gYt$7+2WgO_GOh=UQ$5#brZ`47A z5^p@~|0Qyf{BpWGcV~eBql+O+qh)UCoh*_O*iV@=)$i!`ErErHi!46#L(bqk<1Jxg zJH=NgW4|ZSlVpafqewC%jY{Bds0)<pz9J0` z4H#)C0$mhHLwW1Bh{?JUeb5+ed{HbVUm8MED6M(TDu^T%J!eBMaxLkAcHtJI1Ieus zszbuD2Ol){g=1D4R|{(K5Q#%M=BR$hPVbOG%HHD9Q(nD=H1*^Xa~^Y)qH0LA(o}H$ z%bejMiCN1Cngq?0SQc-FV7f}onuC}%2Qe$n$zID!OA?O=Wd-uph} z-Bw-`%dzrWG2CX>t43a%47p5TVL7X0Q(7TSj&QbT<-wB`S?O8f>jX~tEb>>jB&LMA zZ;frvu5zP6b8*|SL8l5_>^F!}uuHReUE&f+I`A6g!EX1X_i|MY!h=c0S^ zuycbl?h`vd8*co5>-U8j0w!X47iKb>9HB*f@oMv)2XPv6j_u7q~UIJcT`qCftBuzaJAM-@!bAe`1J#)U zBJwK?EqZES{}vglCwbfwFeSEZw|QX3lDQ8U}K zM~Rw3EM(#8M+R3V%fXd)@Mag#!Hh`WHB49%jttZ6mOUriQrFE+h->`R>I2u=HfjShd^5&jhGf!HMDOHr*AHamE_1+6e=lFtQgxqb`z1pVDd z>_GKft{f6pb!uMwcd-#|OZ-krB>5D%IBBuMmeWyY@MK82&=JO!$^9lNlmdocZ-*mTK zCoFD5rl9nZJUBl1xrR}nsN>KN=uf!DiE;UqnHLO<+Wh9*DC7hy!APKcz!VnUY z-`l;nH9fIiL#Fh=cFCrWL)#^*rgnnkH(uL}JtaJ4&9C@+Qr75$eoy0>`IlLb zHQ$Lp!8Rcis*)GxU}O0RW*~ULYb=0sFiFT z{rcJwVRIKC6(oOt$01x#QhI+8wN^tR$$xwaM9A%l_ZzvB+2x)2F|B4@G@!JL&on!P zYSQX5X`@I(UC9A>U@#g>I-Wdas31@O+AOa*eU-Tn!w|Sm(3QEp;*ZW{N%FBsovC}M z0)v))`8T+=)kFRf)~Krk&0G7nQy{WN?cL8B)lx?e{)^iSRx{&m)+c&Z<<6bXquQ`{ zMK?0jUkkb&wPKY`zQ2u2UqCo`Q&_<|O4PFQYCRFdD(=44o9GhF46j*8F*~!(va-V1 z=hd7BS|Yb?M=Zh&pl#>6Tsy~;ualg>#_7aF%}mdWR9M+V&fePIldY!@wmF3ruI`dc zG5-S2hty*35JQ(qr%Fs`UhD0dht79Tbi3w>Pa_7p2YICVVxe-?c~#-M_D7t~oV}s8 z#wIr7{3rU<1L_c`$-vIjV4J5Uv9DjT zU0dtM-%(n1|0}QV{nU%ci>cRZx3J!Wym~M2>aG9$^)igAzp&o>=URC8@=@?k{QULe zo6^4Ci@kb(?bZ9(=dahpb0NH)O})``1*@OHYngF7K-?NjbXy$!{@dGI?M$dLH$>KD z&U?!ofLB0SqV!XZu4aRach*p?NF}4(k+o)$BUNcBazlx4b&J2fGco2!pRU~OQL}Mg zR|j)jY*1q4V5na^k>ttOqn0sOH3l1dYAnary1i_{qV%9i{@~J`v{bVxxMUko=Wyg! z+%w$&O>*~dL!4e!2#Iqt2I29l8vIT>efYRevu8*LBA+4#~MZG35SQoMxG z(N)uu5=$ZYGHMWknisdfv$c6E7duA>CPop#^yqmPk}VrVB--U8FR;D2RF4X@uSwU; zpnUm>K0S^vH;;is&EtgA%%h^ed7N~jZ>6TOvo`&$%I5_`qPRDg+^&gsnbA^oqAzil z1Rc($pVz5*OXtOJBdy5gr-b8HW&zKR=M1;&3|->eiK}4ZPwkCuE!t%YmUMSsE!wWy zI-Ten=AlPl42qm>20LLwm0www?(O`IMcrKB+kdYv&bTtbRjtlb(KEQ-HWK?X;K>n_ zF4@bw7x*)MKVO82N{#U;OO$jkde=1gP2aF=OQxMNwNsvHM{FRkoqe^^JKM@u3bb!! zR@+v})k;OC6)}YaXyxwCnZB5fNV~pV*0z-j?K-OMRU={&_No!==^w@i`Jy!jV_#~E zv5{UY(c{|p<7(T2S0s7Y>!J$AT6@p(j7)dsP;@f?4|neZA60ejkIy6nOkm^;5+y*y z0mqt1tci^^F;NG|OF@j4YOGOXODQN?#2Lhjm@pIIa5#!Bt+v&F{r%eBYj0__mMXpz zkc5X19#v7Vg0|`mgUCysYJT7E+ULxi35bZV|Gn_ZoY#J=z4qE`uf5jVYo|ijJI1qG zA5S*s2b%$mF(L@jcP{T1iue5kUWCy@Cs9Cx0K)@V4yN>8`m**UqPzFN0lx=^P7RU; z+2G92+6A$Z?o5c!!#$iRfW1AT({sU9B;^aTgv>AS2$^5d^K2KG3%g$m#YjKhxZPtG zU0@%a*-ieOV4O7phD;oq8STu9wtW)WYI^#h@R5a(d;3r@4%ncSyd`Ibwn3Iw8wQLE z7}LvdUJ$@VqG1|p=yRZQmG|JzE^MT7;PMoZar~5X;r?|3()i600bG3GWa?BAaIYDX zMXddkQ`UY5zR`9|ABE790idKaB=dR7&q^ef&X7z-dR=~JD4J7R6%$b|0puc#ku%8fr`a#(BQ^k^o9nn7dG6 zPBuEMf46n_%;T_W7DjOQ3+fC*VsZP_ot@Q6=BO4~dw6vK2j9JY-F}~OWwCo>>$;hK zod2B7bNzZnm-)&MOx;m_K#QFVc+Bd25MC}e8i;n@fq&XBXBN1$RxXr{u|>wE#h~BP zin#&Qq5Y!0VgXI#+Ao%dv*xZv5Z6|CJGh|1__1+=2c8G{T^HtJiCGkk|LATkC2=jU z$g__MH*WA}Bneqbj+Z3T6ypX4Zj%D0g05M>-m}4aAgXV}b$7NK46Hcf?IaU-C38A? zR27bFFY3B5$kw>gQ2kX$d-T=i2X5+Zj`kV-aWvwzZ7{yH=3%mLo`I%^&$Q4TkV#z~ z{x~#s_+xeOW~%dZLEI!C$_VkIW73nqI`2HXgU%m;Hl`d;Z!i3N^%6~L8JMh--waTR%o0}(5yuZ zdjXHG_;;VjvDz!eIWJ}0j`0ij(^sOH5Qp*$y6|dAm`|IHzTV2$ZB$3e*+} z(JKC6ulc%uvPB)vegVj$Ku#bHm+9@@ZA&Mk@=6@FYHUglqT-iUN2)~9UKz)KA7c{- zu2T60sUXC4xpKRA>dPBY4)>chVcM?qME7|jBave~R38nBz|o5Q?X>FbUgkw)$F|6@ z#I+dMq{tuQYFq^6HtQDzVFaBwYe$#)Q$JK$H}W*Gg94RdrTrmPM~4fH-C4CqF`8aD zkO%|1m%jC8DE@IwOgeJFNEn3)C#}3lNrA#`>a-VU) zLIOy4)W_q|QD?zz0f?Wxb}J4&gRuyDc`FnK1@PPa3IZ;T6a+Y~0QO|t$>vibu*|C< zx=d_j8d`4^2$nEDAx%{PgFx5-P%^)b0|qD%xm-|igaB|9D=)lE017ftu>VIyffIoC ztyxYOD7W7hP%x0ad@dw#@TMG%9Nj>XFx?H)GGRb)YKWt-gXo=tiKmGj(gcP3i^eo&~Txx+qY+rAQDz?h^6hll#K&D4(R8C`YQeZ)&^5;Y8<-5X2TckZk}( zGFt8Zxaf5Va9h9^(ErW0%%>sl*)79lc8UwIw&|S+xsKX^KYB;v8 zb9p{6fO4?GR~((DpdHh}?57~zL?Q|I^^!+9#|XX#qGY@asUw>?olV3elZLFM@#CSY z<(lbwWYG7bN31TWQ(drvO5IP4(InD*H5tO?ak6Yz-FmY)Q74ZuD5h>j8Dot zBE8FJ^zo>}ssW)|6@anl>z@>Ew}jNO$XcM&MZIYKyZXNMTca$cv)_fnk6 zvgwlwB#aEjgjQT$RpE&YNY=yDShXT4;bI)?i;t;xDGk3Jecr7X6z(_)i%3Ygrl-Ov zs({MsLFB4#XQ@d|-V4bY#*hUHx>)sA}wX} zlYm4rRwAzLaKEZf z;m!>LGnZNX#j2_TVTi!V#trf4FXE6?7-=hx*I&^0MNT&whpCLhJtf98_TzHx2FQ&g6CqkugqLGaig{>R8?AutND=eI2VI8K;V6b3JxTB&o~2P$yyhvG4$;V#qX12N?7CABE{;du@k~9e3dop7kD~H zirCjR(x;Ei1$(<=5t3Z@Jh?$0^q$~@dOO#1MoILOENxZ`zT#y7?9Y%LEQq06pYjf}@2<1xtS zzWKdmj^KyM0Yib_3lu|GkuwnPVT|zLO}h{3ynJmI2@Y1$C296UUp*EJ#BiTZ7psSBR zZQ-$1hmAA}VPkF8P;`HfsVAU99uwW=DqjP4TA9YxYMW-rs2FVR_2^}n)&okMRR?A~ zliKn8u8XK~z*1uSY-k*C?L0NDahS;y&C*F;u#)^ilBk8iG={Ect#Q{!kWq1+jjz#X zJy%_wm|@>xb8w7kwaynW0_H7xZt#fgKG$Y{U~u^sO}{59?H0PsfTGKQ5A4_gRpl84 z)&?x-H%PlIIR3*6GHH2Mp`zv9$aff8Mx2Ozmv#qzCID1E_h+F7_X_k>KK;=#>4Bc_ z!)KvqO#2o+{~%Xij*0($9f5^CW@WZfnhnyQI`&|S<`jUx^=}JRZw5)H`5|U`{j9>5 zhAvl=OJyIUv`_RC2YoZM&^MyAx1}jugVZwuap3wvXYA8!eb8trS|9D8^^Xf2XV
        zY+1e zJ5YcsD zZMmFmuUqajb9))3y@=EloABCfV*S5>OgJn?SGy@8rRF2z^NhkbhAszhGIKSfR3kPM zgddxp0DUqCd)fD9VV3C6ZJaQ@c*0&{7zYJqbyZ_yu&70RYOY(*eSWj?F&X&yK2O(x zSGz*UXn*sCK*$qB2)ul6N+D!)H-!9}2+98xg#0(g5X-yXxZXntXCma*Ts^rysc#^i zrBHI7O=oG8ydx-iACg{od?bf1(_f|VlETP)z(r6;3jlwzw?at)TT~64!0ocl6V63( z1x5}C&8_IntB>?`jmpH3jSuSMlrAhv1b_)c_3$F}r<^}0VU;!--Y76ho!d>Gg^MZJ z$B>LEyXISJ%03rY$!X@!jV||;zXW+8Ej9$03NvUPQ?Ys+Y@VJ)=R}`XU6>KgU;*MK zaLPI;UL=VT@BKPvh*!ZdkXywwQ1XGboU1~oI}es+3~=`U?M<%mK(iJ{HMQ}yR`eOm zBXIARp{&~*@j2SrXwF{8&zJ%*3gz=mIA2-Qea8CH@`rsK>ob?xGCdd3sapKAp>RD3 z$FJi_e=Yhp=yZ?!W#s|*2|WPyiAZ7O{td`4MekC7mxuhc9oe3fT*)ffpcrmBo~|WG zmCICgqy7`F29~yz07akXoq{)UZ?!B2GC+<2cA2^^77SPPYAwV~t}g7A%Q^sL#MUh`xA1S;+@v zC69!xxJtkwBhSivqg5Q3gpuSz- zAHN(X2U+4(9%B8X;8pwiE(e5l=B0k)DmlLvZ4L1Z+y2H?sWWUV{^TXZ6&O=;EJ_B% zcQINl7igxw3-|$yVlmivW=1$VX$V+D)<%Gglh~k|c}wpLWhWJzi1hN$jQLE#r}pDq z4TzxqMFAn>&WW=WrvYZ0WWa)RJ=3`#Bbqe5i8>BaRbT6*yhC`UzxkOSe@KCUPx#@| zlMSEeFmMjm0GyXmP8_-h4QPa(fHcA0Q7nU5;??Mn);7|$78?gx%sEy4#K}$BQA7ao zO3FUZ?8m`~TI;u|@2N)Elr=nMk-8Yzgv~pHV1d%vs8|=3d@h+HMz|jtT=6j-XmS;8 zmspU4aT7@74hleEax&@JC{TaFCQQ@iC`n3=Cg@bWF<1qgGrucTYPM&yIKCWJN@ zpzlQSLJR^U1-RNrNz!#PzG?l=)Y+FE%8zS|HKe=oA2psEK!0`S)qdk5@}DYo@9{U%Q~Q>tlYU(FBd&&NM_37{p4*HQJkmE&d^k0E zYV@tX(S2D{hfz8|!L0F?*LWhwbxZ%3J~&*p!|@XBn9K5nHF%*F?uzSwhiOn999O)K z%&+QDNBY~6QRwv2(KuaC*OwbBe;IBP-S@F6=B}SH2(u!$k zpzu5X)*u^xp^L@)c9e?BR}RW^y@7MJr6K&az9zAkjNkvHzBkEt{8|kK_#~~}pXp?8Qt{?Xvm;J#kxx zt*rJ?*19u*>m|qs%s_#!)>y)r^<|7hpt|6EKv}Cyhfq69A8lhk8ZTypK$JS= zVKU!*?re6S6RWmTkr107l!eg95SB?*`l~J5QB!kHd-!+^0F1L2Kolz?IX~-F@_KZ2 zOEL>1`_pLyn>h})Dt{NWalZop54cFgf=X-&Ow)&abvEHtG(k+diG9$!$@;E1j=U~4 zU0mijuJ)lJRS;f9{OiZ#(9h%liX}O>h`0*H9|b@eGWbP=AfLIQ6-9{f*Zko?+;Q%L zjp3u=5LY>i6ycjwG%Z;de+V`d;r7L#F>aZwQvT{yn7773FV%pcd3#Y%2;kI5j>Tk} z5mPsLEEWeBk%dt-FGdjmu-~+0G4R%wvYix-%8Fr83y;7TnPhP#$sxkaHVBA$=$t$} za^4N#YR|hFTH@*0IXbsp)FM^f+vn7`IOWp@z&X(zEAlhKIiVFz2g%P5thgB{JO{|g z2jJ-mkSLr>Pkah{X7l1a3x$v~A3HS_PF+p+7*KVs>!6>oI5@Xol(G54k~}l7QsPnI z6+6{xE``(hl(PgOAqgb(AihvmV-QY34EiWwVS(77^g(P;w6%900X$dy+P%v3$iRP? z@5Vxoh(@=$|L)FNp~Wu6ONjEcM=QUDL=|ow`YE9|s$j>XgC}C)$PTU}s-%N6U`GeD zd|)KiLUu5_Pug?;cOC8dQTO(kHQSKzh?;aaVnbqr3K%upjIq1Y?FnO9vP;@hLna4e z#rcl)7O|=sLCGgP*i**P)vyPa;=x=bhaE$;GecjE&JG&ai*zq4zSN962iubTvJkxc z@(9Qxx8m-LdG%G?{e4`u)^ZXAx05IjG7s^8_SS8nM)b@Sy3a{)0Z!uF0fb4sRcmcQ zDt%)@HvED@D!He#gg-O6_epK+{Dd1jOSDI(^=Wx`FVY)hO8iFi3NLc13C>JS?9;J@ zj5L56rwitDaX#X++(a7bGzK2DL-l4@j_=?wH4UkB%+J!P&&V;Gv9(0~f zz7rqd_`9tY^w;{Ic!0mX>>;nXd$}O-EpTX*Kaq-5L;~_5SLAXO*@U#%5>5G6B@GWX zu{DhYP{6^e<%Rbt?P{&3VUd#f4t~b)6 zs3p~|V~XK;_Il!U^rTs>s=>f~iW?C+e*BaWxEZsF6seyJ&+NdfQMBM9VyM zdOlXTmwIsQ`CL@P6)!rD(7Q2n~1yic&xd0Fs z(Cxjrq|H<_uKqIQ?+MX!PuE(XM-F|@aD-tC_n8o#`AMS|dz^)|MXnW}#o}@${oGUl zDv`x7zz~QaVdcEE6Q_1krj~sm3Y@iFFsuYk-+5-PD|?~9iZx2nf(h6qJ3$}B4FPbe zZihd$doS9;7E~zcBL(TQfmda?`{O_DI{phO4V3{!LwFz>+^fW~ztI)4$|_k0*!$}^ zq`aFxR(teZyPn~PsOKE3o^Xv-a=I$ikv%~_+pYoo87jiT0&UjgAU~)Au;K~#OP3fw z2@bOQa%3lb7RGIhYPDZfy7aLvML&~a!=Yk7I}1ztoWfi#XXpXWK^f2$b3ie!_%Rrm ziM2?`4@QW~mm^xdfYL(f{4ygnz7GbQRkUzgloUi2@u_Xn4oq5F?5C(9;f1Om`P6`c z%RLkQWknaX8Ie8^9-53BgHY%6EN$paLywz~_1tRgWtrXm(*8?mf5)o_jwdVU#s>*619tfy4ud zXC^yhInSsSf2KWgGU0Pw$)OB?2ym1?R$`;+vJN^FQCB^jE5OA{+=n*{Xukl!#*hbS zXyzq{PyW)DGsMeM3n7F6Pmm~`K+3&9Sx{)d{hK8q66+^UH)Q}@#D9OVL z0=T1xE1;=EmNE3iguK<DZ@g3WP_7~-S$5R96)C*5Q(TCaKpY>Lb~a;KU&HEO5a9@ZUj|4 zvbtuVuF0U82*f9kNN!=O%L2e(5Io=SSX^11=fkY;iVw$Xz}{EMNDVCDrxQ6pyp7Mz zw@rrFC@e7y`2Z{M&T5DhNXD=-kZ?6Kmt@9lvfeTV>O-O(9_)FFF8v7Sc~v9$1#CI! z-26{72Nlq@TYEZX4x+InZO=I{gq1bw)s04V6AA(tM_16pQc#m#-DK2`*Q>`HwG%r+ zlifxwNph6XFN22511a&~`0pI>`RL>j z6yHZQ5jVn~3Kps2aY4F`A|M9V*(fH6ai2*N%7+2Mu`8Ze@UAEkwHTGn#sK8WGj5&8 z7$^V2_vYJ46R+Y9Y9ai>JWpCU+2~`_!s%&yxltm!*=&N?MxX0i8uxH+d3QhmLI4J0 z04nlLz3YijA&AZStg%tAZIrGfK90Vy`=qcYy%wxzyk0xr7^R3}6ql0-Q*mB&g-0JX z9tan=Qrk@N9ikt>`=)!`;Zt^pdN)UgifUGAO@Sg;{6`CuUCBPtO$U%&@^WK>QbRlE zGqIlv>pa47E=2$_fK7#kuNdbyqF>d99mS*L^9O?`%C_n7AiZz0 zH<*xGmi5H4I>m&Pb(8*P!jDCJaiomL2~hU5FLo68!cv27ZmISs3%O1M=89}M zQj?mOG>u4C7Xum)>Ir%;&^b|+JO(!+U-n{>RIk!9Y|BrdyFbT)Z(pGLbD#TWC#Fge z(upxgrk5DsYc$Tr=Ig>2rF*%8gNwUP`FLOoV<)6A1~_XJoZM3FvJglpj~;(QZ`spI zKyR1fFisMj?~nvHI1SMe5S+x5pzA^4XvnRHg2%7m$vq@IMqUa-UpYLz6g+tfp8P|? zb6~*N2TzWIC!pX79ul7GzD9WZD0m7KJVl3u=k?>iKKvY`;3-z{lpYeE(O)Axnu4cH z!Bcric%C@!>%&h!1y4x9Q*}sqhJTIl^jGjeSxx>k=8*9GHuuQ!1OFvU-UbH>8F^i! z>WtB$lK0_VD&94CTL(2mmQjc$TLF0~jIr?a!J3moDjoW`D3V>Wct=@Vh32s4vkxAJ zrchi`v>5HYn6;Z=l8y8Oe-_J`@MkDBZh@FK2DMdTzM=mROP84u_aWR1ufK-E7$qd^ z-yDaEdqYHNbW34MKhEU@3S%UwdT~vnLeE|YkArY!M=_96_s9L%*V#21O|Hbom4W)` z5ZZdOc`**GP7bl>GwOLS_F#+b?%@~v$~WKq0g~y34x73xj~wzIcnuM}f3 zgff94E%p}RRSTk5aEHZ^KVva;63|*~NG5nX1Bzs~iL|I-#7d0Y?O z`A|yy&D<`R#JPq7S9(o!bOrri7F2uidT26mNrxN{bUd!`%)_pa4i9QbYB-E1A1qE8 zEu}MhdgbS4cA94ZB!zvCF~t3P`G%W@6)rO_f|95F)tk66NHk1mF5gK#;aN!K-T=er z2Cg&uKI8^PpJogw=}OUy(fA4chxX$Ft;~K;ZTX8+wy`e8`ko+oF(x+4qy5{X^*TkVhgTCkZ6); z*V<$`g=0z6%kV}YV|2N!NT28uFYz7elN@NH-mhXM^_?~PGM3?ID#Q~0Akt|kM2ydrYikdYWB%rjKCXKCnB*CM zb2mS(`uP;g$EQnQ+P=AG%iABFhlsGNjCs$tX|A?7+_>7b-?wW&r@bBPpRc3*L$~jT z7ufAP^!JgU@qL(lSMmxSDuOTuS3s{;01Zf>1ku8pg)3CR$+=SnU_o1p^lG1e8^Z|7 zX}xd4mj|;^ZTTmWm!p+JkrHT+*?`Crm}`m-@dH=iCe;xl;vmjvHyqmK^0>qB1;d}kje ze9wdVA68yc{7vl#qCPzji>Ojq8=nF51S2g2V=acoF=d~M-UcTPS-jbzAMBM7UG%H` z+}#BoYFlLZp(MIWTcWE>Uf}Rovc$s+e4;O=c(@XaxjbY3yn8M{mtX-2({Y9fxF36( zKCMa1J)_ETCaKo?eTbp<<{dKh6#QQ`zsodmgf;>#bZb zQ}Z)wd3xF0cE{|r6!Sl4Cj^-Fw){(Gr=t5%i7V$N<1eY%>3PgfAL@&KlbW5D#{a-w zv2zE_TAje#5DTG9hKqIjOe?&Q)*tOOVV1u>iEIaoP=q zRyh9B`Sq^v2==}detl?t(!=0Shtt>m{4>5!O@03=^(mB(4-NnKFrys~{xjsen*Wbh z-?|5E(p>3vb5`MYc5UPU5d{G^^KMxf`$t% z_Bv*9Y;~gvOQ%q<+KA1aix|;DVCxdUg}`Fxf0RS3UrK9mm8bRfNEq8%>}9Ujx(0<= z3Iz3#nCr+t0L|*2zceHNU!D2+kPuhC%sRst7?-8tUFC##eIn0MUoBZ-8obD4*tYU) z{l?@(8_IWl)>@Z2Yo}%+YAAYfyJjJe+ zhPYjaGjb?<;ew$6>NNaagTL$X_kZyB7yP}2zkY7$kzfzL1omp%o(PYD&JkXGq$FFQ zU+n7~q3ns=-*pDm`zN)$E2@&Kl&ZvMQPrR_MOE?hu;G$sK-ugVV?kd^`H!DvmA{d} zlQPTCkjH6J>f4VUJWwRUj?NEF#r;OO6NDu_aUS)Bcdvzx3$GfO3_hDTRh(8Q&$Lgv`P9+ zFpq8|Z7D+cbW?gC~`r}W9Ut)h?`r#h+Kw2g%NZa5sK!V&Ly(+pY zE4qJ9~J#n)oxj;rxPNo#5m65b2}aPUXpbII^inZa5Q% z|cXeA54kA0X z-|x_VzVvD7gz}@x%C6D9`VJ1*aOnMu*j)D#`xAUynmC&NJ+@SnKPnK z+unuBaS8!Fa%{J$0oDwV=KfbDo;mrT{fM7dU!O0dz6ZZ`PXbqH6yOrZ~k}&T7HVP6dz!m9epOV(Qv7}&2Dt~phh1&-BI3B z>#gq7-I@>VE=J6U&okYry-VUx`la#%9MJwn`2kS*HP|n?%Qna}+_SB)#SkaFAU1Gi z@c1sA%E2QSdzht9aa`j(cUip8UETbz6SYTP*M9%z)QOmd1IBg5eHb)x@e+!w2s>Bk zPDr%t_3ybiw{PxYEMCA5&2J$WjQlT5JtOB6UA;3#CZMQh4bu<-78@Z{d#^|o>MzHc+6EDx2hHy(ZGbUgU(fWQ#M-?&bO5b;YCgYjY+ z;?`^gwZZ$zd=HVU0r!nW(PK=2xaK%2E1PjMwAh^9sBwx{-;N^@5GQ3!aJ=^DR`+ta znMfh}vYho;%uL3vMV13L#P~-IEXyvlq^&#|{&Qjq3Y3KjTxa{9g4N6plx)BFxBxHS zVpXas`SZ9!GVWGQnP)Yn2t}4zO{uh+!Xu4Ccwc2TC3PIut=1*$nliz!c_DHBkj4f!ul1>~o6 zgM4~-$Y&s=$y}Deeo(PA1b!?l^nq&sK9zVRJCutW`au zw#aLbZbpk1sh}pRSbb^EYx+VJ^$oqGN=EA#mXMY3A8zf6(8kT-UnPEkTGE|yZ}5Jk z%50T79S1odVhO5Y;d&=5#Qinn&jTJ8g`?%TfN2{`%IlvVl|AF@E@wSE3z79rW=L>e zOcupE8ErcXnOc|giDa^vt;P9j@+)cri1!OM!`sX2z!=tDjtv2VGxNqzTjf?q%-qM7#&n(qd6`Q3h`Sn_DRdW-yEev)1Pgh5tk058}kQ?neQ5BaMC?;m?pW1VE}PypbQ^ zlpLN{!PpOAZCdPm-5U&MxYkXsD9n)Jkg$6PJ7j|;gdO0J`pehqd&B>MiLNMd6NF0M zxYrVNg``m8O1@=_a@`gOLfD%HfE-Wv;KFb2H5j=I@c@c$#)bcI8&h|#q~A)5l2z~~ z8buxftwVeM-Q$JCSfZggT!lXp!9KCwOWomVAiidNVQX*T*hsT}705~T@O&q)L=&cC zYB&V99Ej2glf^$B5SFh377QS4h6FF?4Z6fx1mR1ZnSl#3EwpC|FAIZhxTJ8wPbmHn z987S*w1Nw!BQE}n6YKW)fB6L$ED^ZiN8n<*g^L-0o&^#YKSlZsTr9>18y64Z-s0LQ z<$gQ~I#^r=k0m{fseCl}Q3acm_lM>(6Op8i-|-K(ERp|kYtwbI8V{sN{=@Ad zNHICgh9c>V`JC*7oUDbOldeTxB8M=Gq zF@;9`aWcg;+dDCEhec`g3PBeY5=zYuM+Q_)+ z`2ZgRx;uFao1~ZN=O#~R|5tW4fEiLKr(sTF46cA)knEvnqxo`Dw~&pj_Z2;iktY8D z2`A!Aci5mNL$}cs-RrseLbwfX!8UOBnyyWl(~F}xr9x{R392$`y<9PSTHc~O8{L;}$NbXUYh+=bf4Yme0WjCo6j za?RNSdMY;NJ%_W!4NnV1mHlMpPM(2MH5`bb%wORC=Bc<@rP}#OuUv zxCmGl^SFOPA6McXyiiSx9B-8{-74XCs)Xo^?&P;fpH?!4+LPATTj_4L(|N2puq<&W zN~L7WwZ!@C%#!z$Ubep)#A95Pd-Ap}kn3K5INR|32`2ppW8m&(y&@Nj#Zm&)tly*` zsl{?|PG{O;iAa#~Iejr-s{M~7pYk|ISR{sXnIS|Q%`-sr6<&RXHv47Lo=sr((7~uX zIYSloQv3T*MbUGEs;H-h!jvismV!OntOfWW_?cGR2ObdmlMe`y?S?vPyXBeUmX%U> zb<_{&h9W8|2YQdSdSS;fp{;KL>yU0s5hlsPu0J`9n}rg;wgz}&0dCk%v_wXGgDLAK zE_vi|wKl-_MO!&_=25k^G!$B>ymn_nrx%1H;9L#Lg_$eOIXbwJacbo0| z!)@SB1){UpET;_+esPL7bWHsjkk-T{ZX-JF-UmOe)5N{Q<_sNEtJoyv@{t-7!WHa} zD<7H`3tzN5tqjXriy1#=q?!XY5IAE~{99BB@jOp0_I zWQ=`vFu5FkGmc!xAt2WQtpO2_(((lk0;#CYixgn<_w8k_Fe99bzfdk{9$7XeXRwye>9`}-$4Wq@bYM9ik)v<2Y!Ds(%BiG zzHUcXg5HJpi|d=fqEE*Q%kYy})V4dtzZU?hiDMn9&pQz>+!BP_?J|C(?@_)+|N)WQ7v*WlL-(M7G33e^UT z?s~PWtNe|~8ubNaC{|LH1auEh zbp5B;9hW)e*L;Yka#ARj*tWV6NF@JVO?esyoQ*W#c$8eW#&}3(O^23|C&;0OJji9J z%%1~4y2phBw}nga-tTU=m5kUM151uM_l;L2IwU2>cn$=Rqs`7l8uIPhO7OoN1R)x(JW z7eCs@r4^VM5J_C#fi2`IVF^sa2P2b`%mRZCKQY|jD)Tm5;?ZKu02XRSOXw7-T4IgZ zO!4GpHltECqf@zZffW3fwd??7M8EcXUh<|+HEyLs*RL;<{=ib8(7n$p)D5TEgDqwu zc8n5H#A1e~u|djecF`cKL8J0ts(~%EiyuKJy4T3U@3a@swNC?Ij@Yt-E zKuZ2@BE7Rk9~i&OARUPGmr>p%=}hO;?bGl5hY(H|g!+9}(N<%`#nO=P+4?y)3FOhumg&>GuTnmvNz_mt zvPtNl!!>E@*h4fYMQ{)1N&gH|bG6?oLLN_Uk>pa9<3zaF&}fSMFlkv33x9Sm1DVBqw{keLe_cGEC^XMz%ib@PkKruV|#cj$vE9pVn4{?(3W>L zC$r>vYd$8?aFXgqPPyVk@00?a09sOD8aQp%1(+-az=^aZ=jw}v*f1ZShLdJNEO08f zEXkQtpf<~ooM}lA)Tma=-sJHa@`rN?>4y&nV2&@LaCVhPxs{I1Sn|APG0`{Mw|ZM} ztRZ)+tC9UmhLdIimpqC&5eu)y7XsMiu@e?Rhk&^SzNM|d0`#(gx*hTsdUX|P8%@KE*;tam?aMa|J8r+kZ!*U1A?cB(1=_da`VFFcJ*^hx1i_WXgC{0qzMoIPj@s8YVc4>!%X zWr^?AG5cM2oQ$FV7()&tRpJlGZriEiw?oeT1zy;+>X1KedSx%IH?kkl!dFrxycE^J1%VwBK&u z=c$4f450Z!Dq!0lOY4&$co^UF%w3C3v^EK?$9@2gdAN+&U>7O5;|=E~T5Z;YWK(fH z_5|BvWIdqi>m%p3?uNvQGbirBM}4DFonKKMkmCe=?EcC9)ok!fe8o4;aTj8aOWcKL zw)X*dxY4=Zu-j|HW)ElwN-fwjH~0=9Tp|EvwpZUt=%{NS4FUrMdi(GT^Wb0Y4Un=(f#W`hnz2HVs{$$Hb3cHlX$sC|P!q6K_ zdO+@lAc##ApAac~WzNH!T<0c=zV?QnV-vJVq;~VHW|n=JF>DlYiuoARP2OSW4y9JH z1;kESoELL(4pAm!-mr?bG%D$NLmYgnoYP@(N(ReIO^NsRli@5j=k&~;UYzI8utXNu zr|#ddG3=CwWqrtqcBRI-khF@8OBlS)#xFJ!D2a$$!(%NC9t*$g5;Tvc@k=*XcXWyJ zSIee5$rhM!N2EV^!oHqfZklozu%T_=>TPVNVl$>ZEE;BM8ab2_j_+ThSO0; zi|ijyHc~dEL>3cYSjdJBaq43VybJ%zabt^9tC)G}i5#c$p4?E_DMroi#vRlIpgmUU zotY~c>saY-@imW>KJ&8w_tNJ_eI4{^+Y}wjqZzjxJ$)W2ewVoa_u}{7V;uO+w)NGH z@jv}&@N4a7!HB4O9Exq%NjQ=Fp^tjPno{&D=xV)2bG#Q#D>QHTU~9}1@1&|=zRa;; zjTpZHybp>;5|}&gb2)OKU;;Y4)Ki=OV@h8advyr4{v0}`!2sR40}GZu>HjeFE|`rQ>p1alkJcw5L)~*&e z;VQ*aiY=B>Y_&y-14~JUA4+Nf7A}m4qAaG%5UzDZo47C@FQaE z>&}V`*1d6@K}4~xx$=yIMXP^A0yi5}bp zxHW2Qev(Wu0IUmve|Q7Lq*||8*QH+sMdD%@F@wz1B z9E8g-MwG#fa2#-&UokJ_hBwo( zKG*dgE%~3S&lz*=(csr7`W&A35up7W?g*0{We>?V+%%l zt@i|W@1|Ngi~B&CC21&8frC<7@Nvxn~)q#UGt=Io9a&;WG|A*NccIX#y!SJSTs zxH{o$;Bwu{$Gd(xK-nWK{tY>x6x3hb^0AbB4tpDU^Oylw(M{kgo*cOPvebIk3!}UX zfH7Ho4ys5rcMVH`$TjLeY0gu;_A0hUhjk(**6Zl~|cwwobbY>jUlun1qvXd91Wi7mT+1OV*X_F6k<1 zQ|k-3_dkFnaL!+h3ml*)d4`YJJ9yGZ5D0&NW08RK^Vb z;w|k`rpnl|Y#W5f$ltK1r5H6~gFz`TPXs(_~}v z8aE5&jnycetOWIfaZd<7%~)`tRk1%4&;^xvQ37j{G$oDCZtcl3uJypf94*$TQfTAV+X74(0+bv>?Ds3=2_#nco1jS3U6?p7L-J!1)?C^W}}R z1py-zL|08Vra(`jP>l^5^Mm)YE%iR2Z2|A#bfR_}6>=#(Uf({D%aw`eoH!QNqPyGB zt-otWcdP(bu!@lrs1U6-)~2=2!WsvmiJG#&7{_DeP1I(c!lgOtG@GRf*b|14GX>SS z#Fz%~SUV~d9ho|k9#3-#NNUg1{pyLtfp6@2Di!qAD0rgYsXwoG$bus6-;JZrFxVR> zEfwm(HaBC2+mAQXjd5;9eVL)}8$LhCVh1mj@>=!<*t(y$LqT-UQnYR@Mqfkrh0p^3u)V#xHgV=ofxLEjQ?i{2Ln zoB3{{2b*Q3Ic4bM`}qo6z;KG_jNpucAGGXO7+(sn>fdz$rX7aLSNQzEH?tQB#`;_5 zmDlY>KMD%5YE_%cda&(XfF!og0#x5;0j{stTBk$awkk!(3lLSo>BFs#z&5hMs+e9f5PU_g;S{wllFfD6 zEUi1Srgl!FI??9{VPi{XH+qW&n~`EtTZ-Jqf!x$SKTsZw^TGS^U0++682qFRyq10S zgbwu9rQNd}FeS3@wL6qaftty~8?(G%iR_xe;Vcr~01y)gLEBNG&a0|lZ8xUq37a>gE z*o4{AjW8_=wA;Qo$oOq~DGe5!t6lMN!(f7bnizo;N5@8BZ8FjTtcgrYlK|#v5MkJi zu0KUYK%W^se}yFsM$c1sA`hN&l7NJzEe1*St=|r?iw^%7qoj=mnbFHt1{Ctg=j=kp zrVGKaimu(LhSlRg0nzI#_H3r={>1kES?;CRE$v;%s0_Kua>4`zIBJuLA)|^vAF7J@ z?PxSK3?CS^%H!kj(lEu>pgr`Nf36t|(7=jmgfgRzHh2)0MjQyFI4B|_NRK2*@nv65NpU5-T0A(1o|v!8|9XQbEkH^Y~t zkUKkt+}SDQ&b~KY43Infh>&}Vg-S<(DO5TOjF;MQ1pwD<>2d`Z29EH)&j4=Gmkpew z!1&z(muub}qA7Z7fm_g5JnbACP`JJ0z8{J5kj-pMgBHIKB}q8JSX;QsF5vKJcVs_O zw8!5)5#DIk#;Bm-f{HM@Z}81IMr`(dC*`}6JTWHj$s%S?3Ht_+%YyoU#<)P)_=#6MGvIrf&2@;qKa3I!DKPqF1e9COz=g72k2r|tsMJB9z z!;+D@ZH~Ly?v+xFY*bi{bXH>`Rn5=bfr4F;Qk+w1*10P#@=hCowvej{0=|vG2kk~* z9(Jj9c-+0aYCXwb9dnq=-7&{xW{W^c88@fU)M!4)kEni1^D~kxe1%o37JD3D?3%G3 z3pHmsYtF*w_+pF))O?~{b5Tc?+Z~A3da{zosc{A4 z;qb+XP}8b;myCENQkZug&vXle&8X76OW4dpncmI2@>K~l%)3aSC~Km5mr&)n;CS<{ zi`CaA^R9mk%jefd^Df~{YF=lxiX)-g`=#*FDo2BP*HCpgj)^8g)S93bLYg=4lGz8# zBlE7)RElC#KZkc%99Z_mNiUO(0kF*Sql3l_oDbjFFL(Hie%`^2{b(v3W7c<-zZ|Y^ z>C*l{v27{VSxV@Qt&5xvNrYLWGx~X4k)aqpWbDn4Su^EtL9ZF|H&!^PP?D{e-#@+k|23J*K{_v_o5vCmT47QZdm$d}OCHL!%v!5OS#D8IDD1m=V3H@7? zK&zGuNF{TP{vq-d*mK0aF7dTlO<8z8EK0p`0Qx#Z)&qDLvr#Dc)XB>Wd{1iVu!}#fS4Su|n@so2C zetL6&^x**UrQ{oP_GJ_S)WFm~j{mGb2xQyS91!Lb${ry6=9Gj(N;Kz+9HS`IoGapv z(g&DxMMP10O6E(6C{#G;JpcHjk6@Z!C}g*B(W-h(+ZbO<@Kwf_y21EjJ@ZU^d|_-w z)!3rt3IjT&zx%ZDbwARj##hm2jV}&)M`{^gg!nV(*Xx0-Xs36q8ebi)N=kW(aJ$0i zHb14rl{1ZMARVyzE;9Qbv_L*;g4$b)do=oNqGz@9GsGA~ZK?^My)J8J!|P8^|#f1S0t z>Jm_wd|u4jV!bxlSzDmq6_JaZbLzO}nM2il=NxM6<>Q&~1L>VfZKP4eu;x47%p z0WLE->~Ek~xRT_}fVHIq66p`j=${|5Xc&8gy|;-$q{@tbn<Y<|3eb5^Pu=KHBG*72FFoEtct1#hL1?wWDUk70z5C1!| zjtLf-b5B-xP?PwZFYd5X2NoD(KQek^yb@@PS9Zu7jlmF7VMT!jJxZLXL_3VcV=)g_ zavsciX@G0$wUlS^Hs2C{XJFz(RjF~7A54y1V9$5Z`130*Qff}j4`LL;1L!k{;AXTo z+QBKV9#fo+9ia7}02ykBktaj9?ut}^ddF~vfMe6NJfI19Rg2zojA4wzW0?RT)X6x+ zebQ^8*liW+CUTRgjzounP#G?;dd~=P$A#CtbMJ$KPY=nnk z_VU|z_)d`m@)~!(@%kWaUk@K^-1&~WlT?47j#LWw#w?B!bDoTtm+fM$8DS(tOtqJfy7$hx}AjRN2h?)R;WK%vb^z^ZdSNW;tJe00Jr1I zS7@=P0Rr*69`6%>!-G*<0J|o}eVwK9zsR;}TK+$X~*opCl`fdxIV{LT8uKGIoA8m0cpy@~~!${gMX_#F6T7m^~nt=g!U1T*Dx5cQan-%-sU=>~hNPYv51?nlJo-8Z& zeA|j0v+UZSih3vD4T#fHQIoH{0)SZ$%>F2W;Xrb`UI750D}QspnHI-x!jrU?!=;}x z&%B}35pP&4v(yTXMN#?I^$Ie9L4hpM9%NI>1!TJ)UyvII zzSucY48;?x7$^x*Omt?zmC5y_mALxvlh+xU4RycQpDTyhb&0QR)Cx z^8j92*^WtPYj9+1Q`zLA;)WvI61=psfh`k^njoHwjfPwhd=s}Pfcw(1U>v;Y;Z?9) z?}X`keapwTp%E&+HdyxBOWI;9ahetdmm0471Bm#f@6%@81Ehc$i&M@6`Ir$(QI~Qa zfOerl-=O$I5h@8z+QB}Cyija3p5X@&WyXv%av=p&>aP{98Vt{bmi@}^N}KvUVvI&1 z1z4juWFvKd2r(D}#lsuV;ue60!BuDZV(Y?wl-QJ@_-w7GuY+^xFe4nyH}hYHUIpcf z!YH+VFh+ClQj;+pg@=&2tZ*}CrpkfOx9nFK&Ufr z+KU;Y-ni)_T583P)%-WH&tKmBe;&5j%9J-?l6!*| zSSY_N_GA$hLP@#0uuD2R)8`6nEzfdpqU@1q+0)gPeq5&JTO|+sz&}8iL0%RG1Gwnb zd3aGEclmTCY_7y0K@~j72cahm5(K!jx&Xh3?bF1BYGJSm^~K-20Skjju~8j_AapFg z#Mk~55<(={SuIPA&Q^PQVg7?6l+jAIkF*lP?vG6S4_St^rWPNOg3jsyYZGW>e7Dl9 z6Hjc#+6R0WeVQAe{2Ig^Xev$aA5Z|1zr-&kK$dFER4hb&_HsIoKZ+X7+k(cBiYtpE z$LkIg%wVt&NTatKL+ote`MAx)kaLz0K?z2$Nvk=G^rh}qI85=$Als^+-C5-Y2Ls>$ zP#@>@;R;~A^s@KknrALlrHw= z*V>k6Ne$K_)bi(6`#r9R&wPIm!-~~U8e1UjVrEcZSni=yLaf|{OZ@!}U0stdRUgL& z^;mBo)m%M|B?5Yv3UxcFMkQF}WgcUpmn95e(yd(xUI6*{JJ^ia zH8wZ$9YAZN?iAzFyoyUP*F($%%F2i`aKDAb7mmbAp$ui@c8cwfebG6arbGU--T58z zAN)7H@w2u7jZokMmGE_WVLYiM_5#OH^jYs!%bfZY<&Wu$dsLPnvIK^!w1ZX7NizkT z*)xO2y)Whxp^ILmUnY+ekehz%b?d{EFN^~rX2)Kjng=!V((e^rz3z+&AcPyY1cv|8 zuDvmNPTZQ@)BXGl`cOg*VT$4aJ>fMT<>;;m2ZP!iWvtvB7ICkuBPqERT^ zR=z>scGD2d79J#!1=b4~RE)hdotZ=fQNA^NCQ#)ya!g-4PU69sK~(aW*wHZJ;C!r= z;bS^SpdEl3BM$(#d!tMDM&84|Gbte1Q-6@q0C7d&;sx=?H}B~x+%Ry5DiweSvpxIz zkK2di+wtewXSY~6Y_h-DP0de>Dk(h1G9raX*|x8<#rBouw0%*Ci%$hmU>t~UsBB-B z1+@ki)LxdwYu;=srm!Zymehcz{7_aNpvHHQIpxkW4~agjHcz+Ol=T$$wL{c)j$K%( zfbMpJP8`M`Mdt(bzBcH$cGXY~rp$Df=}%GW0w`1NK^9X9M(BK6C1@Oa0B=bPSexeQ z$|Ts#vi}_2#-P}X)Mr_yLMtY&Df zF?^)E~LX+iJ-vemUo78<+LSM)LG+g#zo(o z9M0f8P%SK&BpRv!&K2sXx2ySb-hjFNM%0du?CGol#>tK&ITm8*@2gJsag29s{1RM5 zhPZ*09(2cXx)=j4YuerI-nHhXzT(%*UkQ((B=;MXS+WvB+|=H6+EXi{+c!nqhg!RB zTfoY?w3~lsdOl>;z%Ez(@!J)cKT2K-<<6C#k@*}uGp6K+CQAEGMYyBE?eApk?HEsB zw7sz6aB~=SdZWwtM&1W)BH*!pqxbJ_?U7~n@UY}L)xLZTqhjMMv3%HJb@eqh~Xs4yz$qN4R943#c&&)w4CqU+gdt#RT5(PvPdUrG=7?$ zkj6Dy`uvHXJE0~EI1JRe0`<+;Iv~D~5HAA(eIKx%H|b;6slVZ%54_HWsLBv7DR@ss zrWOISr9*)16#d6P*#?F*?D)eMv zo;bHq8)cc6!e`Pyny42m%)z#>9E=KZtDo3bm|-;QG%?dXl+lWU@jn78y#wFf+bU|k z(-gwdwihv=INeM_I;gErFnVRfe!1N_|IYiqYpy?3eST!O`({s~76~m|)x0ZRaH@~( zMTb@!kBq^d9r0giK9Cdc(R?5fsj-YlTI)(ALEWf1GFXwN(sN#H)&Bpf?}ny0)YV8E zf+9b07v3+>o?aGveflv*)$G#8T+J@m&=tx47z&^j46x-aF&9CBMv2-bzYjWY(O}V##bO%GtqFI4G1)@Q(>5L{}?}6*W)Lf z1}x7s{Pf_vp5yV;>uQ*-yon@A0FWG>rGQ0Wma1_rz8tFEms{2Shx*QTYcWP$m^&~* zfw1|&@W{ASDKy>++&!JRRgHdc&BbdA#!vO$nxcwK**b+VZSO6ckIM2l zZ9lW;3ycKYach)a&)I^9gMGEUPSDYJ4qq+1Hn5JMWeT>ZjakU`Stb7!LGeX~u`p~& z74!nLOP=@t$a@?3sETucd^cHO1FO5>DiNZtx@wSU6OA=7p>7}v3kC=;LevPfr5FV@ zhFu8A%Z8I|av0armR4`Cx24toYOmf~>+SWunhnY#Rs^hXtqN+vjf)yy3;~h+zu%d2 zb~gd6TD|x8|NNrtIcLt9XP$ZHnP;AP=9y50{yjs^X5{>?XohpqZCQXPp4)OBIwefVA5{n(H@f zj)(6TM(u5E6=oxuJ*FQ=O6?`N)lA-)<2%gjIPZajZ)BWHEV7BK?8O@cr|9F%n7s&6 z>tU1MBu0xBmPk$(RM~8d#CDS*&I!HW%L-pHm#xIZbbpWUK?VS}V}v;$rXOp&at}%M zhxwv-zJ7()k)cI1a8yF@UoWXYAH zqE!C?%AxjYrnB`ItldMjg_k_E9=}fQH~5WAcIjIcg&SoxAnKWT% zoj!V>q=&PmgKt0+=WMLu{5MN~XdQk_9->aZ=)%ZkkKV?F#6>}@q__q`eGC!PmTsIU z;+8lKMj5#bf-E(FkBCkqJ!4!5%wt&ZkWu7y+ix)*U0YPggBDZT{N% z;%du$oXXgqp*;tlI2!y2hbwW7l41wV_|f%nuZ)$?29u!e2D2tvH@pv8unis3szHgH zv^UE0H`zD?#bi5XU|unk21o|SAv_S2c4A9>-GKLdF+<=zqNc(eM(S(aZz%AHu}4JztFw6{6dOSdhzU(+K$d|uTAVFxtL}kLOk^`847gst8h>T{;a+{8z7hGs zJ8jGj?zZWO`(wk=GS;4wv5v(#FdxgXJU5)RpNEV!wxK*||IO4;U`J^lPu?6Wd2^yI z`eA0%E->U-ecETfIAy**l%0PAS{(hKa5{$~qyC!K)3k)PI+$j1_0D+HuRiS6_SiZP z<7L6~dWW`8%i0{Atsh1a#Bx5;>7+W*vG`nr@i>J;ZDMEcM{P{(xVsKn#6;Wtn5`^8 zb}GwgkQZA}UIzZaqP5#P=kddcCA1EDfbx~2lk|as~I))zl;m+Ntg(SK@*8Y$cO^0JXn6$d~ z3nCLcBOMurIUzFZ71(2uN$)?$!6$KZ#6N&kKFgpomxDm%@3Itw$~f>NN#Xg5!rxUC zUZ^O%NM7tD^Z;2c96XP>q{$PJkV%RZh2;Gipc&%D&#|U<{zH8>J>Ee3F^yxQQ zrcZ~V4)(t3+MXQ!op?Jdh~tHN=b?Mx?4%Vr`Y!D`Ki-ghFy37^XZH1SQo3PAZ=qNH zAOGtLJKo8Nx?p=t?@oNbG4*{x`-U0Svu4J%R{0s>i(s}`!9$E3T*ggiVhB;A5M&ZJ zyCB1II-h|CoF<=;i>sP8-TwGXrLf%ri0-%1c;Afd7RyX2X==n&k7%eBi|zVtd6C;( zVp^@`BYjt(*V;V+4GXQoEWf#+3prSEFE7hhR*T=8N|amTnFahTc<_0^%J%dStLgJV3!5 z)A$S1F)au5Ij0bpP%_t{{sGqALHJxW0&7ym+0<}j#F zJx4#d2HPw#n_epAV~$tr$yEMdKEjVb{!yYgakUs%ix}g2y+hpy9QHG`yCVaU>;`vt z*aCwiQ|*Z2Hr19GD5l!94!0QQe016OB2|Zcuv|=Zh-pQUs=>YB72u6Efq*S^mDLCS zGj_A9v!K-ZTiTvH#YHHd5rTYTyeu1Y22tY>L-ftsyBR1p%3{Z{*l{d&oK0(IMA*7K zF}`$7$Ogvlj(WH_5{9N4?u7rn*F# zJL1>|B@GK!jZlG-f9W6%l6tKMmnDltoxndcl50VzL{nN6~jPGG}@sjx`Hr=44toN2-3-Sg<{P z{1hu)kx9UPE2-it}pFH6NF_5z=n#Qg<%;`(fX zVAs$=#Uu|d`2s7XlXAt?c_K)CwGa#cdDhL=!;|Kr?w^BEiXx5) z)@=elh!OWRv_Bw691|lmB8>%H{wf!G;eU^S@J^>k_t+w9V5AspL+fqS>yO|d!3OuJ zF1_+d=zB#+fw9)%8($o2cuiEm0V;60m{g^|l+J&ba}n<}9rKl@|3KSt-ZvFwoK%Gj z5qA>;+7!PQd?Qv-jap+KRR7aMS#gi}$cZEz5Q zS7Q}*3Isc1saW9_S3{g}Lv6VTda&}1yCQLYuBgaU)b(I`u{`1!4oc=i@)ttp;K<-i ze8xz3RK1I=QR`k1)`$Dth^>i4A`PQ>E{)jABF!x!lv(h+fIULBH^S+O{OInC=+U9E z^3#qGBdy(0R(z;om#9#f!D9}9ya~pLHI;iGOT?sT8<@Mi;BVTBLat8dp`1b$1jo8b zXQ}ztt(m|J|Il=85!)*3rif#43ZdGTM*X9L4>6AV6+Xt0hItb;082dY*8{QPA-6(Q z78XC(@QzrSkNW1~BrjY_MWtIz&K5W^4+kNO*&ZO}6EnSdDiX7EB~fPPVG@UBJ5Z&Z zC21>*EY9YC18D0e)GFV)4JuI){`vHd1%N!52vSQakJx;?UzI|3dAPCQZ<5_o@&{wJ zAE-z>R2NhXEjDAExTUB#0s5`XPvMDg3W+NY`eOsn^oZFAmqw2pe3XYv9%_h7E=h=R z!Xzf#6`_YPupQ+!`2ip}BwQIC}7>R08BktCKnvoyP3dSQ zQ3AC3NNrOi4idn4l8%pWBJuH8B3pe)eR;!sywMu{WX*Ei=LePnhrB*`EP!@1OtL~Y z$Rz0!MH=}41@X*D^f55*w7$F`kyuV7=%k${KhRi`7i<>-mspK~i@)K0b5hZdf0Fh= zxiYV<%&`P61d}Dl55O~nTcS@ms8qxo@iVSuc22{);2_AKD?^O6bq0)33*=nomKFF9|n%GHAUAk9cpy#1&D99*b9MmDg~AtsM_vVf^Rmy z$4mu^Kx)3A#s@>+0~P$>Byc1b@L*kVR!3&>{PJvuhW#ZJI@!cChSL$)`-F@=cKO+_ zif@ZY7y(2qwuuRIW40}*kLBFqVz3dYK5zqBK#b6C_gDhgJqlQSJ3E=O??4#unSoGU&)LS8-0lH?kS}0I zg_6yYjpj)^Dg6GxD|!YL*EUJ*HiOzzZTebC?SjNe ze(t#n)E-Jre}E)56#9?P`=B=_9V4_=9*Ch8sF}DmC%Vf9N@iPM1hP4i8CG}_P<(TY z^+d)~ym;x08zPw&e2R(S7^x5oOL4Se4(gCwGI-IfSos(^!@*TbP7xU6;w)T7$Q&4% z>@anJwux|6T0X{w!emvPEx!X?VtfnU#OUp)j$xMifS57Hh8U`=pG7KZSpvJ`W4K2# za{7k%m|u>`ZrP5Jz#DXF%Yg=O1Lw>9B`2r!spzO}`otqZ-+_^Aklq1<>r_4>Pb3D$~55rc3#fK``vq=liud`#=T*dmsugPyw2eyeNJ}^K|vU4o>jp`g_6F{u- zK7Jh=FEho)QwhM6^gA#%n&>^E(T#adaZKM3xEAwYY?|@OVHTe3VoDwYJ(V31OSlg^ zRmLErjJNzOLpE#ZhU#Yw$k=Z+#im=;1@p6#;vK>J&54L1PcS7mtc@|HRmLh6R%#k7 zR=Tx~?!=k%*M1J%?-U;lV9Drs_|9>_4*hKJRTLN)2xi>}n&5g-3g5*4F(rrWkV$!F z%y;6X6z!X^Zo(tb*-T>wR80#1{Kz!Q5CkfV==Uy@-t^hY@dq#5h#>wBBg?u(?O-A@ zMGA@u0t*Y%-QucjE8j1e&N%}@i$<1b%CRCjAIX;TfTl$lci+S&6XOs?=VY_@D2io1)^nPs)OnBW!DO4t0DQ`$AKiiVC_gZ9X64md?% zT6>#~QJA)ftdh3pisg)!@!Fa{A_ay5aNg*#_|njaO01Cyn2(6E9#UyDzFAOR?qA?9 zngPwY-j`Wl8r?n6x@AFiAp(0~qJ;osnf2Mx-8Sp13##)S)_n`=L5Ejy2)A`35Ej*5 zOesJ_Tg1IaGyz`v6#qh1!q}D@Sy`Pv9ty072Zrbvxu)%hs~SS;#$4lyH*kEF1C`2e zv;)MD_)f`VV~R#v7Bg%y6+}5Yhat*Cw@Wdec_J}h3^9(G*)|P* ziV*J}&LqLXe~a4ov;1~IV+6O=|*%Ac%(}>VZ0j zOrImO%$~R?a&4pfLKJ$@i|nGoMgC~CMQr<{@7t`gwHU98u!z~iv!7`e0BKp_r2Oto zfaqyUyoP;4Tj{a{ronV!4sMmXVzM!~t#tG;d0hAl3>N5Ema#N>sKISM1~)Z8VF_z8 z2RC`~+q9K#3wF_^pv5Yc+OZOjw84R)mHC#y<&V+KdTym(OwJWE%W=@hsI7YW;3IuX z{o}u>QrDERR6D5?nqR$RV`aW!{xIsK`mgd=o}+I;|0;rz&zID!^cd@Ds9O%KsT)JV z^I=QXU%-O+H8$s?3taSqdtp>UT-PP8%hs=PG;OwoATY81#0U+{PBRHzu(rBwx43e706d+C-LU?fNxF!^$Ht`Wrm&v&_VSZNlFDTqrOA zhN{H*FoEhFz^5AcG`QgK3N>q=nARnxW$V?BrspL-=6SUlun?;S$YlGf`lsx8;|kOiavCSJsIl*Q_rq#QI8U zBz0^Iz@y*X!}>Z=Uo8Imda(NI>q@|33A5Z#*RPBUD=Vw%PvMcW6wQOC$yp8J;3}6P zU;{|u^s9x(!HIMy9<)>0DM_fe{Pvx68~_VQSV-`xX89h92Ff?mr)kd}DS3_=H%Nrl zb(*=rAvbnO42A=CDToyx*$0b3Oa^t|5XuHvnWMw_=COPmGW-OpJA1H~e{wlTxHZ`4*axorce zU18}g!i@Cu(9_jEw}`Rbt=Ss_jzV47kier<$0Y0L2lh&DwAawdPh1&rj0gEGtW;}o zAo{sCaVdWRUs6mtBm@3K{3-<>895=f#5=ZO0XzmaZsbz*jVz6==I;^JM*t{*cB&68 z_l}OD*$S~6c@V^~r6e5rB|QC__W}f#>$rKEqf05*$37ADcCpy;q{Y&1IhXPE8SjZJ z@ULp!P5MVcTg&rHFV_x-oUJdQ{HA^Q31w|_Hvb7X+*Q5LdExWetc@^_4s6| zto+06o9fPjEoNc@mXr>55M5{UUk6|fPkqUTLiO;(k3l*{J7Nl{$nMto^OG1>W+&cu zZbv>~1yU%?*5W%9(~fui!|hY*u3w3PTLHfvuTrJ)!{d}TSe3?aJ744{TzkX#Gwp)I zaC?Lo5$o@>@%BF4Iv=&wjKO$fS;84%5surde!yx;T!6K+KrvU&>Z!%wc09XGef2&G z@p^#KE3ml$K zgwCh19wR2$w5VHTp$*&d4ldixVQOfpgF}3M`k!tSHQc0Nv5{BS7#$@2LlrfR4qs6%3@!^HSt= zr3#>jVhLne$jF)pzu6?L40?0XdDjKc!@WieW{WeRlUCdvJ~% z$#UrG0~r9p@VmEm_ae=&#}eaEQ&WCOfbl!7g42=XqknqV_%bNGNVH$shQBM3KIT zbiD)ibV+)CiKkp9J}CFwg0dbyDbmXqiuBB3kY2(_kv=g`-_iMdwyvs9Hot6^n~G6y zSwypx#VEppcfg$&)QEA$?CO@4bE#WaPQpl5&bj6zbl5*YeECsKXIZMOxy;fmcb%gw zpL(k1GX<+ULb!12Pm0UwG8He3YuZCp(Qv3@YV;@#cwilE=#VwFpNdems7F6Mhs zZjnZN#Q9`sV}LJT5?wfG9gMFV+D%#Z(`e^K07T)Z+y*H8hESRfOcP5x0Vye#DD;(B z%8_E}G*c|`MN%yJa8xchNA={AFozos0)dGo;Vfvm0eeY!0ItF7u~@wA1E5Ftg=^*v zp5!+`+?FjCyM_B_&U-r=%0L2}4vRq7-}m%_lo$-5Pb3y|d{X&J$_^|VDcn&}1?_l} zO^46b-sV77V!H9(AkXV40$jV5mj~7EcD2c!TuXZ6bNLb^$F2OFMWg3^^5QP#jgs*P zYv_a zrhU>BI8W;hExEYqAU+Ib9S$&-hSaL_pzvL|nMz8~wd~}U?Tv#Y<-=&_&QI_xKR;&s zen4@-BQGCU2d=reDn%VF{EHpCK>*0WG<#7psrY{^nbaRc z%}Gudt)8FB*+imJgv?uB>m@nf<+EFGstkOy=~XP4gX&_9OgnSgE1 zRUbkwIagIgGVO`8;Lznx<3`DfO~EYT??QE4iL=3rKoSj)t<9;1e{RKx9N8vuR_s5b z?Ugxt*fNRpwDumAgR7=VR{4p_F;dN=9YffK`On`K^Brh{UdH*|k5N^LB#cOy-j!P{ zUlG6azBGROm&+QN_+5Hj{Pz9$Yr?NZmG&j*H@z=@=N=coXZjJ^Z6IS|sh$U$MP{s=O&*oS(+29A_B(1WDz3`CTxaORrAn zsIlo-!d~$e@q1;Nq{o-Q?_QOo4}OP_#qZZ^)2L|RS9rqy=uPX7bgM}AuHPtX%shsE zp0pO0Ap)etgy_yx_`&Hxnt?z+@5}PEVT=MJQZ(#rrBrIoP-rHWW8`Q(^CpHoz6ImP zOiXfX@oy-k1;qX{*GjRUZHj$qiu!jXro=u?QT+rwO+Y-%G*=2hWu}rQDGEbVz_0ri z1$?35&Xux%D*3)JNwHg8usMl}1JWb^$HaXS1z8c`%)^y&lccWfDQS)00XdrPl0O$8 z_%Omykf&Vo)l9+$Q2ku;=K>~;1=YB6?S!fVrzsq(`FVWj!)mPlIdp-f3Q^G|DvqRK zN1^$@g56jHyCXm~g&h_Oy2PXda1q_t61-eoeT3Ipj7;&Lt@HOITd?o&?Tk{R`-`s~3 z|NZM%;lFPjyN=&0>^?g&{}mbhmwy8On=(o9AMF@e{wlOMf6@N6FyO28-yj1nRlw62 zuo{vGYR`!n@Fyo^K-1s*EAd~v^&95Do&WJq@ZUF%-B<&=e}eyBn%JNJe%apnm#;wp z&b;LtHF&s-9_KAgH-}TpjVmz*C`G)zi`T@m{_k0z3_>E)t z@V_hUj-FT^78~-g-~{sUO26VqELoW2aiR5VVaVqee1i;Gr+}vkL?1+x5{M^c$j=dq z>GOZXe+65pCijS$TnJJc3{C!l(+YaAzwTvie{0sKfjL|T(6V}hgRlVb)Aqy^ym-N; z?GNX-XYB}-!A!WMK1P>x)(6jOWP*#XN9qKZMY=}{>D4Jg8h)0*`b!U-Ww z%X%FsZYPS<@Zv?A_6bo;1j=dTQ7F3fqy12PU!r(8cvgQDPu8M6Ffhdzy}7$r={by? zSk@COJEBw_weiHX7qEY)#aq4(`j-bU~wpc)0AskpGjeYtjs5181Wyn=J?Tpo62<%R9HZ!13ViNDM z+o!7q?d8)q(fD5+Y4-k*;FLB_#ZvD2g<|T}u@2cWZl7U_WmxDn_sEYsk3tqOe`}B@ zsOQSb0XMPdmB=y!7Z+~{xSEcxg4Va>#->B^`d#fP7X5UT#m2@|Xypd&J!|KG0Tgg( zGjPDItUA!Z?OK(}RZ)q}vqwLX21;l1kC9EoDhob9T(b?GjPF;_uD_t|U!AqVxvt!M z7VpEn-vFw}_Rjj)*|Hwr53co|)mg$SfEKI&%bL~WY|bOR?r_#oXY<*(<){CGPZcFa zeJMgKQ>$&}ni@zS;suB0fn1HiQ$E6s4b{96Np(nS<`;^nbtEdX*W+qdrT0~C`%}Jf zs0Y86^|+7OUcw@gb}*d(H)6)=n0B-k%U9k-!$9NQ&M`m`aTIe=wZsx2BTcw}l#!+J z#HoaVw$FokSzbv~u!&2eIR0=+OOg-^yJgvt?s0*sa#U#GREiJa3n&AmEIT;8D zj;GWIv3T(OL#QeBR%`4+rFd{`!YM-6Ytqu|fu*;gJuMn^ z#4tiPOJg;jBu>V9p0PYiLaO(qVH!^HKiv0`vRP}wsJlUlKHWszV=fu7e`$xX@%$ZD z@E*0Wb%%7hs3QBFpWhL&6pnNtMWQz|74Z2g!o)+DBa(O7i|BXTSNa~{trsal1TpGj+fbl!)C z0NH`vhJD*1F&KvQ4h1qfLA@H-<%9DIWr6wfZFQmwO(hGw!z@r55ROw|b+W))P@n`- zZBB{lqyf_d1P~CmbT(pXO4>{Rm*n$`<)(b5cSE8&T|SRfZB`1t`8@f2&Ueh_J3l3# zL;J0r42F9G5zS&hM?~KNT+H!Uis(nIUqVEmeaIBiKSj2rh+em$^Hw~65fOba${!37 z%~~X-w33DYS4e48C0$CZ@#Ax(^iRK_lz!#*uUSg}^s7keKdtyCr1X$qe#26l#QR^D z(&zo+pOMm+sUCmv@uYOg6=pX#r8IlT8DFQM&Yoim>No#q1odxcn*}cTd_isNY=EFn zpPwjsy$6CKj(_sJ0Zs;HN*B+uI82N4fowQ?P?kZPZo@@Pg!||Lj9b*TFph_Cfo9W) z3$OLOY6n}OOj3P31%Xu#wgl~rZWqNH>=NaS2NK$ywL?z?FB8S$O8kdl6(xUqaWU5T z&lM9#s!Aq%DUJdeB!4OHA<+>)>niODi~y^N)Zz#zJP^aK}jQa;otSF7fx zJd}H{JZ7ots-!Oh;%{KpLMhL1gS;Q5!&j0G$6GcWkf9&SLuq)u75<<%qNY+lTsdzl z0wP87Q`3I|v&Wo198_XT|J!)BZQLI6R=`Vz&fs)3Q!}irK!d^1F;Xw zCT@wWQ&giB1jqtu=>R&&DxHg($@W+el&UDH3mwzfMGQ!;cfTXaRY!6;n?pniseeXl za&@osW~4$9R)??DXrEE@{w%bFs(LQnYo!jGYbe6A!EdrkiV0Dr<0`_a()erAESA-Y z^FYBI5jv?+8i~?QaY;8`LN%@dkz`rw*ORu?slR48!@Ly0+EiW-kbX(J!JNFzp*JQM zknhEmP_I6K=u?}LEOaheXj34^nCmtoF zZ_@zq12l?k{o>{idOIIMX8O}hd)ZvRwp=IOlPLK7U84E`dMH{GRC@_2vJvah3Uaojn8c?Xw3EPR0Swovm5Y)`W-m%iP6N)q za}4nF6!0O6d(puXBZby3rv`?Vxx^Ft}_HuA74yx6`J<{sVceN1NV}M)5=Zb+&wr zMr9i9&O`8xv-vHgG;Mgu&LP4D>4$L!!wb7mYmsazpBh@E)`8U9keX_(01k`TB#VP& zN1=VBdB1)O-cX%(=rU)j({{>%SqgL(I!qN>B>V04OtJJS5WZRIo+^tWT795tqp4w| z-`3;V?6-{xKinVYJF7Qo?^ugB1t&LcXh&5$d2~ZxNOWo}Le4rsnhTmx0?bW=L?f$g zq4g`tXv?LmLDPoE2(1HRnhS3I_J^tXloZ<@=`5U1I71{S~-=2G0{W9^v&2YzV?x zY&|U>t{nC+2S3xNQp2DxSLZEg?xg%3hr*AQzx3Fs2B*@KJtcqH5C*EhnQCzAWF_3& z<*OoWlNJ+F9vd?NroTH#J~)-Yad;nq=i^=p_cY*s1>7#RhkQ!*tqT;VG9tF(R8?R; zc$9l?q_`H^A8#5#Ub7_5mmCba4}1Y;DAqgPw-4vRJYYh2rr;NEuwRTfiYND9CV4V9 zCDz|TN{Szk7nUKU<5DK9={t? z9B6KT!f$`5>F;U41BZHmyiJ$8qfrKCN~@>#Kt;tuSWiX}erBGSFNf(dpTf`Q;S=^v zNyl^5h8|KgTW(oFt?+W8uq4KuC~x8n1kS^e_V|?D8#(}r0B>6KYOn712+f7&l-{A{ z?!$8WhgM74NndIY@QvSe?)$(K9;~f@sWZN3I4vVyhgzRD>CHeyTS(FY*u95Sp|q_x zjIe|nvn+wBVmzX{W;$0t%31*>pWMv$)&x6v!1I_Fht6bLL2Z&Ke!*m<&dd>mu~PG1 zhO_y7}y&R^(xqcW>a^O}k`lnF>pK7{OZ|T8!})Zk1sKKf?yR<$(6gQy_WC zAjA=D$FA0ABw<%z3z`w1Q0w6Sh7J}oO@<4+P+Xr^upRHsLaw%`zz*FqR^e3+Z37Fr zN(Oa!13vK>9EC0m8Hz%-ixJpbKN_EP_@9RKlhQOzo>rC&j!eUT`OfPkAz7{p$C!b* zi08>#S=Ov&APN0-eTTM_ZIz86j`m1}5hbxgmK;~4V!0w8iw^Kfv=nSF?sAUbsx8a0 z>Td^6#TRbj1D9C?S!}7W9YvJWYVH| z=08f;I@P)1&XvO*DA@sr{wX*+;E3F2Pn?8c9r~weliO_CMzif0{B&HoF!Dt)F z0+q5My2QYO?Ijr0K>3Yh^Q{svXbX^tG|+GJ%uq2luK=r=fs2~nm2EwEjn1}~aH}0! zJKYX7r?2Vh z#Zzkbq%D z2W;T%2jmIrd#HPIhu7HT5dcyQht_^q(kIbL?K*8d;C_Mfl!k%bF5FL^RF|o@@}R=L z4$kGE7GB61AJ~O@p;CzQrJgBuhDDXsnAHJ#QtyNsnww@Af!p1z*7;W$hvO*)H5U!c z6FA+UZ@x zK1uyjMC-qe%5Aw+w>XV6&o46dtu5jf2Rfc{$YK1Y3wATYyWF+!;f~s0A_ux|Id;`T z2p7pYWf$g8S!N`<^H5T*utvmLe>k08)ozg2Hh_bt4izdf0_L|{ZHWq2@Zt+)t^00B zI30(Wr9v-Lyq%YaBK>W3#i>W7v;r*Bv4!!N2oRVC%UTa=|VH?AXt-R40E z&ox#EEDS3T4;Vxhf+i;QcYKj63F`3bFCxzRsC6GmPWd%(!mx=5F(yR)BZMC(%;kXT z(&0mOe7F`Ftt5}dAZe-#6Wr^J!NS?>Ah~)FstB9n+XJP?QhF3n@ME_G{Ocq7 zw;oDT+YiVoYOgpQ)V|)v_?L%RtHd&3$YVmxny8MM=Z(MD4hy|JUjQKIIhzG)gOw-Q z&|kUuquD4P2fbWLn6mO7PHnj7%}|#?Ojm$PT0W!%uO?!gX>xCE{O6toya1(lp4u9B zoc1i0?Rh;;cfkCNT%UtkHcHAxC8(?33~}SLN8=+!#9j-H&(`F_M=sHlgC|*#^gWWp z8nW4$Ek5<*54m1a#5D_=CXBgtzF-JhdRZwH(XEy|`XNsLhP0?a=+Q)8f3PkaaszB% z@cTXj_zh@^T(2Q}rK0Po_*1HXEll<=wb^wG z!Y*^)&-geJGnt=F0SOOI$Q}KbmEE|S;vhFuP$EU|5_di zTsy+jyG>4{TXy1JwuIXDl0H7B>krp~#18h56GlL~Np7v}z!}i}BOqbKG*xZ}%o!?{ z*_-I0Sko{da^qY?Nj)6>VC0{8)a$5M5Y;L3M!UG$rtMoDybQ$32F+<#G6M<80e0Uj zM`^E^0fJ^jj#b+M;ITpi*qRs|{n)tgK?FR6;*vY#M`36(NW?xa_ps+YEuoyu1x0JD z%-l|^RbOL}M5(9!^eHvosd!Zgj!d1Aj4u_bFCV8$+Q5m{_<2|a+A z3ncqmzOVNpi$E}CM1N!E6lS=)fz zvY4FjsQ#k(gZ+}u9=V4w+1(i0()J}GGS{wO_aR(j+vES7p^ z8q`uCD`(Y*hwJ7Ot_9eSPuK4O_2%dJeA75?2;x28DmVNZ)rak1mzD){AR@NhR z-$qOk09`hkuowSm4~|_5tOU*LkxJUv;mW1Pxc`1;_5N3 z${u+Fp%x$8^`T)Gyi(!c^ehoY6^zp70&w#H0pSV#4nYOtK9O zr1*?K_PvjK6YJD?Mf%F+SR>j4<`2k*iJUDAB_+mu7M$UzgYt5hJ*~LZnOu<5w98Rm zD;)|p2IuQ$6I?RGXacWlf+T;jyyX62&?e95=eaBhY$|*`fa*~)$pcg?Zs(V`hcMDv%n( zN2afLqB=C0NXATY5vD^)tG(=qubjFIyB9o=4b4qFB}wB+UR=*U4u3;NoB}F4B2#;C zv1`#T6P=Hz$m)&&og!!_?)t34w=zTl-NF-K{)eZfGymEz1^eWn!1@z{4Ae z*+t2YU{4+=&uD@6v(&SV>G9UV@AoFI1@L@wFp~`Vo~s&*yhO#6y^%ajo+1xRR=CM8 z8*wCg2DzbK|CHyus|7FFis0beR2|8|)pCX1v`?}u$!+-$}hj- zWTUd*uKr4uZAFbxGgaB2XQ8qalw8PHLV!bAE~=S&ICemC z=;gXU9`o%nIdnCVV*AZN`>FB9A!}r;FJUQQV{js60Ybcs2{{-`2Vm})a2Gs}c-S}D zw9jk-dzqMqgH?iEk-SZKe>!X}q;o{fxE+Ts8kC;*(PoNfh*10D_ok1Txq z4Cg(GA*u4mLxdeY7<~r_lplq%>&n{1ltYp-Ogo&l38%zBaL$NApKgIE(-tj$-PwGA zz>OkraPDIW$L5_#D?z25tz0Bb+{-aage+|1@z@C?3Cgv1iBMoUiDIWKpCyHl^O5Bn zd!z3I9rwoQyRNLm&PQrDTBGmTvtH(_jI14E#vvQ+Yu^^7hd4Dm164FlY#5qUz~AI} zV>oU_Wq_{LD9Q($ynFH8>Fvr^#daeHraUNFmKxn@&)S-`$=by##+RIf7B>}VQ0FKK zgZ7zm^azkT`e`DH`z_$8@+||9umv1bwI$O8`A#+)_9cSs$=aHD0N-xJw^bYY?M8fC zzA^djPWf$&)IXH94Tr;^7sPwc#>)P32tvqfV?O14q`?~94JwVzV4HQ}IWxN3p0yDv zwyZAhxLesHW*^btMl8ypO+T8b)IJ5bazUJ|366CabgNM^xh9@*``Lzn(++2|+P;?8 zCHDhfxJA0sG%j20eB|1!=zA!5*1uJcSk{%I~78!`8)uF$jqYQ@Gc8T!}1sk}9wvN|M?Q2$) z#?%fZrpz5D3vKU2Df<$~F{V<%N`{aEE>g(_D^lAllD!UApI_C|nCg?mQcgg{&f&fY z&(tP;xN?N%SjiEZ`m=15n)BrFHCw7dRDGchbMT5;$UYDrHI@LzC&t?1p+T56yVRV- zoCqIp+y~-H`~LYdQ>WZH!5Dm&8{QV>{q528x4^kx7{GG1UD!xFAXFR*W@;~Hkar4} zsu?!=lc6tD$DqDUmgDJ;#KY8SlREQ-!YE%`?>EXfr{u}kR3RE2IH;4MNKpdk@C!kQI^53{ zt!Jxhn>H@Gc+bTfo`C^&IH9gN62S0Ysb3>4@Arz(#B#aPmcJ5pLHq zW75gjh1YU zBn_^OxN?s`h|tI+Dl=|n4M)H)u%(@_1DyBacrJ6^7b2CQS#r-SIpRe8g7sPSt4bFj zW}|H_2e*TYSRor~+e+#AFD_*%7Je_7vH1l+5?Q>9;x4pwBvdLo-JqgwSlRz17stOP z=9I1xwa{+bs=UM2i0jqeDf43*6RlQhI2lgxR{%WMcm0k`9F2;(ZX%P*&;F!`3)1Lp zgBEk37)yNAgb#S|%&;~I3U{ZpX@n1B$0ZSMF7854-hy9C;AHf9DZys0!Ybye+LMhk z*N!W4JXlm;kD+s8O?Xix&YiKv)1JR4|-!X_{T(@Z4h;|xV?1E50gawVT!1&{fWBk|1qgB?nYcVL<*#&dNDE**xm5nQT#YE=wQp2u-mz!}_QVH6h7BGMFzOV^4YD?mqUEH2Bg*mZlmp zwN!f|L~q~#9lJU2g1n#ug(d#yJL0`<8w`_71m(Dts*+8ivDVZ`;9w1ZmKYk?KKY0Y{K5h1{k z+TJj}7-k-mhFJZW9RD0IAbMVkehhCQCk{E2!?#l4M#K*F!UvqI=+a+R9UU-_pn9#r z%MhJC;@>)7JCvpN7p68g4D1|-k7yrcTo26t@NekA&Wn*4$-^NMf$xF7&PVOqp;b$= z#ZTO&a1AaUYzdYpCZy~c^P3K>=O)I@(GLcSC-d|$IQ71NGSdfQ01sA5Jv6Oj@jPZ&K zspL7EFHjls66egJJ!Q0~!~KW062z+dA9k6QuV6j>dEqwfsVc3ugCl~820Sr@bq6he{J zYO@A!OI-5}A&NCV&5O3AK1)RDsf8s7%vy#H)Y8xY!Fq-4%{8!birY#bXSd2cITE_$ z4)|1{mtjt|{GwMLA9Ysm!tZ5hg`SKkr+cwp1}N3MimJ}4f2 zw%uuIPrz>Zsq@~W4d?bNtxNPR?FX_n*-z6Bi^8p%-`xXRORSSi#Hd|`TCq#b>MHgy zPSOBT5l@^IsfeRC=FE!|holH8UWkKO_TsIN9QJ26Bb-q5qu|9nm}`~o*DJ1XH9ZXjBUfQP32g`VtOk2R9AFaYV{75c$sh-HsSH8IWvihc zmiWDakEmw*L?d4Bu;EmZ=Q9vpDCifC9k7%scj#fEC+H4s30z{#T6J|Mk;sVLxtuJA zd1@p%kxlsx?Y0^5Yl?u7ZAa$-)J%s{*qs?rW_@0a!(+4}3mpECwoIjoY;A?qxRG=N zlP0A!?h3aUf>Vq}mpO!OHMW;#uKJcH;gTS@lKx>wo>G zZ-0#d>X+-U+g5*_{dIr+KiOaZ+0U z=)w%RGC2e88nub1Q24X;$>u2(XW~=ni*s>;VDaX_B^Z6?0x0GAF_T@2(~>39syvrt zF_&kAT&%eIdotCpy=N=v##lGEyKI;*mIACbkih*yM0yC0Wy(ybnqwGmg^H$%*#E=c8qKqIa+nb+gWnQ$GhoV&r6`F#jeKL(RFWQrJP9;pBb zcu|BGck=~>uo1Y#2pvI-W-`tqjhZy2O5vMk)C3hOzN7SABQok-e3Fmq71C1}nD}S~ zcz_6F&JMX02IA}0tzorS!_a|O!PZMf>qVEypjO_*?L-wV6T-(v zkVNSK>IaZIkdW!PWgy3VTpOWfWsBCO1(1bYGH7j5cN{v^NT^0Dj#?bOSU8AM{=+D~ z<5B^rneyN^b@vbD!5{Elx;!8P|BO61E(ZS-@_=MS z2Ug?zfZ~5357zylzdX2E5$w3~VCHVh1G8i zb;70Z9X$~qX8xo*G%>f*9UAdXnQAh|5*y-tLl49*Kby_19n@ zEBT&DOGurGTBF8V3G0_Sr1DcRm%Q++C~{o3op9ua@B z=0x@R(FG^2k1yFihOYv4r5-@r6oOp&X4{Z|@YR#{YKa;WHfxZ-93cojMzB+!As5MFa z&OQb|We=ncMbeP*-E*K`PPEY|cN(6gnQQSQ`>=7-u5av|0wa7uH*Nb)*!J~(S(}~B zB}hwL%p-(av-Tk%IUe~C=EGTd(DrIsTY@J+I?(do)j0%dC$jFB{{B#JK{qEayRcw^ zH6q^r6}L3*4_8O8!gLMe{&PqKLQmtO%=g#O|2t){p6WI1_g5sY>}$2Z8E^Vp?QfJR zhSgp_x1ZJifpn{VjkMZNOSjrrM3U1UH*VWNOc0I^L&vk-U)V_&cQy}T{gk@f*@G)zzRen(V)$z^@2o+xQL zq=;mGD2cS>n!aDv0)hOd=pKZS?TbS$aLD5-fhE+m1>v{K@XR@n2PvxY;Q9y*J+dk^ z9s*L`F;$t1Y^W_hoGYtBOL}eJsx-{*Qw?Wd1WyInn&Tl@4ahV4A;|rs{v?91RHIx! z5!AbId@5eZ$)%D;1{2fTkrf=H@28#r$!7d`7l^6o9X=_~KvkST_|J9OrW<(=1g2W|J1dCrzkQFfZ#bGCdyWQ^kl zxM-O?d*MW~?_!(~OxbrIGD7yTYMs9Ue6S|<#?Z@$&+gFUP_d{Gl}i@!N!Ba^YnFal z)`SPev3-ZZc?$cnW*%5G7v+ON)EXaH6Fo?=CV5e^CaSj{_fke1=NI%7(>oj#(}Cwv zHO}~tBc+p#bc~e#qK%}a^!K5gOYugG{;_yttkFJ#`dpcyWDuDwO;G?g4e+t?pvY;bfA^^De6qnt1TIGZ$+V^PC*KTm*Xqo5G#bi9tzh>o(nUq=a` zqtxSj)lnK{2Zf%1k$*b|I_h6ae!q!Nr2M`H5vRGc1m$$$qF)Rodw4U`hE8&Xca?UW z%|lP{w%HCbEw7*#XB_8=6{TyQ;nHL1Q)|#3S%z3bm^wz5*_wNu6|adagg#*eX12wc z+4V*yyD+n3*Bu0r;i?)`1(Hm#90DGDW zBbDWPWl^lMl+UqBA1{%aRo!I^T!9h#rt?%FFoBJmgCmvIn1c?(uJwd71`P3GWp%;x zi3~&yrk5rHQq2>SpaC~^MRAct42%gqJ{6x>0)>zoZg|DZ zZ}?-0`RwviS<4K1Wqqu29uqcJ)*<^s-bNG0v@(uoC;dQw4;V$yC`%t|8v%B#d3*RGA;oW-Nx#XAg2H+y^ z>XLW$#+`m=0C&K`c#hopEIfJiJD1DUHlwu2(|I5`R>WNp?+);n9Xhft@{16@qUqs> zof&}fN9hAZXpbfDo=V;kuEJuIahHT+L_~)fHay!9DqHa>7$N*;d>aYx#IGLy3w~qa z*Nxn<@SC_}b<^N%;v?XE$ArTK!s)`dk+2Pp^?JBR!a0(JV?nB~FPwHh0#5h!20lz6 z92-6R!rA!M!w&q$!Y=&sFBW#=jucPBhXWf!tFi`@9-Uo89}?oPs88l3z22sme&aF{?i zcbq~v>+!3H*Wou7z8k;%15e?O$fdzq&qu&{wYKkY7OopkILq;?hwJeh3kUGaKkyjt z`oXyyF9_#O6AlxIPdR-5BjFnS>ftK<#=_P3=B0!*48n2YwZVwYYQPHVub5Liq4n zNf4|#5yHAWLbxBldiWmvLfYV0LAcMjOM@_%5FRig%q4_}@Kq%IEPnOyWB84QpEB~r z!tKUg8iX1`xDgNpJz~Ot#ut(BoA}kkTk#tU|Ha4y`C#0o<*sJ#(JFVf9{xMNh=dQ| zR}aVW8w>9-^2EYj#$8%&KXZS0jV#-*hmYWkNZ4@^b6fBm3)}Fk>TWmg(sKKl`}Zoh zPY=8CMI`LSuO80EZ!DZ+7A?tamPY;l<2di(m94{Gun} zSLLq3UBBEO=6+P=_UPd^@kJ!O2fuoFCw^n$zvEZsj^j?|=AH^;Y@wz3^bZGEn(q7~ zhIS13t2Txo#oel=J0D9XJgE|%N+vv`655jq8&txx$%GgaV&P3Hp%)>#L>oP9VWa

        3*W4{q4% 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�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≥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

        !KcvS3OdXWm*Jx5lS-)SlWikeW+PCG{` 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 diff --git a/node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/libmozglue.dylib b/node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/libmozglue.dylib deleted file mode 100755 index 8af82a833a1d4053af73b863e4f8c2dde90f71e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48168 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

        V1A`%#JOBUy diff --git a/node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/libnspr4.dylib b/node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/libnspr4.dylib deleted file mode 100755 index 6eea5af081df4697290bca96541f4ee5cfc4e136..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 263096 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�Fn~W+e3_yth=12PB;H z?bK2=5pSa7=~Y({eEt+dNQiudVH99YD;?_b8WfzLXLGLuV85pmtX90 zxD9V|AANGBUf5&MJ2=)Gu6h}RrZjNXRRoQ?O&iUwBVU$qSc(uaG=PkgWsp^4j6+{f z@Q+b>K|r{|cd1d?<0S>Nd6bB@ewc&oG%r2^>0?L5W!oSYYloU2AcJi~iO+YHcrc5a zfijNtKE4P!;{9{YU8<eSzKTWCWS_ST`LS>%+y^0(52za3TGNbCZDu9J^PG{Z^ zCNZl1gwT;yui$^lUg}rrEf4)3AF;GTUE&gedI69*6=Rcm-lcF1{i}KSylMyDxvYl4VN z&rXE?8KFTjt|!mm6Zs#r@?XvT=QDry$3~?cdd~^+JI0%9jPi+Pz<~k-`yAKZ4uE1N z?HVqxn1cw66Ci5|){$fF@lm`?KL*WioUw3nQ);&FTah%9p${}C^d&KQW3>@`xS1V! zMOwc`o=5vE=E~FRnym zUqqXe*9=!~0?#X%{d9#Ye*@aos9ee^2+NX^I)^KBtRkL75k}?10HR}u2Jr2)3?g|C z{Fk5-Ym4v1+R`fWyp~e_hch(Q9Y=wjwkL~J=MK2i4SY%N8 zML+WDS6E0kuA7X@+n+_T#tPPnTNAek zLGyp2i1)AIC>anbrS)yTX|EH#LQbf68tJ5v-) z%kzB!#F*sVd~z^&63#j6VsQ@&nFB?*%ZKuLsWESii; z34gGb0s9#K>Lp1G(~4iRgkPo^)yqmjj1ExrWpniD#>711stK?Mt0hN_;o-on+0s72 zh6(1M;AlA34sWp3C`~QyFGk4|tWWGV0(SwZ4rIuQ*eA)J_%fMhMJVAj!M z_8X4xdZ^9Yd^5Qt;7I1YGZ&9Zt@eIiY>a`ALu`#{hX!u&ezDLP+v~6~rPsf4>W^X% zyNde^Xn6J}Wr1nN$ z?)1$vwzcXXiTU&l^R;g%c>f8H{w1iDCauuND9ppmLR^W5E4_;R<}fTl;bsKRt_vsN zC0IBuuYEOX10ueNsw2!OoCb$`pXNEnyUjl74`=na1 zp&(wwbOdAA=ojm6jR!_$zA8Pg-~G}+Pg*qA<=fwsM!jz7cqG8qtICOZ7V7dCS$PFM zVDz$cn^VFpZ?ZATVMVAUe#WH9MuEeMAeBiV^nJA;BranoL+`Wb@0$GBIOZEqL3U_i?w#~uJnH0bYZYl11yx?IYTgo|M7 zhcc7CeGLFrLE^OV_J^#OsLENr+Me=^$ul`s++|SMXd)2$7X-fcS<@=%&m= zcdpXk;YGCl>JO)4Bhy=`%-X!sn(NS=FS)TVHM7gN`qf!h(zPc_x|&JTnKXmmip#eI zfE6!k0YBOGHxcBT7A~r$nS@IQ83S6DP2uqGB*WuKWRsz%MTP<9=AkwjesvP6?Qeqy zxQW@j1(z`Y#Cl~B*&aWsUKvaZ2T{&?+4`%aeloA|$Zi#>B1P8Ufp=2%+HU3j=h@ZE zK=uA_TRHvv|Ls;zlK;u=%>^MF0(hfwCQ^g1AXO+U*UCI6MJt*@)o_yra|lH)PpO#Q0i0t*n)%w1Mt(1jS2@JzXsuuyRPG zmcYkKd&TWBq-ZJ#We&3Q&xz;Xf6J${^FS67D-rbYp z&j^Pam8CL0)>#tpeDldNr%(dQd<-j0ION}XWKp9ZC$L$#(&?`O^dFetV!rbpPwv54 z2W~$#(!y{mW335Xd5I;I!OFgpk<<6yn~yE?ZX8BUyG#r@2}R5N;$o=UNH&>gXWk3z z&r?@WaL|Twjg0w~1IyC_RkHPLtpAUsB#@ib#KxirH7&0Hu0v!LG`!Q^QnhsAIk!(2sa&8pUIqr+}HoT(R^pYJ-(Uy5dK5wF>S63D%_!-C4X$Joy-fM?%}~ z%hGp6YmhQYUMO#1HooGyOnpM<^hy3z)WPF!p)hZCj>p#u@3pL>EC?REr6kQ*@?hP~C>>9lk_9ZcV%d4D}TU|f7OrV=M7oG=5FeMKYKrf6n!hjdWYw>tWRLIygbi_ ziYf55aj4e%3FqH}kAin)Nv~k@DJ6Z@zX?!~^uypc!FNuuIn~!W)-~8X#osyBo~5R( ze}ZLYwJxjiCW`_n>+5f93OMF3t;%yN{AJwm45)1r|9}JLFC8#N-nN2gIXsY~C!PU+ zX%pUg4tV4L2jK0yF;V9uUnlC^7Jgk+eW8G`z5d!Je#;#2Ui=YwKc&8T4tUp|5MEpS z*my&NpR?mRllA>L|EyxZlF6}{?yG#^p6i?cC9V^toee{tHd|ltCECsiXWA?lWoY5w}Ck1w&~dxe`h-K z=luuycT7*Tr|Un+zs!-p?n|38KOO(cj{Jci$*<&lSJhsazfu0IYO}pEZK&X;H^m*(|))BceA0Eh+NjxZxq-fcMM)0eI&*;Eg{qJYnrCOTft^OU@9~g3YIu3<@@9_$~`J zXZi;!73flGMFZE<;vIvwl@PjngpflKDQ~=cK=uHc`}FA zRR3ve=sVX!t3L;@9vmfD)+=q6HQ77vhd=3Cvc3uaa!pE7MgVj4+gtBFvJe z{XL`v3{S1))p|k|rV)PbkCs^9W=pKPI??Le_uEuBzJD;cz&nX8+v$Y;;|2%3`{VGe z^Ciyx5aFtC+o__%RWm|(gYojVgS0YW0)#`W(8BdH6SbzX#{3x08D$1q@f0Fpb%DhJ zM@O(I{sy9hrJ0z6NAO0+xYr_uOsdy1YutW0DY(G>y(^sO@&Aiug$Z#J){H8~u&Cxk zyRjmUgKl*TZ_)kx;q)LJ780>!*cq?VH)VNXB!;cD@3z&(WkUbGKR2&@E)M`7tb;#mw3F8zI+4JtYiYlnYk zMGpj|vWnXg#oQN}Yr4}`L#_v5 zTqEEC1mNl>qv|e;+_&F>Hm#b6FS@yZh%bVA)xB1N4tFzwo%{|YkNup54Fx2J8EpkQ zt2-llBuB_0Uf-v-=}6h%jIu1ExsvUehSdYiuF;S+eE4SZu+=o&Zlpe^szYmHt}`d2 z?x05KW@Mx-5H*WWoIwqKnwKCAZszM9+;(Q3r&xRA ztz@Bm{x-sxL)f4*_i@{Ju6-E2rE&pcXpuc`y~weDW2RB{RzRUN2B^}>*)ZH9`RS$g zpQf~X{6j{)ldQiPZjkW&aA9W7dH(N$rP!E!qj7#tgI2+&g?!e(HRfe<%MVI-d*^X3;|hLqsUbxgS&OmlSiS3>#mAo*N&nbh z{~RP$M`nPRZur$lc2qYMEH@rq3T2Df;wB z@>cX&&!``wkD|<@z%MSJl#!wG$;Pv= zOt$Y*;~^qpWR&X@Gu1n8xz{f!f5naae9IbJljp6!A8V;)XI1xMl0s#0UX+2m3)=H8 zdm&g3*k@= z16fM+J+U_=H`gvY4~0XO44$;1hYYvTnaz%EW6Pu-p2a!bLFVh5pjW*yiiiD9&S~_2 z$8GAPGGnQ7o@}uy&0NoRgj9a;7oZ$k`F=bJF<{f|iCd5$`FL-VzNhBHvdl)*sj!&8 z#&VanLNUx7h>_25t>ZchtBILcJAc|bv4pgjS(dG!-Mu%yJ|Wu5SQqUn!cXcv!%XZa zpHZe5YUeDBC*6#yV)Y%TS})Y6y!Ix9^3V5CtNs_yzX|z|Ux60F_eWR5;a?o>&opm? z5TV4Pl@ucKz{wZ;AfYHvz}r}?H<1!WrA|ptqDKW{VEvflKws-(cfMEGIF&) zjomBOb(zJ_z77ccPWn3KTN8SD>^_!f^R;IQTIW3Uc*rT&I!Y@D+NMp5{OztSAu`vHF|aZTGGWx@X${$gZ7pnPa2z&gcLHT2ygVwggsy)y=$JVS zZISb_?~Jf_FLPs=jVoed&v2DcH$Eq_MdyS2Ny#&vHIbvzvN+8%TCl?|BigjaSRR5rZ&%F!^C^@SOc{H#Ch`SK)Q)a%wNwjvi6`W%-- z0wHsRCVHe6s%G)GpJdnI;e!x+)KiHeqT*x5y4@TWlB-6~g5j#hJfH@-9h5PIg2#sqR z$?_cXC9ywvCV3szi=g>shUm{Rf7j8b*TMZP^X>8cmYIVzL3cmv*5ZY( zgIBgx3OoKNv<`W!r|DOPfRayrW$oaO&SoxzypK4QYEnE^0q_utM(N4Unz=|v>;UTj zANJk`JgVY+AD-QWPf??yqM{y^C@3EbA_8hnNCL#>W19p~>#s@3Zazw~yWQOY@wM%$ zs3>69k1B1gT@@9T>Z+*J;?K2GMT@e2W3{>}+Mrao78Mosz3=DDBqvKS{@?%gzuxzH zuV3JqbDuf)JoC)QnVB*6A-ZTAP-*wec=;ey>56!fQd|BLS-{}!7iy03%o?RX)=UoArF`zpRvD?YV5*rWL2 zclxo{wl-XA=kU|i$(|2uZrD5EwtZD=n%rI3qv?$z86@-21DgO268a`ba6 z?iwO5%$@a7#z*@5Buq+lZ%1tCrn;|A!H%*WlV4wXSsHH_v2dTy7ubUi-%7w}EGM)3 zV7roV14k6^crWW3dd?rCWnkvSOcg;%b{~Zzw2Sk|ZZ9lht9L$|kiQ~Wi9JaDYUG8# zz2vKr`(Jt`^Zi7y?9!=0Q;lKqC{#86boE8g%;A;E-`Z`k3*IX)dY^W}ibc~$y|qxJ}v?SE}seu+cvVcik?x>T1It@Q0vY^ASN@Bri;@|(`HO%{a>`O=lHbq+*+n3era$G>3??P956`)+;zM|VN zWxcblKbX}~u9P7N%j5m2FhqVcXvE}{WH;?Wj#jdzV(NMCP!<%QGVJM}p63^|@7Qmq8>V9YBGz1C!4+0palsXO$O3+Ovof~r zG+2o`(6dMiGiqbHKdFLB$40601E*%aQ;}$_w}+u4>}8fiS6+UNt%;*bs(7o0$=*qr ze<_O$r8Ryf_SZ+2(&~F*HA?~Ckp8Ze#h|;g#+8?Efu;|Cl;dB%^77x%e+G6;#y2B#9emr-*SkHRSm9gTGz8_E%E-~vp z9sOnZ0l0v5{?9MJ{5VpXiH{vkwCnTtk?j5N-Qs$lQ#tIDSO(o!aypi)0PTK?erzSU zAig_*Yvv0W^ZbMITh9esFw(3?MMZjw;V`@MUr#KDa#`YpZ}VM6PsHV%4`Do?Yo9Mi z1ed$)^{l+k^DF*Bf-C(*&y$7?m^gcN$WNC4_wW)F$`Aw@&&q=1SR6;-I0na|I9f~_ zlG0rQ6PFJmIss_qWyzU#ZmhhlmB@Y$IT|*1qfu9mI4{{@KbfAhGFD-S83FUgNKTeQ zKX1NL#0$;)qKS*ov!7<+S7c|x^7b)PVafC>w(NiJ*UO`0JXrkpK7x&MeYyO?F{fX# z3tK9a{XWXFa523 z{aRlC06*0``Q^#4jCJzByLpP zCE{KvZcN;z;w}?+g}8BXuM>BbxHpQM5O=k>Ys6hEZc^NJ;;t8WgSaViH;TJS+|A;q z#eGTKt>V5RZbsZ~;&zL>L)@&mJH_24?rw2aBh#2K?oe?@h+81;NO4DrJ6c>z+%e*g z6?eS29&x9NJ6+t<#Vr!IRNT4ZR*35rw@%!1#64f!2627jwu;*>Zb;myxJ$&nP~4cf zOT}F#?h0|^;$A22DsgWVHzDq7ao32uR@|hx>%?6z?gnvF;%*dolenA3O^f@IxLd`2 zL)?tG+r;e_cZaxHad(QlOWfV!ss)n&;tmyegt!Ibjudy4xTD3j#2q8k)UV zxYNZwUECsZOU0clZiTpBaqGlAN8IzpZ4lQdZmYQM;)cYHin~PI3&o9zyHwm|;;s-k zF79>Wt`he~aTDUM7I%%fYsF29yH4Eo;%*Q(CGJLXH;KDh+_bnaiMv(YH^j||yG`6~ zad(KD6?dn&yTsisu4?^gXm16cZj@1TZw)~^c>OkL>r0zNc0F%iYQ6+BGK(c|024P=wLKb+pi&-MzoBG zyXN9dV^>d(Z7hM6MaoIk*EOa+CGM;kmzut zX+#A?6-0xH{6xDkplH2-=o6w9MBM$a^(LY>iIPMw5j{)v4ADP{QbeB;Jw%j;o_PCO zq9cfIAv%$07160gR}obbEhVZax`2p7k?kR(3yGSEt|dC3=#NA-L{AdUC3=bI2SjfZ zO(pu6=tQD#h%BOm(WPxagovHn_7Ox=h}=YH677Q1T21s3(fLH%h<--&ccROQ(nL2A zJxO#o(FUSNiS8$Qo@fox+e9R{^0z*=Uq_@6<@PIy_9u!F6%s8XI*q8Eh)LbPfQT8f z{Tw1@)AlMNX5#izqPvM^5xtOoZ@-6#H_rCeL|+j7mT2SCf$i3;5M2cj&|qeSl$y+!l}(Kkdd5FLRB>g}6|en9l!MCTE$Bf6OAE~49r z5=2iBT~EZRpzXZDTC+qK6YYm5-0e$j&1NyHhW?Zb)ACQ?KTi9SQ)(Ru~Z4x-zL-XVIFXe-f+M9&d@ zNVJjYDL$9E=uM)(5xqq8ccN#AJ|;>LxiMe5{UM?Qh}IHWM7I!eHg)?dq8|`l zMRX3)Qlc=?1w&xtbp{a%pE%zhRKkr<@l2jFVe;e&Q>Iv+sWYccojG}`YHwQ*h=jsZ zC;GYol{XlUHZExQTj9wZ=A$vnJ1&G2N>2M$0?om2hY)94 zt!^vS5(jM z&wFn9oVjXtseP%UdQN?1b?Ll{vRYL*?c^U9&nhV`n>}Z4`B^`#sI02?{-~z5Zr<7R z&pG$J#sy72e{)M~+fNs^cLai=pM@jQ&P9utbX|b_I(h0T(@vc}qkh7F6$WM&`U(Ro z(iLb@3p$%4Z5Q|z^C%K+>A;>YGsLnPNK@(aauaVxec6&ze_PVok7AVY~0gg`xkN zX{q7`D6+Odiz<#Fi&+X*b7Nb3XV^c}DvXS`8lyPC^5J5T6$&DES-}29{y;RMdXs2p zgTuqlF@?y~*g$7{`#9xMoju8D2?rNj9l=0bG#Iv;8k<`ER%>IV)mqTmv=Eg;`Im$m z13temhl30#^jTvy3wRu=U|^v?JfS_M zqI_0Oam~5)-r~BsYEow;JPEX!bhIKX)EI4*3{|>P7e;uwFj5#{b(bT&a3=pPpT8+= zo$&+Mf>LVFjat>)thRt*Sz}RkVHC{CC0k=r8KP}XG<_V@qnbNHwFM+i3>RF8BC|R} zR-~(AL9m@gr8*kh0{y9^Nwz}9SBb1H?P~W`27R3@#&DR%pq}_FnkBUf1wI@Kr3TKc zEvrATx~is*Eqvo(*qt>>l?bXp1iP)$q7>J^p z^JKWfeOVGjJK+z{v`VB_&$ND2)z~35&ngU!w`v?`!-w?=Q0i~@v)(#_IQacid)46v z3-wRw40J|Nb$ZO$gE_|^)ke=n{cQKo4hK8L%HhKtfqD$@6N`jpdUJy2TGPX$Vn$%| znbZ)nPBO*@{YN_9D)mR2z>M^Xz8saw-+|lK)`2#l&*f6o$7nuRQZ=ge-x0)Vsb|^#vknr2Uy$s7O)9YV+W~e zmBO>t|7dRtn(W${n~QDHw#N3h3#9Y0nt~l6)I`53Jjtg*Vcbv5)arS4_0_ZME6XaY z(bkmJ)Zn(M^mhc&8li;`+T9)6)~LTD6qN=SeH+5fDlV-rEvqf5Dfi+|(*er^ix3~~ zPqy?vlx(;ygjSRM`PK8#rp>~g`9n>vLqi%2`RzW`S{&?b_n~23O zlZGDK!MEC2oJ_JEX?e9t=%i|^hbXP4B(A!?uDr60#ce079JJo-XZP;2*d;Ols_RV> z`s1SGUCaUbb%WKL?P#?~%uZ9L46ARkc7WOxxDs-V5vY?rO1ycS2ZN4tE;+i@0 zm}X<8sZplXoaJ0xT3W;E!OSW?ySTifcveN34v2Bv;$V28)u`(SBWzrR@q&yA(92qA zKF=J-Xokr)A|;_3Yj3AQiYN+c_@nlRgQ^G%=huroN_ZHo}?OQ(~LKfm7Ju zEWHQnUdZp48?>sdZhm#m4^i7|$}j-^j;usfXg(sSdF@@e6OhiPR_3ZR=Du~!5wmGY z`cya;U~UGQ1m?6Q7Gh^v_Q}_ZYGkY#FWI>?+a4NP7>3EP!qIz*bwKBR9%bL*^`%sFwtGldVGj3|Xn1K7Muc|h`wAbZT zwex1rE-xu(tw(*Xo>zlLuc!V;I-8r@n%a=t7(zwR45RQO!On1#9lH09tEjI2;XJPn zSM0ds+A#>j01U<6Xa#br4Vx~GqV4)w=Pj+TDXyAhs#>vb_K}H=O^6W9tObs>(BFk* zVZe>TK%2o-h8qL;!E5BIx2C#8dWQNssYA2pRhUfjhJ&I6%}&6YU2546V9?QwK{vzJ zo?E+@ptW|=_ZpHls1|)onQ1so_33Tmbj@Qk7eGM;CYZd)sbMsP>gr0oeO1C^LL}sG zYD0PSwy=HFB7>nA#QqvbZJ%iX%4_RqRnJ33vMX#qftbCGx*b`-T4kGNI;a{v1=g90 zQf!w`sXx$Wmn9nDn&P_h>MBW0Zo9@dIqd&gC!Xn;A-x@weRuV=ZtR^{fkW+$Q9j4& z60WN*LDiQ`&uK8JxHT9-ov?Lc@UN?_FX->1+}0ZoMuSbk_FiKcLk&hFb!GBAY3j3` zJXAzlgVA3QPnJ?}ticQXs8A6+=;;o47H+6AjBU;?tC@{QXp_STiKeyFnR4WCG>9ew z-HM-W1^T22x+&xdZeT{`Ym7FcyK8Pn_Z$ib7q#JejVAUsv9&#Qjzy^3CA*Q0_|ePt zHnGlIYn}|>sj0NAxb*uBi+t!$dPhcl)~-htV#uBro|!M1;;1+|LF%fj>t~hE(OEJ- z+=hI#$6jbwI@@te;h21SS8u2afYSc zj-ai8KwQ-C#?H5Lk%zIVhv>s^ZGBdS+2YHO6mtY_pjg9E|gJl*$ss zBm}fc5%3&dU& zv`aQfW}1fGzoadKStRJHEI!9kHW&@ml=qASN_)o7uz)wvM9Zo|Df@hQ#tQ~?<)`+D z)zR3+b`00-rpi1HnY*>F7;USamuxWD4M00aC-!Z-7!9h7Uf|k~bDZjtzFlkRui4Ro zVO?*7gBAi$m3BLB`Y9NVhf7T71fpRKfO?u)lRjny9-sJ3YUiyyk(LGY6E4ietPBSn zER~)Tke0(vQmx;=(0(rKxyqh)UahI*OtTcJqo(zCmc_H2!+&!7J}5DF8aWeb@|FXh zIr11{$6xL2OCwRt@iL9*I$Gp8bu7>VjF$1xCu0S9*kuc;I}ZDaq=I+)xp;squPaAs znK44IZuWYn21)P7X~Q-Y6Q&%$PYiQvsySA4-1|)G;>Nb9h51g57LhqU_qnM+wT_xo zZQmkNHTWnRX1gm*z8+RE_sug!Y478+8J9u74^Pl!>2Xo*+ecklnr&_c8(MEgjwY+L>Sxq^5!qVC^WDdO>1JC zp_(wsuG)f%2YaeqH7#lks|cpteM--bv^1$mYX_xKAyi{K2b;ZUqWJlOGR53;eOfPJ znv*e2Etx(I8CzF_0gRd2t;5V9CU*6d9p5ZC=ScO{?>P&s*#k}i=kR)C)U&#|*Y`5{ zi|I&VR)^Rr%(Rd)CT3P=bFDq=-OjP=URY)F#zW6X?uAp@7U7frcav&6@suPFD|^vW zgOMiQxb4*vt)Rw_uGWXPaqmo9)Au0OMuVa6L90MLlq|C+TG=h{B@Oceo`S}F^7km9Tvq?OMA1ykkZn^2p5*ThhK3WfkX0Bn{O``(Yn^85dcfK49RB~( zR5zMIyC6kLnLUh{X>q;>%__!$c29_DZy6r+$E`q8g~FO7CswlI6S%EqAIYvxA7+v@5tx>h?`d#P~? z{4H$({q9jZ5R4q=^sBZku&6B@46v$U0wUZdQ_vhrphs@Q{P#qwOxK+L4Au`67+(eO zp3K5%BFaV`0|fh(`b4X`)*e3C=2rO^OZ_mp4W6zlc7Bg%$ewzMa&vlk{o$T^WiG+P z*?ov|=MC3_VVZ5y0;!2;G&N@q(&)Uxal3y1%4qq z)+#(#6;7OjYE?M#WS=UoRNhK@;2i%uCKdW76?Q4Z#+9k?K2M$180h5u?ri^puzfx&+G>#0-n6geMbc+wC8?^dJXV3$5az0jx@ z&vU$vc4szP&2p?z;VG7$oL5#;ZH)!4#S}mj)*%3Tv5-Pv##C4CRjya5sOiVIytaRK z)n2^&*HYE58rwP=bylz~P$zHAQ29eLKL07aI;i|k}e|c6|(Ac!ln1>Wb zTk(GN46E>*;i?S7ihi`AVxS8k$7c=ija0Xo#qI45Pka0%ezs|-618554tJs>HmsWn zQDtbj3fXy8kJg#<4fTPLjwBRC&&-is9qOG^hh%LZv-d^?i7D&3jKbQxB0E39)k*ta z(e}^njaOg)&WL@eVW=QF9~PQN{2oL42JT6?ZEwULLexjvS}<)>kLgvc&9Gnn>MY+g zyS_6FOT~)z#De*Vdi&|bu3ZCG@A^vI!tKF`pKU>9V~9f?{WJ<+rWCKI16^1!)`_Vn za4^Ayw@Hy^-=5EYipnrc5vXl##FUb~kbnwlRb}Hse-+juEb^CoOE~NtJ5CQmaPLan zl^b#3{2VX{LhjAJ?-l~q6 zv78-gDW1>!)!^%2gIFrhs{Y()zeo8okNOY%-TB&om;o|puYsDP?fvG?cccyPd9g6B zCzKR8md#CMqdlQ`cIAXZEK>|kWJz}Tq_!2~hH%_1sDqIJ`inrcnMGuZv&A2f)h)P# zc-ycd?o9&+cg~=OPh0xbi~bGhtqdkD-y@Kr+7-Ni#YkCs2iG|;wY>)JEg8*xW(n=} zs{M$D7aPq{th&Y0BB=ZxhC0}&|9bhJx$$#~!p@1kS%Bo&O{1gmnmfd140f@yPy+U* z7_A{6jcYMg9cW?lbMiwM_4f#cewED>ovx# z+X6$Y4`aOyr&DEdH5`0CtoX6#Ff6xTo~P8c_$cEBEYh#U671g}q|_0XQb$fu>aB96 z=C>;K@+C^Wdk+HOF9yM<8fqxSU4S3Mf$$t^6xVTM4Z6aY1PbaDR^oG$Auj31id_4T zzc!OA`cl6Ke67I^R3yxFe5Ts7y4ha(tJnMHdOKBlO6;=?zo5cjD39Nne*5jmzqHS@ z`lyQZx#ndbQwqBueEU}MuTM$fSAE|)^OX1Q#n-W!Gwt&&n&+MIRo5T92bI34&v!l6 zSQ2cyVrFN{bO`IqxErQ%Jv_r&+Rj~F^%*wtM!}k z=N8HJqF>p^Wlz}0pYD=lZ0W>eUQZv`B*&$%-XKT+v(NHq)hFDuaO_?*_f#Hlx$f`| z9E;w&(Q^xq@uN0wcm>C)$A7wTM2U)JPVIW4xI`tkUOIp3q7t>Ks-@%cyGzs=S2t`s z=k1cB6%Q^s^4^0>y&u2x%C^IQSbELNm4mlrW2GkCp@BgUKDhqc*`I!K=Jvem>6KHC z^n5XQ@x|wveA#ft)*J4B;l|TXzGKbH$9+~l8BVy#Atu~!fp3MRAdf>{(_*gkNE@B!xtKc=bLZJy zf1W?I7yn!?^O(PEKz|--D>40fF+NI|ILtfkQAh%)#j}Mz7ett!oQ6;ZqhhjOA8S{&O`W8Idz;{Jp*|O z@+PDk@(E-&WbhcbDu5gg83UOJnGTr+seqgfX@L9`5{3K%vJ7$! zkgbq+AUhzRK@`3v9u64^ISMisG6ixvWH!VLIS=B41RzTw7eiJ+u7@NbcR|)c{u{Ch z@&e=y$or5ibKz2gDfebyttqz2Yh8z#^KxRTpAytrbAPXSvkVTLf4VUdVY6A0z--0=XEn0&+bh0l5pZ z4q|0oGEV*c!(T5Sxg}q1hF|_L+0s|)Je>^uK8C21a1G*xTm+G8lhM{r>6IejjP^6w zobwpc*NKh4Gkn6KE0^Ou?=LLJ;~edVij+z~(vU2qpcwrUqyZ9#Bq3>tngxGI93$l< zBn`yqi24vKEpHDo#*|9ZN+EKWBqQGDZ%{*;h(D?@!aQ9MO$3Tn})pLQfWx+MVGQ( zaw!j_2oi!YUd9s|z~%zz>(53L-q>o6hRY+zzD|1*_rs>UxuW=%!d1vCrs{<$|#m_PAnQ4-HVZwkl9d#`1H{1EhPT+m;$^UprDdc>}&mh-8 z)<8BvGLUce`JpG{K7`DLG(na_Rzn_zJPmmRl7$SNiarrC3vwRhLdf-yBxDQZbI2j5 zxYZ0uHKY-;2y!*#PRP@ccOYLw4#%z|C6MzWU645BPmnE;k0C=&b*piZA3zpCu7|9H zJO^=2M_&UegET=dg4_i8Gh_>7_za8>AoY+KM+P8$Q;Po zkPgVrkjEhZgyjDK;|oXyBo4U~@;2lf$jN7-Od!96+yr?Q@+st)BDXpX;)S$8mO*|G zc@VM*@*-qA_0OB z$H|aWATuCmK#Cz{kf(5c3uG(gO$hnjkbglwfqVhU18*P5NXY;E{Z9`3PY(P~4*b8B z0|y*4w5Ducacyx;aVWpxAy-ML;OydtT!tKqkm$6E2Gh4oFX3+r33GRLQ41=<@c zt->J{+sSD%{<+}a%$4P1%B!kN%cf0Lv5oc>`&w(gyj)eWQ6RQQu;5?Cu*J6h$G})} z85%RMs{EWO9?!`+iutO|acx&mxWqcz(>L1G$GuvyZ;TI@I~UY1z*qfPCKTJz6E?2Y z&sq;GsxO&63#)(H{q`Fh6<0rNcldI>jsA|=izNhDd^tNP>n}+R39$z2ZW{3sFFc~+ zVZVE__04aKwwBl)BrFlayqb#Mt9-vyE1ybwu{Q`w7ajns_;$Z{nLNE?F8Fi3ru`ih zy_ULAd{wo@K3{o9BbL3uYgvz17$1LDH}{fP*jMbB?Qa3(-4;Xgl^IW{A#U^ZN~9bj z3D?<#3cP_W!*V8hfldEaz5ezFAoRRZd&&o`wlU>_9%~c*UF{9L+P;j1yNIjTdkwwo z>l@|3+_UY(}`3>=rT8%Xf^=&M=dU;6=1)1K9_61o~MAh5m3YWU_tea={dqSM; zkTZO$8H)DaV(`xz|44*^cFJiq*v6AxJmDSHC&X^n&!#CMEMP*#Ai)YK^jMco4mK8nT;Ptr@mn-%M@qI2_#|yspNLL5-u9CCP&=j8B$P@n(f72qK zC3?=Jv{&=Axe4FI_ffY-yqmE$MDE75a>^BaRFRZ3>{7s!b#h`?1D>y!b8Jz=lMUvi z5!)GXM=5%y#IsL>1>cRfFZOQgW5_1)#sU|H+-#rdm+x86;r6zUw!Sqzt}jJU z#Ct@0o#SFKB=^rM?Zr=qg3Vk73jH@~Po1#|o-!NjO@dd`r!9!JE~KyF8CRk8N#k1j z@;e}BcL#P-{Mj=zPKIA6KGKciY(399ux<#qbtKr{8THp2;)b3}Vok)~-puf+9&ZvC zp!@1EbfbOA+_anI6b)jlREEvw)V{;ha=K98(l6O(RM{t8TgAUm2M-(G5Z}%~u78I9 zeYNVy>SH7v)*})%a!}2 zVuSN4cG{?K>Mb6}!KCV~>k{azEp|91Ju`#oXrfG%ZedU(cMHz9aXlBkQwr4LK25)F;z- z(w_@&`}poMzK(W+`MO*Cn|3WW$PV4k9r?zT7T3(jjy+}P)YVpzz0|(i)HlXu#>xAXL4uPcX3fVBUmMVvSPoFq8n}h4)ha!{1e(Am6pL*>r;Fb zgR?dES0CV{?UHA!gcx*yF%UDtrst@U}a1j^jWTXDednQ)<%7%jooCQ z>W_k4HW9m!d4P)$7Z|yw|HRg;C-;itA_cI_JTt-fv&!dQC zo9&5lc*Ng?Z8721ZM^L6ZHGCvuV&4u-P`Tdr@l@JyGx(S6Gb1pck3(7dvt}d!K@3& zdwkK0=$Go#fHr5DKF9Yj(%r7m=LkW1T%Y2xfv4B?oZ`C{oUfAeu81CF+{jZ}AS3t$ z&#*`IRjRuWj;MzZS){%`q*;&TzdCfbT64ra^}uMZ|5X1zs$5-m ztS=gDRL`E!6j&5(Rxh5Q6IaseM>~1zxF4eR_S#z|shds;M1!sBs)?;pd>OQ6;*UE0 zo&K|e3)Cwfe)^)4ljYMC^~`B%s9)`HbIaB@N0@Ks|FUmXJus$Iy>~pSGE&*JP|rI= z)EyrCPWaQQyirv8G&Lxyew~M@lvN|}?e6mZ*u_Wcg5{j1z%~%-os;-Qkh*cE8it)` zU&yOfD+?;r=LhohAbxIB#%)&B-G|hvdk!nc<}n@W;^RuxH7As*f1QAj{xPi(R=X!C zcL|1;{#uUGKguh&hcOJU-kzSP;#gGW_N%M&?az!cZ_%_+4B%FI5w&@o%C`qzkK`jU zttxZ0Y-o5lx0>bGbtU}r1y8`Q9j}J-JE%F_%0OK{s8Vel>Q$E?QZv5-8r4gqYy)>6 zTdS@fQxa4=$H?b?exF?4HBmlaQ}0cd)9okcsbsNILwr8<wR)&y$ztZV=SxgLrGGUyV?M z@Ezcy8uUh8>fXVaBkG&S_Z?zt$EuSstK&NxAEm9Es;)aFPo>VnBHBiE(-3>e@b@9@ z>h^t5ao!zKrY;{vGgNX^RWRDt+@&5Gg?pqrfG^Itvn^umYC40e`u_(o}t|6qubTmAsB4@`Y1b<>d!-1JMWsT+$NMt53$SPH$xlN}rFI()FlNIm$Cb?G&rerskEpkl5$6y>bOPb&HKpAZh3X3 zKiV4fMbrlc$YDQHfq578z&`#)^{dnJRK}lY%IqHp*QzV6Qq0k;n6C2t>YaV$2CP?q zAJswMo2IM$M)mnVP3oWfM%1$7q(ixEx^nx}(h)May7MSxl;1^i5)DMG*|kXBh|TZg z%`Qv}-!cLv*o<;c%ISSLO*O+F$4Yy(Wkjt#sd&{`SS!5Oz{@aLmSk?vs4m(Un}!EY4R?;l_|>a`n!>LACZEm_&t()VKR$uLEg!^ryM% z%_*?5#l_iFbu*HjZE@EH)$RL9VLgtlkF`=goix_l=Z72B`}?)wfla>QW%I4xI7vQh ztlgvazuCj4O*H+U_i+UC7;^T-erVJ_oQ#;MHw(Rkn3{X{?~17GB=#V+A$)vX;ct$r zKYBQ@Zfr+)uzQ+UtvX$~rLH}(KR&ER0;cq@Yoyj^aEEDyDjALTgt9 zTdKF)ABst@@M{kqyG;$d85taJgCz+l$%7?5nl}_geQm)SKZeCDzZXvI!Ut(}yh}yP zy)%&g446VdH#f%%MWvWB1-00lLelykt1mgpg>YhF5Nk2Luf8f!u>%lgnDIuCvzWXy z?a}=Q1l9Hfbm#m!cAbs*>o6#)l`llpo#-kOQCR9jXN0`~{1Lkq+jfB6(fNI|)x*bl ztFX(9zAraTK=g|cB4lE?(%MY?W zG|wI zGQ?7^j?7ot--3oV<{t+I)n`+bd$Ib@K{7C?3+fEqF;NYx2&&XbuX^`j-CI95s!m;g znCa-&Of?Pe2UA(2eC9Mem0vffPnlQhwYLsZ51}Dx(G&g8k3=ng_hi`cI~pAO1Klis z-2q9s!{sXB-n{|+VK9EN5sWorYX`cX;&yzh$>D{%?O?m>;4RuEU69%hZkF79#Qylf zjp~~t+wj}T3)y0=f&uKho=lJQOL+rYRkN?8zkrVS( za!<}}PR^6y#Me@1LfkA|HF$|0eSUrjc4p#>1@*+C`U^Gnk3(&*dcBeV_CxIlolg&q zhND5Bdg_FHmAQwOMbyee%{ca=Q7YePee_VH_4yvH@8)Rz_)yq>FYQV`?{d|1uXXh* z{1PwFj|<}RRSL`C;J!>Z{wm!BexU>TiJt|6|1R|Rbcz5-;o`Cxnz#t7wj`L{%^IjqFgvklXse`OC%{q->J&!Ahte@|9}a0jSw4lBk! zt{7@{RpK3y`slRM&W;doO||p1IVHs$0e^X#9)zLJ`c)FmDWg-rI$SYda2MBaUxw8g7U4FA?Ke2rh= z$;6rJ>~)MsZv7jN5b`ZY@Sdknfa8fzjzrd6FS)r2)WIy?w~uI3Uyernf#`YI2Fre` z+I1xMRt(E%a{GAhW*B9Ass46yX}$V0x}FNVm614h9-;0%3VMITywn%e^`oh%t;wA4 zI1(c|ya=7$-q?c2n9=Hw_+_93f*|0H3>Z)^jIQ-I$~LWx%Q3dP^H3sHR% zsDptX?HOcP`nEn^@53v3yX4^-F<;!o-Nc!Pm=qZT{pzTNezqpppqeGt(;JoM)}yL9 zLALrNRPYT9kbG1Wr4WM|ZoY&@xW!+qUO6h-DucO3jPun87|^x0q5FRCC_aRJhzw6X zF46x5y7Oz*ua0(nQ>k9Iq^*DKRP|Sk4;^21tGkZ&qfu+cW`63GQ;;|Ycgtg0>gXW0 zT2>DohYr;l;_pY>BO&z!Dq8Fb@bmgyUuu~Ln`=(e%$LE8li4Tg+pssCj=CFBCxlR| z)>&$Mj*(k>nID0f1QVGnd^WLo0#YBz?knnz)0Fdhbhf(XnA$!=jLj$NUIK-IAqVy{ zS6ffSXwH5-x$l@#^(NZltmxLBPr`E>JQEw4f{=RinBJD_s#8#q_J_6TBZ?!s2aFxt zj=Nv(kq@RIR~a%76G(|;1M0!!Bl<~NZtaUvzWhM*f!-k5DJoye>-A&3e0%Y)>DZH2 zcZdI(-rF^PVfRcNTk3eT$Ets_9YcI5o4<n*o*!#a?;OYM?mi9`RDE#kFXnLws{S|zo$WKHI2o7DKt*|;!5h`nW6%b*)CJA7!~4i6Ons=A$3)eG zXmj{7_MI`9?(7}|wFra~dVy{RE-uR)!exc_ll495;N!0_>Y!R**oZH`*;X;}V7<6-(6QcVAl1i)2!IkO=z9*@WVd-<%Y9zlDNev{1PTXf?Y#)Q5V7_P^ zz7=843FSSyDYz(FjyfDuTf4^foT&e1N8c~&rW1Qv8^Owm#;mxp_w!t)!hbda2EEVN zvf^g`Nu21Wn-({=U9O6o-a(7>GtE~gvfX%{ea**tE_(+FzfY||#Yy5<2~jLr(IswD z-1xuqTWb6wWEfnmUO5S+v3fjod`cZDakFsQ(_vnM z&#cZV$5rE-!kAjf^}Y!j5}#2+>~n^#wHfNc@s(}r&$yTo?_QPaRfi(=4+h^QN%?|q z_DjKEQPp`|@3VV+rMeh7m=LeVCF<%4Z2@Gwx*gM(JSHa0Yr|nJa~T|@MBKFSr7HbJ z=3mrvV8p*BBX(&%+~igGs)Y|~YTE>RHNgj9q^{w$_ziRuzoDD{9o^XP#Z8FMEesh^ zt0uOqn_v6ZXTuI86lw8?_^R%32#Le3Hc81N08($-O#EsoA zF+EH-wx01VR5wg&Y|j}){T_oT=Y-o`lhns}uu4b>=Y=OGsol7c!Ued0lB9D4^5!JE z+c?sKCyGnltPrphmrRvi;n7d?mB{})XTYFG#HYB;+M1fj08IPMXFLcvnrar7z zPe#tZDq&xzn|wpCxUn~hGZ{wC$%q&j2$X$S=V4ntArc8zN56h4dcmn61fw2<6Q74febncY!ro?>?tFYxL` zgLw5~x><2Emk_5`ivP9Z{vO{9<#9K43=U-!a`nkFTl~n>#pPbm z5KK*#EeUbx;*(I1ovi+fvQOSeUhEaRsjY)t_%)J13vTsR^$%Rlye3!wNjD>Itb344 z#xFOZ$dl&eR`l7`ivtnPS*cs5mYX?ibuq`CA4+g>lRE^%Re5H@V9QkYVlPis36N7C z(^hk7+f;QsHDo2!zs3Cz-PlgLX>ntp634~Oh@1Uvkc)E-f2P9Eg}IAv=8HitJt}<% zmtwnnPT#<3=4;`6LpK{6Or4j}&5E18Trga8S>Y~8>2If1sl+tBbg~MYC;5!wsc8sz z1-Nei;yxE1nMRs=64#SgN*v3nQ6~PkP16(qA55FovvMO#CO9y6CEbL$DRDE`(kFc# z<1w>MzdKcK&reT9g07cfH%KsXQ{raC&90KbzoVPEX>cB&U{*UupietSrd!b4WN#8Z z3A)*v2Xl5e2JgfzqQG`n%f;L1rt!|wgehX=d7c(touhN6sk z#n%f}-1G+Gc#3Y~alwC~n|y+9dL!NJU+HF^q?>q3e8i1!B91>pH~BZZ>CJRw&(h7p zRfD*fo_b>jw!2gB%)st;s(XfPW{0nOs?<)@@6;BO6KM(fytps0v>4*bnG6x1X@|I; z4F;|uniuJ2U!t3NnQr3FAuc_Ea35*OA@EGzM>i#ITHK87^8o$R4-G+)HgW0ChchuY z#Uuhk#@9UXDMdpq?Cdi36*$okXl22Yz2Lo*TkGnFO8O^KVa z@do?-F*ibl3W^FsaknSsO1r!XR~8`(vhJcxUPCIs zA?+&2xRUUS=Ve@oH9zITl~CI4iMzZ-9>nV@kThmoiF~BPop8~Zf`qHVQS^X$snC6cQP+|LNY(*PC+bBDCT0)5-tnsy%tW>@JQu}GEY&c$m0oR+-Y|~ z1AM$$Sc#ZD9;gk4LYAWSJFceoFbJojH zF*njtkaar3a-3rSjwM z?2rN&J~)w=9s>og>67}U^!0w`**n9_n6 z@;B)UC0rqvu^lzaFzxab(Z-Am#;06~;R!dA?TP27^5SIkU#Q3nMMR!Z8Z|M7a))nb zI20pgMM;-ckjzgo&k;oiwKMC^#U&)X1!!#|{yr(SPtC{pRp<~5}9VBKK&douZ% zLHH87zzQ)s96U)rL@K3x5dQrTVlZBvsOCJE3LbWk7t_9KA|32u@iY$n9b{r2#y}2$ z5Ldw={yW5i@Q?mJI{5nnV)U26&)_I9<7#rmWkLUD_%kkI%t@=IqNO)p5B%_7;x(9d zda?P&K}Zsc`3$cHL#u?y68gB!}6uNM_fv?wi2QVft#Xk%Dkj6WK8CQS# z|0Fmj|91lC=6@D;{t(Y$%tK;hbA!WXgC)-`>@}wOUf_ZFNpPAqpV;t=0EnyL7)<@y zW0d;8j6J~ck}^%hc4G1kCO?G&|CQzw8-5I2!#9}xqC%y9qxr;!@4+y@@C_zEbdpkc zYd*2z#{dl9VDhu$mHLaZAK3649DIYx_fAv_Q!I8J1~&YdgKseTY5Z#S2bxc8_+CeP z4JP06;MpeM)=xYTKLpOvnon%_`vDMF!6C*VRvnL#y>$-0^(IDr-i3PDr15Ux4vkg& z-s|Tj;P{}IfA<6D*3Z~vEL=f6te?cRVGIP@RP@+Gd?Yxu=N#Dc1C3V!li%Nc@e^=N zym%PfBi;<+dJq1Lm)OLMEa{2YVCFOT0l*`P@QDZFbI*XGsB_d$JPZ%_km+-vCZh^N9!Ihrq!zmDD%lf%q|S z@USF&;(_>aa9-DZ;(_=Ha6Z<2;(_={aK6-h;(_=naPsi{#QTeQAbuL00?j8Lh@S!H z2+b!Rh@S;#jOG&$#ODTL6EvUL@QWPxqrto%i@=$#`NW2A?%67M7)-twoHETP9*Exn zj#u-E2jYjoY1Dk;f%q|SLYhxJ5I+u1O!J8c;wQj~Yd-Nn{3JN5HJ^AOehM5swcGXW zd+^iX;1OH+#72L{QN9MVypq__^mStou;Cwxu>dj4m-u6FES&R?{{8iRdDs-z^nH_o z+2{HkWAZdMa9sv}-aEw9!#>xebuuo4X`7mXF_q>M8@}b>8%(|h&V8CsZ1^z;-(d0+ z;5?=I!~^jytZ9DD=m$1@Gq$Jw22;Q1G^Ms{KC$749QGJ2_JG69bD2L02fqmC3`_k6 zlb<lM33V@h=gGK)jlqxj(fepV1T*Eh5^n-J{(eL0}4!*(Ut233V(R^Z~ z-|OHTOuiSKX3Zxy{J4W}u-F66&y79bgC8nV>PpQgHu^md{RUHi0-WnLpLigC8k}1- zpV;s%W#cM%7)Pi**m%TMmjI9c{dSPZAy%1@ci$1*7kwp z1D$_y;M{&cgSg&XWYOun~5se?72m^!6g0EnsI(wO`ZHn%I(d}4CQk3opZH<;X1>3t@<<-(d3N;GC!V#N<$a8-$pAVm~-6>yaqy zu*Rc+FV*-k;OjIV4V=)}0=`q@F~Ij}JQnz2jmHBsE*~BIeF5yN5K z{=hDlFEJ0aKLjDB{RT6=A#mntKC$5!IQRyW9|Nad^N9!I$H7^w`NRY96W}b>d}6~# z*C?3w8{A+1{2F0R{%i!!&7UN6j>dlA%pYQ--vdBQ{RT6=nR#djG@qCp=BLMDkHO>@ zU?Qwo^N9`L9*EDqVt=Fg z#D;&8LqGAI;IQ3`quqOy81rshG1s?=82Ro&9e!Km)4!uWXTdS$HG2O&%c}u4{0#mq zFJfbl$rI+M!Ax%woL^`@@j!fa4(5n7pV;t=9O*Tf`isE1LGy_XKU832+GDWT(~2LA zF!liV@E!U?8k29Kak*FXi4DKO!8e%v7&wn=KC$7$9Kp25VDj-`bU5tckET2hf7(NA^m`oo4W>OFaJFbZvEeIs zuRR6}|CjiUAj1bX{Io;A!Q`tL_6s)l02_W00C5!@gUK(t2xGj1bbbQEOY$>?BQf~~ zi~ft1I#lx&u;C{he1pkPfOCxI6A#2Mx&+UX#vb5-_!)3c*L-5bAL+1%cpf+wj{Nfj zv)?H~UlY-|6!=n&=K^1+aRu-#8he5NsBsr$j;ZJ4 zVBjA0YN=9}!C&eXut^sIG0VkZDVIx?y3X){4c}|igl{nUUT|*Ld}70IaPSQ#KMBsm znom3szu+>ZHfcVw;fEah4W|AWIDglCV#6Qg;2Yduetw9sCO=0Xyk~yKp>q-ZnV-Z) zf00AK!L%n0&Lx^pZ1@EZzQN>Yz`0iQi4EVRu?ijrlkdG;sXuByvEdg05R-2(`3=kP zo?7#X$r%IjIP5W){5UwTYCf^yKj7dK{~H|M3qI70~q2Q{DA@EaWZ4JJPh&PL5AHvA%Y zuYQBcPhW#^zvdGgzR_6)4}-;?Yw>=>*aK|%X@@-qldrDBJNi*}eIqvf0teq<@(aKj zr}@N&pKY&w$6UK$Bcr>5b@I4Ow29xgr=S#5Mg0JD-V7yk1AV2Gh=ho0Tfpd}71LYp5POiO&Vc!jXS14otoo z4=jSevGYj>{tP(RPA}rB9&Ou6Og$_wlZRFCFqn46!0~B5F}#FdfFm*a29qDZ8SCOS zpBP@>$xncDjph>%#7}~=M)QdcztCZi!TsgWV+d>VDhr&OKN;ve>qt9)h>d=e#@zH~ z!TE{i6C1wCL-Gw~{#dtQe5Lus1M$7!{7&iY14*doj{jJ~|oew$i`~B#TLFbuA+xm%({)|Jv!OYKwTT!1i zpV;s%w~d+q29qDV4eLFOeqh6oIrJM$zPcTKljai}J^?ZH8!Y@gl=`LN0~>zArU~ER z{_^K4gf)5fC~$85OhD(smYqMuM*rUGLlT@q%_km+p8{uw<`WOZPlHpb`NRY9GvNGK z^N9!IXTfRHd}6~-C>t~X4QBqw*C^Gc`NW3b;NTlfeioc7HJ{k<%{@!~29s~ysnjaX zCpP?<4*drASH8C)tSR4DfLXpjb@U?*(CInGE?;7!KM6ogdkm&M1$SdD_c1n~n4B?? zEQFYRgUMHGF(+`0%_pW8`Q{!W-(d2sdr<#1pV;sl5Qdn1gUOG9v-}uaKQTGfZ#cR9 z3^=PbpV;t22t!Q1!PM`)7xPZX*!qdd`7ZrQa9+`T;(_=DNu@s2eBy!lA#iqUKJh^O zG&m!Vwe2T1{31ts4Q6@^?o;YG%_lbeGaY>5Dd2ECGyYSPr- zK3wD9&w+F6q!;nN4F54uKx}OAfKSXaGMF~UzKd}j0G#+Q$Pi*)E#G+qg;Xkd^2*U?9{00Z#VDi=9V4mg^ z8-B{cH<Ep4}-~1ZowE^^ND--2iaKo8k67f zu2Ls!KC$6@+`W8*$&bH>HQ1U@Z1@Dk)Niox-&bn3;R73fkwd@1Ob)6? z&--Zdz1lYN)8K5@d}715G>3eH$X+wWy zkp#z-#aqC+Ws!mXr;fGDn%JZz?MREkOnWkmwOE=@Z1|RgZ!r03aOP`1@j(16I4zn_ zZ1^bvVwQ!$V$Uad7B=<(8-9Vq9)rnGfpe4Q6A#2sgR|b)|2_B_aGuwE;(_#M!P%kt z!~^lwe^B={pV;s{j`SML^m@R_A7_^@vEdgv_y&_70_RZ8CpP?$gKseT8F0pHKC$5& zomKEKn0#v|)=gPDaEdjb*zmIszQN?j zzCf91KJh^O(3eUr(0pRUAL7tY90JF}k$)FC@C^=pn*-nPz>hlcGY%fOO@bL~j*@4e+;Bp5(2bg_I0{wzdQ_%_lbciyZn5rhW?#9=|g702_YD!8e%vI5>A{KC$69I`{_nHwO4C z!kY5^4{&bzs;@C$J;5$7Vxxb7L%+fO>2E|>qdyLut3L#t-C94f(Qi5Q8!YJsXP4&3 z9sK0cE8)-jOl<5aaOgLf_9Vf%Uh|0u;-|p5S@Vep;-|q` ztNFx+zrVvCgZoSGdW1Fk-wn+4wmZh#8R#sYWT%(d=r3~UH(2WDH@K%Y-vTy#Qzxt7 zVX%}JI6u++xPzZ^=r@>r@3#oA`NT%QS#MAM29qCiyVTD$pV;t|`F2?H4JO|+#HFs* zd}6~daLg4LOn%WYm%3H+i48yPu-{PYLz+))_%Q%t+G8;J@qJusqvjKnGX`RG zl5a5i4I^CYHO(hB{33)QCf{K46X0OqUAsO5e+#@6JpP%m9spv7HJD-3`?}O@j~$kn z9NL!DVaYd`{Mddjb-v~k8-5Icn0$lD=R%x?nomqG>h}T=lW#Ej-UCq9nomp)`9%=J zH<L05S95VCGN5K`!;7<`a{{{4dx`eulu=t@*@;pK$OErv8GFE_L8! z=+xNo_om+hf0E`C8-6Cg*M5VkUmfOBC7Mrc_}d)z5YGq4!jXTi4*UyX&H?8C*sZQ` z_+Rh9x0ACk-XUX5^@zr6fuGa(kKZxYdKVm@9j!WW%ARd?7B>GB{>&d@WB)$@h*@65 zOTZC3&)@sA|0UpRBAr4;nOB!rrqHF`oSiIHR-(?IJX}RL1(wtPi*vi9r_KX{V8z1(0pRU zALig2+@C!oruN!%25_!DY3RHG{w!-^qrbqR-(cF40p~u=Cmx8O1?L&fCmx8ej&!NF zG@sb;35c2h2GbsOluP~F@PX;Y@`>9t;TueT9GrbHame%%8~$7e-{Ai8^Z#z|UEm`t z>b&pM1M0394Ew69+>9%@ATkrKf+Cw?G6MrMnP!r429)h|(w#{&Nq5uT$xIL>C<=1X z2&gE60Z~vf z)cJLtI(6#QsZ*!wUx(ngc70zCW`2g_$>$I!eFrdpvc+$C$n+aCJ@e4qDLvWr^Fexy zsh@i;^2g!_o4zy98&lujo{D}iJ=ydff!>(7ZR?%=C0TKNWpada~&|0c57fnEEm@{toHM)UZ5E?Vae2sc$F4kpGUGRm>{~f}*p1hd849yABlTAMvq~933QJ7Lu zxAbJw_W{V=_+w0cUq>p+N>8SS`7;S1Q*TWD{E_grCq0=O>Sti4H>Q62s8sYS>B*+= z4D`k>erT?=_yhf9kpITiPaKk20B*d$I*v<4tB?2P zfo$=&2k9|pdeXbgle_W9nEK8WQc=J3WYc#7$kZECKk*X02TD(-hWT&z zIQ7QVcf2eWU0~@4o1Q?X-q`6+N=0urJ=pYpUgq@1)K5Zlqx59cTb?j}W9p|nQ_<(7 zC!5~lq~4hNw$-WVJJORE)0d%nP1$)z89Pqe+|4tJPSTw{2efsmvP7X z9{2|FkH8-g&w)QK{ss7R;s?NYi+>HC70-izAbuG9EAbz|kBA=wuXu?+ZglyIXdm(3 zVCG4ydu=~x>|R?BZfrYEuE%>E!tt1i$d(< z8EE!;sm~v>#orO=jj5l9<{8qHP2av(a=ymYw{1;DFOr^Y`Y8ap8-I+cpWc>=PL-Za z4eO%x-z9ou>Z2Wa50aj2`c43u@f%a$Ih=}KBR!cK#yyA_$>{M>FI#x>C%%;-xtJh%=jmv*-v`1={o^r#&1mh>}V=FTzWD! zEDvok(;HJi2hHiylTDuv^v2Y8jHRNpEd5~9cLaK4>ieJ>k)CY&J^;C!8Zq@VJJAm& zJ((J&e=>;QnELcCJd33#FQ%V^<|gUMrYDe@9%IHoH=c?L;LiNP4ox-xlbNsh@=A87KMjNj7~t&>K@f2hAbU zlTAMv=#8l_zbX|SD?Qot7H2mCjH#c2<|OIKrnfk$H>N&)ekxioJ$W(x95h=k{eiw6 zKjd#2zcJ&FUISm%(vum)>pKTCy)pH3(3C9xKtB=ajj8Xu0QIxDcSujR_}hc{jT!$uG~bqH`9Z;oB7}AWlnEQeaGuj{-r0IzAw-lQ$GpK-~5xxf1qy<^v2XrL-Rc8 z$rk@?pf{#|;ti>&Lwd65EzWKP7*jt5&1&h%rr$q^pS%Scj-fgRBKs?-6k0b9M%4OLzKwBU?J#peOUZjCo$O(DX@9 zHvI&EOuaGn=}YjACOw&&-Q9N`Z^S#Y^kmad<9B4nZ_N1Tpt)3fvgyl#-q@w*Qrt(< zr@^M53iQU*&qFgUJ=ydYC(~n0ecxsH7A8H}^zBiSeq-toHz(Q2QcePHf(`RQd&KPjeu9-6mE zPd5Erpf{#|_Nr8Lo%CeWw*`7*>gS-jS$eYRrvkk(^%Ga)y;XX$>1P7HG4-8qMW2cE zWYf3f9fsVEKgQJey)zZvy;}JLriS^`4j?B**_0g!pV#?)h> zmgq!F515+WmA5Hq&XAsL`Z9h;X8gu3{u}UovG~EJp9=KG)K5cGlAgSnK7C^F;|_D*CYWWYc#B={IKjr=Yo8da~)$f!>(K_V zb`!=+NKdx-31p_<*y-PkZ>DQh-oU1x@-nA4rhXcl{iG)^rcb{w6&)r$+4LPj{Kkxb z0-BSgC!4+;=#8o8qV&DelTAMx=#8nLxj7Y`Ej`)veSzMX`gSZn0^A9nx#L` zPXzHBGydrP=%bdNZ1LMUb|b);`Z6?^OHVd^Ul6}B^|R1iBR$#lQ-R*t#s2}kM_c@0 z(_0!E(=!LnZPJrX-xt)+#*829H$|V5p8RF-MMw+(v)|hF;<1eR+qRFQ53oyR6>R!; z{g!%T>N}u$s`O;j&j)&A>f3KiMbDC+Z2HbXZ%ln3G>1q}UQ9m)&9TyxO+OvPZ_N19 zA4^4Rr6-%dJB-bkZ+Sw!G4-9F!o46pc`^MwH1Cj}Z2CR` zneiJl{`67YCqGyciDQqg}(Pd5ELfXwt8 zQ$KMx#!IY4n#I&G{ZlY9^~Th<-;;{=m!53;$sj$()K7mo6&)%)+4K`Z{KnLGd?gjV zM0&F6%YojQ`YC8mm7Z++zCdqGee~5-^m6IRrtb*!#x6b3Y`63T`sqM#O#K`*JEbRE z{L=t(H~tt?Kl$}k^jhi3)G+_cLHx$lN8iA^gQXvA`o2JKOno0TH%d=7y~Wv$0AuQB zq4|jPPXu~n>Sv+(v-D((e>%_`Q$KNED%y7)(kwRpRG>Ge zzWqD6zoaLdzAexjQ{Ms2!P1i#(|1C%N_w*CJA(L)8Gjj?6Qw7c{vQK9`E+R5ht`Gu zv9rbB0hh!%EX+3{ei-}~@kQHLMDGz_0=`{*IrwYhN${NbYVafCYrs!A#UJ-w;CAs8 z_{HLzz^99E0q4o+yK6^(-Kh9r@ax2fg0B|82+Z@%@elqBzny&ynw$@g9soD?=}jT8 z)?uI-uRGcDtrNc?cjJ#S^LY-Mtlm zM7=TNpMmBb(vug{&q8yX^yJ0#bI{x=J=yeg$Qv@#W9-uNeT>Vp^ngu28|aOxpZq~8 zx?g&->1P7HG4<&mrm!Bczg}e1rvtq)^;6LNU(%CJUk>!f)VKWz?NaH3BOy37hReG}NXM*$?Gd=A;#epM&P#EdD^>iGBPn<2RB-daIoJm?y)pF@)SRa0PN>JeSTA(_5OE z9%H5_4b4vJ$)@kbsgbESrhXEd%cLhSrk{o82IM@#BWUf95jzePd0rU zfXw)fsh@uUV>3?o<&#X!?#f%+ukfuEdQbWY;5hQE1k^ryBvr)X)7EbFZW) zo8IE2-kAECdED31lTAMzq{o>0^6yg7qtcU2pAPiKE`Dg9((SL;OrY-!^v2Xj|ABUt z^yJ0jPeb!k>B**V58^j=>4#>m^yMY!C!sk*da}je5yWro&KH`D^fOD)&qGs?o^0`3 zn!6ET%=p_LN=2j6lNZx>Ky#7wWYc#B={I)y1I?AvmzSWQhUNz8$&1B556wrVCoiV& zcsLb((b5k#{Zx>CW2S!=nr}-_HvMd%H>Q5-_n5CCJ=yf-KyU2w{}IeTlD-XW`o2JK z?D7+uKTBU;f_@g7eK-00g>3P^I(Y9R|2;JAI41u)1kC44AD$yeiF4pJ;vsN4&@;|f zb?+;nv3mHeU_NWYx;OnO#sedqbuZb{)`|GY-S}h7bDxA}-?Z107t_x|bAInW!s^gz=u{bZm=P|Nt|pn0|QWQ%_xeaB;|=xx%I7t>EbGc7%N zG5stwUzMJ`n7;i_c&Ct_YSW` zc`^MAG+ok@7t=>6%q5YYYK_VzG6l6 z5$VaM?+o8GH%UwX3X7dqd0Xr9>PuNQeSedk{AJt#eSG5sVo>!c?y zrk{f*FFkoNeaGG_qKl*_n|?CLPh;li3^dnCPd2?>qizHkQ{V9fjJLG-!KSxsM7=Tf zWoZ6y>B)=fr=j_s^kmbggY+9S{^*G-q9^zI>qRzwU!XUpz7Lwir6-%-;$-@bsh@^s zt@LEm^nLgZneiJ_-}ZF) zUzMJ0dVB_t_2eovY+ntd9Ysy6ygd&Z%i9lw8}oLyZAJ7qFZX#xwqxBIq|LZh{LjU2 zE&d*GWBe2QVy!F1Pqz5mgLb1a&wc6{E22B4C!2mUNRKh~9nV}5{ZM+c>C1uM*u@Xc zLl%Fa?+En9)XzfmAU(#^ z_d&B+da~(f1HEyp>s7*U?Rwn==Jg8K-RL-AMf7LIPqz5mg7}S@o=#}?+2-?yZ2I;< zZ|u?!%^}kF1^RNJH>Q3TnwLsXw)ia#-3TzIeh!*m>B$S}3()Z1xqLVG&a0rYyt)J2 zm{;?N|G+c-xszW8z6j^R{}wtf!5%)-ww^)(vwZUuhPbR zGq!Rv2mL_^Z^vYV2gT_FFc-kW4}#zCv%IG5xly#gcpm(Z;&eOKmjUmCcxDbp`B3=8 zk?=1qo&yhx+m6C|YT{1tCE_yp9pWkQ2gS3;!~d-~!W@NJaT7Pc6VHMV63>H=6t}I8qLaiO;M2r?;BDeb@Q`>Ke4cm~e2F+Z8EdwRxt9HV#gl8I z=%eCk@Ezh=@HfTt;2(-Rx^Q0NGWb8m)8Hq((x2BncwaHsVSm1uYplOm9O2vVX{G_6 zE$#%@#C_n)#1r6a#axU0HZaS^9QY0~*XI7FG+d|nU&UPWcV5i(e512{I=R;EQ^Z`y z_E}=C3Hv-T*JC|G%(YOD6?5&;E-}{?-C`Q>0GMgxx|!!HoNHpfUf~@Vz-OJ9YXaUZ zo&D?*`Ev7DSMWfYj~{`bG@yT#9T{j6PRh^+ErO` z-#gIelZIBj$tz8x`r$R7aadC~9sVPg7JKSA8~U=+RF z!soH(g_wR&FBX>{jiR@T=}Yq_ar7tnl@-%R-@Rh`-}@ez_c(p!{ZdT7a}P;FA8~v4 z`Lxkz)ZdBA2c)9sgZbO`_EdDFn7&+25YtafmzX|SHjC*mB_pP9lMylfW=x3bFJe;6 zIrURucinq1##_v}=XZ!XPx%|ta}MvnDxCAA9#lBzKs~B(&TsnLtWQ7Z79A+&IM~C) z9OHVFm}6E?6t~}o`MhF|HGPGc<4AXiIY#u=Vvhg3Sj@4VSBg1q^Lo>x0eZ8T<1KF! zb1dZ@Vvdu%*Yux(PXIB;H~z%*pHD@<5_4SQAH^JV__zK3d^w)*KrzP(9x3LSz|~@o z@#_|I{9d1!WAln)j=MWw%rSLWmk7+Q=B){o@LE-#H|5Y)+&;CNpZBeOb)!J3kQfTg-~QPfr^B zRB;*nZ1E)c1!8{t=n(U}#);y#hj5RGJHTg(%itmLG7?3aGlpg%A6IUg-%fAZ;K_7x9`*$;eyn0>tO5VQaG z<6`#BepB3ze$iiv*{8bKc7H7PmmVN)`>#}VoS6NbX)*gS&k;xH54=dszQ=cq*{^t~ zn0>6=9`k+20W`EbLn0;Bl z6|>l*_Cc)@vwx{u%)X-$G5dwyAZDM>yDc33Eq937SMvig`(YjuvybH&=lEl> z|74|@eIuue*^iL{?}Ph@{S_63v;X0ZV)iXuFJ`~N$E0VUz`Y9RJNv(i`F{O-G2fk^ zhPD*%Q@$4;BAx=DDCWCuuW9hES`hO+^dd3eF>f#p-f^bIeAm0jG~geL`HuF8nD1Xt zK^u-~;QP_xV!rR3F6O&TUd;ED3&fq^OC3){)8HEvJ_o*4-1c0oLkiw!Z@+%T7syY* z^BwEL|5CgS{KOF-ehv5q;_rcv6mw1aPBGV%-y-JPH?I(L?VFsKYu^;bT>IvH@Ig54 zFThub9|pfi8v4)tu<F-T(WBxrc%LH91>sR{ zMYNxI61-B(wR=twbFGbyVy?B(C+7U|Q8DL_Un=JO@f*dQKmG|Z$I9L-=2+Puh&fjF zK{3b5J|^Z^*?merog6Fsd@;w$zF5q$vZsqVRyHfsGe7uBpv9Og}cgV*0V^ z7t@c;IpBkyim^A~^TZc{FA-k?e!KW`@Gas=@aM%>gTE%e2K;^TyTHE?Pl10Yz6ty% z@h#w|p6kJ>p-0|C{&$@crUnga1=J4}Ma`$MZ1w@5O%rw~HSGzfc?v z|y_WGq_uDyPpnCmrv zNX+$`KPTpT&0iLCz2+Z_C&0fGUj+VxnCs#_q2|-ib@AH7To>;dVy*@DJTcb-TPf}W zA1}^hwj$ap9tM}iTo34c@#Wwv#9R;P-D0i>beov#0o^O+8W7(R-vpi$ z(|7U1;#jZxhoW-IVwj;P;E^kM1_{ufd-c(;wa4V)~=|u9*JlekP_ry5ETD zkM2?N-ry&W`Fx;nuBVIXOJqMWeTf_<<~)TH#0P^<5p$lxHZkWZ>=bj%;e?oD4kyJN zb9kMY<3>Ip&VfH8=D3l2#r*d1O)>j&e+qs&+8dlZ@Tf8R5T3BphjUGVeZ@221H@C{ zL&WqCbCQMQeSEWc0z4q5ADD``1AMV~{-RWLwYc1a^_9d^M`OCKg&%`;l*IHSai_R# zI*Ps{o_`+tZN&7g@u+wbaXw*}KNtFXdV!dJz1E4j4s5S@20SF52A^+w@TKC38?Z)$ zg(Kf?6L%oZGvZG0tauvyebfI3`jo^|KTbtY824$5CeU9b?z}LH4i!(m7XE82{B>B1 zL_7z6r8t6SP|S63s$#BjbFr9fqhBee|J5lm*Khfxc>YD0MrYx;zCX0^_aHyT9Dn{q z^dYj$Od$Qw5p(SHD)HP==+_d{Z^kG$bn zra}Jnin)GtUQ9o7yTn|3_cAek?p-Tx?}(yLh$EE$FB=~KUkBp0mq*bb#axH0?bSYQ z(d)4uqL@Crjug}P!g?{+I6g~EKeRi<)9tvX;x?4YD@~7cdB5p@h-+$k+!x;!&*FZ6 z(87l1JozW|y^HA^^8zvbUcOx%P2oNjbKQrJiYG6RqAwZuz!#I4Yf1dOm}@#b z`9kI4rK#w-Vy;cRQp|OtPZx8I<{@L;Yp*s9?(w&ZXHoyW*BIse4%36bC+7O3KNojA zi1%%=TeA}NDf6lm*ZtXI`Xf42-2N8io460pnvLQ)ytwy?xpquN%yn%p5_1ijYfSUf zDEf#v{YVsjQQUqbuA_MFB&1C|^;UF!px$TNBINBs;Ih;tAx>Nn);# zbB1Z2g1$I0*GCw)@cYppE1p1{SBa;~=AI-G9UQeV9`(<{AXQ7f&G#PeNVB zd}~9U@H{c+HytVFT$MFq&YL?^+;>S76~%1`zfjD%cvp)%!0!{&SM#UE^i%y^F?~eO zn;zkNy}_qv25Ebyc<#g~I$S(GA4M+_)1UBZV*2?xQ{0DgGAeGn0sV?%`s%qxOg}ug z8sk~>1u@r){E9ew2<;Ow*YWwSG1Bm7aXX&%PrF#x`cZt2H+~F#E@G}t)+6RxW(6@P zHoQtqU+x!+XTFbdwibR=Dtf=T1J8?3iDyv`?-IAY3GF@c6w3d{Q%4z5SKSb(Pr_)CVbWt(|^|v)4vPf+)dMq=ZJU`{3Z*>`M%%u z;Jd{1>-7yW*Od90n0{h^C#Fx`KZ)m&o_*fv&xO8K4>TS}`o+^Y?m98o0fkCOy8luF-F?RL&C(5w#?~rCO zeagK+JcoMYC1Uy_TPLQUx*joob>_us=+6_=H`nE2`t`bAOyAD8iRl;mJ7W4S`>}Wm zb?mRj^lSPDaT)EaC!^kEnc-TWM~JzO=SE|sp(1Wa_?2SLqrB0=UxGX|{b6|4h`Hv% zePXVs@PL?WLp&k4Rzey5}_Ni6g~rxJGNl(+KZ1J)UuAi|L20V4CYu zCy421{&Hj7M{gB(9uq}3is=XML*nRWd@C1o{nl@ZIj`_v#q>M(E92*4PK0StCp_~C zpZ+!+>mYGE_%Jbj79As=NBGOcGf2;A;xu@RIC>x2A>xS#F<(a9_E9`f#hjCPotSHg z-y$wQh-aCY>s;S0ZaWZloiXat-e*P`uooQrrCe6V<8AADC5x1-H`s(2b{ zex*45Fve7v9?zqTO^;{I4dM>)CruCjs+jYye`?{V+a3{f{@v5x?9;}z82&*#gFIX% z=9(Al#GI#`7SnI!E5z;ZN83p}e+%j~W2Ex})1WHFXcPM^qYO3h2z@&THKCj&12%uLs0j=#iyBmjQ10_p{{t5h2z|h zGsd~B7SAEgr;Gc3jxsEs{wCHp6nCBSU85zipb zqb+bI{2Xoa zfDiV(7sEROUK4OG;MWBF=76sY_~QY8E#MyoJRk6X1^lF|T{>NQ_6>NyfL{>sF#(?x z@Wy~M0apTkb-8~3zZmd$1O8FKKM(lffFBEZ1>Q+;QT+LOcGu{DApGEf z4-fdI0e1)77x4CgM*^+|e15=}2YhwF*9Lq;z#j;BI^fR-{Plo;9PrNr{!PIDBjCN? zmgLV<1Ab<}2L}A2fL|K$=>cyGI3I8&;7bCY40tNw+XB8j;2#D2K){a#{9ge->Fvom z{$0S&3HZ=}PYAdx;L`)n1Y8REbpc-%@Kpg{8}N+*e=OiH27F(@KMVM=fLC0Toa3_t zJ|^H(0?q~e+JLVQ_+J8^4fuh8|104A-jSqXRlw#v>tUzCPKRxP zZG?5hHo?-cGhmxxJ+NNb7TC*STVdN^XTr{cy#n@1*x9guhGk%Vuq><}HUP`P@~}bJ zcGwWC06Pb^12zmBft6ro*txI@tO~2aMqy*Hov>Z7aoBmVSHaGQy&Co!*aff&*oCmy z!d?fv2=;o|8(tXMPO~Gz}-3WUR>?YWIVef<847&yPe%J?KAB5cs`w;BIu#do|VIPIv z2KyN7_G5Au;;?sVb6p81MK;*gJFljUI6`kV_?U^ zj)R>5dkO5NuoGb~gPjEXCs-$JHSA>A8dw)>Eo>d^6xgY-^{~@mr^7bDHp04Ln_y|! z8L-W;9#}7I3ygWR6}Am_ChRQOD`2mLoeleESO(Sy%fk9$1F#${4;zGShYi6BuybHL zV8gHxSP52!oeQhLsxV%YQP>!4Cu|pN9CjY;Rj~76yne5N@mfy6E`+@n_Bz-_u-C)h z0J|7=3G9uqOJSG6E{9zKdlT%V4sD34)%H29k3bL7hqq6-3hx3_9fWeuzO(l!oCdq3hb+}ufe_! z`v&Zruvyr*VBdz_2WyX3^^X>YbJbPV;p|v`)yNUq(MqY3J)%_Ib=)yW6l=rdUa+dv zf6ftug-U*~v};x2=;M!DRjigP<2)@EZY%R z;?Rn;6lI1B{V&hEL!?WEVlB#)E86bLR|hJEat%kPiU~Vr*%DDGHJv$fq2c5qDpv+` z1KEM0Wjuex$}CX4$bw9IbLNzMZ7>(D>dKGhhfC#rWmQkt>D5&mvjdxYwjJ5A^0<}N z+>TYF)yk?uabS2fmtR%Q4~$mwt1{JErBK|ya>z%M9%VF)uqR(z*R=*I&-WD0%lp0S zi-p>{oD1{;YlidL;%GSuD_1guxeQM@zp?|GaQn!H?V}pDk8apLreXWohVA1Ti{1hk zU}R^uP+R`|_t7f*nKK)=B7w*`WePX3g;H3nl*YFr4X0E}qh%MkI+tU>y25atr8LTH z+?rt&$P)a7yEf+s#y01(xp5b=CR-fH57+;MM~Z`!sMl2T*;>B-a6W7!1J@QuNAi_y ztyBq9*J_t3!?=*lwY$pMV(!#zb!dIDmai1E!z;^`!bm=Yi2L)1b!2B|xHPcCLA8do zfU>(X<x+Xp75t(hOv;||BJLmTUQ;R-^8+}ggb`FL6i0Q4fq^`RigNeKg`z6C zq0w5dw6o|!Hx#P1yhq-BF03anr8^lP#+~abrIA?B>(kd;$rh_4{;qcWR=Xp{`GNHJ zpcwfg=Fcac&sV~2?zdv5=-qD`!iqU&j1#OK86Czw)^I3=GWA~RD&p+uaBV!pLRZQy zwU7>H$McotuRMLU$hY!vW?h%7BS#0UQgUT$kf~k2X`@o>uBxlr)^FOtH1*U*`&|zB z%1xmzBt44C$*bHp;#;4~qbSr0`KtS|mzBy5sx8IBxubb$ea(yC@&c_ZRT_g`MAame zDP$e)!keFwVK7d*w^Y_GgN?5Ipf4q!b>sMr_|9;71!Ww-8^CMURozYCH~h_(a3G8C zCjCs?iNZ>`-yh#m*hG4L8M9;hd&mpz&hcA4@lEBo{mrC(?tV(b2i<*??5p`AfzwRm zd11%$N5<91UF)@WuMN8Uz=z>dv6?QrDm)G<;}&ZO@|8IrD`**7glO)x4ld@xV<<}o z;)(^wu^TE=@P%yLw||!S6c{dT-vhT7B1KNdMY6Qrm3W-whSK(vM+XPMe zwO%w8@GKfBuf*M(Eu)Ul^_CC~HzDZ^QT_b{Po4Y({qA>5cB!Pe^G!uH|_Y8@Bs!wk0+kubO6>HzzF_!{N8)%ye*Qu(nx z&>~X2{={&lc?0tKymri;1g|B6){fO!$+^V4YP&SvAVe8LIcpAdt=CeeVMh|Js>39J zN?(S`?v#@oZ6v$BFtBDQi`FLP+Fe2$Im0`%QmX%5A-BZxf|si0FD{JKXKHm9TFS*5 z3N!L(EZJH&S{%UR4D)p}xf0$|V@-7=*chwZvW?7OC6AT>+W$Kh1>&w2>wXt+Z7865 z63Dztx1mzi5H?sC9?le(n19uQY;h0dppRC0=r$hDi|#-TZB)MB_P94)+@QYX_{}ZF z?H0hIgm<-CX_Vy-I<$6I<_g;jHMX0Boff#X`?Xrj6-vurtbDXSQwGD!Z5zwg!BZRJ zgSWbb?haFyD+43T+T&vpv)jW(jnlSg+nSAhi2JuvU;&ND=Ej#7;m%mImam`E`5Jib zF1)(?ANl}RRGzv^wE||F@K9?!uV&HUCaSniMg0s7obdrZ5m`t^T<3>>h`!m z)KLwAJbC3|;~tbvq#~1Jf0TRIQmw|o;e2sBx*||$ScDleRMDIv4sY*~)l2Tl1}9oWiyiYD4RWv)geoaFk$&+h&=Lr7mP0x-NRgNBY^s!KF$z*B23EEMb#^ zuQw(|+=+B`(T=`=zCplLvHz$rphUYv`}-}A4u<;Zl5AnSmbsW-1z zQt~>7>?l=p`Q?1)!;zWGK3f08LIF=_x959?3WL6#U;+L+39_cl-St~eylllUKT@iU zFC|O7uw1DQEo<@f(K2HgvCkIv*Y@C@ET6;6E|TX;%j#MU--4QgyYelA-78=V@o>I| z><*${v?YVPf;r^UmtD>qukOsV!Ktqx)C^a;fos+TQkg zf1>1Q59`sS7Xi&#^ra|db=AMBxC~uC66|3wwDvuY9LX!LuvavZ| zwavvZp3bXQ+B2ucc!Nu~8rub5-FsYL9H`{u&MY6+m2VEi3F@|I1o+D7wtP_)Lns9k*!Q z?qgG_JHN{mXZVH@3P!_@&GC*TI!40Ce6%j3;;RxSAigYNAg)AjDGcZt?XOj`12x7N zh9}4Kmm)r!2t8}=#5cHh*SSm%yZzB6JFbdI8NRBl@CBh zyZ#-N%9GWg$sL6@bGfwhSbRpqx%j`sRsU$u71$+*Uon0M1I00R-%*xj;XZe?g!>}O z^dH3rE$YHd5tld0;5#CkSN(;$@Ww`^x85pl?$a1VivVnmT>^T^A*;_u= zHGAFbAbLQTp4s{0*q*p07;TW%Ym4|O$~@AWtlP#W3X&lz1+PNOC|?|N1!$=?UcRzN z?rTPilVJC{`({_bC-U?1>CI~^7zEYpze=+ztMO_+j;lj&pkC+!nh3YtL*VJ+m&!fkKJ z7PpV0>FwWaT+sSrwT4?=mlU}WhVl)k-#wHDM490vid^1(f)0ZQ&<4#^^^8*ze4L*)@t|ztCuK1f(k~)_Fe&MqE&%NhgKWN8czwsF7p zu%~}>K8Mkg8i&#{u>MDDd=EvJ`;omi)l0&chc1^!WO?%5;DdZ4OFwj?x)A@ymB%Gv zw!7D_P|H5=aQk$8_KCNH>YcaDCVXe}2WYjy4z1M{d|T$PHuYEW>5c`RoiQv#Ny#Xp z7>wmJHUD`bQz{PQmC^Ot@cOb@;kQOOd{Y~RQj7y*xEC!v)L8$Jep1CyM09X!%O5S? z+&&N^USvbYbJ-%mRYhrK%J9tvU$J9GaTO2e^JS(QO@mU-ohP5@F(3Ij?q80L+cS5t ziy8MYFAQ%3cb~Wm>25t7x4X2{ZTA-NJtB=UHhFwb^+m>GwYOwiC)|i)Qou-3sG4^T zpx313E{meKq*&_`(OU{*ZQ7N@y7Wvf5A2Z~MYPJ!joBUfZdabyr`NcL(o!1@{BE-+ z66fOe7518Z0rvz(VQfFj<>tEKQmNv$mYzs_QChwM-0p3FuhYXN#EV33*pN9ZU-7Up zy9?#Rg>5VpW6bW_Qb6!hQ(Vl~a{YTE$v$FTcHTwZYz_o9q}#?FhAR5hQnhySxNoDZ zDV4{$?Z#60-RslcrCi;ess4N{n-D^rk<1WCbOxM!=OO_ww^ptbyQcz@ZbwK*H^Wbj2A5x$1p}{ zeR}K|CKdHcdd!b3E!Ijyz6D3}pIe7&CB9JMR7gI|?M-&;!z{9$@o~_oWg33PergML z(Zo4Y7m6QaNOh^mOU5_jx}CnE*INqD%g!opn)=7waaklGlP&6jRw()a+;?T)-b6n@ zephCQ-}d;6T(P>rJv}np^R+TBxIS-iCq^Vz#xsS%Y7jPrIU9J)^aaih2gKT^u=2#K~cUuybFe6a3`TiHj96rzCmwvsE?`JBHN2vw`E zF_`-s!~EBCxP4>>0D!x`h%;}-= zY5^~38(j~-t2&o@1#3eER5yE~h$`kdV@_GKIlrC5)Rk`kjlT!OuGDFYXQb_G5sI=9 zhq_{q^L9V%DQ5@r8}j&`wd8Xymr8r2omz7dhj*n0GT?YoW+z_fIkFTl0){n=D6Pa> zDBfp`=123VmC&(=YB+ZTmT zLXL3tPj5dx$E5_nIt|m)jBS8HcxsY_LAg9%p7e^ud|CSCLFaCMkCaFkaoy!%h|4}z zml&I^fP~Nq4Z8bk;Im-_6!F+9CXaiba zUD;Ze5+8tl7^;s)BAV(tihJeS?!U7jR7b;rY<9gn;hL9o&?|a`eA^Bp_sDVkToOFx zT_jZ=%*Er6%?;FWb-FknJJBUq04U~rq<}GAU%v1abQmpU-cV6yb-6q|j`zh)gM(G| zz_DW~-j8e6U8-PU1Uhp4FL)I<_NMUw!3cdj&|)8?Rd+~hAu8RuIMxP*EAE(4GLltFaDZfUOV8TkcDz-id0p(vj^hC} zjG_YCG>Gwr9D9_jVgLfp3cIrX{gwQfm*t$;hd3qnqhqAT)-?X*$jD{;9$T(0c~odD zMb93lsVwJ&w>WCNOe%7e9J|WAeQ@f?T+}xHUIMF zsH@J`(3^Hzqun214f;Ub&6yk{3}Odcxb26NHixVp94d@{ z)SKGmT|KVq0|{$!9_wustIH|q>xaiSj*g87$NCfS+3SYMBIRz2nb*UQVmKbv#!9Dc z;+hz`kt2DG-x|W#wD5O9h++*w(0x_SBZ?rX%RMja!qS=E3L3w@t2)h+(2c&DT#(0U zD-z8+T!@`9e#~Dc=dFN~D;RJ#;A(oDvC_G6w74@{DXPC!*-#&tyEw?pgb#uOmo7nx% z6=J;ZxDECq#=OI5^N0~sVeBWz;M~}hwLladoK=u+1mMJj07g+SVMx6u{82iqwCQ64 zGS(#(*K=K0@Lj?MCS#L=OoBnNZu+aCHS-7k;>NnqU5#^UOBuj|U3wRW>F z-r%0Ky%xM?!)C+vJwbSP$bqOkQT3pHn zN$MEv#MivBK^#2UO?k4#{mB;MV7-+D?Bq1~KwvMDh}mPD*LVpDCXl{M9fb(}4oQ|>^>@JkY zj?0W4$FHIIB%0|T$Ak?x4q@?E|M;m~uKCvao_gXdcHDxvM83NAZDL+VzexMb;a+(C+nNu+V8cRuBzW&}tPW8& z_uY1!{`GN-%%^S&pxqupUJj02u-?4<;!)04Kt*A*H6?C@pDAIFDO z{c$o?OykZDWBMIObE2JA#O%`Id6s$(}l8S^7X^!41; zwEY+(4WdJ8U%ZQ&NM*KU*y zJV*!J0GEM=8vxIE&Y8q~|NOFbN?@+WXtA)X)w~GgUBg^@6Z03#m{S(*N|zM(1!iNH zzTx4~P)OzhAj`04xauCYF}epT!nebp7oMs7u;7J3K%haLRBY0PfliAH1=l9{uFjjA z7m8bY1#>rr8~DLAFgJMY48DT8!Bi;1EVHgj<3^@A{Wdn2Jz2L2V%@ghea6&F?>2jJ z&TLEGnT_3j$pbPXHYWT@2F-Bp4BO${M#6^ByTC_goGED4CYj_PJ&eyy!{Bf5Jtt(j zUf>?r=8d&{b|caeT%*z$8gLw9IRfWFRXm1W$8O8V^|nDYa`;`dhCV|-Hn90N-F@Nn z1OBRetPEQGDo5@LqtnFN6@ItR&Uhb7P_BUCx_&q*b1U9Az*mJ>sad&jf-wd+z)h@lcwA$5BwbT`~evB1p zc_(YE6M0En62zRl1Pt%3?4<{4Rpmy`8Nl zHSOl{uxptIhp2&s#)*qrjX0d`DT@sW*NSVEXMS_AJ{*KoOkGoe2d$gf$@akllQX$1=>bKXgB@1>lVFQ?_l5H_m#yq9EbEA@ zI71b+?uE74%J6v7CWNopA++c5-ieXG4Z$cLwg)#1ntD#$I82zA=~OtitQ(~=f@t|6 zv_D(*t{hik;P$G)(lCY)R#zR}v1O!?@YJB~bdy#Iuqx$4+))sf6d$5;pd+g@DN zyQ);pbh$h^qPtu==ghS$mvLHYoHg-5T$3GV=nt9Mb^LMYcHnHrc(&b=-&YoRCBKD8v;*-d^y9%jMzI}vh8Yo{2&%Uh8MloKGy;_YN4+*ykXM`+T-*fW(j^A9;)mo z=DWz9C-23U4uh!HS7hIFgBX2oASdR?zcTr~dL(c7vg6BWl_J9?Ma(d&xS z|H@8PKCDpLp{paD(&m!&zjcqHJA?l@J#@^%rtYVtx68e6H0}R?+dY-ZV~B(Eg+5Rk zDdU4}rGg=DTtOgHzzY-_JoK_u$`y_=tP&FsEK6C6$Q6!oX`jcrjt?H6v7>pEFm!>M z>u=YefB~t_S$G`ieLOAd_K9y=HYa##lZ2C5vrCv0vik+l{Ghb@rC``CR5xf1--q&J z7=Vu=7fH6TDZzVnc5>m;r}|+u=P+wy98d{LT75Z$Z5!FW%O;){RSOJY{iN zmwItgt3twPvIUp;Xz;E7zueotOZQ*oah-+3ycoHTKx{uAFW0+q$c(XE3wm)3JP^Wp z(Nf(Jy3;hbeth7rbx!8w5o1sLMN51vA<2QiC6_ASP4W0WXJr0Qnd=)*3q^JG&(-w0ZdBZsr0(8rJ*3(*Hr;BUyg zBT8>xY;s`T8VQzpe=2(KxCx zp2vock|5F`Wc}uri|82ef1w@+&5>Y&3!5lUJl~0;DsU%bKkJtR!eu_ zO~d`;DJwqdHu8;QToH?(S43b*b>C3jpoPSzV2g3|OIZ*m7{0osWnhqmHFnLN8~rAa zd9jl`O3|R!(D-_X5q_)bawfsSqOT1uz80DKrVmCg*T@ai4P21#Xbwi>>*EJg%+DZQ zHZhPJ@hDo`TQ>*S|Db-<4Tb)*i%&)4Cm6qf0T)re!y$2{?YG@DXLG%Q!Kk(RWVw)V z!AJiqg)}TD*=j*tuMb`Pu+;g`c$T9!y?YsdYVN=qUFOFnX@s=b_Mou(_0lxcQNgjh zY`^WVM-XH41#$=S!D;6$B~Bh@mYL5+Ct{&WN>6;dhB+8aZq?|hR#UC(Moi&w`W&5H z8U^55H_wi5a-_Y%wRVzdT3rQ27*2OrP~(+RFu(WHm8jOSOJdh0K`rB_-%9Vly}OK7 zh|N>C&BhC6;qetyK$7bUXv}ujdhs|!m#~)gpf5B*0oa|}RP>slABn!OyUhNnF@>{8jVY^*u%Pc z1~bQJEU=PKeQ?8qJ^bC{^D}S1a7A`ecRExrX=S0<(f zcJ#t-=t6()_&vX2Sms+6hGEGC+0BwfKIttz= z%cl9O__g2DI0rUNuUDX2PiFbXzl+D?`P1;y788kC>oiOouA5uT)*H)~TSiiGF|2h> z1co|9x@bAP}(7w-*@w~}G+u8by|^`qc2Y~ql#y!Rjn;P!c5bCE$$M1&P>j%D@3v9O+1L5h7I&eAdPC;Yjck8IS z&a-us_uJ4HU^rbJ8I)|sZTLE8?2vGE0s74#CjIq|+s!KrvX}*H__?3sa}Gz;HMl#A z8{!1kKZ?BB?!QYvJ!Tf&5y&&c!} z3GieSzIb3WJ~7APQsxK<-zl)kTd2;{7Q&ieCK%}7_Tm=_1O+b<*s>Q0V0}>!17cS@ z40MCJRDGtFr3yXnoJf%O@|kor?=*VZ;>vM;=pfMZ~@UJ zrN&y^xbi|7yc^8;mLyn<*ABsBSrGxpU0j%o(8}E=XDGPD z64-v$M$z8vg4NPk@3mZ{qu%91;x{WE#hiv`5LEO2rBpR^LtW!N-{1%YwXV$Vk_(O3 zLonAo3Z+LPhrtqWEKJP~5W+`TQr!G4AGa*9!y55KKM&i-U*Cww-gRAW#p}cgRV(LQ z&^5Ma8C2TtU9dV=6+V7e=~m@K5-ga;Pb(C-ej#59*gi!S6l?^m z+xbR|e@@l=lV50Aw$SMbkA!*TF6zKv0)lI;cQA#>LHVHg@Ex>6xrJ#BL-P6Cr$haU1;#&1IB3RJ+DMWL3jz%6lfE z!k*LO;0ck`ijI6;mAKo{x^T!jel~SS7%Xdi69SV(3mo|ea%s&D63s{`4hU&qc3SW+k^Mx!$H;bUQ9$LtU;_OZI?$FN`; ze-*|*R!yR6Z~}=Nu=O{%;X=PIs;iQtjI9Fg`?`~DypC8;mnv^uUSCPBS+^Mz+%c<^ zYJW5NU$f!6##(`E)@|9mAqi(m^KXRyt=@gg(8JO#N)>i(b@!m>Vm-!y;Si21`0lo8 z(0abQdwjf``p?1a5ytGae0uo;-QA;p-v$L^|{eElNn9YGa4T)hXuo(SDFGZhFcX4S{Ld=2H5$ApuBTm<%SW$ zH?sSJdhnL+_1li>=)fs5fFDjV-w6(|=w2e&IdD{&i7KNuK#mRbi`>9ajvu)O_=PJ} zavOWXAm4i!gye>+<7mX>M$1QGNjG>pLzUtFL9PxC6l=qQc5ramJssR0Impu z%Qy1hQ3coz`q}9p=a1Zezv)|JkSCisJ8j212|k(F!;xN9w-h!v^7Oqn5@setb?7qt zj{3*rcx+pJNl;dX3nPVEaH0sS;;GvlCqv^|7Y?o%N)2~$ z8oUk&U*)ctjo=m=LN@bX7C+~whW}6>9GQ+l!p+fQeLx9Sez2dLETt+X!5+G1q42mTt2N#Z{rR7I7+V}sES3G+{$ve_gU)d;=)cjzj9GF?_Kan z_+`~Q-)oG})iJ(w*{%V6Xw38{E}84Xo6gdyc_v}*C|}$@@BJ-FtPA9I$?ZgYVWD5` zW}nOL`n(&c@LP3qjQqKy^iOChU*IAznBAiANuOxX!3$1{MD56<25&eD!~DF=!H1zVquQ}_`!Kj4ZxuX>Mq!h$Ykh78H%SDCoVqIsWq6D{xNG(1t?RopYq$0GbaVeeeRO_ieccg!4d&(= z!GoV$e{kG;X7nz30&x}heBHAE0l2dG89c|}Ny!O1b#hMJuM23d6qx~5{lS3>9TMZ8 zhQkbv9Nj9)Dt40VC$fAo9fxIYUg1l@XFQAY_AcC!76Os*yhGgBH;l+Zk z?nW|Mx8}Cg2V1qY&uy=@dZn#R)!qvU;Ypw`kb)wDXnarHcpI<=1WWGscV^CJvV>c` zpUeH{$-tTUo^!tEcYf!0Ugyl&96a~gg*ZVFV&G!oEO7fwf>1A51p{y=ZcgXQ+|?`L z(O>DB2Tw{r3Xam#<#bA}O_GXL|IqY(R|>+9CI|vOk=5X35`5g_bb2?hUt3q>^h)wt z1V-!d_;f*d65;eDJ^5uGrOF^(AOne=RjwMh%ftLb^{~$n1TzxT)5rzTQMy-K$f&FJ4jLp{#;#PPgbeo73(;YxQ?A`uU0dO-uC1&? z_(d|(1Yt44cj0-di|n)*H>Wcvdu6tcMRjR~)1JIN@Vaq2Yf%qsb+{$Zu<5DYP~cD5%Kj@E7No5Jlb(7Rq)U=20{K>yNoAS`kLYr^kv0?I^wi53OhIYZdcC@U zXc^BTEwyF3^fJhH{31;GIGszE6x^AcvxN5z2Lh2^z_V+L+As9!u0Rx}ON3Ly>244l zu1&6TSt?sw<8r#oq^h)<>b35g@>!`Bn}G!3IzjM}SdvR=6Y*qzV7eAN1mS6j`Y>A% zYK*Gh#B0hCgqaBUtq_FLv4SuLVMTCs^=K{y&#S5r!yG0vUF*( z*F!cUw_>wba;;BY$Zd547?gJr%I?5(J1x76J z|EmRxm5;iq?5jh*O_K$oq^)V_h4^5uxxPh;E$R6XFYg&GC2f_Jm8oKKfSC;O87;wO z=K2FtaGd<^g0f#s78^muV%$rBQ~4G=JAa$kNXX>YkYbvJu*L+(;fM|KGF{d4m7+Y*}!yw znjg(=I4->%HZ~j=n-7Z3ds9^FT~r@v0;ma9g{Ad}rNu$nnsK1MUs}TSxJOymtF#5T z_9}9p*gQsTHY!KO=IwFQp^n%b5b2rODPI*hAdOW{FI*Iq`wHYE87*OBN++5RGpw>d z{5RC+Pe+QF}6p*&vF|D@PBA%}VPi%MZzFp7L(AjLIL!K<75us5Ym$?ZjL7}}bY<5_z>_dthO z<prX_sFw}m$d`W8mQgXXHa=V~D^)b{0m2VIE zwpyqbUsfX;g#g0;1s>l56!%$xhTM09C06Qhsn?*O$HZ+72wlWVDh9RyHx|Del)J<6 z!DW5f%Cf%3D+7n6b*$!Mm2;@rrAo<%uTX6Um-W^kkgo{mh{+BCsy8MW9Swg$jmEJW zy^cC>GyL1f5o9%bK!VubtX9byKA3VmSn?s-_^3N2bNG9(p_1Db%A{+-TGQr63{zs@#|URFmiE5UiKx-eOJI$*zCT!OmL{_XnQ{u| z3l$l{rtHRR7owtKFCR|cQwrdi6w1n|HWvV5R}ar9j3Du zF4=?2tk8cFGHLQXXb?in4e}WXF)KL`lwj}f_!5I7vQ1dSCab9aL&LXK6?nTklg!FE z;F~W^3QZVSc~k7@(&mP1mY>VY9F(jKA~}$McjQrGf(#laMWP|6C@vxnLUT+=U;-a z3cpD;;`NQi7QKBM(*ym|=***%#j!*_9X6p;U?dunALio&Xj*8}lhEQCODy&MN~bhI z>7@Qa^ZjT?fqW)x#t1wGO>NR*z5J|B&*;p=kYhmp!U6NL>6#T>yODiZszO9 zfhsSbtv{55(iG)jRR5=TI3}-9KBJZAAM3BT9&10U{l=@E%Ssh8215ib;BLoGxVnIg zDzCpcsUx=+LkPwY>S$$ZNBb6OQ`~57SoS%(_flGFbcq-vI%onpN~kUCyk}O*`AzAD z&(-oa=6*gWMjlU{1u|HN#G+^yxajb4cV>O=JsFNsN-*2>>PNs!>qFDEbib-k1*^R^ zT%lqb@SxLD(xf%()W#gFhqCrd^TJ~z^h?UXfd(K660^dbh$5VD9F0tnKEaxe1;|m41!!k7DSjEX!3~0ghj26_P#M+Hp4w?{!Fa~gI2O%`4@R)Xk;O{UZR>@*L zN~fN--bDLi^SKjqG7W!dWC!HY)QXz$5lm^tT#=p8^2nEe9~jspZo3(ogtCpwA7B0D z^Uptj<~_q<|NCEs78;bJRNJE|#al`n3W*6Y7Tk8zE!1w6WBxB=#7BM5N-62q`VXxn zX%Sgq6r0x=lna=@#pXH6xzdrWfb~sn*Ywb3MEDkJ~7(JBaXbl@fIb+y+NFBZ?Dy^s( ztg27p1VKzmU%P37@ESE5WxrC~tF-zrn8Zi>5r7`jBjOn~{xuvkb31JrP11f(F-rVskQzxM%K!jidZ+ zd%_|-Kb|{5-1Z^f_xx?IDtJ8*8y-bsvDs;0%xk@4hI$OJ~4TgpX3=MY~{jD+n4s?vK z{1;-xZP#OEhmk+G&ws%n23nB9f59kYDLKBOla+U}fA5~Kow)VSAa*cfB1KFA3x?P@ z&A<0m{+YEP(zyF-)mBihHnCqybqJNvnK@BZdR@5 zrb}ae=TKv*NVA)&RBT>l&{P^lIgiou7^~&6c}9`~xer#;* zHpTZf7<#C2MA2U5G?wWRU)vtvd8&D2dqo4hKPE5Bn2LN;j{-i0clyr9Z)8~?4JSkj zG8zSut9c=eL>x}u7%Iq-`V*UP49^`Z>_|A__uMK>SkmvwBCTDq@$Ic2o6ytaKX1rt zxW|BrDtxtnYcBx|ycm`5jib3hztUG{0d;h8=`y2FQ?*rQOwC$G|!f1MGk+147+0hS#?(ZYD!XhAb=LuQM20ksgZh*BM9De#C0n08=7OWd8&fl9=%FCLm|DFroWA zPM*-%ECvEfLe9BHxl9l|#j(m2mhW4=HdXXmI7S1JwhyaD2=|=yZsS9XAK(`+n zh9^@sej6w{)`c+r3!wHsR|EqG^H{T)N~!Y9l!t$xX-!E_0s{2!3q#uv?1hG64sJ4c zIMf0H7ZVCYP{G!oFvH0 ze7Db(SHluy@{re{Y_zfo%l93_OnIUI;Y2~2i&$z3A+M2Q3HrWc6l6PWMybLRBkN7& z9V|X|?+3~|*`%2m@S+~Dtui&3Z-!<;Qv+JNl5N5|IOH3Pb1_Q373-*sem1Q6&l%+# zVO28dJY>+l3e`~G5-c%`fnUO}v|?i<Ub4vwcS3T#B24iy+s z%UD~WeKd?#?yv+!-(15SvHl1p%%_(Fd2%q{5?XB7O{KcM&?JV=QwC76&>YNp#H1`7 zqNCPgdRCw~sEKw|pMy0Kwu#!a2Wj(QBPOlqS0pL7o0`XSm@$>s;Ks!E7@=bkOA(x0 ze?rPr&MLVdDu;p&EBXTJi@i9|GT1~daU+tUFIot@fV0j@HwM>O{OuMj8IQ1Bf?Gcf zFJLH~*|CsG?)fcdC#4TD)AJKs&l;;+Xdww3C=0E@JQT?i%Q@vTA+;s zb!*1|kXewDRP(?xERU_P51J<2hHaC5`qgez6AdN_Y%p09+`St;H5eCMYM+4@4=bM2 z@U-A*XD=d4?KV8wh~k9xgK;#r6as}F%SSh$5he8407|5eCZ=SVvl|^(-6>G>`_W2AyCI7b_bL9<)^o`jZ)6-zIXdAD#%QbmOx)2T85`P^v#n>7GdeO_Q(7l<1Ww2j z%b^W9?C3!Jc?6XyM>5(n_QoHVC!mqgwz!$P2ioDo7@qJL2v5prIrA1pOgIaLE!uG8 zLo~7%x~W>S+QlbZvfdD%ZH3tVffjkRY6|McK#9SX_5@!4WMO)_lI)2cs7VmEpce0i zCEgNWI`qf@LVR+Z|Gd$=IK1=`>NeyZFnY7X^Rxn`biltQO*u|QKaz3;5aWt^O+NDRr%DJ^I07a#dgs9jQY``t!ZE?oqimcYGwBXc28vYBzCv4yPe&qvHJ{m zPiOa8?4HT)bJ^X&?m6tfnBAAMdl9>@WcStVelNS1vU>%)SFw8y?t)N7x1Q64uq`9> zkX@^8B=ioU*@Rvvw1m(f2(2O1LP#dmOz1H}G=fz~(1f92Rx;Z`L=9w88GjG1xmOg9F&9mlY+$sz`s##R$VaGUa9=TSk zUhfhL(z1m`b?(ic>UC9;ZCZJXEh8%{(^lY;yyazXmu*qq`t@>cb$OXojU&SFdfas$ z=1H|>*VNdSQ#!A0xy$SFY;aWwRg&bMla{t|cn&FJ5xTolBP$6c*jJe8tM*yH~Bg=UZiK%PU-!>#C~nyT4|AZJql84^BpJ*tlu) zgDBE1vu>SzTV~euG-0ZDj!m#ln_7`lSiI6!m}gs_U67wU!&ZmfJ#`-2JloWY(O?lH zIy7yqTwPP)P4m{2ZE&SQxtUU3T}^paS#@oi*HfNWQ?p@xn%h%%pQ~K*rj^&NcURZA zJTpBKJIU#CJQXEwyi;F3_c$E?h{S_^u6zI|G|_0XU9`N{L$0TJp1FFKl$nZ{pX+k z{9m5?#q+;>;l+P_Y1glQ{hOD6+x)v%UVZKN|Mu^@_q4R`ZQJ+%+B^0i_`@In^yh8`$4|U{@|}0P-h2Op4?p_&lkT2R!@ZyV$6xzSo&Nl9U-X|j`{lXw zU;X{U09t0`JTyNSO;2jAbe^8tIXOBPPZwd#qd0?W&`$JI=rzB)Es*8sNSM_cYwk;da5j2DcCHAlxyy_u+cs`r(9`f-o8`0gm(>b>Sz$ghM8F zX5JKUq8=T&9N-kdIpNCTUV{50+{iUzfe{OgSYX5gBNiC3z=#D#EHGk$5etl1V8j9= z78tR>f8PREPO+3uSmd_eeUdkjaj7N;5NKoO5NT4kexWer!uP&>}%OS2^4PF+>bebBlLMLyA8dRz7Fj1;> zR=6@RcC{qzEY(ujEEZN#y`iG|7V>9m2Jm2O&RJe{KZVUjSY>66?5!f7gM5QRbI7Ze zYBBKoh)zq%=UQLx-b~4g;KN@OD6jI6Z>8p2?&Km33Y;S-Y( zPl`Whs1;r`lnaLq6|!4+!pJPN-RKdXjd2SHVkp=1F;d*+)RjWzFUw#wS^a0@qARgTPTu; z?_=SO2;YgVJR?>2u^10MPC}&bR&aOXGYpG3rAG8q#B4-#(yiq--1_K-LxE6Y4sN?{ zM~d9q^12F_@Ej_VfftcS=Ul{gE}+|D-1@MgZ;Vv%G1Jnz+I11{Nz(NWu)5f7DNxfg zG$xxZJ>5}MWG(d>+?|FlgU{GyNG~d7!KJp+B6oU|p~G%fichVOK`gl&5!qEZ*K!yttK=`k4HaNP7 zQ$aUe`n;|{7|(YeaCBZ)9Iky5;glC)JXl^fJPA`?9FuP8;QRzn;uFS$@o6iQF!4Da zPM;SM&-FP8O!~NWWiN%y*(d)$utd zz7L$)8lN!dm+1H$52yb^q~-d1fur^Bg3Lc_@(FYKKAn7yNuSaLL3mr^6Xtxkj?Xc( zKRCS_zf;HW)bTkc{?2OzjH;?V33K^fIzGqDKKT4K#-#Fnz?@HjZ~@&k%=q{Tz(mdm zrf56d+bWIm3C{rM27K72ziUIB;cS}@P6guVDg}q#G3m1toIh!N!kk~K<8w@Ws*JZZK4H%1ZL9zR9236?oR2j=Va{Kxlh5&R<^3Dd z^77i_E-r5iWNt+`)h}T#pVukr!!ha82Tp^=C(QXxI(;}Mz7HQ8w`+XD|A=p$1ef9eJe)rNq0=WBCkaWP2Xym(5rl0obS-_3GV>s1{_PHzkfxX;dFZ*oC?Iz^)_&{Zs}76;Wo%1-3ar% zczYw=I40dn!MQ`@6XtvZgo)2FfciM_H;kA9cD(!&Js?8m78_Qp2<+`I&}kJ@8u% z(^_JmhG}j+#QDG{G)!~E#~OA3pW=M11HaO+4f5kGYFTJKcD07B;7ryqt#eW}?8BO2 z0moQx6l$2}>u+nA=8kn5E(P{-4rD&8VOonmu3;bY-J#)hg#WXKX-xi=hH1RrqhTA3 z^BSgc=`9V@nD!CJ;GEJh%>@@UO!FZ9DuwEf#>{aVrtx-)hG{HH_nO4)^QuS2}FMkCdPT zlW)=C1RYM&VY?2`(BWHkc)kwj>u{kC)8DDP8jeoxUIRA{j(#zc2sZ(aj)6^tqcghH zZ3fxU_)8TMA$V~$N-^kA-)(Stet{tZZhT zchl@yGi#-q%_fx}KcBP^W3-7SDMM`Y;T^{{Na6~`aQcTNnZE)4p;V+z~t;o64o3^a1yl}

        -  npm install request
        -
        - -Or from source: - -
        -  git clone git://github.com/mikeal/request.git 
        -  cd request
        -  npm link
        -
        - -## Super simple to use - -Request is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default. - -```javascript -var request = require('request'); -request('http://www.google.com', function (error, response, body) { - if (!error && response.statusCode == 200) { - console.log(body) // Print the google web page. - } -}) -``` - -## Streaming - -You can stream any response to a file stream. - -```javascript -request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png')) -``` - -You can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers. - -```javascript -fs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json')) -``` - -Request can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers. - -```javascript -request.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png')) -``` - -Now let's get fancy. - -```javascript -http.createServer(function (req, resp) { - if (req.url === '/doodle.png') { - if (req.method === 'PUT') { - req.pipe(request.put('http://mysite.com/doodle.png')) - } else if (req.method === 'GET' || req.method === 'HEAD') { - request.get('http://mysite.com/doodle.png').pipe(resp) - } - } -}) -``` - -You can also pipe() from a http.ServerRequest instance and to a http.ServerResponse instance. The HTTP method and headers will be sent as well as the entity-body data. Which means that, if you don't really care about security, you can do: - -```javascript -http.createServer(function (req, resp) { - if (req.url === '/doodle.png') { - var x = request('http://mysite.com/doodle.png') - req.pipe(x) - x.pipe(resp) - } -}) -``` - -And since pipe() returns the destination stream in node 0.5.x you can do one line proxying :) - -```javascript -req.pipe(request('http://mysite.com/doodle.png')).pipe(resp) -``` - -Also, none of this new functionality conflicts with requests previous features, it just expands them. - -```javascript -var r = request.defaults({'proxy':'http://localproxy.com'}) - -http.createServer(function (req, resp) { - if (req.url === '/doodle.png') { - r.get('http://google.com/doodle.png').pipe(resp) - } -}) -``` -You can still use intermediate proxies, the requests will still follow HTTP forwards, etc. - -## Forms - -`request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API. - -Url encoded forms are simple - -```javascript -request.post('http://service.com/upload', {form:{key:'value'}}) -// or -request.post('http://service.com/upload').form({key:'value'}) -``` - -For `multipart/form-data` we use the [form-data](https://github.com/felixge/node-form-data) library by [@felixge](https://github.com/felixge). You don't need to worry about piping the form object or setting the headers, `request` will handle that for you. - -```javascript -var r = request.post('http://service.com/upload') -var form = r.form() -form.append('my_field', 'my_value') -form.append('my_buffer', new Buffer([1, 2, 3])) -form.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png')) -form.append('remote_file', request('http://google.com/doodle.png')) -``` - -## OAuth Signing - -```javascript -// Twitter OAuth -var qs = require('querystring') - , oauth = - { callback: 'http://mysite.com/callback/' - , consumer_key: CONSUMER_KEY - , consumer_secret: CONSUMER_SECRET - } - , url = 'https://api.twitter.com/oauth/request_token' - ; -request.post({url:url, oauth:oauth}, function (e, r, body) { - // Assume by some stretch of magic you aquired the verifier - var access_token = qs.parse(body) - , oauth = - { consumer_key: CONSUMER_KEY - , consumer_secret: CONSUMER_SECRET - , token: access_token.oauth_token - , verifier: VERIFIER - , token_secret: access_token.oauth_token_secret - } - , url = 'https://api.twitter.com/oauth/access_token' - ; - request.post({url:url, oauth:oauth}, function (e, r, body) { - var perm_token = qs.parse(body) - , oauth = - { consumer_key: CONSUMER_KEY - , consumer_secret: CONSUMER_SECRET - , token: perm_token.oauth_token - , token_secret: perm_token.oauth_token_secret - } - , url = 'https://api.twitter.com/1/users/show.json?' - , params = - { screen_name: perm_token.screen_name - , user_id: perm_token.user_id - } - ; - url += qs.stringify(params) - request.get({url:url, oauth:oauth, json:true}, function (e, r, user) { - console.log(user) - }) - }) -}) -``` - - - -### request(options, callback) - -The first argument can be either a url or an options object. The only required option is uri, all others are optional. - -* `uri` || `url` - fully qualified uri or a parsed url object from url.parse() -* `qs` - object containing querystring values to be appended to the uri -* `method` - http method, defaults to GET -* `headers` - http headers, defaults to {} -* `body` - entity body for POST and PUT requests. Must be buffer or string. -* `form` - when passed an object this will set `body` but to a querystring representation of value and adds `Content-type: application/x-www-form-urlencoded; charset=utf-8` header. When passed no option a FormData instance is returned that will be piped to request. -* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header. Additionally, parses the response body as json. -* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below. -* `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true. -* `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects. defaults to false. -* `maxRedirects` - the maximum number of redirects to follow, defaults to 10. -* `encoding` - Encoding to be used on `setEncoding` of response data. If set to `null`, the body is returned as a Buffer. -* `pool` - A hash object containing the agents for these requests. If omitted this request will use the global pool which is set to node's default maxSockets. -* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool. -* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request -* `proxy` - An HTTP proxy to be used. Support proxy Auth with Basic Auth the same way it's supported with the `url` parameter by embedding the auth info in the uri. -* `oauth` - Options for OAuth HMAC-SHA1 signing, see documentation above. -* `strictSSL` - Set to `true` to require that SSL certificates be valid. Note: to use your own certificate authority, you need to specify an agent that was created with that ca as an option. -* `jar` - Set to `false` if you don't want cookies to be remembered for future use or define your custom cookie jar (see examples section) -* `aws` - object containing aws signing information, should have the properties `key` and `secret` as well as `bucket` unless you're specifying your bucket as part of the path, or you are making a request that doesn't use a bucket (i.e. GET Services) - - -The callback argument gets 3 arguments. The first is an error when applicable (usually from the http.Client option not the http.ClientRequest object). The second in an http.ClientResponse object. The third is the response body String or Buffer. - -## Convenience methods - -There are also shorthand methods for different HTTP METHODs and some other conveniences. - -### request.defaults(options) - -This method returns a wrapper around the normal request API that defaults to whatever options you pass in to it. - -### request.put - -Same as request() but defaults to `method: "PUT"`. - -```javascript -request.put(url) -``` - -### request.post - -Same as request() but defaults to `method: "POST"`. - -```javascript -request.post(url) -``` - -### request.head - -Same as request() but defaults to `method: "HEAD"`. - -```javascript -request.head(url) -``` - -### request.del - -Same as request() but defaults to `method: "DELETE"`. - -```javascript -request.del(url) -``` - -### request.get - -Alias to normal request method for uniformity. - -```javascript -request.get(url) -``` -### request.cookie - -Function that creates a new cookie. - -```javascript -request.cookie('cookie_string_here') -``` -### request.jar - -Function that creates a new cookie jar. - -```javascript -request.jar() -``` - - -## Examples: - -```javascript - var request = require('request') - , rand = Math.floor(Math.random()*100000000).toString() - ; - request( - { method: 'PUT' - , uri: 'http://mikeal.iriscouch.com/testjs/' + rand - , multipart: - [ { 'content-type': 'application/json' - , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) - } - , { body: 'I am an attachment' } - ] - } - , function (error, response, body) { - if(response.statusCode == 201){ - console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand) - } else { - console.log('error: '+ response.statusCode) - console.log(body) - } - } - ) -``` -Cookies are enabled by default (so they can be used in subsequent requests). To disable cookies set jar to false (either in defaults or in the options sent). - -```javascript -var request = request.defaults({jar: false}) -request('http://www.google.com', function () { - request('http://images.google.com') -}) -``` - -If you to use a custom cookie jar (instead of letting request use its own global cookie jar) you do so by setting the jar default or by specifying it as an option: - -```javascript -var j = request.jar() -var request = request.defaults({jar:j}) -request('http://www.google.com', function () { - request('http://images.google.com') -}) -``` -OR - -```javascript -var j = request.jar() -var cookie = request.cookie('your_cookie_here') -j.add(cookie) -request({url: 'http://www.google.com', jar: j}, function () { - request('http://images.google.com') -}) -``` diff --git a/node_modules/jsdom/node_modules/request/aws.js b/node_modules/jsdom/node_modules/request/aws.js deleted file mode 100644 index 4d8d950..0000000 --- a/node_modules/jsdom/node_modules/request/aws.js +++ /dev/null @@ -1,191 +0,0 @@ - -/*! - * knox - auth - * Copyright(c) 2010 LearnBoost - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var crypto = require('crypto') - , parse = require('url').parse - ; - -/** - * Valid keys. - */ - -var keys = - [ 'acl' - , 'location' - , 'logging' - , 'notification' - , 'partNumber' - , 'policy' - , 'requestPayment' - , 'torrent' - , 'uploadId' - , 'uploads' - , 'versionId' - , 'versioning' - , 'versions' - , 'website' - ] - -/** - * Return an "Authorization" header value with the given `options` - * in the form of "AWS :" - * - * @param {Object} options - * @return {String} - * @api private - */ - -exports.authorization = function(options){ - return 'AWS ' + options.key + ':' + exports.sign(options) -} - -/** - * Simple HMAC-SHA1 Wrapper - * - * @param {Object} options - * @return {String} - * @api private - */ - -exports.hmacSha1 = function(options){ - return crypto.createHmac('sha1', options.secret).update(options.message).digest('base64') -} - -/** - * Create a base64 sha1 HMAC for `options`. - * - * @param {Object} options - * @return {String} - * @api private - */ - -exports.sign = function(options){ - options.message = exports.stringToSign(options) - return exports.hmacSha1(options) -} - -/** - * Create a base64 sha1 HMAC for `options`. - * - * Specifically to be used with S3 presigned URLs - * - * @param {Object} options - * @return {String} - * @api private - */ - -exports.signQuery = function(options){ - options.message = exports.queryStringToSign(options) - return exports.hmacSha1(options) -} - -/** - * Return a string for sign() with the given `options`. - * - * Spec: - * - * \n - * \n - * \n - * \n - * [headers\n] - * - * - * @param {Object} options - * @return {String} - * @api private - */ - -exports.stringToSign = function(options){ - var headers = options.amazonHeaders || '' - if (headers) headers += '\n' - var r = - [ options.verb - , options.md5 - , options.contentType - , options.date.toUTCString() - , headers + options.resource - ] - return r.join('\n') -} - -/** - * Return a string for sign() with the given `options`, but is meant exclusively - * for S3 presigned URLs - * - * Spec: - * - * \n - * - * - * @param {Object} options - * @return {String} - * @api private - */ - -exports.queryStringToSign = function(options){ - return 'GET\n\n\n' + options.date + '\n' + options.resource -}; - -/** - * Perform the following: - * - * - ignore non-amazon headers - * - lowercase fields - * - sort lexicographically - * - trim whitespace between ":" - * - join with newline - * - * @param {Object} headers - * @return {String} - * @api private - */ - -exports.canonicalizeHeaders = function(headers){ - var buf = [] - , fields = Object.keys(headers) - ; - for (var i = 0, len = fields.length; i < len; ++i) { - var field = fields[i] - , val = headers[field] - , field = field.toLowerCase() - ; - if (0 !== field.indexOf('x-amz')) continue - buf.push(field + ':' + val) - } - return buf.sort().join('\n') -}; - -/** - * Perform the following: - * - * - ignore non sub-resources - * - sort lexicographically - * - * @param {String} resource - * @return {String} - * @api private - */ - -exports.canonicalizeResource = function(resource){ - var url = parse(resource, true) - , path = url.pathname - , buf = [] - ; - - Object.keys(url.query).forEach(function(key){ - if (!~keys.indexOf(key)) return - var val = '' == url.query[key] ? '' : '=' + encodeURIComponent(url.query[key]) - buf.push(key + val) - }) - - return path + (buf.length ? '?' + buf.sort().join('&') : '') -}; diff --git a/node_modules/jsdom/node_modules/request/forever.js b/node_modules/jsdom/node_modules/request/forever.js deleted file mode 100644 index 1e1d4b9..0000000 --- a/node_modules/jsdom/node_modules/request/forever.js +++ /dev/null @@ -1,103 +0,0 @@ -module.exports = ForeverAgent -ForeverAgent.SSL = ForeverAgentSSL - -var util = require('util') - , Agent = require('http').Agent - , net = require('net') - , tls = require('tls') - , AgentSSL = require('https').Agent - -function ForeverAgent(options) { - var self = this - self.options = options || {} - self.requests = {} - self.sockets = {} - self.freeSockets = {} - self.maxSockets = self.options.maxSockets || Agent.defaultMaxSockets - self.minSockets = self.options.minSockets || ForeverAgent.defaultMinSockets - self.on('free', function(socket, host, port) { - var name = host + ':' + port - if (self.requests[name] && self.requests[name].length) { - self.requests[name].shift().onSocket(socket) - } else if (self.sockets[name].length < self.minSockets) { - if (!self.freeSockets[name]) self.freeSockets[name] = [] - self.freeSockets[name].push(socket) - - // if an error happens while we don't use the socket anyway, meh, throw the socket away - function onIdleError() { - socket.destroy() - } - socket._onIdleError = onIdleError - socket.on('error', onIdleError) - } else { - // If there are no pending requests just destroy the - // socket and it will get removed from the pool. This - // gets us out of timeout issues and allows us to - // default to Connection:keep-alive. - socket.destroy() - } - }) - -} -util.inherits(ForeverAgent, Agent) - -ForeverAgent.defaultMinSockets = 5 - - -ForeverAgent.prototype.createConnection = net.createConnection -ForeverAgent.prototype.addRequestNoreuse = Agent.prototype.addRequest -ForeverAgent.prototype.addRequest = function(req, host, port) { - var name = host + ':' + port - if (this.freeSockets[name] && this.freeSockets[name].length > 0 && !req.useChunkedEncodingByDefault) { - var idleSocket = this.freeSockets[name].pop() - idleSocket.removeListener('error', idleSocket._onIdleError) - delete idleSocket._onIdleError - req._reusedSocket = true - req.onSocket(idleSocket) - } else { - this.addRequestNoreuse(req, host, port) - } -} - -ForeverAgent.prototype.removeSocket = function(s, name, host, port) { - if (this.sockets[name]) { - var index = this.sockets[name].indexOf(s) - if (index !== -1) { - this.sockets[name].splice(index, 1) - } - } else if (this.sockets[name] && this.sockets[name].length === 0) { - // don't leak - delete this.sockets[name] - delete this.requests[name] - } - - if (this.freeSockets[name]) { - var index = this.freeSockets[name].indexOf(s) - if (index !== -1) { - this.freeSockets[name].splice(index, 1) - if (this.freeSockets[name].length === 0) { - delete this.freeSockets[name] - } - } - } - - if (this.requests[name] && this.requests[name].length) { - // If we have pending requests and a socket gets closed a new one - // needs to be created to take over in the pool for the one that closed. - this.createSocket(name, host, port).emit('free') - } -} - -function ForeverAgentSSL (options) { - ForeverAgent.call(this, options) -} -util.inherits(ForeverAgentSSL, ForeverAgent) - -ForeverAgentSSL.prototype.createConnection = createConnectionSSL -ForeverAgentSSL.prototype.addRequestNoreuse = AgentSSL.prototype.addRequest - -function createConnectionSSL (port, host, options) { - options.port = port - options.host = host - return tls.connect(options) -} diff --git a/node_modules/jsdom/node_modules/request/main.js b/node_modules/jsdom/node_modules/request/main.js deleted file mode 100644 index 27b470b..0000000 --- a/node_modules/jsdom/node_modules/request/main.js +++ /dev/null @@ -1,1123 +0,0 @@ -// Copyright 2010-2012 Mikeal Rogers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -var http = require('http') - , https = false - , tls = false - , url = require('url') - , util = require('util') - , stream = require('stream') - , qs = require('querystring') - , oauth = require('./oauth') - , uuid = require('./uuid') - , ForeverAgent = require('./forever') - , Cookie = require('./vendor/cookie') - , CookieJar = require('./vendor/cookie/jar') - , cookieJar = new CookieJar - , tunnel = require('./tunnel') - , aws = require('./aws') - - , mime = require('mime') - , FormData = require('form-data') - ; - -if (process.logging) { - var log = process.logging('request') -} - -try { - https = require('https') -} catch (e) {} - -try { - tls = require('tls') -} catch (e) {} - -function toBase64 (str) { - return (new Buffer(str || "", "ascii")).toString("base64") -} - -// Hacky fix for pre-0.4.4 https -if (https && !https.Agent) { - https.Agent = function (options) { - http.Agent.call(this, options) - } - util.inherits(https.Agent, http.Agent) - https.Agent.prototype._getConnection = function (host, port, cb) { - var s = tls.connect(port, host, this.options, function () { - // do other checks here? - if (cb) cb() - }) - return s - } -} - -function isReadStream (rs) { - if (rs.readable && rs.path && rs.mode) { - return true - } -} - -function copy (obj) { - var o = {} - Object.keys(obj).forEach(function (i) { - o[i] = obj[i] - }) - return o -} - -var isUrl = /^https?:/ - -var globalPool = {} - -function Request (options) { - stream.Stream.call(this) - this.readable = true - this.writable = true - - if (typeof options === 'string') { - options = {uri:options} - } - - var reserved = Object.keys(Request.prototype) - for (var i in options) { - if (reserved.indexOf(i) === -1) { - this[i] = options[i] - } else { - if (typeof options[i] === 'function') { - delete options[i] - } - } - } - options = copy(options) - - this.init(options) -} -util.inherits(Request, stream.Stream) -Request.prototype.init = function (options) { - var self = this - - if (!options) options = {} - if (process.env.NODE_DEBUG && /request/.test(process.env.NODE_DEBUG)) console.error('REQUEST', options) - if (!self.pool && self.pool !== false) self.pool = globalPool - self.dests = [] - self.__isRequestRequest = true - - // Protect against double callback - if (!self._callback && self.callback) { - self._callback = self.callback - self.callback = function () { - if (self._callbackCalled) return // Print a warning maybe? - self._callback.apply(self, arguments) - self._callbackCalled = true - } - self.on('error', self.callback.bind()) - self.on('complete', self.callback.bind(self, null)) - } - - if (self.url) { - // People use this property instead all the time so why not just support it. - self.uri = self.url - delete self.url - } - - if (!self.uri) { - // this will throw if unhandled but is handleable when in a redirect - return self.emit('error', new Error("options.uri is a required argument")) - } else { - if (typeof self.uri == "string") self.uri = url.parse(self.uri) - } - if (self.proxy) { - if (typeof self.proxy == 'string') self.proxy = url.parse(self.proxy) - - // do the HTTP CONNECT dance using koichik/node-tunnel - if (http.globalAgent && self.uri.protocol === "https:") { - var tunnelFn = self.proxy.protocol === "http:" - ? tunnel.httpsOverHttp : tunnel.httpsOverHttps - - var tunnelOptions = { proxy: { host: self.proxy.hostname - , port: +self.proxy.port - , proxyAuth: self.proxy.auth } - , ca: this.ca } - - self.agent = tunnelFn(tunnelOptions) - self.tunnel = true - } - } - - if (!self.uri.host || !self.uri.pathname) { - // Invalid URI: it may generate lot of bad errors, like "TypeError: Cannot call method 'indexOf' of undefined" in CookieJar - // Detect and reject it as soon as possible - var faultyUri = url.format(self.uri) - var message = 'Invalid URI "' + faultyUri + '"' - if (Object.keys(options).length === 0) { - // No option ? This can be the sign of a redirect - // As this is a case where the user cannot do anything (he didn't call request directly with this URL) - // he should be warned that it can be caused by a redirection (can save some hair) - message += '. This can be caused by a crappy redirection.' - } - self.emit('error', new Error(message)) - return // This error was fatal - } - - self._redirectsFollowed = self._redirectsFollowed || 0 - self.maxRedirects = (self.maxRedirects !== undefined) ? self.maxRedirects : 10 - self.followRedirect = (self.followRedirect !== undefined) ? self.followRedirect : true - self.followAllRedirects = (self.followAllRedirects !== undefined) ? self.followAllRedirects : false - if (self.followRedirect || self.followAllRedirects) - self.redirects = self.redirects || [] - - self.headers = self.headers ? copy(self.headers) : {} - - self.setHost = false - if (!self.headers.host) { - self.headers.host = self.uri.hostname - if (self.uri.port) { - if ( !(self.uri.port === 80 && self.uri.protocol === 'http:') && - !(self.uri.port === 443 && self.uri.protocol === 'https:') ) - self.headers.host += (':'+self.uri.port) - } - self.setHost = true - } - - self.jar(self._jar || options.jar) - - if (!self.uri.pathname) {self.uri.pathname = '/'} - if (!self.uri.port) { - if (self.uri.protocol == 'http:') {self.uri.port = 80} - else if (self.uri.protocol == 'https:') {self.uri.port = 443} - } - - if (self.proxy && !self.tunnel) { - self.port = self.proxy.port - self.host = self.proxy.hostname - } else { - self.port = self.uri.port - self.host = self.uri.hostname - } - - self.clientErrorHandler = function (error) { - if (self._aborted) return - - if (self.setHost) delete self.headers.host - if (self.req._reusedSocket && error.code === 'ECONNRESET' - && self.agent.addRequestNoreuse) { - self.agent = { addRequest: self.agent.addRequestNoreuse.bind(self.agent) } - self.start() - self.req.end() - return - } - if (self.timeout && self.timeoutTimer) { - clearTimeout(self.timeoutTimer) - self.timeoutTimer = null - } - self.emit('error', error) - } - - self._parserErrorHandler = function (error) { - if (this.res) { - if (this.res.request) { - this.res.request.emit('error', error) - } else { - this.res.emit('error', error) - } - } else { - this._httpMessage.emit('error', error) - } - } - - if (options.form) { - self.form(options.form) - } - - if (options.oauth) { - self.oauth(options.oauth) - } - - if (options.aws) { - self.aws(options.aws) - } - - if (self.uri.auth && !self.headers.authorization) { - self.headers.authorization = "Basic " + toBase64(self.uri.auth.split(':').map(function(item){ return qs.unescape(item)}).join(':')) - } - if (self.proxy && self.proxy.auth && !self.headers['proxy-authorization'] && !self.tunnel) { - self.headers['proxy-authorization'] = "Basic " + toBase64(self.proxy.auth.split(':').map(function(item){ return qs.unescape(item)}).join(':')) - } - - if (options.qs) self.qs(options.qs) - - if (self.uri.path) { - self.path = self.uri.path - } else { - self.path = self.uri.pathname + (self.uri.search || "") - } - - if (self.path.length === 0) self.path = '/' - - if (self.proxy && !self.tunnel) self.path = (self.uri.protocol + '//' + self.uri.host + self.path) - - if (options.json) { - self.json(options.json) - } else if (options.multipart) { - self.boundary = uuid() - self.multipart(options.multipart) - } - - if (self.body) { - var length = 0 - if (!Buffer.isBuffer(self.body)) { - if (Array.isArray(self.body)) { - for (var i = 0; i < self.body.length; i++) { - length += self.body[i].length - } - } else { - self.body = new Buffer(self.body) - length = self.body.length - } - } else { - length = self.body.length - } - if (length) { - if(!self.headers['content-length'] && !self.headers['Content-Length']) - self.headers['content-length'] = length - } else { - throw new Error('Argument error, options.body.') - } - } - - var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol - , defaultModules = {'http:':http, 'https:':https} - , httpModules = self.httpModules || {} - ; - self.httpModule = httpModules[protocol] || defaultModules[protocol] - - if (!self.httpModule) return this.emit('error', new Error("Invalid protocol")) - - if (options.ca) self.ca = options.ca - - if (!self.agent) { - if (options.agentOptions) self.agentOptions = options.agentOptions - - if (options.agentClass) { - self.agentClass = options.agentClass - } else if (options.forever) { - self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL - } else { - self.agentClass = self.httpModule.Agent - } - } - - if (self.pool === false) { - self.agent = false - } else { - self.agent = self.agent || self.getAgent() - if (self.maxSockets) { - // Don't use our pooling if node has the refactored client - self.agent.maxSockets = self.maxSockets - } - if (self.pool.maxSockets) { - // Don't use our pooling if node has the refactored client - self.agent.maxSockets = self.pool.maxSockets - } - } - - self.once('pipe', function (src) { - if (self.ntick && self._started) throw new Error("You cannot pipe to this stream after the outbound request has started.") - self.src = src - if (isReadStream(src)) { - if (!self.headers['content-type'] && !self.headers['Content-Type']) - self.headers['content-type'] = mime.lookup(src.path) - } else { - if (src.headers) { - for (var i in src.headers) { - if (!self.headers[i]) { - self.headers[i] = src.headers[i] - } - } - } - if (self._json && !self.headers['content-type'] && !self.headers['Content-Type']) - self.headers['content-type'] = 'application/json' - if (src.method && !self.method) { - self.method = src.method - } - } - - self.on('pipe', function () { - console.error("You have already piped to this stream. Pipeing twice is likely to break the request.") - }) - }) - - process.nextTick(function () { - if (self._aborted) return - - if (self._form) { - self.setHeaders(self._form.getHeaders()) - self._form.pipe(self) - } - if (self.body) { - if (Array.isArray(self.body)) { - self.body.forEach(function (part) { - self.write(part) - }) - } else { - self.write(self.body) - } - self.end() - } else if (self.requestBodyStream) { - console.warn("options.requestBodyStream is deprecated, please pass the request object to stream.pipe.") - self.requestBodyStream.pipe(self) - } else if (!self.src) { - if (self.method !== 'GET' && typeof self.method !== 'undefined') { - self.headers['content-length'] = 0 - } - self.end() - } - self.ntick = true - }) -} - -// Must call this when following a redirect from https to http or vice versa -// Attempts to keep everything as identical as possible, but update the -// httpModule, Tunneling agent, and/or Forever Agent in use. -Request.prototype._updateProtocol = function () { - var self = this - var protocol = self.uri.protocol - - if (protocol === 'https:') { - // previously was doing http, now doing https - // if it's https, then we might need to tunnel now. - if (self.proxy) { - self.tunnel = true - var tunnelFn = self.proxy.protocol === 'http:' - ? tunnel.httpsOverHttp : tunnel.httpsOverHttps - var tunnelOptions = { proxy: { host: self.proxy.hostname - , post: +self.proxy.port - , proxyAuth: self.proxy.auth } - , ca: self.ca } - self.agent = tunnelFn(tunnelOptions) - return - } - - self.httpModule = https - switch (self.agentClass) { - case ForeverAgent: - self.agentClass = ForeverAgent.SSL - break - case http.Agent: - self.agentClass = https.Agent - break - default: - // nothing we can do. Just hope for the best. - return - } - - // if there's an agent, we need to get a new one. - if (self.agent) self.agent = self.getAgent() - - } else { - if (log) log('previously https, now http') - // previously was doing https, now doing http - // stop any tunneling. - if (self.tunnel) self.tunnel = false - self.httpModule = http - switch (self.agentClass) { - case ForeverAgent.SSL: - self.agentClass = ForeverAgent - break - case https.Agent: - self.agentClass = http.Agent - break - default: - // nothing we can do. just hope for the best - return - } - - // if there's an agent, then get a new one. - if (self.agent) { - self.agent = null - self.agent = self.getAgent() - } - } -} - -Request.prototype.getAgent = function () { - var Agent = this.agentClass - var options = {} - if (this.agentOptions) { - for (var i in this.agentOptions) { - options[i] = this.agentOptions[i] - } - } - if (this.ca) options.ca = this.ca - - var poolKey = '' - - // different types of agents are in different pools - if (Agent !== this.httpModule.Agent) { - poolKey += Agent.name - } - - if (!this.httpModule.globalAgent) { - // node 0.4.x - options.host = this.host - options.port = this.port - if (poolKey) poolKey += ':' - poolKey += this.host + ':' + this.port - } - - // ca option is only relevant if proxy or destination are https - var proxy = this.proxy - if (typeof proxy === 'string') proxy = url.parse(proxy) - var caRelevant = (proxy && proxy.protocol === 'https:') || this.uri.protocol === 'https:' - if (options.ca && caRelevant) { - if (poolKey) poolKey += ':' - poolKey += options.ca - } - - if (!poolKey && Agent === this.httpModule.Agent && this.httpModule.globalAgent) { - // not doing anything special. Use the globalAgent - return this.httpModule.globalAgent - } - - // we're using a stored agent. Make sure it's protocol-specific - poolKey = this.uri.protocol + poolKey - - // already generated an agent for this setting - if (this.pool[poolKey]) return this.pool[poolKey] - - return this.pool[poolKey] = new Agent(options) -} - -Request.prototype.start = function () { - var self = this - - if (self._aborted) return - - self._started = true - self.method = self.method || 'GET' - self.href = self.uri.href - if (log) log('%method %href', self) - - if (self.src && self.src.stat && self.src.stat.size && !self.headers['content-length'] && !self.headers['Content-Length']) { - self.headers['content-length'] = self.src.stat.size - } - if (self._aws) { - self.aws(self._aws, true) - } - self.req = self.httpModule.request(self, function (response) { - if (response.connection.listeners('error').indexOf(self._parserErrorHandler) === -1) { - response.connection.once('error', self._parserErrorHandler) - } - if (self._aborted) return - if (self._paused) response.pause() - - self.response = response - response.request = self - response.toJSON = toJSON - - if (self.httpModule === https && - self.strictSSL && - !response.client.authorized) { - var sslErr = response.client.authorizationError - self.emit('error', new Error('SSL Error: '+ sslErr)) - return - } - - if (self.setHost) delete self.headers.host - if (self.timeout && self.timeoutTimer) { - clearTimeout(self.timeoutTimer) - self.timeoutTimer = null - } - - var addCookie = function (cookie) { - if (self._jar) self._jar.add(new Cookie(cookie)) - else cookieJar.add(new Cookie(cookie)) - } - - if (response.headers['set-cookie'] && (!self._disableCookies)) { - if (Array.isArray(response.headers['set-cookie'])) response.headers['set-cookie'].forEach(addCookie) - else addCookie(response.headers['set-cookie']) - } - - if (response.statusCode >= 300 && response.statusCode < 400 && - (self.followAllRedirects || - (self.followRedirect && (self.method !== 'PUT' && self.method !== 'POST' && self.method !== 'DELETE'))) && - response.headers.location) { - if (self._redirectsFollowed >= self.maxRedirects) { - self.emit('error', new Error("Exceeded maxRedirects. Probably stuck in a redirect loop "+self.uri.href)) - return - } - self._redirectsFollowed += 1 - - if (!isUrl.test(response.headers.location)) { - response.headers.location = url.resolve(self.uri.href, response.headers.location) - } - - var uriPrev = self.uri - self.uri = url.parse(response.headers.location) - - // handle the case where we change protocol from https to http or vice versa - if (self.uri.protocol !== uriPrev.protocol) { - self._updateProtocol() - } - - self.redirects.push( - { statusCode : response.statusCode - , redirectUri: response.headers.location - } - ) - if (self.followAllRedirects) self.method = 'GET' - // self.method = 'GET' // Force all redirects to use GET || commented out fixes #215 - delete self.src - delete self.req - delete self.agent - delete self._started - delete self.body - delete self._form - if (self.headers) { - delete self.headers.host - delete self.headers['content-type'] - delete self.headers['content-length'] - } - if (log) log('Redirect to %uri', self) - self.init() - return // Ignore the rest of the response - } else { - self._redirectsFollowed = self._redirectsFollowed || 0 - // Be a good stream and emit end when the response is finished. - // Hack to emit end on close because of a core bug that never fires end - response.on('close', function () { - if (!self._ended) self.response.emit('end') - }) - - if (self.encoding) { - if (self.dests.length !== 0) { - console.error("Ingoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.") - } else { - response.setEncoding(self.encoding) - } - } - - self.dests.forEach(function (dest) { - self.pipeDest(dest) - }) - - response.on("data", function (chunk) { - self._destdata = true - self.emit("data", chunk) - }) - response.on("end", function (chunk) { - self._ended = true - self.emit("end", chunk) - }) - response.on("close", function () {self.emit("close")}) - - self.emit('response', response) - - if (self.callback) { - var buffer = [] - var bodyLen = 0 - self.on("data", function (chunk) { - buffer.push(chunk) - bodyLen += chunk.length - }) - self.on("end", function () { - if (self._aborted) return - - if (buffer.length && Buffer.isBuffer(buffer[0])) { - var body = new Buffer(bodyLen) - var i = 0 - buffer.forEach(function (chunk) { - chunk.copy(body, i, 0, chunk.length) - i += chunk.length - }) - if (self.encoding === null) { - response.body = body - } else { - response.body = body.toString(self.encoding) - } - } else if (buffer.length) { - response.body = buffer.join('') - } - - if (self._json) { - try { - response.body = JSON.parse(response.body) - } catch (e) {} - } - - self.emit('complete', response, response.body) - }) - } - } - }) - - if (self.timeout && !self.timeoutTimer) { - self.timeoutTimer = setTimeout(function () { - self.req.abort() - var e = new Error("ETIMEDOUT") - e.code = "ETIMEDOUT" - self.emit("error", e) - }, self.timeout) - - // Set additional timeout on socket - in case if remote - // server freeze after sending headers - if (self.req.setTimeout) { // only works on node 0.6+ - self.req.setTimeout(self.timeout, function () { - if (self.req) { - self.req.abort() - var e = new Error("ESOCKETTIMEDOUT") - e.code = "ESOCKETTIMEDOUT" - self.emit("error", e) - } - }) - } - } - - self.req.on('error', self.clientErrorHandler) - self.req.on('drain', function() { - self.emit('drain') - }) - self.on('end', function() { - if ( self.req.connection ) self.req.connection.removeListener('error', self._parserErrorHandler) - }) - self.emit('request', self.req) -} - -Request.prototype.abort = function () { - this._aborted = true - - if (this.req) { - this.req.abort() - } - else if (this.response) { - this.response.abort() - } - - this.emit("abort") -} - -Request.prototype.pipeDest = function (dest) { - var response = this.response - // Called after the response is received - if (dest.headers) { - dest.headers['content-type'] = response.headers['content-type'] - if (response.headers['content-length']) { - dest.headers['content-length'] = response.headers['content-length'] - } - } - if (dest.setHeader) { - for (var i in response.headers) { - dest.setHeader(i, response.headers[i]) - } - dest.statusCode = response.statusCode - } - if (this.pipefilter) this.pipefilter(response, dest) -} - -// Composable API -Request.prototype.setHeader = function (name, value, clobber) { - if (clobber === undefined) clobber = true - if (clobber || !this.headers.hasOwnProperty(name)) this.headers[name] = value - else this.headers[name] += ',' + value - return this -} -Request.prototype.setHeaders = function (headers) { - for (var i in headers) {this.setHeader(i, headers[i])} - return this -} -Request.prototype.qs = function (q, clobber) { - var base - if (!clobber && this.uri.query) base = qs.parse(this.uri.query) - else base = {} - - for (var i in q) { - base[i] = q[i] - } - - this.uri = url.parse(this.uri.href.split('?')[0] + '?' + qs.stringify(base)) - this.url = this.uri - - return this -} -Request.prototype.form = function (form) { - if (form) { - this.headers['content-type'] = 'application/x-www-form-urlencoded; charset=utf-8' - this.body = qs.stringify(form).toString('utf8') - return this - } - // create form-data object - this._form = new FormData() - return this._form -} -Request.prototype.multipart = function (multipart) { - var self = this - self.body = [] - - if (!self.headers['content-type']) { - self.headers['content-type'] = 'multipart/related; boundary=' + self.boundary - } else { - self.headers['content-type'] = self.headers['content-type'].split(';')[0] + '; boundary=' + self.boundary - } - - if (!multipart.forEach) throw new Error('Argument error, options.multipart.') - - if (self.preambleCRLF) { - self.body.push(new Buffer('\r\n')) - } - - multipart.forEach(function (part) { - var body = part.body - if(body == null) throw Error('Body attribute missing in multipart.') - delete part.body - var preamble = '--' + self.boundary + '\r\n' - Object.keys(part).forEach(function (key) { - preamble += key + ': ' + part[key] + '\r\n' - }) - preamble += '\r\n' - self.body.push(new Buffer(preamble)) - self.body.push(new Buffer(body)) - self.body.push(new Buffer('\r\n')) - }) - self.body.push(new Buffer('--' + self.boundary + '--')) - return self -} -Request.prototype.json = function (val) { - this.setHeader('accept', 'application/json') - this._json = true - if (typeof val === 'boolean') { - if (typeof this.body === 'object') { - this.setHeader('content-type', 'application/json') - this.body = JSON.stringify(this.body) - } - } else { - this.setHeader('content-type', 'application/json') - this.body = JSON.stringify(val) - } - return this -} -function getHeader(name, headers) { - var result, re, match - Object.keys(headers).forEach(function (key) { - re = new RegExp(name, 'i') - match = key.match(re) - if (match) result = headers[key] - }) - return result -} -Request.prototype.aws = function (opts, now) { - if (!now) { - this._aws = opts - return this - } - var date = new Date() - this.setHeader('date', date.toUTCString()) - var auth = - { key: opts.key - , secret: opts.secret - , verb: this.method.toUpperCase() - , date: date - , contentType: getHeader('content-type', this.headers) || '' - , md5: getHeader('content-md5', this.headers) || '' - , amazonHeaders: aws.canonicalizeHeaders(this.headers) - } - if (opts.bucket && this.path) { - auth.resource = '/' + opts.bucket + this.path - } else if (opts.bucket && !this.path) { - auth.resource = '/' + opts.bucket - } else if (!opts.bucket && this.path) { - auth.resource = this.path - } else if (!opts.bucket && !this.path) { - auth.resource = '/' - } - auth.resource = aws.canonicalizeResource(auth.resource) - this.setHeader('authorization', aws.authorization(auth)) - - return this -} - -Request.prototype.oauth = function (_oauth) { - var form - if (this.headers['content-type'] && - this.headers['content-type'].slice(0, 'application/x-www-form-urlencoded'.length) === - 'application/x-www-form-urlencoded' - ) { - form = qs.parse(this.body) - } - if (this.uri.query) { - form = qs.parse(this.uri.query) - } - if (!form) form = {} - var oa = {} - for (var i in form) oa[i] = form[i] - for (var i in _oauth) oa['oauth_'+i] = _oauth[i] - if (!oa.oauth_version) oa.oauth_version = '1.0' - if (!oa.oauth_timestamp) oa.oauth_timestamp = Math.floor( (new Date()).getTime() / 1000 ).toString() - if (!oa.oauth_nonce) oa.oauth_nonce = uuid().replace(/-/g, '') - - oa.oauth_signature_method = 'HMAC-SHA1' - - var consumer_secret = oa.oauth_consumer_secret - delete oa.oauth_consumer_secret - var token_secret = oa.oauth_token_secret - delete oa.oauth_token_secret - - var baseurl = this.uri.protocol + '//' + this.uri.host + this.uri.pathname - var signature = oauth.hmacsign(this.method, baseurl, oa, consumer_secret, token_secret) - - // oa.oauth_signature = signature - for (var i in form) { - if ( i.slice(0, 'oauth_') in _oauth) { - // skip - } else { - delete oa['oauth_'+i] - if (i !== 'x_auth_mode') delete oa[i] - } - } - this.headers.Authorization = - 'OAuth '+Object.keys(oa).sort().map(function (i) {return i+'="'+oauth.rfc3986(oa[i])+'"'}).join(',') - this.headers.Authorization += ',oauth_signature="' + oauth.rfc3986(signature) + '"' - return this -} -Request.prototype.jar = function (jar) { - var cookies - - if (this._redirectsFollowed === 0) { - this.originalCookieHeader = this.headers.cookie - } - - if (jar === false) { - // disable cookies - cookies = false - this._disableCookies = true - } else if (jar) { - // fetch cookie from the user defined cookie jar - cookies = jar.get({ url: this.uri.href }) - } else { - // fetch cookie from the global cookie jar - cookies = cookieJar.get({ url: this.uri.href }) - } - - if (cookies && cookies.length) { - var cookieString = cookies.map(function (c) { - return c.name + "=" + c.value - }).join("; ") - - if (this.originalCookieHeader) { - // Don't overwrite existing Cookie header - this.headers.cookie = this.originalCookieHeader + '; ' + cookieString - } else { - this.headers.cookie = cookieString - } - } - this._jar = jar - return this -} - - -// Stream API -Request.prototype.pipe = function (dest, opts) { - if (this.response) { - if (this._destdata) { - throw new Error("You cannot pipe after data has been emitted from the response.") - } else if (this._ended) { - throw new Error("You cannot pipe after the response has been ended.") - } else { - stream.Stream.prototype.pipe.call(this, dest, opts) - this.pipeDest(dest) - return dest - } - } else { - this.dests.push(dest) - stream.Stream.prototype.pipe.call(this, dest, opts) - return dest - } -} -Request.prototype.write = function () { - if (!this._started) this.start() - return this.req.write.apply(this.req, arguments) -} -Request.prototype.end = function (chunk) { - if (chunk) this.write(chunk) - if (!this._started) this.start() - this.req.end() -} -Request.prototype.pause = function () { - if (!this.response) this._paused = true - else this.response.pause.apply(this.response, arguments) -} -Request.prototype.resume = function () { - if (!this.response) this._paused = false - else this.response.resume.apply(this.response, arguments) -} -Request.prototype.destroy = function () { - if (!this._ended) this.end() -} - -// organize params for post, put, head, del -function initParams(uri, options, callback) { - if ((typeof options === 'function') && !callback) callback = options - if (options && typeof options === 'object') { - options.uri = uri - } else if (typeof uri === 'string') { - options = {uri:uri} - } else { - options = uri - uri = options.uri - } - return { uri: uri, options: options, callback: callback } -} - -function request (uri, options, callback) { - if (typeof uri === 'undefined') throw new Error('undefined is not a valid uri or options object.') - if ((typeof options === 'function') && !callback) callback = options - if (options && typeof options === 'object') { - options.uri = uri - } else if (typeof uri === 'string') { - options = {uri:uri} - } else { - options = uri - } - - if (callback) options.callback = callback - var r = new Request(options) - return r -} - -module.exports = request - -request.initParams = initParams - -request.defaults = function (options, requester) { - var def = function (method) { - var d = function (uri, opts, callback) { - var params = initParams(uri, opts, callback) - for (var i in options) { - if (params.options[i] === undefined) params.options[i] = options[i] - } - if(typeof requester === 'function') { - if(method === request) { - method = requester - } else { - params.options._requester = requester - } - } - return method(params.options, params.callback) - } - return d - } - var de = def(request) - de.get = def(request.get) - de.post = def(request.post) - de.put = def(request.put) - de.head = def(request.head) - de.del = def(request.del) - de.cookie = def(request.cookie) - de.jar = request.jar - return de -} - -request.forever = function (agentOptions, optionsArg) { - var options = {} - if (optionsArg) { - for (option in optionsArg) { - options[option] = optionsArg[option] - } - } - if (agentOptions) options.agentOptions = agentOptions - options.forever = true - return request.defaults(options) -} - -request.get = request -request.post = function (uri, options, callback) { - var params = initParams(uri, options, callback) - params.options.method = 'POST' - return request(params.uri || null, params.options, params.callback) -} -request.put = function (uri, options, callback) { - var params = initParams(uri, options, callback) - params.options.method = 'PUT' - return request(params.uri || null, params.options, params.callback) -} -request.head = function (uri, options, callback) { - var params = initParams(uri, options, callback) - params.options.method = 'HEAD' - if (params.options.body || - params.options.requestBodyStream || - (params.options.json && typeof params.options.json !== 'boolean') || - params.options.multipart) { - throw new Error("HTTP HEAD requests MUST NOT include a request body.") - } - return request(params.uri || null, params.options, params.callback) -} -request.del = function (uri, options, callback) { - var params = initParams(uri, options, callback) - params.options.method = 'DELETE' - if(typeof params.options._requester === 'function') { - request = params.options._requester - } - return request(params.uri || null, params.options, params.callback) -} -request.jar = function () { - return new CookieJar -} -request.cookie = function (str) { - if (str && str.uri) str = str.uri - if (typeof str !== 'string') throw new Error("The cookie function only accepts STRING as param") - return new Cookie(str) -} - -// Safe toJSON - -function getSafe (self, uuid) { - if (typeof self === 'object' || typeof self === 'function') var safe = {} - if (Array.isArray(self)) var safe = [] - - var recurse = [] - - Object.defineProperty(self, uuid, {}) - - var attrs = Object.keys(self).filter(function (i) { - if (i === uuid) return false - if ( (typeof self[i] !== 'object' && typeof self[i] !== 'function') || self[i] === null) return true - return !(Object.getOwnPropertyDescriptor(self[i], uuid)) - }) - - - for (var i=0;i $(BUILDDIR)/async.min.js - -test: - nodeunit test - -clean: - rm -rf $(BUILDDIR) - -lint: - nodelint --config nodelint.cfg lib/async.js - -.PHONY: test build all diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/README.md b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/README.md deleted file mode 100644 index 039d942..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/README.md +++ /dev/null @@ -1,970 +0,0 @@ -# Async.js - -Async is a utility module which provides straight-forward, powerful functions -for working with asynchronous JavaScript. Although originally designed for -use with [node.js](http://nodejs.org), it can also be used directly in the -browser. - -Async provides around 20 functions that include the usual 'functional' -suspects (map, reduce, filter, forEach…) as well as some common patterns -for asynchronous flow control (parallel, series, waterfall…). All these -functions assume you follow the node.js convention of providing a single -callback as the last argument of your async function. - - -## Quick Examples - - async.map(['file1','file2','file3'], fs.stat, function(err, results){ - // results is now an array of stats for each file - }); - - async.filter(['file1','file2','file3'], path.exists, function(results){ - // results now equals an array of the existing files - }); - - async.parallel([ - function(){ ... }, - function(){ ... } - ], callback); - - async.series([ - function(){ ... }, - function(){ ... } - ]); - -There are many more functions available so take a look at the docs below for a -full list. This module aims to be comprehensive, so if you feel anything is -missing please create a GitHub issue for it. - - -## Download - -Releases are available for download from -[GitHub](http://github.com/caolan/async/downloads). -Alternatively, you can install using Node Package Manager (npm): - - npm install async - - -__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 17.5kb Uncompressed - -__Production:__ [async.min.js](https://github.com/caolan/async/raw/master/dist/async.min.js) - 1.7kb Packed and Gzipped - - -## In the Browser - -So far its been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage: - - - - - -## Documentation - -### Collections - -* [forEach](#forEach) -* [map](#map) -* [filter](#filter) -* [reject](#reject) -* [reduce](#reduce) -* [detect](#detect) -* [sortBy](#sortBy) -* [some](#some) -* [every](#every) -* [concat](#concat) - -### Flow Control - -* [series](#series) -* [parallel](#parallel) -* [whilst](#whilst) -* [until](#until) -* [waterfall](#waterfall) -* [queue](#queue) -* [auto](#auto) -* [iterator](#iterator) -* [apply](#apply) -* [nextTick](#nextTick) - -### Utils - -* [memoize](#memoize) -* [log](#log) -* [dir](#dir) -* [noConflict](#noConflict) - - -## Collections - -
        -### forEach(arr, iterator, callback) - -Applies an iterator function to each item in an array, in parallel. -The iterator is called with an item from the list and a callback for when it -has finished. If the iterator passes an error to this callback, the main -callback for the forEach function is immediately called with the error. - -Note, that since this function applies the iterator to each item in parallel -there is no guarantee that the iterator functions will complete in order. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed. -* callback(err) - A callback which is called after all the iterator functions - have finished, or an error has occurred. - -__Example__ - - // assuming openFiles is an array of file names and saveFile is a function - // to save the modified contents of that file: - - async.forEach(openFiles, saveFile, function(err){ - // if any of the saves produced an error, err would equal that error - }); - ---------------------------------------- - - -### forEachSeries(arr, iterator, callback) - -The same as forEach only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. This means the iterator functions will complete in order. - - ---------------------------------------- - - -### map(arr, iterator, callback) - -Produces a new array of values by mapping each value in the given array through -the iterator function. The iterator is called with an item from the array and a -callback for when it has finished processing. The callback takes 2 arguments, -an error and the transformed item from the array. If the iterator passes an -error to this callback, the main callback for the map function is immediately -called with the error. - -Note, that since this function applies the iterator to each item in parallel -there is no guarantee that the iterator functions will complete in order, however -the results array will be in the same order as the original array. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed - with an error (which can be null) and a transformed item. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is an array of the - transformed items from the original array. - -__Example__ - - async.map(['file1','file2','file3'], fs.stat, function(err, results){ - // results is now an array of stats for each file - }); - ---------------------------------------- - - -### mapSeries(arr, iterator, callback) - -The same as map only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. The results array will be in the same order as the original. - - ---------------------------------------- - - -### filter(arr, iterator, callback) - -__Alias:__ select - -Returns a new array of all the values which pass an async truth test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like path.exists. This operation is -performed in parallel, but the results array will be in the same order as the -original. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed. -* callback(results) - A callback which is called after all the iterator - functions have finished. - -__Example__ - - async.filter(['file1','file2','file3'], path.exists, function(results){ - // results now equals an array of the existing files - }); - ---------------------------------------- - - -### filterSeries(arr, iterator, callback) - -__alias:__ selectSeries - -The same as filter only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. The results array will be in the same order as the original. - ---------------------------------------- - - -### reject(arr, iterator, callback) - -The opposite of filter. Removes values that pass an async truth test. - ---------------------------------------- - - -### rejectSeries(arr, iterator, callback) - -The same as filter, only the iterator is applied to each item in the array -in series. - - ---------------------------------------- - - -### reduce(arr, memo, iterator, callback) - -__aliases:__ inject, foldl - -Reduces a list of values into a single value using an async iterator to return -each successive step. Memo is the initial state of the reduction. This -function only operates in series. For performance reasons, it may make sense to -split a call to this function into a parallel map, then use the normal -Array.prototype.reduce on the results. This function is for situations where -each step in the reduction needs to be async, if you can get the data before -reducing it then its probably a good idea to do so. - -__Arguments__ - -* arr - An array to iterate over. -* memo - The initial state of the reduction. -* iterator(memo, item, callback) - A function applied to each item in the - array to produce the next step in the reduction. The iterator is passed a - callback which accepts an optional error as its first argument, and the state - of the reduction as the second. If an error is passed to the callback, the - reduction is stopped and the main callback is immediately called with the - error. -* callback(err, result) - A callback which is called after all the iterator - functions have finished. Result is the reduced value. - -__Example__ - - async.reduce([1,2,3], 0, function(memo, item, callback){ - // pointless async: - process.nextTick(function(){ - callback(null, memo + item) - }); - }, function(err, result){ - // result is now equal to the last value of memo, which is 6 - }); - ---------------------------------------- - - -### reduceRight(arr, memo, iterator, callback) - -__Alias:__ foldr - -Same as reduce, only operates on the items in the array in reverse order. - - ---------------------------------------- - - -### detect(arr, iterator, callback) - -Returns the first value in a list that passes an async truth test. The -iterator is applied in parallel, meaning the first iterator to return true will -fire the detect callback with that result. That means the result might not be -the first item in the original array (in terms of order) that passes the test. - -If order within the original array is important then look at detectSeries. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed. -* callback(result) - A callback which is called as soon as any iterator returns - true, or after all the iterator functions have finished. Result will be - the first item in the array that passes the truth test (iterator) or the - value undefined if none passed. - -__Example__ - - async.detect(['file1','file2','file3'], path.exists, function(result){ - // result now equals the first file in the list that exists - }); - ---------------------------------------- - - -### detectSeries(arr, iterator, callback) - -The same as detect, only the iterator is applied to each item in the array -in series. This means the result is always the first in the original array (in -terms of array order) that passes the truth test. - - ---------------------------------------- - - -### sortBy(arr, iterator, callback) - -Sorts a list by the results of running each value through an async iterator. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed - with an error (which can be null) and a value to use as the sort criteria. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is the items from - the original array sorted by the values returned by the iterator calls. - -__Example__ - - async.sortBy(['file1','file2','file3'], function(file, callback){ - fs.stat(file, function(err, stats){ - callback(err, stats.mtime); - }); - }, function(err, results){ - // results is now the original array of files sorted by - // modified date - }); - - ---------------------------------------- - - -### some(arr, iterator, callback) - -__Alias:__ any - -Returns true if at least one element in the array satisfies an async test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like path.exists. Once any iterator -call returns true, the main callback is immediately called. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed. -* callback(result) - A callback which is called as soon as any iterator returns - true, or after all the iterator functions have finished. Result will be - either true or false depending on the values of the async tests. - -__Example__ - - async.some(['file1','file2','file3'], path.exists, function(result){ - // if result is true then at least one of the files exists - }); - ---------------------------------------- - - -### every(arr, iterator, callback) - -__Alias:__ all - -Returns true if every element in the array satisfies an async test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like path.exists. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed. -* callback(result) - A callback which is called after all the iterator - functions have finished. Result will be either true or false depending on - the values of the async tests. - -__Example__ - - async.every(['file1','file2','file3'], path.exists, function(result){ - // if result is true then every file exists - }); - ---------------------------------------- - - -### concat(arr, iterator, callback) - -Applies an iterator to each item in a list, concatenating the results. Returns the -concatenated list. The iterators are called in parallel, and the results are -concatenated as they return. There is no guarantee that the results array will -be returned in the original order of the arguments passed to the iterator function. - -__Arguments__ - -* arr - An array to iterate over -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed - with an error (which can be null) and an array of results. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is an array containing - the concatenated results of the iterator function. - -__Example__ - - async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){ - // files is now a list of filenames that exist in the 3 directories - }); - ---------------------------------------- - - -### concatSeries(arr, iterator, callback) - -Same as async.concat, but executes in series instead of parallel. - - -## Flow Control - - -### series(tasks, [callback]) - -Run an array of functions in series, each one running once the previous -function has completed. If any functions in the series pass an error to its -callback, no more functions are run and the callback for the series is -immediately called with the value of the error. Once the tasks have completed, -the results are passed to the final callback as an array. - -It is also possible to use an object instead of an array. Each property will be -run as a function and the results will be passed to the final callback as an object -instead of an array. This can be a more readable way of handling results from -async.series. - - -__Arguments__ - -* tasks - An array or object containing functions to run, each function is passed - a callback it must call on completion. -* callback(err, results) - An optional callback to run once all the functions - have completed. This function gets an array of all the arguments passed to - the callbacks used in the array. - -__Example__ - - async.series([ - function(callback){ - // do some stuff ... - callback(null, 'one'); - }, - function(callback){ - // do some more stuff ... - callback(null, 'two'); - }, - ], - // optional callback - function(err, results){ - // results is now equal to ['one', 'two'] - }); - - - // an example using an object instead of an array - async.series({ - one: function(callback){ - setTimeout(function(){ - callback(null, 1); - }, 200); - }, - two: function(callback){ - setTimeout(function(){ - callback(null, 2); - }, 100); - }, - }, - function(err, results) { - // results is now equals to: {one: 1, two: 2} - }); - - ---------------------------------------- - - -### parallel(tasks, [callback]) - -Run an array of functions in parallel, without waiting until the previous -function has completed. If any of the functions pass an error to its -callback, the main callback is immediately called with the value of the error. -Once the tasks have completed, the results are passed to the final callback as an -array. - -It is also possible to use an object instead of an array. Each property will be -run as a function and the results will be passed to the final callback as an object -instead of an array. This can be a more readable way of handling results from -async.parallel. - - -__Arguments__ - -* tasks - An array or object containing functions to run, each function is passed a - callback it must call on completion. -* callback(err, results) - An optional callback to run once all the functions - have completed. This function gets an array of all the arguments passed to - the callbacks used in the array. - -__Example__ - - async.parallel([ - function(callback){ - setTimeout(function(){ - callback(null, 'one'); - }, 200); - }, - function(callback){ - setTimeout(function(){ - callback(null, 'two'); - }, 100); - }, - ], - // optional callback - function(err, results){ - // in this case, the results array will equal ['two','one'] - // because the functions were run in parallel and the second - // function had a shorter timeout before calling the callback. - }); - - - // an example using an object instead of an array - async.parallel({ - one: function(callback){ - setTimeout(function(){ - callback(null, 1); - }, 200); - }, - two: function(callback){ - setTimeout(function(){ - callback(null, 2); - }, 100); - }, - }, - function(err, results) { - // results is now equals to: {one: 1, two: 2} - }); - - ---------------------------------------- - - -### whilst(test, fn, callback) - -Repeatedly call fn, while test returns true. Calls the callback when stopped, -or an error occurs. - -__Arguments__ - -* test() - synchronous truth test to perform before each execution of fn. -* fn(callback) - A function to call each time the test passes. The function is - passed a callback which must be called once it has completed with an optional - error as the first argument. -* callback(err) - A callback which is called after the test fails and repeated - execution of fn has stopped. - -__Example__ - - var count = 0; - - async.whilst( - function () { return count < 5; }, - function (callback) { - count++; - setTimeout(callback, 1000); - }, - function (err) { - // 5 seconds have passed - } - }); - - ---------------------------------------- - - -### until(test, fn, callback) - -Repeatedly call fn, until test returns true. Calls the callback when stopped, -or an error occurs. - -The inverse of async.whilst. - - ---------------------------------------- - - -### waterfall(tasks, [callback]) - -Runs an array of functions in series, each passing their results to the next in -the array. However, if any of the functions pass an error to the callback, the -next function is not executed and the main callback is immediately called with -the error. - -__Arguments__ - -* tasks - An array of functions to run, each function is passed a callback it - must call on completion. -* callback(err) - An optional callback to run once all the functions have - completed. This function gets passed any error that may have occurred. - -__Example__ - - async.waterfall([ - function(callback){ - callback(null, 'one', 'two'); - }, - function(arg1, arg2, callback){ - callback(null, 'three'); - }, - function(arg1, callback){ - // arg1 now equals 'three' - callback(null, 'done'); - } - ]); - - ---------------------------------------- - - -### queue(worker, concurrency) - -Creates a queue object with the specified concurrency. Tasks added to the -queue will be processed in parallel (up to the concurrency limit). If all -workers are in progress, the task is queued until one is available. Once -a worker has completed a task, the task's callback is called. - -__Arguments__ - -* worker(task, callback) - An asynchronous function for processing a queued - task. -* concurrency - An integer for determining how many worker functions should be - run in parallel. - -__Queue objects__ - -The queue object returned by this function has the following properties and -methods: - -* length() - a function returning the number of items waiting to be processed. -* concurrency - an integer for determining how many worker functions should be - run in parallel. This property can be changed after a queue is created to - alter the concurrency on-the-fly. -* push(task, [callback]) - add a new task to the queue, the callback is called - once the worker has finished processing the task. -* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued -* empty - a callback that is called when the last item from the queue is given to a worker -* drain - a callback that is called when the last item from the queue has returned from the worker - -__Example__ - - // create a queue object with concurrency 2 - - var q = async.queue(function (task, callback) { - console.log('hello ' + task.name). - callback(); - }, 2); - - - // assign a callback - q.drain = function() { - console.log('all items have been processed'); - } - - // add some items to the queue - - q.push({name: 'foo'}, function (err) { - console.log('finished processing foo'); - }); - q.push({name: 'bar'}, function (err) { - console.log('finished processing bar'); - }); - - ---------------------------------------- - - -### auto(tasks, [callback]) - -Determines the best order for running functions based on their requirements. -Each function can optionally depend on other functions being completed first, -and each function is run as soon as its requirements are satisfied. If any of -the functions pass and error to their callback, that function will not complete -(so any other functions depending on it will not run) and the main callback -will be called immediately with the error. - -__Arguments__ - -* tasks - An object literal containing named functions or an array of - requirements, with the function itself the last item in the array. The key - used for each function or array is used when specifying requirements. The - syntax is easier to understand by looking at the example. -* callback(err) - An optional callback which is called when all the tasks have - been completed. The callback may receive an error as an argument. - -__Example__ - - async.auto({ - get_data: function(callback){ - // async code to get some data - }, - make_folder: function(callback){ - // async code to create a directory to store a file in - // this is run at the same time as getting the data - }, - write_file: ['get_data', 'make_folder', function(callback){ - // once there is some data and the directory exists, - // write the data to a file in the directory - }], - email_link: ['write_file', function(callback){ - // once the file is written let's email a link to it... - }] - }); - -This is a fairly trivial example, but to do this using the basic parallel and -series functions would look like this: - - async.parallel([ - function(callback){ - // async code to get some data - }, - function(callback){ - // async code to create a directory to store a file in - // this is run at the same time as getting the data - } - ], - function(results){ - async.series([ - function(callback){ - // once there is some data and the directory exists, - // write the data to a file in the directory - }, - email_link: ['write_file', function(callback){ - // once the file is written let's email a link to it... - } - ]); - }); - -For a complicated series of async tasks using the auto function makes adding -new tasks much easier and makes the code more readable. - - ---------------------------------------- - - -### iterator(tasks) - -Creates an iterator function which calls the next function in the array, -returning a continuation to call the next one after that. Its also possible to -'peek' the next iterator by doing iterator.next(). - -This function is used internally by the async module but can be useful when -you want to manually control the flow of functions in series. - -__Arguments__ - -* tasks - An array of functions to run, each function is passed a callback it - must call on completion. - -__Example__ - - var iterator = async.iterator([ - function(){ sys.p('one'); }, - function(){ sys.p('two'); }, - function(){ sys.p('three'); } - ]); - - node> var iterator2 = iterator(); - 'one' - node> var iterator3 = iterator2(); - 'two' - node> iterator3(); - 'three' - node> var nextfn = iterator2.next(); - node> nextfn(); - 'three' - - ---------------------------------------- - - -### apply(function, arguments..) - -Creates a continuation function with some arguments already applied, a useful -shorthand when combined with other flow control functions. Any arguments -passed to the returned function are added to the arguments originally passed -to apply. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to automatically apply when the - continuation is called. - -__Example__ - - // using apply - - async.parallel([ - async.apply(fs.writeFile, 'testfile1', 'test1'), - async.apply(fs.writeFile, 'testfile2', 'test2'), - ]); - - - // the same process without using apply - - async.parallel([ - function(callback){ - fs.writeFile('testfile1', 'test1', callback); - }, - function(callback){ - fs.writeFile('testfile2', 'test2', callback); - }, - ]); - -It's possible to pass any number of additional arguments when calling the -continuation: - - node> var fn = async.apply(sys.puts, 'one'); - node> fn('two', 'three'); - one - two - three - ---------------------------------------- - - -### nextTick(callback) - -Calls the callback on a later loop around the event loop. In node.js this just -calls process.nextTick, in the browser it falls back to setTimeout(callback, 0), -which means other higher priority events may precede the execution of the callback. - -This is used internally for browser-compatibility purposes. - -__Arguments__ - -* callback - The function to call on a later loop around the event loop. - -__Example__ - - var call_order = []; - async.nextTick(function(){ - call_order.push('two'); - // call_order now equals ['one','two] - }); - call_order.push('one') - - -## Utils - - -### memoize(fn, [hasher]) - -Caches the results of an async function. When creating a hash to store function -results against, the callback is omitted from the hash and an optional hash -function can be used. - -__Arguments__ - -* fn - the function you to proxy and cache results from. -* hasher - an optional function for generating a custom hash for storing - results, it has all the arguments applied to it apart from the callback, and - must be synchronous. - -__Example__ - - var slow_fn = function (name, callback) { - // do something - callback(null, result); - }; - var fn = async.memoize(slow_fn); - - // fn can now be used as if it were slow_fn - fn('some name', function () { - // callback - }); - - - -### log(function, arguments) - -Logs the result of an async function to the console. Only works in node.js or -in browsers that support console.log and console.error (such as FF and Chrome). -If multiple arguments are returned from the async function, console.log is -called on each argument in order. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to apply to the function. - -__Example__ - - var hello = function(name, callback){ - setTimeout(function(){ - callback(null, 'hello ' + name); - }, 1000); - }; - - node> async.log(hello, 'world'); - 'hello world' - - ---------------------------------------- - - -### dir(function, arguments) - -Logs the result of an async function to the console using console.dir to -display the properties of the resulting object. Only works in node.js or -in browsers that support console.dir and console.error (such as FF and Chrome). -If multiple arguments are returned from the async function, console.dir is -called on each argument in order. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to apply to the function. - -__Example__ - - var hello = function(name, callback){ - setTimeout(function(){ - callback(null, {hello: name}); - }, 1000); - }; - - node> async.dir(hello, 'world'); - {hello: 'world'} - - ---------------------------------------- - - -### noConflict() - -Changes the value of async back to its original value, returning a reference to the -async object. diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/async.min.js.gzip b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/async.min.js.gzip deleted file mode 100644 index e1c32944465c634d9b609622b37972d1ae8e6e7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1859 zcmV-J2fX+niwFpUH4aSx17UM{ZeuQOX>KlRa{$d)OOx9+4E`&dJ!r^8tJqh0RZrV# zZ=H17-aJ0=C0o0)cwe{Z%@F7vMl6BIVG?Up_q$mIcJ^&y2_Vq3=Im_>A)%=wm zRM|H1UCQ!Wg?FMX>M~b$eE0e-N!vm+Sy>Qze$T2qmYlm4KJcX3XLTqN91Adg8<}0$l>2$&!4KwRQ*L(Nw8`Hdo+t}rs${2EMTi7(9>F{v~n`LU|lDFTN#B?dOCp(dzEuskQM+O-E&H1&YCh#iml zi4<*~hnwCB+XzaUU=84sc1HQrH&bpRFk`~=Br2gaYEw)$o?wcPlg8*d>nw?R_@3ph zidomukX@}6kY9SiFs~J)8=Gd^M21i(G+KPvYdq>e>9Uq&(6B4SC&a#o&2hWH4BYlSH>uKEi9n30?Sh3G;4_GGWRFU!ynmh-%Jfljc<1oxAviD z9fi-|tEvWkuKFswvmbX>U6qWq=s4!zI*u?K1gWXCjDq84f~ZIu)zDYToN8BUAGrAi z&2ug>iaTo2kY;(KDgZ=|@i(I$6MC*zxe1YZ+0WQjdNQmxpO8dx`vc8$c5a0wPIM zwTgyv+zsYEtcj(~YgU{RV*v~>15f|OlFNlS@wb_xt+tlrSWUDE+9y@>)0{1u?0q&W zx}>eKxHYTMX-r6? zwy5`6+7QRR$DGWuLJky#KW2^?6i&BCUlFOG+;n>*Rwk&T*a5&i(op1bd=j0*-G$r$dt<7}^7< zmYYGtmh9+CL8_f6<%^zSDb$2#tS-|pw0jF6K^kEn7{E5g%<~h?5L7-xP~q%113&p$ zHm9^WMFsp#*y><@dK1}0G?}n*P5!~6-P*PjiJOblK2pPZ!AH}GC2FG8VRk}S0Y|U~ z0M02T+BZj5fpRr<&9w_)cO3a;4Y3j+0+6aVL+6VXM3@mDcDIvV+`mhL$7BgH25UBp zEkM?+)Z2nGce&X7=u zTF5y4G*cIc%Z7&~w(vJg8l$wXm(f3QvM^l|RnC}wtKY6qpM5*_cEjBX@}@&+f66RB z!LW5Jet}+UP(U2}vnzHKI(t&XW23Ts)2s%*Sz-}1qn>Z-xexm+ucv1;ykwwjL9Xg{ zPlyzr%*?m;6X=c76w9_~vV2w|EQnu}sz2|AqQJjf)v8G;7+;Ur?wTfN++$l+st~7G zgxCP$@rSm5pCxM;99uA0oQdaHbmKk|*_$P>z&^zuEWmF0m`0wqAaF_NZf2EZJ_~>r zB;ZQl#z4p-)E#=#D%V_ph{y=}x~tWg_Zqt;o}^@)-iC>}>SGDSWA z(uz3hq{3lz^YsGl#i70ap59&)zP4{7RaIpb1fwCSi|qsyydW6SLQJgwoi2p5+v*gB zVpHytBe{p4dwo31DjdR(9v;-8%>J3)K%0F*Q6IB$|2ku)su=X%cBf?!E~8_4wAX@Z xGIF@2s}wJS#afNxut~Qx9u+Qm9U5>4tV;&(tNFTZoYVmy`WKn%6PvIY007E|gZuyh diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.css b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.css deleted file mode 100644 index 274434a..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.css +++ /dev/null @@ -1,70 +0,0 @@ -/*! - * Styles taken from qunit.css - */ - -h1#nodeunit-header, h1.nodeunit-header { - padding: 15px; - font-size: large; - background-color: #06b; - color: white; - font-family: 'trebuchet ms', verdana, arial; - margin: 0; -} - -h1#nodeunit-header a { - color: white; -} - -h2#nodeunit-banner { - height: 2em; - border-bottom: 1px solid white; - background-color: #eee; - margin: 0; - font-family: 'trebuchet ms', verdana, arial; -} -h2#nodeunit-banner.pass { - background-color: green; -} -h2#nodeunit-banner.fail { - background-color: red; -} - -h2#nodeunit-userAgent, h2.nodeunit-userAgent { - padding: 10px; - background-color: #eee; - color: black; - margin: 0; - font-size: small; - font-weight: normal; - font-family: 'trebuchet ms', verdana, arial; - font-size: 10pt; -} - -div#nodeunit-testrunner-toolbar { - background: #eee; - border-top: 1px solid black; - padding: 10px; - font-family: 'trebuchet ms', verdana, arial; - margin: 0; - font-size: 10pt; -} - -ol#nodeunit-tests { - font-family: 'trebuchet ms', verdana, arial; - font-size: 10pt; -} -ol#nodeunit-tests li strong { - cursor:pointer; -} -ol#nodeunit-tests .pass { - color: green; -} -ol#nodeunit-tests .fail { - color: red; -} - -p#nodeunit-testresult { - margin-left: 1em; - font-size: 10pt; - font-family: 'trebuchet ms', verdana, arial; -} diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.js deleted file mode 100644 index 5957184..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.js +++ /dev/null @@ -1,1966 +0,0 @@ -/*! - * Nodeunit - * https://github.com/caolan/nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - * - * json2.js - * http://www.JSON.org/json2.js - * Public Domain. - * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - */ -nodeunit = (function(){ -/* - http://www.JSON.org/json2.js - 2010-11-17 - - Public Domain. - - NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - - See http://www.JSON.org/js.html - - - This code should be minified before deployment. - See http://javascript.crockford.com/jsmin.html - - USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO - NOT CONTROL. - - - This file creates a global JSON object containing two methods: stringify - and parse. - - JSON.stringify(value, replacer, space) - value any JavaScript value, usually an object or array. - - replacer an optional parameter that determines how object - values are stringified for objects. It can be a - function or an array of strings. - - space an optional parameter that specifies the indentation - of nested structures. If it is omitted, the text will - be packed without extra whitespace. If it is a number, - it will specify the number of spaces to indent at each - level. If it is a string (such as '\t' or ' '), - it contains the characters used to indent at each level. - - This method produces a JSON text from a JavaScript value. - - When an object value is found, if the object contains a toJSON - method, its toJSON method will be called and the result will be - stringified. A toJSON method does not serialize: it returns the - value represented by the name/value pair that should be serialized, - or undefined if nothing should be serialized. The toJSON method - will be passed the key associated with the value, and this will be - bound to the value - - For example, this would serialize Dates as ISO strings. - - Date.prototype.toJSON = function (key) { - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - return this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z'; - }; - - You can provide an optional replacer method. It will be passed the - key and value of each member, with this bound to the containing - object. The value that is returned from your method will be - serialized. If your method returns undefined, then the member will - be excluded from the serialization. - - If the replacer parameter is an array of strings, then it will be - used to select the members to be serialized. It filters the results - such that only members with keys listed in the replacer array are - stringified. - - Values that do not have JSON representations, such as undefined or - functions, will not be serialized. Such values in objects will be - dropped; in arrays they will be replaced with null. You can use - a replacer function to replace those with JSON values. - JSON.stringify(undefined) returns undefined. - - The optional space parameter produces a stringification of the - value that is filled with line breaks and indentation to make it - easier to read. - - If the space parameter is a non-empty string, then that string will - be used for indentation. If the space parameter is a number, then - the indentation will be that many spaces. - - Example: - - text = JSON.stringify(['e', {pluribus: 'unum'}]); - // text is '["e",{"pluribus":"unum"}]' - - - text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); - // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' - - text = JSON.stringify([new Date()], function (key, value) { - return this[key] instanceof Date ? - 'Date(' + this[key] + ')' : value; - }); - // text is '["Date(---current time---)"]' - - - JSON.parse(text, reviver) - This method parses a JSON text to produce an object or array. - It can throw a SyntaxError exception. - - The optional reviver parameter is a function that can filter and - transform the results. It receives each of the keys and values, - and its return value is used instead of the original value. - If it returns what it received, then the structure is not modified. - If it returns undefined then the member is deleted. - - Example: - - // Parse the text. Values that look like ISO date strings will - // be converted to Date objects. - - myData = JSON.parse(text, function (key, value) { - var a; - if (typeof value === 'string') { - a = -/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); - if (a) { - return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], - +a[5], +a[6])); - } - } - return value; - }); - - myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { - var d; - if (typeof value === 'string' && - value.slice(0, 5) === 'Date(' && - value.slice(-1) === ')') { - d = new Date(value.slice(5, -1)); - if (d) { - return d; - } - } - return value; - }); - - - This is a reference implementation. You are free to copy, modify, or - redistribute. -*/ - -/*jslint evil: true, strict: false, regexp: false */ - -/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, - call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, - getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, - lastIndex, length, parse, prototype, push, replace, slice, stringify, - test, toJSON, toString, valueOf -*/ - - -// Create a JSON object only if one does not already exist. We create the -// methods in a closure to avoid creating global variables. - -if (!this.JSON) { - this.JSON = {}; -} - -(function () { - "use strict"; - - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - if (typeof Date.prototype.toJSON !== 'function') { - - Date.prototype.toJSON = function (key) { - - return isFinite(this.valueOf()) ? - this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z' : null; - }; - - String.prototype.toJSON = - Number.prototype.toJSON = - Boolean.prototype.toJSON = function (key) { - return this.valueOf(); - }; - } - - var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - gap, - indent, - meta = { // table of character substitutions - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '"' : '\\"', - '\\': '\\\\' - }, - rep; - - - function quote(string) { - -// If the string contains no control characters, no quote characters, and no -// backslash characters, then we can safely slap some quotes around it. -// Otherwise we must also replace the offending characters with safe escape -// sequences. - - escapable.lastIndex = 0; - return escapable.test(string) ? - '"' + string.replace(escapable, function (a) { - var c = meta[a]; - return typeof c === 'string' ? c : - '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }) + '"' : - '"' + string + '"'; - } - - - function str(key, holder) { - -// Produce a string from holder[key]. - - var i, // The loop counter. - k, // The member key. - v, // The member value. - length, - mind = gap, - partial, - value = holder[key]; - -// If the value has a toJSON method, call it to obtain a replacement value. - - if (value && typeof value === 'object' && - typeof value.toJSON === 'function') { - value = value.toJSON(key); - } - -// If we were called with a replacer function, then call the replacer to -// obtain a replacement value. - - if (typeof rep === 'function') { - value = rep.call(holder, key, value); - } - -// What happens next depends on the value's type. - - switch (typeof value) { - case 'string': - return quote(value); - - case 'number': - -// JSON numbers must be finite. Encode non-finite numbers as null. - - return isFinite(value) ? String(value) : 'null'; - - case 'boolean': - case 'null': - -// If the value is a boolean or null, convert it to a string. Note: -// typeof null does not produce 'null'. The case is included here in -// the remote chance that this gets fixed someday. - - return String(value); - -// If the type is 'object', we might be dealing with an object or an array or -// null. - - case 'object': - -// Due to a specification blunder in ECMAScript, typeof null is 'object', -// so watch out for that case. - - if (!value) { - return 'null'; - } - -// Make an array to hold the partial results of stringifying this object value. - - gap += indent; - partial = []; - -// Is the value an array? - - if (Object.prototype.toString.apply(value) === '[object Array]') { - -// The value is an array. Stringify every element. Use null as a placeholder -// for non-JSON values. - - length = value.length; - for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || 'null'; - } - -// Join all of the elements together, separated with commas, and wrap them in -// brackets. - - v = partial.length === 0 ? '[]' : - gap ? '[\n' + gap + - partial.join(',\n' + gap) + '\n' + - mind + ']' : - '[' + partial.join(',') + ']'; - gap = mind; - return v; - } - -// If the replacer is an array, use it to select the members to be stringified. - - if (rep && typeof rep === 'object') { - length = rep.length; - for (i = 0; i < length; i += 1) { - k = rep[i]; - if (typeof k === 'string') { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } else { - -// Otherwise, iterate through all of the keys in the object. - - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } - -// Join all of the member texts together, separated with commas, -// and wrap them in braces. - - v = partial.length === 0 ? '{}' : - gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + - mind + '}' : '{' + partial.join(',') + '}'; - gap = mind; - return v; - } - } - -// If the JSON object does not yet have a stringify method, give it one. - - if (typeof JSON.stringify !== 'function') { - JSON.stringify = function (value, replacer, space) { - -// The stringify method takes a value and an optional replacer, and an optional -// space parameter, and returns a JSON text. The replacer can be a function -// that can replace values, or an array of strings that will select the keys. -// A default replacer method can be provided. Use of the space parameter can -// produce text that is more easily readable. - - var i; - gap = ''; - indent = ''; - -// If the space parameter is a number, make an indent string containing that -// many spaces. - - if (typeof space === 'number') { - for (i = 0; i < space; i += 1) { - indent += ' '; - } - -// If the space parameter is a string, it will be used as the indent string. - - } else if (typeof space === 'string') { - indent = space; - } - -// If there is a replacer, it must be a function or an array. -// Otherwise, throw an error. - - rep = replacer; - if (replacer && typeof replacer !== 'function' && - (typeof replacer !== 'object' || - typeof replacer.length !== 'number')) { - throw new Error('JSON.stringify'); - } - -// Make a fake root object containing our value under the key of ''. -// Return the result of stringifying the value. - - return str('', {'': value}); - }; - } - - -// If the JSON object does not yet have a parse method, give it one. - - if (typeof JSON.parse !== 'function') { - JSON.parse = function (text, reviver) { - -// The parse method takes a text and an optional reviver function, and returns -// a JavaScript value if the text is a valid JSON text. - - var j; - - function walk(holder, key) { - -// The walk method is used to recursively walk the resulting structure so -// that modifications can be made. - - var k, v, value = holder[key]; - if (value && typeof value === 'object') { - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== undefined) { - value[k] = v; - } else { - delete value[k]; - } - } - } - } - return reviver.call(holder, key, value); - } - - -// Parsing happens in four stages. In the first stage, we replace certain -// Unicode characters with escape sequences. JavaScript handles many characters -// incorrectly, either silently deleting them, or treating them as line endings. - - text = String(text); - cx.lastIndex = 0; - if (cx.test(text)) { - text = text.replace(cx, function (a) { - return '\\u' + - ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }); - } - -// In the second stage, we run the text against regular expressions that look -// for non-JSON patterns. We are especially concerned with '()' and 'new' -// because they can cause invocation, and '=' because it can cause mutation. -// But just to be safe, we want to reject all unexpected forms. - -// We split the second stage into 4 regexp operations in order to work around -// crippling inefficiencies in IE's and Safari's regexp engines. First we -// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we -// replace all simple value tokens with ']' characters. Third, we delete all -// open brackets that follow a colon or comma or that begin the text. Finally, -// we look to see that the remaining characters are only whitespace or ']' or -// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. - - if (/^[\],:{}\s]*$/ -.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') -.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') -.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { - -// In the third stage we use the eval function to compile the text into a -// JavaScript structure. The '{' operator is subject to a syntactic ambiguity -// in JavaScript: it can begin a block or an object literal. We wrap the text -// in parens to eliminate the ambiguity. - - j = eval('(' + text + ')'); - -// In the optional fourth stage, we recursively walk the new structure, passing -// each name/value pair to a reviver function for possible transformation. - - return typeof reviver === 'function' ? - walk({'': j}, '') : j; - } - -// If the text is not JSON parseable, then a SyntaxError is thrown. - - throw new SyntaxError('JSON.parse'); - }; - } -}()); -var assert = this.assert = {}; -var types = {}; -var core = {}; -var nodeunit = {}; -var reporter = {}; -/*global setTimeout: false, console: false */ -(function () { - - var async = {}; - - // global on the server, window in the browser - var root = this, - previous_async = root.async; - - if (typeof module !== 'undefined' && module.exports) { - module.exports = async; - } - else { - root.async = async; - } - - async.noConflict = function () { - root.async = previous_async; - return async; - }; - - //// cross-browser compatiblity functions //// - - var _forEach = function (arr, iterator) { - if (arr.forEach) { - return arr.forEach(iterator); - } - for (var i = 0; i < arr.length; i += 1) { - iterator(arr[i], i, arr); - } - }; - - var _map = function (arr, iterator) { - if (arr.map) { - return arr.map(iterator); - } - var results = []; - _forEach(arr, function (x, i, a) { - results.push(iterator(x, i, a)); - }); - return results; - }; - - var _reduce = function (arr, iterator, memo) { - if (arr.reduce) { - return arr.reduce(iterator, memo); - } - _forEach(arr, function (x, i, a) { - memo = iterator(memo, x, i, a); - }); - return memo; - }; - - var _keys = function (obj) { - if (Object.keys) { - return Object.keys(obj); - } - var keys = []; - for (var k in obj) { - if (obj.hasOwnProperty(k)) { - keys.push(k); - } - } - return keys; - }; - - var _indexOf = function (arr, item) { - if (arr.indexOf) { - return arr.indexOf(item); - } - for (var i = 0; i < arr.length; i += 1) { - if (arr[i] === item) { - return i; - } - } - return -1; - }; - - //// exported async module functions //// - - //// nextTick implementation with browser-compatible fallback //// - async.nextTick = function (fn) { - if (typeof process === 'undefined' || !(process.nextTick)) { - setTimeout(fn, 0); - } - else { - process.nextTick(fn); - } - }; - - async.forEach = function (arr, iterator, callback) { - if (!arr.length) { - return callback(); - } - var completed = 0; - _forEach(arr, function (x) { - iterator(x, function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed === arr.length) { - callback(); - } - } - }); - }); - }; - - async.forEachSeries = function (arr, iterator, callback) { - if (!arr.length) { - return callback(); - } - var completed = 0; - var iterate = function () { - iterator(arr[completed], function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed === arr.length) { - callback(); - } - else { - iterate(); - } - } - }); - }; - iterate(); - }; - - - var doParallel = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.forEach].concat(args)); - }; - }; - var doSeries = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.forEachSeries].concat(args)); - }; - }; - - - var _asyncMap = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (err, v) { - results[x.index] = v; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - }; - async.map = doParallel(_asyncMap); - async.mapSeries = doSeries(_asyncMap); - - - // reduce only has a series version, as doing reduce in parallel won't - // work in many situations. - async.reduce = function (arr, memo, iterator, callback) { - async.forEachSeries(arr, function (x, callback) { - iterator(memo, x, function (err, v) { - memo = v; - callback(err); - }); - }, function (err) { - callback(err, memo); - }); - }; - // inject alias - async.inject = async.reduce; - // foldl alias - async.foldl = async.reduce; - - async.reduceRight = function (arr, memo, iterator, callback) { - var reversed = _map(arr, function (x) { - return x; - }).reverse(); - async.reduce(reversed, memo, iterator, callback); - }; - // foldr alias - async.foldr = async.reduceRight; - - var _filter = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.filter = doParallel(_filter); - async.filterSeries = doSeries(_filter); - // select alias - async.select = async.filter; - async.selectSeries = async.filterSeries; - - var _reject = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (!v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.reject = doParallel(_reject); - async.rejectSeries = doSeries(_reject); - - var _detect = function (eachfn, arr, iterator, main_callback) { - eachfn(arr, function (x, callback) { - iterator(x, function (result) { - if (result) { - main_callback(x); - } - else { - callback(); - } - }); - }, function (err) { - main_callback(); - }); - }; - async.detect = doParallel(_detect); - async.detectSeries = doSeries(_detect); - - async.some = function (arr, iterator, main_callback) { - async.forEach(arr, function (x, callback) { - iterator(x, function (v) { - if (v) { - main_callback(true); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(false); - }); - }; - // any alias - async.any = async.some; - - async.every = function (arr, iterator, main_callback) { - async.forEach(arr, function (x, callback) { - iterator(x, function (v) { - if (!v) { - main_callback(false); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(true); - }); - }; - // all alias - async.all = async.every; - - async.sortBy = function (arr, iterator, callback) { - async.map(arr, function (x, callback) { - iterator(x, function (err, criteria) { - if (err) { - callback(err); - } - else { - callback(null, {value: x, criteria: criteria}); - } - }); - }, function (err, results) { - if (err) { - return callback(err); - } - else { - var fn = function (left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }; - callback(null, _map(results.sort(fn), function (x) { - return x.value; - })); - } - }); - }; - - async.auto = function (tasks, callback) { - callback = callback || function () {}; - var keys = _keys(tasks); - if (!keys.length) { - return callback(null); - } - - var completed = []; - - var listeners = []; - var addListener = function (fn) { - listeners.unshift(fn); - }; - var removeListener = function (fn) { - for (var i = 0; i < listeners.length; i += 1) { - if (listeners[i] === fn) { - listeners.splice(i, 1); - return; - } - } - }; - var taskComplete = function () { - _forEach(listeners, function (fn) { - fn(); - }); - }; - - addListener(function () { - if (completed.length === keys.length) { - callback(null); - } - }); - - _forEach(keys, function (k) { - var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k]; - var taskCallback = function (err) { - if (err) { - callback(err); - // stop subsequent errors hitting callback multiple times - callback = function () {}; - } - else { - completed.push(k); - taskComplete(); - } - }; - var requires = task.slice(0, Math.abs(task.length - 1)) || []; - var ready = function () { - return _reduce(requires, function (a, x) { - return (a && _indexOf(completed, x) !== -1); - }, true); - }; - if (ready()) { - task[task.length - 1](taskCallback); - } - else { - var listener = function () { - if (ready()) { - removeListener(listener); - task[task.length - 1](taskCallback); - } - }; - addListener(listener); - } - }); - }; - - async.waterfall = function (tasks, callback) { - if (!tasks.length) { - return callback(); - } - callback = callback || function () {}; - var wrapIterator = function (iterator) { - return function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - var args = Array.prototype.slice.call(arguments, 1); - var next = iterator.next(); - if (next) { - args.push(wrapIterator(next)); - } - else { - args.push(callback); - } - async.nextTick(function () { - iterator.apply(null, args); - }); - } - }; - }; - wrapIterator(async.iterator(tasks))(); - }; - - async.parallel = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.map(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args || null); - }); - } - }, callback); - } - else { - var results = {}; - async.forEach(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.series = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.mapSeries(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args || null); - }); - } - }, callback); - } - else { - var results = {}; - async.forEachSeries(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.iterator = function (tasks) { - var makeCallback = function (index) { - var fn = function () { - if (tasks.length) { - tasks[index].apply(null, arguments); - } - return fn.next(); - }; - fn.next = function () { - return (index < tasks.length - 1) ? makeCallback(index + 1): null; - }; - return fn; - }; - return makeCallback(0); - }; - - async.apply = function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - return function () { - return fn.apply( - null, args.concat(Array.prototype.slice.call(arguments)) - ); - }; - }; - - var _concat = function (eachfn, arr, fn, callback) { - var r = []; - eachfn(arr, function (x, cb) { - fn(x, function (err, y) { - r = r.concat(y || []); - cb(err); - }); - }, function (err) { - callback(err, r); - }); - }; - async.concat = doParallel(_concat); - async.concatSeries = doSeries(_concat); - - async.whilst = function (test, iterator, callback) { - if (test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.whilst(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.until = function (test, iterator, callback) { - if (!test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.until(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.queue = function (worker, concurrency) { - var workers = 0; - var tasks = []; - var q = { - concurrency: concurrency, - push: function (data, callback) { - tasks.push({data: data, callback: callback}); - async.nextTick(q.process); - }, - process: function () { - if (workers < q.concurrency && tasks.length) { - var task = tasks.splice(0, 1)[0]; - workers += 1; - worker(task.data, function () { - workers -= 1; - if (task.callback) { - task.callback.apply(task, arguments); - } - q.process(); - }); - } - }, - length: function () { - return tasks.length; - } - }; - return q; - }; - - var _console_fn = function (name) { - return function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - fn.apply(null, args.concat([function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (typeof console !== 'undefined') { - if (err) { - if (console.error) { - console.error(err); - } - } - else if (console[name]) { - _forEach(args, function (x) { - console[name](x); - }); - } - } - }])); - }; - }; - async.log = _console_fn('log'); - async.dir = _console_fn('dir'); - /*async.info = _console_fn('info'); - async.warn = _console_fn('warn'); - async.error = _console_fn('error');*/ - -}()); -(function(exports){ -/** - * This file is based on the node.js assert module, but with some small - * changes for browser-compatibility - * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! - */ - - -/** - * Added for browser compatibility - */ - -var _keys = function(obj){ - if(Object.keys) return Object.keys(obj); - var keys = []; - for(var k in obj){ - if(obj.hasOwnProperty(k)) keys.push(k); - } - return keys; -}; - - - -// http://wiki.commonjs.org/wiki/Unit_Testing/1.0 -// -// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! -// -// Originally from narwhal.js (http://narwhaljs.org) -// Copyright (c) 2009 Thomas Robinson <280north.com> -// -// 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. - - -var pSlice = Array.prototype.slice; - -// 1. The assert module provides functions that throw -// AssertionError's when particular conditions are not met. The -// assert module must conform to the following interface. - -var assert = exports; - -// 2. The AssertionError is defined in assert. -// new assert.AssertionError({message: message, actual: actual, expected: expected}) - -assert.AssertionError = function AssertionError (options) { - this.name = "AssertionError"; - this.message = options.message; - this.actual = options.actual; - this.expected = options.expected; - this.operator = options.operator; - var stackStartFunction = options.stackStartFunction || fail; - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, stackStartFunction); - } -}; -// code from util.inherits in node -assert.AssertionError.super_ = Error; - - -// EDITED FOR BROWSER COMPATIBILITY: replaced Object.create call -// TODO: test what effect this may have -var ctor = function () { this.constructor = assert.AssertionError; }; -ctor.prototype = Error.prototype; -assert.AssertionError.prototype = new ctor(); - - -assert.AssertionError.prototype.toString = function() { - if (this.message) { - return [this.name+":", this.message].join(' '); - } else { - return [ this.name+":" - , JSON.stringify(this.expected ) - , this.operator - , JSON.stringify(this.actual) - ].join(" "); - } -}; - -// assert.AssertionError instanceof Error - -assert.AssertionError.__proto__ = Error.prototype; - -// At present only the three keys mentioned above are used and -// understood by the spec. Implementations or sub modules can pass -// other keys to the AssertionError's constructor - they will be -// ignored. - -// 3. All of the following functions must throw an AssertionError -// when a corresponding condition is not met, with a message that -// may be undefined if not provided. All assertion methods provide -// both the actual and expected values to the assertion error for -// display purposes. - -function fail(actual, expected, message, operator, stackStartFunction) { - throw new assert.AssertionError({ - message: message, - actual: actual, - expected: expected, - operator: operator, - stackStartFunction: stackStartFunction - }); -} - -// EXTENSION! allows for well behaved errors defined elsewhere. -assert.fail = fail; - -// 4. Pure assertion tests whether a value is truthy, as determined -// by !!guard. -// assert.ok(guard, message_opt); -// This statement is equivalent to assert.equal(true, guard, -// message_opt);. To test strictly for the value true, use -// assert.strictEqual(true, guard, message_opt);. - -assert.ok = function ok(value, message) { - if (!!!value) fail(value, true, message, "==", assert.ok); -}; - -// 5. The equality assertion tests shallow, coercive equality with -// ==. -// assert.equal(actual, expected, message_opt); - -assert.equal = function equal(actual, expected, message) { - if (actual != expected) fail(actual, expected, message, "==", assert.equal); -}; - -// 6. The non-equality assertion tests for whether two objects are not equal -// with != assert.notEqual(actual, expected, message_opt); - -assert.notEqual = function notEqual(actual, expected, message) { - if (actual == expected) { - fail(actual, expected, message, "!=", assert.notEqual); - } -}; - -// 7. The equivalence assertion tests a deep equality relation. -// assert.deepEqual(actual, expected, message_opt); - -assert.deepEqual = function deepEqual(actual, expected, message) { - if (!_deepEqual(actual, expected)) { - fail(actual, expected, message, "deepEqual", assert.deepEqual); - } -}; - -function _deepEqual(actual, expected) { - // 7.1. All identical values are equivalent, as determined by ===. - if (actual === expected) { - return true; - // 7.2. If the expected value is a Date object, the actual value is - // equivalent if it is also a Date object that refers to the same time. - } else if (actual instanceof Date && expected instanceof Date) { - return actual.getTime() === expected.getTime(); - - // 7.3. Other pairs that do not both pass typeof value == "object", - // equivalence is determined by ==. - } else if (typeof actual != 'object' && typeof expected != 'object') { - return actual == expected; - - // 7.4. For all other Object pairs, including Array objects, equivalence is - // determined by having the same number of owned properties (as verified - // with Object.prototype.hasOwnProperty.call), the same set of keys - // (although not necessarily the same order), equivalent values for every - // corresponding key, and an identical "prototype" property. Note: this - // accounts for both named and indexed properties on Arrays. - } else { - return objEquiv(actual, expected); - } -} - -function isUndefinedOrNull (value) { - return value === null || value === undefined; -} - -function isArguments (object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; -} - -function objEquiv (a, b) { - if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) - return false; - // an identical "prototype" property. - if (a.prototype !== b.prototype) return false; - //~~~I've managed to break Object.keys through screwy arguments passing. - // Converting to array solves the problem. - if (isArguments(a)) { - if (!isArguments(b)) { - return false; - } - a = pSlice.call(a); - b = pSlice.call(b); - return _deepEqual(a, b); - } - try{ - var ka = _keys(a), - kb = _keys(b), - key, i; - } catch (e) {//happens when one is a string literal and the other isn't - return false; - } - // having the same number of owned properties (keys incorporates hasOwnProperty) - if (ka.length != kb.length) - return false; - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] != kb[i]) - return false; - } - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!_deepEqual(a[key], b[key] )) - return false; - } - return true; -} - -// 8. The non-equivalence assertion tests for any deep inequality. -// assert.notDeepEqual(actual, expected, message_opt); - -assert.notDeepEqual = function notDeepEqual(actual, expected, message) { - if (_deepEqual(actual, expected)) { - fail(actual, expected, message, "notDeepEqual", assert.notDeepEqual); - } -}; - -// 9. The strict equality assertion tests strict equality, as determined by ===. -// assert.strictEqual(actual, expected, message_opt); - -assert.strictEqual = function strictEqual(actual, expected, message) { - if (actual !== expected) { - fail(actual, expected, message, "===", assert.strictEqual); - } -}; - -// 10. The strict non-equality assertion tests for strict inequality, as determined by !==. -// assert.notStrictEqual(actual, expected, message_opt); - -assert.notStrictEqual = function notStrictEqual(actual, expected, message) { - if (actual === expected) { - fail(actual, expected, message, "!==", assert.notStrictEqual); - } -}; - -function _throws (shouldThrow, block, err, message) { - var exception = null, - threw = false, - typematters = true; - - message = message || ""; - - //handle optional arguments - if (arguments.length == 3) { - if (typeof(err) == "string") { - message = err; - typematters = false; - } - } else if (arguments.length == 2) { - typematters = false; - } - - try { - block(); - } catch (e) { - threw = true; - exception = e; - } - - if (shouldThrow && !threw) { - fail( "Missing expected exception" - + (err && err.name ? " ("+err.name+")." : '.') - + (message ? " " + message : "") - ); - } - if (!shouldThrow && threw && typematters && exception instanceof err) { - fail( "Got unwanted exception" - + (err && err.name ? " ("+err.name+")." : '.') - + (message ? " " + message : "") - ); - } - if ((shouldThrow && threw && typematters && !(exception instanceof err)) || - (!shouldThrow && threw)) { - throw exception; - } -}; - -// 11. Expected to throw an error: -// assert.throws(block, Error_opt, message_opt); - -assert.throws = function(block, /*optional*/error, /*optional*/message) { - _throws.apply(this, [true].concat(pSlice.call(arguments))); -}; - -// EXTENSION! This is annoying to write outside this module. -assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) { - _throws.apply(this, [false].concat(pSlice.call(arguments))); -}; - -assert.ifError = function (err) { if (err) {throw err;}}; -})(assert); -(function(exports){ -/*! - * Nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - * - * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! - * Only code on that line will be removed, its mostly to avoid requiring code - * that is node specific - */ - -/** - * Module dependencies - */ - - - -/** - * Creates assertion objects representing the result of an assert call. - * Accepts an object or AssertionError as its argument. - * - * @param {object} obj - * @api public - */ - -exports.assertion = function (obj) { - return { - method: obj.method || '', - message: obj.message || (obj.error && obj.error.message) || '', - error: obj.error, - passed: function () { - return !this.error; - }, - failed: function () { - return Boolean(this.error); - } - }; -}; - -/** - * Creates an assertion list object representing a group of assertions. - * Accepts an array of assertion objects. - * - * @param {Array} arr - * @param {Number} duration - * @api public - */ - -exports.assertionList = function (arr, duration) { - var that = arr || []; - that.failures = function () { - var failures = 0; - for (var i=0; i(' + - '' + assertions.failures() + ', ' + - '' + assertions.passes() + ', ' + - assertions.length + - ')
        '; - test.className = assertions.failures() ? 'fail': 'pass'; - test.appendChild(strong); - - var aList = document.createElement('ol'); - aList.style.display = 'none'; - test.onclick = function () { - var d = aList.style.display; - aList.style.display = (d == 'none') ? 'block': 'none'; - }; - for (var i=0; i' + (a.error.stack || a.error) + ''; - li.className = 'fail'; - } - else { - li.innerHTML = a.message || a.method || 'no message'; - li.className = 'pass'; - } - aList.appendChild(li); - } - test.appendChild(aList); - tests.appendChild(test); - }, - done: function (assertions) { - var end = new Date().getTime(); - var duration = end - start; - - var failures = assertions.failures(); - banner.className = failures ? 'fail': 'pass'; - - result.innerHTML = 'Tests completed in ' + duration + - ' milliseconds.
        ' + - assertions.passes() + ' assertions of ' + - '' + assertions.length + ' passed, ' + - assertions.failures() + ' failed.'; - } - }); -}; -})(reporter); -nodeunit = core; -nodeunit.assert = assert; -nodeunit.reporter = reporter; -nodeunit.run = reporter.run; -return nodeunit; })(); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js deleted file mode 100644 index f89741e..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js +++ /dev/null @@ -1 +0,0 @@ -/*global setTimeout: false, console: false */(function(){var a={};var b=this,c=b.async;typeof module!=="undefined"&&module.exports?module.exports=a:b.async=a,a.noConflict=function(){b.async=c;return a};var d=function(a,b){if(a.forEach)return a.forEach(b);for(var c=0;cd?1:0};d(null,e(b.sort(c),function(a){return a.value}))})},a.auto=function(a,b){b=b||function(){};var c=g(a);if(!c.length)return b(null);var e=[];var i=[];var j=function(a){i.unshift(a)};var k=function(a){for(var b=0;b b ? 1 : 0; - }; - callback(null, _map(results.sort(fn), function (x) { - return x.value; - })); - } - }); - }; - - async.auto = function (tasks, callback) { - callback = callback || function () {}; - var keys = _keys(tasks); - if (!keys.length) { - return callback(null); - } - - var completed = []; - - var listeners = []; - var addListener = function (fn) { - listeners.unshift(fn); - }; - var removeListener = function (fn) { - for (var i = 0; i < listeners.length; i += 1) { - if (listeners[i] === fn) { - listeners.splice(i, 1); - return; - } - } - }; - var taskComplete = function () { - _forEach(listeners, function (fn) { - fn(); - }); - }; - - addListener(function () { - if (completed.length === keys.length) { - callback(null); - } - }); - - _forEach(keys, function (k) { - var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k]; - var taskCallback = function (err) { - if (err) { - callback(err); - // stop subsequent errors hitting callback multiple times - callback = function () {}; - } - else { - completed.push(k); - taskComplete(); - } - }; - var requires = task.slice(0, Math.abs(task.length - 1)) || []; - var ready = function () { - return _reduce(requires, function (a, x) { - return (a && _indexOf(completed, x) !== -1); - }, true); - }; - if (ready()) { - task[task.length - 1](taskCallback); - } - else { - var listener = function () { - if (ready()) { - removeListener(listener); - task[task.length - 1](taskCallback); - } - }; - addListener(listener); - } - }); - }; - - async.waterfall = function (tasks, callback) { - if (!tasks.length) { - return callback(); - } - callback = callback || function () {}; - var wrapIterator = function (iterator) { - return function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - var args = Array.prototype.slice.call(arguments, 1); - var next = iterator.next(); - if (next) { - args.push(wrapIterator(next)); - } - else { - args.push(callback); - } - async.nextTick(function () { - iterator.apply(null, args); - }); - } - }; - }; - wrapIterator(async.iterator(tasks))(); - }; - - async.parallel = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.map(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args); - }); - } - }, callback); - } - else { - var results = {}; - async.forEach(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.series = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.mapSeries(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args); - }); - } - }, callback); - } - else { - var results = {}; - async.forEachSeries(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.iterator = function (tasks) { - var makeCallback = function (index) { - var fn = function () { - if (tasks.length) { - tasks[index].apply(null, arguments); - } - return fn.next(); - }; - fn.next = function () { - return (index < tasks.length - 1) ? makeCallback(index + 1): null; - }; - return fn; - }; - return makeCallback(0); - }; - - async.apply = function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - return function () { - return fn.apply( - null, args.concat(Array.prototype.slice.call(arguments)) - ); - }; - }; - - var _concat = function (eachfn, arr, fn, callback) { - var r = []; - eachfn(arr, function (x, cb) { - fn(x, function (err, y) { - r = r.concat(y || []); - cb(err); - }); - }, function (err) { - callback(err, r); - }); - }; - async.concat = doParallel(_concat); - async.concatSeries = doSeries(_concat); - - async.whilst = function (test, iterator, callback) { - if (test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.whilst(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.until = function (test, iterator, callback) { - if (!test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.until(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.queue = function (worker, concurrency) { - var workers = 0; - var tasks = []; - var q = { - concurrency: concurrency, - saturated: null, - empty: null, - drain: null, - push: function (data, callback) { - tasks.push({data: data, callback: callback}); - if(q.saturated && tasks.length == concurrency) q.saturated(); - async.nextTick(q.process); - }, - process: function () { - if (workers < q.concurrency && tasks.length) { - var task = tasks.splice(0, 1)[0]; - if(q.empty && tasks.length == 0) q.empty(); - workers += 1; - worker(task.data, function () { - workers -= 1; - if (task.callback) { - task.callback.apply(task, arguments); - } - if(q.drain && tasks.length + workers == 0) q.drain(); - q.process(); - }); - } - }, - length: function () { - return tasks.length; - }, - running: function () { - return workers; - } - }; - return q; - }; - - var _console_fn = function (name) { - return function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - fn.apply(null, args.concat([function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (typeof console !== 'undefined') { - if (err) { - if (console.error) { - console.error(err); - } - } - else if (console[name]) { - _forEach(args, function (x) { - console[name](x); - }); - } - } - }])); - }; - }; - async.log = _console_fn('log'); - async.dir = _console_fn('dir'); - /*async.info = _console_fn('info'); - async.warn = _console_fn('warn'); - async.error = _console_fn('error');*/ - - async.memoize = function (fn, hasher) { - var memo = {}; - hasher = hasher || function (x) { - return x; - }; - return function () { - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - var key = hasher.apply(null, args); - if (key in memo) { - callback.apply(null, memo[key]); - } - else { - fn.apply(null, args.concat([function () { - memo[key] = arguments; - callback.apply(null, arguments); - }])); - } - }; - }; - -}()); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/nodelint.cfg b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/nodelint.cfg deleted file mode 100644 index 457a967..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/nodelint.cfg +++ /dev/null @@ -1,4 +0,0 @@ -var options = { - indent: 4, - onevar: false -}; diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/package.json b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/package.json deleted file mode 100644 index e5646d7..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/package.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "async", - "description": "Higher-order functions and common patterns for asynchronous code", - "main": "./index", - "author": { - "name": "Caolan McMahon" - }, - "version": "0.1.9", - "repository": { - "type": "git", - "url": "git://github.com/caolan/async.git" - }, - "bugs": { - "url": "http://github.com/caolan/async/issues" - }, - "licenses": [ - { - "type": "MIT", - "url": "http://github.com/caolan/async/raw/master/LICENSE" - } - ], - "_npmUser": { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - "_id": "async@0.1.9", - "dependencies": {}, - "devDependencies": {}, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "_engineSupported": true, - "_npmVersion": "1.1.24", - "_nodeVersion": "v0.8.1", - "_defaultsLoaded": true, - "dist": { - "shasum": "fd9b6aca66495fd0f7e97f86e71c7706ca9ae754" - }, - "_from": "async@0.1.9" -} diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/test/.swp b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/test/.swp deleted file mode 100644 index ece9b6bb6a4f01d31a8613468ccc9244e256ea4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2y>1gh5XU!k2=O6!fx#G*1bfd;q(nN!t|DZl1PM@R*c9ixB|hhTd)%IJ+yq_& z3R-G9L;(dAk3r27P#`h8Hj0FhDR2|%Kho^%?9R;1{jOTw_FGTx@6)#25G>b(c>C(Z z{-Njzc}a*kGFg`WCKRNaX>-TxySGFHn-?2hK00ck)1V8`;KmY_l00ck)1pbRatF`szv%4rQ2h}JO z&i%`hkMQef!&#D>HT{)qIkZB`K-8$SMB#Eo565YIOg)_yA?@62cf$csiJIY&p>aV; zS`zJsiOzJTi5`We&Z7~}Y-mkcHTzSdlTe@N*jMYNNtz#pT-S?SSJF;oz2PRsbQbfN z^T_JwW1Yu3q^Bx4tT)t7Y)Y+euPUh$byuyaj_Nj)9PpNm{ZJJ3#yWe(d8R*fCe5FD z*G_m-$$oUq=Ctm6anI2SxelGUw*7iAFe4o-xY}N$2f8XJw40WE>)n)7+DmQ4?=>s* V?{PKv`7hd=TWkEtC4RDw_ysbD&=&vz diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/test/test-async.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/test/test-async.js deleted file mode 100644 index 8c2cebd..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/test/test-async.js +++ /dev/null @@ -1,1367 +0,0 @@ -var async = require('../lib/async'); - - -exports['auto'] = function(test){ - var callOrder = []; - var testdata = [{test: 'test'}]; - async.auto({ - task1: ['task2', function(callback){ - setTimeout(function(){ - callOrder.push('task1'); - callback(); - }, 25); - }], - task2: function(callback){ - setTimeout(function(){ - callOrder.push('task2'); - callback(); - }, 50); - }, - task3: ['task2', function(callback){ - callOrder.push('task3'); - callback(); - }], - task4: ['task1', 'task2', function(callback){ - callOrder.push('task4'); - callback(); - }] - }, - function(err){ - test.same(callOrder, ['task2','task3','task1','task4']); - test.done(); - }); -}; - -exports['auto empty object'] = function(test){ - async.auto({}, function(err){ - test.done(); - }); -}; - -exports['auto error'] = function(test){ - test.expect(1); - async.auto({ - task1: function(callback){ - callback('testerror'); - }, - task2: ['task1', function(callback){ - test.ok(false, 'task2 should not be called'); - callback(); - }], - task3: function(callback){ - callback('testerror2'); - } - }, - function(err){ - test.equals(err, 'testerror'); - }); - setTimeout(test.done, 100); -}; - -exports['auto no callback'] = function(test){ - async.auto({ - task1: function(callback){callback();}, - task2: ['task1', function(callback){callback(); test.done();}] - }); -}; - -exports['waterfall'] = function(test){ - test.expect(6); - var call_order = []; - async.waterfall([ - function(callback){ - call_order.push('fn1'); - setTimeout(function(){callback(null, 'one', 'two');}, 0); - }, - function(arg1, arg2, callback){ - call_order.push('fn2'); - test.equals(arg1, 'one'); - test.equals(arg2, 'two'); - setTimeout(function(){callback(null, arg1, arg2, 'three');}, 25); - }, - function(arg1, arg2, arg3, callback){ - call_order.push('fn3'); - test.equals(arg1, 'one'); - test.equals(arg2, 'two'); - test.equals(arg3, 'three'); - callback(null, 'four'); - }, - function(arg4, callback){ - call_order.push('fn4'); - test.same(call_order, ['fn1','fn2','fn3','fn4']); - callback(null, 'test'); - } - ], function(err){ - test.done(); - }); -}; - -exports['waterfall empty array'] = function(test){ - async.waterfall([], function(err){ - test.done(); - }); -}; - -exports['waterfall no callback'] = function(test){ - async.waterfall([ - function(callback){callback();}, - function(callback){callback(); test.done();} - ]); -}; - -exports['waterfall async'] = function(test){ - var call_order = []; - async.waterfall([ - function(callback){ - call_order.push(1); - callback(); - call_order.push(2); - }, - function(callback){ - call_order.push(3); - callback(); - }, - function(){ - test.same(call_order, [1,2,3]); - test.done(); - } - ]); -}; - -exports['waterfall error'] = function(test){ - test.expect(1); - async.waterfall([ - function(callback){ - callback('error'); - }, - function(callback){ - test.ok(false, 'next function should not be called'); - callback(); - } - ], function(err){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['waterfall multiple callback calls'] = function(test){ - var call_order = []; - var arr = [ - function(callback){ - call_order.push(1); - // call the callback twice. this should call function 2 twice - callback(null, 'one', 'two'); - callback(null, 'one', 'two'); - }, - function(arg1, arg2, callback){ - call_order.push(2); - callback(null, arg1, arg2, 'three'); - }, - function(arg1, arg2, arg3, callback){ - call_order.push(3); - callback(null, 'four'); - }, - function(arg4){ - call_order.push(4); - arr[3] = function(){ - call_order.push(4); - test.same(call_order, [1,2,2,3,3,4,4]); - test.done(); - }; - } - ]; - async.waterfall(arr); -}; - - -exports['parallel'] = function(test){ - var call_order = []; - async.parallel([ - function(callback){ - setTimeout(function(){ - call_order.push(1); - callback(null, 1); - }, 25); - }, - function(callback){ - setTimeout(function(){ - call_order.push(2); - callback(null, 2); - }, 50); - }, - function(callback){ - setTimeout(function(){ - call_order.push(3); - callback(null, 3,3); - }, 15); - } - ], - function(err, results){ - test.equals(err, null); - test.same(call_order, [3,1,2]); - test.same(results, [1,2,[3,3]]); - test.done(); - }); -}; - -exports['parallel empty array'] = function(test){ - async.parallel([], function(err, results){ - test.equals(err, null); - test.same(results, []); - test.done(); - }); -}; - -exports['parallel error'] = function(test){ - async.parallel([ - function(callback){ - callback('error', 1); - }, - function(callback){ - callback('error2', 2); - } - ], - function(err, results){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 100); -}; - -exports['parallel no callback'] = function(test){ - async.parallel([ - function(callback){callback();}, - function(callback){callback(); test.done();}, - ]); -}; - -exports['parallel object'] = function(test){ - var call_order = []; - async.parallel({ - one: function(callback){ - setTimeout(function(){ - call_order.push(1); - callback(null, 1); - }, 25); - }, - two: function(callback){ - setTimeout(function(){ - call_order.push(2); - callback(null, 2); - }, 50); - }, - three: function(callback){ - setTimeout(function(){ - call_order.push(3); - callback(null, 3,3); - }, 15); - } - }, - function(err, results){ - test.equals(err, null); - test.same(call_order, [3,1,2]); - test.same(results, { - one: 1, - two: 2, - three: [3,3] - }); - test.done(); - }); -}; - -exports['series'] = function(test){ - var call_order = []; - async.series([ - function(callback){ - setTimeout(function(){ - call_order.push(1); - callback(null, 1); - }, 25); - }, - function(callback){ - setTimeout(function(){ - call_order.push(2); - callback(null, 2); - }, 50); - }, - function(callback){ - setTimeout(function(){ - call_order.push(3); - callback(null, 3,3); - }, 15); - } - ], - function(err, results){ - test.equals(err, null); - test.same(results, [1,2,[3,3]]); - test.same(call_order, [1,2,3]); - test.done(); - }); -}; - -exports['series empty array'] = function(test){ - async.series([], function(err, results){ - test.equals(err, null); - test.same(results, []); - test.done(); - }); -}; - -exports['series error'] = function(test){ - test.expect(1); - async.series([ - function(callback){ - callback('error', 1); - }, - function(callback){ - test.ok(false, 'should not be called'); - callback('error2', 2); - } - ], - function(err, results){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 100); -}; - -exports['series no callback'] = function(test){ - async.series([ - function(callback){callback();}, - function(callback){callback(); test.done();}, - ]); -}; - -exports['series object'] = function(test){ - var call_order = []; - async.series({ - one: function(callback){ - setTimeout(function(){ - call_order.push(1); - callback(null, 1); - }, 25); - }, - two: function(callback){ - setTimeout(function(){ - call_order.push(2); - callback(null, 2); - }, 50); - }, - three: function(callback){ - setTimeout(function(){ - call_order.push(3); - callback(null, 3,3); - }, 15); - } - }, - function(err, results){ - test.equals(err, null); - test.same(results, { - one: 1, - two: 2, - three: [3,3] - }); - test.same(call_order, [1,2,3]); - test.done(); - }); -}; - -exports['iterator'] = function(test){ - var call_order = []; - var iterator = async.iterator([ - function(){call_order.push(1);}, - function(arg1){ - test.equals(arg1, 'arg1'); - call_order.push(2); - }, - function(arg1, arg2){ - test.equals(arg1, 'arg1'); - test.equals(arg2, 'arg2'); - call_order.push(3); - } - ]); - iterator(); - test.same(call_order, [1]); - var iterator2 = iterator(); - test.same(call_order, [1,1]); - var iterator3 = iterator2('arg1'); - test.same(call_order, [1,1,2]); - var iterator4 = iterator3('arg1', 'arg2'); - test.same(call_order, [1,1,2,3]); - test.equals(iterator4, undefined); - test.done(); -}; - -exports['iterator empty array'] = function(test){ - var iterator = async.iterator([]); - test.equals(iterator(), undefined); - test.equals(iterator.next(), undefined); - test.done(); -}; - -exports['iterator.next'] = function(test){ - var call_order = []; - var iterator = async.iterator([ - function(){call_order.push(1);}, - function(arg1){ - test.equals(arg1, 'arg1'); - call_order.push(2); - }, - function(arg1, arg2){ - test.equals(arg1, 'arg1'); - test.equals(arg2, 'arg2'); - call_order.push(3); - } - ]); - var fn = iterator.next(); - var iterator2 = fn('arg1'); - test.same(call_order, [2]); - iterator2('arg1','arg2'); - test.same(call_order, [2,3]); - test.equals(iterator2.next(), undefined); - test.done(); -}; - -exports['forEach'] = function(test){ - var args = []; - async.forEach([1,3,2], function(x, callback){ - setTimeout(function(){ - args.push(x); - callback(); - }, x*25); - }, function(err){ - test.same(args, [1,2,3]); - test.done(); - }); -}; - -exports['forEach empty array'] = function(test){ - test.expect(1); - async.forEach([], function(x, callback){ - test.ok(false, 'iterator should not be called'); - callback(); - }, function(err){ - test.ok(true, 'should call callback'); - }); - setTimeout(test.done, 25); -}; - -exports['forEach error'] = function(test){ - test.expect(1); - async.forEach([1,2,3], function(x, callback){ - callback('error'); - }, function(err){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['forEachSeries'] = function(test){ - var args = []; - async.forEachSeries([1,3,2], function(x, callback){ - setTimeout(function(){ - args.push(x); - callback(); - }, x*25); - }, function(err){ - test.same(args, [1,3,2]); - test.done(); - }); -}; - -exports['forEachSeries empty array'] = function(test){ - test.expect(1); - async.forEachSeries([], function(x, callback){ - test.ok(false, 'iterator should not be called'); - callback(); - }, function(err){ - test.ok(true, 'should call callback'); - }); - setTimeout(test.done, 25); -}; - -exports['forEachSeries error'] = function(test){ - test.expect(2); - var call_order = []; - async.forEachSeries([1,2,3], function(x, callback){ - call_order.push(x); - callback('error'); - }, function(err){ - test.same(call_order, [1]); - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['map'] = function(test){ - var call_order = []; - async.map([1,3,2], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(null, x*2); - }, x*25); - }, function(err, results){ - test.same(call_order, [1,2,3]); - test.same(results, [2,6,4]); - test.done(); - }); -}; - -exports['map original untouched'] = function(test){ - var a = [1,2,3]; - async.map(a, function(x, callback){ - callback(null, x*2); - }, function(err, results){ - test.same(results, [2,4,6]); - test.same(a, [1,2,3]); - test.done(); - }); -}; - -exports['map error'] = function(test){ - test.expect(1); - async.map([1,2,3], function(x, callback){ - callback('error'); - }, function(err, results){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['mapSeries'] = function(test){ - var call_order = []; - async.mapSeries([1,3,2], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(null, x*2); - }, x*25); - }, function(err, results){ - test.same(call_order, [1,3,2]); - test.same(results, [2,6,4]); - test.done(); - }); -}; - -exports['mapSeries error'] = function(test){ - test.expect(1); - async.mapSeries([1,2,3], function(x, callback){ - callback('error'); - }, function(err, results){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['reduce'] = function(test){ - var call_order = []; - async.reduce([1,2,3], 0, function(a, x, callback){ - call_order.push(x); - callback(null, a + x); - }, function(err, result){ - test.equals(result, 6); - test.same(call_order, [1,2,3]); - test.done(); - }); -}; - -exports['reduce async with non-reference memo'] = function(test){ - async.reduce([1,3,2], 0, function(a, x, callback){ - setTimeout(function(){callback(null, a + x)}, Math.random()*100); - }, function(err, result){ - test.equals(result, 6); - test.done(); - }); -}; - -exports['reduce error'] = function(test){ - test.expect(1); - async.reduce([1,2,3], 0, function(a, x, callback){ - callback('error'); - }, function(err, result){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['inject alias'] = function(test){ - test.equals(async.inject, async.reduce); - test.done(); -}; - -exports['foldl alias'] = function(test){ - test.equals(async.foldl, async.reduce); - test.done(); -}; - -exports['reduceRight'] = function(test){ - var call_order = []; - var a = [1,2,3]; - async.reduceRight(a, 0, function(a, x, callback){ - call_order.push(x); - callback(null, a + x); - }, function(err, result){ - test.equals(result, 6); - test.same(call_order, [3,2,1]); - test.same(a, [1,2,3]); - test.done(); - }); -}; - -exports['foldr alias'] = function(test){ - test.equals(async.foldr, async.reduceRight); - test.done(); -}; - -exports['filter'] = function(test){ - async.filter([3,1,2], function(x, callback){ - setTimeout(function(){callback(x % 2);}, x*25); - }, function(results){ - test.same(results, [3,1]); - test.done(); - }); -}; - -exports['filter original untouched'] = function(test){ - var a = [3,1,2]; - async.filter(a, function(x, callback){ - callback(x % 2); - }, function(results){ - test.same(results, [3,1]); - test.same(a, [3,1,2]); - test.done(); - }); -}; - -exports['filterSeries'] = function(test){ - async.filterSeries([3,1,2], function(x, callback){ - setTimeout(function(){callback(x % 2);}, x*25); - }, function(results){ - test.same(results, [3,1]); - test.done(); - }); -}; - -exports['select alias'] = function(test){ - test.equals(async.select, async.filter); - test.done(); -}; - -exports['selectSeries alias'] = function(test){ - test.equals(async.selectSeries, async.filterSeries); - test.done(); -}; - -exports['reject'] = function(test){ - async.reject([3,1,2], function(x, callback){ - setTimeout(function(){callback(x % 2);}, x*25); - }, function(results){ - test.same(results, [2]); - test.done(); - }); -}; - -exports['reject original untouched'] = function(test){ - var a = [3,1,2]; - async.reject(a, function(x, callback){ - callback(x % 2); - }, function(results){ - test.same(results, [2]); - test.same(a, [3,1,2]); - test.done(); - }); -}; - -exports['rejectSeries'] = function(test){ - async.rejectSeries([3,1,2], function(x, callback){ - setTimeout(function(){callback(x % 2);}, x*25); - }, function(results){ - test.same(results, [2]); - test.done(); - }); -}; - -exports['some true'] = function(test){ - async.some([3,1,2], function(x, callback){ - setTimeout(function(){callback(x === 1);}, 0); - }, function(result){ - test.equals(result, true); - test.done(); - }); -}; - -exports['some false'] = function(test){ - async.some([3,1,2], function(x, callback){ - setTimeout(function(){callback(x === 10);}, 0); - }, function(result){ - test.equals(result, false); - test.done(); - }); -}; - -exports['some early return'] = function(test){ - var call_order = []; - async.some([1,2,3], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(x === 1); - }, x*25); - }, function(result){ - call_order.push('callback'); - }); - setTimeout(function(){ - test.same(call_order, [1,'callback',2,3]); - test.done(); - }, 100); -}; - -exports['any alias'] = function(test){ - test.equals(async.any, async.some); - test.done(); -}; - -exports['every true'] = function(test){ - async.every([1,2,3], function(x, callback){ - setTimeout(function(){callback(true);}, 0); - }, function(result){ - test.equals(result, true); - test.done(); - }); -}; - -exports['every false'] = function(test){ - async.every([1,2,3], function(x, callback){ - setTimeout(function(){callback(x % 2);}, 0); - }, function(result){ - test.equals(result, false); - test.done(); - }); -}; - -exports['every early return'] = function(test){ - var call_order = []; - async.every([1,2,3], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(x === 1); - }, x*25); - }, function(result){ - call_order.push('callback'); - }); - setTimeout(function(){ - test.same(call_order, [1,2,'callback',3]); - test.done(); - }, 100); -}; - -exports['all alias'] = function(test){ - test.equals(async.all, async.every); - test.done(); -}; - -exports['detect'] = function(test){ - var call_order = []; - async.detect([3,2,1], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(x == 2); - }, x*25); - }, function(result){ - call_order.push('callback'); - test.equals(result, 2); - }); - setTimeout(function(){ - test.same(call_order, [1,2,'callback',3]); - test.done(); - }, 100); -}; - -exports['detectSeries'] = function(test){ - var call_order = []; - async.detectSeries([3,2,1], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(x == 2); - }, x*25); - }, function(result){ - call_order.push('callback'); - test.equals(result, 2); - }); - setTimeout(function(){ - test.same(call_order, [3,2,'callback']); - test.done(); - }, 200); -}; - -exports['sortBy'] = function(test){ - async.sortBy([{a:1},{a:15},{a:6}], function(x, callback){ - setTimeout(function(){callback(null, x.a);}, 0); - }, function(err, result){ - test.same(result, [{a:1},{a:6},{a:15}]); - test.done(); - }); -}; - -exports['apply'] = function(test){ - test.expect(6); - var fn = function(){ - test.same(Array.prototype.slice.call(arguments), [1,2,3,4]) - }; - async.apply(fn, 1, 2, 3, 4)(); - async.apply(fn, 1, 2, 3)(4); - async.apply(fn, 1, 2)(3, 4); - async.apply(fn, 1)(2, 3, 4); - async.apply(fn)(1, 2, 3, 4); - test.equals( - async.apply(function(name){return 'hello ' + name}, 'world')(), - 'hello world' - ); - test.done(); -}; - - -// generates tests for console functions such as async.log -var console_fn_tests = function(name){ - - if (typeof console !== 'undefined') { - exports[name] = function(test){ - test.expect(5); - var fn = function(arg1, callback){ - test.equals(arg1, 'one'); - setTimeout(function(){callback(null, 'test');}, 0); - }; - var fn_err = function(arg1, callback){ - test.equals(arg1, 'one'); - setTimeout(function(){callback('error');}, 0); - }; - var _console_fn = console[name]; - var _error = console.error; - console[name] = function(val){ - test.equals(val, 'test'); - test.equals(arguments.length, 1); - console.error = function(val){ - test.equals(val, 'error'); - console[name] = _console_fn; - console.error = _error; - test.done(); - }; - async[name](fn_err, 'one'); - }; - async[name](fn, 'one'); - }; - - exports[name + ' with multiple result params'] = function(test){ - var fn = function(callback){callback(null,'one','two','three');}; - var _console_fn = console[name]; - var called_with = []; - console[name] = function(x){ - called_with.push(x); - }; - async[name](fn); - test.same(called_with, ['one','two','three']); - console[name] = _console_fn; - test.done(); - }; - } - - // browser-only test - exports[name + ' without console.' + name] = function(test){ - if (typeof window !== 'undefined') { - var _console = window.console; - window.console = undefined; - var fn = function(callback){callback(null, 'val');}; - var fn_err = function(callback){callback('error');}; - async[name](fn); - async[name](fn_err); - window.console = _console; - } - test.done(); - }; - -}; - -console_fn_tests('log'); -console_fn_tests('dir'); -/*console_fn_tests('info'); -console_fn_tests('warn'); -console_fn_tests('error');*/ - -exports['nextTick'] = function(test){ - var call_order = []; - async.nextTick(function(){call_order.push('two');}); - call_order.push('one'); - setTimeout(function(){ - test.same(call_order, ['one','two']); - test.done(); - }, 50); -}; - -exports['nextTick in the browser'] = function(test){ - if (typeof process !== 'undefined') { - // skip this test in node - return test.done(); - } - test.expect(1); - - var call_order = []; - async.nextTick(function(){call_order.push('two');}); - - call_order.push('one'); - setTimeout(function(){ - if (typeof process !== 'undefined') { - process.nextTick = _nextTick; - } - test.same(call_order, ['one','two']); - }, 50); - setTimeout(test.done, 100); -}; - -exports['noConflict - node only'] = function(test){ - if (typeof process !== 'undefined') { - // node only test - test.expect(3); - var fs = require('fs'); - var filename = __dirname + '/../lib/async.js'; - fs.readFile(filename, function(err, content){ - if(err) return test.done(); - var Script = process.binding('evals').Script; - - var s = new Script(content, filename); - var s2 = new Script( - content + 'this.async2 = this.async.noConflict();', - filename - ); - - var sandbox1 = {async: 'oldvalue'}; - s.runInNewContext(sandbox1); - test.ok(sandbox1.async); - - var sandbox2 = {async: 'oldvalue'}; - s2.runInNewContext(sandbox2); - test.equals(sandbox2.async, 'oldvalue'); - test.ok(sandbox2.async2); - - test.done(); - }); - } - else test.done(); -}; - -exports['concat'] = function(test){ - var call_order = []; - var iterator = function (x, cb) { - setTimeout(function(){ - call_order.push(x); - var r = []; - while (x > 0) { - r.push(x); - x--; - } - cb(null, r); - }, x*25); - }; - async.concat([1,3,2], iterator, function(err, results){ - test.same(results, [1,2,1,3,2,1]); - test.same(call_order, [1,2,3]); - test.ok(!err); - test.done(); - }); -}; - -exports['concat error'] = function(test){ - var iterator = function (x, cb) { - cb(new Error('test error')); - }; - async.concat([1,2,3], iterator, function(err, results){ - test.ok(err); - test.done(); - }); -}; - -exports['concatSeries'] = function(test){ - var call_order = []; - var iterator = function (x, cb) { - setTimeout(function(){ - call_order.push(x); - var r = []; - while (x > 0) { - r.push(x); - x--; - } - cb(null, r); - }, x*25); - }; - async.concatSeries([1,3,2], iterator, function(err, results){ - test.same(results, [1,3,2,1,2,1]); - test.same(call_order, [1,3,2]); - test.ok(!err); - test.done(); - }); -}; - -exports['until'] = function (test) { - var call_order = []; - - var count = 0; - async.until( - function () { - call_order.push(['test', count]); - return (count == 5); - }, - function (cb) { - call_order.push(['iterator', count]); - count++; - cb(); - }, - function (err) { - test.same(call_order, [ - ['test', 0], - ['iterator', 0], ['test', 1], - ['iterator', 1], ['test', 2], - ['iterator', 2], ['test', 3], - ['iterator', 3], ['test', 4], - ['iterator', 4], ['test', 5], - ]); - test.equals(count, 5); - test.done(); - } - ); -}; - -exports['whilst'] = function (test) { - var call_order = []; - - var count = 0; - async.whilst( - function () { - call_order.push(['test', count]); - return (count < 5); - }, - function (cb) { - call_order.push(['iterator', count]); - count++; - cb(); - }, - function (err) { - test.same(call_order, [ - ['test', 0], - ['iterator', 0], ['test', 1], - ['iterator', 1], ['test', 2], - ['iterator', 2], ['test', 3], - ['iterator', 3], ['test', 4], - ['iterator', 4], ['test', 5], - ]); - test.equals(count, 5); - test.done(); - } - ); -}; - -exports['queue'] = function (test) { - var call_order = [], - delays = [40,20,60,20]; - - // worker1: --1-4 - // worker2: -2---3 - // order of completion: 2,1,4,3 - - var q = async.queue(function (task, callback) { - setTimeout(function () { - call_order.push('process ' + task); - callback('error', 'arg'); - }, delays.splice(0,1)[0]); - }, 2); - - q.push(1, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 1); - call_order.push('callback ' + 1); - }); - q.push(2, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 2); - call_order.push('callback ' + 2); - }); - q.push(3, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 0); - call_order.push('callback ' + 3); - }); - q.push(4, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 0); - call_order.push('callback ' + 4); - }); - test.equal(q.length(), 4); - test.equal(q.concurrency, 2); - - setTimeout(function () { - test.same(call_order, [ - 'process 2', 'callback 2', - 'process 1', 'callback 1', - 'process 4', 'callback 4', - 'process 3', 'callback 3' - ]); - test.equal(q.concurrency, 2); - test.equal(q.length(), 0); - test.done(); - }, 200); -}; - -exports['queue changing concurrency'] = function (test) { - var call_order = [], - delays = [40,20,60,20]; - - // worker1: --1-2---3-4 - // order of completion: 1,2,3,4 - - var q = async.queue(function (task, callback) { - setTimeout(function () { - call_order.push('process ' + task); - callback('error', 'arg'); - }, delays.splice(0,1)[0]); - }, 2); - - q.push(1, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 3); - call_order.push('callback ' + 1); - }); - q.push(2, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 2); - call_order.push('callback ' + 2); - }); - q.push(3, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 1); - call_order.push('callback ' + 3); - }); - q.push(4, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 0); - call_order.push('callback ' + 4); - }); - test.equal(q.length(), 4); - test.equal(q.concurrency, 2); - q.concurrency = 1; - - setTimeout(function () { - test.same(call_order, [ - 'process 1', 'callback 1', - 'process 2', 'callback 2', - 'process 3', 'callback 3', - 'process 4', 'callback 4' - ]); - test.equal(q.concurrency, 1); - test.equal(q.length(), 0); - test.done(); - }, 250); -}; - -exports['queue push without callback'] = function (test) { - var call_order = [], - delays = [40,20,60,20]; - - // worker1: --1-4 - // worker2: -2---3 - // order of completion: 2,1,4,3 - - var q = async.queue(function (task, callback) { - setTimeout(function () { - call_order.push('process ' + task); - callback('error', 'arg'); - }, delays.splice(0,1)[0]); - }, 2); - - q.push(1); - q.push(2); - q.push(3); - q.push(4); - - setTimeout(function () { - test.same(call_order, [ - 'process 2', - 'process 1', - 'process 4', - 'process 3' - ]); - test.done(); - }, 200); -}; - -exports['memoize'] = function (test) { - test.expect(4); - var call_order = []; - - var fn = function (arg1, arg2, callback) { - call_order.push(['fn', arg1, arg2]); - callback(null, arg1 + arg2); - }; - - var fn2 = async.memoize(fn); - fn2(1, 2, function (err, result) { - test.equal(result, 3); - }); - fn2(1, 2, function (err, result) { - test.equal(result, 3); - }); - fn2(2, 2, function (err, result) { - test.equal(result, 4); - }); - - test.same(call_order, [['fn',1,2], ['fn',2,2]]); - test.done(); -}; - -exports['memoize error'] = function (test) { - test.expect(1); - var testerr = new Error('test'); - var fn = function (arg1, arg2, callback) { - callback(testerr, arg1 + arg2); - }; - async.memoize(fn)(1, 2, function (err, result) { - test.equal(err, testerr); - }); - test.done(); -}; - -exports['memoize custom hash function'] = function (test) { - test.expect(2); - var testerr = new Error('test'); - - var fn = function (arg1, arg2, callback) { - callback(testerr, arg1 + arg2); - }; - var fn2 = async.memoize(fn, function () { - return 'custom hash'; - }); - fn2(1, 2, function (err, result) { - test.equal(result, 3); - }); - fn2(2, 2, function (err, result) { - test.equal(result, 3); - }); - test.done(); -}; - -// Issue 10 on github: https://github.com/caolan/async/issues#issue/10 -exports['falsy return values in series'] = function (test) { - function taskFalse(callback) { - async.nextTick(function() { - callback(null, false); - }); - }; - function taskUndefined(callback) { - async.nextTick(function() { - callback(null, undefined); - }); - }; - function taskEmpty(callback) { - async.nextTick(function() { - callback(null); - }); - }; - function taskNull(callback) { - async.nextTick(function() { - callback(null, null); - }); - }; - async.series( - [taskFalse, taskUndefined, taskEmpty, taskNull], - function(err, results) { - test.same(results, [false, undefined, undefined, null]); - test.strictEqual(results[0], false); - test.strictEqual(results[1], undefined); - test.strictEqual(results[2], undefined); - test.strictEqual(results[3], null); - test.done(); - } - ); -}; - -// Issue 10 on github: https://github.com/caolan/async/issues#issue/10 -exports['falsy return values in parallel'] = function (test) { - function taskFalse(callback) { - async.nextTick(function() { - callback(null, false); - }); - }; - function taskUndefined(callback) { - async.nextTick(function() { - callback(null, undefined); - }); - }; - function taskEmpty(callback) { - async.nextTick(function() { - callback(null); - }); - }; - function taskNull(callback) { - async.nextTick(function() { - callback(null, null); - }); - }; - async.parallel( - [taskFalse, taskUndefined, taskEmpty, taskNull], - function(err, results) { - test.same(results, [false, undefined, undefined, null]); - test.strictEqual(results[0], false); - test.strictEqual(results[1], undefined); - test.strictEqual(results[2], undefined); - test.strictEqual(results[3], null); - test.done(); - } - ); -}; - -exports['queue events'] = function(test) { - var calls = []; - var q = async.queue(function(task, cb) { - // nop - calls.push('process ' + task); - cb(); - }, 3); - - q.saturated = function() { - test.ok(q.length() == 3, 'queue should be saturated now'); - calls.push('saturated'); - }; - q.empty = function() { - test.ok(q.length() == 0, 'queue should be empty now'); - calls.push('empty'); - }; - q.drain = function() { - test.ok( - q.length() == 0 && q.running() == 0, - 'queue should be empty now and no more workers should be running' - ); - calls.push('drain'); - test.same(calls, [ - 'saturated', - 'process foo', - 'foo cb', - 'process bar', - 'bar cb', - 'process zoo', - 'zoo cb', - 'process poo', - 'poo cb', - 'empty', - 'process moo', - 'moo cb', - 'drain', - ]); - test.done(); - }; - q.push('foo', function () {calls.push('foo cb');}); - q.push('bar', function () {calls.push('bar cb');}); - q.push('zoo', function () {calls.push('zoo cb');}); - q.push('poo', function () {calls.push('poo cb');}); - q.push('moo', function () {calls.push('moo cb');}); -}; diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/test/test.html b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/test/test.html deleted file mode 100644 index 2450e2d..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/async/test/test.html +++ /dev/null @@ -1,24 +0,0 @@ - - - Async.js Test Suite - - - - - - - - -

        Async.js Test Suite

        - - - diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/.npmignore b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/.npmignore deleted file mode 100644 index aba34f0..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -*.un~ -/node_modules -/test/tmp diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/License b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/License deleted file mode 100644 index 4804b7a..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/License +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011 Debuggable Limited - -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/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/Makefile b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/Makefile deleted file mode 100644 index b4ff85a..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -SHELL := /bin/bash - -test: - @./test/run.js - -.PHONY: test - diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md deleted file mode 100644 index 1a9999e..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md +++ /dev/null @@ -1,132 +0,0 @@ -# combined-stream - -A stream that emits multiple other streams one after another. - -## Installation - -``` bash -npm install combined-stream -``` - -## Usage - -Here is a simple example that shows how you can use combined-stream to combine -two files into one: - -``` javascript -var CombinedStream = require('combined-stream'); -var fs = require('fs'); - -var combinedStream = CombinedStream.create(); -combinedStream.append(fs.createReadStream('file1.txt')); -combinedStream.append(fs.createReadStream('file2.txt')); - -combinedStream.pipe(fs.createWriteStream('combined.txt')); -``` - -While the example above works great, it will pause all source streams until -they are needed. If you don't want that to happen, you can set `pauseStreams` -to `false`: - -``` javascript -var CombinedStream = require('combined-stream'); -var fs = require('fs'); - -var combinedStream = CombinedStream.create({pauseStreams: false}); -combinedStream.append(fs.createReadStream('file1.txt')); -combinedStream.append(fs.createReadStream('file2.txt')); - -combinedStream.pipe(fs.createWriteStream('combined.txt')); -``` - -However, what if you don't have all the source streams yet, or you don't want -to allocate the resources (file descriptors, memory, etc.) for them right away? -Well, in that case you can simply provide a callback that supplies the stream -by calling a `next()` function: - -``` javascript -var CombinedStream = require('combined-stream'); -var fs = require('fs'); - -var combinedStream = CombinedStream.create(); -combinedStream.append(function(next) { - next(fs.createReadStream('file1.txt')); -}); -combinedStream.append(function(next) { - next(fs.createReadStream('file2.txt')); -}); - -combinedStream.pipe(fs.createWriteStream('combined.txt')); -``` - -## API - -### CombinedStream.create([options]) - -Returns a new combined stream object. Available options are: - -* `maxDataSize` -* `pauseStreams` - -The effect of those options is described below. - -### combinedStream.pauseStreams = true - -Whether to apply back pressure to the underlaying streams. If set to `false`, -the underlaying streams will never be paused. If set to `true`, the -underlaying streams will be paused right after being appended, as well as when -`delayedStream.pipe()` wants to throttle. - -### combinedStream.maxDataSize = 2 * 1024 * 1024 - -The maximum amount of bytes (or characters) to buffer for all source streams. -If this value is exceeded, `combinedStream` emits an `'error'` event. - -### combinedStream.dataSize = 0 - -The amount of bytes (or characters) currently buffered by `combinedStream`. - -### combinedStream.append(stream) - -Appends the given `stream` to the combinedStream object. If `pauseStreams` is -set to `true, this stream will also be paused right away. - -`streams` can also be a function that takes one parameter called `next`. `next` -is a function that must be invoked in order to provide the `next` stream, see -example above. - -Regardless of how the `stream` is appended, combined-stream always attaches an -`'error'` listener to it, so you don't have to do that manually. - -Special case: `stream` can also be a String or Buffer. - -### combinedStream.write(data) - -You should not call this, `combinedStream` takes care of piping the appended -streams into itself for you. - -### combinedStream.resume() - -Causes `combinedStream` to start drain the streams it manages. The function is -idempotent, and also emits a `'resume'` event each time which usually goes to -the stream that is currently being drained. - -### combinedStream.pause(); - -If `combinedStream.pauseStreams` is set to `false`, this does nothing. -Otherwise a `'pause'` event is emitted, this goes to the stream that is -currently being drained, so you can use it to apply back pressure. - -### combinedStream.end(); - -Sets `combinedStream.writable` to false, emits an `'end'` event, and removes -all streams from the queue. - -### combinedStream.destroy(); - -Same as `combinedStream.end()`, except it emits a `'close'` event instead of -`'end'`. - -## License - -combined-stream is licensed under the MIT license. diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js deleted file mode 100644 index 03754e6..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js +++ /dev/null @@ -1,183 +0,0 @@ -var util = require('util'); -var Stream = require('stream').Stream; -var DelayedStream = require('delayed-stream'); - -module.exports = CombinedStream; -function CombinedStream() { - this.writable = false; - this.readable = true; - this.dataSize = 0; - this.maxDataSize = 2 * 1024 * 1024; - this.pauseStreams = true; - - this._released = false; - this._streams = []; - this._currentStream = null; -} -util.inherits(CombinedStream, Stream); - -CombinedStream.create = function(options) { - var combinedStream = new this(); - - options = options || {}; - for (var option in options) { - combinedStream[option] = options[option]; - } - - return combinedStream; -}; - -CombinedStream.isStreamLike = function(stream) { - return (typeof stream !== 'function') - && (typeof stream !== 'string') - && (!Buffer.isBuffer(stream)); -}; - -CombinedStream.prototype.append = function(stream) { - var isStreamLike = CombinedStream.isStreamLike(stream); - - if (isStreamLike) { - if (!(stream instanceof DelayedStream)) { - stream.on('data', this._checkDataSize.bind(this)); - - stream = DelayedStream.create(stream, { - maxDataSize: Infinity, - pauseStream: this.pauseStreams, - }); - } - - this._handleErrors(stream); - - if (this.pauseStreams) { - stream.pause(); - } - } - - this._streams.push(stream); - return this; -}; - -CombinedStream.prototype.pipe = function(dest, options) { - Stream.prototype.pipe.call(this, dest, options); - this.resume(); -}; - -CombinedStream.prototype._getNext = function() { - this._currentStream = null; - var stream = this._streams.shift(); - - - if (!stream) { - this.end(); - return; - } - - if (typeof stream !== 'function') { - this._pipeNext(stream); - return; - } - - var getStream = stream; - getStream(function(stream) { - var isStreamLike = CombinedStream.isStreamLike(stream); - if (isStreamLike) { - stream.on('data', this._checkDataSize.bind(this)); - this._handleErrors(stream); - } - - this._pipeNext(stream); - }.bind(this)); -}; - -CombinedStream.prototype._pipeNext = function(stream) { - this._currentStream = stream; - - var isStreamLike = CombinedStream.isStreamLike(stream); - if (isStreamLike) { - stream.on('end', this._getNext.bind(this)) - stream.pipe(this, {end: false}); - return; - } - - var value = stream; - this.write(value); - this._getNext(); -}; - -CombinedStream.prototype._handleErrors = function(stream) { - var self = this; - stream.on('error', function(err) { - self._emitError(err); - }); -}; - -CombinedStream.prototype.write = function(data) { - this.emit('data', data); -}; - -CombinedStream.prototype.pause = function() { - if (!this.pauseStreams) { - return; - } - - this.emit('pause'); -}; - -CombinedStream.prototype.resume = function() { - if (!this._released) { - this._released = true; - this.writable = true; - this._getNext(); - } - - this.emit('resume'); -}; - -CombinedStream.prototype.end = function() { - this._reset(); - this.emit('end'); -}; - -CombinedStream.prototype.destroy = function() { - this._reset(); - this.emit('close'); -}; - -CombinedStream.prototype._reset = function() { - this.writable = false; - this._streams = []; - this._currentStream = null; -}; - -CombinedStream.prototype._checkDataSize = function() { - this._updateDataSize(); - if (this.dataSize <= this.maxDataSize) { - return; - } - - var message = - 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.' - this._emitError(new Error(message)); -}; - -CombinedStream.prototype._updateDataSize = function() { - this.dataSize = 0; - - var self = this; - this._streams.forEach(function(stream) { - if (!stream.dataSize) { - return; - } - - self.dataSize += stream.dataSize; - }); - - if (this._currentStream && this._currentStream.dataSize) { - this.dataSize += this._currentStream.dataSize; - } -}; - -CombinedStream.prototype._emitError = function(err) { - this._reset(); - this.emit('error', err); -}; diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore deleted file mode 100644 index 2fedb26..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -*.un~ -/node_modules/* diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License deleted file mode 100644 index 4804b7a..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011 Debuggable Limited - -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/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile deleted file mode 100644 index b4ff85a..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -SHELL := /bin/bash - -test: - @./test/run.js - -.PHONY: test - diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md deleted file mode 100644 index 5cb5b35..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md +++ /dev/null @@ -1,154 +0,0 @@ -# delayed-stream - -Buffers events from a stream until you are ready to handle them. - -## Installation - -``` bash -npm install delayed-stream -``` - -## Usage - -The following example shows how to write a http echo server that delays its -response by 1000 ms. - -``` javascript -var DelayedStream = require('delayed-stream'); -var http = require('http'); - -http.createServer(function(req, res) { - var delayed = DelayedStream.create(req); - - setTimeout(function() { - res.writeHead(200); - delayed.pipe(res); - }, 1000); -}); -``` - -If you are not using `Stream#pipe`, you can also manually release the buffered -events by calling `delayedStream.resume()`: - -``` javascript -var delayed = DelayedStream.create(req); - -setTimeout(function() { - // Emit all buffered events and resume underlaying source - delayed.resume(); -}, 1000); -``` - -## Implementation - -In order to use this meta stream properly, here are a few things you should -know about the implementation. - -### Event Buffering / Proxying - -All events of the `source` stream are hijacked by overwriting the `source.emit` -method. Until node implements a catch-all event listener, this is the only way. - -However, delayed-stream still continues to emit all events it captures on the -`source`, regardless of whether you have released the delayed stream yet or -not. - -Upon creation, delayed-stream captures all `source` events and stores them in -an internal event buffer. Once `delayedStream.release()` is called, all -buffered events are emitted on the `delayedStream`, and the event buffer is -cleared. After that, delayed-stream merely acts as a proxy for the underlaying -source. - -### Error handling - -Error events on `source` are buffered / proxied just like any other events. -However, `delayedStream.create` attaches a no-op `'error'` listener to the -`source`. This way you only have to handle errors on the `delayedStream` -object, rather than in two places. - -### Buffer limits - -delayed-stream provides a `maxDataSize` property that can be used to limit -the amount of data being buffered. In order to protect you from bad `source` -streams that don't react to `source.pause()`, this feature is enabled by -default. - -## API - -### DelayedStream.create(source, [options]) - -Returns a new `delayedStream`. Available options are: - -* `pauseStream` -* `maxDataSize` - -The description for those properties can be found below. - -### delayedStream.source - -The `source` stream managed by this object. This is useful if you are -passing your `delayedStream` around, and you still want to access properties -on the `source` object. - -### delayedStream.pauseStream = true - -Whether to pause the underlaying `source` when calling -`DelayedStream.create()`. Modifying this property afterwards has no effect. - -### delayedStream.maxDataSize = 1024 * 1024 - -The amount of data to buffer before emitting an `error`. - -If the underlaying source is emitting `Buffer` objects, the `maxDataSize` -refers to bytes. - -If the underlaying source is emitting JavaScript strings, the size refers to -characters. - -If you know what you are doing, you can set this property to `Infinity` to -disable this feature. You can also modify this property during runtime. - -### delayedStream.maxDataSize = 1024 * 1024 - -The amount of data to buffer before emitting an `error`. - -If the underlaying source is emitting `Buffer` objects, the `maxDataSize` -refers to bytes. - -If the underlaying source is emitting JavaScript strings, the size refers to -characters. - -If you know what you are doing, you can set this property to `Infinity` to -disable this feature. - -### delayedStream.dataSize = 0 - -The amount of data buffered so far. - -### delayedStream.readable - -An ECMA5 getter that returns the value of `source.readable`. - -### delayedStream.resume() - -If the `delayedStream` has not been released so far, `delayedStream.release()` -is called. - -In either case, `source.resume()` is called. - -### delayedStream.pause() - -Calls `source.pause()`. - -### delayedStream.pipe(dest) - -Calls `delayedStream.resume()` and then proxies the arguments to `source.pipe`. - -### delayedStream.release() - -Emits and clears all events that have been buffered up so far. This does not -resume the underlaying source, use `delayedStream.resume()` instead. - -## License - -delayed-stream is licensed under the MIT license. diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js deleted file mode 100644 index 7c10d48..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js +++ /dev/null @@ -1,99 +0,0 @@ -var Stream = require('stream').Stream; -var util = require('util'); - -module.exports = DelayedStream; -function DelayedStream() { - this.source = null; - this.dataSize = 0; - this.maxDataSize = 1024 * 1024; - this.pauseStream = true; - - this._maxDataSizeExceeded = false; - this._released = false; - this._bufferedEvents = []; -} -util.inherits(DelayedStream, Stream); - -DelayedStream.create = function(source, options) { - var delayedStream = new this(); - - options = options || {}; - for (var option in options) { - delayedStream[option] = options[option]; - } - - delayedStream.source = source; - - var realEmit = source.emit; - source.emit = function() { - delayedStream._handleEmit(arguments); - return realEmit.apply(source, arguments); - }; - - source.on('error', function() {}); - if (delayedStream.pauseStream) { - source.pause(); - } - - return delayedStream; -}; - -DelayedStream.prototype.__defineGetter__('readable', function() { - return this.source.readable; -}); - -DelayedStream.prototype.resume = function() { - if (!this._released) { - this.release(); - } - - this.source.resume(); -}; - -DelayedStream.prototype.pause = function() { - this.source.pause(); -}; - -DelayedStream.prototype.release = function() { - this._released = true; - - this._bufferedEvents.forEach(function(args) { - this.emit.apply(this, args); - }.bind(this)); - this._bufferedEvents = []; -}; - -DelayedStream.prototype.pipe = function() { - var r = Stream.prototype.pipe.apply(this, arguments); - this.resume(); - return r; -}; - -DelayedStream.prototype._handleEmit = function(args) { - if (this._released) { - this.emit.apply(this, args); - return; - } - - if (args[0] === 'data') { - this.dataSize += args[1].length; - this._checkIfMaxDataSizeExceeded(); - } - - this._bufferedEvents.push(args); -}; - -DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() { - if (this._maxDataSizeExceeded) { - return; - } - - if (this.dataSize <= this.maxDataSize) { - return; - } - - this._maxDataSizeExceeded = true; - var message = - 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.' - this.emit('error', new Error(message)); -}; diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json deleted file mode 100644 index d394b92..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "author": { - "name": "Felix Geisendörfer", - "email": "felix@debuggable.com", - "url": "http://debuggable.com/" - }, - "name": "delayed-stream", - "description": "Buffers events from a stream until you are ready to handle them.", - "version": "0.0.5", - "homepage": "https://github.com/felixge/node-delayed-stream", - "repository": { - "type": "git", - "url": "git://github.com/felixge/node-delayed-stream.git" - }, - "main": "./lib/delayed_stream", - "engines": { - "node": ">=0.4.0" - }, - "dependencies": {}, - "devDependencies": { - "fake": "0.2.0", - "far": "0.0.1" - }, - "_npmUser": { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - "_id": "delayed-stream@0.0.5", - "optionalDependencies": {}, - "_engineSupported": true, - "_npmVersion": "1.1.24", - "_nodeVersion": "v0.8.1", - "_defaultsLoaded": true, - "dist": { - "shasum": "56f46a53506f656e1a549c63d8794c6cf8b6e1fc" - }, - "_from": "delayed-stream@0.0.5" -} diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js deleted file mode 100644 index 4d71b8a..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js +++ /dev/null @@ -1,6 +0,0 @@ -var common = module.exports; - -common.DelayedStream = require('..'); -common.assert = require('assert'); -common.fake = require('fake'); -common.PORT = 49252; diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js deleted file mode 100644 index 9ecad5b..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js +++ /dev/null @@ -1,38 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var DelayedStream = common.DelayedStream; -var http = require('http'); - -var UPLOAD = new Buffer(10 * 1024 * 1024); - -var server = http.createServer(function(req, res) { - var delayed = DelayedStream.create(req, {maxDataSize: UPLOAD.length}); - - setTimeout(function() { - res.writeHead(200); - delayed.pipe(res); - }, 10); -}); -server.listen(common.PORT, function() { - var request = http.request({ - method: 'POST', - port: common.PORT, - }); - - request.write(UPLOAD); - request.end(); - - request.on('response', function(res) { - var received = 0; - res - .on('data', function(chunk) { - received += chunk.length; - }) - .on('end', function() { - assert.equal(received, UPLOAD.length); - server.close(); - }); - }); -}); - - diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js deleted file mode 100644 index 6f417f3..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js +++ /dev/null @@ -1,21 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testAutoPause() { - var source = new Stream(); - - fake.expect(source, 'pause', 1); - var delayedStream = DelayedStream.create(source); - fake.verify(); -})(); - -(function testDisableAutoPause() { - var source = new Stream(); - fake.expect(source, 'pause', 0); - - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - fake.verify(); -})(); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js deleted file mode 100644 index b50c397..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js +++ /dev/null @@ -1,14 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testDelayEventsUntilResume() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - - fake.expect(source, 'pause'); - delayedStream.pause(); - fake.verify(); -})(); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js deleted file mode 100644 index fc4047e..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js +++ /dev/null @@ -1,48 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testDelayEventsUntilResume() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - - // delayedStream must not emit until we resume - fake.expect(delayedStream, 'emit', 0); - - // but our original source must emit - var params = []; - source.on('foo', function(param) { - params.push(param); - }); - - source.emit('foo', 1); - source.emit('foo', 2); - - // Make sure delayedStream did not emit, and source did - assert.deepEqual(params, [1, 2]); - fake.verify(); - - // After resume, delayedStream must playback all events - fake - .stub(delayedStream, 'emit') - .times(Infinity) - .withArg(1, 'newListener'); - fake.expect(delayedStream, 'emit', ['foo', 1]); - fake.expect(delayedStream, 'emit', ['foo', 2]); - fake.expect(source, 'resume'); - - delayedStream.resume(); - fake.verify(); - - // Calling resume again will delegate to source - fake.expect(source, 'resume'); - delayedStream.resume(); - fake.verify(); - - // Emitting more events directly leads to them being emitted - fake.expect(delayedStream, 'emit', ['foo', 3]); - source.emit('foo', 3); - fake.verify(); -})(); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js deleted file mode 100644 index a9d35e7..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js +++ /dev/null @@ -1,15 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testHandleSourceErrors() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - - // We deal with this by attaching a no-op listener to 'error' on the source - // when creating a new DelayedStream. This way error events on the source - // won't throw. - source.emit('error', new Error('something went wrong')); -})(); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js deleted file mode 100644 index 7638a2b..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js +++ /dev/null @@ -1,18 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testMaxDataSize() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {maxDataSize: 1024, pauseStream: false}); - - source.emit('data', new Buffer(1024)); - - fake - .expect(delayedStream, 'emit') - .withArg(1, 'error'); - source.emit('data', new Buffer(1)); - fake.verify(); -})(); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js deleted file mode 100644 index 7d312ab..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js +++ /dev/null @@ -1,13 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testPipeReleases() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - - fake.expect(delayedStream, 'resume'); - delayedStream.pipe(new Stream()); -})(); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js deleted file mode 100644 index d436163..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js +++ /dev/null @@ -1,13 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testProxyReadableProperty() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - - source.readable = fake.value('source.readable'); - assert.strictEqual(delayedStream.readable, source.readable); -})(); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js deleted file mode 100755 index 0bb8e82..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node -var far = require('far').create(); - -far.add(__dirname); -far.include(/test-.*\.js$/); - -far.execute(); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json deleted file mode 100644 index 7bb0fcf..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "author": { - "name": "Felix Geisendörfer", - "email": "felix@debuggable.com", - "url": "http://debuggable.com/" - }, - "name": "combined-stream", - "description": "A stream that emits multiple other streams one after another.", - "version": "0.0.3", - "homepage": "https://github.com/felixge/node-combined-stream", - "repository": { - "type": "git", - "url": "git://github.com/felixge/node-combined-stream.git" - }, - "main": "./lib/combined_stream", - "engines": { - "node": "*" - }, - "dependencies": { - "delayed-stream": "0.0.5" - }, - "devDependencies": { - "far": "0.0.1" - }, - "_npmUser": { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - "_id": "combined-stream@0.0.3", - "optionalDependencies": {}, - "_engineSupported": true, - "_npmVersion": "1.1.24", - "_nodeVersion": "v0.8.1", - "_defaultsLoaded": true, - "dist": { - "shasum": "c41c9899277b587901bb6ce4bf458b94693afafa" - }, - "_from": "combined-stream@0.0.3" -} diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/common.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/common.js deleted file mode 100644 index aa9ab3a..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/common.js +++ /dev/null @@ -1,12 +0,0 @@ -var common = module.exports; - -var path = require('path'); -var root = path.join(__dirname, '..'); - -common.dir = { - fixture: root + '/test/fixture', - tmp: root + '/test/tmp', -}; - -common.CombinedStream = require(root); -common.assert = require('assert'); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file1.txt b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file1.txt deleted file mode 100644 index 50e0218..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file1.txt +++ /dev/null @@ -1,256 +0,0 @@ -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file2.txt b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file2.txt deleted file mode 100644 index da1d821..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file2.txt +++ /dev/null @@ -1,256 +0,0 @@ -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-callback-streams.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-callback-streams.js deleted file mode 100644 index 44ecaba..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-callback-streams.js +++ /dev/null @@ -1,27 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; -var fs = require('fs'); - -var FILE1 = common.dir.fixture + '/file1.txt'; -var FILE2 = common.dir.fixture + '/file2.txt'; -var EXPECTED = fs.readFileSync(FILE1) + fs.readFileSync(FILE2); - -(function testDelayedStreams() { - var combinedStream = CombinedStream.create(); - combinedStream.append(function(next) { - next(fs.createReadStream(FILE1)); - }); - combinedStream.append(function(next) { - next(fs.createReadStream(FILE2)); - }); - - var tmpFile = common.dir.tmp + '/combined.txt'; - var dest = fs.createWriteStream(tmpFile); - combinedStream.pipe(dest); - - dest.on('end', function() { - var written = fs.readFileSync(tmpFile, 'utf8'); - assert.strictEqual(written, EXPECTED); - }); -})(); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-data-size.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-data-size.js deleted file mode 100644 index e3fbd18..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-data-size.js +++ /dev/null @@ -1,34 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; - -(function testDataSizeGetter() { - var combinedStream = CombinedStream.create(); - - assert.strictEqual(combinedStream.dataSize, 0); - - // Test one stream - combinedStream._streams.push({dataSize: 10}); - combinedStream._updateDataSize(); - assert.strictEqual(combinedStream.dataSize, 10); - - // Test two streams - combinedStream._streams.push({dataSize: 23}); - combinedStream._updateDataSize(); - assert.strictEqual(combinedStream.dataSize, 33); - - // Test currentStream - combinedStream._currentStream = {dataSize: 20}; - combinedStream._updateDataSize(); - assert.strictEqual(combinedStream.dataSize, 53); - - // Test currentStream without dataSize - combinedStream._currentStream = {}; - combinedStream._updateDataSize(); - assert.strictEqual(combinedStream.dataSize, 33); - - // Test stream function - combinedStream._streams.push(function() {}); - combinedStream._updateDataSize(); - assert.strictEqual(combinedStream.dataSize, 33); -})(); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js deleted file mode 100644 index c678575..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js +++ /dev/null @@ -1,38 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; -var fs = require('fs'); - -var FILE1 = common.dir.fixture + '/file1.txt'; -var BUFFER = new Buffer('Bacon is delicious'); -var FILE2 = common.dir.fixture + '/file2.txt'; -var STRING = 'The € kicks the $\'s ass!'; - -var EXPECTED = - fs.readFileSync(FILE1) - + BUFFER - + fs.readFileSync(FILE2) - + STRING; -var GOT; - -(function testDelayedStreams() { - var combinedStream = CombinedStream.create(); - combinedStream.append(fs.createReadStream(FILE1)); - combinedStream.append(BUFFER); - combinedStream.append(fs.createReadStream(FILE2)); - combinedStream.append(function(next) { - next(STRING); - }); - - var tmpFile = common.dir.tmp + '/combined-file1-buffer-file2-string.txt'; - var dest = fs.createWriteStream(tmpFile); - combinedStream.pipe(dest); - - dest.on('close', function() { - GOT = fs.readFileSync(tmpFile, 'utf8'); - }); -})(); - -process.on('exit', function() { - assert.strictEqual(GOT, EXPECTED); -}); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams.js deleted file mode 100644 index 263cfdf..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams.js +++ /dev/null @@ -1,35 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; -var fs = require('fs'); - -var FILE1 = common.dir.fixture + '/file1.txt'; -var FILE2 = common.dir.fixture + '/file2.txt'; -var EXPECTED = fs.readFileSync(FILE1) + fs.readFileSync(FILE2); -var GOT; - -(function testDelayedStreams() { - var combinedStream = CombinedStream.create(); - combinedStream.append(fs.createReadStream(FILE1)); - combinedStream.append(fs.createReadStream(FILE2)); - - var stream1 = combinedStream._streams[0]; - var stream2 = combinedStream._streams[1]; - - stream1.on('end', function() { - assert.equal(stream2.dataSize, 0); - }); - - var tmpFile = common.dir.tmp + '/combined.txt'; - var dest = fs.createWriteStream(tmpFile); - combinedStream.pipe(dest); - - dest.on('close', function() { - GOT = fs.readFileSync(tmpFile, 'utf8'); - }); -})(); - -process.on('exit', function() { - console.error(GOT.length, EXPECTED.length); - assert.strictEqual(GOT, EXPECTED); -}); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-max-data-size.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-max-data-size.js deleted file mode 100644 index 25f47a4..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-max-data-size.js +++ /dev/null @@ -1,24 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; -var fs = require('fs'); - -var FILE1 = common.dir.fixture + '/file1.txt'; -var FILE2 = common.dir.fixture + '/file2.txt'; -var EXPECTED = fs.readFileSync(FILE1) + fs.readFileSync(FILE2); - -(function testDelayedStreams() { - var combinedStream = CombinedStream.create({pauseStreams: false, maxDataSize: 20736}); - combinedStream.append(fs.createReadStream(FILE1)); - combinedStream.append(fs.createReadStream(FILE2)); - - var gotErr = null; - combinedStream.on('error', function(err) { - gotErr = err; - }); - - process.on('exit', function() { - assert.ok(gotErr); - assert.ok(gotErr.message.match(/bytes/)); - }); -})(); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-unpaused-streams.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-unpaused-streams.js deleted file mode 100644 index 30a3a6f..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-unpaused-streams.js +++ /dev/null @@ -1,30 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; -var fs = require('fs'); - -var FILE1 = common.dir.fixture + '/file1.txt'; -var FILE2 = common.dir.fixture + '/file2.txt'; -var EXPECTED = fs.readFileSync(FILE1) + fs.readFileSync(FILE2); - -(function testDelayedStreams() { - var combinedStream = CombinedStream.create({pauseStreams: false}); - combinedStream.append(fs.createReadStream(FILE1)); - combinedStream.append(fs.createReadStream(FILE2)); - - var stream1 = combinedStream._streams[0]; - var stream2 = combinedStream._streams[1]; - - stream1.on('end', function() { - assert.ok(stream2.dataSize > 0); - }); - - var tmpFile = common.dir.tmp + '/combined.txt'; - var dest = fs.createWriteStream(tmpFile); - combinedStream.pipe(dest); - - dest.on('end', function() { - var written = fs.readFileSync(tmpFile, 'utf8'); - assert.strictEqual(written, EXPECTED); - }); -})(); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/run.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/run.js deleted file mode 100755 index 0bb8e82..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/run.js +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node -var far = require('far').create(); - -far.add(__dirname); -far.include(/test-.*\.js$/); - -far.execute(); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/package.json b/node_modules/jsdom/node_modules/request/node_modules/form-data/package.json deleted file mode 100644 index 1948a5e..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "author": { - "name": "Felix Geisendörfer", - "email": "felix@debuggable.com", - "url": "http://debuggable.com/" - }, - "name": "form-data", - "description": "A module to create readable `\"multipart/form-data\"` streams. Can be used to submit forms and file uploads to other web applications.", - "version": "0.0.3", - "repository": { - "type": "git", - "url": "git://github.com/felixge/node-form-data.git" - }, - "main": "./lib/form_data", - "engines": { - "node": "*" - }, - "dependencies": { - "combined-stream": "0.0.3", - "mime": "~1.2.2", - "async": "~0.1.9" - }, - "devDependencies": { - "fake": "0.2.1", - "far": "0.0.1", - "formidable": "1.0.2", - "request": "~2.9.203" - }, - "_npmUser": { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - "_id": "form-data@0.0.3", - "optionalDependencies": {}, - "_engineSupported": true, - "_npmVersion": "1.1.24", - "_nodeVersion": "v0.8.1", - "_defaultsLoaded": true, - "dist": { - "shasum": "6eea17b45790b42d779a1d581d1b3600fe0c7c0d" - }, - "_from": "form-data" -} diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/test/common.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/test/common.js deleted file mode 100644 index 8a26482..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/test/common.js +++ /dev/null @@ -1,14 +0,0 @@ -var common = module.exports; -var path = require('path'); - -var rootDir = path.join(__dirname, '..'); -common.dir = { - lib: rootDir + '/lib', - fixture: rootDir + '/test/fixture', - tmp: rootDir + '/test/tmp', -}; - -common.assert = require('assert'); -common.fake = require('fake'); - -common.port = 8432; diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/test/fixture/bacon.txt b/node_modules/jsdom/node_modules/request/node_modules/form-data/test/fixture/bacon.txt deleted file mode 100644 index 9804bbd..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/test/fixture/bacon.txt +++ /dev/null @@ -1 +0,0 @@ -Bacon is delicious. diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/test/fixture/unicycle.jpg b/node_modules/jsdom/node_modules/request/node_modules/form-data/test/fixture/unicycle.jpg deleted file mode 100644 index 7cea4dd71dc41cd51c84bfcec6b3e65c15a58507..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19806 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 diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/test/integration/test-form-get-length.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/test/integration/test-form-get-length.js deleted file mode 100644 index 44d3b4d..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/test/integration/test-form-get-length.js +++ /dev/null @@ -1,93 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var FormData = require(common.dir.lib + '/form_data'); -var fake = require('fake').create(); -var fs = require('fs'); - -(function testEmptyForm() { - var form = new FormData(); - var callback = fake.callback(arguments.callee.name + '-getLength'); - var calls = fake.expectAnytime(callback, [null, 0]).calls; - - form.getLength(callback); - - // Make sure our response is async - assert.strictEqual(calls.length, 0); -})(); - -(function testUtf8String() { - var FIELD = 'my_field'; - var VALUE = 'May the € be with you'; - - var form = new FormData(); - form.append(FIELD, VALUE); - var callback = fake.callback(arguments.callee.name + '-getLength'); - - var expectedLength = - form._overheadLength + - Buffer.byteLength(VALUE) + - form._lastBoundary().length; - - fake.expectAnytime(callback, [null, expectedLength]); - form.getLength(callback); -})(); - -(function testBuffer() { - var FIELD = 'my_field'; - var VALUE = new Buffer(23); - - var form = new FormData(); - form.append(FIELD, VALUE); - var callback = fake.callback(arguments.callee.name + '-getLength'); - - var expectedLength = - form._overheadLength + - VALUE.length + - form._lastBoundary().length; - - fake.expectAnytime(callback, [null, expectedLength]); - form.getLength(callback); -})(); - - -(function testStringFileBufferFile() { - var fields = [ - { - name: 'my_field', - value: 'Test 123', - }, - { - name: 'my_image', - value: fs.createReadStream(common.dir.fixture + '/unicycle.jpg'), - }, - { - name: 'my_buffer', - value: new Buffer('123'), - }, - { - name: 'my_txt', - value: fs.createReadStream(common.dir.fixture + '/bacon.txt'), - }, - ]; - - var form = new FormData(); - var expectedLength = 0; - - fields.forEach(function(field) { - form.append(field.name, field.value); - if (field.value.path) { - var stat = fs.statSync(field.value.path); - expectedLength += stat.size; - } else { - expectedLength += field.value.length; - } - }); - - expectedLength += form._overheadLength + form._lastBoundary().length; - - var callback = fake.callback(arguments.callee.name + '-getLength'); - fake.expectAnytime(callback, [null, expectedLength]); - form.getLength(callback); -})(); - - diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/test/integration/test-get-boundary.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/test/integration/test-get-boundary.js deleted file mode 100644 index 6dc2fb2..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/test/integration/test-get-boundary.js +++ /dev/null @@ -1,18 +0,0 @@ -var common = require('../common'); -var assert = common.assert; - -var FormData = require(common.dir.lib + '/form_data'); - -(function testOneBoundaryPerForm() { - var form = new FormData(); - var boundary = form.getBoundary(); - - assert.equal(boundary, form.getBoundary()); - assert.equal(boundary.length, 50); -})(); - -(function testUniqueBoundaryPerForm() { - var formA = new FormData(); - var formB = new FormData(); - assert.notEqual(formA.getBoundary(), formB.getBoundary()); -})(); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/test/integration/test-http-response.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/test/integration/test-http-response.js deleted file mode 100644 index 8e183fe..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/test/integration/test-http-response.js +++ /dev/null @@ -1,121 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var http = require('http'); -var path = require('path'); -var mime = require('mime'); -var request = require('request'); -var parseUrl = require('url').parse; -var fs = require('fs'); -var FormData = require(common.dir.lib + '/form_data'); -var IncomingForm = require('formidable').IncomingForm; - -var remoteFile = 'http://nodejs.org/images/logo.png'; - -var FIELDS; -var server; - -var parsedUrl = parseUrl(remoteFile) - , options = { - method: 'get', - port: parsedUrl.port || 80, - path: parsedUrl.pathname, - host: parsedUrl.hostname - } - ; - -http.request(options, function(res) { - - FIELDS = [ - {name: 'my_field', value: 'my_value'}, - {name: 'my_buffer', value: new Buffer([1, 2, 3])}, - {name: 'remote_file', value: res } - ]; - - var form = new FormData(); - FIELDS.forEach(function(field) { - form.append(field.name, field.value); - }); - - server.listen(common.port, function() { - - form.submit('http://localhost:' + common.port + '/', function(err, res) { - - if (err) { - throw err; - } - - assert.strictEqual(res.statusCode, 200); - server.close(); - }); - - }); - - -}).end(); - -server = http.createServer(function(req, res) { - - // formidable is broken so let's do it manual way - // - // var form = new IncomingForm(); - // form.uploadDir = common.dir.tmp; - // form.parse(req); - // form - // .on('field', function(name, value) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(value, field.value+''); - // }) - // .on('file', function(name, file) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(file.name, path.basename(field.value.path)); - // // mime.lookup file.NAME == 'my_file' ? - // assert.strictEqual(file.type, mime.lookup(file.name)); - // }) - // .on('end', function() { - // res.writeHead(200); - // res.end('done'); - // }); - - // temp workaround - var data = ''; - req.setEncoding('utf8'); - - req.on('data', function(d) { - data += d; - }); - - req.on('end', function() { - - // check for the fields' traces - - // 1st field : my_field - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 2nd field : my_buffer - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 3rd field : remote_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(remoteFile)+'"') != -1 ); - // check for http://nodejs.org/images/logo.png traces - assert.ok( data.indexOf('ImageReady') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 ); - - res.writeHead(200); - res.end('done'); - - }); - -}); - - -process.on('exit', function() { - assert.strictEqual(FIELDS.length, 0); -}); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/test/integration/test-pipe.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/test/integration/test-pipe.js deleted file mode 100644 index acc39df..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/test/integration/test-pipe.js +++ /dev/null @@ -1,111 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var http = require('http'); -var path = require('path'); -var mime = require('mime'); -var request = require('request'); -var fs = require('fs'); -var FormData = require(common.dir.lib + '/form_data'); -var IncomingForm = require('formidable').IncomingForm; - -var remoteFile = 'http://nodejs.org/images/logo.png'; - -var FIELDS = [ - {name: 'my_field', value: 'my_value'}, - {name: 'my_buffer', value: new Buffer([1, 2, 3])}, - {name: 'my_file', value: fs.createReadStream(common.dir.fixture + '/unicycle.jpg')}, - {name: 'remote_file', value: request(remoteFile) } -]; - -var server = http.createServer(function(req, res) { - - // formidable is broken so let's do it manual way - // - // var form = new IncomingForm(); - // form.uploadDir = common.dir.tmp; - // form.parse(req); - // form - // .on('field', function(name, value) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(value, field.value+''); - // }) - // .on('file', function(name, file) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(file.name, path.basename(field.value.path)); - // assert.strictEqual(file.type, mime.lookup(file.name)); - // }) - // .on('end', function() { - // res.writeHead(200); - // res.end('done'); - // }); - - // temp workaround - var data = ''; - req.setEncoding('utf8'); - - req.on('data', function(d) { - data += d; - }); - - req.on('end', function() { - // check for the fields' traces - - // 1st field : my_field - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 2nd field : my_buffer - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 3rd field : my_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for unicycle.jpg traces - assert.ok( data.indexOf('2005:06:21 01:44:12') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(field.value.path) ) != -1 ); - - // 4th field : remote_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for http://nodejs.org/images/logo.png traces - assert.ok( data.indexOf('ImageReady') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 ); - - res.writeHead(200); - res.end('done'); - - }); - - -}); - -server.listen(common.port, function() { - var form = new FormData(); - FIELDS.forEach(function(field) { - form.append(field.name, field.value); - }); - - var request = http.request({ - method: 'post', - port: common.port, - path: '/upload', - headers: form.getHeaders() - }); - - form.pipe(request); - - request.on('response', function(res) { - server.close(); - }); -}); - -process.on('exit', function() { - assert.strictEqual(FIELDS.length, 0); -}); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/test/integration/test-submit.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/test/integration/test-submit.js deleted file mode 100644 index c40e88f..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/test/integration/test-submit.js +++ /dev/null @@ -1,107 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var http = require('http'); -var path = require('path'); -var mime = require('mime'); -var request = require('request'); -var fs = require('fs'); -var FormData = require(common.dir.lib + '/form_data'); -var IncomingForm = require('formidable').IncomingForm; - -var remoteFile = 'http://nodejs.org/images/logo.png'; - -var FIELDS = [ - {name: 'my_field', value: 'my_value'}, - {name: 'my_buffer', value: new Buffer([1, 2, 3])}, - {name: 'my_file', value: fs.createReadStream(common.dir.fixture + '/unicycle.jpg') }, - {name: 'remote_file', value: request(remoteFile) } -]; - -var server = http.createServer(function(req, res) { - - // formidable is broken so let's do it manual way - // - // var form = new IncomingForm(); - // form.uploadDir = common.dir.tmp; - // form.parse(req); - // form - // .on('field', function(name, value) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(value, field.value+''); - // }) - // .on('file', function(name, file) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(file.name, path.basename(field.value.path)); - // // mime.lookup file.NAME == 'my_file' ? - // assert.strictEqual(file.type, mime.lookup(file.name)); - // }) - // .on('end', function() { - // res.writeHead(200); - // res.end('done'); - // }); - - // temp workaround - var data = ''; - req.setEncoding('utf8'); - req.on('data', function(d) { - data += d; - }); - req.on('end', function() { - // check for the fields' traces - - // 1st field : my_field - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 2nd field : my_buffer - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 3rd field : my_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for unicycle.jpg traces - assert.ok( data.indexOf('2005:06:21 01:44:12') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(field.value.path) ) != -1 ); - - // 4th field : remote_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for http://nodejs.org/images/logo.png traces - assert.ok( data.indexOf('ImageReady') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 ); - - res.writeHead(200); - res.end('done'); - - }); - -}); - -server.listen(common.port, function() { - var form = new FormData(); - FIELDS.forEach(function(field) { - form.append(field.name, field.value); - }); - - form.submit('http://localhost:' + common.port + '/', function(err, res) { - - if (err) { - throw err; - } - - assert.strictEqual(res.statusCode, 200); - server.close(); - }); - -}); - -process.on('exit', function() { - assert.strictEqual(FIELDS.length, 0); -}); diff --git a/node_modules/jsdom/node_modules/request/node_modules/form-data/test/run.js b/node_modules/jsdom/node_modules/request/node_modules/form-data/test/run.js deleted file mode 100755 index 0bb8e82..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/form-data/test/run.js +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node -var far = require('far').create(); - -far.add(__dirname); -far.include(/test-.*\.js$/); - -far.execute(); diff --git a/node_modules/jsdom/node_modules/request/node_modules/mime/LICENSE b/node_modules/jsdom/node_modules/request/node_modules/mime/LICENSE deleted file mode 100644 index 451fc45..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/mime/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Benjamin Thomas, Robert Kieffer - -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/node_modules/jsdom/node_modules/request/node_modules/mime/README.md b/node_modules/jsdom/node_modules/request/node_modules/mime/README.md deleted file mode 100644 index b90552a..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/mime/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# mime - -Comprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community. - -## Install - -Install with [npm](http://github.com/isaacs/npm): - - npm install mime - -## API - Queries - -### mime.lookup(path) -Get the mime type associated with a file. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g. - - var mime = require('mime'); - - mime.lookup('/path/to/file.txt'); // => 'text/plain' - mime.lookup('file.txt'); // => 'text/plain' - mime.lookup('.TXT'); // => 'text/plain' - mime.lookup('htm'); // => 'text/html' - -### mime.extension(type) -Get the default extension for `type` - - mime.extension('text/html'); // => 'html' - mime.extension('application/octet-stream'); // => 'bin' - -### mime.charsets.lookup() - -Map mime-type to charset - - mime.charsets.lookup('text/plain'); // => 'UTF-8' - -(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.) - -## API - Defining Custom Types - -The following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types). - -### mime.define() - -Add custom mime/extension mappings - - mime.define({ - 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'], - 'application/x-my-type': ['x-mt', 'x-mtt'], - // etc ... - }); - - mime.lookup('x-sft'); // => 'text/x-some-format' - -The first entry in the extensions array is returned by `mime.extension()`. E.g. - - mime.extension('text/x-some-format'); // => 'x-sf' - -### mime.load(filepath) - -Load mappings from an Apache ".types" format file - - mime.load('./my_project.types'); - -The .types file format is simple - See the `types` dir for examples. diff --git a/node_modules/jsdom/node_modules/request/node_modules/mime/mime.js b/node_modules/jsdom/node_modules/request/node_modules/mime/mime.js deleted file mode 100644 index 1e00585..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/mime/mime.js +++ /dev/null @@ -1,104 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -function Mime() { - // Map of extension -> mime type - this.types = Object.create(null); - - // Map of mime type -> extension - this.extensions = Object.create(null); -} - -/** - * Define mimetype -> extension mappings. Each key is a mime-type that maps - * to an array of extensions associated with the type. The first extension is - * used as the default extension for the type. - * - * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); - * - * @param map (Object) type definitions - */ -Mime.prototype.define = function (map) { - for (var type in map) { - var exts = map[type]; - - for (var i = 0; i < exts.length; i++) { - this.types[exts[i]] = type; - } - - // Default extension is the first one we encounter - if (!this.extensions[type]) { - this.extensions[type] = exts[0]; - } - } -}; - -/** - * Load an Apache2-style ".types" file - * - * This may be called multiple times (it's expected). Where files declare - * overlapping types/extensions, the last file wins. - * - * @param file (String) path of file to load. - */ -Mime.prototype.load = function(file) { - // Read file and split into lines - var map = {}, - content = fs.readFileSync(file, 'ascii'), - lines = content.split(/[\r\n]+/); - - lines.forEach(function(line) { - // Clean up whitespace/comments, and split into fields - var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/); - map[fields.shift()] = fields; - }); - - this.define(map); -}; - -/** - * Lookup a mime type based on extension - */ -Mime.prototype.lookup = function(path, fallback) { - var ext = path.replace(/.*[\.\/]/, '').toLowerCase(); - - return this.types[ext] || fallback || this.default_type; -}; - -/** - * Return file extension associated with a mime type - */ -Mime.prototype.extension = function(mimeType) { - return this.extensions[mimeType]; -}; - -// Default instance -var mime = new Mime(); - -// Load local copy of -// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types -mime.load(path.join(__dirname, 'types/mime.types')); - -// Load additional types from node.js community -mime.load(path.join(__dirname, 'types/node.types')); - -// Default type -mime.default_type = mime.lookup('bin'); - -// -// Additional API specific to the default instance -// - -mime.Mime = Mime; - -/** - * Lookup a charset based on mime type. - */ -mime.charsets = { - lookup: function(mimeType, fallback) { - // Assume text types are utf8 - return (/^text\//).test(mimeType) ? 'UTF-8' : fallback; - } -} - -module.exports = mime; diff --git a/node_modules/jsdom/node_modules/request/node_modules/mime/package.json b/node_modules/jsdom/node_modules/request/node_modules/mime/package.json deleted file mode 100644 index 06e2ee5..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/mime/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "author": { - "name": "Robert Kieffer", - "email": "robert@broofa.com", - "url": "http://github.com/broofa" - }, - "contributors": [ - { - "name": "Benjamin Thomas", - "email": "benjamin@benjaminthomas.org", - "url": "http://github.com/bentomas" - } - ], - "dependencies": {}, - "description": "A comprehensive library for mime-type mapping", - "devDependencies": {}, - "keywords": [ - "util", - "mime" - ], - "main": "mime.js", - "name": "mime", - "repository": { - "url": "git://github.com/broofa/node-mime.git", - "type": "git" - }, - "version": "1.2.7", - "_npmUser": { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - "_id": "mime@1.2.7", - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "_engineSupported": true, - "_npmVersion": "1.1.24", - "_nodeVersion": "v0.8.1", - "_defaultsLoaded": true, - "_from": "mime" -} diff --git a/node_modules/jsdom/node_modules/request/node_modules/mime/test.js b/node_modules/jsdom/node_modules/request/node_modules/mime/test.js deleted file mode 100644 index cbad034..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/mime/test.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Usage: node test.js - */ - -var mime = require('./mime'); -var assert = require('assert'); - -function eq(a, b) { - console.log('Test: ' + a + ' === ' + b); - assert.strictEqual.apply(null, arguments); -} - -console.log(Object.keys(mime.extensions).length + ' types'); -console.log(Object.keys(mime.types).length + ' extensions\n'); - -// -// Test mime lookups -// - -eq('text/plain', mime.lookup('text.txt')); -eq('text/plain', mime.lookup('.text.txt')); -eq('text/plain', mime.lookup('.txt')); -eq('text/plain', mime.lookup('txt')); -eq('application/octet-stream', mime.lookup('text.nope')); -eq('fallback', mime.lookup('text.fallback', 'fallback')); -eq('application/octet-stream', mime.lookup('constructor')); -eq('text/plain', mime.lookup('TEXT.TXT')); -eq('text/event-stream', mime.lookup('text/event-stream')); -eq('application/x-web-app-manifest+json', mime.lookup('text.webapp')); - -// -// Test extensions -// - -eq('txt', mime.extension(mime.types.text)); -eq('html', mime.extension(mime.types.htm)); -eq('bin', mime.extension('application/octet-stream')); -eq(undefined, mime.extension('constructor')); - -// -// Test node types -// - -eq('application/octet-stream', mime.lookup('file.buffer')); -eq('audio/mp4', mime.lookup('file.m4a')); - -// -// Test charsets -// - -eq('UTF-8', mime.charsets.lookup('text/plain')); -eq(undefined, mime.charsets.lookup(mime.types.js)); -eq('fallback', mime.charsets.lookup('application/octet-stream', 'fallback')); - -console.log('\nOK'); diff --git a/node_modules/jsdom/node_modules/request/node_modules/mime/types/mime.types b/node_modules/jsdom/node_modules/request/node_modules/mime/types/mime.types deleted file mode 100644 index b90b165..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/mime/types/mime.types +++ /dev/null @@ -1,1588 +0,0 @@ -# This file maps Internet media types to unique file extension(s). -# Although created for httpd, this file is used by many software systems -# and has been placed in the public domain for unlimited redisribution. -# -# The table below contains both registered and (common) unregistered types. -# A type that has no unique extension can be ignored -- they are listed -# here to guide configurations toward known types and to make it easier to -# identify "new" types. File extensions are also commonly used to indicate -# content languages and encodings, so choose them carefully. -# -# Internet media types should be registered as described in RFC 4288. -# The registry is at . -# -# MIME type (lowercased) Extensions -# ============================================ ========== -# application/1d-interleaved-parityfec -# application/3gpp-ims+xml -# application/activemessage -application/andrew-inset ez -# application/applefile -application/applixware aw -application/atom+xml atom -application/atomcat+xml atomcat -# application/atomicmail -application/atomsvc+xml atomsvc -# application/auth-policy+xml -# application/batch-smtp -# application/beep+xml -# application/calendar+xml -# application/cals-1840 -# application/ccmp+xml -application/ccxml+xml ccxml -application/cdmi-capability cdmia -application/cdmi-container cdmic -application/cdmi-domain cdmid -application/cdmi-object cdmio -application/cdmi-queue cdmiq -# application/cea-2018+xml -# application/cellml+xml -# application/cfw -# application/cnrp+xml -# application/commonground -# application/conference-info+xml -# application/cpl+xml -# application/csta+xml -# application/cstadata+xml -application/cu-seeme cu -# application/cybercash -application/davmount+xml davmount -# application/dca-rft -# application/dec-dx -# application/dialog-info+xml -# application/dicom -# application/dns -application/docbook+xml dbk -# application/dskpp+xml -application/dssc+der dssc -application/dssc+xml xdssc -# application/dvcs -application/ecmascript ecma -# application/edi-consent -# application/edi-x12 -# application/edifact -application/emma+xml emma -# application/epp+xml -application/epub+zip epub -# application/eshop -# application/example -application/exi exi -# application/fastinfoset -# application/fastsoap -# application/fits -application/font-tdpfr pfr -# application/framework-attributes+xml -application/gml+xml gml -application/gpx+xml gpx -application/gxf gxf -# application/h224 -# application/held+xml -# application/http -application/hyperstudio stk -# application/ibe-key-request+xml -# application/ibe-pkg-reply+xml -# application/ibe-pp-data -# application/iges -# application/im-iscomposing+xml -# application/index -# application/index.cmd -# application/index.obj -# application/index.response -# application/index.vnd -application/inkml+xml ink inkml -# application/iotp -application/ipfix ipfix -# application/ipp -# application/isup -application/java-archive jar -application/java-serialized-object ser -application/java-vm class -application/javascript js -application/json json -application/jsonml+json jsonml -# application/kpml-request+xml -# application/kpml-response+xml -application/lost+xml lostxml -application/mac-binhex40 hqx -application/mac-compactpro cpt -# application/macwriteii -application/mads+xml mads -application/marc mrc -application/marcxml+xml mrcx -application/mathematica ma nb mb -# application/mathml-content+xml -# application/mathml-presentation+xml -application/mathml+xml mathml -# application/mbms-associated-procedure-description+xml -# application/mbms-deregister+xml -# application/mbms-envelope+xml -# application/mbms-msk+xml -# application/mbms-msk-response+xml -# application/mbms-protection-description+xml -# application/mbms-reception-report+xml -# application/mbms-register+xml -# application/mbms-register-response+xml -# application/mbms-user-service-description+xml -application/mbox mbox -# application/media_control+xml -application/mediaservercontrol+xml mscml -application/metalink+xml metalink -application/metalink4+xml meta4 -application/mets+xml mets -# application/mikey -application/mods+xml mods -# application/moss-keys -# application/moss-signature -# application/mosskey-data -# application/mosskey-request -application/mp21 m21 mp21 -application/mp4 mp4s -# application/mpeg4-generic -# application/mpeg4-iod -# application/mpeg4-iod-xmt -# application/msc-ivr+xml -# application/msc-mixer+xml -application/msword doc dot -application/mxf mxf -# application/nasdata -# application/news-checkgroups -# application/news-groupinfo -# application/news-transmission -# application/nss -# application/ocsp-request -# application/ocsp-response -application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy -application/oda oda -application/oebps-package+xml opf -application/ogg ogx -application/omdoc+xml omdoc -application/onenote onetoc onetoc2 onetmp onepkg -application/oxps oxps -# application/parityfec -application/patch-ops-error+xml xer -application/pdf pdf -application/pgp-encrypted pgp -# application/pgp-keys -application/pgp-signature asc sig -application/pics-rules prf -# application/pidf+xml -# application/pidf-diff+xml -application/pkcs10 p10 -application/pkcs7-mime p7m p7c -application/pkcs7-signature p7s -application/pkcs8 p8 -application/pkix-attr-cert ac -application/pkix-cert cer -application/pkix-crl crl -application/pkix-pkipath pkipath -application/pkixcmp pki -application/pls+xml pls -# application/poc-settings+xml -application/postscript ai eps ps -# application/prs.alvestrand.titrax-sheet -application/prs.cww cww -# application/prs.nprend -# application/prs.plucker -# application/prs.rdf-xml-crypt -# application/prs.xsf+xml -application/pskc+xml pskcxml -# application/qsig -application/rdf+xml rdf -application/reginfo+xml rif -application/relax-ng-compact-syntax rnc -# application/remote-printing -application/resource-lists+xml rl -application/resource-lists-diff+xml rld -# application/riscos -# application/rlmi+xml -application/rls-services+xml rs -application/rpki-ghostbusters gbr -application/rpki-manifest mft -application/rpki-roa roa -# application/rpki-updown -application/rsd+xml rsd -application/rss+xml rss -application/rtf rtf -# application/rtx -# application/samlassertion+xml -# application/samlmetadata+xml -application/sbml+xml sbml -application/scvp-cv-request scq -application/scvp-cv-response scs -application/scvp-vp-request spq -application/scvp-vp-response spp -application/sdp sdp -# application/set-payment -application/set-payment-initiation setpay -# application/set-registration -application/set-registration-initiation setreg -# application/sgml -# application/sgml-open-catalog -application/shf+xml shf -# application/sieve -# application/simple-filter+xml -# application/simple-message-summary -# application/simplesymbolcontainer -# application/slate -# application/smil -application/smil+xml smi smil -# application/soap+fastinfoset -# application/soap+xml -application/sparql-query rq -application/sparql-results+xml srx -# application/spirits-event+xml -application/srgs gram -application/srgs+xml grxml -application/sru+xml sru -application/ssdl+xml ssdl -application/ssml+xml ssml -# application/tamp-apex-update -# application/tamp-apex-update-confirm -# application/tamp-community-update -# application/tamp-community-update-confirm -# application/tamp-error -# application/tamp-sequence-adjust -# application/tamp-sequence-adjust-confirm -# application/tamp-status-query -# application/tamp-status-response -# application/tamp-update -# application/tamp-update-confirm -application/tei+xml tei teicorpus -application/thraud+xml tfi -# application/timestamp-query -# application/timestamp-reply -application/timestamped-data tsd -# application/tve-trigger -# application/ulpfec -# application/vcard+xml -# application/vemmi -# application/vividence.scriptfile -# application/vnd.3gpp.bsf+xml -application/vnd.3gpp.pic-bw-large plb -application/vnd.3gpp.pic-bw-small psb -application/vnd.3gpp.pic-bw-var pvb -# application/vnd.3gpp.sms -# application/vnd.3gpp2.bcmcsinfo+xml -# application/vnd.3gpp2.sms -application/vnd.3gpp2.tcap tcap -application/vnd.3m.post-it-notes pwn -application/vnd.accpac.simply.aso aso -application/vnd.accpac.simply.imp imp -application/vnd.acucobol acu -application/vnd.acucorp atc acutc -application/vnd.adobe.air-application-installer-package+zip air -application/vnd.adobe.formscentral.fcdt fcdt -application/vnd.adobe.fxp fxp fxpl -# application/vnd.adobe.partial-upload -application/vnd.adobe.xdp+xml xdp -application/vnd.adobe.xfdf xfdf -# application/vnd.aether.imp -# application/vnd.ah-barcode -application/vnd.ahead.space ahead -application/vnd.airzip.filesecure.azf azf -application/vnd.airzip.filesecure.azs azs -application/vnd.amazon.ebook azw -application/vnd.americandynamics.acc acc -application/vnd.amiga.ami ami -# application/vnd.amundsen.maze+xml -application/vnd.android.package-archive apk -application/vnd.anser-web-certificate-issue-initiation cii -application/vnd.anser-web-funds-transfer-initiation fti -application/vnd.antix.game-component atx -application/vnd.apple.installer+xml mpkg -application/vnd.apple.mpegurl m3u8 -# application/vnd.arastra.swi -application/vnd.aristanetworks.swi swi -application/vnd.astraea-software.iota iota -application/vnd.audiograph aep -# application/vnd.autopackage -# application/vnd.avistar+xml -application/vnd.blueice.multipass mpm -# application/vnd.bluetooth.ep.oob -application/vnd.bmi bmi -application/vnd.businessobjects rep -# application/vnd.cab-jscript -# application/vnd.canon-cpdl -# application/vnd.canon-lips -# application/vnd.cendio.thinlinc.clientconf -application/vnd.chemdraw+xml cdxml -application/vnd.chipnuts.karaoke-mmd mmd -application/vnd.cinderella cdy -# application/vnd.cirpack.isdn-ext -application/vnd.claymore cla -application/vnd.cloanto.rp9 rp9 -application/vnd.clonk.c4group c4g c4d c4f c4p c4u -application/vnd.cluetrust.cartomobile-config c11amc -application/vnd.cluetrust.cartomobile-config-pkg c11amz -# application/vnd.collection+json -# application/vnd.commerce-battelle -application/vnd.commonspace csp -application/vnd.contact.cmsg cdbcmsg -application/vnd.cosmocaller cmc -application/vnd.crick.clicker clkx -application/vnd.crick.clicker.keyboard clkk -application/vnd.crick.clicker.palette clkp -application/vnd.crick.clicker.template clkt -application/vnd.crick.clicker.wordbank clkw -application/vnd.criticaltools.wbs+xml wbs -application/vnd.ctc-posml pml -# application/vnd.ctct.ws+xml -# application/vnd.cups-pdf -# application/vnd.cups-postscript -application/vnd.cups-ppd ppd -# application/vnd.cups-raster -# application/vnd.cups-raw -# application/vnd.curl -application/vnd.curl.car car -application/vnd.curl.pcurl pcurl -# application/vnd.cybank -application/vnd.dart dart -application/vnd.data-vision.rdz rdz -application/vnd.dece.data uvf uvvf uvd uvvd -application/vnd.dece.ttml+xml uvt uvvt -application/vnd.dece.unspecified uvx uvvx -application/vnd.dece.zip uvz uvvz -application/vnd.denovo.fcselayout-link fe_launch -# application/vnd.dir-bi.plate-dl-nosuffix -application/vnd.dna dna -application/vnd.dolby.mlp mlp -# application/vnd.dolby.mobile.1 -# application/vnd.dolby.mobile.2 -application/vnd.dpgraph dpg -application/vnd.dreamfactory dfac -application/vnd.ds-keypoint kpxx -application/vnd.dvb.ait ait -# application/vnd.dvb.dvbj -# application/vnd.dvb.esgcontainer -# application/vnd.dvb.ipdcdftnotifaccess -# application/vnd.dvb.ipdcesgaccess -# application/vnd.dvb.ipdcesgaccess2 -# application/vnd.dvb.ipdcesgpdd -# application/vnd.dvb.ipdcroaming -# application/vnd.dvb.iptv.alfec-base -# application/vnd.dvb.iptv.alfec-enhancement -# application/vnd.dvb.notif-aggregate-root+xml -# application/vnd.dvb.notif-container+xml -# application/vnd.dvb.notif-generic+xml -# application/vnd.dvb.notif-ia-msglist+xml -# application/vnd.dvb.notif-ia-registration-request+xml -# application/vnd.dvb.notif-ia-registration-response+xml -# application/vnd.dvb.notif-init+xml -# application/vnd.dvb.pfr -application/vnd.dvb.service svc -# application/vnd.dxr -application/vnd.dynageo geo -# application/vnd.easykaraoke.cdgdownload -# application/vnd.ecdis-update -application/vnd.ecowin.chart mag -# application/vnd.ecowin.filerequest -# application/vnd.ecowin.fileupdate -# application/vnd.ecowin.series -# application/vnd.ecowin.seriesrequest -# application/vnd.ecowin.seriesupdate -# application/vnd.emclient.accessrequest+xml -application/vnd.enliven nml -# application/vnd.eprints.data+xml -application/vnd.epson.esf esf -application/vnd.epson.msf msf -application/vnd.epson.quickanime qam -application/vnd.epson.salt slt -application/vnd.epson.ssf ssf -# application/vnd.ericsson.quickcall -application/vnd.eszigno3+xml es3 et3 -# application/vnd.etsi.aoc+xml -# application/vnd.etsi.cug+xml -# application/vnd.etsi.iptvcommand+xml -# application/vnd.etsi.iptvdiscovery+xml -# application/vnd.etsi.iptvprofile+xml -# application/vnd.etsi.iptvsad-bc+xml -# application/vnd.etsi.iptvsad-cod+xml -# application/vnd.etsi.iptvsad-npvr+xml -# application/vnd.etsi.iptvservice+xml -# application/vnd.etsi.iptvsync+xml -# application/vnd.etsi.iptvueprofile+xml -# application/vnd.etsi.mcid+xml -# application/vnd.etsi.overload-control-policy-dataset+xml -# application/vnd.etsi.sci+xml -# application/vnd.etsi.simservs+xml -# application/vnd.etsi.tsl+xml -# application/vnd.etsi.tsl.der -# application/vnd.eudora.data -application/vnd.ezpix-album ez2 -application/vnd.ezpix-package ez3 -# application/vnd.f-secure.mobile -application/vnd.fdf fdf -application/vnd.fdsn.mseed mseed -application/vnd.fdsn.seed seed dataless -# application/vnd.ffsns -# application/vnd.fints -application/vnd.flographit gph -application/vnd.fluxtime.clip ftc -# application/vnd.font-fontforge-sfd -application/vnd.framemaker fm frame maker book -application/vnd.frogans.fnc fnc -application/vnd.frogans.ltf ltf -application/vnd.fsc.weblaunch fsc -application/vnd.fujitsu.oasys oas -application/vnd.fujitsu.oasys2 oa2 -application/vnd.fujitsu.oasys3 oa3 -application/vnd.fujitsu.oasysgp fg5 -application/vnd.fujitsu.oasysprs bh2 -# application/vnd.fujixerox.art-ex -# application/vnd.fujixerox.art4 -# application/vnd.fujixerox.hbpl -application/vnd.fujixerox.ddd ddd -application/vnd.fujixerox.docuworks xdw -application/vnd.fujixerox.docuworks.binder xbd -# application/vnd.fut-misnet -application/vnd.fuzzysheet fzs -application/vnd.genomatix.tuxedo txd -# application/vnd.geocube+xml -application/vnd.geogebra.file ggb -application/vnd.geogebra.tool ggt -application/vnd.geometry-explorer gex gre -application/vnd.geonext gxt -application/vnd.geoplan g2w -application/vnd.geospace g3w -# application/vnd.globalplatform.card-content-mgt -# application/vnd.globalplatform.card-content-mgt-response -application/vnd.gmx gmx -application/vnd.google-earth.kml+xml kml -application/vnd.google-earth.kmz kmz -application/vnd.grafeq gqf gqs -# application/vnd.gridmp -application/vnd.groove-account gac -application/vnd.groove-help ghf -application/vnd.groove-identity-message gim -application/vnd.groove-injector grv -application/vnd.groove-tool-message gtm -application/vnd.groove-tool-template tpl -application/vnd.groove-vcard vcg -# application/vnd.hal+json -application/vnd.hal+xml hal -application/vnd.handheld-entertainment+xml zmm -application/vnd.hbci hbci -# application/vnd.hcl-bireports -application/vnd.hhe.lesson-player les -application/vnd.hp-hpgl hpgl -application/vnd.hp-hpid hpid -application/vnd.hp-hps hps -application/vnd.hp-jlyt jlt -application/vnd.hp-pcl pcl -application/vnd.hp-pclxl pclxl -# application/vnd.httphone -application/vnd.hydrostatix.sof-data sfd-hdstx -# application/vnd.hzn-3d-crossword -# application/vnd.ibm.afplinedata -# application/vnd.ibm.electronic-media -application/vnd.ibm.minipay mpy -application/vnd.ibm.modcap afp listafp list3820 -application/vnd.ibm.rights-management irm -application/vnd.ibm.secure-container sc -application/vnd.iccprofile icc icm -application/vnd.igloader igl -application/vnd.immervision-ivp ivp -application/vnd.immervision-ivu ivu -# application/vnd.informedcontrol.rms+xml -# application/vnd.informix-visionary -# application/vnd.infotech.project -# application/vnd.infotech.project+xml -# application/vnd.innopath.wamp.notification -application/vnd.insors.igm igm -application/vnd.intercon.formnet xpw xpx -application/vnd.intergeo i2g -# application/vnd.intertrust.digibox -# application/vnd.intertrust.nncp -application/vnd.intu.qbo qbo -application/vnd.intu.qfx qfx -# application/vnd.iptc.g2.conceptitem+xml -# application/vnd.iptc.g2.knowledgeitem+xml -# application/vnd.iptc.g2.newsitem+xml -# application/vnd.iptc.g2.newsmessage+xml -# application/vnd.iptc.g2.packageitem+xml -# application/vnd.iptc.g2.planningitem+xml -application/vnd.ipunplugged.rcprofile rcprofile -application/vnd.irepository.package+xml irp -application/vnd.is-xpr xpr -application/vnd.isac.fcs fcs -application/vnd.jam jam -# application/vnd.japannet-directory-service -# application/vnd.japannet-jpnstore-wakeup -# application/vnd.japannet-payment-wakeup -# application/vnd.japannet-registration -# application/vnd.japannet-registration-wakeup -# application/vnd.japannet-setstore-wakeup -# application/vnd.japannet-verification -# application/vnd.japannet-verification-wakeup -application/vnd.jcp.javame.midlet-rms rms -application/vnd.jisp jisp -application/vnd.joost.joda-archive joda -application/vnd.kahootz ktz ktr -application/vnd.kde.karbon karbon -application/vnd.kde.kchart chrt -application/vnd.kde.kformula kfo -application/vnd.kde.kivio flw -application/vnd.kde.kontour kon -application/vnd.kde.kpresenter kpr kpt -application/vnd.kde.kspread ksp -application/vnd.kde.kword kwd kwt -application/vnd.kenameaapp htke -application/vnd.kidspiration kia -application/vnd.kinar kne knp -application/vnd.koan skp skd skt skm -application/vnd.kodak-descriptor sse -application/vnd.las.las+xml lasxml -# application/vnd.liberty-request+xml -application/vnd.llamagraphics.life-balance.desktop lbd -application/vnd.llamagraphics.life-balance.exchange+xml lbe -application/vnd.lotus-1-2-3 123 -application/vnd.lotus-approach apr -application/vnd.lotus-freelance pre -application/vnd.lotus-notes nsf -application/vnd.lotus-organizer org -application/vnd.lotus-screencam scm -application/vnd.lotus-wordpro lwp -application/vnd.macports.portpkg portpkg -# application/vnd.marlin.drm.actiontoken+xml -# application/vnd.marlin.drm.conftoken+xml -# application/vnd.marlin.drm.license+xml -# application/vnd.marlin.drm.mdcf -application/vnd.mcd mcd -application/vnd.medcalcdata mc1 -application/vnd.mediastation.cdkey cdkey -# application/vnd.meridian-slingshot -application/vnd.mfer mwf -application/vnd.mfmp mfm -application/vnd.micrografx.flo flo -application/vnd.micrografx.igx igx -application/vnd.mif mif -# application/vnd.minisoft-hp3000-save -# application/vnd.mitsubishi.misty-guard.trustweb -application/vnd.mobius.daf daf -application/vnd.mobius.dis dis -application/vnd.mobius.mbk mbk -application/vnd.mobius.mqy mqy -application/vnd.mobius.msl msl -application/vnd.mobius.plc plc -application/vnd.mobius.txf txf -application/vnd.mophun.application mpn -application/vnd.mophun.certificate mpc -# application/vnd.motorola.flexsuite -# application/vnd.motorola.flexsuite.adsi -# application/vnd.motorola.flexsuite.fis -# application/vnd.motorola.flexsuite.gotap -# application/vnd.motorola.flexsuite.kmr -# application/vnd.motorola.flexsuite.ttc -# application/vnd.motorola.flexsuite.wem -# application/vnd.motorola.iprm -application/vnd.mozilla.xul+xml xul -application/vnd.ms-artgalry cil -# application/vnd.ms-asf -application/vnd.ms-cab-compressed cab -# application/vnd.ms-color.iccprofile -application/vnd.ms-excel xls xlm xla xlc xlt xlw -application/vnd.ms-excel.addin.macroenabled.12 xlam -application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb -application/vnd.ms-excel.sheet.macroenabled.12 xlsm -application/vnd.ms-excel.template.macroenabled.12 xltm -application/vnd.ms-fontobject eot -application/vnd.ms-htmlhelp chm -application/vnd.ms-ims ims -application/vnd.ms-lrm lrm -# application/vnd.ms-office.activex+xml -application/vnd.ms-officetheme thmx -# application/vnd.ms-opentype -# application/vnd.ms-package.obfuscated-opentype -application/vnd.ms-pki.seccat cat -application/vnd.ms-pki.stl stl -# application/vnd.ms-playready.initiator+xml -application/vnd.ms-powerpoint ppt pps pot -application/vnd.ms-powerpoint.addin.macroenabled.12 ppam -application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm -application/vnd.ms-powerpoint.slide.macroenabled.12 sldm -application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm -application/vnd.ms-powerpoint.template.macroenabled.12 potm -# application/vnd.ms-printing.printticket+xml -application/vnd.ms-project mpp mpt -# application/vnd.ms-tnef -# application/vnd.ms-wmdrm.lic-chlg-req -# application/vnd.ms-wmdrm.lic-resp -# application/vnd.ms-wmdrm.meter-chlg-req -# application/vnd.ms-wmdrm.meter-resp -application/vnd.ms-word.document.macroenabled.12 docm -application/vnd.ms-word.template.macroenabled.12 dotm -application/vnd.ms-works wps wks wcm wdb -application/vnd.ms-wpl wpl -application/vnd.ms-xpsdocument xps -application/vnd.mseq mseq -# application/vnd.msign -# application/vnd.multiad.creator -# application/vnd.multiad.creator.cif -# application/vnd.music-niff -application/vnd.musician mus -application/vnd.muvee.style msty -application/vnd.mynfc taglet -# application/vnd.ncd.control -# application/vnd.ncd.reference -# application/vnd.nervana -# application/vnd.netfpx -application/vnd.neurolanguage.nlu nlu -application/vnd.nitf ntf nitf -application/vnd.noblenet-directory nnd -application/vnd.noblenet-sealer nns -application/vnd.noblenet-web nnw -# application/vnd.nokia.catalogs -# application/vnd.nokia.conml+wbxml -# application/vnd.nokia.conml+xml -# application/vnd.nokia.isds-radio-presets -# application/vnd.nokia.iptv.config+xml -# application/vnd.nokia.landmark+wbxml -# application/vnd.nokia.landmark+xml -# application/vnd.nokia.landmarkcollection+xml -# application/vnd.nokia.n-gage.ac+xml -application/vnd.nokia.n-gage.data ngdat -application/vnd.nokia.n-gage.symbian.install n-gage -# application/vnd.nokia.ncd -# application/vnd.nokia.pcd+wbxml -# application/vnd.nokia.pcd+xml -application/vnd.nokia.radio-preset rpst -application/vnd.nokia.radio-presets rpss -application/vnd.novadigm.edm edm -application/vnd.novadigm.edx edx -application/vnd.novadigm.ext ext -# application/vnd.ntt-local.file-transfer -# application/vnd.ntt-local.sip-ta_remote -# application/vnd.ntt-local.sip-ta_tcp_stream -application/vnd.oasis.opendocument.chart odc -application/vnd.oasis.opendocument.chart-template otc -application/vnd.oasis.opendocument.database odb -application/vnd.oasis.opendocument.formula odf -application/vnd.oasis.opendocument.formula-template odft -application/vnd.oasis.opendocument.graphics odg -application/vnd.oasis.opendocument.graphics-template otg -application/vnd.oasis.opendocument.image odi -application/vnd.oasis.opendocument.image-template oti -application/vnd.oasis.opendocument.presentation odp -application/vnd.oasis.opendocument.presentation-template otp -application/vnd.oasis.opendocument.spreadsheet ods -application/vnd.oasis.opendocument.spreadsheet-template ots -application/vnd.oasis.opendocument.text odt -application/vnd.oasis.opendocument.text-master odm -application/vnd.oasis.opendocument.text-template ott -application/vnd.oasis.opendocument.text-web oth -# application/vnd.obn -# application/vnd.oftn.l10n+json -# application/vnd.oipf.contentaccessdownload+xml -# application/vnd.oipf.contentaccessstreaming+xml -# application/vnd.oipf.cspg-hexbinary -# application/vnd.oipf.dae.svg+xml -# application/vnd.oipf.dae.xhtml+xml -# application/vnd.oipf.mippvcontrolmessage+xml -# application/vnd.oipf.pae.gem -# application/vnd.oipf.spdiscovery+xml -# application/vnd.oipf.spdlist+xml -# application/vnd.oipf.ueprofile+xml -# application/vnd.oipf.userprofile+xml -application/vnd.olpc-sugar xo -# application/vnd.oma-scws-config -# application/vnd.oma-scws-http-request -# application/vnd.oma-scws-http-response -# application/vnd.oma.bcast.associated-procedure-parameter+xml -# application/vnd.oma.bcast.drm-trigger+xml -# application/vnd.oma.bcast.imd+xml -# application/vnd.oma.bcast.ltkm -# application/vnd.oma.bcast.notification+xml -# application/vnd.oma.bcast.provisioningtrigger -# application/vnd.oma.bcast.sgboot -# application/vnd.oma.bcast.sgdd+xml -# application/vnd.oma.bcast.sgdu -# application/vnd.oma.bcast.simple-symbol-container -# application/vnd.oma.bcast.smartcard-trigger+xml -# application/vnd.oma.bcast.sprov+xml -# application/vnd.oma.bcast.stkm -# application/vnd.oma.cab-address-book+xml -# application/vnd.oma.cab-feature-handler+xml -# application/vnd.oma.cab-pcc+xml -# application/vnd.oma.cab-user-prefs+xml -# application/vnd.oma.dcd -# application/vnd.oma.dcdc -application/vnd.oma.dd2+xml dd2 -# application/vnd.oma.drm.risd+xml -# application/vnd.oma.group-usage-list+xml -# application/vnd.oma.pal+xml -# application/vnd.oma.poc.detailed-progress-report+xml -# application/vnd.oma.poc.final-report+xml -# application/vnd.oma.poc.groups+xml -# application/vnd.oma.poc.invocation-descriptor+xml -# application/vnd.oma.poc.optimized-progress-report+xml -# application/vnd.oma.push -# application/vnd.oma.scidm.messages+xml -# application/vnd.oma.xcap-directory+xml -# application/vnd.omads-email+xml -# application/vnd.omads-file+xml -# application/vnd.omads-folder+xml -# application/vnd.omaloc-supl-init -application/vnd.openofficeorg.extension oxt -# application/vnd.openxmlformats-officedocument.custom-properties+xml -# application/vnd.openxmlformats-officedocument.customxmlproperties+xml -# application/vnd.openxmlformats-officedocument.drawing+xml -# application/vnd.openxmlformats-officedocument.drawingml.chart+xml -# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml -# application/vnd.openxmlformats-officedocument.extended-properties+xml -# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml -# application/vnd.openxmlformats-officedocument.presentationml.comments+xml -# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml -application/vnd.openxmlformats-officedocument.presentationml.presentation pptx -# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml -application/vnd.openxmlformats-officedocument.presentationml.slide sldx -# application/vnd.openxmlformats-officedocument.presentationml.slide+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml -application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx -# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml -# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml -# application/vnd.openxmlformats-officedocument.presentationml.tags+xml -application/vnd.openxmlformats-officedocument.presentationml.template potx -# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx -# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml -# application/vnd.openxmlformats-officedocument.theme+xml -# application/vnd.openxmlformats-officedocument.themeoverride+xml -# application/vnd.openxmlformats-officedocument.vmldrawing -# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.document docx -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx -# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml -# application/vnd.openxmlformats-package.core-properties+xml -# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml -# application/vnd.openxmlformats-package.relationships+xml -# application/vnd.quobject-quoxdocument -# application/vnd.osa.netdeploy -application/vnd.osgeo.mapguide.package mgp -# application/vnd.osgi.bundle -application/vnd.osgi.dp dp -application/vnd.osgi.subsystem esa -# application/vnd.otps.ct-kip+xml -application/vnd.palm pdb pqa oprc -# application/vnd.paos.xml -application/vnd.pawaafile paw -application/vnd.pg.format str -application/vnd.pg.osasli ei6 -# application/vnd.piaccess.application-licence -application/vnd.picsel efif -application/vnd.pmi.widget wg -# application/vnd.poc.group-advertisement+xml -application/vnd.pocketlearn plf -application/vnd.powerbuilder6 pbd -# application/vnd.powerbuilder6-s -# application/vnd.powerbuilder7 -# application/vnd.powerbuilder7-s -# application/vnd.powerbuilder75 -# application/vnd.powerbuilder75-s -# application/vnd.preminet -application/vnd.previewsystems.box box -application/vnd.proteus.magazine mgz -application/vnd.publishare-delta-tree qps -application/vnd.pvi.ptid1 ptid -# application/vnd.pwg-multiplexed -# application/vnd.pwg-xhtml-print+xml -# application/vnd.qualcomm.brew-app-res -application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb -# application/vnd.radisys.moml+xml -# application/vnd.radisys.msml+xml -# application/vnd.radisys.msml-audit+xml -# application/vnd.radisys.msml-audit-conf+xml -# application/vnd.radisys.msml-audit-conn+xml -# application/vnd.radisys.msml-audit-dialog+xml -# application/vnd.radisys.msml-audit-stream+xml -# application/vnd.radisys.msml-conf+xml -# application/vnd.radisys.msml-dialog+xml -# application/vnd.radisys.msml-dialog-base+xml -# application/vnd.radisys.msml-dialog-fax-detect+xml -# application/vnd.radisys.msml-dialog-fax-sendrecv+xml -# application/vnd.radisys.msml-dialog-group+xml -# application/vnd.radisys.msml-dialog-speech+xml -# application/vnd.radisys.msml-dialog-transform+xml -# application/vnd.rainstor.data -# application/vnd.rapid -application/vnd.realvnc.bed bed -application/vnd.recordare.musicxml mxl -application/vnd.recordare.musicxml+xml musicxml -# application/vnd.renlearn.rlprint -application/vnd.rig.cryptonote cryptonote -application/vnd.rim.cod cod -application/vnd.rn-realmedia rm -application/vnd.rn-realmedia-vbr rmvb -application/vnd.route66.link66+xml link66 -# application/vnd.rs-274x -# application/vnd.ruckus.download -# application/vnd.s3sms -application/vnd.sailingtracker.track st -# application/vnd.sbm.cid -# application/vnd.sbm.mid2 -# application/vnd.scribus -# application/vnd.sealed.3df -# application/vnd.sealed.csf -# application/vnd.sealed.doc -# application/vnd.sealed.eml -# application/vnd.sealed.mht -# application/vnd.sealed.net -# application/vnd.sealed.ppt -# application/vnd.sealed.tiff -# application/vnd.sealed.xls -# application/vnd.sealedmedia.softseal.html -# application/vnd.sealedmedia.softseal.pdf -application/vnd.seemail see -application/vnd.sema sema -application/vnd.semd semd -application/vnd.semf semf -application/vnd.shana.informed.formdata ifm -application/vnd.shana.informed.formtemplate itp -application/vnd.shana.informed.interchange iif -application/vnd.shana.informed.package ipk -application/vnd.simtech-mindmapper twd twds -application/vnd.smaf mmf -# application/vnd.smart.notebook -application/vnd.smart.teacher teacher -# application/vnd.software602.filler.form+xml -# application/vnd.software602.filler.form-xml-zip -application/vnd.solent.sdkm+xml sdkm sdkd -application/vnd.spotfire.dxp dxp -application/vnd.spotfire.sfs sfs -# application/vnd.sss-cod -# application/vnd.sss-dtf -# application/vnd.sss-ntf -application/vnd.stardivision.calc sdc -application/vnd.stardivision.draw sda -application/vnd.stardivision.impress sdd -application/vnd.stardivision.math smf -application/vnd.stardivision.writer sdw vor -application/vnd.stardivision.writer-global sgl -application/vnd.stepmania.package smzip -application/vnd.stepmania.stepchart sm -# application/vnd.street-stream -application/vnd.sun.xml.calc sxc -application/vnd.sun.xml.calc.template stc -application/vnd.sun.xml.draw sxd -application/vnd.sun.xml.draw.template std -application/vnd.sun.xml.impress sxi -application/vnd.sun.xml.impress.template sti -application/vnd.sun.xml.math sxm -application/vnd.sun.xml.writer sxw -application/vnd.sun.xml.writer.global sxg -application/vnd.sun.xml.writer.template stw -# application/vnd.sun.wadl+xml -application/vnd.sus-calendar sus susp -application/vnd.svd svd -# application/vnd.swiftview-ics -application/vnd.symbian.install sis sisx -application/vnd.syncml+xml xsm -application/vnd.syncml.dm+wbxml bdm -application/vnd.syncml.dm+xml xdm -# application/vnd.syncml.dm.notification -# application/vnd.syncml.ds.notification -application/vnd.tao.intent-module-archive tao -application/vnd.tcpdump.pcap pcap cap dmp -application/vnd.tmobile-livetv tmo -application/vnd.trid.tpt tpt -application/vnd.triscape.mxs mxs -application/vnd.trueapp tra -# application/vnd.truedoc -# application/vnd.ubisoft.webplayer -application/vnd.ufdl ufd ufdl -application/vnd.uiq.theme utz -application/vnd.umajin umj -application/vnd.unity unityweb -application/vnd.uoml+xml uoml -# application/vnd.uplanet.alert -# application/vnd.uplanet.alert-wbxml -# application/vnd.uplanet.bearer-choice -# application/vnd.uplanet.bearer-choice-wbxml -# application/vnd.uplanet.cacheop -# application/vnd.uplanet.cacheop-wbxml -# application/vnd.uplanet.channel -# application/vnd.uplanet.channel-wbxml -# application/vnd.uplanet.list -# application/vnd.uplanet.list-wbxml -# application/vnd.uplanet.listcmd -# application/vnd.uplanet.listcmd-wbxml -# application/vnd.uplanet.signal -application/vnd.vcx vcx -# application/vnd.vd-study -# application/vnd.vectorworks -# application/vnd.verimatrix.vcas -# application/vnd.vidsoft.vidconference -application/vnd.visio vsd vst vss vsw -application/vnd.visionary vis -# application/vnd.vividence.scriptfile -application/vnd.vsf vsf -# application/vnd.wap.sic -# application/vnd.wap.slc -application/vnd.wap.wbxml wbxml -application/vnd.wap.wmlc wmlc -application/vnd.wap.wmlscriptc wmlsc -application/vnd.webturbo wtb -# application/vnd.wfa.wsc -# application/vnd.wmc -# application/vnd.wmf.bootstrap -# application/vnd.wolfram.mathematica -# application/vnd.wolfram.mathematica.package -application/vnd.wolfram.player nbp -application/vnd.wordperfect wpd -application/vnd.wqd wqd -# application/vnd.wrq-hp3000-labelled -application/vnd.wt.stf stf -# application/vnd.wv.csp+wbxml -# application/vnd.wv.csp+xml -# application/vnd.wv.ssp+xml -application/vnd.xara xar -application/vnd.xfdl xfdl -# application/vnd.xfdl.webform -# application/vnd.xmi+xml -# application/vnd.xmpie.cpkg -# application/vnd.xmpie.dpkg -# application/vnd.xmpie.plan -# application/vnd.xmpie.ppkg -# application/vnd.xmpie.xlim -application/vnd.yamaha.hv-dic hvd -application/vnd.yamaha.hv-script hvs -application/vnd.yamaha.hv-voice hvp -application/vnd.yamaha.openscoreformat osf -application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg -# application/vnd.yamaha.remote-setup -application/vnd.yamaha.smaf-audio saf -application/vnd.yamaha.smaf-phrase spf -# application/vnd.yamaha.through-ngn -# application/vnd.yamaha.tunnel-udpencap -application/vnd.yellowriver-custom-menu cmp -application/vnd.zul zir zirz -application/vnd.zzazz.deck+xml zaz -application/voicexml+xml vxml -# application/vq-rtcpxr -# application/watcherinfo+xml -# application/whoispp-query -# application/whoispp-response -application/widget wgt -application/winhlp hlp -# application/wita -# application/wordperfect5.1 -application/wsdl+xml wsdl -application/wspolicy+xml wspolicy -application/x-7z-compressed 7z -application/x-abiword abw -application/x-ace-compressed ace -# application/x-amf -application/x-apple-diskimage dmg -application/x-authorware-bin aab x32 u32 vox -application/x-authorware-map aam -application/x-authorware-seg aas -application/x-bcpio bcpio -application/x-bittorrent torrent -application/x-blorb blb blorb -application/x-bzip bz -application/x-bzip2 bz2 boz -application/x-cbr cbr cba cbt cbz cb7 -application/x-cdlink vcd -application/x-cfs-compressed cfs -application/x-chat chat -application/x-chess-pgn pgn -application/x-conference nsc -# application/x-compress -application/x-cpio cpio -application/x-csh csh -application/x-debian-package deb udeb -application/x-dgc-compressed dgc -application/x-director dir dcr dxr cst cct cxt w3d fgd swa -application/x-doom wad -application/x-dtbncx+xml ncx -application/x-dtbook+xml dtb -application/x-dtbresource+xml res -application/x-dvi dvi -application/x-envoy evy -application/x-eva eva -application/x-font-bdf bdf -# application/x-font-dos -# application/x-font-framemaker -application/x-font-ghostscript gsf -# application/x-font-libgrx -application/x-font-linux-psf psf -application/x-font-otf otf -application/x-font-pcf pcf -application/x-font-snf snf -# application/x-font-speedo -# application/x-font-sunos-news -application/x-font-ttf ttf ttc -application/x-font-type1 pfa pfb pfm afm -application/x-font-woff woff -# application/x-font-vfont -application/x-freearc arc -application/x-futuresplash spl -application/x-gca-compressed gca -application/x-glulx ulx -application/x-gnumeric gnumeric -application/x-gramps-xml gramps -application/x-gtar gtar -# application/x-gzip -application/x-hdf hdf -application/x-install-instructions install -application/x-iso9660-image iso -application/x-java-jnlp-file jnlp -application/x-latex latex -application/x-lzh-compressed lzh lha -application/x-mie mie -application/x-mobipocket-ebook prc mobi -application/x-ms-application application -application/x-ms-shortcut lnk -application/x-ms-wmd wmd -application/x-ms-wmz wmz -application/x-ms-xbap xbap -application/x-msaccess mdb -application/x-msbinder obd -application/x-mscardfile crd -application/x-msclip clp -application/x-msdownload exe dll com bat msi -application/x-msmediaview mvb m13 m14 -application/x-msmetafile wmf wmz emf emz -application/x-msmoney mny -application/x-mspublisher pub -application/x-msschedule scd -application/x-msterminal trm -application/x-mswrite wri -application/x-netcdf nc cdf -application/x-nzb nzb -application/x-pkcs12 p12 pfx -application/x-pkcs7-certificates p7b spc -application/x-pkcs7-certreqresp p7r -application/x-rar-compressed rar -application/x-research-info-systems ris -application/x-sh sh -application/x-shar shar -application/x-shockwave-flash swf -application/x-silverlight-app xap -application/x-sql sql -application/x-stuffit sit -application/x-stuffitx sitx -application/x-subrip srt -application/x-sv4cpio sv4cpio -application/x-sv4crc sv4crc -application/x-t3vm-image t3 -application/x-tads gam -application/x-tar tar -application/x-tcl tcl -application/x-tex tex -application/x-tex-tfm tfm -application/x-texinfo texinfo texi -application/x-tgif obj -application/x-ustar ustar -application/x-wais-source src -application/x-x509-ca-cert der crt -application/x-xfig fig -application/x-xliff+xml xlf -application/x-xpinstall xpi -application/x-xz xz -application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 -# application/x400-bp -application/xaml+xml xaml -# application/xcap-att+xml -# application/xcap-caps+xml -application/xcap-diff+xml xdf -# application/xcap-el+xml -# application/xcap-error+xml -# application/xcap-ns+xml -# application/xcon-conference-info-diff+xml -# application/xcon-conference-info+xml -application/xenc+xml xenc -application/xhtml+xml xhtml xht -# application/xhtml-voice+xml -application/xml xml xsl -application/xml-dtd dtd -# application/xml-external-parsed-entity -# application/xmpp+xml -application/xop+xml xop -application/xproc+xml xpl -application/xslt+xml xslt -application/xspf+xml xspf -application/xv+xml mxml xhvml xvml xvm -application/yang yang -application/yin+xml yin -application/zip zip -# audio/1d-interleaved-parityfec -# audio/32kadpcm -# audio/3gpp -# audio/3gpp2 -# audio/ac3 -audio/adpcm adp -# audio/amr -# audio/amr-wb -# audio/amr-wb+ -# audio/asc -# audio/atrac-advanced-lossless -# audio/atrac-x -# audio/atrac3 -audio/basic au snd -# audio/bv16 -# audio/bv32 -# audio/clearmode -# audio/cn -# audio/dat12 -# audio/dls -# audio/dsr-es201108 -# audio/dsr-es202050 -# audio/dsr-es202211 -# audio/dsr-es202212 -# audio/dv -# audio/dvi4 -# audio/eac3 -# audio/evrc -# audio/evrc-qcp -# audio/evrc0 -# audio/evrc1 -# audio/evrcb -# audio/evrcb0 -# audio/evrcb1 -# audio/evrcwb -# audio/evrcwb0 -# audio/evrcwb1 -# audio/example -# audio/fwdred -# audio/g719 -# audio/g722 -# audio/g7221 -# audio/g723 -# audio/g726-16 -# audio/g726-24 -# audio/g726-32 -# audio/g726-40 -# audio/g728 -# audio/g729 -# audio/g7291 -# audio/g729d -# audio/g729e -# audio/gsm -# audio/gsm-efr -# audio/gsm-hr-08 -# audio/ilbc -# audio/ip-mr_v2.5 -# audio/isac -# audio/l16 -# audio/l20 -# audio/l24 -# audio/l8 -# audio/lpc -audio/midi mid midi kar rmi -# audio/mobile-xmf -audio/mp4 mp4a -# audio/mp4a-latm -# audio/mpa -# audio/mpa-robust -audio/mpeg mpga mp2 mp2a mp3 m2a m3a -# audio/mpeg4-generic -# audio/musepack -audio/ogg oga ogg spx -# audio/opus -# audio/parityfec -# audio/pcma -# audio/pcma-wb -# audio/pcmu-wb -# audio/pcmu -# audio/prs.sid -# audio/qcelp -# audio/red -# audio/rtp-enc-aescm128 -# audio/rtp-midi -# audio/rtx -audio/s3m s3m -audio/silk sil -# audio/smv -# audio/smv0 -# audio/smv-qcp -# audio/sp-midi -# audio/speex -# audio/t140c -# audio/t38 -# audio/telephone-event -# audio/tone -# audio/uemclip -# audio/ulpfec -# audio/vdvi -# audio/vmr-wb -# audio/vnd.3gpp.iufp -# audio/vnd.4sb -# audio/vnd.audiokoz -# audio/vnd.celp -# audio/vnd.cisco.nse -# audio/vnd.cmles.radio-events -# audio/vnd.cns.anp1 -# audio/vnd.cns.inf1 -audio/vnd.dece.audio uva uvva -audio/vnd.digital-winds eol -# audio/vnd.dlna.adts -# audio/vnd.dolby.heaac.1 -# audio/vnd.dolby.heaac.2 -# audio/vnd.dolby.mlp -# audio/vnd.dolby.mps -# audio/vnd.dolby.pl2 -# audio/vnd.dolby.pl2x -# audio/vnd.dolby.pl2z -# audio/vnd.dolby.pulse.1 -audio/vnd.dra dra -audio/vnd.dts dts -audio/vnd.dts.hd dtshd -# audio/vnd.dvb.file -# audio/vnd.everad.plj -# audio/vnd.hns.audio -audio/vnd.lucent.voice lvp -audio/vnd.ms-playready.media.pya pya -# audio/vnd.nokia.mobile-xmf -# audio/vnd.nortel.vbk -audio/vnd.nuera.ecelp4800 ecelp4800 -audio/vnd.nuera.ecelp7470 ecelp7470 -audio/vnd.nuera.ecelp9600 ecelp9600 -# audio/vnd.octel.sbc -# audio/vnd.qcelp -# audio/vnd.rhetorex.32kadpcm -audio/vnd.rip rip -# audio/vnd.sealedmedia.softseal.mpeg -# audio/vnd.vmx.cvsd -# audio/vorbis -# audio/vorbis-config -audio/webm weba -audio/x-aac aac -audio/x-aiff aif aiff aifc -audio/x-caf caf -audio/x-flac flac -audio/x-matroska mka -audio/x-mpegurl m3u -audio/x-ms-wax wax -audio/x-ms-wma wma -audio/x-pn-realaudio ram ra -audio/x-pn-realaudio-plugin rmp -# audio/x-tta -audio/x-wav wav -audio/xm xm -chemical/x-cdx cdx -chemical/x-cif cif -chemical/x-cmdf cmdf -chemical/x-cml cml -chemical/x-csml csml -# chemical/x-pdb -chemical/x-xyz xyz -image/bmp bmp -image/cgm cgm -# image/example -# image/fits -image/g3fax g3 -image/gif gif -image/ief ief -# image/jp2 -image/jpeg jpeg jpg jpe -# image/jpm -# image/jpx -image/ktx ktx -# image/naplps -image/png png -image/prs.btif btif -# image/prs.pti -image/sgi sgi -image/svg+xml svg svgz -# image/t38 -image/tiff tiff tif -# image/tiff-fx -image/vnd.adobe.photoshop psd -# image/vnd.cns.inf2 -image/vnd.dece.graphic uvi uvvi uvg uvvg -image/vnd.dvb.subtitle sub -image/vnd.djvu djvu djv -image/vnd.dwg dwg -image/vnd.dxf dxf -image/vnd.fastbidsheet fbs -image/vnd.fpx fpx -image/vnd.fst fst -image/vnd.fujixerox.edmics-mmr mmr -image/vnd.fujixerox.edmics-rlc rlc -# image/vnd.globalgraphics.pgb -# image/vnd.microsoft.icon -# image/vnd.mix -image/vnd.ms-modi mdi -image/vnd.ms-photo wdp -image/vnd.net-fpx npx -# image/vnd.radiance -# image/vnd.sealed.png -# image/vnd.sealedmedia.softseal.gif -# image/vnd.sealedmedia.softseal.jpg -# image/vnd.svf -image/vnd.wap.wbmp wbmp -image/vnd.xiff xif -image/webp webp -image/x-3ds 3ds -image/x-cmu-raster ras -image/x-cmx cmx -image/x-freehand fh fhc fh4 fh5 fh7 -image/x-icon ico -image/x-mrsid-image sid -image/x-pcx pcx -image/x-pict pic pct -image/x-portable-anymap pnm -image/x-portable-bitmap pbm -image/x-portable-graymap pgm -image/x-portable-pixmap ppm -image/x-rgb rgb -image/x-tga tga -image/x-xbitmap xbm -image/x-xpixmap xpm -image/x-xwindowdump xwd -# message/cpim -# message/delivery-status -# message/disposition-notification -# message/example -# message/external-body -# message/feedback-report -# message/global -# message/global-delivery-status -# message/global-disposition-notification -# message/global-headers -# message/http -# message/imdn+xml -# message/news -# message/partial -message/rfc822 eml mime -# message/s-http -# message/sip -# message/sipfrag -# message/tracking-status -# message/vnd.si.simp -# model/example -model/iges igs iges -model/mesh msh mesh silo -model/vnd.collada+xml dae -model/vnd.dwf dwf -# model/vnd.flatland.3dml -model/vnd.gdl gdl -# model/vnd.gs-gdl -# model/vnd.gs.gdl -model/vnd.gtw gtw -# model/vnd.moml+xml -model/vnd.mts mts -# model/vnd.parasolid.transmit.binary -# model/vnd.parasolid.transmit.text -model/vnd.vtu vtu -model/vrml wrl vrml -model/x3d+binary x3db x3dbz -model/x3d+vrml x3dv x3dvz -model/x3d+xml x3d x3dz -# multipart/alternative -# multipart/appledouble -# multipart/byteranges -# multipart/digest -# multipart/encrypted -# multipart/example -# multipart/form-data -# multipart/header-set -# multipart/mixed -# multipart/parallel -# multipart/related -# multipart/report -# multipart/signed -# multipart/voice-message -# text/1d-interleaved-parityfec -text/cache-manifest appcache -text/calendar ics ifb -text/css css -text/csv csv -# text/directory -# text/dns -# text/ecmascript -# text/enriched -# text/example -# text/fwdred -text/html html htm -# text/javascript -text/n3 n3 -# text/parityfec -text/plain txt text conf def list log in -# text/prs.fallenstein.rst -text/prs.lines.tag dsc -# text/vnd.radisys.msml-basic-layout -# text/red -# text/rfc822-headers -text/richtext rtx -# text/rtf -# text/rtp-enc-aescm128 -# text/rtx -text/sgml sgml sgm -# text/t140 -text/tab-separated-values tsv -text/troff t tr roff man me ms -text/turtle ttl -# text/ulpfec -text/uri-list uri uris urls -text/vcard vcard -# text/vnd.abc -text/vnd.curl curl -text/vnd.curl.dcurl dcurl -text/vnd.curl.scurl scurl -text/vnd.curl.mcurl mcurl -# text/vnd.dmclientscript -text/vnd.dvb.subtitle sub -# text/vnd.esmertec.theme-descriptor -text/vnd.fly fly -text/vnd.fmi.flexstor flx -text/vnd.graphviz gv -text/vnd.in3d.3dml 3dml -text/vnd.in3d.spot spot -# text/vnd.iptc.newsml -# text/vnd.iptc.nitf -# text/vnd.latex-z -# text/vnd.motorola.reflex -# text/vnd.ms-mediapackage -# text/vnd.net2phone.commcenter.command -# text/vnd.si.uricatalogue -text/vnd.sun.j2me.app-descriptor jad -# text/vnd.trolltech.linguist -# text/vnd.wap.si -# text/vnd.wap.sl -text/vnd.wap.wml wml -text/vnd.wap.wmlscript wmls -text/x-asm s asm -text/x-c c cc cxx cpp h hh dic -text/x-fortran f for f77 f90 -text/x-java-source java -text/x-opml opml -text/x-pascal p pas -text/x-nfo nfo -text/x-setext etx -text/x-sfv sfv -text/x-uuencode uu -text/x-vcalendar vcs -text/x-vcard vcf -# text/xml -# text/xml-external-parsed-entity -# video/1d-interleaved-parityfec -video/3gpp 3gp -# video/3gpp-tt -video/3gpp2 3g2 -# video/bmpeg -# video/bt656 -# video/celb -# video/dv -# video/example -video/h261 h261 -video/h263 h263 -# video/h263-1998 -# video/h263-2000 -video/h264 h264 -# video/h264-rcdo -# video/h264-svc -video/jpeg jpgv -# video/jpeg2000 -video/jpm jpm jpgm -video/mj2 mj2 mjp2 -# video/mp1s -# video/mp2p -# video/mp2t -video/mp4 mp4 mp4v mpg4 -# video/mp4v-es -video/mpeg mpeg mpg mpe m1v m2v -# video/mpeg4-generic -# video/mpv -# video/nv -video/ogg ogv -# video/parityfec -# video/pointer -video/quicktime qt mov -# video/raw -# video/rtp-enc-aescm128 -# video/rtx -# video/smpte292m -# video/ulpfec -# video/vc1 -# video/vnd.cctv -video/vnd.dece.hd uvh uvvh -video/vnd.dece.mobile uvm uvvm -# video/vnd.dece.mp4 -video/vnd.dece.pd uvp uvvp -video/vnd.dece.sd uvs uvvs -video/vnd.dece.video uvv uvvv -# video/vnd.directv.mpeg -# video/vnd.directv.mpeg-tts -# video/vnd.dlna.mpeg-tts -video/vnd.dvb.file dvb -video/vnd.fvt fvt -# video/vnd.hns.video -# video/vnd.iptvforum.1dparityfec-1010 -# video/vnd.iptvforum.1dparityfec-2005 -# video/vnd.iptvforum.2dparityfec-1010 -# video/vnd.iptvforum.2dparityfec-2005 -# video/vnd.iptvforum.ttsavc -# video/vnd.iptvforum.ttsmpeg2 -# video/vnd.motorola.video -# video/vnd.motorola.videop -video/vnd.mpegurl mxu m4u -video/vnd.ms-playready.media.pyv pyv -# video/vnd.nokia.interleaved-multimedia -# video/vnd.nokia.videovoip -# video/vnd.objectvideo -# video/vnd.sealed.mpeg1 -# video/vnd.sealed.mpeg4 -# video/vnd.sealed.swf -# video/vnd.sealedmedia.softseal.mov -video/vnd.uvvu.mp4 uvu uvvu -video/vnd.vivo viv -video/webm webm -video/x-f4v f4v -video/x-fli fli -video/x-flv flv -video/x-m4v m4v -video/x-matroska mkv mk3d mks -video/x-mng mng -video/x-ms-asf asf asx -video/x-ms-vob vob -video/x-ms-wm wm -video/x-ms-wmv wmv -video/x-ms-wmx wmx -video/x-ms-wvx wvx -video/x-msvideo avi -video/x-sgi-movie movie -video/x-smv smv -x-conference/x-cooltalk ice diff --git a/node_modules/jsdom/node_modules/request/node_modules/mime/types/node.types b/node_modules/jsdom/node_modules/request/node_modules/mime/types/node.types deleted file mode 100644 index 9097334..0000000 --- a/node_modules/jsdom/node_modules/request/node_modules/mime/types/node.types +++ /dev/null @@ -1,59 +0,0 @@ -# What: Google Chrome Extension -# Why: To allow apps to (work) be served with the right content type header. -# http://codereview.chromium.org/2830017 -# Added by: niftylettuce -application/x-chrome-extension crx - -# What: OTF Message Silencer -# Why: To silence the "Resource interpreted as font but transferred with MIME -# type font/otf" message that occurs in Google Chrome -# Added by: niftylettuce -font/opentype otf - -# What: HTC support -# Why: To properly render .htc files such as CSS3PIE -# Added by: niftylettuce -text/x-component htc - -# What: HTML5 application cache manifest -# Why: De-facto standard. Required by Mozilla browser when serving HTML5 apps -# per https://developer.mozilla.org/en/offline_resources_in_firefox -# Added by: louisremi -text/cache-manifest appcache manifest - -# What: node binary buffer format -# Why: semi-standard extension w/in the node community -# Added by: tootallnate -application/octet-stream buffer - -# What: The "protected" MP-4 formats used by iTunes. -# Why: Required for streaming music to browsers (?) -# Added by: broofa -application/mp4 m4p -audio/mp4 m4a - -# What: Music playlist format (http://en.wikipedia.org/wiki/M3U) -# Why: See https://github.com/bentomas/node-mime/pull/6 -# Added by: mjrusso -application/x-mpegURL m3u8 - -# What: Video format, Part of RFC1890 -# Why: See https://github.com/bentomas/node-mime/pull/6 -# Added by: mjrusso -video/MP2T ts - -# What: The FLAC lossless codec format -# Why: Streaming and serving FLAC audio -# Added by: jacobrask -audio/flac flac - -# What: EventSource mime type -# Why: mime type of Server-Sent Events stream -# http://www.w3.org/TR/eventsource/#text-event-stream -# Added by: francois2metz -text/event-stream event-stream - -# What: Mozilla App manifest mime type -# Why: https://developer.mozilla.org/en/Apps/Manifest#Serving_manifests -# Added by: ednapiranha -application/x-web-app-manifest+json webapp diff --git a/node_modules/jsdom/node_modules/request/oauth.js b/node_modules/jsdom/node_modules/request/oauth.js deleted file mode 100644 index e35bfa6..0000000 --- a/node_modules/jsdom/node_modules/request/oauth.js +++ /dev/null @@ -1,43 +0,0 @@ -var crypto = require('crypto') - , qs = require('querystring') - ; - -function sha1 (key, body) { - return crypto.createHmac('sha1', key).update(body).digest('base64') -} - -function rfc3986 (str) { - return encodeURIComponent(str) - .replace(/!/g,'%21') - .replace(/\*/g,'%2A') - .replace(/\(/g,'%28') - .replace(/\)/g,'%29') - .replace(/'/g,'%27') - ; -} - -function hmacsign (httpMethod, base_uri, params, consumer_secret, token_secret) { - // adapted from https://dev.twitter.com/docs/auth/oauth and - // https://dev.twitter.com/docs/auth/creating-signature - - var querystring = Object.keys(params).sort().map(function(key){ - // big WTF here with the escape + encoding but it's what twitter wants - return escape(rfc3986(key)) + "%3D" + escape(rfc3986(params[key])) - }).join('%26') - - var base = [ - httpMethod ? httpMethod.toUpperCase() : 'GET', - rfc3986(base_uri), - querystring - ].join('&') - - var key = [ - consumer_secret, - token_secret || '' - ].map(rfc3986).join('&') - - return sha1(key, base) -} - -exports.hmacsign = hmacsign -exports.rfc3986 = rfc3986 diff --git a/node_modules/jsdom/node_modules/request/package.json b/node_modules/jsdom/node_modules/request/package.json deleted file mode 100644 index 0a48591..0000000 --- a/node_modules/jsdom/node_modules/request/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "request", - "description": "Simplified HTTP request client.", - "tags": [ - "http", - "simple", - "util", - "utility" - ], - "version": "2.12.0", - "author": { - "name": "Mikeal Rogers", - "email": "mikeal.rogers@gmail.com" - }, - "repository": { - "type": "git", - "url": "http://github.com/mikeal/request.git" - }, - "bugs": { - "url": "http://github.com/mikeal/request/issues" - }, - "engines": [ - "node >= 0.3.6" - ], - "main": "./main", - "dependencies": { - "form-data": "~0.0.3", - "mime": "~1.2.7" - }, - "bundleDependencies": [ - "form-data", - "mime" - ], - "scripts": { - "test": "node tests/run.js" - }, - "readme": "# Request -- Simplified HTTP request method\n\n## Install\n\n
        \n  npm install request\n
        \n\nOr from source:\n\n
        \n  git clone git://github.com/mikeal/request.git \n  cd request\n  npm link\n
        \n\n## Super simple to use\n\nRequest is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default.\n\n```javascript\nvar request = require('request');\nrequest('http://www.google.com', function (error, response, body) {\n if (!error && response.statusCode == 200) {\n console.log(body) // Print the google web page.\n }\n})\n```\n\n## Streaming\n\nYou can stream any response to a file stream.\n\n```javascript\nrequest('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))\n```\n\nYou can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers.\n\n```javascript\nfs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json'))\n```\n\nRequest can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers.\n\n```javascript\nrequest.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png'))\n```\n\nNow let's get fancy.\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n if (req.method === 'PUT') {\n req.pipe(request.put('http://mysite.com/doodle.png'))\n } else if (req.method === 'GET' || req.method === 'HEAD') {\n request.get('http://mysite.com/doodle.png').pipe(resp)\n } \n }\n})\n```\n\nYou can also pipe() from a http.ServerRequest instance and to a http.ServerResponse instance. The HTTP method and headers will be sent as well as the entity-body data. Which means that, if you don't really care about security, you can do:\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n var x = request('http://mysite.com/doodle.png')\n req.pipe(x)\n x.pipe(resp)\n }\n})\n```\n\nAnd since pipe() returns the destination stream in node 0.5.x you can do one line proxying :)\n\n```javascript\nreq.pipe(request('http://mysite.com/doodle.png')).pipe(resp)\n```\n\nAlso, none of this new functionality conflicts with requests previous features, it just expands them.\n\n```javascript\nvar r = request.defaults({'proxy':'http://localproxy.com'})\n\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n r.get('http://google.com/doodle.png').pipe(resp)\n }\n})\n```\nYou can still use intermediate proxies, the requests will still follow HTTP forwards, etc.\n\n## Forms\n\n`request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API.\n\nUrl encoded forms are simple\n\n```javascript\nrequest.post('http://service.com/upload', {form:{key:'value'}})\n// or\nrequest.post('http://service.com/upload').form({key:'value'})\n```\n\nFor `multipart/form-data` we use the [form-data](https://github.com/felixge/node-form-data) library by [@felixge](https://github.com/felixge). You don't need to worry about piping the form object or setting the headers, `request` will handle that for you.\n\n```javascript\nvar r = request.post('http://service.com/upload')\nvar form = r.form()\nform.append('my_field', 'my_value')\nform.append('my_buffer', new Buffer([1, 2, 3]))\nform.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png'))\nform.append('remote_file', request('http://google.com/doodle.png'))\n```\n\n## OAuth Signing\n\n```javascript\n// Twitter OAuth\nvar qs = require('querystring')\n , oauth =\n { callback: 'http://mysite.com/callback/'\n , consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n }\n , url = 'https://api.twitter.com/oauth/request_token'\n ;\nrequest.post({url:url, oauth:oauth}, function (e, r, body) {\n // Assume by some stretch of magic you aquired the verifier\n var access_token = qs.parse(body)\n , oauth = \n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: access_token.oauth_token\n , verifier: VERIFIER\n , token_secret: access_token.oauth_token_secret\n }\n , url = 'https://api.twitter.com/oauth/access_token'\n ;\n request.post({url:url, oauth:oauth}, function (e, r, body) {\n var perm_token = qs.parse(body)\n , oauth = \n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: perm_token.oauth_token\n , token_secret: perm_token.oauth_token_secret\n }\n , url = 'https://api.twitter.com/1/users/show.json?'\n , params = \n { screen_name: perm_token.screen_name\n , user_id: perm_token.user_id\n }\n ;\n url += qs.stringify(params)\n request.get({url:url, oauth:oauth, json:true}, function (e, r, user) {\n console.log(user)\n })\n })\n})\n```\n\n\n\n### request(options, callback)\n\nThe first argument can be either a url or an options object. The only required option is uri, all others are optional.\n\n* `uri` || `url` - fully qualified uri or a parsed url object from url.parse()\n* `qs` - object containing querystring values to be appended to the uri\n* `method` - http method, defaults to GET\n* `headers` - http headers, defaults to {}\n* `body` - entity body for POST and PUT requests. Must be buffer or string.\n* `form` - when passed an object this will set `body` but to a querystring representation of value and adds `Content-type: application/x-www-form-urlencoded; charset=utf-8` header. When passed no option a FormData instance is returned that will be piped to request.\n* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header. Additionally, parses the response body as json.\n* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below.\n* `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true.\n* `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects. defaults to false.\n* `maxRedirects` - the maximum number of redirects to follow, defaults to 10.\n* `encoding` - Encoding to be used on `setEncoding` of response data. If set to `null`, the body is returned as a Buffer.\n* `pool` - A hash object containing the agents for these requests. If omitted this request will use the global pool which is set to node's default maxSockets.\n* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool.\n* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request\t\n* `proxy` - An HTTP proxy to be used. Support proxy Auth with Basic Auth the same way it's supported with the `url` parameter by embedding the auth info in the uri.\n* `oauth` - Options for OAuth HMAC-SHA1 signing, see documentation above.\n* `strictSSL` - Set to `true` to require that SSL certificates be valid. Note: to use your own certificate authority, you need to specify an agent that was created with that ca as an option.\n* `jar` - Set to `false` if you don't want cookies to be remembered for future use or define your custom cookie jar (see examples section)\n* `aws` - object containing aws signing information, should have the properties `key` and `secret` as well as `bucket` unless you're specifying your bucket as part of the path, or you are making a request that doesn't use a bucket (i.e. GET Services)\n\n\nThe callback argument gets 3 arguments. The first is an error when applicable (usually from the http.Client option not the http.ClientRequest object). The second in an http.ClientResponse object. The third is the response body String or Buffer.\n\n## Convenience methods\n\nThere are also shorthand methods for different HTTP METHODs and some other conveniences.\n\n### request.defaults(options) \n \nThis method returns a wrapper around the normal request API that defaults to whatever options you pass in to it.\n\n### request.put\n\nSame as request() but defaults to `method: \"PUT\"`.\n\n```javascript\nrequest.put(url)\n```\n\n### request.post\n\nSame as request() but defaults to `method: \"POST\"`.\n\n```javascript\nrequest.post(url)\n```\n\n### request.head\n\nSame as request() but defaults to `method: \"HEAD\"`.\n\n```javascript\nrequest.head(url)\n```\n\n### request.del\n\nSame as request() but defaults to `method: \"DELETE\"`.\n\n```javascript\nrequest.del(url)\n```\n\n### request.get\n\nAlias to normal request method for uniformity.\n\n```javascript\nrequest.get(url)\n```\n### request.cookie\n\nFunction that creates a new cookie.\n\n```javascript\nrequest.cookie('cookie_string_here')\n```\n### request.jar\n\nFunction that creates a new cookie jar.\n\n```javascript\nrequest.jar()\n```\n\n\n## Examples:\n\n```javascript\n var request = require('request')\n , rand = Math.floor(Math.random()*100000000).toString()\n ;\n request(\n { method: 'PUT'\n , uri: 'http://mikeal.iriscouch.com/testjs/' + rand\n , multipart: \n [ { 'content-type': 'application/json'\n , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})\n }\n , { body: 'I am an attachment' }\n ] \n }\n , function (error, response, body) {\n if(response.statusCode == 201){\n console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand)\n } else {\n console.log('error: '+ response.statusCode)\n console.log(body)\n }\n }\n )\n```\nCookies are enabled by default (so they can be used in subsequent requests). To disable cookies set jar to false (either in defaults or in the options sent).\n\n```javascript\nvar request = request.defaults({jar: false})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\n\nIf you to use a custom cookie jar (instead of letting request use its own global cookie jar) you do so by setting the jar default or by specifying it as an option:\n\n```javascript\nvar j = request.jar()\nvar request = request.defaults({jar:j})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\nOR\n\n```javascript\nvar j = request.jar()\nvar cookie = request.cookie('your_cookie_here')\nj.add(cookie)\nrequest({url: 'http://www.google.com', jar: j}, function () {\n request('http://images.google.com')\n})\n```\n", - "_id": "request@2.12.0", - "dist": { - "shasum": "11f46f20b3d0f4848c6383991c80790af16c8e48" - }, - "_from": "request@2.x" -} diff --git a/node_modules/jsdom/node_modules/request/tests/googledoodle.png b/node_modules/jsdom/node_modules/request/tests/googledoodle.png deleted file mode 100644 index f80c9c52d3c507996535a19ee0bcfe3821de322d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38510 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 diff --git a/node_modules/jsdom/node_modules/request/tests/run.js b/node_modules/jsdom/node_modules/request/tests/run.js deleted file mode 100644 index 538a65c..0000000 --- a/node_modules/jsdom/node_modules/request/tests/run.js +++ /dev/null @@ -1,45 +0,0 @@ -var spawn = require('child_process').spawn - , exitCode = 0 - ; - -var tests = [ - 'test-body.js' - , 'test-cookie.js' - , 'test-cookiejar.js' - , 'test-defaults.js' - , 'test-errors.js' - , 'test-form.js' - , 'test-follow-all-303.js' - , 'test-follow-all.js' - , 'test-headers.js' - , 'test-httpModule.js' - , 'test-https.js' - , 'test-https-strict.js' - , 'test-oauth.js' - , 'test-params.js' - , 'test-pipes.js' - , 'test-pool.js' - , 'test-protocol-changing-redirect.js' - , 'test-proxy.js' - , 'test-piped-redirect.js' - , 'test-qs.js' - , 'test-redirect.js' - , 'test-timeout.js' - , 'test-toJSON.js' - , 'test-tunnel.js' -] - -var next = function () { - if (tests.length === 0) process.exit(exitCode); - - var file = tests.shift() - console.log(file) - var proc = spawn('node', [ 'tests/' + file ]) - proc.stdout.pipe(process.stdout) - proc.stderr.pipe(process.stderr) - proc.on('exit', function (code) { - exitCode += code || 0 - next() - }) -} -next() diff --git a/node_modules/jsdom/node_modules/request/tests/server.js b/node_modules/jsdom/node_modules/request/tests/server.js deleted file mode 100644 index b6eacba..0000000 --- a/node_modules/jsdom/node_modules/request/tests/server.js +++ /dev/null @@ -1,90 +0,0 @@ -var fs = require('fs') - , http = require('http') - , path = require('path') - , https = require('https') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - ; - -exports.createServer = function (port) { - port = port || 6767 - var s = http.createServer(function (req, resp) { - s.emit(req.url, req, resp); - }) - s.port = port - s.url = 'http://localhost:'+port - return s; -} - -exports.createSSLServer = function(port, opts) { - port = port || 16767 - - var options = { 'key' : path.join(__dirname, 'ssl', 'test.key') - , 'cert': path.join(__dirname, 'ssl', 'test.crt') - } - if (opts) { - for (var i in opts) options[i] = opts[i] - } - - for (var i in options) { - options[i] = fs.readFileSync(options[i]) - } - - var s = https.createServer(options, function (req, resp) { - s.emit(req.url, req, resp); - }) - s.port = port - s.url = 'https://localhost:'+port - return s; -} - -exports.createPostStream = function (text) { - var postStream = new stream.Stream(); - postStream.writeable = true; - postStream.readable = true; - setTimeout(function () {postStream.emit('data', new Buffer(text)); postStream.emit('end')}, 0); - return postStream; -} -exports.createPostValidator = function (text, reqContentType) { - var l = function (req, resp) { - var r = ''; - req.on('data', function (chunk) {r += chunk}) - req.on('end', function () { - if (req.headers['content-type'] && req.headers['content-type'].indexOf('boundary=') >= 0) { - var boundary = req.headers['content-type'].split('boundary=')[1]; - text = text.replace(/__BOUNDARY__/g, boundary); - } - if (r !== text) console.log(r, text); - assert.equal(r, text) - if (reqContentType) { - assert.ok(req.headers['content-type']) - assert.ok(~req.headers['content-type'].indexOf(reqContentType)) - } - resp.writeHead(200, {'content-type':'text/plain'}) - resp.write('OK') - resp.end() - }) - } - return l; -} -exports.createGetResponse = function (text, contentType) { - var l = function (req, resp) { - contentType = contentType || 'text/plain' - resp.writeHead(200, {'content-type':contentType}) - resp.write(text) - resp.end() - } - return l; -} -exports.createChunkResponse = function (chunks, contentType) { - var l = function (req, resp) { - contentType = contentType || 'text/plain' - resp.writeHead(200, {'content-type':contentType}) - chunks.forEach(function (chunk) { - resp.write(chunk) - }) - resp.end() - } - return l; -} diff --git a/node_modules/jsdom/node_modules/request/tests/squid.conf b/node_modules/jsdom/node_modules/request/tests/squid.conf deleted file mode 100644 index 0d4a3b6..0000000 --- a/node_modules/jsdom/node_modules/request/tests/squid.conf +++ /dev/null @@ -1,77 +0,0 @@ -# -# Recommended minimum configuration: -# -acl manager proto cache_object -acl localhost src 127.0.0.1/32 ::1 -acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1 - -# Example rule allowing access from your local networks. -# Adapt to list your (internal) IP networks from where browsing -# should be allowed -acl localnet src 10.0.0.0/8 # RFC1918 possible internal network -acl localnet src 172.16.0.0/12 # RFC1918 possible internal network -acl localnet src 192.168.0.0/16 # RFC1918 possible internal network -acl localnet src fc00::/7 # RFC 4193 local private network range -acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines - -acl SSL_ports port 443 -acl Safe_ports port 80 # http -acl Safe_ports port 21 # ftp -acl Safe_ports port 443 # https -acl Safe_ports port 70 # gopher -acl Safe_ports port 210 # wais -acl Safe_ports port 1025-65535 # unregistered ports -acl Safe_ports port 280 # http-mgmt -acl Safe_ports port 488 # gss-http -acl Safe_ports port 591 # filemaker -acl Safe_ports port 777 # multiling http -acl CONNECT method CONNECT - -# -# Recommended minimum Access Permission configuration: -# -# Only allow cachemgr access from localhost -http_access allow manager localhost -http_access deny manager - -# Deny requests to certain unsafe ports -http_access deny !Safe_ports - -# Deny CONNECT to other than secure SSL ports -#http_access deny CONNECT !SSL_ports - -# We strongly recommend the following be uncommented to protect innocent -# web applications running on the proxy server who think the only -# one who can access services on "localhost" is a local user -#http_access deny to_localhost - -# -# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS -# - -# Example rule allowing access from your local networks. -# Adapt localnet in the ACL section to list your (internal) IP networks -# from where browsing should be allowed -http_access allow localnet -http_access allow localhost - -# And finally deny all other access to this proxy -http_access deny all - -# Squid normally listens to port 3128 -http_port 3128 - -# We recommend you to use at least the following line. -hierarchy_stoplist cgi-bin ? - -# Uncomment and adjust the following to add a disk cache directory. -#cache_dir ufs /usr/local/var/cache 100 16 256 - -# Leave coredumps in the first cache dir -coredump_dir /usr/local/var/cache - -# Add any of your own refresh_pattern entries above these. -refresh_pattern ^ftp: 1440 20% 10080 -refresh_pattern ^gopher: 1440 0% 1440 -refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 -refresh_pattern . 0 20% 4320 diff --git a/node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.cnf b/node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.cnf deleted file mode 100644 index 425a889..0000000 --- a/node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.cnf +++ /dev/null @@ -1,20 +0,0 @@ -[ req ] -default_bits = 1024 -days = 3650 -distinguished_name = req_distinguished_name -attributes = req_attributes -prompt = no -output_password = password - -[ req_distinguished_name ] -C = US -ST = CA -L = Oakland -O = request -OU = request Certificate Authority -CN = requestCA -emailAddress = mikeal@mikealrogers.com - -[ req_attributes ] -challengePassword = password challenge - diff --git a/node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.crl b/node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.crl deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.crt b/node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.crt deleted file mode 100644 index b4524e4..0000000 --- a/node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.crt +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICvTCCAiYCCQDn+P/MSbDsWjANBgkqhkiG9w0BAQUFADCBojELMAkGA1UEBhMC -VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMRAwDgYDVQQKEwdyZXF1 -ZXN0MSYwJAYDVQQLEx1yZXF1ZXN0IENlcnRpZmljYXRlIEF1dGhvcml0eTESMBAG -A1UEAxMJcmVxdWVzdENBMSYwJAYJKoZIhvcNAQkBFhdtaWtlYWxAbWlrZWFscm9n -ZXJzLmNvbTAeFw0xMjAzMDEyMjUwNTZaFw0yMjAyMjcyMjUwNTZaMIGiMQswCQYD -VQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNVBAcTB09ha2xhbmQxEDAOBgNVBAoT -B3JlcXVlc3QxJjAkBgNVBAsTHXJlcXVlc3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -MRIwEAYDVQQDEwlyZXF1ZXN0Q0ExJjAkBgkqhkiG9w0BCQEWF21pa2VhbEBtaWtl -YWxyb2dlcnMuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7t9pQUAK4 -5XJYTI6NrF0n3G2HZsfN+rPYSVzzL8SuVyb1tHXos+vbPm3NKI4E8X1yVAXU8CjJ -5SqXnp4DAypAhaseho81cbhk7LXUhFz78OvAa+OD+xTAEAnNQ8tGUr4VGyplEjfD -xsBVuqV2j8GPNTftr+drOCFlqfAgMrBn4wIDAQABMA0GCSqGSIb3DQEBBQUAA4GB -ADVdTlVAL45R+PACNS7Gs4o81CwSclukBu4FJbxrkd4xGQmurgfRrYYKjtqiopQm -D7ysRamS3HMN9/VKq2T7r3z1PMHPAy7zM4uoXbbaTKwlnX4j/8pGPn8Ca3qHXYlo -88L/OOPc6Di7i7qckS3HFbXQCTiULtxWmy97oEuTwrAj ------END CERTIFICATE----- diff --git a/node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.csr b/node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.csr deleted file mode 100644 index e48c56e..0000000 --- a/node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.csr +++ /dev/null @@ -1,13 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIICBjCCAW8CAQAwgaIxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEQMA4GA1UE -BxMHT2FrbGFuZDEQMA4GA1UEChMHcmVxdWVzdDEmMCQGA1UECxMdcmVxdWVzdCBD -ZXJ0aWZpY2F0ZSBBdXRob3JpdHkxEjAQBgNVBAMTCXJlcXVlc3RDQTEmMCQGCSqG -SIb3DQEJARYXbWlrZWFsQG1pa2VhbHJvZ2Vycy5jb20wgZ8wDQYJKoZIhvcNAQEB -BQADgY0AMIGJAoGBALu32lBQArjlclhMjo2sXSfcbYdmx836s9hJXPMvxK5XJvW0 -deiz69s+bc0ojgTxfXJUBdTwKMnlKpeengMDKkCFqx6GjzVxuGTstdSEXPvw68Br -44P7FMAQCc1Dy0ZSvhUbKmUSN8PGwFW6pXaPwY81N+2v52s4IWWp8CAysGfjAgMB -AAGgIzAhBgkqhkiG9w0BCQcxFBMScGFzc3dvcmQgY2hhbGxlbmdlMA0GCSqGSIb3 -DQEBBQUAA4GBAGJO7grHeVHXetjHEK8urIxdnvfB2qeZeObz4GPKIkqUurjr0rfj -bA3EK1kDMR5aeQWR8RunixdM16Q6Ry0lEdLVWkdSwRN9dmirIHT9cypqnD/FYOia -SdezZ0lUzXgmJIwRYRwB1KSMMocIf52ll/xC2bEGg7/ZAEuAyAgcZV3X ------END CERTIFICATE REQUEST----- diff --git a/node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.key b/node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.key deleted file mode 100644 index a53e7f7..0000000 --- a/node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.key +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,C8B5887048377F02 - -nyD5ZH0Wup2uWsDvurq5mKDaDrf8lvNn9w0SH/ZkVnfR1/bkwqrFriqJWvZNUG+q -nS0iBYczsWLJnbub9a1zLOTENWUKVD5uqbC3aGHhnoUTNSa27DONgP8gHOn6JgR+ -GAKo01HCSTiVT4LjkwN337QKHnMP2fTzg+IoC/CigvMcq09hRLwU1/guq0GJKGwH -gTxYNuYmQC4Tjh8vdS4liF+Ve/P3qPR2CehZrIOkDT8PHJBGQJRo4xGUIB7Tpk38 -VCk+UZ0JCS2coY8VkY/9tqFJp/ZnnQQVmaNbdRqg7ECKL+bXnNo7yjzmazPZmPe3 -/ShbE0+CTt7LrjCaQAxWbeDzqfo1lQfgN1LulTm8MCXpQaJpv7v1VhIhQ7afjMYb -4thW/ypHPiYS2YJCAkAVlua9Oxzzh1qJoh8Df19iHtpd79Q77X/qf+1JvITlMu0U -gi7yEatmQcmYNws1mtTC1q2DXrO90c+NZ0LK/Alse6NRL/xiUdjug2iHeTf/idOR -Gg/5dSZbnnlj1E5zjSMDkzg6EHAFmHV4jYGSAFLEQgp4V3ZhMVoWZrvvSHgKV/Qh -FqrAK4INr1G2+/QTd09AIRzfy3/j6yD4A9iNaOsEf9Ua7Qh6RcALRCAZTWR5QtEf -dX+iSNJ4E85qXs0PqwkMDkoaxIJ+tmIRJY7y8oeylV8cfGAi8Soubt/i3SlR8IHC -uDMas/2OnwafK3N7ODeE1i7r7wkzQkSHaEz0TrF8XRnP25jAICCSLiMdAAjKfxVb -EvzsFSuAy3Jt6bU3hSLY9o4YVYKE+68ITMv9yNjvTsEiW+T+IbN34w== ------END RSA PRIVATE KEY----- diff --git a/node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.srl b/node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.srl deleted file mode 100644 index 17128db..0000000 --- a/node_modules/jsdom/node_modules/request/tests/ssl/ca/ca.srl +++ /dev/null @@ -1 +0,0 @@ -ADF62016AA40C9C3 diff --git a/node_modules/jsdom/node_modules/request/tests/ssl/ca/server.cnf b/node_modules/jsdom/node_modules/request/tests/ssl/ca/server.cnf deleted file mode 100644 index cd1fd1e..0000000 --- a/node_modules/jsdom/node_modules/request/tests/ssl/ca/server.cnf +++ /dev/null @@ -1,19 +0,0 @@ -[ req ] -default_bits = 1024 -days = 3650 -distinguished_name = req_distinguished_name -attributes = req_attributes -prompt = no - -[ req_distinguished_name ] -C = US -ST = CA -L = Oakland -O = request -OU = testing -CN = testing.request.mikealrogers.com -emailAddress = mikeal@mikealrogers.com - -[ req_attributes ] -challengePassword = password challenge - diff --git a/node_modules/jsdom/node_modules/request/tests/ssl/ca/server.crt b/node_modules/jsdom/node_modules/request/tests/ssl/ca/server.crt deleted file mode 100644 index efe96ce..0000000 --- a/node_modules/jsdom/node_modules/request/tests/ssl/ca/server.crt +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICejCCAeMCCQCt9iAWqkDJwzANBgkqhkiG9w0BAQUFADCBojELMAkGA1UEBhMC -VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMRAwDgYDVQQKEwdyZXF1 -ZXN0MSYwJAYDVQQLEx1yZXF1ZXN0IENlcnRpZmljYXRlIEF1dGhvcml0eTESMBAG -A1UEAxMJcmVxdWVzdENBMSYwJAYJKoZIhvcNAQkBFhdtaWtlYWxAbWlrZWFscm9n -ZXJzLmNvbTAeFw0xMjAzMDEyMjUwNTZaFw0yMjAyMjcyMjUwNTZaMIGjMQswCQYD -VQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNVBAcTB09ha2xhbmQxEDAOBgNVBAoT -B3JlcXVlc3QxEDAOBgNVBAsTB3Rlc3RpbmcxKTAnBgNVBAMTIHRlc3RpbmcucmVx -dWVzdC5taWtlYWxyb2dlcnMuY29tMSYwJAYJKoZIhvcNAQkBFhdtaWtlYWxAbWlr -ZWFscm9nZXJzLmNvbTBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDgVl0jMumvOpmM -20W5v9yhGgZj8hPhEQF/N7yCBVBn/rWGYm70IHC8T/pR5c0LkWc5gdnCJEvKWQjh -DBKxZD8FAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEABShRkNgFbgs4vUWW9R9deNJj -7HJoiTmvkmoOC7QzcYkjdgHbOxsSq3rBnwxsVjY9PAtPwBn0GRspOeG7KzKRgySB -kb22LyrCFKbEOfKO/+CJc80ioK9zEPVjGsFMyAB+ftYRqM+s/4cQlTg/m89l01wC -yapjN3RxZbInGhWR+jA= ------END CERTIFICATE----- diff --git a/node_modules/jsdom/node_modules/request/tests/ssl/ca/server.csr b/node_modules/jsdom/node_modules/request/tests/ssl/ca/server.csr deleted file mode 100644 index a8e7595..0000000 --- a/node_modules/jsdom/node_modules/request/tests/ssl/ca/server.csr +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIBgjCCASwCAQAwgaMxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEQMA4GA1UE -BxMHT2FrbGFuZDEQMA4GA1UEChMHcmVxdWVzdDEQMA4GA1UECxMHdGVzdGluZzEp -MCcGA1UEAxMgdGVzdGluZy5yZXF1ZXN0Lm1pa2VhbHJvZ2Vycy5jb20xJjAkBgkq -hkiG9w0BCQEWF21pa2VhbEBtaWtlYWxyb2dlcnMuY29tMFwwDQYJKoZIhvcNAQEB -BQADSwAwSAJBAOBWXSMy6a86mYzbRbm/3KEaBmPyE+ERAX83vIIFUGf+tYZibvQg -cLxP+lHlzQuRZzmB2cIkS8pZCOEMErFkPwUCAwEAAaAjMCEGCSqGSIb3DQEJBzEU -ExJwYXNzd29yZCBjaGFsbGVuZ2UwDQYJKoZIhvcNAQEFBQADQQBD3E5WekQzCEJw -7yOcqvtPYIxGaX8gRKkYfLPoj3pm3GF5SGqtJKhylKfi89szHXgktnQgzff9FN+A -HidVJ/3u ------END CERTIFICATE REQUEST----- diff --git a/node_modules/jsdom/node_modules/request/tests/ssl/ca/server.js b/node_modules/jsdom/node_modules/request/tests/ssl/ca/server.js deleted file mode 100644 index 05e21c1..0000000 --- a/node_modules/jsdom/node_modules/request/tests/ssl/ca/server.js +++ /dev/null @@ -1,28 +0,0 @@ -var fs = require("fs") -var https = require("https") -var options = { key: fs.readFileSync("./server.key") - , cert: fs.readFileSync("./server.crt") } - -var server = https.createServer(options, function (req, res) { - res.writeHead(200) - res.end() - server.close() -}) -server.listen(1337) - -var ca = fs.readFileSync("./ca.crt") -var agent = new https.Agent({ host: "localhost", port: 1337, ca: ca }) - -https.request({ host: "localhost" - , method: "HEAD" - , port: 1337 - , headers: { host: "testing.request.mikealrogers.com" } - , agent: agent - , ca: [ ca ] - , path: "/" }, function (res) { - if (res.client.authorized) { - console.log("node test: OK") - } else { - throw new Error(res.client.authorizationError) - } -}).end() diff --git a/node_modules/jsdom/node_modules/request/tests/ssl/ca/server.key b/node_modules/jsdom/node_modules/request/tests/ssl/ca/server.key deleted file mode 100644 index 72d8698..0000000 --- a/node_modules/jsdom/node_modules/request/tests/ssl/ca/server.key +++ /dev/null @@ -1,9 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIBOwIBAAJBAOBWXSMy6a86mYzbRbm/3KEaBmPyE+ERAX83vIIFUGf+tYZibvQg -cLxP+lHlzQuRZzmB2cIkS8pZCOEMErFkPwUCAwEAAQJAK+r8ZM2sze8s7FRo/ApB -iRBtO9fCaIdJwbwJnXKo4RKwZDt1l2mm+fzZ+/QaQNjY1oTROkIIXmnwRvZWfYlW -gQIhAPKYsG+YSBN9o8Sdp1DMyZ/rUifKX3OE6q9tINkgajDVAiEA7Ltqh01+cnt0 -JEnud/8HHcuehUBLMofeg0G+gCnSbXECIQCqDvkXsWNNLnS/3lgsnvH0Baz4sbeJ -rjIpuVEeg8eM5QIgbu0+9JmOV6ybdmmiMV4yAncoF35R/iKGVHDZCAsQzDECIQDZ -0jGz22tlo5YMcYSqrdD3U4sds1pwiAaWFRbCunoUJw== ------END RSA PRIVATE KEY----- diff --git a/node_modules/jsdom/node_modules/request/tests/ssl/npm-ca.crt b/node_modules/jsdom/node_modules/request/tests/ssl/npm-ca.crt deleted file mode 100644 index fde2fe9..0000000 --- a/node_modules/jsdom/node_modules/request/tests/ssl/npm-ca.crt +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIChzCCAfACCQDauvz/KHp8ejANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMC -VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMQwwCgYDVQQKEwNucG0x -IjAgBgNVBAsTGW5wbSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxDjAMBgNVBAMTBW5w -bUNBMRcwFQYJKoZIhvcNAQkBFghpQGl6cy5tZTAeFw0xMTA5MDUwMTQ3MTdaFw0y -MTA5MDIwMTQ3MTdaMIGHMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNV -BAcTB09ha2xhbmQxDDAKBgNVBAoTA25wbTEiMCAGA1UECxMZbnBtIENlcnRpZmlj -YXRlIEF1dGhvcml0eTEOMAwGA1UEAxMFbnBtQ0ExFzAVBgkqhkiG9w0BCQEWCGlA -aXpzLm1lMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLI4tIqPpRW+ACw9GE -OgBlJZwK5f8nnKCLK629Pv5yJpQKs3DENExAyOgDcyaF0HD0zk8zTp+ZsLaNdKOz -Gn2U181KGprGKAXP6DU6ByOJDWmTlY6+Ad1laYT0m64fERSpHw/hjD3D+iX4aMOl -y0HdbT5m1ZGh6SJz3ZqxavhHLQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAC4ySDbC -l7W1WpLmtLGEQ/yuMLUf6Jy/vr+CRp4h+UzL+IQpCv8FfxsYE7dhf/bmWTEupBkv -yNL18lipt2jSvR3v6oAHAReotvdjqhxddpe5Holns6EQd1/xEZ7sB1YhQKJtvUrl -ZNufy1Jf1r0ldEGeA+0ISck7s+xSh9rQD2Op ------END CERTIFICATE----- diff --git a/node_modules/jsdom/node_modules/request/tests/ssl/test.crt b/node_modules/jsdom/node_modules/request/tests/ssl/test.crt deleted file mode 100644 index b357f86..0000000 --- a/node_modules/jsdom/node_modules/request/tests/ssl/test.crt +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICQzCCAawCCQCO/XWtRFck1jANBgkqhkiG9w0BAQUFADBmMQswCQYDVQQGEwJU -SDEQMA4GA1UECBMHQmFuZ2tvazEOMAwGA1UEBxMFU2lsb20xGzAZBgNVBAoTElRo -ZSBSZXF1ZXN0IE1vZHVsZTEYMBYGA1UEAxMPcmVxdWVzdC5leGFtcGxlMB4XDTEx -MTIwMzAyMjkyM1oXDTIxMTEzMDAyMjkyM1owZjELMAkGA1UEBhMCVEgxEDAOBgNV -BAgTB0Jhbmdrb2sxDjAMBgNVBAcTBVNpbG9tMRswGQYDVQQKExJUaGUgUmVxdWVz -dCBNb2R1bGUxGDAWBgNVBAMTD3JlcXVlc3QuZXhhbXBsZTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwmctddZqlA48+NXs0yOy92DijcQV1jf87zMiYAIlNUto -wghVbTWgJU5r0pdKrD16AptnWJTzKanhItEX8XCCPgsNkq1afgTtJP7rNkwu3xcj -eIMkhJg/ay4ZnkbnhYdsii5VTU5prix6AqWRAhbkBgoA+iVyHyof8wvZyKBoFTMC -AwEAATANBgkqhkiG9w0BAQUFAAOBgQB6BybMJbpeiABgihDfEVBcAjDoQ8gUMgwV -l4NulugfKTDmArqnR9aPd4ET5jX5dkMP4bwCHYsvrcYDeWEQy7x5WWuylOdKhua4 -L4cEi2uDCjqEErIG3cc1MCOk6Cl6Ld6tkIzQSf953qfdEACRytOeUqLNQcrXrqeE -c7U8F6MWLQ== ------END CERTIFICATE----- diff --git a/node_modules/jsdom/node_modules/request/tests/ssl/test.key b/node_modules/jsdom/node_modules/request/tests/ssl/test.key deleted file mode 100644 index b85810d..0000000 --- a/node_modules/jsdom/node_modules/request/tests/ssl/test.key +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIICXgIBAAKBgQDCZy111mqUDjz41ezTI7L3YOKNxBXWN/zvMyJgAiU1S2jCCFVt -NaAlTmvSl0qsPXoCm2dYlPMpqeEi0RfxcII+Cw2SrVp+BO0k/us2TC7fFyN4gySE -mD9rLhmeRueFh2yKLlVNTmmuLHoCpZECFuQGCgD6JXIfKh/zC9nIoGgVMwIDAQAB -AoGBALXFwfUf8vHTSmGlrdZS2AGFPvEtuvldyoxi9K5u8xmdFCvxnOcLsF2RsTHt -Mu5QYWhUpNJoG+IGLTPf7RJdj/kNtEs7xXqWy4jR36kt5z5MJzqiK+QIgiO9UFWZ -fjUb6oeDnTIJA9YFBdYi97MDuL89iU/UK3LkJN3hd4rciSbpAkEA+MCkowF5kSFb -rkOTBYBXZfiAG78itDXN6DXmqb9XYY+YBh3BiQM28oxCeQYyFy6pk/nstnd4TXk6 -V/ryA2g5NwJBAMgRKTY9KvxJWbESeMEFe2iBIV0c26/72Amgi7ZKUCLukLfD4tLF -+WSZdmTbbqI1079YtwaiOVfiLm45Q/3B0eUCQAaQ/0eWSGE+Yi8tdXoVszjr4GXb -G81qBi91DMu6U1It+jNfIba+MPsiHLcZJMVb4/oWBNukN7bD1nhwFWdlnu0CQQCf -Is9WHkdvz2RxbZDxb8verz/7kXXJQJhx5+rZf7jIYFxqX3yvTNv3wf2jcctJaWlZ -fVZwB193YSivcgt778xlAkEAprYUz3jczjF5r2hrgbizPzPDR94tM5BTO3ki2v3w -kbf+j2g7FNAx6kZiVN8XwfLc8xEeUGiPKwtq3ddPDFh17w== ------END RSA PRIVATE KEY----- diff --git a/node_modules/jsdom/node_modules/request/tests/test-body.js b/node_modules/jsdom/node_modules/request/tests/test-body.js deleted file mode 100644 index a624397..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-body.js +++ /dev/null @@ -1,117 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , request = require('../main.js') - ; - -var s = server.createServer(); - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetBuffer : - { resp : server.createGetResponse(new Buffer("TESTING!")) - , encoding: null - , expectBody: new Buffer("TESTING!") - } - , testGetEncoding : - { resp : server.createGetResponse(new Buffer('efa3bfcea9e29883', 'hex')) - , encoding: 'hex' - , expectBody: "efa3bfcea9e29883" - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - , testPutMultipartPreambleCRLF : - { resp: server.createPostValidator( - '\r\n--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , preambleCRLF: true - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - test.uri = s.url + '/' + i - request(test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - console.log(Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) - diff --git a/node_modules/jsdom/node_modules/request/tests/test-cookie.js b/node_modules/jsdom/node_modules/request/tests/test-cookie.js deleted file mode 100644 index 6c6a7a7..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-cookie.js +++ /dev/null @@ -1,29 +0,0 @@ -var Cookie = require('../vendor/cookie') - , assert = require('assert'); - -var str = 'Sid="s543qactge.wKE61E01Bs%2BKhzmxrwrnug="; Path=/; httpOnly; Expires=Sat, 04 Dec 2010 23:27:28 GMT'; -var cookie = new Cookie(str); - -// test .toString() -assert.equal(cookie.toString(), str); - -// test .path -assert.equal(cookie.path, '/'); - -// test .httpOnly -assert.equal(cookie.httpOnly, true); - -// test .name -assert.equal(cookie.name, 'Sid'); - -// test .value -assert.equal(cookie.value, '"s543qactge.wKE61E01Bs%2BKhzmxrwrnug="'); - -// test .expires -assert.equal(cookie.expires instanceof Date, true); - -// test .path default -var cookie = new Cookie('foo=bar', { url: 'http://foo.com/bar' }); -assert.equal(cookie.path, '/bar'); - -console.log('All tests passed'); diff --git a/node_modules/jsdom/node_modules/request/tests/test-cookiejar.js b/node_modules/jsdom/node_modules/request/tests/test-cookiejar.js deleted file mode 100644 index 76fcd71..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-cookiejar.js +++ /dev/null @@ -1,90 +0,0 @@ -var Cookie = require('../vendor/cookie') - , Jar = require('../vendor/cookie/jar') - , assert = require('assert'); - -function expires(ms) { - return new Date(Date.now() + ms).toUTCString(); -} - -// test .get() expiration -(function() { - var jar = new Jar; - var cookie = new Cookie('sid=1234; path=/; expires=' + expires(1000)); - jar.add(cookie); - setTimeout(function(){ - var cookies = jar.get({ url: 'http://foo.com/foo' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], cookie); - setTimeout(function(){ - var cookies = jar.get({ url: 'http://foo.com/foo' }); - assert.equal(cookies.length, 0); - }, 1000); - }, 5); -})(); - -// test .get() path support -(function() { - var jar = new Jar; - var a = new Cookie('sid=1234; path=/'); - var b = new Cookie('sid=1111; path=/foo/bar'); - var c = new Cookie('sid=2222; path=/'); - jar.add(a); - jar.add(b); - jar.add(c); - - // should remove the duplicates - assert.equal(jar.cookies.length, 2); - - // same name, same path, latter prevails - var cookies = jar.get({ url: 'http://foo.com/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], c); - - // same name, diff path, path specifity prevails, latter prevails - var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], b); - - var jar = new Jar; - var a = new Cookie('sid=1111; path=/foo/bar'); - var b = new Cookie('sid=1234; path=/'); - jar.add(a); - jar.add(b); - - var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], a); - - var cookies = jar.get({ url: 'http://foo.com/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], b); - - var jar = new Jar; - var a = new Cookie('sid=1111; path=/foo/bar'); - var b = new Cookie('sid=3333; path=/foo/bar'); - var c = new Cookie('pid=3333; path=/foo/bar'); - var d = new Cookie('sid=2222; path=/foo/'); - var e = new Cookie('sid=1234; path=/'); - jar.add(a); - jar.add(b); - jar.add(c); - jar.add(d); - jar.add(e); - - var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); - assert.equal(cookies.length, 2); - assert.equal(cookies[0], b); - assert.equal(cookies[1], c); - - var cookies = jar.get({ url: 'http://foo.com/foo/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], d); - - var cookies = jar.get({ url: 'http://foo.com/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], e); -})(); - -setTimeout(function() { - console.log('All tests passed'); -}, 1200); diff --git a/node_modules/jsdom/node_modules/request/tests/test-defaults.js b/node_modules/jsdom/node_modules/request/tests/test-defaults.js deleted file mode 100644 index ba09418..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-defaults.js +++ /dev/null @@ -1,114 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - ; - -var s = server.createServer(); - -s.listen(s.port, function () { - var counter = 0; - s.on('/get', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.method, 'GET') - resp.writeHead(200, {'Content-Type': 'text/plain'}); - resp.end('TESTING!'); - }); - - // test get(string, function) - request.defaults({headers:{foo:"bar"}})(s.url + '/get', function (e, r, b){ - if (e) throw e; - assert.deepEqual("TESTING!", b); - counter += 1; - }); - - s.on('/post', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.headers['content-type'], null); - assert.equal(req.method, 'POST') - resp.writeHead(200, {'Content-Type': 'application/json'}); - resp.end(JSON.stringify({foo:'bar'})); - }); - - // test post(string, object, function) - request.defaults({headers:{foo:"bar"}}).post(s.url + '/post', {json: true}, function (e, r, b){ - if (e) throw e; - assert.deepEqual('bar', b.foo); - counter += 1; - }); - - s.on('/post-body', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.headers['content-type'], 'application/json'); - assert.equal(req.method, 'POST') - resp.writeHead(200, {'Content-Type': 'application/json'}); - resp.end(JSON.stringify({foo:'bar'})); - }); - - // test post(string, object, function) with body - request.defaults({headers:{foo:"bar"}}).post(s.url + '/post-body', {json: true, body:{bar:"baz"}}, function (e, r, b){ - if (e) throw e; - assert.deepEqual('bar', b.foo); - counter += 1; - }); - - s.on('/del', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.method, 'DELETE') - resp.writeHead(200, {'Content-Type': 'application/json'}); - resp.end(JSON.stringify({foo:'bar'})); - }); - - // test .del(string, function) - request.defaults({headers:{foo:"bar"}, json:true}).del(s.url + '/del', function (e, r, b){ - if (e) throw e; - assert.deepEqual('bar', b.foo); - counter += 1; - }); - - s.on('/head', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.method, 'HEAD') - resp.writeHead(200, {'Content-Type': 'text/plain'}); - resp.end(); - }); - - // test head.(object, function) - request.defaults({headers:{foo:"bar"}}).head({uri: s.url + '/head'}, function (e, r, b){ - if (e) throw e; - counter += 1; - }); - - s.on('/get_custom', function(req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.headers.x, 'y'); - resp.writeHead(200, {'Content-Type': 'text/plain'}); - resp.end(); - }); - - // test custom request handler function - var defaultRequest = request.defaults({ - headers:{foo:"bar"} - , body: 'TESTING!' - }, function(uri, options, callback) { - var params = request.initParams(uri, options, callback); - options = params.options; - options.headers.x = 'y'; - - return request(params.uri, params.options, params.callback); - }); - - var msg = 'defaults test failed. head request should throw earlier'; - assert.throws(function() { - defaultRequest.head(s.url + '/get_custom', function(e, r, b) { - throw new Error(msg); - }); - counter+=1; - }, msg); - - defaultRequest.get(s.url + '/get_custom', function(e, r, b) { - if(e) throw e; - counter += 1; - console.log(counter.toString() + " tests passed."); - s.close(); - }); -}) diff --git a/node_modules/jsdom/node_modules/request/tests/test-errors.js b/node_modules/jsdom/node_modules/request/tests/test-errors.js deleted file mode 100644 index 1986a59..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-errors.js +++ /dev/null @@ -1,37 +0,0 @@ -var server = require('./server') - , events = require('events') - , assert = require('assert') - , request = require('../main.js') - ; - -var local = 'http://localhost:8888/asdf' - -try { - request({uri:local, body:{}}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Argument error, options.body.') -} - -try { - request({uri:local, multipart: 'foo'}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Argument error, options.multipart.') -} - -try { - request({uri:local, multipart: [{}]}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Body attribute missing in multipart.') -} - -try { - request(local, {multipart: [{}]}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Body attribute missing in multipart.') -} - -console.log("All tests passed.") diff --git a/node_modules/jsdom/node_modules/request/tests/test-follow-all-303.js b/node_modules/jsdom/node_modules/request/tests/test-follow-all-303.js deleted file mode 100644 index 3f2162d..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-follow-all-303.js +++ /dev/null @@ -1,30 +0,0 @@ -var request = require('../main'); -var http = require('http'); -var requests = 0; -var assert = require('assert'); - -var server = http.createServer(function (req, res) { - console.error(req.method, req.url); - requests ++; - - if (req.method === 'POST') { - console.error('send 303'); - res.setHeader('location', req.url); - res.statusCode = 303; - res.end('try again, i guess\n'); - } else { - console.error('send 200') - res.end('ok: ' + requests); - } -}); -server.listen(6767); - -request.post({ url: 'http://localhost:6767/foo', - followAllRedirects: true, - form: { foo: 'bar' } }, function (er, req, body) { - if (er) throw er; - assert.equal(body, 'ok: 2'); - assert.equal(requests, 2); - console.error('ok - ' + process.version); - server.close(); -}); diff --git a/node_modules/jsdom/node_modules/request/tests/test-follow-all.js b/node_modules/jsdom/node_modules/request/tests/test-follow-all.js deleted file mode 100644 index b78745b..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-follow-all.js +++ /dev/null @@ -1,35 +0,0 @@ -var request = require('../main'); -var http = require('http'); -var requests = 0; -var assert = require('assert'); - -var server = http.createServer(function (req, res) { - requests ++; - - // redirect everything 3 times, no matter what. - var c = req.headers.cookie; - - if (!c) c = 0; - else c = +c.split('=')[1] || 0; - - if (c > 3) { - res.end('ok: '+requests); - return; - } - - res.setHeader('set-cookie', 'c=' + (c + 1)); - res.setHeader('location', req.url); - res.statusCode = 302; - res.end('try again, i guess\n'); -}); -server.listen(6767); - -request.post({ url: 'http://localhost:6767/foo', - followAllRedirects: true, - form: { foo: 'bar' } }, function (er, req, body) { - if (er) throw er; - assert.equal(body, 'ok: 5'); - assert.equal(requests, 5); - console.error('ok - ' + process.version); - server.close(); -}); diff --git a/node_modules/jsdom/node_modules/request/tests/test-form.js b/node_modules/jsdom/node_modules/request/tests/test-form.js deleted file mode 100644 index aeefd31..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-form.js +++ /dev/null @@ -1,79 +0,0 @@ -var assert = require('assert') -var http = require('http'); -var path = require('path'); -var mime = require('mime'); -var request = require('../main.js'); -var fs = require('fs'); - -var remoteFile = 'http://nodejs.org/images/logo.png'; - -var FIELDS = [ - {name: 'my_field', value: 'my_value'}, - {name: 'my_buffer', value: new Buffer([1, 2, 3])}, - {name: 'my_file', value: fs.createReadStream(__dirname + '/unicycle.jpg')}, - {name: 'remote_file', value: request(remoteFile) } -]; - -var server = http.createServer(function(req, res) { - - // temp workaround - var data = ''; - req.setEncoding('utf8'); - - req.on('data', function(d) { - data += d; - }); - - req.on('end', function() { - // check for the fields' traces - - // 1st field : my_field - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 2nd field : my_buffer - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 3rd field : my_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for unicycle.jpg traces - assert.ok( data.indexOf('2005:06:21 01:44:12') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(field.value.path) ) != -1 ); - - // 4th field : remote_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for http://nodejs.org/images/logo.png traces - assert.ok( data.indexOf('ImageReady') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 ); - - res.writeHead(200); - res.end('done'); - - }); - - -}); - -server.listen(8080, function() { - - var req = request.post('http://localhost:8080/upload', function () { - server.close(); - }) - var form = req.form() - - FIELDS.forEach(function(field) { - form.append(field.name, field.value); - }); - -}); - -process.on('exit', function() { - assert.strictEqual(FIELDS.length, 0); -}); diff --git a/node_modules/jsdom/node_modules/request/tests/test-headers.js b/node_modules/jsdom/node_modules/request/tests/test-headers.js deleted file mode 100644 index 31fe3f4..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-headers.js +++ /dev/null @@ -1,52 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - , Cookie = require('../vendor/cookie') - , Jar = require('../vendor/cookie/jar') - , s = server.createServer() - -s.listen(s.port, function () { - var serverUri = 'http://localhost:' + s.port - , numTests = 0 - , numOutstandingTests = 0 - - function createTest(requestObj, serverAssertFn) { - var testNumber = numTests; - numTests += 1; - numOutstandingTests += 1; - s.on('/' + testNumber, function (req, res) { - serverAssertFn(req, res); - res.writeHead(200); - res.end(); - }); - requestObj.url = serverUri + '/' + testNumber - request(requestObj, function (err, res, body) { - assert.ok(!err) - assert.equal(res.statusCode, 200) - numOutstandingTests -= 1 - if (numOutstandingTests === 0) { - console.log(numTests + ' tests passed.') - s.close() - } - }) - } - - // Issue #125: headers.cookie shouldn't be replaced when a cookie jar isn't specified - createTest({headers: {cookie: 'foo=bar'}}, function (req, res) { - assert.ok(req.headers.cookie) - assert.equal(req.headers.cookie, 'foo=bar') - }) - - // Issue #125: headers.cookie + cookie jar - var jar = new Jar() - jar.add(new Cookie('quux=baz')); - createTest({jar: jar, headers: {cookie: 'foo=bar'}}, function (req, res) { - assert.ok(req.headers.cookie) - assert.equal(req.headers.cookie, 'foo=bar; quux=baz') - }) - - // There should be no cookie header when neither headers.cookie nor a cookie jar is specified - createTest({}, function (req, res) { - assert.ok(!req.headers.cookie) - }) -}) diff --git a/node_modules/jsdom/node_modules/request/tests/test-httpModule.js b/node_modules/jsdom/node_modules/request/tests/test-httpModule.js deleted file mode 100644 index 1866de2..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-httpModule.js +++ /dev/null @@ -1,94 +0,0 @@ -var http = require('http') - , https = require('https') - , server = require('./server') - , assert = require('assert') - , request = require('../main.js') - - -var faux_requests_made = {'http':0, 'https':0} -function wrap_request(name, module) { - // Just like the http or https module, but note when a request is made. - var wrapped = {} - Object.keys(module).forEach(function(key) { - var value = module[key]; - - if(key != 'request') - wrapped[key] = value; - else - wrapped[key] = function(options, callback) { - faux_requests_made[name] += 1 - return value.apply(this, arguments) - } - }) - - return wrapped; -} - - -var faux_http = wrap_request('http', http) - , faux_https = wrap_request('https', https) - , plain_server = server.createServer() - , https_server = server.createSSLServer() - - -plain_server.listen(plain_server.port, function() { - plain_server.on('/plain', function (req, res) { - res.writeHead(200) - res.end('plain') - }) - plain_server.on('/to_https', function (req, res) { - res.writeHead(301, {'location':'https://localhost:'+https_server.port + '/https'}) - res.end() - }) - - https_server.listen(https_server.port, function() { - https_server.on('/https', function (req, res) { - res.writeHead(200) - res.end('https') - }) - https_server.on('/to_plain', function (req, res) { - res.writeHead(302, {'location':'http://localhost:'+plain_server.port + '/plain'}) - res.end() - }) - - run_tests() - run_tests({}) - run_tests({'http:':faux_http}) - run_tests({'https:':faux_https}) - run_tests({'http:':faux_http, 'https:':faux_https}) - }) -}) - -function run_tests(httpModules) { - var to_https = 'http://localhost:'+plain_server.port+'/to_https' - var to_plain = 'https://localhost:'+https_server.port+'/to_plain' - - request(to_https, {'httpModules':httpModules}, function (er, res, body) { - assert.ok(!er, 'Bounce to SSL worked') - assert.equal(body, 'https', 'Received HTTPS server body') - done() - }) - - request(to_plain, {'httpModules':httpModules}, function (er, res, body) { - assert.ok(!er, 'Bounce to plaintext server worked') - assert.equal(body, 'plain', 'Received HTTPS server body') - done() - }) -} - - -var passed = 0; -function done() { - passed += 1 - var expected = 10 - - if(passed == expected) { - plain_server.close() - https_server.close() - - assert.equal(faux_requests_made.http, 4, 'Wrapped http module called appropriately') - assert.equal(faux_requests_made.https, 4, 'Wrapped https module called appropriately') - - console.log((expected+2) + ' tests passed.') - } -} diff --git a/node_modules/jsdom/node_modules/request/tests/test-https-strict.js b/node_modules/jsdom/node_modules/request/tests/test-https-strict.js deleted file mode 100644 index 470b68d..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-https-strict.js +++ /dev/null @@ -1,97 +0,0 @@ -// a test where we validate the siguature of the keys -// otherwise exactly the same as the ssl test - -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - , fs = require('fs') - , path = require('path') - , opts = { key: path.resolve(__dirname, 'ssl/ca/server.key') - , cert: path.resolve(__dirname, 'ssl/ca/server.crt') } - , s = server.createSSLServer(null, opts) - , caFile = path.resolve(__dirname, 'ssl/ca/ca.crt') - , ca = fs.readFileSync(caFile) - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - test.uri = s.url + '/' + i - test.strictSSL = true - test.ca = ca - test.headers = { host: 'testing.request.mikealrogers.com' } - request(test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - console.log(Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) diff --git a/node_modules/jsdom/node_modules/request/tests/test-https.js b/node_modules/jsdom/node_modules/request/tests/test-https.js deleted file mode 100644 index 58e7db9..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-https.js +++ /dev/null @@ -1,86 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - -var s = server.createSSLServer(); - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - test.uri = s.url + '/' + i - request(test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - console.log(Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) diff --git a/node_modules/jsdom/node_modules/request/tests/test-oauth.js b/node_modules/jsdom/node_modules/request/tests/test-oauth.js deleted file mode 100644 index 72ca923..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-oauth.js +++ /dev/null @@ -1,117 +0,0 @@ -var hmacsign = require('../oauth').hmacsign - , assert = require('assert') - , qs = require('querystring') - , request = require('../main') - ; - -function getsignature (r) { - var sign - r.headers.Authorization.slice('OAuth '.length).replace(/,\ /g, ',').split(',').forEach(function (v) { - if (v.slice(0, 'oauth_signature="'.length) === 'oauth_signature="') sign = v.slice('oauth_signature="'.length, -1) - }) - return decodeURIComponent(sign) -} - -// Tests from Twitter documentation https://dev.twitter.com/docs/auth/oauth - -var reqsign = hmacsign('POST', 'https://api.twitter.com/oauth/request_token', - { oauth_callback: 'http://localhost:3005/the_dance/process_callback?service_provider_id=11' - , oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' - , oauth_nonce: 'QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk' - , oauth_signature_method: 'HMAC-SHA1' - , oauth_timestamp: '1272323042' - , oauth_version: '1.0' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98") - -console.log(reqsign) -console.log('8wUi7m5HFQy76nowoCThusfgB+Q=') -assert.equal(reqsign, '8wUi7m5HFQy76nowoCThusfgB+Q=') - -var accsign = hmacsign('POST', 'https://api.twitter.com/oauth/access_token', - { oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' - , oauth_nonce: '9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8' - , oauth_signature_method: 'HMAC-SHA1' - , oauth_token: '8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc' - , oauth_timestamp: '1272323047' - , oauth_verifier: 'pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY' - , oauth_version: '1.0' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA") - -console.log(accsign) -console.log('PUw/dHA4fnlJYM6RhXk5IU/0fCc=') -assert.equal(accsign, 'PUw/dHA4fnlJYM6RhXk5IU/0fCc=') - -var upsign = hmacsign('POST', 'http://api.twitter.com/1/statuses/update.json', - { oauth_consumer_key: "GDdmIQH6jhtmLUypg82g" - , oauth_nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y" - , oauth_signature_method: "HMAC-SHA1" - , oauth_token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw" - , oauth_timestamp: "1272325550" - , oauth_version: "1.0" - , status: 'setting up my twitter 私のさえずりを設定する' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA") - -console.log(upsign) -console.log('yOahq5m0YjDDjfjxHaXEsW9D+X0=') -assert.equal(upsign, 'yOahq5m0YjDDjfjxHaXEsW9D+X0=') - - -var rsign = request.post( - { url: 'https://api.twitter.com/oauth/request_token' - , oauth: - { callback: 'http://localhost:3005/the_dance/process_callback?service_provider_id=11' - , consumer_key: 'GDdmIQH6jhtmLUypg82g' - , nonce: 'QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk' - , timestamp: '1272323042' - , version: '1.0' - , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" - } - }) - -setTimeout(function () { - console.log(getsignature(rsign)) - assert.equal(reqsign, getsignature(rsign)) -}) - -var raccsign = request.post( - { url: 'https://api.twitter.com/oauth/access_token' - , oauth: - { consumer_key: 'GDdmIQH6jhtmLUypg82g' - , nonce: '9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8' - , signature_method: 'HMAC-SHA1' - , token: '8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc' - , timestamp: '1272323047' - , verifier: 'pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY' - , version: '1.0' - , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" - , token_secret: "x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA" - } - }) - -setTimeout(function () { - console.log(getsignature(raccsign)) - assert.equal(accsign, getsignature(raccsign)) -}, 1) - -var rupsign = request.post( - { url: 'http://api.twitter.com/1/statuses/update.json' - , oauth: - { consumer_key: "GDdmIQH6jhtmLUypg82g" - , nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y" - , signature_method: "HMAC-SHA1" - , token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw" - , timestamp: "1272325550" - , version: "1.0" - , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" - , token_secret: "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA" - } - , form: {status: 'setting up my twitter 私のさえずりを設定する'} - }) -setTimeout(function () { - console.log(getsignature(rupsign)) - assert.equal(upsign, getsignature(rupsign)) -}, 1) - - - - diff --git a/node_modules/jsdom/node_modules/request/tests/test-params.js b/node_modules/jsdom/node_modules/request/tests/test-params.js deleted file mode 100644 index 5ddb311..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-params.js +++ /dev/null @@ -1,92 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - ; - -var s = server.createServer(); - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetBuffer : - { resp : server.createGetResponse(new Buffer("TESTING!")) - , encoding: null - , expectBody: new Buffer("TESTING!") - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - //test.uri = s.url + '/' + i - request(s.url + '/' + i, test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - console.log(Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) diff --git a/node_modules/jsdom/node_modules/request/tests/test-piped-redirect.js b/node_modules/jsdom/node_modules/request/tests/test-piped-redirect.js deleted file mode 100644 index 25bf35d..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-piped-redirect.js +++ /dev/null @@ -1,52 +0,0 @@ -var http = require('http') - , assert = require('assert') - , request = require('../main.js') - ; - -var portOne = 8968 - , portTwo = 8969 - ; - - -// server one -var s1 = http.createServer(function (req, resp) -{ - if (req.url == '/original') - { - resp.writeHeader(302, {'location': '/redirected'}) - resp.end() - } - else if (req.url == '/redirected') - { - resp.writeHeader(200, {'content-type': 'text/plain'}) - resp.write('OK') - resp.end() - } - -}).listen(portOne); - - -// server two -var s2 = http.createServer(function (req, resp) -{ - - var x = request('http://localhost:'+portOne+'/original') - req.pipe(x) - x.pipe(resp) - -}).listen(portTwo, function() -{ - - var r = request('http://localhost:'+portTwo+'/original', function (err, res, body) { - - assert.equal(body, 'OK') - - s1.close() - s2.close() - - }); - - // it hangs, so wait a second :) - r.timeout = 1000; - -}); diff --git a/node_modules/jsdom/node_modules/request/tests/test-pipes.js b/node_modules/jsdom/node_modules/request/tests/test-pipes.js deleted file mode 100644 index 7162981..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-pipes.js +++ /dev/null @@ -1,216 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , fs = require('fs') - , request = require('../main.js') - , path = require('path') - , util = require('util') - ; - -var s = server.createServer(3453); - -function ValidationStream(str) { - this.str = str - this.buf = '' - this.on('data', function (data) { - this.buf += data - }) - this.on('end', function () { - assert.equal(this.str, this.buf) - }) - this.writable = true -} -util.inherits(ValidationStream, stream.Stream) -ValidationStream.prototype.write = function (chunk) { - this.emit('data', chunk) -} -ValidationStream.prototype.end = function (chunk) { - if (chunk) emit('data', chunk) - this.emit('end') -} - -s.listen(s.port, function () { - counter = 0; - - var check = function () { - counter = counter - 1 - if (counter === 0) { - console.log('All tests passed.') - setTimeout(function () { - process.exit(); - }, 500) - } - } - - // Test pipeing to a request object - s.once('/push', server.createPostValidator("mydata")); - - var mydata = new stream.Stream(); - mydata.readable = true - - counter++ - var r1 = request.put({url:'http://localhost:3453/push'}, function () { - check(); - }) - mydata.pipe(r1) - - mydata.emit('data', 'mydata'); - mydata.emit('end'); - - // Test pipeing to a request object with a json body - s.once('/push-json', server.createPostValidator("{\"foo\":\"bar\"}", "application/json")); - - var mybodydata = new stream.Stream(); - mybodydata.readable = true - - counter++ - var r2 = request.put({url:'http://localhost:3453/push-json',json:true}, function () { - check(); - }) - mybodydata.pipe(r2) - - mybodydata.emit('data', JSON.stringify({foo:"bar"})); - mybodydata.emit('end'); - - // Test pipeing from a request object. - s.once('/pull', server.createGetResponse("mypulldata")); - - var mypulldata = new stream.Stream(); - mypulldata.writable = true - - counter++ - request({url:'http://localhost:3453/pull'}).pipe(mypulldata) - - var d = ''; - - mypulldata.write = function (chunk) { - d += chunk; - } - mypulldata.end = function () { - assert.equal(d, 'mypulldata'); - check(); - }; - - - s.on('/cat', function (req, resp) { - if (req.method === "GET") { - resp.writeHead(200, {'content-type':'text/plain-test', 'content-length':4}); - resp.end('asdf') - } else if (req.method === "PUT") { - assert.equal(req.headers['content-type'], 'text/plain-test'); - assert.equal(req.headers['content-length'], 4) - var validate = ''; - - req.on('data', function (chunk) {validate += chunk}) - req.on('end', function () { - resp.writeHead(201); - resp.end(); - assert.equal(validate, 'asdf'); - check(); - }) - } - }) - s.on('/pushjs', function (req, resp) { - if (req.method === "PUT") { - assert.equal(req.headers['content-type'], 'application/javascript'); - check(); - } - }) - s.on('/catresp', function (req, resp) { - request.get('http://localhost:3453/cat').pipe(resp) - }) - s.on('/doodle', function (req, resp) { - if (req.headers['x-oneline-proxy']) { - resp.setHeader('x-oneline-proxy', 'yup') - } - resp.writeHead('200', {'content-type':'image/png'}) - fs.createReadStream(path.join(__dirname, 'googledoodle.png')).pipe(resp) - }) - s.on('/onelineproxy', function (req, resp) { - var x = request('http://localhost:3453/doodle') - req.pipe(x) - x.pipe(resp) - }) - - counter++ - fs.createReadStream(__filename).pipe(request.put('http://localhost:3453/pushjs')) - - counter++ - request.get('http://localhost:3453/cat').pipe(request.put('http://localhost:3453/cat')) - - counter++ - request.get('http://localhost:3453/catresp', function (e, resp, body) { - assert.equal(resp.headers['content-type'], 'text/plain-test'); - assert.equal(resp.headers['content-length'], 4) - check(); - }) - - var doodleWrite = fs.createWriteStream(path.join(__dirname, 'test.png')) - - counter++ - request.get('http://localhost:3453/doodle').pipe(doodleWrite) - - doodleWrite.on('close', function () { - assert.deepEqual(fs.readFileSync(path.join(__dirname, 'googledoodle.png')), fs.readFileSync(path.join(__dirname, 'test.png'))) - check() - }) - - process.on('exit', function () { - fs.unlinkSync(path.join(__dirname, 'test.png')) - }) - - counter++ - request.get({uri:'http://localhost:3453/onelineproxy', headers:{'x-oneline-proxy':'nope'}}, function (err, resp, body) { - assert.equal(resp.headers['x-oneline-proxy'], 'yup') - check() - }) - - s.on('/afterresponse', function (req, resp) { - resp.write('d') - resp.end() - }) - - counter++ - var afterresp = request.post('http://localhost:3453/afterresponse').on('response', function () { - var v = new ValidationStream('d') - afterresp.pipe(v) - v.on('end', check) - }) - - s.on('/forward1', function (req, resp) { - resp.writeHead(302, {location:'/forward2'}) - resp.end() - }) - s.on('/forward2', function (req, resp) { - resp.writeHead('200', {'content-type':'image/png'}) - resp.write('d') - resp.end() - }) - - counter++ - var validateForward = new ValidationStream('d') - validateForward.on('end', check) - request.get('http://localhost:3453/forward1').pipe(validateForward) - - // Test pipe options - s.once('/opts', server.createGetResponse('opts response')); - - var optsStream = new stream.Stream(); - optsStream.writable = true - - var optsData = ''; - optsStream.write = function (buf) { - optsData += buf; - if (optsData === 'opts response') { - setTimeout(check, 10); - } - } - - optsStream.end = function () { - assert.fail('end called') - }; - - counter++ - request({url:'http://localhost:3453/opts'}).pipe(optsStream, { end : false }) -}) diff --git a/node_modules/jsdom/node_modules/request/tests/test-pool.js b/node_modules/jsdom/node_modules/request/tests/test-pool.js deleted file mode 100644 index 1e7d578..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-pool.js +++ /dev/null @@ -1,16 +0,0 @@ -var request = require('../main') - , http = require('http') - , assert = require('assert') - ; - -var s = http.createServer(function (req, resp) { - resp.statusCode = 200; - resp.end('asdf'); -}).listen(8080, function () { - request({'url': 'http://localhost:8080', 'pool': false}, function (e, resp) { - var agent = resp.request.agent; - assert.strictEqual(typeof agent, 'boolean'); - assert.strictEqual(agent, false); - s.close(); - }); -}); \ No newline at end of file diff --git a/node_modules/jsdom/node_modules/request/tests/test-protocol-changing-redirect.js b/node_modules/jsdom/node_modules/request/tests/test-protocol-changing-redirect.js deleted file mode 100644 index f74e196..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-protocol-changing-redirect.js +++ /dev/null @@ -1,60 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - - -var s = server.createServer() -var ss = server.createSSLServer() -var sUrl = 'http://localhost:' + s.port -var ssUrl = 'https://localhost:' + ss.port - -s.listen(s.port, bouncy(s, ssUrl)) -ss.listen(ss.port, bouncy(ss, sUrl)) - -var hits = {} -var expect = {} -var pending = 0 -function bouncy (s, server) { return function () { - - var redirs = { a: 'b' - , b: 'c' - , c: 'd' - , d: 'e' - , e: 'f' - , f: 'g' - , g: 'h' - , h: 'end' } - - var perm = true - Object.keys(redirs).forEach(function (p) { - var t = redirs[p] - - // switch type each time - var type = perm ? 301 : 302 - perm = !perm - s.on('/' + p, function (req, res) { - res.writeHead(type, { location: server + '/' + t }) - res.end() - }) - }) - - s.on('/end', function (req, res) { - var h = req.headers['x-test-key'] - hits[h] = true - pending -- - if (pending === 0) done() - }) -}} - -for (var i = 0; i < 5; i ++) { - pending ++ - var val = 'test_' + i - expect[val] = true - request({ url: (i % 2 ? sUrl : ssUrl) + '/a' - , headers: { 'x-test-key': val } }) -} - -function done () { - assert.deepEqual(hits, expect) - process.exit(0) -} diff --git a/node_modules/jsdom/node_modules/request/tests/test-proxy.js b/node_modules/jsdom/node_modules/request/tests/test-proxy.js deleted file mode 100644 index 647157c..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-proxy.js +++ /dev/null @@ -1,39 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , fs = require('fs') - , request = require('../main.js') - , path = require('path') - , util = require('util') - ; - -var port = 6768 - , called = false - , proxiedHost = 'google.com' - ; - -var s = server.createServer(port) -s.listen(port, function () { - s.on('http://google.com/', function (req, res) { - called = true - assert.equal(req.headers.host, proxiedHost) - res.writeHeader(200) - res.end() - }) - request ({ - url: 'http://'+proxiedHost, - proxy: 'http://localhost:'+port - /* - //should behave as if these arguments where passed: - url: 'http://localhost:'+port, - headers: {host: proxiedHost} - //*/ - }, function (err, res, body) { - s.close() - }) -}) - -process.on('exit', function () { - assert.ok(called, 'the request must be made to the proxy server') -}) diff --git a/node_modules/jsdom/node_modules/request/tests/test-qs.js b/node_modules/jsdom/node_modules/request/tests/test-qs.js deleted file mode 100644 index 1aac22b..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-qs.js +++ /dev/null @@ -1,28 +0,0 @@ -var request = request = require('../main.js') - , assert = require('assert') - ; - - -// Test adding a querystring -var req1 = request.get({ uri: 'http://www.google.com', qs: { q : 'search' }}) -setTimeout(function() { - assert.equal('/?q=search', req1.path) -}, 1) - -// Test replacing a querystring value -var req2 = request.get({ uri: 'http://www.google.com?q=abc', qs: { q : 'search' }}) -setTimeout(function() { - assert.equal('/?q=search', req2.path) -}, 1) - -// Test appending a querystring value to the ones present in the uri -var req3 = request.get({ uri: 'http://www.google.com?x=y', qs: { q : 'search' }}) -setTimeout(function() { - assert.equal('/?x=y&q=search', req3.path) -}, 1) - -// Test leaving a querystring alone -var req4 = request.get({ uri: 'http://www.google.com?x=y'}) -setTimeout(function() { - assert.equal('/?x=y', req4.path) -}, 1) diff --git a/node_modules/jsdom/node_modules/request/tests/test-redirect.js b/node_modules/jsdom/node_modules/request/tests/test-redirect.js deleted file mode 100644 index b84844a..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-redirect.js +++ /dev/null @@ -1,154 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - , Cookie = require('../vendor/cookie') - , Jar = require('../vendor/cookie/jar') - -var s = server.createServer() - -s.listen(s.port, function () { - var server = 'http://localhost:' + s.port; - var hits = {} - var passed = 0; - - bouncer(301, 'temp') - bouncer(302, 'perm') - bouncer(302, 'nope') - - function bouncer(code, label) { - var landing = label+'_landing'; - - s.on('/'+label, function (req, res) { - hits[label] = true; - res.writeHead(code, { - 'location':server + '/'+landing, - 'set-cookie': 'ham=eggs' - }) - res.end() - }) - - s.on('/'+landing, function (req, res) { - if (req.method !== 'GET') { // We should only accept GET redirects - console.error("Got a non-GET request to the redirect destination URL"); - res.writeHead(400); - res.end(); - return; - } - // Make sure the cookie doesn't get included twice, see #139: - // Make sure cookies are set properly after redirect - assert.equal(req.headers.cookie, 'foo=bar; quux=baz; ham=eggs'); - hits[landing] = true; - res.writeHead(200) - res.end(landing) - }) - } - - // Permanent bounce - var jar = new Jar() - jar.add(new Cookie('quux=baz')) - request({uri: server+'/perm', jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) - assert.ok(hits.perm, 'Original request is to /perm') - assert.ok(hits.perm_landing, 'Forward to permanent landing URL') - assert.equal(body, 'perm_landing', 'Got permanent landing content') - passed += 1 - done() - }) - - // Temporary bounce - request({uri: server+'/temp', jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(hits.temp_landing, 'Forward to temporary landing URL') - assert.equal(body, 'temp_landing', 'Got temporary landing content') - passed += 1 - done() - }) - - // Prevent bouncing. - request({uri:server+'/nope', jar: jar, headers: {cookie: 'foo=bar'}, followRedirect:false}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 302) throw new Error('Status is not 302: '+res.statusCode) - assert.ok(hits.nope, 'Original request to /nope') - assert.ok(!hits.nope_landing, 'No chasing the redirect') - assert.equal(res.statusCode, 302, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should not follow post redirects by default - request.post(server+'/temp', { jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 301) throw new Error('Status is not 301: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(!hits.temp_landing, 'No chasing the redirect when post') - assert.equal(res.statusCode, 301, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should follow post redirects when followAllRedirects true - request.post({uri:server+'/temp', followAllRedirects:true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(hits.temp_landing, 'Forward to temporary landing URL') - assert.equal(body, 'temp_landing', 'Got temporary landing content') - passed += 1 - done() - }) - - request.post({uri:server+'/temp', followAllRedirects:false, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 301) throw new Error('Status is not 301: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(!hits.temp_landing, 'No chasing the redirect') - assert.equal(res.statusCode, 301, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should not follow delete redirects by default - request.del(server+'/temp', { jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode < 301) throw new Error('Status is not a redirect.') - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(!hits.temp_landing, 'No chasing the redirect when delete') - assert.equal(res.statusCode, 301, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should not follow delete redirects even if followRedirect is set to true - request.del(server+'/temp', { followRedirect: true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 301) throw new Error('Status is not 301: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(!hits.temp_landing, 'No chasing the redirect when delete') - assert.equal(res.statusCode, 301, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should follow delete redirects when followAllRedirects true - request.del(server+'/temp', {followAllRedirects:true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(hits.temp_landing, 'Forward to temporary landing URL') - assert.equal(body, 'temp_landing', 'Got temporary landing content') - passed += 1 - done() - }) - - var reqs_done = 0; - function done() { - reqs_done += 1; - if(reqs_done == 9) { - console.log(passed + ' tests passed.') - s.close() - } - } -}) diff --git a/node_modules/jsdom/node_modules/request/tests/test-s3.js b/node_modules/jsdom/node_modules/request/tests/test-s3.js deleted file mode 100644 index 5f59c4a..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-s3.js +++ /dev/null @@ -1,13 +0,0 @@ -var request = require('../main') - -var r = request.get('https://log.curlybracecast.com.s3.amazonaws.com/', - { aws: - { key: 'AKIAI6KIQRRVMGK3WK5Q' - , secret: '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' - , bucket: 'log.curlybracecast.com' - } - }, function (e, resp, body) { - console.log(r.headers) - console.log(body) - } -) \ No newline at end of file diff --git a/node_modules/jsdom/node_modules/request/tests/test-timeout.js b/node_modules/jsdom/node_modules/request/tests/test-timeout.js deleted file mode 100644 index 673f8ad..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-timeout.js +++ /dev/null @@ -1,87 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , request = require('../main.js') - ; - -var s = server.createServer(); -var expectedBody = "waited"; -var remainingTests = 5; - -s.listen(s.port, function () { - // Request that waits for 200ms - s.on('/timeout', function (req, resp) { - setTimeout(function(){ - resp.writeHead(200, {'content-type':'text/plain'}) - resp.write(expectedBody) - resp.end() - }, 200); - }); - - // Scenario that should timeout - var shouldTimeout = { - url: s.url + "/timeout", - timeout:100 - } - - - request(shouldTimeout, function (err, resp, body) { - assert.equal(err.code, "ETIMEDOUT"); - checkDone(); - }) - - - // Scenario that shouldn't timeout - var shouldntTimeout = { - url: s.url + "/timeout", - timeout:300 - } - - request(shouldntTimeout, function (err, resp, body) { - assert.equal(err, null); - assert.equal(expectedBody, body) - checkDone(); - }) - - // Scenario with no timeout set, so shouldn't timeout - var noTimeout = { - url: s.url + "/timeout" - } - - request(noTimeout, function (err, resp, body) { - assert.equal(err); - assert.equal(expectedBody, body) - checkDone(); - }) - - // Scenario with a negative timeout value, should be treated a zero or the minimum delay - var negativeTimeout = { - url: s.url + "/timeout", - timeout:-1000 - } - - request(negativeTimeout, function (err, resp, body) { - assert.equal(err.code, "ETIMEDOUT"); - checkDone(); - }) - - // Scenario with a float timeout value, should be rounded by setTimeout anyway - var floatTimeout = { - url: s.url + "/timeout", - timeout: 100.76 - } - - request(floatTimeout, function (err, resp, body) { - assert.equal(err.code, "ETIMEDOUT"); - checkDone(); - }) - - function checkDone() { - if(--remainingTests == 0) { - s.close(); - console.log("All tests passed."); - } - } -}) - diff --git a/node_modules/jsdom/node_modules/request/tests/test-toJSON.js b/node_modules/jsdom/node_modules/request/tests/test-toJSON.js deleted file mode 100644 index b7c67ef..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-toJSON.js +++ /dev/null @@ -1,14 +0,0 @@ -var request = require('../main') - , http = require('http') - , assert = require('assert') - ; - -var s = http.createServer(function (req, resp) { - resp.statusCode = 200 - resp.end('asdf') -}).listen(8080, function () { - var r = request('http://localhost:8080', function (e, resp) { - assert.equal(JSON.parse(JSON.stringify(r)).response.statusCode, 200) - s.close() - }) -}) \ No newline at end of file diff --git a/node_modules/jsdom/node_modules/request/tests/test-tunnel.js b/node_modules/jsdom/node_modules/request/tests/test-tunnel.js deleted file mode 100644 index 51e2126..0000000 --- a/node_modules/jsdom/node_modules/request/tests/test-tunnel.js +++ /dev/null @@ -1,63 +0,0 @@ -// test that we can tunnel a https request over an http proxy -// keeping all the CA and whatnot intact. -// -// Note: this requires that squid is installed. -// If the proxy fails to start, we'll just log a warning and assume success. - -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - , fs = require('fs') - , path = require('path') - , caFile = path.resolve(__dirname, 'ssl/npm-ca.crt') - , ca = fs.readFileSync(caFile) - , child_process = require('child_process') - , sqConf = path.resolve(__dirname, 'squid.conf') - , sqArgs = ['-f', sqConf, '-N', '-d', '5'] - , proxy = 'http://localhost:3128' - , hadError = null - -var squid = child_process.spawn('squid', sqArgs); -var ready = false - -squid.stderr.on('data', function (c) { - console.error('SQUIDERR ' + c.toString().trim().split('\n') - .join('\nSQUIDERR ')) - ready = c.toString().match(/ready to serve requests/i) -}) - -squid.stdout.on('data', function (c) { - console.error('SQUIDOUT ' + c.toString().trim().split('\n') - .join('\nSQUIDOUT ')) -}) - -squid.on('exit', function (c) { - console.error('squid: exit '+c) - if (c && !ready) { - console.error('squid must be installed to run this test.') - console.error('skipping this test. please install squid and run again if you need to test tunneling.') - c = null - hadError = null - process.exit(0) - return - } - - if (c) { - hadError = hadError || new Error('Squid exited with '+c) - } - if (hadError) throw hadError -}) - -setTimeout(function F () { - if (!ready) return setTimeout(F, 100) - request({ uri: 'https://registry.npmjs.org/' - , proxy: 'http://localhost:3128' - , strictSSL: true - , ca: ca - , json: true }, function (er, body) { - hadError = er - console.log(er || typeof body) - if (!er) console.log("ok") - squid.kill('SIGKILL') - }) -}, 100) diff --git a/node_modules/jsdom/node_modules/request/tests/unicycle.jpg b/node_modules/jsdom/node_modules/request/tests/unicycle.jpg deleted file mode 100644 index 7cea4dd71dc41cd51c84bfcec6b3e65c15a58507..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19806 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 diff --git a/node_modules/jsdom/node_modules/request/tunnel.js b/node_modules/jsdom/node_modules/request/tunnel.js deleted file mode 100644 index 3f7bbb9..0000000 --- a/node_modules/jsdom/node_modules/request/tunnel.js +++ /dev/null @@ -1,227 +0,0 @@ -'use strict' - -var net = require('net') - , tls = require('tls') - , http = require('http') - , https = require('https') - , events = require('events') - , assert = require('assert') - , util = require('util') - ; - -exports.httpOverHttp = httpOverHttp -exports.httpsOverHttp = httpsOverHttp -exports.httpOverHttps = httpOverHttps -exports.httpsOverHttps = httpsOverHttps - - -function httpOverHttp(options) { - var agent = new TunnelingAgent(options) - agent.request = http.request - return agent -} - -function httpsOverHttp(options) { - var agent = new TunnelingAgent(options) - agent.request = http.request - agent.createSocket = createSecureSocket - return agent -} - -function httpOverHttps(options) { - var agent = new TunnelingAgent(options) - agent.request = https.request - return agent -} - -function httpsOverHttps(options) { - var agent = new TunnelingAgent(options) - agent.request = https.request - agent.createSocket = createSecureSocket - return agent -} - - -function TunnelingAgent(options) { - var self = this - self.options = options || {} - self.proxyOptions = self.options.proxy || {} - self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets - self.requests = [] - self.sockets = [] - - self.on('free', function onFree(socket, host, port) { - for (var i = 0, len = self.requests.length; i < len; ++i) { - var pending = self.requests[i] - if (pending.host === host && pending.port === port) { - // Detect the request to connect same origin server, - // reuse the connection. - self.requests.splice(i, 1) - pending.request.onSocket(socket) - return - } - } - socket.destroy() - self.removeSocket(socket) - }) -} -util.inherits(TunnelingAgent, events.EventEmitter) - -TunnelingAgent.prototype.addRequest = function addRequest(req, host, port) { - var self = this - - if (self.sockets.length >= this.maxSockets) { - // We are over limit so we'll add it to the queue. - self.requests.push({host: host, port: port, request: req}) - return - } - - // If we are under maxSockets create a new one. - self.createSocket({host: host, port: port, request: req}, function(socket) { - socket.on('free', onFree) - socket.on('close', onCloseOrRemove) - socket.on('agentRemove', onCloseOrRemove) - req.onSocket(socket) - - function onFree() { - self.emit('free', socket, host, port) - } - - function onCloseOrRemove(err) { - self.removeSocket() - socket.removeListener('free', onFree) - socket.removeListener('close', onCloseOrRemove) - socket.removeListener('agentRemove', onCloseOrRemove) - } - }) -} - -TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { - var self = this - var placeholder = {} - self.sockets.push(placeholder) - - var connectOptions = mergeOptions({}, self.proxyOptions, - { method: 'CONNECT' - , path: options.host + ':' + options.port - , agent: false - } - ) - if (connectOptions.proxyAuth) { - connectOptions.headers = connectOptions.headers || {} - connectOptions.headers['Proxy-Authorization'] = 'Basic ' + - new Buffer(connectOptions.proxyAuth).toString('base64') - } - - debug('making CONNECT request') - var connectReq = self.request(connectOptions) - connectReq.useChunkedEncodingByDefault = false // for v0.6 - connectReq.once('response', onResponse) // for v0.6 - connectReq.once('upgrade', onUpgrade) // for v0.6 - connectReq.once('connect', onConnect) // for v0.7 or later - connectReq.once('error', onError) - connectReq.end() - - function onResponse(res) { - // Very hacky. This is necessary to avoid http-parser leaks. - res.upgrade = true - } - - function onUpgrade(res, socket, head) { - // Hacky. - process.nextTick(function() { - onConnect(res, socket, head) - }) - } - - function onConnect(res, socket, head) { - connectReq.removeAllListeners() - socket.removeAllListeners() - - if (res.statusCode === 200) { - assert.equal(head.length, 0) - debug('tunneling connection has established') - self.sockets[self.sockets.indexOf(placeholder)] = socket - cb(socket) - } else { - debug('tunneling socket could not be established, statusCode=%d', res.statusCode) - var error = new Error('tunneling socket could not be established, ' + 'statusCode=' + res.statusCode) - error.code = 'ECONNRESET' - options.request.emit('error', error) - self.removeSocket(placeholder) - } - } - - function onError(cause) { - connectReq.removeAllListeners() - - debug('tunneling socket could not be established, cause=%s\n', cause.message, cause.stack) - var error = new Error('tunneling socket could not be established, ' + 'cause=' + cause.message) - error.code = 'ECONNRESET' - options.request.emit('error', error) - self.removeSocket(placeholder) - } -} - -TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { - var pos = this.sockets.indexOf(socket) - if (pos === -1) return - - this.sockets.splice(pos, 1) - - var pending = this.requests.shift() - if (pending) { - // If we have pending requests and a socket gets closed a new one - // needs to be created to take over in the pool for the one that closed. - this.createSocket(pending, function(socket) { - pending.request.onSocket(socket) - }) - } -} - -function createSecureSocket(options, cb) { - var self = this - TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { - // 0 is dummy port for v0.6 - var secureSocket = tls.connect(0, mergeOptions({}, self.options, - { servername: options.host - , socket: socket - } - )) - cb(secureSocket) - }) -} - - -function mergeOptions(target) { - for (var i = 1, len = arguments.length; i < len; ++i) { - var overrides = arguments[i] - if (typeof overrides === 'object') { - var keys = Object.keys(overrides) - for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { - var k = keys[j] - if (overrides[k] !== undefined) { - target[k] = overrides[k] - } - } - } - } - return target -} - - -var debug -if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { - debug = function() { - var args = Array.prototype.slice.call(arguments) - if (typeof args[0] === 'string') { - args[0] = 'TUNNEL: ' + args[0] - } else { - args.unshift('TUNNEL:') - } - console.error.apply(console, args) - } -} else { - debug = function() {} -} -exports.debug = debug // for test diff --git a/node_modules/jsdom/node_modules/request/uuid.js b/node_modules/jsdom/node_modules/request/uuid.js deleted file mode 100644 index fc0588b..0000000 --- a/node_modules/jsdom/node_modules/request/uuid.js +++ /dev/null @@ -1,19 +0,0 @@ -module.exports = function () { - var s = [], itoh = '0123456789ABCDEF' - - // Make array of random hex digits. The UUID only has 32 digits in it, but we - // allocate an extra items to make room for the '-'s we'll be inserting. - for (var i = 0; i <36; i++) s[i] = Math.floor(Math.random()*0x10) - - // Conform to RFC-4122, section 4.4 - s[14] = 4; // Set 4 high bits of time_high field to version - s[19] = (s[19] & 0x3) | 0x8 // Specify 2 high bits of clock sequence - - // Convert to hex chars - for (var i = 0; i <36; i++) s[i] = itoh[s[i]] - - // Insert '-'s - s[8] = s[13] = s[18] = s[23] = '-' - - return s.join('') -} diff --git a/node_modules/jsdom/node_modules/request/vendor/cookie/index.js b/node_modules/jsdom/node_modules/request/vendor/cookie/index.js deleted file mode 100644 index ff44b3e..0000000 --- a/node_modules/jsdom/node_modules/request/vendor/cookie/index.js +++ /dev/null @@ -1,65 +0,0 @@ -/*! - * Tobi - Cookie - * Copyright(c) 2010 LearnBoost - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var url = require('url'); - -/** - * Initialize a new `Cookie` with the given cookie `str` and `req`. - * - * @param {String} str - * @param {IncomingRequest} req - * @api private - */ - -var Cookie = exports = module.exports = function Cookie(str, req) { - this.str = str; - - // Map the key/val pairs - str.split(/ *; */).reduce(function(obj, pair){ - var p = pair.indexOf('='); - var key = p > 0 ? pair.substring(0, p).trim() : pair.trim(); - var lowerCasedKey = key.toLowerCase(); - var value = p > 0 ? pair.substring(p + 1).trim() : true; - - if (!obj.name) { - // First key is the name - obj.name = key; - obj.value = value; - } - else if (lowerCasedKey === 'httponly') { - obj.httpOnly = value; - } - else { - obj[lowerCasedKey] = value; - } - return obj; - }, this); - - // Expires - this.expires = this.expires - ? new Date(this.expires) - : Infinity; - - // Default or trim path - this.path = this.path - ? this.path.trim(): req - ? url.parse(req.url).pathname: '/'; -}; - -/** - * Return the original cookie string. - * - * @return {String} - * @api public - */ - -Cookie.prototype.toString = function(){ - return this.str; -}; diff --git a/node_modules/jsdom/node_modules/request/vendor/cookie/jar.js b/node_modules/jsdom/node_modules/request/vendor/cookie/jar.js deleted file mode 100644 index 34920e0..0000000 --- a/node_modules/jsdom/node_modules/request/vendor/cookie/jar.js +++ /dev/null @@ -1,72 +0,0 @@ -/*! -* Tobi - CookieJar -* Copyright(c) 2010 LearnBoost -* MIT Licensed -*/ - -/** -* Module dependencies. -*/ - -var url = require('url'); - -/** -* Initialize a new `CookieJar`. -* -* @api private -*/ - -var CookieJar = exports = module.exports = function CookieJar() { - this.cookies = []; -}; - -/** -* Add the given `cookie` to the jar. -* -* @param {Cookie} cookie -* @api private -*/ - -CookieJar.prototype.add = function(cookie){ - this.cookies = this.cookies.filter(function(c){ - // Avoid duplication (same path, same name) - return !(c.name == cookie.name && c.path == cookie.path); - }); - this.cookies.push(cookie); -}; - -/** -* Get cookies for the given `req`. -* -* @param {IncomingRequest} req -* @return {Array} -* @api private -*/ - -CookieJar.prototype.get = function(req){ - var path = url.parse(req.url).pathname - , now = new Date - , specificity = {}; - return this.cookies.filter(function(cookie){ - if (0 == path.indexOf(cookie.path) && now < cookie.expires - && cookie.path.length > (specificity[cookie.name] || 0)) - return specificity[cookie.name] = cookie.path.length; - }); -}; - -/** -* Return Cookie string for the given `req`. -* -* @param {IncomingRequest} req -* @return {String} -* @api private -*/ - -CookieJar.prototype.cookieString = function(req){ - var cookies = this.get(req); - if (cookies.length) { - return cookies.map(function(cookie){ - return cookie.name + '=' + cookie.value; - }).join('; '); - } -}; diff --git a/node_modules/jsdom/package.json b/node_modules/jsdom/package.json deleted file mode 100644 index d781418..0000000 --- a/node_modules/jsdom/package.json +++ /dev/null @@ -1,215 +0,0 @@ -{ - "name": "jsdom", - "version": "0.3.4", - "description": "A JavaScript implementation of the W3C DOM", - "keywords": [ - "dom", - "w3c", - "html" - ], - "maintainers": [ - { - "name": "Elijah Insua", - "email": "tmpvar@gmail.com", - "url": "http://tmpvar.com" - }, - { - "name": "Domenic Denicola", - "email": "domenic@domenicdenicola.com", - "url": "http://domenicdenicola.com" - } - ], - "contributors": [ - { - "name": "Vincent Greene", - "email": "ulteriorlife@gmail.com" - }, - { - "name": "Dav Glass", - "email": "davglass@gmail.com" - }, - { - "name": "Felix Gnass", - "email": "fgnass@gmail.com" - }, - { - "name": "Charlie Robbins", - "email": "charlie.robbins@gmail.com" - }, - { - "name": "Aria Stewart", - "email": "aredridel@nbtsc.org" - }, - { - "name": "Matthew", - "email": "N.A.", - "url": "http://github.com/matthewpflueger/" - }, - { - "name": "Olivier El Mekki", - "email": "unknown", - "url": "http://blog.olivier-elmekki.com/" - }, - { - "name": "Shimon Dookdin", - "email": "helpmepro1@gmail.com" - }, - { - "name": "Daniel Cassidy", - "email": "mail@danielcassidy.me.uk", - "url": "http://www.danielcassidy.me.uk/" - }, - { - "name": "Sam Ruby", - "url": "http://intertwingly.net/blog/" - }, - { - "name": "hij1nx", - "url": "http://github.com/hij1nx" - }, - { - "name": "Yonathan Randolph", - "url": "http://github.com/yonran" - }, - { - "name": "Martin Davis", - "url": "http://github.com/waslogic" - }, - { - "name": "Andreas Lind Petersen", - "email": "andreas@one.com" - }, - { - "name": "d-ash", - "url": "http://github.com/d-ash" - }, - { - "name": "Robin Zhong", - "email": "fbzhong@gmail.com" - }, - { - "name": "Alexander Flatter", - "email": "flatter@gmail.com" - }, - { - "name": "Heng Liu", - "email": "liucougar@gmail.com" - }, - { - "name": "Brian McDaniel", - "url": "http://github.com/brianmcd" - }, - { - "name": "John Hurliman", - "email": "jhurliman@jhurliman.org" - }, - { - "name": "Jimmy Mabey" - }, - { - "name": "Gregory Tomlinson" - }, - { - "name": "Jason Davies", - "url": "http://www.jasondavies.com/" - }, - { - "name": "Josh Marshall", - "url": "http://www.ponderingtheobvious.com/" - }, - { - "name": "Jason Priestley", - "url": "https://github.com/jhp" - }, - { - "name": "Derek Lindahl", - "url": "https://github.com/dlindahl" - }, - { - "name": "Chris Roebuck", - "email": "chris@quillu.com", - "url": "http://www.quillu.com" - }, - { - "name": "Avi Deitcher", - "url": "https://github.com/deitch" - }, - { - "name": "Nao Iizuka", - "email": "iizuka@kyu-mu.net", - "url": "https://github.com/iizukanao" - }, - { - "name": "Peter Perenyi", - "url": "https://github.com/sinegar" - }, - { - "name": "Tiago Rodrigues", - "email": "tmcrodrigues@gmail.com", - "url": "http://trodrigues.net" - }, - { - "name": "Samori Gorse", - "email": "samorigorse@gmail.com", - "url": "http://github.com/shinuza" - }, - { - "name": "John Roberts", - "email": "jroberts@logitech.com" - }, - { - "name": "Chad Walker", - "email": "chad@chad-cat-lore-eddie.com", - "url": "https://github.com/chad3814" - } - ], - "bugs": { - "email": "tmpvar@gmail.com", - "url": "http://github.com/tmpvar/jsdom/issues" - }, - "licenses": [ - { - "type": "MIT", - "url": "http://github.com/tmpvar/jsdom/blob/master/LICENSE.txt" - } - ], - "repositories": [ - { - "type": "git", - "url": "http://github.com/tmpvar/jsdom.git" - } - ], - "implements": [ - "http://www.w3.org/TR/REC-DOM-Level-1" - ], - "dependencies": { - "htmlparser": "1.x", - "nwmatcher": ">=1.3.0", - "request": "2.x", - "cssom": "0.2.x", - "cssstyle": ">=0.2.3", - "contextify": "0.1.x" - }, - "optionalDependencies": { - "contextify": "0.1.x" - }, - "devDependencies": { - "nodeunit": ">=0.5.x", - "console.log": "*", - "html5": ">=0.3.8", - "optimist": "*" - }, - "directories": { - "lib": "./lib/jsdom" - }, - "scripts": { - "test": "node ./test/runner" - }, - "main": "./lib/jsdom", - "readme": "# jsdom\n\nA JavaScript implementation of the W3C DOM.\n\n## Install\n\n```bash\n$ npm install jsdom\n```\n\n## Human contact\n\nsee: [mailing list](http://groups.google.com/group/jsdom)\n\n## Easymode\n\nBootstrapping a DOM is generally a difficult process involving many error prone steps. We didn't want jsdom to fall into the same trap and that is why a new method, `jsdom.env()`, has been added in jsdom 0.2.0 which should make everyone's lives easier.\n\nwith URL\n\n```js\n// Count all of the links from the nodejs build page\nvar jsdom = require(\"jsdom\");\n\njsdom.env(\n \"http://nodejs.org/dist/\",\n [\"http://code.jquery.com/jquery.js\"],\n function (errors, window) {\n console.log(\"there have been\", window.$(\"a\").length, \"nodejs releases!\");\n }\n);\n```\n\nor with raw HTML\n\n```js\n// Run some jQuery on a html fragment\nvar jsdom = require(\"jsdom\");\n\njsdom.env(\n '',\n [\"http://code.jquery.com/jquery.js\"],\n function(errors, window) {\n console.log(\"contents of a.the-link:\", window.$(\"a.the-link\").text());\n }\n);\n```\n\nor with a configuration object\n\n```js\n// Print all of the news items on hackernews\nvar jsdom = require(\"jsdom\");\n\njsdom.env({\n html: \"http://news.ycombinator.com/\",\n scripts: [\"http://code.jquery.com/jquery.js\"],\n done: function (errors, window) {\n var $ = window.$;\n console.log(\"HN Links\");\n $(\"td.title:not(:last) a\").each(function() {\n console.log(\" -\", $(this).text());\n });\n }\n});\n```\n\nor with raw JavaScript source\n\n```js\n// Print all of the news items on hackernews\nvar jsdom = require(\"jsdom\");\nvar fs = require(\"fs\");\nvar jquery = fs.readFileSync(\"./jquery.js\").toString();\n\njsdom.env({\n html: \"http://news.ycombinator.com/\",\n src: [jquery],\n done: function (errors, window) {\n var $ = window.$;\n console.log(\"HN Links\");\n $(\"td.title:not(:last) a\").each(function() {\n console.log(\" -\", $(this).text());\n });\n }\n});\n```\n\n### How it works\n`jsdom.env` is built for ease of use, which is rare in the world of the DOM! Since the web has some absolutely horrible JavaScript on it, as of jsdom 0.2.0 `jsdom.env` will not process external resources (scripts, images, etc). If you want to process the JavaScript use one of the methods below (`jsdom.jsdom` or `jsdom.jQueryify`)\n\n```js\njsdom.env(html, [scripts], [config], callback);\n```\n\n- `html` (**required**): may be a URL, HTML fragment, or file.\n- `scripts` (**optional**): may contain files or URLs.\n- `config` (**optional**): see below.\n- `callback` (**required**): takes two arguments:\n - `errors`: an array of errors\n - `window`: a brand new window\n\n_example:_\n\n```js\njsdom.env(html, function (errors, window) {\n // free memory associated with the window\n window.close();\n});\n```\n\nIf you would like to specify a configuration object only:\n\n```js\njsdom.env(config);\n```\n\n- `config.html`: see `html` above.\n- `config.scripts`: see `scripts` above.\n- `config.src`: an array of JavaScript strings that will be evaluated against the resulting document. Similar to `scripts`, but it accepts JavaScript instead of paths/URLs.\n- `config.done`: see `callback` above.\n- `config.document`:\n - `referer`: the new document will have this referer\n - `cookie`: manually set a cookie value, e.g. `'key=value; expires=Wed, Sep 21 2011 12:00:00 GMT; path=/'`\n- `config.features` : see `Flexibility` section below. **Note**: the default feature set for jsdom.env does _not_ include fetching remote JavaScript and executing it. This is something that you will need to **carefully** enable yourself.\n\n## For the hardcore\n\nIf you want to spawn a document/window and specify all sorts of options this is the section for you. This section covers the `jsdom.jsdom` method:\n\n```js\nvar jsdom = require(\"jsdom\").jsdom;\nvar doc = jsdom(markup, level, options);\nvar window = doc.createWindow();\n```\n\n- `markup` is an HTML/XML document to be parsed. You can also pass `null` or an undefined value to get a basic document with empty `` and `` tags. Document fragments are also supported (including `\"\"`), and will behave as sanely as possible (e.g. the resulting document will lack the `head`, `body` and `documentElement` properties if the corresponding elements aren't included).\n\n- `level` is `null` (which means level3) by default, but you can pass another level if you'd like.\n\n ```js\n var jsdom = require(\"jsdom\");\n var doc = jsdom.jsdom(\"\", jsdom.level(1, \"core\"));\n ```\n\n- `options` see the **Flexibility** section below.\n\n### Flexibility\n\nOne of the goals of jsdom is to be as minimal and light as possible. This section details how someone can change the behavior of `Document`s on the fly. These features are baked into the `DOMImplementation` that every `Document` has, and may be tweaked in two ways:\n\n1. When you create a new `Document` using the jsdom builder (`require(\"jsdom\").jsdom()`)\n\n ```js\n var jsdom = require(\"jsdom\").jsdom;\n var doc = jsdom(\"\", null, {\n features: {\n FetchExternalResources : [\"img\"]\n }\n });\n ```\n\n Do note, that this will only affect the document that is currently being created. All other documents will use the defaults specified below (see: Default Features).\n\n2. Before creating any documents, you can modify the defaults for all future documents:\n\n ```js\n require(\"jsdom\").defaultDocumentFeatures = {\n FetchExternalResources: [\"script\"],\n ProcessExternalResources: false\n };\n ```\n\n#### Default Features\n\nDefault features are extremely important for jsdom as they lower the configuration requirement and present developers a set of consistent default behaviors. The following sections detail the available features, their defaults, and the values that jsdom uses.\n\n\n`FetchExternalResources`\n\n- _Default_: `[\"script\"]`\n- _Allowed_: `[\"script\", \"img\", \"css\", \"frame\", \"iframe\", \"link\"]` or `false`\n\nEnables/disables fetching files over the file system/HTTP.\n\n`ProcessExternalResources`\n\n- _Default_: `[\"script\"]`\n- _Allowed_: `[\"script\"]` or `false`\n\nDisabling this will disable script execution (currently only JavaScript).\n\n`SkipExternalResources`\n\n- _Default_: `false`\n- _Allowed_: `/url to be skipped/` or `false`\n- _Example_: `/http:\\/\\/example.org/js/bad\\.js/`\n\nDo not download and process resources with url matching a regular expression.\n\n## Canvas\n\njsdom includes support for using the [canvas](https://npmjs.org/package/canvas) package to extend any `` elements with the canvas API. To make this work, you need to include canvas as a dependency in your project, as a peer of jsdom. If jsdom can find the canvas package, it will use it, but if it's not present, then `` elements will behave like `

        jsdom\\'s Homepage

        aK`(UyF)k;t`-@{<=;z@y2_wi@+xU3~2zK`#GB zrIjvMVI_T8C0-CH8o_|ysJpDcOsxpjpwm@fC&1sJg+p&rmvfAPjltNnx}$}=W}Qo_b6<|JHzHcqUi}gm`5r?Wt3g9P(@=2q zr#cGLeXPTR06#e>cNWMsIDQ{Fe~-Uft{&3IS5kKP-dVlg%^2(Dn!1YWSwtr2C5XA{ zzh2y3Y|$b4LZu;1h3FSGrc0D>7)uOSf;eQh1jx}hYvH9 z^C*2O)v=Pt=(N(OA2LbkQ|k?^ORElb7r##o9yy@X2keWrcG!UY?3e)oRJHmwTl4Uv z1)6v8Pyq#K#|a2V4ib=uf9*%J*Bu^!PdhdM#7|5x7&$w@PYn!8P*<_q83BGeAktc> g)zDgno>WPAvetm7T7v+pF#%NL0pP!I(IJih1TXeDU;qFB diff --git a/node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/libplds4.dylib b/node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/libplds4.dylib deleted file mode 100755 index 20e52833477dbb862e973cb8bb3afc7383e42a09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21920 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 Qbfz6dZSU}sEmp?<8`DC>6#xJL diff --git a/node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/nwmatcher.js b/node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/nwmatcher.js deleted file mode 100644 index 7abd248..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/lib/spidermonkey/nwmatcher.js +++ /dev/null @@ -1,1653 +0,0 @@ -/* - * Copyright (C) 2007-2012 Diego Perini - * All rights reserved. - * - * nwmatcher.js - A fast CSS selector engine and matcher - * - * Author: Diego Perini - * Version: 1.3.0beta - * Created: 20070722 - * Release: 20121122 - * - * License: - * http://javascript.nwbox.com/NWMatcher/MIT-LICENSE - * Download: - * http://javascript.nwbox.com/NWMatcher/nwmatcher.js - */ - -(function(global, factory) { - - if (typeof module === 'object' && typeof exports === 'object') { - // in a Node.js environment, the nwmatcher functions will operate on - // the passed "browserGlobal" and will be returned in an object - module.exports = function (browserGlobal) { - var exports = { }; - factory(browserGlobal, exports); - return exports; - }; - } else { - // in a browser environment, the nwmatcher functions will operate on - // the "global" loading them and be attached to "global.NW.Dom" - if (!global.NW) { - global.NW = { }; - } - if (!global.NW.Dom) { - global.NW.Dom = { }; - } - factory(global, global.NW.Dom); - } - -})(this, function(global, exports) { - - var version = 'nwmatcher-1.3.0beta', - - Dom = exports, - - // processing context & root element - doc = global.document, - root = doc.documentElement, - - // save utility methods references - slice = [ ].slice, - string = { }.toString, - - // persist previous parsed data - isSingleMatch, - isSingleSelect, - - lastSlice, - lastContext, - lastPosition, - - lastMatcher, - lastSelector, - - lastPartsMatch, - lastPartsSelect, - - // accepted prefix identifiers - // (id, class & pseudo-class) - prefixes = '[#.:]?', - - // accepted attribute operators - operators = '([~*^$|!]?={1})', - - // accepted whitespace characters - whitespace = '[\\x20\\t\\n\\r\\f]*', - - // 4 combinators F E, F>E, F+E, F~E - combinators = '[\\x20]|[>+~][^>+~]', - - // an+b format params for pseudo-classes - pseudoparms = '(?:[-+]?\\d*n)?[-+]?\\d*', - - // CSS quoted string values - quotedvalue = '"[^"]*"' + "|'[^']*'", - - // skip group of round brackets - skipround = '\\([^()]+\\)|\\(.*\\)', - // skip group of curly brackets - skipcurly = '\\{[^{}]+\\}|\\{.*\\}', - // skip group of square brackets - skipsquare = '\\[[^[\\]]*\\]|\\[.*\\]', - - // skip [ ], ( ), { } groups in token tails - skipgroup = '\\[.*\\]|\\(.*\\)|\\{.*\\}', - - // http://www.w3.org/TR/css3-syntax/#characters - // unicode/ISO 10646 characters 161 and higher - // NOTE: Safari 2.0.x crashes with escaped (\\) - // Unicode ranges in regular expressions so we - // use a negated character range class instead - encoding = '(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)', - - // CSS identifier syntax - identifier = '(?:-?[_a-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+', - - // build attribute string - attrcheck = '(' + quotedvalue + '|' + identifier + ')', - attributes = whitespace + '(' + encoding + '+:?' + encoding + '+)' + - whitespace + '(?:' + operators + whitespace + attrcheck + ')?' + whitespace, - attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'), - - // build pseudoclass string - pseudoclass = '((?:' + - // an+b parameters or quoted string - pseudoparms + '|' + quotedvalue + '|' + - // id, class, pseudo-class selector - prefixes + '|' + encoding + '+|' + - // nested HTML attribute selector - '\\[' + attributes + '\\]|' + - // nested pseudo-class selector - '\\(.+\\)|' + whitespace + '|' + - // nested pseudos/separators - ',)+)', - - // placeholder for extensions - extensions = '.+', - - // CSS3: syntax scanner and - // one pass validation only - // using regular expression - standardValidator = - // discard start - '(?=[\\x20\\t\\n\\r\\f]*[^>+~(){}<>])' + - // open match group - '(' + - //universal selector - '\\*' + - // id/class/tag/pseudo-class identifier - '|(?:' + prefixes + identifier + ')' + - // combinator selector - '|' + combinators + - // HTML attribute selector - '|\\[' + attributes + '\\]' + - // pseudo-classes parameters - '|\\(' + pseudoclass + '\\)' + - // dom properties selector (extension) - '|\\{' + extensions + '\\}' + - // selector group separator (comma) - '|(?:,|' + whitespace + ')' + - // close match group - ')+', - - // validator for complex selectors in ':not()' pseudo-classes - extendedValidator = standardValidator.replace(pseudoclass, '.*'), - - // validator for standard selectors as default - reValidator = new RegExp(standardValidator, 'g'), - - // whitespace is any combination of these 5 character [\x20\t\n\r\f] - // http://www.w3.org/TR/css3-selectors/#selector-syntax - reTrimSpaces = new RegExp('^' + - whitespace + '|' + whitespace + '$', 'g'), - - // only allow simple selectors nested in ':not()' pseudo-classes - reSimpleNot = new RegExp('^(' + - '(?!:not)' + - '(' + prefixes + - '|' + identifier + - '|\\([^()]*\\))+' + - '|\\[' + attributes + '\\]' + - ')$'), - - // split comma groups, exclude commas from - // quotes '' "" and from brackets () [] {} - reSplitGroup = new RegExp('(' + - '[^,\\\\()[\\]]+' + - '|' + skipsquare + - '|' + skipround + - '|' + skipcurly + - '|\\\\.' + - ')+', 'g'), - - // split last, right most, selector group token - reSplitToken = new RegExp('(' + - '\\[' + attributes + '\\]|' + - '\\(' + pseudoclass + '\\)|' + - '[^\\x20>+~]|\\\\.)+', 'g'), - - // for in excess whitespace removal - reWhiteSpace = /[\x20\t\n\r\f]+/g, - - reOptimizeSelector = new RegExp(identifier + '|^$'), - - /*----------------------------- FEATURE TESTING ----------------------------*/ - - // detect native methods - isNative = (function() { - var s = (doc.appendChild + '').replace(/appendChild/g, ''); - return function(object, method) { - var m = object && object[method] || false; - return m && typeof m != 'string' && - s == (m + '').replace(new RegExp(method, 'g'), ''); - }; - })(), - - // NATIVE_XXXXX true if method exist and is callable - // detect if DOM methods are native in browsers - NATIVE_FOCUS = isNative(doc, 'hasFocus'), - NATIVE_QSAPI = isNative(doc, 'querySelector'), - NATIVE_GEBID = isNative(doc, 'getElementById'), - NATIVE_GEBTN = isNative(root, 'getElementsByTagName'), - NATIVE_GEBCN = isNative(root, 'getElementsByClassName'), - - // detect native getAttribute/hasAttribute methods, - // frameworks extend these to elements, but it seems - // this does not work for XML namespaced attributes, - // used to check both getAttribute/hasAttribute in IE - NATIVE_GET_ATTRIBUTE = isNative(root, 'getAttribute'), - NATIVE_HAS_ATTRIBUTE = isNative(root, 'hasAttribute'), - - // check if slice() can convert nodelist to array - // see http://yura.thinkweb2.com/cft/ - NATIVE_SLICE_PROTO = - (function() { - var isBuggy = false, id = root.id; - root.id = 'length'; - try { - isBuggy = !!slice.call(doc.childNodes, 0)[0]; - } catch(e) { } - root.id = id; - return isBuggy; - })(), - - // supports the new traversal API - NATIVE_TRAVERSAL_API = - 'nextElementSibling' in root && 'previousElementSibling' in root, - - // BUGGY_XXXXX true if method is feature tested and has known bugs - // detect buggy gEBID - BUGGY_GEBID = NATIVE_GEBID ? - (function() { - var isBuggy = true, x = 'x' + String(+new Date), - a = doc.createElementNS ? 'a' : ''; - (a = doc.createElement(a)).name = x; - root.insertBefore(a, root.firstChild); - isBuggy = !!doc.getElementById(x); - root.removeChild(a); - return isBuggy; - })() : - true, - - // detect IE gEBTN comment nodes bug - BUGGY_GEBTN = NATIVE_GEBTN ? - (function() { - var div = doc.createElement('div'); - div.appendChild(doc.createComment('')); - return !!div.getElementsByTagName('*')[0]; - })() : - true, - - // detect Opera gEBCN second class and/or UTF8 bugs as well as Safari 3.2 - // caching class name results and not detecting when changed, - // tests are based on the jQuery selector test suite - BUGGY_GEBCN = NATIVE_GEBCN ? - (function() { - var isBuggy, div = doc.createElement('div'), test = '\u53f0\u5317'; - - // Opera tests - div.appendChild(doc.createElement('span')). - setAttribute('class', test + 'abc ' + test); - div.appendChild(doc.createElement('span')). - setAttribute('class', 'x'); - - isBuggy = !div.getElementsByClassName(test)[0]; - - // Safari test - div.lastChild.className = test; - return isBuggy || div.getElementsByClassName(test).length != 2; - })() : - true, - - // detect IE bug with dynamic attributes - BUGGY_GET_ATTRIBUTE = NATIVE_GET_ATTRIBUTE ? - (function() { - var input = doc.createElement('input'); - input.setAttribute('value', 5); - return input.defaultValue != 5; - })() : - true, - - // detect IE bug with non-standard boolean attributes - BUGGY_HAS_ATTRIBUTE = NATIVE_HAS_ATTRIBUTE ? - (function() { - var option = doc.createElement('option'); - option.setAttribute('selected', 'selected'); - return !option.hasAttribute('selected'); - })() : - true, - - // detect Safari bug with selected option elements - BUGGY_SELECTED = - (function() { - var select = doc.createElement('select'); - select.appendChild(doc.createElement('option')); - return !select.firstChild.selected; - })(), - - // initialized with the loading context - // and reset for each different context - BUGGY_QUIRKS_GEBCN, - BUGGY_QUIRKS_QSAPI, - - QUIRKS_MODE, - XML_DOCUMENT, - - // detect Opera browser - OPERA = /opera/i.test(string.call(global.opera)), - - // skip simpe selector optimizations for Opera >= 11 - OPERA_QSAPI = OPERA && parseFloat(opera.version()) >= 11, - - // check Seletor API implementations - RE_BUGGY_QSAPI = NATIVE_QSAPI ? - (function() { - var pattern = [ ], div = doc.createElement('div'), element, - - expect = function(selector, context, element, n) { - var result = false; - context.appendChild(element); - try { result = context.querySelectorAll(selector).length == n; } catch(e) { } - while (context.firstChild) { context.removeChild(context.firstChild); } - return result; - }; - - // ^= $= *= operators bugs whith empty values (Opera 10 / IE8) - element = doc.createElement('p'); - element.setAttribute('class', ''); - expect('[class^=""]', div, element, 1) && - pattern.push('[*^$]=[\\x20\\t\\n\\r\\f]*(?:""|' + "'')"); - - // :checked bug with option elements (Firefox 3.6.x) - // it wrongly includes 'selected' options elements - // HTML5 rules says selected options also match - element = doc.createElement('option'); - element.setAttribute('selected', 'selected'); - expect(':checked', div, element, 0) && - pattern.push(':checked'); - - // :enabled :disabled bugs with hidden fields (Firefox 3.5 QSA bug) - // http://www.w3.org/TR/html5/interactive-elements.html#selector-enabled - // IE8 QSA has problems too and throws error with these dynamic pseudos - element = doc.createElement('input'); - element.setAttribute('type', 'hidden'); - expect(':enabled', div, element, 0) && - pattern.push(':enabled', ':disabled'); - - // :link bugs with hyperlinks matching (Firefox/Safari) - element = doc.createElement('link'); - element.setAttribute('href', 'x'); - expect(':link', div, element, 1) || - pattern.push(':link'); - - // avoid attribute selectors for IE QSA - if (BUGGY_HAS_ATTRIBUTE) { - // IE fails in reading: - // - original values for input/textarea - // - original boolean values for controls - pattern.push('\\[[\\x20\\t\\n\\r\\f]*(?:checked|disabled|ismap|multiple|readonly|selected|value)'); - } - - return pattern.length ? - new RegExp(pattern.join('|')) : - { 'test': function() { return false; } }; - - })() : - true, - - // matches class selectors - RE_CLASS = new RegExp('(?:\\[[\\x20\\t\\n\\r\\f]*class\\b|\\.' + identifier + ')'), - - // matches simple id, tag & class selectors - RE_SIMPLE_SELECTOR = new RegExp( - !(BUGGY_GEBTN && BUGGY_GEBCN) ? !OPERA ? - '^(?:\\*|[.#]?-?[_a-zA-Z]{1}' + encoding + '*)$' : - '^(?:\\*|#-?[_a-zA-Z]{1}' + encoding + '*)$' : - '^#?-?[_a-zA-Z]{1}' + encoding + '*$'), - - /*----------------------------- LOOKUP OBJECTS -----------------------------*/ - - LINK_NODES = { 'a': 1, 'A': 1, 'area': 1, 'AREA': 1, 'link': 1, 'LINK': 1 }, - - // boolean attributes should return attribute name instead of true/false - ATTR_BOOLEAN = { - 'checked': 1, 'disabled': 1, 'ismap': 1, - 'multiple': 1, 'readonly': 1, 'selected': 1 - }, - - // dynamic attributes that needs to be checked against original HTML value - ATTR_DEFAULT = { - 'value': 'defaultValue', - 'checked': 'defaultChecked', - 'selected': 'defaultSelected' - }, - - // attribute referencing URI data values need special treatment in IE - ATTR_URIDATA = { - 'action': 2, 'cite': 2, 'codebase': 2, 'data': 2, 'href': 2, - 'longdesc': 2, 'lowsrc': 2, 'src': 2, 'usemap': 2 - }, - - // HTML 5 draft specifications - // http://www.whatwg.org/specs/web-apps/current-work/#selectors - HTML_TABLE = { - // class attribute must be treated case-insensitive in HTML quirks mode - // initialized by default to Standard Mode (case-sensitive), - // set dynamically by the attribute resolver - 'class': 0, - 'accept': 1, 'accept-charset': 1, 'align': 1, 'alink': 1, 'axis': 1, - 'bgcolor': 1, 'charset': 1, 'checked': 1, 'clear': 1, 'codetype': 1, 'color': 1, - 'compact': 1, 'declare': 1, 'defer': 1, 'dir': 1, 'direction': 1, 'disabled': 1, - 'enctype': 1, 'face': 1, 'frame': 1, 'hreflang': 1, 'http-equiv': 1, 'lang': 1, - 'language': 1, 'link': 1, 'media': 1, 'method': 1, 'multiple': 1, 'nohref': 1, - 'noresize': 1, 'noshade': 1, 'nowrap': 1, 'readonly': 1, 'rel': 1, 'rev': 1, - 'rules': 1, 'scope': 1, 'scrolling': 1, 'selected': 1, 'shape': 1, 'target': 1, - 'text': 1, 'type': 1, 'valign': 1, 'valuetype': 1, 'vlink': 1 - }, - - // the following attributes must be treated case-insensitive in XHTML mode - // Niels Leenheer http://rakaz.nl/item/css_selector_bugs_case_sensitivity - XHTML_TABLE = { - 'accept': 1, 'accept-charset': 1, 'alink': 1, 'axis': 1, - 'bgcolor': 1, 'charset': 1, 'codetype': 1, 'color': 1, - 'enctype': 1, 'face': 1, 'hreflang': 1, 'http-equiv': 1, - 'lang': 1, 'language': 1, 'link': 1, 'media': 1, 'rel': 1, - 'rev': 1, 'target': 1, 'text': 1, 'type': 1, 'vlink': 1 - }, - - /*-------------------------- REGULAR EXPRESSIONS ---------------------------*/ - - // placeholder to add functionalities - Selectors = { - // as a simple example this will check - // for chars not in standard ascii table - // - // 'mySpecialSelector': { - // 'Expression': /\u0080-\uffff/, - // 'Callback': mySelectorCallback - // } - // - // 'mySelectorCallback' will be invoked - // only after passing all other standard - // checks and only if none of them worked - }, - - // attribute operators - Operators = { - '=': "n=='%m'", - '^=': "n.indexOf('%m')==0", - '*=': "n.indexOf('%m')>-1", - '|=': "(n+'-').indexOf('%m-')==0", - '~=': "(' '+n+' ').indexOf(' %m ')>-1", - '$=': "n.substr(n.length-'%m'.length)=='%m'" - }, - - // optimization expressions - Optimize = { - ID: new RegExp('^\\*?#(' + encoding + '+)|' + skipgroup), - TAG: new RegExp('^(' + encoding + '+)|' + skipgroup), - CLASS: new RegExp('^\\*?\\.(' + encoding + '+$)|' + skipgroup) - }, - - // precompiled Regular Expressions - Patterns = { - // structural pseudo-classes and child selectors - spseudos: /^\:(root|empty|(?:first|last|only)(?:-child|-of-type)|nth(?:-last)?(?:-child|-of-type)\(\s*(even|odd|(?:[-+]{0,1}\d*n\s*)?[-+]{0,1}\s*\d*)\s*\))?(.*)/i, - // uistates + dynamic + negation pseudo-classes - dpseudos: /^\:(link|visited|target|active|focus|hover|checked|disabled|enabled|selected|lang\(([-\w]{2,})\)|not\(([^()]*|.*)\))?(.*)/i, - // element attribute matcher - attribute: new RegExp('^\\[' + attrmatcher + '\\](.*)'), - // E > F - children: /^[\x20\t\n\r\f]*\>[\x20\t\n\r\f]*(.*)/, - // E + F - adjacent: /^[\x20\t\n\r\f]*\+[\x20\t\n\r\f]*(.*)/, - // E ~ F - relative: /^[\x20\t\n\r\f]*\~[\x20\t\n\r\f]*(.*)/, - // E F - ancestor: /^[\x20\t\n\r\f]+(.*)/, - // all - universal: /^\*(.*)/, - // id - id: new RegExp('^#(' + encoding + '+)(.*)'), - // tag - tagName: new RegExp('^(' + encoding + '+)(.*)'), - // class - className: new RegExp('^\\.(' + encoding + '+)(.*)') - }, - - /*------------------------------ UTIL METHODS ------------------------------*/ - - // concat elements to data - concatList = - function(data, elements) { - var i = -1, element; - if (!data.length && Array.slice) - return Array.slice(elements); - while ((element = elements[++i])) - data[data.length] = element; - return data; - }, - - // concat elements to data and callback - concatCall = - function(data, elements, callback) { - var i = -1, element; - while ((element = elements[++i])) { - if (false === callback(data[data.length] = element)) { break; } - } - return data; - }, - - // change context specific variables - switchContext = - function(from, force) { - var div, oldDoc = doc; - // save passed context - lastContext = from; - // set new context document - doc = from.ownerDocument || from; - if (force || oldDoc !== doc) { - // set document root - root = doc.documentElement; - // set host environment flags - XML_DOCUMENT = doc.createElement('DiV').nodeName == 'DiV'; - - // In quirks mode css class names are case insensitive. - // In standards mode they are case sensitive. See docs: - // https://developer.mozilla.org/en/Mozilla_Quirks_Mode_Behavior - // http://www.whatwg.org/specs/web-apps/current-work/#selectors - QUIRKS_MODE = !XML_DOCUMENT && - typeof doc.compatMode == 'string' ? - doc.compatMode.indexOf('CSS') < 0 : - (function() { - var style = doc.createElement('div').style; - return style && (style.width = 1) && style.width == '1px'; - })(); - - div = doc.createElement('div'); - div.appendChild(doc.createElement('p')).setAttribute('class', 'xXx'); - div.appendChild(doc.createElement('p')).setAttribute('class', 'xxx'); - - // GEBCN buggy in quirks mode, match count is: - // Firefox 3.0+ [xxx = 1, xXx = 1] - // Opera 10.63+ [xxx = 0, xXx = 2] - BUGGY_QUIRKS_GEBCN = - !XML_DOCUMENT && NATIVE_GEBCN && QUIRKS_MODE && - (div.getElementsByClassName('xxx').length != 2 || - div.getElementsByClassName('xXx').length != 2); - - // QSAPI buggy in quirks mode, match count is: - // At least Chrome 4+, Firefox 3.5+, Opera 10.x+, Safari 4+ [xxx = 1, xXx = 2] - // Safari 3.2 QSA doesn't work with mixedcase in quirksmode [xxx = 1, xXx = 0] - // https://bugs.webkit.org/show_bug.cgi?id=19047 - // must test the attribute selector '[class~=xxx]' - // before '.xXx' or the bug may not present itself - BUGGY_QUIRKS_QSAPI = - !XML_DOCUMENT && NATIVE_QSAPI && QUIRKS_MODE && - (div.querySelectorAll('[class~=xxx]').length != 2 || - div.querySelectorAll('.xXx').length != 2); - - Config.CACHING && Dom.setCache(true, doc); - } - }, - - /*------------------------------ DOM METHODS -------------------------------*/ - - // element by id (raw) - // @return reference or null - byIdRaw = - function(id, elements) { - var i = -1, element = null; - while ((element = elements[++i])) { - if (element.getAttribute('id') == id) { - break; - } - } - return element; - }, - - // element by id - // @return reference or null - _byId = !BUGGY_GEBID ? - function(id, from) { - id = id.replace(/\\([^\\]{1})/g, '$1'); - return from.getElementById && from.getElementById(id) || - byIdRaw(id, from.getElementsByTagName('*')); - } : - function(id, from) { - var element = null; - id = id.replace(/\\([^\\]{1})/g, '$1'); - if (XML_DOCUMENT || from.nodeType != 9) { - return byIdRaw(id, from.getElementsByTagName('*')); - } - if ((element = from.getElementById(id)) && - element.name == id && from.getElementsByName) { - return byIdRaw(id, from.getElementsByName(id)); - } - return element; - }, - - // publicly exposed byId - // @return reference or null - byId = - function(id, from) { - switchContext(from || (from = doc)); - return _byId(id, from); - }, - - // elements by tag (raw) - // @return array - byTagRaw = - function(tag, from) { - var any = tag == '*', element = from, elements = [ ], next = element.firstChild; - any || (tag = tag.toUpperCase()); - while ((element = next)) { - if (element.tagName > '@' && (any || element.tagName.toUpperCase() == tag)) { - elements[elements.length] = element; - } - if ((next = element.firstChild || element.nextSibling)) continue; - while (!next && (element = element.parentNode) && element !== from) { - next = element.nextSibling; - } - } - return elements; - }, - - // elements by tag - // @return array - _byTag = !BUGGY_GEBTN && NATIVE_SLICE_PROTO ? - function(tag, from) { - return XML_DOCUMENT || from.nodeType == 11 ? byTagRaw(tag, from) : - slice.call(from.getElementsByTagName(tag), 0); - } : - function(tag, from) { - var i = -1, j = i, data = [ ], - element, elements = from.getElementsByTagName(tag); - if (tag == '*') { - while ((element = elements[++i])) { - if (element.nodeName > '@') - data[++j] = element; - } - } else { - while ((element = elements[++i])) { - data[i] = element; - } - } - return data; - }, - - // publicly exposed byTag - // @return array - byTag = - function(tag, from) { - switchContext(from || (from = doc)); - return _byTag(tag, from); - }, - - // publicly exposed byName - // @return array - byName = - function(name, from) { - return select('[name="' + name.replace(/\\/g, '') + '"]', from); - }, - - // elements by class (raw) - // @return array - byClassRaw = - function(name, from) { - var i = -1, j = i, data = [ ], element, elements = _byTag('*', from), n; - name = ' ' + (QUIRKS_MODE ? name.toLowerCase() : name).replace(/\\/g, '') + ' '; - while ((element = elements[++i])) { - n = XML_DOCUMENT ? element.getAttribute('class') : element.className; - if (n && n.length && (' ' + (QUIRKS_MODE ? n.toLowerCase() : n). - replace(reWhiteSpace, ' ') + ' ').indexOf(name) > -1) { - data[++j] = element; - } - } - return data; - }, - - // elements by class - // @return array - _byClass = - function(name, from) { - return (BUGGY_GEBCN || BUGGY_QUIRKS_GEBCN || XML_DOCUMENT || !from.getElementsByClassName) ? - byClassRaw(name, from) : slice.call(from.getElementsByClassName(name.replace(/\\/g, '')), 0); - }, - - // publicly exposed byClass - // @return array - byClass = - function(name, from) { - switchContext(from || (from = doc)); - return _byClass(name, from); - }, - - // check element is descendant of container - // @return boolean - contains = 'compareDocumentPosition' in root ? - function(container, element) { - return (container.compareDocumentPosition(element) & 16) == 16; - } : 'contains' in root ? - function(container, element) { - return container !== element && container.contains(element); - } : - function(container, element) { - while ((element = element.parentNode)) { - if (element === container) return true; - } - return false; - }, - - // attribute value - // @return string - getAttribute = !BUGGY_GET_ATTRIBUTE ? - function(node, attribute) { - return node.getAttribute(attribute) || ''; - } : - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (ATTR_DEFAULT[attribute]) { - return node[ATTR_DEFAULT[attribute]] || ''; - } - return ( - // specific URI data attributes (parameter 2 to fix IE bug) - ATTR_URIDATA[attribute] ? node.getAttribute(attribute, 2) || '' : - // boolean attributes should return name instead of true/false - ATTR_BOOLEAN[attribute] ? node.getAttribute(attribute) ? attribute : '' : - ((node = node.getAttributeNode(attribute)) && node.value) || ''); - }, - - // attribute presence - // @return boolean - hasAttribute = !BUGGY_HAS_ATTRIBUTE ? - function(node, attribute) { - return XML_DOCUMENT ? - !!node.getAttribute(attribute) : - node.hasAttribute(attribute); - } : - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (ATTR_DEFAULT[attribute]) { - return !!node[ATTR_DEFAULT[attribute]]; - } - // need to get at AttributeNode first on IE - node = node.getAttributeNode(attribute); - // use both "specified" & "nodeValue" properties - return !!(node && (node.specified || node.nodeValue)); - }, - - // check node emptyness - // @return boolean - isEmpty = - function(node) { - node = node.firstChild; - while (node) { - if (node.nodeType == 3 || node.nodeName > '@') return false; - node = node.nextSibling; - } - return true; - }, - - // check if element matches the :link pseudo - // @return boolean - isLink = - function(element) { - return hasAttribute(element,'href') && LINK_NODES[element.nodeName]; - }, - - // child position by nodeType - // @return number - nthElement = - function(element, last) { - var count = 1, succ = last ? 'nextSibling' : 'previousSibling'; - while ((element = element[succ])) { - if (element.nodeName > '@') ++count; - } - return count; - }, - - // child position by nodeName - // @return number - nthOfType = - function(element, last) { - var count = 1, succ = last ? 'nextSibling' : 'previousSibling', type = element.nodeName; - while ((element = element[succ])) { - if (element.nodeName == type) ++count; - } - return count; - }, - - /*------------------------------- DEBUGGING --------------------------------*/ - - // get/set (string/object) working modes - configure = - function(option) { - if (typeof option == 'string') { return Config[option]; } - if (typeof option != 'object') { return false; } - for (var i in option) { - Config[i] = !!option[i]; - if (i == 'SIMPLENOT') { - matchContexts = { }; - matchResolvers = { }; - selectContexts = { }; - selectResolvers = { }; - Config['USE_QSAPI'] = false; - reValidator = new RegExp(extendedValidator, 'g'); - } else if (i == 'USE_QSAPI') { - Config[i] = !!option[i] && NATIVE_QSAPI; - reValidator = new RegExp(standardValidator, 'g'); - } - } - return true; - }, - - // control user notifications - emit = - function(message) { - message = 'SYNTAX_ERR: ' + message + ' '; - if (Config.VERBOSITY) { - throw new SyntaxError(message); - } else { - if (global.console && global.console.log) { - global.console.log(message); - } else { - global.status += message; - } - } - }, - - Config = { - - // used to enable/disable caching of result sets - CACHING: false, - - // by default do not add missing left/right context - // to selector string shortcuts like "+div" or "ul>" - // callable Dom.shortcuts method has to be available - SHORTCUTS: false, - - // by default disable complex selectors nested in - // ':not()' pseudo-classes, as for specifications - SIMPLENOT: true, - - // HTML5 handling for the ":checked" pseudo-class - USE_HTML5: true, - - // controls enabling the Query Selector API branch - USE_QSAPI: NATIVE_QSAPI, - - // controls the engine error/warning notifications - VERBOSITY: true - - }, - - /*---------------------------- COMPILER METHODS ----------------------------*/ - - // code string reused to build compiled functions - ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break main;else continue main;', - - // compile a comma separated group of selector - // @mode boolean true for select, false for match - // return a compiled function - compile = - function(selector, source, mode) { - - var parts = typeof selector == 'string' ? selector.match(reSplitGroup) : selector; - - // ensures that source is a string - typeof source == 'string' || (source = ''); - - if (parts.length == 1) { - source += compileSelector(parts[0], mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } else { - // for each selector in the group - var i = -1, seen = { }, token; - while ((token = parts[++i])) { - token = token.replace(reTrimSpaces, ''); - // avoid repeating the same token - // in comma separated group (p, p) - if (!seen[token] && (seen[token] = true)) { - source += compileSelector(token, mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } - } - } - - if (mode) { - // for select method - return new Function('c,s,r,d,h,g,f,v', - 'var N,n,x=0,k=-1,e;main:while((e=c[++k])){' + source + '}return r;'); - } else { - // for match method - return new Function('e,s,r,d,h,g,f,v', - 'var N,n,x=0,k=e;' + source + 'return false;'); - } - }, - - // allows to cache already visited nodes - FILTER = - 'var z=v[@]||(v[@]=[]),l=z.length-1;' + - 'while(l>=0&&z[l]!==e)--l;' + - 'if(l!==-1){break;}' + - 'z[z.length]=e;', - - // compile a CSS3 string selector into ad-hoc javascript matching function - // @return string (to be compiled) - compileSelector = - function(selector, source, mode) { - - var a, b, n, k = 0, expr, match, result, status, test, type; - - while (selector) { - - k++; - - // *** Universal selector - // * match all (empty block, do not remove) - if ((match = selector.match(Patterns.universal))) { - // do nothing, handled in the compiler where - // BUGGY_GEBTN return comment nodes (ex: IE) - expr = ''; - } - - // *** ID selector - // #Foo Id case sensitive - else if ((match = selector.match(Patterns.id))) { - // document can contain conflicting elements (id/name) - // prototype selector unit need this method to recover bad HTML forms - source = 'if(' + (XML_DOCUMENT ? - 's.getAttribute(e,"id")' : - '(e.submit?s.getAttribute(e,"id"):e.id)') + - '=="' + match[1] + '"' + - '){' + source + '}'; - } - - // *** Type selector - // Foo Tag (case insensitive) - else if ((match = selector.match(Patterns.tagName))) { - // both tagName and nodeName properties may be upper/lower case - // depending on their creation NAMESPACE in createElementNS() - source = 'if(e.nodeName' + (XML_DOCUMENT ? - '=="' + match[1] + '"' : '.toUpperCase()' + - '=="' + match[1].toUpperCase() + '"') + - '){' + source + '}'; - } - - // *** Class selector - // .Foo Class (case sensitive) - else if ((match = selector.match(Patterns.className))) { - // W3C CSS3 specs: element whose "class" attribute has been assigned a - // list of whitespace-separated values, see section 6.4 Class selectors - // and notes at the bottom; explicitly non-normative in this specification. - source = 'if((n=' + (XML_DOCUMENT ? - 's.getAttribute(e,"class")' : 'e.className') + - ')&&n.length&&(" "+' + (QUIRKS_MODE ? 'n.toLowerCase()' : 'n') + - '.replace(' + reWhiteSpace + '," ")+" ").indexOf(" ' + - (QUIRKS_MODE ? match[1].toLowerCase() : match[1]) + ' ")>-1' + - '){' + source + '}'; - } - - // *** Attribute selector - // [attr] [attr=value] [attr="value"] [attr='value'] and !=, *=, ~=, |=, ^=, $= - // case sensitivity is treated differently depending on the document type (see map) - else if ((match = selector.match(Patterns.attribute))) { - - // xml namespaced attribute ? - expr = match[1].split(':'); - expr = expr.length == 2 ? expr[1] : expr[0] + ''; - - if (match[2] && !Operators[match[2]]) { - emit('Unsupported operator in attribute selectors "' + selector + '"'); - return ''; - } - - test = false; - type = 'false'; - - // replace Operators parameter if needed - if (match[2] && match[4] && (type = Operators[match[2]])) { - // case treatment depends on document - HTML_TABLE['class'] = QUIRKS_MODE ? 1 : 0; - // replace escaped values and HTML entities - match[4] = match[4].replace(/(\x22|\x27)/g, '\\$1'); - match[4] = match[4].replace(/\\([0-9a-f]{2,2})/, '\\x$1'); - test = (XML_DOCUMENT ? XHTML_TABLE : HTML_TABLE)[expr.toLowerCase()]; - type = type.replace(/\%m/g, test ? match[4].toLowerCase() : match[4]); - } else if (match[2] == '!=' || match[2] == '=') { - match[4] = match[4].replace(/(\x22|\x27)/g, '\\$1'); - type = 'n' + match[2] + '="' + match[4] + '"'; - } - - // build expression for has/getAttribute - expr = 'n=s.' + (match[2] ? 'get' : 'has') + - 'Attribute(e,"' + match[1] + '")' + - (test ? '.toLowerCase();' : ';'); - - source = expr + 'if(' + (match[2] ? type : 'n') + '){' + source + '}'; - } - - // *** Adjacent sibling combinator - // E + F (F adiacent sibling of E) - else if ((match = selector.match(Patterns.adjacent))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = NATIVE_TRAVERSAL_API ? - 'var N' + k + '=e;while(e&&(e=e.previousElementSibling)){' + source + 'break;}e=N' + k + ';' : - 'var N' + k + '=e;while(e&&(e=e.previousSibling)){if(e.nodeName>"@"){' + source + 'break;}}e=N' + k + ';'; - } - - // *** General sibling combinator - // E ~ F (F relative sibling of E) - else if ((match = selector.match(Patterns.relative))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = NATIVE_TRAVERSAL_API ? - ('var N' + k + '=e;e=e.parentNode.firstElementChild;' + - 'while(e&&e!==N' + k + '){' + source + 'e=e.nextElementSibling;}e=N' + k + ';') : - ('var N' + k + '=e;e=e.parentNode.firstChild;' + - 'while(e&&e!==N' + k + '){if(e.nodeName>"@"){' + source + '}e=e.nextSibling;}e=N' + k + ';'); - } - - // *** Child combinator - // E > F (F children of E) - else if ((match = selector.match(Patterns.children))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + 'break;}e=N' + k + ';'; - } - - // *** Descendant combinator - // E F (E ancestor of F) - else if ((match = selector.match(Patterns.ancestor))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + '}e=N' + k + ';'; - } - - // *** Structural pseudo-classes - // :root, :empty, - // :first-child, :last-child, :only-child, - // :first-of-type, :last-of-type, :only-of-type, - // :nth-child(), :nth-last-child(), :nth-of-type(), :nth-last-of-type() - else if ((match = selector.match(Patterns.spseudos)) && match[1]) { - - switch (match[1]) { - case 'root': - // element root of the document - if (match[3]) { - source = 'if(e===h||s.contains(h,e)){' + source + '}'; - } else { - source = 'if(e===h){' + source + '}'; - } - break; - - case 'empty': - // element that has no children - source = 'if(s.isEmpty(e)){' + source + '}'; - break; - - default: - if (match[1] && match[2]) { - if (match[2] == 'n') { - source = 'if(e!==h){' + source + '}'; - break; - } else if (match[2] == 'even') { - a = 2; - b = 0; - } else if (match[2] == 'odd') { - a = 2; - b = 1; - } else { - // assumes correct "an+b" format, "b" before "a" to keep "n" values - b = ((n = match[2].match(/(-?\d+)$/)) ? parseInt(n[1], 10) : 0); - a = ((n = match[2].match(/(-?\d*)n/i)) ? parseInt(n[1], 10) : 0); - if (n && n[1] == '-') a = -1; - } - - // build test expression out of structural pseudo (an+b) parameters - // see here: http://www.w3.org/TR/css3-selectors/#nth-child-pseudo - test = a > 1 ? - (/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' : - 'n>=' + b + '&&(n-(' + b + '))%' + a + '==0' : a < -1 ? - (/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' : - 'n<=' + b + '&&(n-(' + b + '))%' + a + '==0' : a=== 0 ? - 'n==' + b : - (/last/i.test(match[1])) ? - a == -1 ? 'n>=' + b : 'n<=' + b : - a == -1 ? 'n<=' + b : 'n>=' + b; - - // 4 cases: 1 (nth) x 4 (child, of-type, last-child, last-of-type) - source = - 'if(e!==h){' + - 'n=s[' + (/-of-type/i.test(match[1]) ? '"nthOfType"' : '"nthElement"') + ']' + - '(e,' + (/last/i.test(match[1]) ? 'true' : 'false') + ');' + - 'if(' + test + '){' + source + '}' + - '}'; - - } else { - // 6 cases: 3 (first, last, only) x 1 (child) x 2 (-of-type) - a = /first/i.test(match[1]) ? 'previous' : 'next'; - n = /only/i.test(match[1]) ? 'previous' : 'next'; - b = /first|last/i.test(match[1]); - - type = /of-type/i.test(match[1]) ? '&&n.nodeName!=e.nodeName' : '&&n.nodeName<"@"'; - source = 'if(e!==h){' + - ( 'n=e;while((n=n.' + a + 'Sibling)' + type + ');if(!n){' + (b ? source : - 'n=e;while((n=n.' + n + 'Sibling)' + type + ');if(!n){' + source + '}') + '}' ) + '}'; - } - break; - } - - } - - // *** negation, user action and target pseudo-classes - // *** UI element states and dynamic pseudo-classes - // CSS3 :not, :checked, :enabled, :disabled, :target - // CSS3 :active, :hover, :focus - // CSS3 :link, :visited - else if ((match = selector.match(Patterns.dpseudos)) && match[1]) { - - switch (match[1].match(/^\w+/)[0]) { - // CSS3 negation pseudo-class - case 'not': - // compile nested selectors, DO NOT pass the callback parameter - // SIMPLENOT allow disabling complex selectors nested - // in ':not()' pseudo-classes, breaks some test units - expr = match[3].replace(reTrimSpaces, ''); - - if (Config.SIMPLENOT && !reSimpleNot.test(expr)) { - // see above, log error but continue execution - emit('Negation pseudo-class only accepts simple selectors "' + selector + '"'); - return ''; - } else { - if ('compatMode' in doc) { - source = 'if(!' + compile(expr, '', false) + '(e,s,r,d,h,g)){' + source + '}'; - } else { - source = 'if(!s.match(e, "' + expr.replace(/\x22/g, '\\"') + '",g)){' + source +'}'; - } - } - break; - - // CSS3 UI element states - case 'checked': - // for radio buttons checkboxes (HTML4) and options (HTML5) - source = 'if((typeof e.form!=="undefined"&&(/^(?:radio|checkbox)$/i).test(e.type)&&e.checked)' + - (Config.USE_HTML5 ? '||(/^option$/i.test(e.nodeName)&&(e.selected||e.checked))' : '') + - '){' + source + '}'; - break; - case 'disabled': - // does not consider hidden input fields - source = 'if(((typeof e.form!=="undefined"' + - (Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') + - ')||s.isLink(e))&&e.disabled===true){' + source + '}'; - break; - case 'enabled': - // does not consider hidden input fields - source = 'if(((typeof e.form!=="undefined"' + - (Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') + - ')||s.isLink(e))&&e.disabled===false){' + source + '}'; - break; - - // CSS3 lang pseudo-class - case 'lang': - test = ''; - if (match[2]) test = match[2].substr(0, 2) + '-'; - source = 'do{(n=e.lang||"").toLowerCase();' + - 'if((n==""&&h.lang=="' + match[2].toLowerCase() + '")||' + - '(n&&(n=="' + match[2].toLowerCase() + - '"||n.substr(0,3)=="' + test.toLowerCase() + '")))' + - '{' + source + 'break;}}while((e=e.parentNode)&&e!==g);'; - break; - - // CSS3 target pseudo-class - case 'target': - n = doc.location ? doc.location.hash : ''; - if (n) { - source = 'if(e.id=="' + n.slice(1) + '"){' + source + '}'; - } - break; - - // CSS3 dynamic pseudo-classes - case 'link': - source = 'if(s.isLink(e)&&!e.visited){' + source + '}'; - break; - case 'visited': - source = 'if(s.isLink(e)&&e.visited){' + source + '}'; - break; - - // CSS3 user action pseudo-classes IE & FF3 have native support - // these capabilities may be emulated by some event managers - case 'active': - if (XML_DOCUMENT) break; - source = 'if(e===d.activeElement){' + source + '}'; - break; - case 'hover': - if (XML_DOCUMENT) break; - source = 'if(e===d.hoverElement){' + source + '}'; - break; - case 'focus': - if (XML_DOCUMENT) break; - source = NATIVE_FOCUS ? - 'if(e===d.activeElement&&d.hasFocus()&&(e.type||e.href||!isNaN(e.tabIndex))){' + source + '}' : - 'if(e===d.activeElement&&(e.type||e.href)){' + source + '}'; - break; - - // CSS2 selected pseudo-classes, not part of current CSS3 drafts - // the 'selected' property is only available for option elements - case 'selected': - // fix Safari selectedIndex property bug - expr = BUGGY_SELECTED ? '||(n=e.parentNode)&&n.options[n.selectedIndex]===e' : ''; - source = 'if(/^option$/i.test(e.nodeName)&&(e.selected' + expr + ')){' + source + '}'; - break; - - default: - break; - } - - } - - else { - - // this is where external extensions are - // invoked if expressions match selectors - expr = false; - status = false; - for (expr in Selectors) { - if ((match = selector.match(Selectors[expr].Expression)) && match[1]) { - result = Selectors[expr].Callback(match, source); - source = result.source; - status = result.status; - if (status) { break; } - } - } - - // if an extension fails to parse the selector - // it must return a false boolean in "status" - if (!status) { - // log error but continue execution, don't throw real exceptions - // because blocking following processes maybe is not a good idea - emit('Unknown pseudo-class selector "' + selector + '"'); - return ''; - } - - if (!expr) { - // see above, log error but continue execution - emit('Unknown token in selector "' + selector + '"'); - return ''; - } - - } - - // error if no matches found by the pattern scan - if (!match) { - emit('Invalid syntax in selector "' + selector + '"'); - return ''; - } - - // ensure "match" is not null or empty since - // we do not throw real DOMExceptions above - selector = match && match[match.length - 1]; - } - - return source; - }, - - /*----------------------------- QUERY METHODS ------------------------------*/ - - // match element with selector - // @return boolean - match = - function(element, selector, from, callback) { - - var parts; - - if (!(element && element.nodeName > '@')) { - emit('Invalid element argument'); - return false; - } else if (!selector || typeof selector != 'string') { - emit('Invalid selector argument'); - return false; - } else if (from && from.nodeType == 1 && !contains(from, element)) { - return false; - } else if (lastContext !== from) { - // reset context data when it changes - // and ensure context is set to a default - switchContext(from || (from = element.ownerDocument)); - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, element, from)); - - if (lastMatcher != selector) { - // process valid selector strings - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleMatch = (parts = selector.match(reSplitGroup)).length < 2; - // save passed selector - lastMatcher = selector; - lastPartsMatch = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return false; - } - } else parts = lastPartsMatch; - - // compile matcher resolver if necessary - if (!matchResolvers[selector] || matchContexts[selector] !== from) { - matchResolvers[selector] = compile(isSingleMatch ? [selector] : parts, '', false); - matchContexts[selector] = from; - } - - return matchResolvers[selector](element, Snapshot, [ ], doc, root, from, callback, { }); - }, - - // select only the first element - // matching selector (document ordered) - first = - function(selector, from) { - return select(selector, from, function() { return false; })[0] || null; - }, - - // select elements matching selector - // using new Query Selector API - // or cross-browser client API - // @return array - select = - function(selector, from, callback) { - - var i, changed, element, elements, parts, token, original = selector; - - if (arguments.length === 0) { - emit('Missing required selector parameters'); - return [ ]; - } else if (selector === '') { - emit('Empty selector string'); - return [ ]; - } else if (typeof selector != 'string') { - return [ ]; - } else if (from && !(/1|9|11/).test(from.nodeType)) { - emit('Invalid context element'); - return [ ]; - } else if (lastContext !== from) { - // reset context data when it changes - // and ensure context is set to a default - switchContext(from || (from = doc)); - } - - if (Config.CACHING && (elements = Dom.loadResults(original, from, doc, root))) { - return callback ? concatCall([ ], elements, callback) : elements; - } - - if (!OPERA_QSAPI && RE_SIMPLE_SELECTOR.test(selector)) { - switch (selector.charAt(0)) { - case '#': - if ((element = _byId(selector.slice(1), from))) { - elements = [ element ]; - } else elements = [ ]; - break; - case '.': - elements = _byClass(selector.slice(1), from); - break; - default: - elements = _byTag(selector, from); - break; - } - } - - else if (!XML_DOCUMENT && Config.USE_QSAPI && - !(BUGGY_QUIRKS_QSAPI && RE_CLASS.test(selector)) && - !RE_BUGGY_QSAPI.test(selector)) { - try { - elements = from.querySelectorAll(selector); - } catch(e) { } - } - - if (elements) { - elements = callback ? concatCall([ ], elements, callback) : - NATIVE_SLICE_PROTO ? slice.call(elements) : concatList([ ], elements); - Config.CACHING && Dom.saveResults(original, from, doc, elements); - return elements; - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, from)); - - if ((changed = lastSelector != selector)) { - // process valid selector strings - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleSelect = (parts = selector.match(reSplitGroup)).length < 2; - // save passed selector - lastSelector = selector; - lastPartsSelect = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return [ ]; - } - } else parts = lastPartsSelect; - - // commas separators are treated sequentially to maintain order - if (from.nodeType == 11) { - - elements = from.childNodes; - - } else if (!XML_DOCUMENT && isSingleSelect) { - - if (changed) { - // get right most selector token - parts = selector.match(reSplitToken); - token = parts[parts.length - 1]; - - // only last slice before :not rules - lastSlice = token.split(':not')[0]; - - // position where token was found - lastPosition = selector.length - token.length; - } - - // ID optimization RTL, to reduce number of elements to visit - if ((parts = lastSlice.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, from))) { - if (match(element, selector)) { - callback && callback(element); - elements = [ element ]; - } else elements = [ ]; - } - } - - // ID optimization LTR, to reduce selection context searches - else if ((parts = selector.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, doc))) { - if ('#' + token == selector) { - callback && callback(element); - elements = [ element ]; - } else if (/[>+~]/.test(selector)) { - from = element.parentNode; - } else { -// selector = selector.replace('#' + token, '*'); -// lastPosition -= token.length + 1; - from = element; - } - } else elements = [ ]; - } - - if (elements) { - Config.CACHING && Dom.saveResults(original, from, doc, elements); - return elements; - } - - if (!NATIVE_GEBCN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) { - if ((elements = _byTag(token, from)).length === 0) { return [ ]; } - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*'); - } - - else if ((parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) { - if ((elements = _byClass(token, from)).length === 0) { return [ ]; } - if (reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1))) { - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, ''); - } else { - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, '*'); - } - } - - else if ((parts = selector.match(Optimize.CLASS)) && (token = parts[1])) { - if ((elements = _byClass(token, from)).length === 0) { return [ ]; } - for (i = 0, els = [ ]; elements.length > i; ++i) { - els = concatList(els, elements[i].getElementsByTagName('*')); - } - elements = els; - if (reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1))) { - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, ''); - } else { - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, '*'); - } - } - - else if (NATIVE_GEBCN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) { - if ((elements = _byTag(token, from)).length === 0) { return [ ]; } - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*'); - } - - } - - if (!elements) { - elements = /^(?:applet|object)$/i.test(from.nodeName) ? from.childNodes : _byTag('*', from); - } - // end of prefiltering pass - - // compile selector resolver if necessary - if (!selectResolvers[selector] || selectContexts[selector] !== from) { - selectResolvers[selector] = compile(isSingleSelect ? [selector] : parts, '', true); - selectContexts[selector] = from; - } - - elements = selectResolvers[selector](elements, Snapshot, [ ], doc, root, from, callback, { }); - - Config.CACHING && Dom.saveResults(original, from, doc, elements); - - return elements; - }, - - /*-------------------------------- STORAGE ---------------------------------*/ - - // compiled match functions returning booleans - matchContexts = { }, - matchResolvers = { }, - - // compiled select functions returning collections - selectContexts = { }, - selectResolvers = { }, - - // used to pass methods to compiled functions - Snapshot = { - - // element indexing methods - nthElement: nthElement, - nthOfType: nthOfType, - - // element inspection methods - getAttribute: getAttribute, - hasAttribute: hasAttribute, - - // element selection methods - byClass: _byClass, - byName: byName, - byTag: _byTag, - byId: _byId, - - // helper/check methods - contains: contains, - isEmpty: isEmpty, - isLink: isLink, - - // selection/matching - select: select, - match: match - }, - - Tokens = { - prefixes: prefixes, - encoding: encoding, - operators: operators, - whitespace: whitespace, - identifier: identifier, - attributes: attributes, - combinators: combinators, - pseudoclass: pseudoclass, - pseudoparms: pseudoparms, - quotedvalue: quotedvalue - }; - - /*------------------------------- PUBLIC API -------------------------------*/ - - // code referenced by extensions - Dom.ACCEPT_NODE = ACCEPT_NODE; - - // log resolvers errors/warnings - Dom.emit = emit; - - // retrieve element by id attr - Dom.byId = byId; - - // retrieve elements by tag name - Dom.byTag = byTag; - - // retrieve elements by name attr - Dom.byName = byName; - - // retrieve elements by class name - Dom.byClass = byClass; - - // read the value of the attribute - // as was in the original HTML code - Dom.getAttribute = getAttribute; - - // check for the attribute presence - // as was in the original HTML code - Dom.hasAttribute = hasAttribute; - - // element match selector, return boolean true/false - Dom.match = match; - - // first element match only, return element or null - Dom.first = first; - - // elements matching selector, starting from element - Dom.select = select; - - // compile selector into ad-hoc javascript resolver - Dom.compile = compile; - - // check that two elements are ancestor/descendant - Dom.contains = contains; - - // handle selector engine configuration settings - Dom.configure = configure; - - // initialize caching for each document - Dom.setCache = function() { return; }; - - // load previously collected result set - Dom.loadResults = function() { return; }; - - // save previously collected result set - Dom.saveResults = function() { return; }; - - // handle missing context in selector strings - Dom.shortcuts = function(x) { return x; }; - - // options enabing specific engine functionality - Dom.Config = Config; - - // pass methods references to compiled resolvers - Dom.Snapshot = Snapshot; - - // operators descriptor - // for attribute operators extensions - Dom.Operators = Operators; - - // selectors descriptor - // for pseudo-class selectors extensions - Dom.Selectors = Selectors; - - // export string patterns - Dom.Tokens = Tokens; - - // add or overwrite user defined operators - Dom.registerOperator = - function(symbol, resolver) { - Operators[symbol] || (Operators[symbol] = resolver); - }; - - // add selector patterns for user defined callbacks - Dom.registerSelector = - function(name, rexp, func) { - Selectors[name] || (Selectors[name] = { - Expression: rexp, - Callback: func - }); - }; - - /*---------------------------------- INIT ----------------------------------*/ - - // init context specific variables - switchContext(doc, true); - -}); diff --git a/node_modules/jsdom/node_modules/nwmatcher/package.json b/node_modules/jsdom/node_modules/nwmatcher/package.json deleted file mode 100644 index 8a8a5a8..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "nwmatcher", - "version": "1.3.0", - "description": "A CSS3-compliant JavaScript selector engine.", - "homepage": "http://javascript.nwbox.com/NWMatcher/", - "main": "./src/nwmatcher", - "keywords": [ - "css", - "matcher", - "selector", - "ender" - ], - "licenses": [ - { - "type": "MIT", - "url": "http://javascript.nwbox.com/NWMatcher/MIT-LICENSE" - } - ], - "author": { - "name": "Diego Perini", - "email": "diego.perini@gmail.com", - "url": "http://www.iport.it/" - }, - "maintainers": [ - { - "name": "Diego Perini", - "email": "diego.perini@gmail.com", - "url": "http://www.iport.it/" - } - ], - "bugs": { - "url": "http://github.com/dperini/nwmatcher/issues" - }, - "repository": { - "type": "git", - "url": "git://github.com/dperini/nwmatcher.git" - }, - "ender": "./lib/ender/bridge.js", - "readme": "ERROR: No README.md file found!", - "_id": "nwmatcher@1.3.0", - "dist": { - "shasum": "d4fd64d241510ee6f3861b77a71fc9243143c116" - }, - "_from": "nwmatcher@>=1.3.0" -} diff --git a/node_modules/jsdom/node_modules/nwmatcher/src/NEW/nwmatcher-base.js b/node_modules/jsdom/node_modules/nwmatcher/src/NEW/nwmatcher-base.js deleted file mode 100644 index c92303f..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/src/NEW/nwmatcher-base.js +++ /dev/null @@ -1,668 +0,0 @@ -/* - * Copyright (C) 2007-2012 Diego Perini - * All rights reserved. - * - * nwmatcher-base.js - A fast CSS selector engine and matcher - * - * Author: Diego Perini - * Version: 1.3.0beta - * Created: 20070722 - * Release: 20121122 - * - * License: - * http://javascript.nwbox.com/NWMatcher/MIT-LICENSE - * Download: - * http://javascript.nwbox.com/NWMatcher/nwmatcher.js - */ - -(function(global, factory) { - - if (typeof module === 'object' && typeof exports === 'object') { - module.exports = function (browserGlobal) { - var exports = { }; - factory(browserGlobal, exports); - return exports; - }; - } else { - if (!global.NW) { - global.NW = { }; - } - if (!global.NW.Dom) { - global.NW.Dom = { }; - } - factory(global, global.NW.Dom); - } - -})(this, function(global, exports) { - - var version = 'nwmatcher-1.3.0beta', - - Dom = exports, - - doc = global.document, - root = doc.documentElement, - - slice = [ ].slice, - - isSingleMatch, - isSingleSelect, - - lastSlice, - lastContext, - lastPosition, - - lastMatcher, - lastSelector, - - lastPartsMatch, - lastPartsSelect, - - prefixes = '[#.:]?', - operators = '([~*^$|!]?={1})', - whitespace = '[\\x20\\t\\n\\r\\f]*', - combinators = '[\\x20]|[>+~][^>+~]', - pseudoparms = '(?:[-+]?\\d*n)?[-+]?\\d*', - - quotedvalue = '"[^"]*"' + "|'[^']*'", - skipgroup = '\\[.*\\]|\\(.*\\)|\\{.*\\}', - - encoding = '(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)', - identifier = '(?:-?[_a-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+', - - attrcheck = '(' + quotedvalue + '|' + identifier + ')', - attributes = whitespace + '(' + encoding + '+:?' + encoding + '+)' + - whitespace + '(?:' + operators + whitespace + attrcheck + ')?' + whitespace, - - attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'), - - pseudoclass = '((?:' + - pseudoparms + '|' + quotedvalue + '|' + - prefixes + '|' + encoding + '+|' + - '\\[' + attributes + '\\]|' + - '\\(.+\\)|' + whitespace + '|' + - ',)+)', - - extensions = '.+', - - standardValidator = - '(?=[\\x20\\t\\n\\r\\f]*[^>+~(){}<>])' + - '(' + - '\\*' + - '|(?:' + prefixes + identifier + ')' + - '|' + combinators + - '|\\[' + attributes + '\\]' + - '|\\(' + pseudoclass + '\\)' + - '|\\{' + extensions + '\\}' + - '|(?:,|' + whitespace + ')' + - ')+', - - extendedValidator = standardValidator.replace(pseudoclass, '.*'), - - reValidator = RegExp(standardValidator, 'g'), - - reTrimSpaces = RegExp('^' + - whitespace + '|' + whitespace + '$', 'g'), - - reSplitGroup = RegExp('(' + - '[^,\\\\()[\\]]+' + - '|\\[[^[\\]]*\\]|\\[.*\\]' + - '|\\([^()]+\\)|\\(.*\\)' + - '|\\{[^{}]+\\}|\\{.*\\}' + - '|\\\\.' + - ')+', 'g'), - - reSplitToken = RegExp('(' + - '\\[' + attributes + '\\]|' + - '\\(' + pseudoclass + '\\)|' + - '[^\\x20>+~]|\\\\.)+', 'g'), - - reWhiteSpace = /[\x20\t\n\r\f]+/g, - - reOptimizeSelector = RegExp(identifier + '|^$'), - - ATTR_URIDATA = { - action: 2, cite: 2, codebase: 2, data: 2, href: 2, - longdesc: 2, lowsrc: 2, src: 2, usemap: 2 - }, - - Selectors = { }, - - Operators = { - '=': "n=='%m'", - '^=': "n.indexOf('%m')==0", - '*=': "n.indexOf('%m')>-1", - '|=': "(n+'-').indexOf('%m-')==0", - '~=': "(' '+n+' ').indexOf(' %m ')>-1", - '$=': "n.substr(n.length-'%m'.length)=='%m'" - }, - - Optimize = { - ID: RegExp('^\\*?#(' + encoding + '+)|' + skipgroup), - TAG: RegExp('^(' + encoding + '+)|' + skipgroup), - CLASS: RegExp('^\\*?\\.(' + encoding + '+$)|' + skipgroup) - }, - - Patterns = { - universal: /^\*(.*)/, - id: RegExp('^#(' + encoding + '+)(.*)'), - tagName: RegExp('^(' + encoding + '+)(.*)'), - className: RegExp('^\\.(' + encoding + '+)(.*)'), - attribute: RegExp('^\\[' + attrmatcher + '\\](.*)'), - children: /^[\x20\t\n\r\f]*\>[\x20\t\n\r\f]*(.*)/, - adjacent: /^[\x20\t\n\r\f]*\+[\x20\t\n\r\f]*(.*)/, - relative: /^[\x20\t\n\r\f]*\~[\x20\t\n\r\f]*(.*)/, - ancestor: /^[\x20\t\n\r\f]+(.*)/ - }, - - QUIRKS_MODE, - XML_DOCUMENT, - - GEBTN = 'getElementsByTagName' in doc, - GEBCN = 'getElementsByClassName' in doc, - - IE_LT_9 = typeof doc.addEventListener != 'function', - - INSENSITIVE_MAP = { - 'href': 1, 'lang': 1, 'src': 1, 'style': 1, 'title': 1, - 'type': 1, 'xmlns': 1, 'xml:lang': 1, 'xml:space': 1 - }, - - REFLECTED = { 'value': 1, 'checked': 1, 'selected': 1 }, - - TO_UPPER_CASE = IE_LT_9 ? '.toUpperCase()' : '', - - ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break main;else continue main;', - REJECT_NODE = IE_LT_9 ? 'if(e.nodeName<"A")continue;' : '', - - Config = { - CACHING: false, - SIMPLENOT: true, - USE_HTML5: true, - VERBOSITY: true - }, - - configure = - function(option) { - if (typeof option == 'string') { return Config[option]; } - if (typeof option != 'object') { return false; } - for (var i in option) { - Config[i] = !!option[i]; - if (i == 'SIMPLENOT') { - matchContexts = { }; - matchResolvers = { }; - selectContexts = { }; - selectResolvers = { }; - } - } - if (Config.SIMPLENOT) { - reValidator = RegExp(standardValidator, 'g'); - } else { - reValidator = RegExp(extendedValidator, 'g'); - } - return true; - }, - - concatCall = - function(data, elements, callback) { - var i = -1, element; - while ((element = elements[++i])) { - if (false === callback(data[data.length] = element)) { break; } - } - return data; - }, - - emit = - function(message) { - message = 'SYNTAX_ERR: ' + message + ' '; - if (Config.VERBOSITY) { - throw SyntaxError(message); - } else { - if (global.console && global.console.log) { - global.console.log(message); - } else { - global.status += message; - } - } - }, - - switchContext = - function(from, force) { - var oldDoc = doc; - lastContext = from; - doc = from.ownerDocument || from; - if (force || oldDoc !== doc) { - root = doc.documentElement; - XML_DOCUMENT = doc.createElement('DiV').nodeName == 'DiV'; - QUIRKS_MODE = !XML_DOCUMENT && - typeof doc.compatMode == 'string' ? - doc.compatMode.indexOf('CSS') < 0 : - (function() { - var style = document.createElement('div').style; - return style && (style.width = 1) && style.width == '1px'; - })(); - - Config.CACHING && Dom.setCache(true, doc); - } - }, - - byIdRaw = - function(id, elements) { - var i = 0, element = null; - while ((element = elements[i])) { - if (element.getAttribute('id') == id) { - break; - } - ++i; - } - return element; - }, - - _byId = !('fileSize' in doc) ? - function(id, from) { - id = id.replace(/\\([^\\]{1})/g, '$1'); - return from.getElementById && from.getElementById(id) || - byIdRaw(id, from.getElementsByTagName('*')); - } : - function(id, from) { - var element = null; - id = id.replace(/\\([^\\]{1})/g, '$1'); - if (XML_DOCUMENT || from.nodeType != 9) { - return byIdRaw(id, from.getElementsByTagName('*')); - } - if ((element = from.getElementById(id)) && - element.name == id && from.getElementsByName) { - return byIdRaw(id, from.getElementsByName(id)); - } - return element; - }, - - byId = - function(id, from) { - switchContext(from || (from = doc)); - return _byId(id, from); - }, - - getAttr = - function(node, attribute) { - return ( - ATTR_URIDATA[attribute] ? node.getAttribute(attribute, 2) || '' : - ((node = node.attributes[attribute]) && node.value) || ''); - }, - - compile = - function(selector, source, mode) { - - var parts = typeof selector == 'string' ? selector.match(reSplitGroup) : selector; - - typeof source == 'string' || (source = ''); - - if (parts.length == 1) { - source += compileSelector(parts[0], mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } else { - var i = -1, seen = { }, token; - while ((token = parts[++i])) { - token = token.replace(reTrimSpaces, ''); - if (!seen[token] && (seen[token] = true)) { - source += compileSelector(token, mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } - } - } - - if (mode) - return Function('c,s,r,d,h,g,f,v', - 'var N,n,x=0,k=-1,e;main:while((e=c[++k])){' + source + '}return r;'); - else - return Function('e,s,r,d,h,g,f,v', - 'var N,n,x=0,k=e;' + source + 'return false;'); - }, - - FILTER = - 'var z=v[@]||(v[@]=[]),l=z.length-1;' + - 'while(l>=0&&z[l]!==e)--l;' + - 'if(l!==-1){break;}' + - 'z[z.length]=e;', - - compileSelector = - function(selector, source, mode) { - - var k = 0, expr, match, name, result, status, test, type; - - while (selector) { - - k++; - - if ((match = selector.match(Patterns.universal))) { - expr = ''; - } - - else if ((match = selector.match(Patterns.id))) { - source = 'if(' + (XML_DOCUMENT ? - 's.getAttr(e,"id")' : - '(e.submit?s.getAttr(e,"id"):e.id)') + - '=="' + match[1] + '"' + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.tagName))) { - source = 'if(e.nodeName' + (XML_DOCUMENT ? - '=="' + match[1] + '"' : TO_UPPER_CASE + - '=="' + match[1].toUpperCase() + '"') + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.className))) { - source = 'if((n=' + (XML_DOCUMENT ? - 'e.getAttribute("class")' : 'e.className') + - ')&&n.length&&(" "+' + (QUIRKS_MODE ? 'n.toLowerCase()' : 'n') + - '.replace(' + reWhiteSpace + '," ")+" ").indexOf(" ' + - (QUIRKS_MODE ? match[1].toLowerCase() : match[1]) + ' ")>-1' + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.attribute))) { - if (match[2] && !Operators[match[2]]) { - emit('Unsupported operator in attribute selectors "' + selector + '"'); - return ''; - } - name = match[1].toLowerCase(); - if (match[2] && match[4] && (type = Operators[match[2]])) { - test = name in INSENSITIVE_MAP; - match[4] = match[4].replace(/(\x22|\x27)/g, '\\$1'); - match[4] = match[4].replace(/\\([0-9a-f]{2,2})/, '\\x$1'); - type = type.replace(/\%m/g, match[4].toLowerCase()); - expr = 'n=s.getAttr(e,"' + name + '").toLowerCase();'; - } else if (!match[2]) { - if (REFLECTED[name]) { - test = 'default' + name.charAt(0).toUpperCase() + name.slice(1); - expr = 'n=e["' + test + '"];'; - type = 'n'; - } else { - expr = 'n=e.attributes["' + name + '"];'; - type = IE_LT_9 ? 'n&&n.specified' : 'n'; - } - } else if (match[2] == '!=' || match[2] == '=') { - expr = 'n=e.attributes["' + name + '"];'; - match[4] = match[4].replace(/(\x22|\x27)/g, '\\$1'); - type = 'n&&n.value' + match[2] + '="' + match[4] + '"'; - } else { - expr = ''; - type = 'false'; - } - source = expr + 'if(' + type + '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.adjacent))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&(e=e.previousSibling)){if(e.nodeName>"@"){' + source + 'break;}}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.relative))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;e=e.parentNode.firstChild;while(e&&e!==N' + k + '){if(e.nodeName>"@"){' + source + '}e=e.nextSibling;}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.children))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + 'break;}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.ancestor))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + '}e=N' + k + ';'; - } - - else { - - expr = false; - status = false; - for (expr in Selectors) { - if ((match = selector.match(Selectors[expr].Expression)) && match[1]) { - result = Selectors[expr].Callback(match, source); - source = result.source; - status = result.status; - if (status) { break; } - } - } - if (!status) { - emit('Unknown pseudo-class selector "' + selector + '"'); - return ''; - } - if (!expr) { - emit('Unknown token in selector "' + selector + '"'); - return ''; - } - - } - - if (!match) { - emit('Invalid syntax in selector "' + selector + '"'); - return ''; - } - - selector = match && match[match.length - 1]; - } - - return source; - }, - - match = - function(element, selector, from, callback) { - - var parts; - - if (!(element && element.nodeName > '@')) { - emit('Invalid element argument'); - return false; - } else if (!selector || typeof selector != 'string') { - emit('Invalid selector argument'); - return false; - } else if (lastContext !== from) { - switchContext(from || (from = element.ownerDocument)); - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, element, from)); - - if (lastMatcher != selector) { - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleMatch = (parts = selector.match(reSplitGroup)).length < 2; - lastMatcher = selector; - lastPartsMatch = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return false; - } - } else parts = lastPartsMatch; - - if (!matchResolvers[selector] || matchContexts[selector] !== from) { - matchResolvers[selector] = compile(isSingleMatch ? [selector] : parts, '', false); - matchContexts[selector] = from; - } - - return matchResolvers[selector](element, Snapshot, [ ], doc, root, from, callback, { }); - }, - - first = - function(selector, from) { - return select(selector, from, function() { return false; })[0] || null; - }, - - select = - function(selector, from, callback) { - - var i, changed, element, elements, parts, token, original = selector; - - if (arguments.length === 0) { - emit('Missing required selector parameters'); - return [ ]; - } else if (selector === '') { - emit('Empty selector string'); - return [ ]; - } else if (typeof selector != 'string') { - return [ ]; - } else if (from && !(/1|9|11/).test(from.nodeType)) { - emit('Invalid context element'); - return [ ]; - } else if (lastContext !== from) { - switchContext(from || (from = doc)); - } - - if (Config.CACHING && (elements = Dom.loadResults(original, from, doc, root))) { - return callback ? concatCall([ ], elements, callback) : elements; - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, from)); - - if ((changed = lastSelector != selector)) { - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleSelect = (parts = selector.match(reSplitGroup)).length < 2; - lastSelector = selector; - lastPartsSelect = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return [ ]; - } - } else parts = lastPartsSelect; - - if (from.nodeType == 11) { - - elements = from.childNodes; - - } else if (isSingleSelect) { - - if (changed) { - parts = selector.match(reSplitToken); - token = parts[parts.length - 1]; - lastSlice = token.split(':not')[0]; - lastPosition = selector.length - token.length; - } - - if ((parts = lastSlice.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, from))) { - if (match(element, selector)) { - callback && callback(element); - elements = [ element ]; - } else elements = [ ]; - } - } - - else if ((parts = selector.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, doc))) { - if ('#' + token == selector) { - callback && callback(element); - elements = [ element ]; - } else if (/[>+~]/.test(selector)) { - from = element.parentNode; - } else { - from = element; - } - } else elements = [ ]; - } - - if (elements) { - Config.CACHING && Dom.saveResults(original, from, doc, elements); - return elements; - } - - if (!XML_DOCUMENT && GEBTN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) { - if ((elements = from.getElementsByTagName(token)).length === 0) return [ ]; - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*'); - } - - else if (!XML_DOCUMENT && GEBCN && (parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) { - if ((elements = from.getElementsByClassName(token.replace(/\\/g, ''))).length === 0) return [ ]; - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, - reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1)) ? '' : '*'); - } - - } - - if (!elements) { - if (IE_LT_9) { - elements = /^(?:applet|object)$/i.test(from.nodeName) ? - from.childNodes : from.all; - } else { - elements = from.getElementsByTagName('*'); - } - } - - if (!selectResolvers[selector] || selectContexts[selector] !== from) { - selectResolvers[selector] = compile(isSingleSelect ? [selector] : parts, REJECT_NODE, true); - selectContexts[selector] = from; - } - - elements = selectResolvers[selector](elements, Snapshot, [ ], doc, root, from, callback, { }); - - Config.CACHING && Dom.saveResults(original, from, doc, elements); - - return elements; - }, - - matchContexts = { }, - matchResolvers = { }, - - selectContexts = { }, - selectResolvers = { }, - - Snapshot = { - byId: _byId, - match: match, - select: select, - getAttr: getAttr - }; - - Tokens = { - prefixes: prefixes, - encoding: encoding, - operators: operators, - whitespace: whitespace, - identifier: identifier, - attributes: attributes, - combinators: combinators, - pseudoclass: pseudoclass, - pseudoparms: pseudoparms, - quotedvalue: quotedvalue - }; - - Dom.ACCEPT_NODE = ACCEPT_NODE; - - Dom.emit = emit; - - Dom.byId = byId; - Dom.match = match; - Dom.first = first; - Dom.select = select; - Dom.compile = compile; - Dom.configure = configure; - - Dom.Config = Config; - Dom.Operators = Operators; - Dom.Selectors = Selectors; - Dom.Snapshot = Snapshot; - Dom.Tokens = Tokens; - - Dom.setCache = function() { return; }; - Dom.loadResults = function() { return; }; - Dom.saveResults = function() { return; }; - - Dom.shortcuts = function(x) { return x; }; - - Dom.registerOperator = - function(symbol, resolver) { - Operators[symbol] || (Operators[symbol] = resolver); - }; - - Dom.registerSelector = - function(name, rexp, func) { - Selectors[name] || (Selectors[name] = { - Expression: rexp, - Callback: func - }); - }; - - switchContext(doc, true); - -}); diff --git a/node_modules/jsdom/node_modules/nwmatcher/src/NEW/nwmatcher.js b/node_modules/jsdom/node_modules/nwmatcher/src/NEW/nwmatcher.js deleted file mode 100644 index 147bf31..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/src/NEW/nwmatcher.js +++ /dev/null @@ -1,1655 +0,0 @@ -/* - * Copyright (C) 2007-2012 Diego Perini - * All rights reserved. - * - * nwmatcher.js - A fast CSS selector engine and matcher - * - * Author: Diego Perini - * Version: 1.3.0beta - * Created: 20070722 - * Release: 20121122 - * - * License: - * http://javascript.nwbox.com/NWMatcher/MIT-LICENSE - * Download: - * http://javascript.nwbox.com/NWMatcher/nwmatcher.js - */ - -(function(global, factory) { - - if (typeof module === 'object' && typeof exports === 'object') { - // in a Node.js environment, the nwmatcher functions will operate on - // the passed "browserGlobal" and will be returned in an object - module.exports = function (browserGlobal) { - var exports = { }; - factory(browserGlobal, exports); - return exports; - }; - } else { - // in a browser environment, the nwmatcher functions will operate on - // the "global" loading them and be attached to "global.NW.Dom" - if (!global.NW) { - global.NW = { }; - } - if (!global.NW.Dom) { - global.NW.Dom = { }; - } - factory(global, global.NW.Dom); - } - -})(this, function(global, exports) { - - var version = 'nwmatcher-1.3.0beta', - - Dom = exports, - - // processing context & root element - doc = global.document, - root = doc.documentElement, - - // save utility methods references - slice = [ ].slice, - string = { }.toString, - - // persist previous parsed data - isSingleMatch, - isSingleSelect, - - lastSlice, - lastContext, - lastPosition, - - lastMatcher, - lastSelector, - - lastPartsMatch, - lastPartsSelect, - - // accepted prefix identifiers - // (id, class & pseudo-class) - prefixes = '[#.:]?', - - // accepted attribute operators - operators = '([~*^$|!]?={1})', - - // accepted whitespace characters - whitespace = '[\\x20\\t\\n\\r\\f]*', - - // 4 combinators F E, F>E, F+E, F~E - combinators = '[\\x20]|[>+~][^>+~]', - - // an+b format params for pseudo-classes - pseudoparms = '(?:[-+]?\\d*n)?[-+]?\\d*', - - // CSS quoted string values - quotedvalue = '"[^"]*"' + "|'[^']*'", - - // skip group of round brackets - skipround = '\\([^()]+\\)|\\(.*\\)', - // skip group of curly brackets - skipcurly = '\\{[^{}]+\\}|\\{.*\\}', - // skip group of square brackets - skipsquare = '\\[[^[\\]]*\\]|\\[.*\\]', - - // skip [ ], ( ), { } groups in token tails - skipgroup = '\\[.*\\]|\\(.*\\)|\\{.*\\}', - - // http://www.w3.org/TR/css3-syntax/#characters - // unicode/ISO 10646 characters 161 and higher - // NOTE: Safari 2.0.x crashes with escaped (\\) - // Unicode ranges in regular expressions so we - // use a negated character range class instead - encoding = '(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)', - - // CSS identifier syntax - identifier = '(?:-?[_a-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+', - - // build attribute string - attrcheck = '(' + quotedvalue + '|' + identifier + ')', - attributes = whitespace + '(' + encoding + '+:?' + encoding + '+)' + - whitespace + '(?:' + operators + whitespace + attrcheck + ')?' + whitespace, - attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'), - - // build pseudoclass string - pseudoclass = '((?:' + - // an+b parameters or quoted string - pseudoparms + '|' + quotedvalue + '|' + - // id, class, pseudo-class selector - prefixes + '|' + encoding + '+|' + - // nested HTML attribute selector - '\\[' + attributes + '\\]|' + - // nested pseudo-class selector - '\\(.+\\)|' + whitespace + '|' + - // nested pseudos/separators - ',)+)', - - // placeholder for extensions - extensions = '.+', - - // CSS3: syntax scanner and - // one pass validation only - // using regular expression - standardValidator = - // discard start - '(?=[\\x20\\t\\n\\r\\f]*[^>+~(){}<>])' + - // open match group - '(' + - //universal selector - '\\*' + - // id/class/tag/pseudo-class identifier - '|(?:' + prefixes + identifier + ')' + - // combinator selector - '|' + combinators + - // HTML attribute selector - '|\\[' + attributes + '\\]' + - // pseudo-classes parameters - '|\\(' + pseudoclass + '\\)' + - // dom properties selector (extension) - '|\\{' + extensions + '\\}' + - // selector group separator (comma) - '|(?:,|' + whitespace + ')' + - // close match group - ')+', - - // validator for complex selectors in ':not()' pseudo-classes - extendedValidator = standardValidator.replace(pseudoclass, '.*'), - - // validator for standard selectors as default - reValidator = new RegExp(standardValidator, 'g'), - - // whitespace is any combination of these 5 character [\x20\t\n\r\f] - // http://www.w3.org/TR/css3-selectors/#selector-syntax - reTrimSpaces = new RegExp('^' + - whitespace + '|' + whitespace + '$', 'g'), - - // only allow simple selectors nested in ':not()' pseudo-classes - reSimpleNot = new RegExp('^(' + - '(?!:not)' + - '(' + prefixes + - '|' + identifier + - '|\\([^()]*\\))+' + - '|\\[' + attributes + '\\]' + - ')$'), - - // split comma groups, exclude commas from - // quotes '' "" and from brackets () [] {} - reSplitGroup = new RegExp('(' + - '[^,\\\\()[\\]]+' + - '|' + skipsquare + - '|' + skipround + - '|' + skipcurly + - '|\\\\.' + - ')+', 'g'), - - // split last, right most, selector group token - reSplitToken = new RegExp('(' + - '\\[' + attributes + '\\]|' + - '\\(' + pseudoclass + '\\)|' + - '[^\\x20>+~]|\\\\.)+', 'g'), - - // for in excess whitespace removal - reWhiteSpace = /[\x20\t\n\r\f]+/g, - - reOptimizeSelector = new RegExp(identifier + '|^$'), - - /*----------------------------- FEATURE TESTING ----------------------------*/ - - // detect native methods - isNative = (function() { - var s = (doc.appendChild + '').replace(/appendChild/g, ''); - return function(object, method) { - var m = object && object[method] || false; - return m && typeof m != 'string' && - s == (m + '').replace(new RegExp(method, 'g'), ''); - }; - })(), - - // NATIVE_XXXXX true if method exist and is callable - // detect if DOM methods are native in browsers - NATIVE_FOCUS = isNative(doc, 'hasFocus'), - NATIVE_QSAPI = isNative(doc, 'querySelector'), - NATIVE_GEBID = isNative(doc, 'getElementById'), - NATIVE_GEBTN = isNative(root, 'getElementsByTagName'), - NATIVE_GEBCN = isNative(root, 'getElementsByClassName'), - - // detect native getAttribute/hasAttribute methods, - // frameworks extend these to elements, but it seems - // this does not work for XML namespaced attributes, - // used to check both getAttribute/hasAttribute in IE - NATIVE_GET_ATTRIBUTE = isNative(root, 'getAttribute'), - NATIVE_HAS_ATTRIBUTE = isNative(root, 'hasAttribute'), - - // check if slice() can convert nodelist to array - // see http://yura.thinkweb2.com/cft/ - NATIVE_SLICE_PROTO = - (function() { - var isBuggy = false, id = root.id; - root.id = 'length'; - try { - isBuggy = !!slice.call(doc.childNodes, 0)[0]; - } catch(e) { } - root.id = id; - return isBuggy; - })(), - - // supports the new traversal API - NATIVE_TRAVERSAL_API = - 'nextElementSibling' in root && 'previousElementSibling' in root, - - // BUGGY_XXXXX true if method is feature tested and has known bugs - // detect buggy gEBID - BUGGY_GEBID = NATIVE_GEBID ? - (function() { - var isBuggy = true, x = 'x' + String(+new Date), - a = doc.createElementNS ? 'a' : ''; - (a = doc.createElement(a)).name = x; - root.insertBefore(a, root.firstChild); - isBuggy = !!doc.getElementById(x); - root.removeChild(a); - return isBuggy; - })() : - true, - - // detect IE gEBTN comment nodes bug - BUGGY_GEBTN = NATIVE_GEBTN ? - (function() { - var div = doc.createElement('div'); - div.appendChild(doc.createComment('')); - return !!div.getElementsByTagName('*')[0]; - })() : - true, - - // detect Opera gEBCN second class and/or UTF8 bugs as well as Safari 3.2 - // caching class name results and not detecting when changed, - // tests are based on the jQuery selector test suite - BUGGY_GEBCN = NATIVE_GEBCN ? - (function() { - var isBuggy, div = doc.createElement('div'), test = '\u53f0\u5317'; - - // Opera tests - div.appendChild(doc.createElement('span')). - setAttribute('class', test + 'abc ' + test); - div.appendChild(doc.createElement('span')). - setAttribute('class', 'x'); - - isBuggy = !div.getElementsByClassName(test)[0]; - - // Safari test - div.lastChild.className = test; - return isBuggy || div.getElementsByClassName(test).length != 2; - })() : - true, - - // detect IE bug with dynamic attributes - BUGGY_GET_ATTRIBUTE = NATIVE_GET_ATTRIBUTE ? - (function() { - var input = doc.createElement('input'); - input.setAttribute('value', 5); - return input.defaultValue != 5; - })() : - true, - - // detect IE bug with non-standard boolean attributes - BUGGY_HAS_ATTRIBUTE = NATIVE_HAS_ATTRIBUTE ? - (function() { - var option = doc.createElement('option'); - option.setAttribute('selected', 'selected'); - return !option.hasAttribute('selected'); - })() : - true, - - // detect Safari bug with selected option elements - BUGGY_SELECTED = - (function() { - var select = doc.createElement('select'); - select.appendChild(doc.createElement('option')); - return !select.firstChild.selected; - })(), - - // initialized with the loading context - // and reset for each different context - BUGGY_QUIRKS_GEBCN, - BUGGY_QUIRKS_QSAPI, - - QUIRKS_MODE, - XML_DOCUMENT, - - // detect Opera browser - OPERA = /opera/i.test(string.call(global.opera)), - - // skip simpe selector optimizations for Opera >= 11 - OPERA_QSAPI = OPERA && parseFloat(opera.version()) >= 11, - - // check Seletor API implementations - RE_BUGGY_QSAPI = NATIVE_QSAPI ? - (function() { - var pattern = [ ], div = doc.createElement('div'), element, - - expect = function(selector, context, element, n) { - var result = false; - context.appendChild(element); - try { result = context.querySelectorAll(selector).length == n; } catch(e) { } - while (context.firstChild) { context.removeChild(context.firstChild); } - return result; - }; - - // ^= $= *= operators bugs whith empty values (Opera 10 / IE8) - element = doc.createElement('p'); - element.setAttribute('class', ''); - expect('[class^=""]', div, element, 1) && - pattern.push('[*^$]=[\\x20\\t\\n\\r\\f]*(?:""|' + "'')"); - - // :checked bug with option elements (Firefox 3.6.x) - // it wrongly includes 'selected' options elements - // HTML5 rules says selected options also match - element = doc.createElement('option'); - element.setAttribute('selected', 'selected'); - expect(':checked', div, element, 0) && - pattern.push(':checked'); - - // :enabled :disabled bugs with hidden fields (Firefox 3.5 QSA bug) - // http://www.w3.org/TR/html5/interactive-elements.html#selector-enabled - // IE8 QSA has problems too and throws error with these dynamic pseudos - element = doc.createElement('input'); - element.setAttribute('type', 'hidden'); - expect(':enabled', div, element, 0) && - pattern.push(':enabled', ':disabled'); - - // :link bugs with hyperlinks matching (Firefox/Safari) - element = doc.createElement('link'); - element.setAttribute('href', 'x'); - expect(':link', div, element, 1) || - pattern.push(':link'); - - // avoid attribute selectors for IE QSA - if (BUGGY_HAS_ATTRIBUTE) { - // IE fails in reading: - // - original values for input/textarea - // - original boolean values for controls - pattern.push('\\[[\\x20\\t\\n\\r\\f]*(?:checked|disabled|ismap|multiple|readonly|selected|value)'); - } - - return pattern.length ? - new RegExp(pattern.join('|')) : - { 'test': function() { return false; } }; - - })() : - true, - - // matches class selectors - RE_CLASS = new RegExp('(?:\\[[\\x20\\t\\n\\r\\f]*class\\b|\\.' + identifier + ')'), - - // matches simple id, tag & class selectors - RE_SIMPLE_SELECTOR = new RegExp( - !(BUGGY_GEBTN && BUGGY_GEBCN) ? !OPERA ? - '^(?:\\*|[.#]?-?[_a-zA-Z]{1}' + encoding + '*)$' : - '^(?:\\*|#-?[_a-zA-Z]{1}' + encoding + '*)$' : - '^#?-?[_a-zA-Z]{1}' + encoding + '*$'), - - /*----------------------------- LOOKUP OBJECTS -----------------------------*/ - - LINK_NODES = { 'a': 1, 'A': 1, 'area': 1, 'AREA': 1, 'link': 1, 'LINK': 1 }, - - // boolean attributes should return attribute name instead of true/false - ATTR_BOOLEAN = { - 'checked': 1, 'disabled': 1, 'ismap': 1, - 'multiple': 1, 'readonly': 1, 'selected': 1 - }, - - // dynamic attributes that needs to be checked against original HTML value - ATTR_DEFAULT = { - 'value': 'defaultValue', - 'checked': 'defaultChecked', - 'selected': 'defaultSelected' - }, - - // attribute referencing URI data values need special treatment in IE - ATTR_URIDATA = { - 'action': 2, 'cite': 2, 'codebase': 2, 'data': 2, 'href': 2, - 'longdesc': 2, 'lowsrc': 2, 'src': 2, 'usemap': 2 - }, - - // HTML 5 draft specifications - // http://www.whatwg.org/specs/web-apps/current-work/#selectors - HTML_TABLE = { - // class attribute must be treated case-insensitive in HTML quirks mode - // initialized by default to Standard Mode (case-sensitive), - // set dynamically by the attribute resolver - 'class': 0, - 'accept': 1, 'accept-charset': 1, 'align': 1, 'alink': 1, 'axis': 1, - 'bgcolor': 1, 'charset': 1, 'checked': 1, 'clear': 1, 'codetype': 1, 'color': 1, - 'compact': 1, 'declare': 1, 'defer': 1, 'dir': 1, 'direction': 1, 'disabled': 1, - 'enctype': 1, 'face': 1, 'frame': 1, 'hreflang': 1, 'http-equiv': 1, 'lang': 1, - 'language': 1, 'link': 1, 'media': 1, 'method': 1, 'multiple': 1, 'nohref': 1, - 'noresize': 1, 'noshade': 1, 'nowrap': 1, 'readonly': 1, 'rel': 1, 'rev': 1, - 'rules': 1, 'scope': 1, 'scrolling': 1, 'selected': 1, 'shape': 1, 'target': 1, - 'text': 1, 'type': 1, 'valign': 1, 'valuetype': 1, 'vlink': 1 - }, - - // the following attributes must be treated case-insensitive in XHTML mode - // Niels Leenheer http://rakaz.nl/item/css_selector_bugs_case_sensitivity - XHTML_TABLE = { - 'accept': 1, 'accept-charset': 1, 'alink': 1, 'axis': 1, - 'bgcolor': 1, 'charset': 1, 'codetype': 1, 'color': 1, - 'enctype': 1, 'face': 1, 'hreflang': 1, 'http-equiv': 1, - 'lang': 1, 'language': 1, 'link': 1, 'media': 1, 'rel': 1, - 'rev': 1, 'target': 1, 'text': 1, 'type': 1, 'vlink': 1 - }, - - /*-------------------------- REGULAR EXPRESSIONS ---------------------------*/ - - // placeholder to add functionalities - Selectors = { - // as a simple example this will check - // for chars not in standard ascii table - // - // 'mySpecialSelector': { - // 'Expression': /\u0080-\uffff/, - // 'Callback': mySelectorCallback - // } - // - // 'mySelectorCallback' will be invoked - // only after passing all other standard - // checks and only if none of them worked - }, - - // attribute operators - Operators = { - '=': "n=='%m'", - '^=': "n.indexOf('%m')==0", - '*=': "n.indexOf('%m')>-1", - '|=': "(n+'-').indexOf('%m-')==0", - '~=': "(' '+n+' ').indexOf(' %m ')>-1", - '$=': "n.substr(n.length-'%m'.length)=='%m'" - }, - - // optimization expressions - Optimize = { - ID: new RegExp('^\\*?#(' + encoding + '+)|' + skipgroup), - TAG: new RegExp('^(' + encoding + '+)|' + skipgroup), - CLASS: new RegExp('^\\*?\\.(' + encoding + '+$)|' + skipgroup) - }, - - // precompiled Regular Expressions - Patterns = { - // structural pseudo-classes and child selectors - spseudos: /^\:(root|empty|(?:first|last|only)(?:-child|-of-type)|nth(?:-last)?(?:-child|-of-type)\(\s*(even|odd|(?:[-+]{0,1}\d*n\s*)?[-+]{0,1}\s*\d*)\s*\))?(.*)/i, - // uistates + dynamic + negation pseudo-classes - dpseudos: /^\:(link|visited|target|active|focus|hover|checked|disabled|enabled|selected|lang\(([-\w]{2,})\)|not\(([^()]*|.*)\))?(.*)/i, - // element attribute matcher - attribute: new RegExp('^\\[' + attrmatcher + '\\](.*)'), - // E > F - children: /^[\x20\t\n\r\f]*\>[\x20\t\n\r\f]*(.*)/, - // E + F - adjacent: /^[\x20\t\n\r\f]*\+[\x20\t\n\r\f]*(.*)/, - // E ~ F - relative: /^[\x20\t\n\r\f]*\~[\x20\t\n\r\f]*(.*)/, - // E F - ancestor: /^[\x20\t\n\r\f]+(.*)/, - // all - universal: /^\*(.*)/, - // id - id: new RegExp('^#(' + encoding + '+)(.*)'), - // tag - tagName: new RegExp('^(' + encoding + '+)(.*)'), - // class - className: new RegExp('^\\.(' + encoding + '+)(.*)') - }, - - /*------------------------------ UTIL METHODS ------------------------------*/ - - // concat elements to data - concatList = - function(data, elements) { - var i = -1, element; - if (!data.length && Array.slice) - return Array.slice(elements); - while ((element = elements[++i])) - data[data.length] = element; - return data; - }, - - // concat elements to data and callback - concatCall = - function(data, elements, callback) { - var i = -1, element; - while ((element = elements[++i])) { - if (false === callback(data[data.length] = element)) { break; } - } - return data; - }, - - // change context specific variables - switchContext = - function(from, force) { - var div, oldDoc = doc; - // save passed context - lastContext = from; - // set new context document - doc = from.ownerDocument || from; - if (force || oldDoc !== doc) { - // set document root - root = doc.documentElement; - // set host environment flags - XML_DOCUMENT = doc.createElement('DiV').nodeName == 'DiV'; - - // In quirks mode css class names are case insensitive. - // In standards mode they are case sensitive. See docs: - // https://developer.mozilla.org/en/Mozilla_Quirks_Mode_Behavior - // http://www.whatwg.org/specs/web-apps/current-work/#selectors - QUIRKS_MODE = !XML_DOCUMENT && - typeof doc.compatMode == 'string' ? - doc.compatMode.indexOf('CSS') < 0 : - (function() { - var style = doc.createElement('div').style; - return style && (style.width = 1) && style.width == '1px'; - })(); - - div = doc.createElement('div'); - div.appendChild(doc.createElement('p')).setAttribute('class', 'xXx'); - div.appendChild(doc.createElement('p')).setAttribute('class', 'xxx'); - - // GEBCN buggy in quirks mode, match count is: - // Firefox 3.0+ [xxx = 1, xXx = 1] - // Opera 10.63+ [xxx = 0, xXx = 2] - BUGGY_QUIRKS_GEBCN = - !XML_DOCUMENT && NATIVE_GEBCN && QUIRKS_MODE && - (div.getElementsByClassName('xxx').length != 2 || - div.getElementsByClassName('xXx').length != 2); - - // QSAPI buggy in quirks mode, match count is: - // At least Chrome 4+, Firefox 3.5+, Opera 10.x+, Safari 4+ [xxx = 1, xXx = 2] - // Safari 3.2 QSA doesn't work with mixedcase in quirksmode [xxx = 1, xXx = 0] - // https://bugs.webkit.org/show_bug.cgi?id=19047 - // must test the attribute selector '[class~=xxx]' - // before '.xXx' or the bug may not present itself - BUGGY_QUIRKS_QSAPI = - !XML_DOCUMENT && NATIVE_QSAPI && QUIRKS_MODE && - (div.querySelectorAll('[class~=xxx]').length != 2 || - div.querySelectorAll('.xXx').length != 2); - - Config.CACHING && Dom.setCache(true, doc); - } - }, - - /*------------------------------ DOM METHODS -------------------------------*/ - - // element by id (raw) - // @return reference or null - byIdRaw = - function(id, elements) { - var i = -1, element = null; - while ((element = elements[++i])) { - if (element.getAttribute('id') == id) { - break; - } - } - return element; - }, - - // element by id - // @return reference or null - _byId = !BUGGY_GEBID ? - function(id, from) { - id = id.replace(/\\([^\\]{1})/g, '$1'); - return from.getElementById && from.getElementById(id) || - byIdRaw(id, from.getElementsByTagName('*')); - } : - function(id, from) { - var element = null; - id = id.replace(/\\([^\\]{1})/g, '$1'); - if (XML_DOCUMENT || from.nodeType != 9) { - return byIdRaw(id, from.getElementsByTagName('*')); - } - if ((element = from.getElementById(id)) && - element.name == id && from.getElementsByName) { - return byIdRaw(id, from.getElementsByName(id)); - } - return element; - }, - - // publicly exposed byId - // @return reference or null - byId = - function(id, from) { - switchContext(from || (from = doc)); - return _byId(id, from); - }, - - // elements by tag (raw) - // @return array - byTagRaw = - function(tag, from) { - var any = tag == '*', element = from, elements = [ ], next = element.firstChild; - any || (tag = tag.toUpperCase()); - while ((element = next)) { - if (element.tagName > '@' && (any || element.tagName.toUpperCase() == tag)) { - elements[elements.length] = element; - } - if ((next = element.firstChild || element.nextSibling)) continue; - while (!next && (element = element.parentNode) && element !== from) { - next = element.nextSibling; - } - } - return elements; - }, - - // elements by tag - // @return array - _byTag = !BUGGY_GEBTN && NATIVE_SLICE_PROTO ? - function(tag, from) { - return XML_DOCUMENT || from.nodeType == 11 ? byTagRaw(tag, from) : - slice.call(from.getElementsByTagName(tag), 0); - } : - function(tag, from) { - var i = -1, j = i, data = [ ], - element, elements = from.getElementsByTagName(tag); - if (tag == '*') { - while ((element = elements[++i])) { - if (element.nodeName > '@') - data[++j] = element; - } - } else { - while ((element = elements[++i])) { - data[i] = element; - } - } - return data; - }, - - // publicly exposed byTag - // @return array - byTag = - function(tag, from) { - switchContext(from || (from = doc)); - return _byTag(tag, from); - }, - - // publicly exposed byName - // @return array - byName = - function(name, from) { - return select('[name="' + name.replace(/\\([^\\]{1})/g, '$1') + '"]', from); - }, - - // elements by class (raw) - // @return array - byClassRaw = - function(name, from) { - var i = -1, j = i, data = [ ], element, elements = _byTag('*', from), n; - name = ' ' + (QUIRKS_MODE ? name.toLowerCase() : name).replace(/\\([^\\]{1})/g, '$1') + ' '; - while ((element = elements[++i])) { - n = XML_DOCUMENT ? element.getAttribute('class') : element.className; - if (n && n.length && (' ' + (QUIRKS_MODE ? n.toLowerCase() : n). - replace(reWhiteSpace, ' ') + ' ').indexOf(name) > -1) { - data[++j] = element; - } - } - return data; - }, - - // elements by class - // @return array - _byClass = - function(name, from) { - return (BUGGY_GEBCN || BUGGY_QUIRKS_GEBCN || XML_DOCUMENT || !from.getElementsByClassName) ? - byClassRaw(name, from) : slice.call(from.getElementsByClassName(name.replace(/\\([^\\]{1})/g, '$1')), 0); - }, - - // publicly exposed byClass - // @return array - byClass = - function(name, from) { - switchContext(from || (from = doc)); - return _byClass(name, from); - }, - - // check element is descendant of container - // @return boolean - contains = 'compareDocumentPosition' in root ? - function(container, element) { - return (container.compareDocumentPosition(element) & 16) == 16; - } : 'contains' in root ? - function(container, element) { - return container !== element && container.contains(element); - } : - function(container, element) { - while ((element = element.parentNode)) { - if (element === container) return true; - } - return false; - }, - - // attribute value - // @return string - getAttribute = !BUGGY_GET_ATTRIBUTE ? - function(node, attribute) { - return node.getAttribute(attribute) || ''; - } : - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (ATTR_DEFAULT[attribute]) { - return node[ATTR_DEFAULT[attribute]] || ''; - } - return ( - // specific URI data attributes (parameter 2 to fix IE bug) - ATTR_URIDATA[attribute] ? node.getAttribute(attribute, 2) || '' : - // boolean attributes should return name instead of true/false - ATTR_BOOLEAN[attribute] ? node.getAttribute(attribute) ? attribute : '' : - ((node = node.getAttributeNode(attribute)) && node.value) || ''); - }, - - // attribute presence - // @return boolean - hasAttribute = !BUGGY_HAS_ATTRIBUTE ? - function(node, attribute) { - return XML_DOCUMENT ? - !!node.getAttribute(attribute) : - node.hasAttribute(attribute); - } : - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (ATTR_DEFAULT[attribute]) { - return !!node[ATTR_DEFAULT[attribute]]; - } - // need to get at AttributeNode first on IE - node = node.getAttributeNode(attribute); - // use both "specified" & "nodeValue" properties - return !!(node && (node.specified || node.nodeValue)); - }, - - // check node emptyness - // @return boolean - isEmpty = - function(node) { - node = node.firstChild; - while (node) { - if (node.nodeType == 3 || node.nodeName > '@') return false; - node = node.nextSibling; - } - return true; - }, - - // check if element matches the :link pseudo - // @return boolean - isLink = - function(element) { - return hasAttribute(element,'href') && LINK_NODES[element.nodeName]; - }, - - // child position by nodeType - // @return number - nthElement = - function(element, last) { - var count = 1, succ = last ? 'nextSibling' : 'previousSibling'; - while ((element = element[succ])) { - if (element.nodeName > '@') ++count; - } - return count; - }, - - // child position by nodeName - // @return number - nthOfType = - function(element, last) { - var count = 1, succ = last ? 'nextSibling' : 'previousSibling', type = element.nodeName; - while ((element = element[succ])) { - if (element.nodeName == type) ++count; - } - return count; - }, - - /*------------------------------- DEBUGGING --------------------------------*/ - - // get/set (string/object) working modes - configure = - function(option) { - if (typeof option == 'string') { return Config[option]; } - if (typeof option != 'object') { return false; } - for (var i in option) { - Config[i] = !!option[i]; - if (i == 'SIMPLENOT') { - matchContexts = { }; - matchResolvers = { }; - selectContexts = { }; - selectResolvers = { }; - Config['USE_QSAPI'] = false; - } else if (i == 'USE_QSAPI') { - Config[i] = !!option[i] && NATIVE_QSAPI; - } - } - if (Config.SIMPLENOT) { - reValidator = new RegExp(standardValidator, 'g'); - } else { - reValidator = new RegExp(extendedValidator, 'g'); - } - return true; - }, - - // control user notifications - emit = - function(message) { - message = 'SYNTAX_ERR: ' + message + ' '; - if (Config.VERBOSITY) { - throw new SyntaxError(message); - } else { - if (global.console && global.console.log) { - global.console.log(message); - } else { - global.status += message; - } - } - }, - - Config = { - - // used to enable/disable caching of result sets - CACHING: false, - - // by default do not add missing left/right context - // to selector string shortcuts like "+div" or "ul>" - // callable Dom.shortcuts method has to be available - SHORTCUTS: false, - - // by default disable complex selectors nested in - // ':not()' pseudo-classes, as for specifications - SIMPLENOT: true, - - // HTML5 handling for the ":checked" pseudo-class - USE_HTML5: true, - - // controls enabling the Query Selector API branch - USE_QSAPI: NATIVE_QSAPI, - - // controls the engine error/warning notifications - VERBOSITY: true - - }, - - /*---------------------------- COMPILER METHODS ----------------------------*/ - - // code string reused to build compiled functions - ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break main;else continue main;', - - // compile a comma separated group of selector - // @mode boolean true for select, false for match - // return a compiled function - compile = - function(selector, source, mode) { - - var parts = typeof selector == 'string' ? selector.match(reSplitGroup) : selector; - - // ensures that source is a string - typeof source == 'string' || (source = ''); - - if (parts.length == 1) { - source += compileSelector(parts[0], mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } else { - // for each selector in the group - var i = -1, seen = { }, token; - while ((token = parts[++i])) { - token = token.replace(reTrimSpaces, ''); - // avoid repeating the same token - // in comma separated group (p, p) - if (!seen[token] && (seen[token] = true)) { - source += compileSelector(token, mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } - } - } - - if (mode) { - // for select method - return new Function('c,s,r,d,h,g,f,v', - 'var N,n,x=0,k=-1,e;main:while((e=c[++k])){' + source + '}return r;'); - } else { - // for match method - return new Function('e,s,r,d,h,g,f,v', - 'var N,n,x=0,k=e;' + source + 'return false;'); - } - }, - - // allows to cache already visited nodes - FILTER = - 'var z=v[@]||(v[@]=[]),l=z.length-1;' + - 'while(l>=0&&z[l]!==e)--l;' + - 'if(l!==-1){break;}' + - 'z[z.length]=e;', - - // compile a CSS3 string selector into ad-hoc javascript matching function - // @return string (to be compiled) - compileSelector = - function(selector, source, mode) { - - var a, b, n, k = 0, expr, match, result, status, test, type; - - while (selector) { - - k++; - - // *** Universal selector - // * match all (empty block, do not remove) - if ((match = selector.match(Patterns.universal))) { - // do nothing, handled in the compiler where - // BUGGY_GEBTN return comment nodes (ex: IE) - expr = ''; - } - - // *** ID selector - // #Foo Id case sensitive - else if ((match = selector.match(Patterns.id))) { - // document can contain conflicting elements (id/name) - // prototype selector unit need this method to recover bad HTML forms - source = 'if(' + (XML_DOCUMENT ? - 's.getAttribute(e,"id")' : - '(e.submit?s.getAttribute(e,"id"):e.id)') + - '=="' + match[1] + '"' + - '){' + source + '}'; - } - - // *** Type selector - // Foo Tag (case insensitive) - else if ((match = selector.match(Patterns.tagName))) { - // both tagName and nodeName properties may be upper/lower case - // depending on their creation NAMESPACE in createElementNS() - source = 'if(e.nodeName' + (XML_DOCUMENT ? - '=="' + match[1] + '"' : '.toUpperCase()' + - '=="' + match[1].toUpperCase() + '"') + - '){' + source + '}'; - } - - // *** Class selector - // .Foo Class (case sensitive) - else if ((match = selector.match(Patterns.className))) { - // W3C CSS3 specs: element whose "class" attribute has been assigned a - // list of whitespace-separated values, see section 6.4 Class selectors - // and notes at the bottom; explicitly non-normative in this specification. - source = 'if((n=' + (XML_DOCUMENT ? - 's.getAttribute(e,"class")' : 'e.className') + - ')&&n.length&&(" "+' + (QUIRKS_MODE ? 'n.toLowerCase()' : 'n') + - '.replace(' + reWhiteSpace + '," ")+" ").indexOf(" ' + - (QUIRKS_MODE ? match[1].toLowerCase() : match[1]) + ' ")>-1' + - '){' + source + '}'; - } - - // *** Attribute selector - // [attr] [attr=value] [attr="value"] [attr='value'] and !=, *=, ~=, |=, ^=, $= - // case sensitivity is treated differently depending on the document type (see map) - else if ((match = selector.match(Patterns.attribute))) { - - // xml namespaced attribute ? - expr = match[1].split(':'); - expr = expr.length == 2 ? expr[1] : expr[0] + ''; - - if (match[2] && !Operators[match[2]]) { - emit('Unsupported operator in attribute selectors "' + selector + '"'); - return ''; - } - - test = false; - type = 'false'; - - // replace Operators parameter if needed - if (match[2] && match[4] && (type = Operators[match[2]])) { - // case treatment depends on document - HTML_TABLE['class'] = QUIRKS_MODE ? 1 : 0; - // replace escaped values and HTML entities - match[4] = match[4].replace(/(\x22|\x27)/g, '\\$1'); - match[4] = match[4].replace(/\\([0-9a-f]{2,2})/, '\\x$1'); - test = (XML_DOCUMENT ? XHTML_TABLE : HTML_TABLE)[expr.toLowerCase()]; - type = type.replace(/\%m/g, test ? match[4].toLowerCase() : match[4]); - } else if (match[2] == '!=' || match[2] == '=') { - match[4] = match[4].replace(/(\x22|\x27)/g, '\\$1'); - type = 'n' + match[2] + '="' + match[4] + '"'; - } - - // build expression for has/getAttribute - expr = 'n=s.' + (match[2] ? 'get' : 'has') + - 'Attribute(e,"' + match[1] + '")' + - (test ? '.toLowerCase();' : ';'); - - source = expr + 'if(' + (match[2] ? type : 'n') + '){' + source + '}'; - } - - // *** Adjacent sibling combinator - // E + F (F adiacent sibling of E) - else if ((match = selector.match(Patterns.adjacent))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = NATIVE_TRAVERSAL_API ? - 'var N' + k + '=e;while(e&&(e=e.previousElementSibling)){' + source + 'break;}e=N' + k + ';' : - 'var N' + k + '=e;while(e&&(e=e.previousSibling)){if(e.nodeName>"@"){' + source + 'break;}}e=N' + k + ';'; - } - - // *** General sibling combinator - // E ~ F (F relative sibling of E) - else if ((match = selector.match(Patterns.relative))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = NATIVE_TRAVERSAL_API ? - ('var N' + k + '=e;e=e.parentNode.firstElementChild;' + - 'while(e&&e!==N' + k + '){' + source + 'e=e.nextElementSibling;}e=N' + k + ';') : - ('var N' + k + '=e;e=e.parentNode.firstChild;' + - 'while(e&&e!==N' + k + '){if(e.nodeName>"@"){' + source + '}e=e.nextSibling;}e=N' + k + ';'); - } - - // *** Child combinator - // E > F (F children of E) - else if ((match = selector.match(Patterns.children))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + 'break;}e=N' + k + ';'; - } - - // *** Descendant combinator - // E F (E ancestor of F) - else if ((match = selector.match(Patterns.ancestor))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + '}e=N' + k + ';'; - } - - // *** Structural pseudo-classes - // :root, :empty, - // :first-child, :last-child, :only-child, - // :first-of-type, :last-of-type, :only-of-type, - // :nth-child(), :nth-last-child(), :nth-of-type(), :nth-last-of-type() - else if ((match = selector.match(Patterns.spseudos)) && match[1]) { - - switch (match[1]) { - case 'root': - // element root of the document - if (match[3]) { - source = 'if(e===h||s.contains(h,e)){' + source + '}'; - } else { - source = 'if(e===h){' + source + '}'; - } - break; - - case 'empty': - // element that has no children - source = 'if(s.isEmpty(e)){' + source + '}'; - break; - - default: - if (match[1] && match[2]) { - if (match[2] == 'n') { - source = 'if(e!==h){' + source + '}'; - break; - } else if (match[2] == 'even') { - a = 2; - b = 0; - } else if (match[2] == 'odd') { - a = 2; - b = 1; - } else { - // assumes correct "an+b" format, "b" before "a" to keep "n" values - b = ((n = match[2].match(/(-?\d+)$/)) ? parseInt(n[1], 10) : 0); - a = ((n = match[2].match(/(-?\d*)n/i)) ? parseInt(n[1], 10) : 0); - if (n && n[1] == '-') a = -1; - } - - // build test expression out of structural pseudo (an+b) parameters - // see here: http://www.w3.org/TR/css3-selectors/#nth-child-pseudo - test = a > 1 ? - (/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' : - 'n>=' + b + '&&(n-(' + b + '))%' + a + '==0' : a < -1 ? - (/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' : - 'n<=' + b + '&&(n-(' + b + '))%' + a + '==0' : a=== 0 ? - 'n==' + b : - (/last/i.test(match[1])) ? - a == -1 ? 'n>=' + b : 'n<=' + b : - a == -1 ? 'n<=' + b : 'n>=' + b; - - // 4 cases: 1 (nth) x 4 (child, of-type, last-child, last-of-type) - source = - 'if(e!==h){' + - 'n=s[' + (/-of-type/i.test(match[1]) ? '"nthOfType"' : '"nthElement"') + ']' + - '(e,' + (/last/i.test(match[1]) ? 'true' : 'false') + ');' + - 'if(' + test + '){' + source + '}' + - '}'; - - } else { - // 6 cases: 3 (first, last, only) x 1 (child) x 2 (-of-type) - a = /first/i.test(match[1]) ? 'previous' : 'next'; - n = /only/i.test(match[1]) ? 'previous' : 'next'; - b = /first|last/i.test(match[1]); - - type = /-of-type/i.test(match[1]) ? '&&n.nodeName!=e.nodeName' : '&&n.nodeName<"@"'; - - source = 'if(e!==h){' + - ( 'n=e;while((n=n.' + a + 'Sibling)' + type + ');if(!n){' + (b ? source : - 'n=e;while((n=n.' + n + 'Sibling)' + type + ');if(!n){' + source + '}') + '}' ) + '}'; - } - break; - } - - } - - // *** negation, user action and target pseudo-classes - // *** UI element states and dynamic pseudo-classes - // CSS3 :not, :checked, :enabled, :disabled, :target - // CSS3 :active, :hover, :focus - // CSS3 :link, :visited - else if ((match = selector.match(Patterns.dpseudos)) && match[1]) { - - switch (match[1].match(/^\w+/)[0]) { - // CSS3 negation pseudo-class - case 'not': - // compile nested selectors, DO NOT pass the callback parameter - // SIMPLENOT allow disabling complex selectors nested - // in ':not()' pseudo-classes, breaks some test units - expr = match[3].replace(reTrimSpaces, ''); - - if (Config.SIMPLENOT && !reSimpleNot.test(expr)) { - // see above, log error but continue execution - emit('Negation pseudo-class only accepts simple selectors "' + selector + '"'); - return ''; - } else { - if ('compatMode' in doc) { - source = 'if(!' + compile(expr, '', false) + '(e,s,r,d,h,g)){' + source + '}'; - } else { - source = 'if(!s.match(e, "' + expr.replace(/\x22/g, '\\"') + '",g)){' + source +'}'; - } - } - break; - - // CSS3 UI element states - case 'checked': - // for radio buttons checkboxes (HTML4) and options (HTML5) - source = 'if((typeof e.form!=="undefined"&&(/^(?:radio|checkbox)$/i).test(e.type)&&e.checked)' + - (Config.USE_HTML5 ? '||(/^option$/i.test(e.nodeName)&&(e.selected||e.checked))' : '') + - '){' + source + '}'; - break; - case 'disabled': - // does not consider hidden input fields - source = 'if(((typeof e.form!=="undefined"' + - (Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') + - ')||s.isLink(e))&&e.disabled===true){' + source + '}'; - break; - case 'enabled': - // does not consider hidden input fields - source = 'if(((typeof e.form!=="undefined"' + - (Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') + - ')||s.isLink(e))&&e.disabled===false){' + source + '}'; - break; - - // CSS3 lang pseudo-class - case 'lang': - test = ''; - if (match[2]) test = match[2].substr(0, 2) + '-'; - source = 'do{(n=e.lang||"").toLowerCase();' + - 'if((n==""&&h.lang=="' + match[2].toLowerCase() + '")||' + - '(n&&(n=="' + match[2].toLowerCase() + - '"||n.substr(0,3)=="' + test.toLowerCase() + '")))' + - '{' + source + 'break;}}while((e=e.parentNode)&&e!==g);'; - break; - - // CSS3 target pseudo-class - case 'target': - n = doc.location ? doc.location.hash : ''; - if (n) { - source = 'if(e.id=="' + n.slice(1) + '"){' + source + '}'; - } - break; - - // CSS3 dynamic pseudo-classes - case 'link': - source = 'if(s.isLink(e)&&!e.visited){' + source + '}'; - break; - case 'visited': - source = 'if(s.isLink(e)&&e.visited){' + source + '}'; - break; - - // CSS3 user action pseudo-classes IE & FF3 have native support - // these capabilities may be emulated by some event managers - case 'active': - if (XML_DOCUMENT) break; - source = 'if(e===d.activeElement){' + source + '}'; - break; - case 'hover': - if (XML_DOCUMENT) break; - source = 'if(e===d.hoverElement){' + source + '}'; - break; - case 'focus': - if (XML_DOCUMENT) break; - source = NATIVE_FOCUS ? - 'if(e===d.activeElement&&d.hasFocus()&&(e.type||e.href||!isNaN(e.tabIndex))){' + source + '}' : - 'if(e===d.activeElement&&(e.type||e.href)){' + source + '}'; - break; - - // CSS2 selected pseudo-classes, not part of current CSS3 drafts - // the 'selected' property is only available for option elements - case 'selected': - // fix Safari selectedIndex property bug - expr = BUGGY_SELECTED ? '||(n=e.parentNode)&&n.options[n.selectedIndex]===e' : ''; - source = 'if(/^option$/i.test(e.nodeName)&&(e.selected' + expr + ')){' + source + '}'; - break; - - default: - break; - } - - } - - else { - - // this is where external extensions are - // invoked if expressions match selectors - expr = false; - status = false; - for (expr in Selectors) { - if ((match = selector.match(Selectors[expr].Expression)) && match[1]) { - result = Selectors[expr].Callback(match, source); - source = result.source; - status = result.status; - if (status) { break; } - } - } - - // if an extension fails to parse the selector - // it must return a false boolean in "status" - if (!status) { - // log error but continue execution, don't throw real exceptions - // because blocking following processes maybe is not a good idea - emit('Unknown pseudo-class selector "' + selector + '"'); - return ''; - } - - if (!expr) { - // see above, log error but continue execution - emit('Unknown token in selector "' + selector + '"'); - return ''; - } - - } - - // error if no matches found by the pattern scan - if (!match) { - emit('Invalid syntax in selector "' + selector + '"'); - return ''; - } - - // ensure "match" is not null or empty since - // we do not throw real DOMExceptions above - selector = match && match[match.length - 1]; - } - - return source; - }, - - /*----------------------------- QUERY METHODS ------------------------------*/ - - // match element with selector - // @return boolean - match = - function(element, selector, from, callback) { - - var parts; - - if (!(element && element.nodeName > '@')) { - emit('Invalid element argument'); - return false; - } else if (!selector || typeof selector != 'string') { - emit('Invalid selector argument'); - return false; - } else if (from && from.nodeType == 1 && !contains(from, element)) { - return false; - } else if (lastContext !== from) { - // reset context data when it changes - // and ensure context is set to a default - switchContext(from || (from = element.ownerDocument)); - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, element, from)); - - if (lastMatcher != selector) { - // process valid selector strings - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleMatch = (parts = selector.match(reSplitGroup)).length < 2; - // save passed selector - lastMatcher = selector; - lastPartsMatch = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return false; - } - } else parts = lastPartsMatch; - - // compile matcher resolver if necessary - if (!matchResolvers[selector] || matchContexts[selector] !== from) { - matchResolvers[selector] = compile(isSingleMatch ? [selector] : parts, '', false); - matchContexts[selector] = from; - } - - return matchResolvers[selector](element, Snapshot, [ ], doc, root, from, callback, { }); - }, - - // select only the first element - // matching selector (document ordered) - first = - function(selector, from) { - return select(selector, from, function() { return false; })[0] || null; - }, - - // select elements matching selector - // using new Query Selector API - // or cross-browser client API - // @return array - select = - function(selector, from, callback) { - - var i, changed, element, elements, parts, token, original = selector; - - if (arguments.length === 0) { - emit('Missing required selector parameters'); - return [ ]; - } else if (selector === '') { - emit('Empty selector string'); - return [ ]; - } else if (typeof selector != 'string') { - return [ ]; - } else if (from && !(/1|9|11/).test(from.nodeType)) { - emit('Invalid context element'); - return [ ]; - } else if (lastContext !== from) { - // reset context data when it changes - // and ensure context is set to a default - switchContext(from || (from = doc)); - } - - if (Config.CACHING && (elements = Dom.loadResults(original, from, doc, root))) { - return callback ? concatCall([ ], elements, callback) : elements; - } - - if (!OPERA_QSAPI && RE_SIMPLE_SELECTOR.test(selector)) { - switch (selector.charAt(0)) { - case '#': - if ((element = _byId(selector.slice(1), from))) { - elements = [ element ]; - } else elements = [ ]; - break; - case '.': - elements = _byClass(selector.slice(1), from); - break; - default: - elements = _byTag(selector, from); - break; - } - } - - else if (!XML_DOCUMENT && Config.USE_QSAPI && - !(BUGGY_QUIRKS_QSAPI && RE_CLASS.test(selector)) && - !RE_BUGGY_QSAPI.test(selector)) { - try { - elements = from.querySelectorAll(selector); - } catch(e) { } - } - - if (elements) { - elements = callback ? concatCall([ ], elements, callback) : - NATIVE_SLICE_PROTO ? slice.call(elements) : concatList([ ], elements); - Config.CACHING && Dom.saveResults(original, from, doc, elements); - return elements; - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, from)); - - if ((changed = lastSelector != selector)) { - // process valid selector strings - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleSelect = (parts = selector.match(reSplitGroup)).length < 2; - // save passed selector - lastSelector = selector; - lastPartsSelect = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return [ ]; - } - } else parts = lastPartsSelect; - - // commas separators are treated sequentially to maintain order - if (from.nodeType == 11) { - - elements = from.childNodes; - - } else if (!XML_DOCUMENT && isSingleSelect) { - - if (changed) { - // get right most selector token - parts = selector.match(reSplitToken); - token = parts[parts.length - 1]; - - // only last slice before :not rules - lastSlice = token.split(':not')[0]; - - // position where token was found - lastPosition = selector.length - token.length; - } - - // ID optimization RTL, to reduce number of elements to visit - if ((parts = lastSlice.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, from))) { - if (match(element, selector)) { - callback && callback(element); - elements = [ element ]; - } else elements = [ ]; - } - } - - // ID optimization LTR, to reduce selection context searches - else if ((parts = selector.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, doc))) { - if ('#' + token == selector) { - callback && callback(element); - elements = [ element ]; - } else if (/[>+~]/.test(selector)) { - from = element.parentNode; - } else { - from = element; - } - } else elements = [ ]; - } - - if (elements) { - Config.CACHING && Dom.saveResults(original, from, doc, elements); - return elements; - } - - if (!NATIVE_GEBCN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) { - if ((elements = _byTag(token, from)).length === 0) { return [ ]; } - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*'); - } - - else if ((parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) { - if ((elements = _byClass(token, from)).length === 0) { return [ ]; } - if (reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1))) { - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, ''); - } else { - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, '*'); - } - } - - else if ((parts = selector.match(Optimize.CLASS)) && (token = parts[1])) { - if ((elements = _byClass(token, from)).length === 0) { return [ ]; } - for (i = 0, els = [ ]; elements.length > i; ++i) { - els = concatList(els, elements[i].getElementsByTagName('*')); - } - elements = els; - if (reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1))) { - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, ''); - } else { - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, '*'); - } - } - - else if (NATIVE_GEBCN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) { - if ((elements = _byTag(token, from)).length === 0) { return [ ]; } - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*'); - } - - } - - if (!elements) { - elements = /^(?:applet|object)$/i.test(from.nodeName) ? from.childNodes : _byTag('*', from); - } - // end of prefiltering pass - - // compile selector resolver if necessary - if (!selectResolvers[selector] || selectContexts[selector] !== from) { - selectResolvers[selector] = compile(isSingleSelect ? [selector] : parts, '', true); - selectContexts[selector] = from; - } - - elements = selectResolvers[selector](elements, Snapshot, [ ], doc, root, from, callback, { }); - - Config.CACHING && Dom.saveResults(original, from, doc, elements); - - return elements; - }, - - /*-------------------------------- STORAGE ---------------------------------*/ - - // compiled match functions returning booleans - matchContexts = { }, - matchResolvers = { }, - - // compiled select functions returning collections - selectContexts = { }, - selectResolvers = { }, - - // used to pass methods to compiled functions - Snapshot = { - - // element indexing methods - nthElement: nthElement, - nthOfType: nthOfType, - - // element inspection methods - getAttribute: getAttribute, - hasAttribute: hasAttribute, - - // element selection methods - byClass: _byClass, - byName: byName, - byTag: _byTag, - byId: _byId, - - // helper/check methods - contains: contains, - isEmpty: isEmpty, - isLink: isLink, - - // selection/matching - select: select, - match: match - }, - - Tokens = { - prefixes: prefixes, - encoding: encoding, - operators: operators, - whitespace: whitespace, - identifier: identifier, - attributes: attributes, - combinators: combinators, - pseudoclass: pseudoclass, - pseudoparms: pseudoparms, - quotedvalue: quotedvalue - }; - - /*------------------------------- PUBLIC API -------------------------------*/ - - // code referenced by extensions - Dom.ACCEPT_NODE = ACCEPT_NODE; - - // log resolvers errors/warnings - Dom.emit = emit; - - // retrieve element by id attr - Dom.byId = byId; - - // retrieve elements by tag name - Dom.byTag = byTag; - - // retrieve elements by name attr - Dom.byName = byName; - - // retrieve elements by class name - Dom.byClass = byClass; - - // read the value of the attribute - // as was in the original HTML code - Dom.getAttribute = getAttribute; - - // check for the attribute presence - // as was in the original HTML code - Dom.hasAttribute = hasAttribute; - - // element match selector, return boolean true/false - Dom.match = match; - - // first element match only, return element or null - Dom.first = first; - - // elements matching selector, starting from element - Dom.select = select; - - // compile selector into ad-hoc javascript resolver - Dom.compile = compile; - - // check that two elements are ancestor/descendant - Dom.contains = contains; - - // handle selector engine configuration settings - Dom.configure = configure; - - // initialize caching for each document - Dom.setCache = function() { return; }; - - // load previously collected result set - Dom.loadResults = function() { return; }; - - // save previously collected result set - Dom.saveResults = function() { return; }; - - // handle missing context in selector strings - Dom.shortcuts = function(x) { return x; }; - - // options enabing specific engine functionality - Dom.Config = Config; - - // pass methods references to compiled resolvers - Dom.Snapshot = Snapshot; - - // operators descriptor - // for attribute operators extensions - Dom.Operators = Operators; - - // selectors descriptor - // for pseudo-class selectors extensions - Dom.Selectors = Selectors; - - // export string patterns - Dom.Tokens = Tokens; - - // add or overwrite user defined operators - Dom.registerOperator = - function(symbol, resolver) { - Operators[symbol] || (Operators[symbol] = resolver); - }; - - // add selector patterns for user defined callbacks - Dom.registerSelector = - function(name, rexp, func) { - Selectors[name] || (Selectors[name] = { - Expression: rexp, - Callback: func - }); - }; - - /*---------------------------------- INIT ----------------------------------*/ - - // init context specific variables - switchContext(doc, true); - -}); diff --git a/node_modules/jsdom/node_modules/nwmatcher/src/NEW2/nwmatcher-base.js.NEW b/node_modules/jsdom/node_modules/nwmatcher/src/NEW2/nwmatcher-base.js.NEW deleted file mode 100644 index 9a4d97e..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/src/NEW2/nwmatcher-base.js.NEW +++ /dev/null @@ -1,686 +0,0 @@ -/* - * Copyright (C) 2007-2012 Diego Perini - * All rights reserved. - * - * nwmatcher-base.js - A fast CSS selector engine and matcher - * - * Author: Diego Perini - * Version: 1.3.0 - * Created: 20070722 - * Release: 20121203 - * - * License: - * http://javascript.nwbox.com/NWMatcher/MIT-LICENSE - * Download: - * http://javascript.nwbox.com/NWMatcher/nwmatcher.js - */ - -(function(global, factory) { - - if (typeof module === 'object' && typeof exports === 'object') { - module.exports = function (browserGlobal) { - var exports = { }; - factory(browserGlobal, exports); - return exports; - }; - } else { - if (!global.NW) { - global.NW = { }; - } - if (!global.NW.Dom) { - global.NW.Dom = { }; - } - factory(global, global.NW.Dom); - } - -})(this, function(global, exports) { - - var version = 'nwmatcher-1.3.0', - - Dom = exports, - - doc = global.document, - root = doc.documentElement, - - slice = [ ].slice, - - isSingleMatch, - isSingleSelect, - - lastSlice, - lastContext, - lastPosition, - - lastMatcher, - lastSelector, - - lastPartsMatch, - lastPartsSelect, - - prefixes = '[#.:]?', - operators = '([~*^$|!]?={1})', - whitespace = '[\\x20\\t\\n\\r\\f]*', - combinators = '[\\x20]|[>+~][^>+~]', - pseudoparms = '(?:[-+]?\\d*n)?[-+]?\\d*', - - quotedvalue = '"[^"]*"' + "|'[^']*'", - skipgroup = '\\[.*\\]|\\(.*\\)|\\{.*\\}', - - encoding = '(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)', - identifier = '(?:-?[_a-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+', - - attrcheck = '(' + quotedvalue + '|' + identifier + ')', - attributes = whitespace + '(' + encoding + '+:?' + encoding + '+)' + - whitespace + '(?:' + operators + whitespace + attrcheck + ')?' + whitespace, - - attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'), - - pseudoclass = '((?:' + - pseudoparms + '|' + quotedvalue + '|' + - prefixes + '|' + encoding + '+|' + - '\\[' + attributes + '\\]|' + - '\\(.+\\)|' + whitespace + '|' + - ',)+)', - - extensions = '.+', - - standardValidator = - '(?=[\\x20\\t\\n\\r\\f]*[^>+~(){}<>])' + - '(' + - '\\*' + - '|(?:' + prefixes + identifier + ')' + - '|' + combinators + - '|\\[' + attributes + '\\]' + - '|\\(' + pseudoclass + '\\)' + - '|\\{' + extensions + '\\}' + - '|(?:,|' + whitespace + ')' + - ')+', - - extendedValidator = standardValidator.replace(pseudoclass, '.*'), - - reValidator = RegExp(standardValidator, 'g'), - - reTrimSpaces = RegExp('^' + - whitespace + '|' + whitespace + '$', 'g'), - - reSplitGroup = RegExp('(' + - '[^,\\\\()[\\]]+' + - '|\\[[^[\\]]*\\]|\\[.*\\]' + - '|\\([^()]+\\)|\\(.*\\)' + - '|\\{[^{}]+\\}|\\{.*\\}' + - '|\\\\.' + - ')+', 'g'), - - reSplitToken = RegExp('(' + - '\\[' + attributes + '\\]|' + - '\\(' + pseudoclass + '\\)|' + - '[^\\x20\\t\\n\\r\\f>+~]|\\\\.)+', 'g'), - - reWhiteSpace = /[\x20\t\n\r\f]+/g, - - reOptimizeSelector = RegExp(identifier + '|^$'), - - ATTR_BOOLEAN = { - checked: 1, disabled: 1, ismap: 1, - multiple: 1, readonly: 1, selected: 1 - }, - - ATTR_DEFAULT = { - value: 'defaultValue', - checked: 'defaultChecked', - selected: 'defaultSelected' - }, - - ATTR_URIDATA = { - action: 2, cite: 2, codebase: 2, data: 2, href: 2, - longdesc: 2, lowsrc: 2, src: 2, usemap: 2 - }, - - Selectors = { }, - - Operators = { - '=': "n=='%m'", - '^=': "n.indexOf('%m')==0", - '*=': "n.indexOf('%m')>-1", - '|=': "(n+'-').indexOf('%m-')==0", - '~=': "(' '+n+' ').indexOf(' %m ')>-1", - '$=': "n.substr(n.length-'%m'.length)=='%m'" - }, - - Optimize = { - ID: RegExp('^\\*?#(' + encoding + '+)|' + skipgroup), - TAG: RegExp('^(' + encoding + '+)|' + skipgroup), - CLASS: RegExp('^\\*?\\.(' + encoding + '+$)|' + skipgroup) - }, - - Patterns = { - universal: /^\*(.*)/, - id: RegExp('^#(' + encoding + '+)(.*)'), - tagName: RegExp('^(' + encoding + '+)(.*)'), - className: RegExp('^\\.(' + encoding + '+)(.*)'), - attribute: RegExp('^\\[' + attrmatcher + '\\](.*)'), - children: /^[\x20\t\n\r\f]*\>[\x20\t\n\r\f]*(.*)/, - adjacent: /^[\x20\t\n\r\f]*\+[\x20\t\n\r\f]*(.*)/, - relative: /^[\x20\t\n\r\f]*\~[\x20\t\n\r\f]*(.*)/, - ancestor: /^[\x20\t\n\r\f]+(.*)/ - }, - - QUIRKS_MODE, - XML_DOCUMENT, - - GEBTN = 'getElementsByTagName' in doc, - GEBCN = 'getElementsByClassName' in doc, - - IE_LT_9 = typeof doc.addEventListener != 'function', - - INSENSITIVE_MAP = { - 'href': 1, 'lang': 1, 'src': 1, 'style': 1, 'title': 1, - 'type': 1, 'xmlns': 1, 'xml:lang': 1, 'xml:space': 1 - }, - - TO_UPPER_CASE = IE_LT_9 ? '.toUpperCase()' : '', - - ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break main;else continue main;', - REJECT_NODE = IE_LT_9 ? 'if(e.nodeName<"A")continue;' : '', - - Config = { - CACHING: false, - SIMPLENOT: true, - UNIQUE_ID: true, - USE_HTML5: true, - VERBOSITY: true - }, - - configure = - function(option) { - if (typeof option == 'string') { return Config[option]; } - if (typeof option != 'object') { return false; } - for (var i in option) { - Config[i] = !!option[i]; - if (i == 'SIMPLENOT') { - matchContexts = { }; - matchResolvers = { }; - selectContexts = { }; - selectResolvers = { }; - } - } - reValidator = RegExp(Config.SIMPLENOT ? - standardValidator : extendedValidator, 'g'); - return true; - }, - - concatCall = - function(data, elements, callback) { - var i = -1, element; - while ((element = elements[++i])) { - if (false === callback(data[data.length] = element)) { break; } - } - return data; - }, - - emit = - function(message) { - if (Config.VERBOSITY) { throw Error(message); } - if (global.console && global.console.log) { - global.console.log(message); - } - }, - - switchContext = - function(from, force) { - var oldDoc = doc; - lastContext = from; - doc = from.ownerDocument || from; - if (force || oldDoc !== doc) { - root = doc.documentElement; - XML_DOCUMENT = doc.createElement('DiV').nodeName == 'DiV'; - QUIRKS_MODE = !XML_DOCUMENT && - typeof doc.compatMode == 'string' ? - doc.compatMode.indexOf('CSS') < 0 : - (function() { - var style = document.createElement('div').style; - return style && (style.width = 1) && style.width == '1px'; - })(); - - Config.CACHING && Dom.setCache(true, doc); - } - }, - - byIdRaw = - function(id, elements) { - var i = 0, element = null; - while ((element = elements[i])) { - if (element.getAttribute('id') == id) { - break; - } - ++i; - } - return element; - }, - - _byId = !('fileSize' in doc) ? - function(id, from) { - id = id.replace(/\\([^\\]{1})/g, '$1'); - return from.getElementById && from.getElementById(id) || - byIdRaw(id, from.getElementsByTagName('*')); - } : - function(id, from) { - var element = null; - id = id.replace(/\\([^\\]{1})/g, '$1'); - if (XML_DOCUMENT || from.nodeType != 9) { - return byIdRaw(id, from.getElementsByTagName('*')); - } - if ((element = from.getElementById(id)) && - element.name == id && from.getElementsByName) { - return byIdRaw(id, from.getElementsByName(id)); - } - return element; - }, - - byId = - function(id, from) { - from || (from = doc); - if (lastContext !== from) { switchContext(from); } - return _byId(id, from); - }, - - getAttribute = - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (typeof node[attribute] == 'object') { - return node.attributes[attribute] && - node.attributes[attribute].value || ''; - } - return ( - attribute == 'type' ? node.getAttribute(attribute) || '' : - ATTR_URIDATA[attribute] ? node.getAttribute(attribute, 2) || '' : - ATTR_BOOLEAN[attribute] ? node.getAttribute(attribute) ? attribute : 'false' : - ((node = node.getAttributeNode(attribute)) && node.value) || ''); - }, - - hasAttribute = root.hasAttribute ? - function(node, attribute) { - return node.hasAttribute(attribute); - } : - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (ATTR_DEFAULT[attribute]) { - return !!node[ATTR_DEFAULT[attribute]]; - } - node = node.getAttributeNode(attribute); - return !!(node && node.specified); - }, - - compile = - function(selector, source, mode) { - - var parts = typeof selector == 'string' ? selector.match(reSplitGroup) : selector; - - typeof source == 'string' || (source = ''); - - if (parts.length == 1) { - source += compileSelector(parts[0], mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } else { - var i = -1, seen = { }, token; - while ((token = parts[++i])) { - token = token.replace(reTrimSpaces, ''); - if (!seen[token] && (seen[token] = true)) { - source += compileSelector(token, mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } - } - } - - if (mode) - return Function('c,s,r,d,h,g,f,v', - 'var N,n,x=0,k=-1,e;main:while((e=c[++k])){' + source + '}return r;'); - else - return Function('e,s,r,d,h,g,f,v', - 'var N,n,x=0,k=e;' + source + 'return false;'); - }, - - FILTER = - 'var z=v[@]||(v[@]=[]),l=z.length-1;' + - 'while(l>=0&&z[l]!==e)--l;' + - 'if(l!==-1){break;}' + - 'z[z.length]=e;', - - compileSelector = - function(selector, source, mode) { - - var k = 0, expr, match, name, result, status, test, type; - - while (selector) { - - k++; - - if ((match = selector.match(Patterns.universal))) { - expr = ''; - } - - else if ((match = selector.match(Patterns.id))) { - source = 'if(' + (XML_DOCUMENT ? - 's.getAttribute(e,"id")' : - '(e.submit?s.getAttribute(e,"id"):e.id)') + - '=="' + match[1] + '"' + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.tagName))) { - source = 'if(e.nodeName' + (XML_DOCUMENT ? - '=="' + match[1] + '"' : TO_UPPER_CASE + - '=="' + match[1].toUpperCase() + '"') + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.className))) { - source = 'if((n=' + (XML_DOCUMENT ? - 'e.getAttribute("class")' : 'e.className') + - ')&&n.length&&(" "+' + (QUIRKS_MODE ? 'n.toLowerCase()' : 'n') + - '.replace(' + reWhiteSpace + '," ")+" ").indexOf(" ' + - (QUIRKS_MODE ? match[1].toLowerCase() : match[1]) + ' ")>-1' + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.attribute))) { - if (match[2] && !Operators[match[2]]) { - emit('Unsupported operator in attribute selectors "' + selector + '"'); - return ''; - } - test = 'false'; - if (match[4]) { - type = INSENSITIVE_MAP[match[1].toLowerCase()]; - match[4] = - (type ? match[4].toLowerCase() : match[4]) - .replace(/\\([0-9a-f]{2,2})/g, '\\x$1') - .replace(/(\x22|\x27)/g, '\\$1'); - } - if (match[2] && match[4] && (test = Operators[match[2]])) { - test = test.replace(/\%m/g, match[4]); - } else if (match[2] == '!=' || match[2] == '=') { - test = 'n' + match[2] + '="' + match[4] + '"'; - } - expr = 'n=s.' + (match[2] ? 'get' : 'has') + 'Attribute(e,"' + match[1] + '")' + (type ? '.toLowerCase();' : ';'); - source = expr + 'if(' + (match[2] ? test : 'n') + '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.adjacent))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&(e=e.previousSibling)){if(e.nodeName>"@"){' + source + 'break;}}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.relative))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;e=e.parentNode.firstChild;while(e&&e!==N' + k + '){if(e.nodeName>"@"){' + source + '}e=e.nextSibling;}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.children))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + 'break;}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.ancestor))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + '}e=N' + k + ';'; - } - - else { - - expr = false; - status = false; - for (expr in Selectors) { - if ((match = selector.match(Selectors[expr].Expression)) && match[1]) { - result = Selectors[expr].Callback(match, source); - source = result.source; - status = result.status; - if (status) { break; } - } - } - - if (!status) { - emit('Unknown pseudo-class selector "' + selector + '"'); - return ''; - } - - if (!expr) { - emit('Unknown token in selector "' + selector + '"'); - return ''; - } - - } - - if (!match) { - emit('Invalid syntax in selector "' + selector + '"'); - return ''; - } - - selector = match && match[match.length - 1]; - } - - return source; - }, - - match = - function(element, selector, from, callback) { - - var parts; - - if (!(element && element.nodeName > '@')) { - emit('Invalid element argument'); - return false; - } else if (!selector || typeof selector != 'string') { - emit('Invalid selector argument'); - return false; - } else if (lastContext !== from) { - switchContext(from || (from = element.ownerDocument)); - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, element, from)); - - if (lastMatcher != selector) { - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleMatch = (parts = selector.match(reSplitGroup)).length < 2; - lastMatcher = selector; - lastPartsMatch = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return false; - } - } else parts = lastPartsMatch; - - if (!matchResolvers[selector] || matchContexts[selector] !== from) { - matchResolvers[selector] = compile(isSingleMatch ? [selector] : parts, '', false); - matchContexts[selector] = from; - } - - return matchResolvers[selector](element, Snapshot, [ ], doc, root, from, callback, { }); - }, - - first = - function(selector, from) { - return select(selector, from, function() { return false; })[0] || null; - }, - - select = - function(selector, from, callback) { - - var i, changed, element, elements, parts, token, original = selector; - - if (arguments.length === 0) { - emit('Not enough arguments'); - return [ ]; - } else if (typeof selector != 'string') { - return [ ]; - } else if (!(/[>+~*\w\u00a1-\uffff]/.test(selector))) { - emit('Invalid or illegal selector string'); - return [ ]; - } else if (from && !(/1|9|11/).test(from.nodeType)) { - emit('Invalid or illegal context element'); - return [ ]; - } else if (lastContext !== from) { - switchContext(from || (from = doc)); - } - - if (Config.CACHING && (elements = Dom.loadResults(original, from, doc, root))) { - return callback ? concatCall([ ], elements, callback) : elements; - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, from)); - - if ((changed = lastSelector != selector)) { - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleSelect = (parts = selector.match(reSplitGroup)).length < 2; - lastSelector = selector; - lastPartsSelect = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return [ ]; - } - } else parts = lastPartsSelect; - - if (from.nodeType == 11) { - - elements = from.childNodes; - - } else if (isSingleSelect) { - - if (changed) { - parts = selector.match(reSplitToken); - token = parts[parts.length - 1]; - lastSlice = token.split(':not')[0]; - lastPosition = selector.length - token.length; - } - - if (Config.UNIQUE_ID && (parts = lastSlice.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, from))) { - if (match(element, selector)) { - callback && callback(element); - elements = [ element ]; - } else elements = [ ]; - } - } - - else if (Config.UNIQUE_ID && (parts = selector.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, doc))) { - if ('#' + token == selector) { - callback && callback(element); - elements = [ element ]; - } else if (/[>+~]/.test(selector)) { - from = element.parentNode; - } else { - from = element; - } - } else elements = [ ]; - } - - if (elements) { - Config.CACHING && Dom.saveResults(original, from, doc, elements); - return elements; - } - - if (!XML_DOCUMENT && GEBTN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) { - if ((elements = from.getElementsByTagName(token)).length === 0) return [ ]; - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*'); - } - - else if (!XML_DOCUMENT && GEBCN && (parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) { - if ((elements = from.getElementsByClassName(token.replace(/\\([^\\]{1})/g, '$1'))).length === 0) return [ ]; - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, - reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1)) ? '' : '*'); - } - - } - - if (!elements) { - if (IE_LT_9) { - elements = /^(?:applet|object)$/i.test(from.nodeName) ? - from.childNodes : from.all; - } else { - elements = from.getElementsByTagName('*'); - } - } - - if (!selectResolvers[selector] || selectContexts[selector] !== from) { - selectResolvers[selector] = compile(isSingleSelect ? [selector] : parts, REJECT_NODE, true); - selectContexts[selector] = from; - } - - elements = selectResolvers[selector](elements, Snapshot, [ ], doc, root, from, callback, { }); - - Config.CACHING && Dom.saveResults(original, from, doc, elements); - - return elements; - }, - - FN = function(x) { return x; }, - - matchContexts = { }, - matchResolvers = { }, - - selectContexts = { }, - selectResolvers = { }, - - Snapshot = { - byId: _byId, - match: match, - select: select, - getAttribute: getAttribute, - hasAttribute: hasAttribute - }; - - Tokens = { - prefixes: prefixes, - encoding: encoding, - operators: operators, - whitespace: whitespace, - identifier: identifier, - attributes: attributes, - combinators: combinators, - pseudoclass: pseudoclass, - pseudoparms: pseudoparms, - quotedvalue: quotedvalue - }; - - Dom.ACCEPT_NODE = ACCEPT_NODE; - - Dom.emit = emit; - - Dom.byId = byId; - Dom.match = match; - Dom.first = first; - Dom.select = select; - Dom.compile = compile; - Dom.configure = configure; - - Dom.Config = Config; - - Dom.Operators = Operators; - Dom.Selectors = Selectors; - - Dom.Snapshot = Snapshot; - Dom.Tokens = Tokens; - - Dom.setCache = FN; - Dom.shortcuts = FN; - Dom.loadResults = FN; - Dom.saveResults = FN; - - Dom.registerOperator = - function(symbol, resolver) { - Operators[symbol] || (Operators[symbol] = resolver); - }; - - Dom.registerSelector = - function(name, rexp, func) { - Selectors[name] || (Selectors[name] = { - Expression: rexp, - Callback: func - }); - }; - - switchContext(doc, true); - -}); diff --git a/node_modules/jsdom/node_modules/nwmatcher/src/NEW2/nwmatcher.js.NEW b/node_modules/jsdom/node_modules/nwmatcher/src/NEW2/nwmatcher.js.NEW deleted file mode 100644 index f81b5b1..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/src/NEW2/nwmatcher.js.NEW +++ /dev/null @@ -1,1659 +0,0 @@ -/* - * Copyright (C) 2007-2012 Diego Perini - * All rights reserved. - * - * nwmatcher.js - A fast CSS selector engine and matcher - * - * Author: Diego Perini - * Version: 1.3.0 - * Created: 20070722 - * Release: 20121231 - * - * License: - * http://javascript.nwbox.com/NWMatcher/MIT-LICENSE - * Download: - * http://javascript.nwbox.com/NWMatcher/nwmatcher.js - */ - -(function(global, factory) { - - if (typeof module === 'object' && typeof exports === 'object') { - // in a Node.js environment, the nwmatcher functions will operate on - // the passed "browserGlobal" and will be returned in an object - module.exports = function (browserGlobal) { - var exports = { }; - factory(browserGlobal, exports); - return exports; - }; - } else { - // in a browser environment, the nwmatcher functions will operate on - // the "global" loading them and be attached to "global.NW.Dom" - if (!global.NW) { - global.NW = { }; - } - if (!global.NW.Dom) { - global.NW.Dom = { }; - } - factory(global, global.NW.Dom); - } - -})(this, function(global, exports) { - - var version = 'nwmatcher-1.3.0', - - Dom = exports, - - // processing context & root element - doc = global.document, - root = doc.documentElement, - - // save utility methods references - slice = [ ].slice, - string = { }.toString, - - // persist previous parsed data - isSingleMatch, - isSingleSelect, - - lastSlice, - lastContext, - lastPosition, - - lastMatcher, - lastSelector, - - lastPartsMatch, - lastPartsSelect, - - // accepted prefix identifiers - // (id, class & pseudo-class) - prefixes = '[#.:]?', - - // accepted attribute operators - operators = '([~*^$|!]?={1})', - - // accepted whitespace characters - whitespace = '[\\x20\\t\\n\\r\\f]*', - - // 4 combinators F E, F>E, F+E, F~E - combinators = '[\\x20]|[>+~][^>+~]', - - // an+b format params for pseudo-classes - pseudoparms = '(?:[-+]?\\d*n)?[-+]?\\d*', - - // CSS quoted string values - quotedvalue = '"[^"]*"' + "|'[^']*'", - - // skip round brackets groups - skipround = '\\([^()]+\\)|\\(.*\\)', - // skip curly brackets groups - skipcurly = '\\{[^{}]+\\}|\\{.*\\}', - // skip square brackets groups - skipsquare = '\\[[^[\\]]*\\]|\\[.*\\]', - - // skip [ ], ( ), { } brackets groups - skipgroup = '\\[.*\\]|\\(.*\\)|\\{.*\\}', - - // http://www.w3.org/TR/css3-syntax/#characters - // unicode/ISO 10646 characters 161 and higher - // NOTE: Safari 2.0.x crashes with escaped (\\) - // Unicode ranges in regular expressions so we - // use a negated character range class instead - encoding = '(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)', - - // CSS identifier syntax - identifier = '(?:-?[_a-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+', - - // build attribute string - attrcheck = '(' + quotedvalue + '|' + identifier + ')', - attributes = whitespace + '(' + encoding + '+:?' + encoding + '+)' + - whitespace + '(?:' + operators + whitespace + attrcheck + ')?' + whitespace, - attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'), - - // build pseudoclass string - pseudoclass = '((?:' + - // an+b parameters or quoted string - pseudoparms + '|' + quotedvalue + '|' + - // id, class, pseudo-class selector - prefixes + '|' + encoding + '+|' + - // nested HTML attribute selector - '\\[' + attributes + '\\]|' + - // nested pseudo-class selector - '\\(.+\\)|' + whitespace + '|' + - // nested pseudos/separators - ',)+)', - - // placeholder for extensions - extensions = '.+', - - // CSS3: syntax scanner and - // one pass validation only - // using regular expression - standardValidator = - // discard start - '(?=[\\x20\\t\\n\\r\\f]*[^>+~(){}<>])' + - // open match group - '(' + - //universal selector - '\\*' + - // id/class/tag/pseudo-class identifier - '|(?:' + prefixes + identifier + ')' + - // combinator selector - '|' + combinators + - // HTML attribute selector - '|\\[' + attributes + '\\]' + - // pseudo-classes parameters - '|\\(' + pseudoclass + '\\)' + - // dom properties selector (extension) - '|\\{' + extensions + '\\}' + - // selector group separator (comma) - '|(?:,|' + whitespace + ')' + - // close match group - ')+', - - // validator for complex selectors in ':not()' pseudo-classes - extendedValidator = standardValidator.replace(pseudoclass, '.*'), - - // validator for standard selectors as default - reValidator = new RegExp(standardValidator, 'g'), - - // whitespace is any combination of these 5 character [\x20\t\n\r\f] - // http://www.w3.org/TR/css3-selectors/#selector-syntax - reTrimSpaces = new RegExp('^' + - whitespace + '|' + whitespace + '$', 'g'), - - // only allow simple selectors nested in ':not()' pseudo-classes - reSimpleNot = new RegExp('^(' + - '(?!:not)' + - '(' + prefixes + - '|' + identifier + - '|\\([^()]*\\))+' + - '|\\[' + attributes + '\\]' + - ')$'), - - // split comma groups, exclude commas from - // quotes '' "" and from brackets () [] {} - reSplitGroup = new RegExp('(' + - '[^,\\\\()[\\]]+' + - '|' + skipsquare + - '|' + skipround + - '|' + skipcurly + - '|\\\\.' + - ')+', 'g'), - - // split last, right most, selector group token - reSplitToken = new RegExp('(' + - '\\[' + attributes + '\\]|' + - '\\(' + pseudoclass + '\\)|' + - '[^\\x20\\t\\r\\n\\f>+~]|\\\\.)+', 'g'), - - // for in excess whitespace removal - reWhiteSpace = /[\x20\t\n\r\f]+/g, - - reOptimizeSelector = new RegExp(identifier + '|^$'), - - /*----------------------------- FEATURE TESTING ----------------------------*/ - - // detect native methods - isNative = (function() { - var s = (doc.appendChild + '').replace(/appendChild/g, ''); - return function(object, method) { - var m = object && object[method] || false; - return m && typeof m != 'string' && - s == (m + '').replace(new RegExp(method, 'g'), ''); - }; - })(), - - // NATIVE_XXXXX true if method exist and is callable - // detect if DOM methods are native in browsers - NATIVE_FOCUS = isNative(doc, 'hasFocus'), - NATIVE_QSAPI = isNative(doc, 'querySelector'), - NATIVE_GEBID = isNative(doc, 'getElementById'), - NATIVE_GEBTN = isNative(root, 'getElementsByTagName'), - NATIVE_GEBCN = isNative(root, 'getElementsByClassName'), - - // detect native getAttribute/hasAttribute methods, - // frameworks extend these to elements, but it seems - // this does not work for XML namespaced attributes, - // used to check both getAttribute/hasAttribute in IE - NATIVE_GET_ATTRIBUTE = isNative(root, 'getAttribute'), - NATIVE_HAS_ATTRIBUTE = isNative(root, 'hasAttribute'), - - // check if slice() can convert nodelist to array - // see http://yura.thinkweb2.com/cft/ - NATIVE_SLICE_PROTO = - (function() { - var isBuggy = false, id = root.id; - root.id = 'length'; - try { - isBuggy = !!slice.call(doc.childNodes, 0)[0]; - } catch(e) { } - root.id = id; - return isBuggy; - })(), - - // supports the new traversal API - NATIVE_TRAVERSAL_API = - 'nextElementSibling' in root && 'previousElementSibling' in root, - - // BUGGY_XXXXX true if method is feature tested and has known bugs - // detect buggy gEBID - BUGGY_GEBID = NATIVE_GEBID ? - (function() { - var isBuggy = true, x = 'x' + String(+new Date), - a = doc.createElementNS ? 'a' : ''; - (a = doc.createElement(a)).name = x; - root.insertBefore(a, root.firstChild); - isBuggy = !!doc.getElementById(x); - root.removeChild(a); - return isBuggy; - })() : - true, - - // detect IE gEBTN comment nodes bug - BUGGY_GEBTN = NATIVE_GEBTN ? - (function() { - var div = doc.createElement('div'); - div.appendChild(doc.createComment('')); - return !!div.getElementsByTagName('*')[0]; - })() : - true, - - // detect Opera gEBCN second class and/or UTF8 bugs as well as Safari 3.2 - // caching class name results and not detecting when changed, - // tests are based on the jQuery selector test suite - BUGGY_GEBCN = NATIVE_GEBCN ? - (function() { - var isBuggy, div = doc.createElement('div'), test = '\u53f0\u5317'; - - // Opera tests - div.appendChild(doc.createElement('span')). - setAttribute('class', test + 'abc ' + test); - div.appendChild(doc.createElement('span')). - setAttribute('class', 'x'); - - isBuggy = !div.getElementsByClassName(test)[0]; - - // Safari test - div.lastChild.className = test; - return isBuggy || div.getElementsByClassName(test).length != 2; - })() : - true, - - // detect IE bug with dynamic attributes - BUGGY_GET_ATTRIBUTE = NATIVE_GET_ATTRIBUTE ? - (function() { - var input = doc.createElement('input'); - input.setAttribute('value', 5); - return input.defaultValue != 5; - })() : - true, - - // detect IE bug with non-standard boolean attributes - BUGGY_HAS_ATTRIBUTE = NATIVE_HAS_ATTRIBUTE ? - (function() { - var option = doc.createElement('option'); - option.setAttribute('selected', 'selected'); - return !option.hasAttribute('selected'); - })() : - true, - - // detect Safari bug with selected option elements - BUGGY_SELECTED = - (function() { - var select = doc.createElement('select'); - select.appendChild(doc.createElement('option')); - return !select.firstChild.selected; - })(), - - // initialized with the loading context - // and reset for each different context - BUGGY_QUIRKS_GEBCN, - BUGGY_QUIRKS_QSAPI, - - QUIRKS_MODE, - XML_DOCUMENT, - - // detect Opera browser - OPERA = /opera/i.test(string.call(global.opera)), - - // skip simpe selector optimizations for Opera >= 11 - OPERA_QSAPI = OPERA && parseFloat(opera.version()) >= 11, - - // check Seletor API implementations - RE_BUGGY_QSAPI = NATIVE_QSAPI ? - (function() { - var pattern = [ ], div = doc.createElement('div'), element, - - expect = function(selector, context, element, n) { - var result = false; - context.appendChild(element); - try { result = context.querySelectorAll(selector).length == n; } catch(e) { } - while (context.firstChild) { context.removeChild(context.firstChild); } - return result; - }; - - // ^= $= *= operators bugs whith empty values (Opera 10 / IE8) - element = doc.createElement('p'); - element.setAttribute('class', ''); - expect('[class^=""]', div, element, 1) && - pattern.push('[*^$]=[\\x20\\t\\n\\r\\f]*(?:""|' + "'')"); - - // :checked bug with option elements (Firefox 3.6.x) - // it wrongly includes 'selected' options elements - // HTML5 rules says selected options also match - element = doc.createElement('option'); - element.setAttribute('selected', 'selected'); - expect(':checked', div, element, 0) && - pattern.push(':checked'); - - // :enabled :disabled bugs with hidden fields (Firefox 3.5) - // http://www.w3.org/TR/html5/links.html#selector-enabled - // http://www.w3.org/TR/css3-selectors/#enableddisabled - // not supported by IE8 Query Selector - element = doc.createElement('input'); - element.setAttribute('type', 'hidden'); - expect(':enabled', div, element, 0) && - pattern.push(':enabled', ':disabled'); - - // :link bugs with hyperlinks matching (Firefox/Safari) - element = doc.createElement('link'); - element.setAttribute('href', 'x'); - expect(':link', div, element, 1) || - pattern.push(':link'); - - // avoid attribute selectors for IE QSA - if (BUGGY_HAS_ATTRIBUTE) { - // IE fails in reading: - // - original values for input/textarea - // - original boolean values for controls - pattern.push('\\[[\\x20\\t\\n\\r\\f]*(?:checked|disabled|ismap|multiple|readonly|selected|value)'); - } - - return pattern.length ? - new RegExp(pattern.join('|')) : - { 'test': function() { return false; } }; - - })() : - true, - - // matches class selectors - RE_CLASS = new RegExp('(?:\\[[\\x20\\t\\n\\r\\f]*class\\b|\\.' + identifier + ')'), - - // matches simple id, tag & class selectors - RE_SIMPLE_SELECTOR = new RegExp( - !(BUGGY_GEBTN && BUGGY_GEBCN) ? !OPERA ? - '^(?:\\*|[.#]?-?[_a-zA-Z]{1}' + encoding + '*)$' : - '^(?:\\*|#-?[_a-zA-Z]{1}' + encoding + '*)$' : - '^#?-?[_a-zA-Z]{1}' + encoding + '*$'), - - /*----------------------------- LOOKUP OBJECTS -----------------------------*/ - - LINK_NODES = { 'a': 1, 'A': 1, 'area': 1, 'AREA': 1, 'link': 1, 'LINK': 1 }, - - // boolean attributes should return attribute name instead of true/false - ATTR_BOOLEAN = { - 'checked': 1, 'disabled': 1, 'ismap': 1, - 'multiple': 1, 'readonly': 1, 'selected': 1 - }, - - // dynamic attributes that needs to be checked against original HTML value - ATTR_DEFAULT = { - 'value': 'defaultValue', - 'checked': 'defaultChecked', - 'selected': 'defaultSelected' - }, - - // attributes referencing URI data values need special treatment in IE - ATTR_URIDATA = { - 'action': 2, 'cite': 2, 'codebase': 2, 'data': 2, 'href': 2, - 'longdesc': 2, 'lowsrc': 2, 'src': 2, 'usemap': 2 - }, - - // HTML 5 draft specifications - // http://www.whatwg.org/specs/web-apps/current-work/#selectors - HTML_TABLE = { - // class attribute must be treated case-insensitive in HTML quirks mode - // initialized by default to Standard Mode (case-sensitive), - // set dynamically by the attribute resolver - 'class': 0, - 'accept': 1, 'accept-charset': 1, 'align': 1, 'alink': 1, 'axis': 1, - 'bgcolor': 1, 'charset': 1, 'checked': 1, 'clear': 1, 'codetype': 1, 'color': 1, - 'compact': 1, 'declare': 1, 'defer': 1, 'dir': 1, 'direction': 1, 'disabled': 1, - 'enctype': 1, 'face': 1, 'frame': 1, 'hreflang': 1, 'http-equiv': 1, 'lang': 1, - 'language': 1, 'link': 1, 'media': 1, 'method': 1, 'multiple': 1, 'nohref': 1, - 'noresize': 1, 'noshade': 1, 'nowrap': 1, 'readonly': 1, 'rel': 1, 'rev': 1, - 'rules': 1, 'scope': 1, 'scrolling': 1, 'selected': 1, 'shape': 1, 'target': 1, - 'text': 1, 'type': 1, 'valign': 1, 'valuetype': 1, 'vlink': 1 - }, - - // the following attributes must be treated case-insensitive in XHTML mode - // Niels Leenheer http://rakaz.nl/item/css_selector_bugs_case_sensitivity - XHTML_TABLE = { - 'accept': 1, 'accept-charset': 1, 'alink': 1, 'axis': 1, - 'bgcolor': 1, 'charset': 1, 'codetype': 1, 'color': 1, - 'enctype': 1, 'face': 1, 'hreflang': 1, 'http-equiv': 1, - 'lang': 1, 'language': 1, 'link': 1, 'media': 1, 'rel': 1, - 'rev': 1, 'target': 1, 'text': 1, 'type': 1, 'vlink': 1 - }, - - /*-------------------------- REGULAR EXPRESSIONS ---------------------------*/ - - // placeholder to add functionalities - Selectors = { - // as a simple example this will check - // for chars not in standard ascii table - // - // 'mySpecialSelector': { - // 'Expression': /\u0080-\uffff/, - // 'Callback': mySelectorCallback - // } - // - // 'mySelectorCallback' will be invoked - // only after passing all other standard - // checks and only if none of them worked - }, - - // attribute operators - Operators = { - '=': "n=='%m'", - '^=': "n.indexOf('%m')==0", - '*=': "n.indexOf('%m')>-1", - '|=': "(n+'-').indexOf('%m-')==0", - '~=': "(' '+n+' ').indexOf(' %m ')>-1", - '$=': "n.substr(n.length-'%m'.length)=='%m'" - }, - - // optimization expressions - Optimize = { - ID: new RegExp('^\\*?#(' + encoding + '+)|' + skipgroup), - TAG: new RegExp('^(' + encoding + '+)|' + skipgroup), - CLASS: new RegExp('^\\*?\\.(' + encoding + '+$)|' + skipgroup) - }, - - // precompiled Regular Expressions - Patterns = { - // structural pseudo-classes and child selectors - spseudos: /^\:(root|empty|(?:first|last|only)(?:-child|-of-type)|nth(?:-last)?(?:-child|-of-type)\(\s*(even|odd|(?:[-+]{0,1}\d*n\s*)?[-+]{0,1}\s*\d*)\s*\))?(.*)/i, - // uistates + dynamic + negation pseudo-classes - dpseudos: /^\:(link|visited|target|active|focus|hover|checked|disabled|enabled|selected|lang\(([-\w]{2,})\)|not\(([^()]*|.*)\))?(.*)/i, - // element attribute matcher - attribute: new RegExp('^\\[' + attrmatcher + '\\](.*)'), - // E > F - children: /^[\x20\t\n\r\f]*\>[\x20\t\n\r\f]*(.*)/, - // E + F - adjacent: /^[\x20\t\n\r\f]*\+[\x20\t\n\r\f]*(.*)/, - // E ~ F - relative: /^[\x20\t\n\r\f]*\~[\x20\t\n\r\f]*(.*)/, - // E F - ancestor: /^[\x20\t\n\r\f]+(.*)/, - // all - universal: /^\*(.*)/, - // id - id: new RegExp('^#(' + encoding + '+)(.*)'), - // tag - tagName: new RegExp('^(' + encoding + '+)(.*)'), - // class - className: new RegExp('^\\.(' + encoding + '+)(.*)') - }, - - /*------------------------------ UTIL METHODS ------------------------------*/ - - // concat elements to data - concatList = - function(data, elements) { - var i = -1, element; - if (!data.length && Array.slice) - return Array.slice(elements); - while ((element = elements[++i])) - data[data.length] = element; - return data; - }, - - // concat elements to data and callback - concatCall = - function(data, elements, callback) { - var i = -1, element; - while ((element = elements[++i])) { - if (false === callback(data[data.length] = element)) { break; } - } - return data; - }, - - // change context specific variables - switchContext = - function(from, force) { - var div, oldDoc = doc; - // save passed context - lastContext = from; - // set new context document - doc = from.ownerDocument || from; - if (force || oldDoc !== doc) { - // set document root - root = doc.documentElement; - // set host environment flags - XML_DOCUMENT = doc.createElement('DiV').nodeName == 'DiV'; - - // In quirks mode css class names are case insensitive. - // In standards mode they are case sensitive. See docs: - // https://developer.mozilla.org/en/Mozilla_Quirks_Mode_Behavior - // http://www.whatwg.org/specs/web-apps/current-work/#selectors - QUIRKS_MODE = !XML_DOCUMENT && - typeof doc.compatMode == 'string' ? - doc.compatMode.indexOf('CSS') < 0 : - (function() { - var style = doc.createElement('div').style; - return style && (style.width = 1) && style.width == '1px'; - })(); - - div = doc.createElement('div'); - div.appendChild(doc.createElement('p')).setAttribute('class', 'xXx'); - div.appendChild(doc.createElement('p')).setAttribute('class', 'xxx'); - - // GEBCN buggy in quirks mode, match count is: - // Firefox 3.0+ [xxx = 1, xXx = 1] - // Opera 10.63+ [xxx = 0, xXx = 2] - BUGGY_QUIRKS_GEBCN = - !XML_DOCUMENT && NATIVE_GEBCN && QUIRKS_MODE && - (div.getElementsByClassName('xxx').length != 2 || - div.getElementsByClassName('xXx').length != 2); - - // QSAPI buggy in quirks mode, match count is: - // At least Chrome 4+, Firefox 3.5+, Opera 10.x+, Safari 4+ [xxx = 1, xXx = 2] - // Safari 3.2 QSA doesn't work with mixedcase in quirksmode [xxx = 1, xXx = 0] - // https://bugs.webkit.org/show_bug.cgi?id=19047 - // must test the attribute selector '[class~=xxx]' - // before '.xXx' or the bug may not present itself - BUGGY_QUIRKS_QSAPI = - !XML_DOCUMENT && NATIVE_QSAPI && QUIRKS_MODE && - (div.querySelectorAll('[class~=xxx]').length != 2 || - div.querySelectorAll('.xXx').length != 2); - - Config.CACHING && Dom.setCache(true, doc); - } - }, - - /*------------------------------ DOM METHODS -------------------------------*/ - - // element by id (raw) - // @return reference or null - byIdRaw = - function(id, elements) { - var i = -1, element = null; - while ((element = elements[++i])) { - if (element.getAttribute('id') == id) { - break; - } - } - return element; - }, - - // element by id - // @return reference or null - _byId = !BUGGY_GEBID ? - function(id, from) { - id = id.replace(/\\([^\\]{1})/g, '$1'); - return from.getElementById && from.getElementById(id) || - byIdRaw(id, from.getElementsByTagName('*')); - } : - function(id, from) { - var element = null; - id = id.replace(/\\([^\\]{1})/g, '$1'); - if (XML_DOCUMENT || from.nodeType != 9) { - return byIdRaw(id, from.getElementsByTagName('*')); - } - if ((element = from.getElementById(id)) && - element.name == id && from.getElementsByName) { - return byIdRaw(id, from.getElementsByName(id)); - } - return element; - }, - - // publicly exposed byId - // @return reference or null - byId = - function(id, from) { - from || (from = doc); - if (lastContext !== from) { switchContext(from); } - return _byId(id, from); - }, - - // elements by tag (raw) - // @return array - byTagRaw = - function(tag, from) { - var any = tag == '*', element = from, elements = [ ], next = element.firstChild; - any || (tag = tag.toUpperCase()); - while ((element = next)) { - if (element.tagName > '@' && (any || element.tagName.toUpperCase() == tag)) { - elements[elements.length] = element; - } - if ((next = element.firstChild || element.nextSibling)) continue; - while (!next && (element = element.parentNode) && element !== from) { - next = element.nextSibling; - } - } - return elements; - }, - - // elements by tag - // @return array - _byTag = !BUGGY_GEBTN && NATIVE_SLICE_PROTO ? - function(tag, from) { - return XML_DOCUMENT || from.nodeType == 11 ? byTagRaw(tag, from) : - slice.call(from.getElementsByTagName(tag), 0); - } : - function(tag, from) { - var i = -1, j = i, data = [ ], - element, elements = from.getElementsByTagName(tag); - if (tag == '*') { - while ((element = elements[++i])) { - if (element.nodeName > '@') - data[++j] = element; - } - } else { - while ((element = elements[++i])) { - data[i] = element; - } - } - return data; - }, - - // publicly exposed byTag - // @return array - byTag = - function(tag, from) { - from || (from = doc); - if (lastContext !== from) { switchContext(from); } - return _byTag(tag, from); - }, - - // publicly exposed byName - // @return array - byName = - function(name, from) { - return select('[name="' + name.replace(/\\([^\\]{1})/g, '$1') + '"]', from); - }, - - // elements by class (raw) - // @return array - byClassRaw = - function(name, from) { - var i = -1, j = i, data = [ ], element, elements = _byTag('*', from), n; - name = ' ' + (QUIRKS_MODE ? name.toLowerCase() : name).replace(/\\([^\\]{1})/g, '$1') + ' '; - while ((element = elements[++i])) { - n = XML_DOCUMENT ? element.getAttribute('class') : element.className; - if (n && n.length && (' ' + (QUIRKS_MODE ? n.toLowerCase() : n). - replace(reWhiteSpace, ' ') + ' ').indexOf(name) > -1) { - data[++j] = element; - } - } - return data; - }, - - // elements by class - // @return array - _byClass = - function(name, from) { - return (BUGGY_GEBCN || BUGGY_QUIRKS_GEBCN || XML_DOCUMENT || !from.getElementsByClassName) ? - byClassRaw(name, from) : slice.call(from.getElementsByClassName(name.replace(/\\([^\\]{1})/g, '$1')), 0); - }, - - // publicly exposed byClass - // @return array - byClass = - function(name, from) { - from || (from = doc); - if (lastContext !== from) { switchContext(from); } - return _byClass(name, from); - }, - - // check element is descendant of container - // @return boolean - contains = 'compareDocumentPosition' in root ? - function(container, element) { - return (container.compareDocumentPosition(element) & 16) == 16; - } : 'contains' in root ? - function(container, element) { - return container !== element && container.contains(element); - } : - function(container, element) { - while ((element = element.parentNode)) { - if (element === container) return true; - } - return false; - }, - - // attribute value - // @return string - getAttribute = !BUGGY_GET_ATTRIBUTE ? - function(node, attribute) { - return node.getAttribute(attribute) || ''; - } : - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (typeof node[attribute] == 'object') { - return node.attributes[attribute] && - node.attributes[attribute].value || ''; - } - return ( - // 'type' can only be read by using native getAttribute - attribute == 'type' ? node.getAttribute(attribute) || '' : - // specific URI data attributes (parameter 2 to fix IE bug) - ATTR_URIDATA[attribute] ? node.getAttribute(attribute, 2) || '' : - // boolean attributes should return name instead of true/false - ATTR_BOOLEAN[attribute] ? node.getAttribute(attribute) ? attribute : 'false' : - ((node = node.getAttributeNode(attribute)) && node.value) || ''); - }, - - // attribute presence - // @return boolean - hasAttribute = !BUGGY_HAS_ATTRIBUTE ? - function(node, attribute) { - return XML_DOCUMENT ? - !!node.getAttribute(attribute) : - node.hasAttribute(attribute); - } : - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (ATTR_DEFAULT[attribute]) { - return !!node[ATTR_DEFAULT[attribute]]; - } - // read the attribute node - node = node.getAttributeNode(attribute); - return !!(node && node.specified); - }, - - // check node emptyness - // @return boolean - isEmpty = - function(node) { - node = node.firstChild; - while (node) { - if (node.nodeType == 3 || node.nodeName > '@') return false; - node = node.nextSibling; - } - return true; - }, - - // check if element matches the :link pseudo - // @return boolean - isLink = - function(element) { - return hasAttribute(element,'href') && LINK_NODES[element.nodeName]; - }, - - // child position by nodeType - // @return number - nthElement = - function(element, last) { - var count = 1, succ = last ? 'nextSibling' : 'previousSibling'; - while ((element = element[succ])) { - if (element.nodeName > '@') ++count; - } - return count; - }, - - // child position by nodeName - // @return number - nthOfType = - function(element, last) { - var count = 1, succ = last ? 'nextSibling' : 'previousSibling', type = element.nodeName; - while ((element = element[succ])) { - if (element.nodeName == type) ++count; - } - return count; - }, - - /*------------------------------- DEBUGGING --------------------------------*/ - - // get/set (string/object) working modes - configure = - function(option) { - if (typeof option == 'string') { return Config[option]; } - if (typeof option != 'object') { return false; } - for (var i in option) { - Config[i] = !!option[i]; - if (i == 'SIMPLENOT') { - matchContexts = { }; - matchResolvers = { }; - selectContexts = { }; - selectResolvers = { }; - Config['USE_QSAPI'] = false; - } else if (i == 'USE_QSAPI') { - Config[i] = !!option[i] && NATIVE_QSAPI; - } - } - reValidator = new RegExp(Config.SIMPLENOT ? - standardValidator : extendedValidator, 'g'); - return true; - }, - - // control user notifications - emit = - function(message) { - if (Config.VERBOSITY) { throw new Error(message); } - if (global.console && global.console.log) { - global.console.log(message); - } - }, - - Config = { - - // used to enable/disable caching of result sets - CACHING: false, - - // by default do not add missing left/right context - // to selector string shortcuts like "+div" or "ul>" - // callable Dom.shortcuts method has to be available - SHORTCUTS: false, - - // by default disable complex selectors nested in - // ':not()' pseudo-classes, as for specifications - SIMPLENOT: true, - - // strict QSA match all non-unique IDs (false) - // speed & libs compat match unique ID (true) - UNIQUE_ID: true, - - // HTML5 handling for the ":checked" pseudo-class - USE_HTML5: true, - - // controls enabling the Query Selector API branch - USE_QSAPI: NATIVE_QSAPI, - - // controls the engine error/warning notifications - VERBOSITY: true - - }, - - /*---------------------------- COMPILER METHODS ----------------------------*/ - - // code string reused to build compiled functions - ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break main;else continue main;', - - // compile a comma separated group of selector - // @mode boolean true for select, false for match - // return a compiled function - compile = - function(selector, source, mode) { - - var parts = typeof selector == 'string' ? selector.match(reSplitGroup) : selector; - - // ensures that source is a string - typeof source == 'string' || (source = ''); - - if (parts.length == 1) { - source += compileSelector(parts[0], mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } else { - // for each selector in the group - var i = -1, seen = { }, token; - while ((token = parts[++i])) { - token = token.replace(reTrimSpaces, ''); - // avoid repeating the same token - // in comma separated group (p, p) - if (!seen[token] && (seen[token] = true)) { - source += compileSelector(token, mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } - } - } - - if (mode) { - // for select method - return new Function('c,s,r,d,h,g,f,v', - 'var N,n,x=0,k=-1,e;main:while((e=c[++k])){' + source + '}return r;'); - } else { - // for match method - return new Function('e,s,r,d,h,g,f,v', - 'var N,n,x=0,k=e;' + source + 'return false;'); - } - }, - - // allows to cache already visited nodes - FILTER = - 'var z=v[@]||(v[@]=[]),l=z.length-1;' + - 'while(l>=0&&z[l]!==e)--l;' + - 'if(l!==-1){break;}' + - 'z[z.length]=e;', - - // compile a CSS3 string selector into ad-hoc javascript matching function - // @return string (to be compiled) - compileSelector = - function(selector, source, mode) { - - var a, b, n, k = 0, expr, match, result, status, test, type; - - while (selector) { - - k++; - - // *** Universal selector - // * match all (empty block, do not remove) - if ((match = selector.match(Patterns.universal))) { - // do nothing, handled in the compiler where - // BUGGY_GEBTN return comment nodes (ex: IE) - expr = ''; - } - - // *** ID selector - // #Foo Id case sensitive - else if ((match = selector.match(Patterns.id))) { - // document can contain conflicting elements (id/name) - // prototype selector unit need this method to recover bad HTML forms - source = 'if(' + (XML_DOCUMENT ? - 's.getAttribute(e,"id")' : - '(e.submit?s.getAttribute(e,"id"):e.id)') + - '=="' + match[1] + '"' + - '){' + source + '}'; - } - - // *** Type selector - // Foo Tag (case insensitive) - else if ((match = selector.match(Patterns.tagName))) { - // both tagName and nodeName properties may be upper/lower case - // depending on their creation NAMESPACE in createElementNS() - source = 'if(e.nodeName' + (XML_DOCUMENT ? - '=="' + match[1] + '"' : '.toUpperCase()' + - '=="' + match[1].toUpperCase() + '"') + - '){' + source + '}'; - } - - // *** Class selector - // .Foo Class (case sensitive) - else if ((match = selector.match(Patterns.className))) { - // W3C CSS3 specs: element whose "class" attribute has been assigned a - // list of whitespace-separated values, see section 6.4 Class selectors - // and notes at the bottom; explicitly non-normative in this specification. - source = 'if((n=' + (XML_DOCUMENT ? - 's.getAttribute(e,"class")' : 'e.className') + - ')&&n.length&&(" "+' + (QUIRKS_MODE ? 'n.toLowerCase()' : 'n') + - '.replace(' + reWhiteSpace + '," ")+" ").indexOf(" ' + - (QUIRKS_MODE ? match[1].toLowerCase() : match[1]) + ' ")>-1' + - '){' + source + '}'; - } - - // *** Attribute selector - // [attr] [attr=value] [attr="value"] [attr='value'] and !=, *=, ~=, |=, ^=, $= - // case sensitivity is treated differently depending on the document type (see map) - else if ((match = selector.match(Patterns.attribute))) { - - // xml namespaced attribute ? - expr = match[1].split(':'); - expr = expr.length == 2 ? expr[1] : expr[0] + ''; - - if (match[2] && !Operators[match[2]]) { - emit('Unsupported operator in attribute selectors "' + selector + '"'); - return ''; - } - - test = false; - type = 'false'; - - // replace Operators parameter if needed - if (match[2] && match[4] && (type = Operators[match[2]])) { - // case treatment depends on document - HTML_TABLE['class'] = QUIRKS_MODE ? 1 : 0; - // replace escaped values and HTML entities - match[4] = match[4].replace(/(\x22|\x27)/g, '\\$1'); - match[4] = match[4].replace(/\\([0-9a-f]{2,2})/g, '\\x$1'); - test = (XML_DOCUMENT ? XHTML_TABLE : HTML_TABLE)[expr.toLowerCase()]; - type = type.replace(/\%m/g, test ? match[4].toLowerCase() : match[4]); - } else if (match[2] == '!=' || match[2] == '=') { - match[4] = match[4].replace(/(\x22|\x27)/g, '\\$1'); - type = 'n' + match[2] + '="' + match[4] + '"'; - } - - // build expression for has/getAttribute - expr = 'n=s.' + (match[2] ? 'get' : 'has') + - 'Attribute(e,"' + match[1] + '")' + - (test ? '.toLowerCase();' : ';'); - - source = expr + 'if(' + (match[2] ? type : 'n') + '){' + source + '}'; - } - - // *** Adjacent sibling combinator - // E + F (F adiacent sibling of E) - else if ((match = selector.match(Patterns.adjacent))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = NATIVE_TRAVERSAL_API ? - 'var N' + k + '=e;while(e&&(e=e.previousElementSibling)){' + source + 'break;}e=N' + k + ';' : - 'var N' + k + '=e;while(e&&(e=e.previousSibling)){if(e.nodeName>"@"){' + source + 'break;}}e=N' + k + ';'; - } - - // *** General sibling combinator - // E ~ F (F relative sibling of E) - else if ((match = selector.match(Patterns.relative))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = NATIVE_TRAVERSAL_API ? - ('var N' + k + '=e;e=e.parentNode.firstElementChild;' + - 'while(e&&e!==N' + k + '){' + source + 'e=e.nextElementSibling;}e=N' + k + ';') : - ('var N' + k + '=e;e=e.parentNode.firstChild;' + - 'while(e&&e!==N' + k + '){if(e.nodeName>"@"){' + source + '}e=e.nextSibling;}e=N' + k + ';'); - } - - // *** Child combinator - // E > F (F children of E) - else if ((match = selector.match(Patterns.children))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + 'break;}e=N' + k + ';'; - } - - // *** Descendant combinator - // E F (E ancestor of F) - else if ((match = selector.match(Patterns.ancestor))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + '}e=N' + k + ';'; - } - - // *** Structural pseudo-classes - // :root, :empty, - // :first-child, :last-child, :only-child, - // :first-of-type, :last-of-type, :only-of-type, - // :nth-child(), :nth-last-child(), :nth-of-type(), :nth-last-of-type() - else if ((match = selector.match(Patterns.spseudos)) && match[1]) { - - switch (match[1]) { - case 'root': - // element root of the document - if (match[3]) { - source = 'if(e===h||s.contains(h,e)){' + source + '}'; - } else { - source = 'if(e===h){' + source + '}'; - } - break; - - case 'empty': - // element that has no children - source = 'if(s.isEmpty(e)){' + source + '}'; - break; - - default: - if (match[1] && match[2]) { - if (match[2] == 'n') { - source = 'if(e!==h){' + source + '}'; - break; - } else if (match[2] == 'even') { - a = 2; - b = 0; - } else if (match[2] == 'odd') { - a = 2; - b = 1; - } else { - // assumes correct "an+b" format, "b" before "a" to keep "n" values - b = ((n = match[2].match(/(-?\d+)$/)) ? parseInt(n[1], 10) : 0); - a = ((n = match[2].match(/(-?\d*)n/i)) ? parseInt(n[1], 10) : 0); - if (n && n[1] == '-') a = -1; - } - - // build test expression out of structural pseudo (an+b) parameters - // see here: http://www.w3.org/TR/css3-selectors/#nth-child-pseudo - test = a > 1 ? - (/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' : - 'n>=' + b + '&&(n-(' + b + '))%' + a + '==0' : a < -1 ? - (/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' : - 'n<=' + b + '&&(n-(' + b + '))%' + a + '==0' : a=== 0 ? - 'n==' + b : - (/last/i.test(match[1])) ? - a == -1 ? 'n>=' + b : 'n<=' + b : - a == -1 ? 'n<=' + b : 'n>=' + b; - - // 4 cases: 1 (nth) x 4 (child, of-type, last-child, last-of-type) - source = - 'if(e!==h){' + - 'n=s[' + (/-of-type/i.test(match[1]) ? '"nthOfType"' : '"nthElement"') + ']' + - '(e,' + (/last/i.test(match[1]) ? 'true' : 'false') + ');' + - 'if(' + test + '){' + source + '}' + - '}'; - - } else { - // 6 cases: 3 (first, last, only) x 1 (child) x 2 (-of-type) - a = /first/i.test(match[1]) ? 'previous' : 'next'; - n = /only/i.test(match[1]) ? 'previous' : 'next'; - b = /first|last/i.test(match[1]); - - type = /-of-type/i.test(match[1]) ? '&&n.nodeName!=e.nodeName' : '&&n.nodeName<"@"'; - - source = 'if(e!==h){' + - ( 'n=e;while((n=n.' + a + 'Sibling)' + type + ');if(!n){' + (b ? source : - 'n=e;while((n=n.' + n + 'Sibling)' + type + ');if(!n){' + source + '}') + '}' ) + '}'; - } - break; - } - - } - - // *** negation, user action and target pseudo-classes - // *** UI element states and dynamic pseudo-classes - // CSS3 :not, :checked, :enabled, :disabled, :target - // CSS3 :active, :hover, :focus - // CSS3 :link, :visited - else if ((match = selector.match(Patterns.dpseudos)) && match[1]) { - - switch (match[1].match(/^\w+/)[0]) { - // CSS3 negation pseudo-class - case 'not': - // compile nested selectors, DO NOT pass the callback parameter - // SIMPLENOT allow disabling complex selectors nested - // in ':not()' pseudo-classes, breaks some test units - expr = match[3].replace(reTrimSpaces, ''); - - if (Config.SIMPLENOT && !reSimpleNot.test(expr)) { - // see above, log error but continue execution - emit('Negation pseudo-class only accepts simple selectors "' + selector + '"'); - return ''; - } else { - if ('compatMode' in doc) { - source = 'if(!' + compile(expr, '', false) + '(e,s,r,d,h,g)){' + source + '}'; - } else { - source = 'if(!s.match(e, "' + expr.replace(/\x22/g, '\\"') + '",g)){' + source +'}'; - } - } - break; - - // CSS3 UI element states - case 'checked': - // for radio buttons checkboxes (HTML4) and options (HTML5) - source = 'if((typeof e.form!=="undefined"&&(/^(?:radio|checkbox)$/i).test(e.type)&&e.checked)' + - (Config.USE_HTML5 ? '||(/^option$/i.test(e.nodeName)&&(e.selected||e.checked))' : '') + - '){' + source + '}'; - break; - case 'disabled': - // does not consider hidden input fields - source = 'if(((typeof e.form!=="undefined"' + - (Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') + - ')||s.isLink(e))&&e.disabled===true){' + source + '}'; - break; - case 'enabled': - // does not consider hidden input fields - source = 'if(((typeof e.form!=="undefined"' + - (Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') + - ')||s.isLink(e))&&e.disabled===false){' + source + '}'; - break; - - // CSS3 lang pseudo-class - case 'lang': - test = ''; - if (match[2]) test = match[2].substr(0, 2) + '-'; - source = 'do{(n=e.lang||"").toLowerCase();' + - 'if((n==""&&h.lang=="' + match[2].toLowerCase() + '")||' + - '(n&&(n=="' + match[2].toLowerCase() + - '"||n.substr(0,3)=="' + test.toLowerCase() + '")))' + - '{' + source + 'break;}}while((e=e.parentNode)&&e!==g);'; - break; - - // CSS3 target pseudo-class - case 'target': - n = doc.location ? doc.location.hash : ''; - if (n) { - source = 'if(e.id=="' + n.slice(1) + '"){' + source + '}'; - } - break; - - // CSS3 dynamic pseudo-classes - case 'link': - source = 'if(s.isLink(e)&&!e.visited){' + source + '}'; - break; - case 'visited': - source = 'if(s.isLink(e)&&e.visited){' + source + '}'; - break; - - // CSS3 user action pseudo-classes IE & FF3 have native support - // these capabilities may be emulated by some event managers - case 'active': - if (XML_DOCUMENT) break; - source = 'if(e===d.activeElement){' + source + '}'; - break; - case 'hover': - if (XML_DOCUMENT) break; - source = 'if(e===d.hoverElement){' + source + '}'; - break; - case 'focus': - if (XML_DOCUMENT) break; - source = NATIVE_FOCUS ? - 'if(e===d.activeElement&&d.hasFocus()&&(e.type||e.href||!isNaN(e.tabIndex))){' + source + '}' : - 'if(e===d.activeElement&&(e.type||e.href)){' + source + '}'; - break; - - // CSS2 selected pseudo-classes, not part of current CSS3 drafts - // the 'selected' property is only available for option elements - case 'selected': - // fix Safari selectedIndex property bug - expr = BUGGY_SELECTED ? '||(n=e.parentNode)&&n.options[n.selectedIndex]===e' : ''; - source = 'if(/^option$/i.test(e.nodeName)&&(e.selected||e.checked' + expr + ')){' + source + '}'; - break; - - default: - break; - } - - } - - else { - - // this is where external extensions are - // invoked if expressions match selectors - expr = false; - status = false; - for (expr in Selectors) { - if ((match = selector.match(Selectors[expr].Expression)) && match[1]) { - result = Selectors[expr].Callback(match, source); - source = result.source; - status = result.status; - if (status) { break; } - } - } - - // if an extension fails to parse the selector - // it must return a false boolean in "status" - if (!status) { - // log error but continue execution, don't throw real exceptions - // because blocking following processes maybe is not a good idea - emit('Unknown pseudo-class selector "' + selector + '"'); - return ''; - } - - if (!expr) { - // see above, log error but continue execution - emit('Unknown token in selector "' + selector + '"'); - return ''; - } - - } - - // error if no matches found by the pattern scan - if (!match) { - emit('Invalid syntax in selector "' + selector + '"'); - return ''; - } - - // ensure "match" is not null or empty since - // we do not throw real DOMExceptions above - selector = match && match[match.length - 1]; - } - - return source; - }, - - /*----------------------------- QUERY METHODS ------------------------------*/ - - // match element with selector - // @return boolean - match = - function(element, selector, from, callback) { - - var parts; - - if (!(element && element.nodeName > '@')) { - emit('Invalid element argument'); - return false; - } else if (!selector || typeof selector != 'string') { - emit('Invalid selector argument'); - return false; - } else if (from && from.nodeType == 1 && !contains(from, element)) { - return false; - } else if (lastContext !== from) { - // reset context data when it changes - // and ensure context is set to a default - switchContext(from || (from = element.ownerDocument)); - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, element, from)); - - if (lastMatcher != selector) { - // process valid selector strings - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleMatch = (parts = selector.match(reSplitGroup)).length < 2; - // save passed selector - lastMatcher = selector; - lastPartsMatch = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return false; - } - } else parts = lastPartsMatch; - - // compile matcher resolver if necessary - if (!matchResolvers[selector] || matchContexts[selector] !== from) { - matchResolvers[selector] = compile(isSingleMatch ? [selector] : parts, '', false); - matchContexts[selector] = from; - } - - return matchResolvers[selector](element, Snapshot, [ ], doc, root, from, callback, { }); - }, - - // select only the first element - // matching selector (document ordered) - first = - function(selector, from) { - return select(selector, from, function() { return false; })[0] || null; - }, - - // select elements matching selector - // using new Query Selector API - // or cross-browser client API - // @return array - select = - function(selector, from, callback) { - - var i, changed, element, elements, parts, token, original = selector; - - if (arguments.length === 0) { - emit('Not enough arguments'); - return [ ]; - } else if (typeof selector != 'string') { - return [ ]; - } else if (!(/[>+~*\w\u00a1-\uffff]/.test(selector))) { - emit('Invalid or illegal selector string'); - return [ ]; - } else if (from && !(/1|9|11/).test(from.nodeType)) { - emit('Invalid or illegal context element'); - return [ ]; - } else if (lastContext !== from) { - // reset context data when it changes - // and ensure context is set to a default - switchContext(from || (from = doc)); - } - - if (Config.CACHING && (elements = Dom.loadResults(original, from, doc, root))) { - return callback ? concatCall([ ], elements, callback) : elements; - } - - if (!OPERA_QSAPI && RE_SIMPLE_SELECTOR.test(selector)) { - switch (selector.charAt(0)) { - case '#': - if (Config.UNIQUE_ID && (element = _byId(selector.slice(1), from))) { - elements = [ element ]; - } else elements = [ ]; - break; - case '.': - elements = _byClass(selector.slice(1), from); - break; - default: - elements = _byTag(selector, from); - break; - } - } - - else if (!XML_DOCUMENT && Config.USE_QSAPI && - !(BUGGY_QUIRKS_QSAPI && RE_CLASS.test(selector)) && - !RE_BUGGY_QSAPI.test(selector)) { - try { - elements = from.querySelectorAll(selector); - } catch(e) { } - } - - if (elements) { - elements = callback ? concatCall([ ], elements, callback) : - NATIVE_SLICE_PROTO ? slice.call(elements) : concatList([ ], elements); - Config.CACHING && Dom.saveResults(original, from, doc, elements); - return elements; - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, from)); - - if ((changed = lastSelector != selector)) { - // process valid selector strings - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleSelect = (parts = selector.match(reSplitGroup)).length < 2; - // save passed selector - lastSelector = selector; - lastPartsSelect = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return [ ]; - } - } else parts = lastPartsSelect; - - // commas separators are treated sequentially to maintain order - if (from.nodeType == 11) { - - elements = from.childNodes; - - } else if (!XML_DOCUMENT && isSingleSelect) { - - if (changed) { - // get right most selector token - parts = selector.match(reSplitToken); - token = parts[parts.length - 1]; - - // only last slice before :not rules - lastSlice = token.split(':not')[0]; - - // position where token was found - lastPosition = selector.length - token.length; - } - - // ID optimization RTL, to reduce number of elements to visit - if (Config.UNIQUE_ID && (parts = lastSlice.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, from))) { - if (match(element, selector)) { - callback && callback(element); - elements = [ element ]; - } else elements = [ ]; - } - } - - // ID optimization LTR, to reduce selection context searches - else if (Config.UNIQUE_ID && (parts = selector.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, doc))) { - if ('#' + token == selector) { - callback && callback(element); - elements = [ element ]; - } else if (/[>+~]/.test(selector)) { - from = element.parentNode; - } else { - from = element; - } - } else elements = [ ]; - } - - if (elements) { - Config.CACHING && Dom.saveResults(original, from, doc, elements); - return elements; - } - - if (!NATIVE_GEBCN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) { - if ((elements = _byTag(token, from)).length === 0) { return [ ]; } - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*'); - } - - else if ((parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) { - if ((elements = _byClass(token, from)).length === 0) { return [ ]; } - if (reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1))) { - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, ''); - } else { - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, '*'); - } - } - - else if ((parts = selector.match(Optimize.CLASS)) && (token = parts[1])) { - if ((elements = _byClass(token, from)).length === 0) { return [ ]; } - for (i = 0, els = [ ]; elements.length > i; ++i) { - els = concatList(els, elements[i].getElementsByTagName('*')); - } - elements = els; - if (reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1))) { - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, ''); - } else { - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, '*'); - } - } - - else if (NATIVE_GEBCN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) { - if ((elements = _byTag(token, from)).length === 0) { return [ ]; } - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*'); - } - - } - - if (!elements) { - elements = /^(?:applet|object)$/i.test(from.nodeName) ? from.childNodes : _byTag('*', from); - } - // end of prefiltering pass - - // compile selector resolver if necessary - if (!selectResolvers[selector] || selectContexts[selector] !== from) { - selectResolvers[selector] = compile(isSingleSelect ? [selector] : parts, '', true); - selectContexts[selector] = from; - } - - elements = selectResolvers[selector](elements, Snapshot, [ ], doc, root, from, callback, { }); - - Config.CACHING && Dom.saveResults(original, from, doc, elements); - - return elements; - }, - - /*-------------------------------- STORAGE ---------------------------------*/ - - // empty function handler - FN = function(x) { return x; }, - - // compiled match functions returning booleans - matchContexts = { }, - matchResolvers = { }, - - // compiled select functions returning collections - selectContexts = { }, - selectResolvers = { }, - - // used to pass methods to compiled functions - Snapshot = { - - // element indexing methods - nthElement: nthElement, - nthOfType: nthOfType, - - // element inspection methods - getAttribute: getAttribute, - hasAttribute: hasAttribute, - - // element selection methods - byClass: _byClass, - byName: byName, - byTag: _byTag, - byId: _byId, - - // helper/check methods - contains: contains, - isEmpty: isEmpty, - isLink: isLink, - - // selection/matching - select: select, - match: match - }, - - Tokens = { - prefixes: prefixes, - encoding: encoding, - operators: operators, - whitespace: whitespace, - identifier: identifier, - attributes: attributes, - combinators: combinators, - pseudoclass: pseudoclass, - pseudoparms: pseudoparms, - quotedvalue: quotedvalue - }; - - /*------------------------------- PUBLIC API -------------------------------*/ - - // code referenced by extensions - Dom.ACCEPT_NODE = ACCEPT_NODE; - - // log resolvers errors/warnings - Dom.emit = emit; - - // retrieve element by id attr - Dom.byId = byId; - - // retrieve elements by tag name - Dom.byTag = byTag; - - // retrieve elements by name attr - Dom.byName = byName; - - // retrieve elements by class name - Dom.byClass = byClass; - - // read the value of the attribute - // as was in the original HTML code - Dom.getAttribute = getAttribute; - - // check for the attribute presence - // as was in the original HTML code - Dom.hasAttribute = hasAttribute; - - // element match selector, return boolean true/false - Dom.match = match; - - // first element match only, return element or null - Dom.first = first; - - // elements matching selector, starting from element - Dom.select = select; - - // compile selector into ad-hoc javascript resolver - Dom.compile = compile; - - // check that two elements are ancestor/descendant - Dom.contains = contains; - - // handle selector engine configuration settings - Dom.configure = configure; - - // initialize caching for each document - Dom.setCache = FN; - - // load previously collected result set - Dom.loadResults = FN; - - // save previously collected result set - Dom.saveResults = FN; - - // handle missing context in selector strings - Dom.shortcuts = FN; - - // options enabing specific engine functionality - Dom.Config = Config; - - // pass methods references to compiled resolvers - Dom.Snapshot = Snapshot; - - // operators descriptor - // for attribute operators extensions - Dom.Operators = Operators; - - // selectors descriptor - // for pseudo-class selectors extensions - Dom.Selectors = Selectors; - - // export string patterns - Dom.Tokens = Tokens; - - // add or overwrite user defined operators - Dom.registerOperator = - function(symbol, resolver) { - Operators[symbol] || (Operators[symbol] = resolver); - }; - - // add selector patterns for user defined callbacks - Dom.registerSelector = - function(name, rexp, func) { - Selectors[name] || (Selectors[name] = { - Expression: rexp, - Callback: func - }); - }; - - /*---------------------------------- INIT ----------------------------------*/ - - // init context specific variables - switchContext(doc, true); - -}); diff --git a/node_modules/jsdom/node_modules/nwmatcher/src/OLD/nwmatcher-GITHUB.js b/node_modules/jsdom/node_modules/nwmatcher/src/OLD/nwmatcher-GITHUB.js deleted file mode 100644 index 05d2033..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/src/OLD/nwmatcher-GITHUB.js +++ /dev/null @@ -1,1648 +0,0 @@ -/* - * Copyright (C) 2007-2012 Diego Perini - * All rights reserved. - * - * nwmatcher.js - A fast CSS selector engine and matcher - * - * Author: Diego Perini - * Version: 1.3.0beta - * Created: 20070722 - * Release: 20121122 - * - * License: - * http://javascript.nwbox.com/NWMatcher/MIT-LICENSE - * Download: - * http://javascript.nwbox.com/NWMatcher/nwmatcher.js - */ - -(function(global, factory) { - - if (typeof module === 'object' && typeof exports === 'object') { - // in a Node.js environment, the nwmatcher functions will operate on - // the passed "browserGlobal" and will be returned in an object - module.exports = function (browserGlobal) { - var exports = { }; - factory(browserGlobal, exports); - return exports; - }; - } else { - // in a browser environment, the nwmatcher functions will operate on - // the "global" loading them and be attached to "global.NW.Dom" - if (!global.NW) { - global.NW = { }; - } - if (!global.NW.Dom) { - global.NW.Dom = { }; - } - factory(global, global.NW.Dom); - } - -})(this, function(global, exports) { - - var version = 'nwmatcher-1.3.0beta', - - Dom = exports, - - // processing context & root element - doc = global.document, - root = doc.documentElement, - - // save utility methods references - slice = [ ].slice, - string = { }.toString, - - // persist previous parsed data - isSingleMatch, - isSingleSelect, - - lastSlice, - lastContext, - lastPosition, - - lastMatcher, - lastSelector, - - lastPartsMatch, - lastPartsSelect, - - // accepted prefix identifiers - // (id, class & pseudo-class) - prefixes = '[#.:]?', - - // accepted attribute operators - operators = '([~*^$|!]?={1})', - - // accepted whitespace characters - whitespace = '[\\x20\\t\\n\\r\\f]*', - - // 4 combinators F E, F>E, F+E, F~E - combinators = '[\\x20]|[>+~][^>+~]', - - // an+b format params for pseudo-classes - pseudoparms = '(?:[-+]?\\d*n)?[-+]?\\d*', - - // CSS quoted string values - quotedvalue = '"[^"]*"' + "|'[^']*'", - - // skip group of round brackets - skipround = '\\([^()]+\\)|\\(.*\\)', - // skip group of curly brackets - skipcurly = '\\{[^{}]+\\}|\\{.*\\}', - // skip group of square brackets - skipsquare = '\\[[^[\\]]*\\]|\\[.*\\]', - - // skip [ ], ( ), { } groups in token tails - skipgroup = '\\[.*\\]|\\(.*\\)|\\{.*\\}', - - // http://www.w3.org/TR/css3-syntax/#characters - // unicode/ISO 10646 characters 161 and higher - // NOTE: Safari 2.0.x crashes with escaped (\\) - // Unicode ranges in regular expressions so we - // use a negated character range class instead - encoding = '(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)', - - // CSS identifier syntax - identifier = '(?:-?[_a-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+', - - // build attribute string - attrcheck = '(' + quotedvalue + '|' + identifier + ')', - attributes = whitespace + '(' + encoding + '+:?' + encoding + '+)' + - whitespace + '(?:' + operators + whitespace + attrcheck + ')?' + whitespace, - attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'), - - // build pseudoclass string - pseudoclass = '((?:' + - // an+b parameters or quoted string - pseudoparms + '|' + quotedvalue + '|' + - // id, class, pseudo-class selector - prefixes + '|' + encoding + '+|' + - // nested HTML attribute selector - '\\[' + attributes + '\\]|' + - // nested pseudo-class selector - '\\(.+\\)|' + whitespace + '|' + - // nested pseudos/separators - ',)+)', - - // placeholder for extensions - extensions = '.+', - - // CSS3: syntax scanner and - // one pass validation only - // using regular expression - standardValidator = - // discard start - '(?=[\\x20\\t\\n\\r\\f]*[^>+~(){}<>])' + - // open match group - '(' + - //universal selector - '\\*' + - // id/class/tag/pseudo-class identifier - '|(?:' + prefixes + identifier + ')' + - // combinator selector - '|' + combinators + - // HTML attribute selector - '|\\[' + attributes + '\\]' + - // pseudo-classes parameters - '|\\(' + pseudoclass + '\\)' + - // dom properties selector (extension) - '|\\{' + extensions + '\\}' + - // selector group separator (comma) - '|,' + - // close match group - ')+', - - // validator for complex selectors in ':not()' pseudo-classes - extendedValidator = standardValidator.replace(pseudoclass, '.*'), - - // validator for standard selectors as default - reValidator = new RegExp(standardValidator, 'g'), - - // whitespace is any combination of these 5 character [\x20\t\n\r\f] - // http://www.w3.org/TR/css3-selectors/#selector-syntax - reTrimSpaces = new RegExp('^' + - whitespace + '|' + whitespace + '$', 'g'), - - // only allow simple selectors nested in ':not()' pseudo-classes - reSimpleNot = new RegExp('^(' + - '(?!:not)' + - '(' + prefixes + - '|' + identifier + - '|\\([^()]*\\))+' + - '|\\[' + attributes + '\\]' + - ')$'), - - // split comma groups, exclude commas from - // quotes '' "" and from brackets () [] {} - reSplitGroup = new RegExp('(' + - '[^,\\\\\\[\\]]+' + - '|' + skipsquare + - '|' + skipround + - '|' + skipcurly + - '|\\\\.' + - ')+', 'g'), - - // split last, right most, selector group token - reSplitToken = new RegExp('(' + - '\\[' + attributes + '\\]|' + - '\\(' + pseudoclass + '\\)|' + - '[^\\x20>+~]|\\\\.)+', 'g'), - - // for in excess whitespace removal - reWhiteSpace = /[\x20\t\n\r\f]+/g, - - reOptimizeSelector = new RegExp(identifier + '|^$'), - - /*----------------------------- FEATURE TESTING ----------------------------*/ - - // detect native methods - isNative = (function() { - var s = (doc.appendChild + '').replace(/appendChild/g, ''); - return function(object, method) { - var m = object && object[method] || false; - return m && typeof m != 'string' && - s == (m + '').replace(new RegExp(method, 'g'), ''); - }; - })(), - - // NATIVE_XXXXX true if method exist and is callable - // detect if DOM methods are native in browsers - NATIVE_FOCUS = isNative(doc, 'hasFocus'), - NATIVE_QSAPI = isNative(doc, 'querySelector'), - NATIVE_GEBID = isNative(doc, 'getElementById'), - NATIVE_GEBTN = isNative(root, 'getElementsByTagName'), - NATIVE_GEBCN = isNative(root, 'getElementsByClassName'), - - // detect native getAttribute/hasAttribute methods, - // frameworks extend these to elements, but it seems - // this does not work for XML namespaced attributes, - // used to check both getAttribute/hasAttribute in IE - NATIVE_GET_ATTRIBUTE = isNative(root, 'getAttribute'), - NATIVE_HAS_ATTRIBUTE = isNative(root, 'hasAttribute'), - - // check if slice() can convert nodelist to array - // see http://yura.thinkweb2.com/cft/ - NATIVE_SLICE_PROTO = - (function() { - var isBuggy = false, id = root.id; - root.id = 'length'; - try { - isBuggy = !!slice.call(doc.childNodes, 0)[0]; - } catch(e) { } - root.id = id; - return isBuggy; - })(), - - // supports the new traversal API - NATIVE_TRAVERSAL_API = - 'nextElementSibling' in root && 'previousElementSibling' in root, - - // BUGGY_XXXXX true if method is feature tested and has known bugs - // detect buggy gEBID - BUGGY_GEBID = NATIVE_GEBID ? - (function() { - var isBuggy = true, x = 'x' + String(+new Date), - a = doc.createElementNS ? 'a' : ''; - (a = doc.createElement(a)).name = x; - root.insertBefore(a, root.firstChild); - isBuggy = !!doc.getElementById(x); - root.removeChild(a); - return isBuggy; - })() : - true, - - // detect IE gEBTN comment nodes bug - BUGGY_GEBTN = NATIVE_GEBTN ? - (function() { - var div = doc.createElement('div'); - div.appendChild(doc.createComment('')); - return !!div.getElementsByTagName('*')[0]; - })() : - true, - - // detect Opera gEBCN second class and/or UTF8 bugs as well as Safari 3.2 - // caching class name results and not detecting when changed, - // tests are based on the jQuery selector test suite - BUGGY_GEBCN = NATIVE_GEBCN ? - (function() { - var isBuggy, div = doc.createElement('div'), test = '\u53f0\u5317'; - - // Opera tests - div.appendChild(doc.createElement('span')). - setAttribute('class', test + 'abc ' + test); - div.appendChild(doc.createElement('span')). - setAttribute('class', 'x'); - - isBuggy = !div.getElementsByClassName(test)[0]; - - // Safari test - div.lastChild.className = test; - return isBuggy || div.getElementsByClassName(test).length != 2; - })() : - true, - - // detect IE bug with dynamic attributes - BUGGY_GET_ATTRIBUTE = NATIVE_GET_ATTRIBUTE ? - (function() { - var input = doc.createElement('input'); - input.setAttribute('value', 5); - return input.defaultValue != 5; - })() : - true, - - // detect IE bug with non-standard boolean attributes - BUGGY_HAS_ATTRIBUTE = NATIVE_HAS_ATTRIBUTE ? - (function() { - var option = doc.createElement('option'); - option.setAttribute('selected', 'selected'); - return !option.hasAttribute('selected'); - })() : - true, - - // detect Safari bug with selected option elements - BUGGY_SELECTED = - (function() { - var select = doc.createElement('select'); - select.appendChild(doc.createElement('option')); - return !select.firstChild.selected; - })(), - - // initialized with the loading context - // and reset for each different context - BUGGY_QUIRKS_GEBCN, - BUGGY_QUIRKS_QSAPI, - - QUIRKS_MODE, - XML_DOCUMENT, - - // detect Opera browser - OPERA = /opera/i.test(string.call(global.opera)), - - // skip simpe selector optimizations for Opera >= 11 - OPERA_QSAPI = OPERA && parseFloat(opera.version()) >= 11, - - // check Seletor API implementations - RE_BUGGY_QSAPI = NATIVE_QSAPI ? - (function() { - var pattern = [ ], div = doc.createElement('div'), element, - - expect = function(selector, context, element, n) { - var result = false; - context.appendChild(element); - try { result = context.querySelectorAll(selector).length == n; } catch(e) { } - while (context.firstChild) { context.removeChild(context.firstChild); } - return result; - }; - - // ^= $= *= operators bugs whith empty values (Opera 10 / IE8) - element = doc.createElement('p'); - element.setAttribute('class', ''); - expect('[class^=""]', div, element, 1) && - pattern.push('[*^$]=[\\x20\\t\\n\\r\\f]*(?:""|' + "'')"); - - // :checked bug with option elements (Firefox 3.6.x) - // it wrongly includes 'selected' options elements - // HTML5 rules says selected options also match - element = doc.createElement('option'); - element.setAttribute('selected', 'selected'); - expect(':checked', div, element, 0) && - pattern.push(':checked'); - - // :enabled :disabled bugs with hidden fields (Firefox 3.5 QSA bug) - // http://www.w3.org/TR/html5/interactive-elements.html#selector-enabled - // IE8 QSA has problems too and throws error with these dynamic pseudos - element = doc.createElement('input'); - element.setAttribute('type', 'hidden'); - expect(':enabled', div, element, 1) && - pattern.push(':enabled', ':disabled'); - - // :link bugs with hyperlinks matching (Firefox/Safari) - element = doc.createElement('link'); - element.setAttribute('href', 'x'); - expect(':link', div, element, 1) || - pattern.push(':link'); - - // avoid attribute selectors for IE QSA - if (BUGGY_HAS_ATTRIBUTE) { - // IE fails in reading: - // - original values for input/textarea - // - original boolean values for controls - pattern.push('\\[[\\x20\\t\\n\\r\\f]*(?:checked|disabled|ismap|multiple|readonly|selected|value)'); - } - - return pattern.length ? - new RegExp(pattern.join('|')) : - { 'test': function() { return false; } }; - - })() : - true, - - // matches class selectors - RE_CLASS = new RegExp('(?:\\[[\\x20\\t\\n\\r\\f]*class\\b|\\.' + identifier + ')'), - - // matches simple id, tag & class selectors - RE_SIMPLE_SELECTOR = new RegExp( - !(BUGGY_GEBTN && BUGGY_GEBCN) ? !OPERA ? - '^(?:\\*|[.#]?-?[_a-zA-Z]{1}' + encoding + '*)$' : - '^(?:\\*|#-?[_a-zA-Z]{1}' + encoding + '*)$' : - '^#?-?[_a-zA-Z]{1}' + encoding + '*$'), - - /*----------------------------- LOOKUP OBJECTS -----------------------------*/ - - LINK_NODES = { 'a': 1, 'A': 1, 'area': 1, 'AREA': 1, 'link': 1, 'LINK': 1 }, - - // boolean attributes should return attribute name instead of true/false - ATTR_BOOLEAN = { - 'checked': 1, 'disabled': 1, 'ismap': 1, - 'multiple': 1, 'readonly': 1, 'selected': 1 - }, - - // dynamic attributes that needs to be checked against original HTML value - ATTR_DEFAULT = { - value: 'defaultValue', - checked: 'defaultChecked', - selected: 'defaultSelected' - }, - - // attribute referencing URI data values need special treatment in IE - ATTR_URIDATA = { - 'action': 2, 'cite': 2, 'codebase': 2, 'data': 2, 'href': 2, - 'longdesc': 2, 'lowsrc': 2, 'src': 2, 'usemap': 2 - }, - - // HTML 5 draft specifications - // http://www.whatwg.org/specs/web-apps/current-work/#selectors - HTML_TABLE = { - // class attribute must be treated case-insensitive in HTML quirks mode - // initialized by default to Standard Mode (case-sensitive), - // set dynamically by the attribute resolver - 'class': 0, - 'accept': 1, 'accept-charset': 1, 'align': 1, 'alink': 1, 'axis': 1, - 'bgcolor': 1, 'charset': 1, 'checked': 1, 'clear': 1, 'codetype': 1, 'color': 1, - 'compact': 1, 'declare': 1, 'defer': 1, 'dir': 1, 'direction': 1, 'disabled': 1, - 'enctype': 1, 'face': 1, 'frame': 1, 'hreflang': 1, 'http-equiv': 1, 'lang': 1, - 'language': 1, 'link': 1, 'media': 1, 'method': 1, 'multiple': 1, 'nohref': 1, - 'noresize': 1, 'noshade': 1, 'nowrap': 1, 'readonly': 1, 'rel': 1, 'rev': 1, - 'rules': 1, 'scope': 1, 'scrolling': 1, 'selected': 1, 'shape': 1, 'target': 1, - 'text': 1, 'type': 1, 'valign': 1, 'valuetype': 1, 'vlink': 1 - }, - - // the following attributes must be treated case-insensitive in XHTML mode - // Niels Leenheer http://rakaz.nl/item/css_selector_bugs_case_sensitivity - XHTML_TABLE = { - 'accept': 1, 'accept-charset': 1, 'alink': 1, 'axis': 1, - 'bgcolor': 1, 'charset': 1, 'codetype': 1, 'color': 1, - 'enctype': 1, 'face': 1, 'hreflang': 1, 'http-equiv': 1, - 'lang': 1, 'language': 1, 'link': 1, 'media': 1, 'rel': 1, - 'rev': 1, 'target': 1, 'text': 1, 'type': 1, 'vlink': 1 - }, - - /*-------------------------- REGULAR EXPRESSIONS ---------------------------*/ - - // placeholder to add functionalities - Selectors = { - // as a simple example this will check - // for chars not in standard ascii table - // - // 'mySpecialSelector': { - // 'Expression': /\u0080-\uffff/, - // 'Callback': mySelectorCallback - // } - // - // 'mySelectorCallback' will be invoked - // only after passing all other standard - // checks and only if none of them worked - }, - - // attribute operators - Operators = { - '=': "n=='%m'", - '^=': "n.indexOf('%m')==0", - '*=': "n.indexOf('%m')>-1", - '|=': "(n+'-').indexOf('%m-')==0", - '~=': "(' '+n+' ').indexOf(' %m ')>-1", - '$=': "n.substr(n.length-'%m'.length)=='%m'" - }, - - // optimization expressions - Optimize = { - ID: new RegExp('^\\*?#(' + encoding + '+)|' + skipgroup), - TAG: new RegExp('^(' + encoding + '+)|' + skipgroup), - CLASS: new RegExp('^\\*?\\.(' + encoding + '+$)|' + skipgroup) - }, - - // precompiled Regular Expressions - Patterns = { - // structural pseudo-classes and child selectors - spseudos: /^\:(root|empty|(?:first|last|only)(?:-child|-of-type)|nth(?:-last)?(?:-child|-of-type)\((even|odd|(?:[+-]{0,1}\d*n)?[+-]{0,1}\d*)\))?(.*)/, - // uistates + dynamic + negation pseudo-classes - dpseudos: /^\:(link|visited|target|active|focus|hover|checked|disabled|enabled|selected|lang\(([-\w]{2,})\)|not\(([^()]*|.*)\))?(.*)/, - // element attribute matcher - attribute: new RegExp('^\\[' + attrmatcher + '\\](.*)'), - // E > F - children: /^[\x20\t\n\r\f]*\>[\x20\t\n\r\f]*(.*)/, - // E + F - adjacent: /^[\x20\t\n\r\f]*\+[\x20\t\n\r\f]*(.*)/, - // E ~ F - relative: /^[\x20\t\n\r\f]*\~[\x20\t\n\r\f]*(.*)/, - // E F - ancestor: /^[\x20\t\n\r\f]+(.*)/, - // all - universal: /^\*(.*)/, - // id - id: new RegExp('^#(' + encoding + '+)(.*)'), - // tag - tagName: new RegExp('^(' + encoding + '+)(.*)'), - // class - className: new RegExp('^\\.(' + encoding + '+)(.*)') - }, - - /*------------------------------ UTIL METHODS ------------------------------*/ - - // concat elements to data - concatList = - function(data, elements) { - var i = -1, element; - if (!data.length && Array.slice) - return Array.slice(elements); - while ((element = elements[++i])) - data[data.length] = element; - return data; - }, - - // concat elements to data and callback - concatCall = - function(data, elements, callback) { - var i = -1, element; - while ((element = elements[++i])) { - if (false === callback(data[data.length] = element)) { break; } - } - return data; - }, - - // change context specific variables - switchContext = - function(from, force) { - var div, oldDoc = doc; - // save passed context - lastContext = from; - // set new context document - doc = from.ownerDocument || from; - if (force || oldDoc !== doc) { - // set document root - root = doc.documentElement; - // set host environment flags - XML_DOCUMENT = doc.createElement('DiV').nodeName == 'DiV'; - - // In quirks mode css class names are case insensitive. - // In standards mode they are case sensitive. See docs: - // https://developer.mozilla.org/en/Mozilla_Quirks_Mode_Behavior - // http://www.whatwg.org/specs/web-apps/current-work/#selectors - QUIRKS_MODE = !XML_DOCUMENT && - typeof doc.compatMode == 'string' ? - doc.compatMode.indexOf('CSS') < 0 : - (function() { - var style = doc.createElement('div').style; - return style && (style.width = 1) && style.width == '1px'; - })(); - - div = doc.createElement('div'); - div.appendChild(doc.createElement('p')).setAttribute('class', 'xXx'); - div.appendChild(doc.createElement('p')).setAttribute('class', 'xxx'); - - // GEBCN buggy in quirks mode, match count is: - // Firefox 3.0+ [xxx = 1, xXx = 1] - // Opera 10.63+ [xxx = 0, xXx = 2] - BUGGY_QUIRKS_GEBCN = - !XML_DOCUMENT && NATIVE_GEBCN && QUIRKS_MODE && - (div.getElementsByClassName('xxx').length != 2 || - div.getElementsByClassName('xXx').length != 2); - - // QSAPI buggy in quirks mode, match count is: - // At least Chrome 4+, Firefox 3.5+, Opera 10.x+, Safari 4+ [xxx = 1, xXx = 2] - // Safari 3.2 QSA doesn't work with mixedcase in quirksmode [xxx = 1, xXx = 0] - // https://bugs.webkit.org/show_bug.cgi?id=19047 - // must test the attribute selector '[class~=xxx]' - // before '.xXx' or the bug may not present itself - BUGGY_QUIRKS_QSAPI = - !XML_DOCUMENT && NATIVE_QSAPI && QUIRKS_MODE && - (div.querySelectorAll('[class~=xxx]').length != 2 || - div.querySelectorAll('.xXx').length != 2); - - Config.CACHING && Dom.setCache(true, doc); - } - }, - - /*------------------------------ DOM METHODS -------------------------------*/ - - // element by id (raw) - // @return reference or null - byIdRaw = - function(id, elements) { - var i = -1, element = null; - while ((element = elements[++i])) { - if (element.getAttribute('id') == id) { - break; - } - } - return element; - }, - - // element by id - // @return reference or null - _byId = !BUGGY_GEBID ? - function(id, from) { - id = id.replace(/\\/g, ''); - return from.getElementById && from.getElementById(id) || - byIdRaw(id, from.getElementsByTagName('*')); - } : - function(id, from) { - var element = null; - id = id.replace(/\\/g, ''); - if (XML_DOCUMENT || from.nodeType != 9) { - return byIdRaw(id, from.getElementsByTagName('*')); - } - if ((element = from.getElementById(id)) && - element.name == id && from.getElementsByName) { - return byIdRaw(id, from.getElementsByName(id)); - } - return element; - }, - - // publicly exposed byId - // @return reference or null - byId = - function(id, from) { - switchContext(from || (from = doc)); - return _byId(id, from); - }, - - // elements by tag (raw) - // @return array - byTagRaw = - function(tag, from) { - var any = tag == '*', element = from, elements = [ ], next = element.firstChild; - any || (tag = tag.toUpperCase()); - while ((element = next)) { - if (element.tagName > '@' && (any || element.tagName.toUpperCase() == tag)) { - elements[elements.length] = element; - } - if ((next = element.firstChild || element.nextSibling)) continue; - while (!next && (element = element.parentNode) && element !== from) { - next = element.nextSibling; - } - } - return elements; - }, - - // elements by tag - // @return array - _byTag = !BUGGY_GEBTN && NATIVE_SLICE_PROTO ? - function(tag, from) { - return XML_DOCUMENT || from.nodeType == 11 ? byTagRaw(tag, from) : - slice.call(from.getElementsByTagName(tag), 0); - } : - function(tag, from) { - var i = -1, j = i, data = [ ], - element, elements = from.getElementsByTagName(tag); - if (tag == '*') { - while ((element = elements[++i])) { - if (element.nodeName > '@') - data[++j] = element; - } - } else { - while ((element = elements[++i])) { - data[i] = element; - } - } - return data; - }, - - // publicly exposed byTag - // @return array - byTag = - function(tag, from) { - switchContext(from || (from = doc)); - return _byTag(tag, from); - }, - - // publicly exposed byName - // @return array - byName = - function(name, from) { - return select('[name="' + name.replace(/\\/g, '') + '"]', from); - }, - - // elements by class (raw) - // @return array - byClassRaw = - function(name, from) { - var i = -1, j = i, data = [ ], element, elements = _byTag('*', from), n; - name = ' ' + (QUIRKS_MODE ? name.toLowerCase() : name).replace(/\\/g, '') + ' '; - while ((element = elements[++i])) { - n = XML_DOCUMENT ? element.getAttribute('class') : element.className; - if (n && n.length && (' ' + (QUIRKS_MODE ? n.toLowerCase() : n). - replace(reWhiteSpace, ' ') + ' ').indexOf(name) > -1) { - data[++j] = element; - } - } - return data; - }, - - // elements by class - // @return array - _byClass = - function(name, from) { - return (BUGGY_GEBCN || BUGGY_QUIRKS_GEBCN || XML_DOCUMENT || !from.getElementsByClassName) ? - byClassRaw(name, from) : slice.call(from.getElementsByClassName(name.replace(/\\/g, '')), 0); - }, - - // publicly exposed byClass - // @return array - byClass = - function(name, from) { - switchContext(from || (from = doc)); - return _byClass(name, from); - }, - - // check element is descendant of container - // @return boolean - contains = 'compareDocumentPosition' in root ? - function(container, element) { - return (container.compareDocumentPosition(element) & 16) == 16; - } : 'contains' in root ? - function(container, element) { - return container !== element && container.contains(element); - } : - function(container, element) { - while ((element = element.parentNode)) { - if (element === container) return true; - } - return false; - }, - - // attribute value - // @return string - getAttribute = !BUGGY_GET_ATTRIBUTE ? - function(node, attribute) { - return node.getAttribute(attribute) || ''; - } : - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (ATTR_DEFAULT[attribute]) { - return node[ATTR_DEFAULT[attribute]] || ''; - } - return ( - // specific URI data attributes (parameter 2 to fix IE bug) - ATTR_URIDATA[attribute] ? node.getAttribute(attribute, 2) || '' : - // boolean attributes should return name instead of true/false - ATTR_BOOLEAN[attribute] ? node.getAttribute(attribute) ? attribute : '' : - ((node = node.getAttributeNode(attribute)) && node.value) || ''); - }, - - // attribute presence - // @return boolean - hasAttribute = !BUGGY_HAS_ATTRIBUTE ? - function(node, attribute) { - return XML_DOCUMENT ? - !!node.getAttribute(attribute) : - node.hasAttribute(attribute); - } : - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (ATTR_DEFAULT[attribute]) { - return !!node[ATTR_DEFAULT[attribute]]; - } - // need to get at AttributeNode first on IE - node = node.getAttributeNode(attribute); - // use both "specified" & "nodeValue" properties - return !!(node && (node.specified || node.nodeValue)); - }, - - // check node emptyness - // @return boolean - isEmpty = - function(node) { - node = node.firstChild; - while (node) { - if (node.nodeType == 3 || node.nodeName > '@') return false; - node = node.nextSibling; - } - return true; - }, - - // check if element matches the :link pseudo - // @return boolean - isLink = - function(element) { - return hasAttribute(element,'href') && LINK_NODES[element.nodeName]; - }, - - // child position by nodeType - // @return number - nthElement = - function(element, last) { - var count = 1, succ = last ? 'nextSibling' : 'previousSibling'; - while ((element = element[succ])) { - if (element.nodeName > '@') ++count; - } - return count; - }, - - // child position by nodeName - // @return number - nthOfType = - function(element, last) { - var count = 1, succ = last ? 'nextSibling' : 'previousSibling', type = element.nodeName; - while ((element = element[succ])) { - if (element.nodeName == type) ++count; - } - return count; - }, - - /*------------------------------- DEBUGGING --------------------------------*/ - - // get/set (string/object) working modes - configure = - function(option) { - if (typeof option == 'string') { return Config[option]; } - if (typeof option != 'object') { return false; } - for (var i in option) { - Config[i] = !!option[i]; - if (i == 'SIMPLENOT') { - matchContexts = { }; - matchResolvers = { }; - selectContexts = { }; - selectResolvers = { }; - Config['USE_QSAPI'] = false; - reValidator = new RegExp(extendedValidator, 'g'); - } else if (i == 'USE_QSAPI') { - Config[i] = !!option[i] && NATIVE_QSAPI; - reValidator = new RegExp(standardValidator, 'g'); - } - } - return true; - }, - - // control user notifications - emit = - function(message) { - message = 'SYNTAX_ERR: ' + message + ' '; - if (Config.VERBOSITY) { - throw new SyntaxError(message); - } else { - if (global.console && global.console.log) { - global.console.log(message); - } else { - global.status += message; - } - } - }, - - Config = { - - // used to enable/disable caching of result sets - CACHING: false, - - // by default do not add missing left/right context - // to selector string shortcuts like "+div" or "ul>" - // callable Dom.shortcuts method has to be available - SHORTCUTS: false, - - // by default disable complex selectors nested in - // ':not()' pseudo-classes, as for specifications - SIMPLENOT: true, - - // HTML5 handling for the ":checked" pseudo-class - USE_HTML5: false, - - // controls enabling the Query Selector API branch - USE_QSAPI: NATIVE_QSAPI, - - // controls the engine error/warning notifications - VERBOSITY: true - - }, - - /*---------------------------- COMPILER METHODS ----------------------------*/ - - // code string reused to build compiled functions - ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break;else continue main;', - - // compile a comma separated group of selector - // @mode boolean true for select, false for match - // return a compiled function - compile = - function(selector, source, mode) { - - var parts = typeof selector == 'string' ? selector.match(reSplitGroup) : selector; - - // ensures that source is a string - typeof source == 'string' || (source = ''); - - if (parts.length == 1) { - source += compileSelector(parts[0], mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } else { - // for each selector in the group - var i = -1, seen = { }, token; - while ((token = parts[++i])) { - token = token.replace(reTrimSpaces, ''); - // avoid repeating the same token - // in comma separated group (p, p) - if (!seen[token] && (seen[token] = true)) { - source += compileSelector(token, mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } - } - } - - if (mode) { - // for select method - return new Function('c,s,r,d,h,g,f,v', - 'var N,n,x=0,k=-1,e;main:while((e=c[++k])){' + source + '}return r;'); - } else { - // for match method - return new Function('e,s,r,d,h,g,f,v', - 'var N,n,x=0,k=e;' + source + 'return false;'); - } - }, - - // allows to cache already visited nodes - FILTER = - 'var z=v[@]||(v[@]=[]),l=z.length-1;' + - 'while(l>=0&&z[l]!==e)--l;' + - 'if(l!==-1){break;}' + - 'z[z.length]=e;', - - // compile a CSS3 string selector into ad-hoc javascript matching function - // @return string (to be compiled) - compileSelector = - function(selector, source, mode) { - - var a, b, n, k = 0, expr, match, result, status, test, type; - - while (selector) { - - k++; - - // *** Universal selector - // * match all (empty block, do not remove) - if ((match = selector.match(Patterns.universal))) { - // do nothing, handled in the compiler where - // BUGGY_GEBTN return comment nodes (ex: IE) - expr = ''; - } - - // *** ID selector - // #Foo Id case sensitive - else if ((match = selector.match(Patterns.id))) { - // document can contain conflicting elements (id/name) - // prototype selector unit need this method to recover bad HTML forms - source = 'if(' + (XML_DOCUMENT ? - 's.getAttribute(e,"id")' : - '(e.submit?s.getAttribute(e,"id"):e.id)') + - '=="' + match[1] + '"' + - '){' + source + '}'; - } - - // *** Type selector - // Foo Tag (case insensitive) - else if ((match = selector.match(Patterns.tagName))) { - // both tagName and nodeName properties may be upper/lower case - // depending on their creation NAMESPACE in createElementNS() - source = 'if(e.nodeName' + (XML_DOCUMENT ? - '=="' + match[1] + '"' : '.toUpperCase()' + - '=="' + match[1].toUpperCase() + '"') + - '){' + source + '}'; - } - - // *** Class selector - // .Foo Class (case sensitive) - else if ((match = selector.match(Patterns.className))) { - // W3C CSS3 specs: element whose "class" attribute has been assigned a - // list of whitespace-separated values, see section 6.4 Class selectors - // and notes at the bottom; explicitly non-normative in this specification. - source = 'if((n=' + (XML_DOCUMENT ? - 's.getAttribute(e,"class")' : 'e.className') + - ')&&n.length&&(" "+' + (QUIRKS_MODE ? 'n.toLowerCase()' : 'n') + - '.replace(' + reWhiteSpace + '," ")+" ").indexOf(" ' + - (QUIRKS_MODE ? match[1].toLowerCase() : match[1]) + ' ")>-1' + - '){' + source + '}'; - } - - // *** Attribute selector - // [attr] [attr=value] [attr="value"] [attr='value'] and !=, *=, ~=, |=, ^=, $= - // case sensitivity is treated differently depending on the document type (see map) - else if ((match = selector.match(Patterns.attribute))) { - - // xml namespaced attribute ? - expr = match[1].split(':'); - expr = expr.length == 2 ? expr[1] : expr[0] + ''; - - if (match[2] && !Operators[match[2]]) { - emit('Unsupported operator in attribute selectors "' + selector + '"'); - return ''; - } - - test = false; - type = 'false'; - - // replace Operators parameter if needed - if (match[2] && match[4] && (type = Operators[match[2]])) { - // case treatment depends on document - HTML_TABLE['class'] = QUIRKS_MODE ? 1 : 0; - // replace escaped values and HTML entities - match[4] = match[4].replace(/\\([0-9a-f]{2,2})/, '\\x$1'); - test = (XML_DOCUMENT ? XHTML_TABLE : HTML_TABLE)[expr.toLowerCase()]; - type = type.replace(/\%m/g, test ? match[4].toLowerCase() : match[4]); - } else if (match[2] == '!=' || match[2] == '=') { - type = 'n' + match[2] + '="' + match[4] + '"'; - } - - // build expression for has/getAttribute - expr = 'n=s.' + (match[2] ? 'get' : 'has') + - 'Attribute(e,"' + match[1] + '")' + - (test ? '.toLowerCase();' : ';'); - - source = expr + 'if(' + (match[2] ? type : 'n') + '){' + source + '}'; - } - - // *** Adjacent sibling combinator - // E + F (F adiacent sibling of E) - else if ((match = selector.match(Patterns.adjacent))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = NATIVE_TRAVERSAL_API ? - 'var N' + k + '=e;while(e&&(e=e.previousElementSibling)){' + source + 'break;}e=N' + k + ';' : - 'var N' + k + '=e;while(e&&(e=e.previousSibling)){if(e.nodeName>"@"){' + source + 'break;}}e=N' + k + ';'; - } - - // *** General sibling combinator - // E ~ F (F relative sibling of E) - else if ((match = selector.match(Patterns.relative))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = NATIVE_TRAVERSAL_API ? - ('var N' + k + '=e;e=e.parentNode.firstElementChild;' + - 'while(e&&e!==N' + k + '){' + source + 'e=e.nextElementSibling;}e=N' + k + ';') : - ('var N' + k + '=e;e=e.parentNode.firstChild;' + - 'while(e&&e!==N' + k + '){if(e.nodeName>"@"){' + source + '}e=e.nextSibling;}e=N' + k + ';'); - } - - // *** Child combinator - // E > F (F children of E) - else if ((match = selector.match(Patterns.children))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + 'break;}e=N' + k + ';'; - } - - // *** Descendant combinator - // E F (E ancestor of F) - else if ((match = selector.match(Patterns.ancestor))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + '}e=N' + k + ';'; - } - - // *** Structural pseudo-classes - // :root, :empty, - // :first-child, :last-child, :only-child, - // :first-of-type, :last-of-type, :only-of-type, - // :nth-child(), :nth-last-child(), :nth-of-type(), :nth-last-of-type() - else if ((match = selector.match(Patterns.spseudos)) && match[1]) { - - switch (match[1]) { - case 'root': - // element root of the document - if (match[3]) { - source = 'if(e===h||s.contains(h,e)){' + source + '}'; - } else { - source = 'if(e===h){' + source + '}'; - } - break; - - case 'empty': - // element that has no children - source = 'if(s.isEmpty(e)){' + source + '}'; - break; - - default: - if (match[1] && match[2]) { - if (match[2] == 'n') { - source = 'if(e!==h){' + source + '}'; - break; - } else if (match[2] == 'even') { - a = 2; - b = 0; - } else if (match[2] == 'odd') { - a = 2; - b = 1; - } else { - // assumes correct "an+b" format, "b" before "a" to keep "n" values - b = ((n = match[2].match(/(-?\d+)$/)) ? parseInt(n[1], 10) : 0); - a = ((n = match[2].match(/(-?\d*)n/)) ? parseInt(n[1], 10) : 0); - if (n && n[1] == '-') a = -1; - } - - // build test expression out of structural pseudo (an+b) parameters - // see here: http://www.w3.org/TR/css3-selectors/#nth-child-pseudo - test = a > 1 ? - (/last/.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' : - 'n>=' + b + '&&(n-(' + b + '))%' + a + '==0' : a < -1 ? - (/last/.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' : - 'n<=' + b + '&&(n-(' + b + '))%' + a + '==0' : a=== 0 ? - 'n==' + b : - (/last/.test(match[1])) ? - a == -1 ? 'n>=' + b : 'n<=' + b : - a == -1 ? 'n<=' + b : 'n>=' + b; - - // 4 cases: 1 (nth) x 4 (child, of-type, last-child, last-of-type) - source = - 'if(e!==h){' + - 'n=s[' + (/-of-type/.test(match[1]) ? '"nthOfType"' : '"nthElement"') + ']' + - '(e,' + (/last/.test(match[1]) ? 'true' : 'false') + ');' + - 'if(' + test + '){' + source + '}' + - '}'; - - } else { - // 6 cases: 3 (first, last, only) x 1 (child) x 2 (-of-type) - a = /first/.test(match[1]) ? 'previous' : 'next'; - n = /only/.test(match[1]) ? 'previous' : 'next'; - b = /first|last/.test(match[1]); - - type = /of-type/.test(match[1]) ? '&&n.nodeName!=e.nodeName' : '&&n.nodeName<"@"'; - - source = 'if(e!==h){' + - ( 'n=e;while((n=n.' + a + 'Sibling)' + type + ');if(!n){' + (b ? source : - 'n=e;while((n=n.' + n + 'Sibling)' + type + ');if(!n){' + source + '}') + '}' ) + '}'; - } - break; - } - - } - - // *** negation, user action and target pseudo-classes - // *** UI element states and dynamic pseudo-classes - // CSS3 :not, :checked, :enabled, :disabled, :target - // CSS3 :active, :hover, :focus - // CSS3 :link, :visited - else if ((match = selector.match(Patterns.dpseudos)) && match[1]) { - - switch (match[1].match(/^\w+/)[0]) { - // CSS3 negation pseudo-class - case 'not': - // compile nested selectors, DO NOT pass the callback parameter - // SIMPLENOT allow disabling complex selectors nested - // in ':not()' pseudo-classes, breaks some test units - expr = match[3].replace(reTrimSpaces, ''); - - if (Config.SIMPLENOT && !reSimpleNot.test(expr)) { - // see above, log error but continue execution - emit('Negation pseudo-class only accepts simple selectors "' + selector + '"'); - return ''; - } else { - if ('compatMode' in doc) { - source = 'if(!' + compile([expr], '', false) + '(e,s,r,d,h,g)){' + source + '}'; - } else { - source = 'if(!s.match(e, "' + expr.replace(/\x22/g, '\\"') + '",g)){' + source +'}'; - } - } - break; - - // CSS3 UI element states - case 'checked': - // for radio buttons checkboxes (HTML4) and options (HTML5) - test = 'if((typeof e.form!="undefined"&&(/^(?:radio|checkbox)$/i).test(e.type)&&e.checked)'; - source = (Config.USE_HTML5 ? test + '||(/^option$/i.test(e.nodeName)&&e.selected)' : test) + '){' + source + '}'; - break; - case 'disabled': - // does not consider hidden input fields - source = 'if(((typeof e.form!="undefined"&&!(/^hidden$/i).test(e.type))||s.isLink(e))&&e.disabled){' + source + '}'; - break; - case 'enabled': - // does not consider hidden input fields - source = 'if(((typeof e.form!="undefined"&&!(/^hidden$/i).test(e.type))||s.isLink(e))&&!e.disabled){' + source + '}'; - break; - - // CSS3 lang pseudo-class - case 'lang': - test = ''; - if (match[2]) test = match[2].substr(0, 2) + '-'; - source = 'do{(n=e.lang||"").toLowerCase();' + - 'if((n==""&&h.lang=="' + match[2].toLowerCase() + '")||' + - '(n&&(n=="' + match[2].toLowerCase() + - '"||n.substr(0,3)=="' + test.toLowerCase() + '")))' + - '{' + source + 'break;}}while((e=e.parentNode)&&e!==g);'; - break; - - // CSS3 target pseudo-class - case 'target': - n = doc.location ? doc.location.hash : ''; - if (n) { - source = 'if(e.id=="' + n.slice(1) + '"){' + source + '}'; - } - break; - - // CSS3 dynamic pseudo-classes - case 'link': - source = 'if(s.isLink(e)&&!e.visited){' + source + '}'; - break; - case 'visited': - source = 'if(s.isLink(e)&&e.visited){' + source + '}'; - break; - - // CSS3 user action pseudo-classes IE & FF3 have native support - // these capabilities may be emulated by some event managers - case 'active': - if (XML_DOCUMENT) break; - source = 'if(e===d.activeElement){' + source + '}'; - break; - case 'hover': - if (XML_DOCUMENT) break; - source = 'if(e===d.hoverElement){' + source + '}'; - break; - case 'focus': - if (XML_DOCUMENT) break; - source = NATIVE_FOCUS ? - 'if(e===d.activeElement&&d.hasFocus()&&(e.type||e.href)){' + source + '}' : - 'if(e===d.activeElement&&(e.type||e.href)){' + source + '}'; - break; - - // CSS2 selected pseudo-classes, not part of current CSS3 drafts - // the 'selected' property is only available for option elements - case 'selected': - // fix Safari selectedIndex property bug - expr = BUGGY_SELECTED ? '||(n=e.parentNode)&&n.options[n.selectedIndex]===e' : ''; - source = 'if(/^option$/i.test(e.nodeName)&&(e.selected' + expr + ')){' + source + '}'; - break; - - default: - break; - } - - } - - else { - - // this is where external extensions are - // invoked if expressions match selectors - expr = false; - status = false; - for (expr in Selectors) { - if ((match = selector.match(Selectors[expr].Expression)) && match[1]) { - result = Selectors[expr].Callback(match, source); - source = result.source; - status = result.status; - if (status) { break; } - } - } - - // if an extension fails to parse the selector - // it must return a false boolean in "status" - if (!status) { - // log error but continue execution, don't throw real exceptions - // because blocking following processes maybe is not a good idea - emit('Unknown pseudo-class selector "' + selector + '"'); - return ''; - } - - if (!expr) { - // see above, log error but continue execution - emit('Unknown token in selector "' + selector + '"'); - return ''; - } - - } - - // error if no matches found by the pattern scan - if (!match) { - emit('Invalid syntax in selector "' + selector + '"'); - return ''; - } - - // ensure "match" is not null or empty since - // we do not throw real DOMExceptions above - selector = match && match[match.length - 1]; - } - - return source; - }, - - /*----------------------------- QUERY METHODS ------------------------------*/ - - // match element with selector - // @return boolean - match = - function(element, selector, from, callback) { - - var parts; - - if (!(element && element.nodeName > '@')) { - emit('Invalid element argument'); - return false; - } else if (!selector || typeof selector != 'string') { - emit('Invalid selector argument'); - return false; - } else if (from && from.nodeType == 1 && !contains(from, element)) { - return false; - } else if (lastContext !== from) { - // reset context data when it changes - // and ensure context is set to a default - switchContext(from || (from = element.ownerDocument)); - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, element, from)); - - if (lastMatcher != selector) { - // process valid selector strings - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleMatch = (parts = selector.match(reSplitGroup)).length < 2; - // save passed selector - lastMatcher = selector; - lastPartsMatch = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return false; - } - } else parts = lastPartsMatch; - - // compile matcher resolver if necessary - if (!matchResolvers[selector] || matchContexts[selector] !== from) { - matchResolvers[selector] = compile(isSingleMatch ? [selector] : parts, '', false); - matchContexts[selector] = from; - } - - return matchResolvers[selector](element, Snapshot, [ ], doc, root, from, callback, { }); - }, - - // select only the first element - // matching selector (document ordered) - first = - function(selector, from) { - return select(selector, from, function() { return false; })[0] || null; - }, - - // select elements matching selector - // using new Query Selector API - // or cross-browser client API - // @return array - select = - function(selector, from, callback) { - - var i, changed, element, elements, parts, token, original = selector; - - if (arguments.length === 0) { - emit('Missing required selector parameters'); - return [ ]; - } else if (selector === '') { - emit('Empty selector string'); - return [ ]; - } else if (typeof selector != 'string') { - return [ ]; - } else if (from && !(/1|9|11/).test(from.nodeType)) { - emit('Invalid context element'); - return [ ]; - } else if (lastContext !== from) { - // reset context data when it changes - // and ensure context is set to a default - switchContext(from || (from = doc)); - } - - if (Config.CACHING && (elements = Dom.loadResults(original, from, doc, root))) { - return callback ? concatCall([ ], elements, callback) : elements; - } - - if (!OPERA_QSAPI && RE_SIMPLE_SELECTOR.test(selector)) { - switch (selector.charAt(0)) { - case '#': - if ((element = _byId(selector.slice(1), from))) { - elements = [ element ]; - } else elements = [ ]; - break; - case '.': - elements = _byClass(selector.slice(1), from); - break; - default: - elements = _byTag(selector, from); - break; - } - } - - else if (!XML_DOCUMENT && Config.USE_QSAPI && - !(BUGGY_QUIRKS_QSAPI && RE_CLASS.test(selector)) && - !RE_BUGGY_QSAPI.test(selector)) { - try { - elements = from.querySelectorAll(selector); - } catch(e) { } - } - - if (elements) { - elements = callback ? concatCall([ ], elements, callback) : - NATIVE_SLICE_PROTO ? slice.call(elements) : concatList([ ], elements); - Config.CACHING && Dom.saveResults(original, from, doc, elements); - return elements; - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, from)); - - if ((changed = lastSelector != selector)) { - // process valid selector strings - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleSelect = (parts = selector.match(reSplitGroup)).length < 2; - // save passed selector - lastSelector = selector; - lastPartsSelect = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return [ ]; - } - } else parts = lastPartsSelect; - - // commas separators are treated sequentially to maintain order - if (from.nodeType == 11) { - - elements = from.childNodes; - - } else if (!XML_DOCUMENT && isSingleSelect) { - - if (changed) { - // get right most selector token - parts = selector.match(reSplitToken); - token = parts[parts.length - 1]; - - // only last slice before :not rules - lastSlice = token.split(':not')[0]; - - // position where token was found - lastPosition = selector.length - token.length; - } - - // ID optimization RTL, to reduce number of elements to visit - if ((parts = lastSlice.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, from))) { - if (match(element, selector)) { - callback && callback(element); - elements = [ element ]; - } else elements = [ ]; - } - } - - // ID optimization LTR, to reduce selection context searches - else if ((parts = selector.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, doc))) { - if ('#' + token == selector) { - callback && callback(element); - elements = [ element ]; - } - if (/[>+~]/.test(selector)) { - from = element.parentNode; - } else { - selector = selector.replace('#' + token, '*'); - lastPosition -= token.length + 1; - from = element; - } - } else elements = [ ]; - } - - if (elements) { - Config.CACHING && Dom.saveResults(original, from, doc, elements); - return elements; - } - - if (!NATIVE_GEBCN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) { - if ((elements = _byTag(token, from)).length === 0) { return [ ]; } - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*'); - } - - else if ((parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) { - if ((elements = _byClass(token, from)).length === 0) { return [ ]; } - if (reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1))) { - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, ''); - } else { - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, '*'); - } - } - - else if ((parts = selector.match(Optimize.CLASS)) && (token = parts[1])) { - if ((elements = _byClass(token, from)).length === 0) { return [ ]; } - for (i = 0, els = [ ]; elements.length > i; ++i) { - els = concatList(els, elements[i].getElementsByTagName('*')); - } - elements = els; - if (reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1))) { - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, ''); - } else { - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, '*'); - } - } - - else if (NATIVE_GEBCN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) { - if ((elements = _byTag(token, from)).length === 0) { return [ ]; } - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*'); - } - - } - - if (!elements) { - elements = /^(?:applet|object)$/i.test(from.nodeName) ? from.childNodes : _byTag('*', from); - } - // end of prefiltering pass - - // compile selector resolver if necessary - if (!selectResolvers[selector] || selectContexts[selector] !== from) { - selectResolvers[selector] = compile(isSingleSelect ? [selector] : parts, '', true); - selectContexts[selector] = from; - } - - elements = selectResolvers[selector](elements, Snapshot, [ ], doc, root, from, callback, { }); - - Config.CACHING && Dom.saveResults(original, from, doc, elements); - - return elements; - }, - - /*-------------------------------- STORAGE ---------------------------------*/ - - // compiled match functions returning booleans - matchContexts = { }, - matchResolvers = { }, - - // compiled select functions returning collections - selectContexts = { }, - selectResolvers = { }, - - // used to pass methods to compiled functions - Snapshot = { - - // element indexing methods - nthElement: nthElement, - nthOfType: nthOfType, - - // element inspection methods - getAttribute: getAttribute, - hasAttribute: hasAttribute, - - // element selection methods - byClass: _byClass, - byName: byName, - byTag: _byTag, - byId: _byId, - - // helper/check methods - contains: contains, - isEmpty: isEmpty, - isLink: isLink, - - // selection/matching - select: select, - match: match - }, - - Tokens = { - prefixes: prefixes, - encoding: encoding, - operators: operators, - whitespace: whitespace, - identifier: identifier, - attributes: attributes, - combinators: combinators, - pseudoclass: pseudoclass, - pseudoparms: pseudoparms, - quotedvalue: quotedvalue - }; - - /*------------------------------- PUBLIC API -------------------------------*/ - - // code referenced by extensions - Dom.ACCEPT_NODE = ACCEPT_NODE; - - // log resolvers errors/warnings - Dom.emit = emit; - - // retrieve element by id attr - Dom.byId = byId; - - // retrieve elements by tag name - Dom.byTag = byTag; - - // retrieve elements by name attr - Dom.byName = byName; - - // retrieve elements by class name - Dom.byClass = byClass; - - // read the value of the attribute - // as was in the original HTML code - Dom.getAttribute = getAttribute; - - // check for the attribute presence - // as was in the original HTML code - Dom.hasAttribute = hasAttribute; - - // element match selector, return boolean true/false - Dom.match = match; - - // first element match only, return element or null - Dom.first = first; - - // elements matching selector, starting from element - Dom.select = select; - - // compile selector into ad-hoc javascript resolver - Dom.compile = compile; - - // check that two elements are ancestor/descendant - Dom.contains = contains; - - // handle selector engine configuration settings - Dom.configure = configure; - - // initialize caching for each document - Dom.setCache = function() { return; }; - - // load previously collected result set - Dom.loadResults = function() { return; }; - - // save previously collected result set - Dom.saveResults = function() { return; }; - - // handle missing context in selector strings - Dom.shortcuts = function(x) { return x; }; - - // options enabing specific engine functionality - Dom.Config = Config; - - // pass methods references to compiled resolvers - Dom.Snapshot = Snapshot; - - // operators descriptor - // for attribute operators extensions - Dom.Operators = Operators; - - // selectors descriptor - // for pseudo-class selectors extensions - Dom.Selectors = Selectors; - - // export string patterns - Dom.Tokens = Tokens; - - // add or overwrite user defined operators - Dom.registerOperator = - function(symbol, resolver) { - Operators[symbol] || (Operators[symbol] = resolver); - }; - - // add selector patterns for user defined callbacks - Dom.registerSelector = - function(name, rexp, func) { - Selectors[name] || (Selectors[name] = { - Expression: rexp, - Callback: func - }); - }; - - /*---------------------------------- INIT ----------------------------------*/ - - // init context specific variables - switchContext(doc, true); - -}); diff --git a/node_modules/jsdom/node_modules/nwmatcher/src/OLD/nwmatcher-base-GITHUB.js b/node_modules/jsdom/node_modules/nwmatcher/src/OLD/nwmatcher-base-GITHUB.js deleted file mode 100644 index 4f88a95..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/src/OLD/nwmatcher-base-GITHUB.js +++ /dev/null @@ -1,669 +0,0 @@ -/* - * Copyright (C) 2007-2012 Diego Perini - * All rights reserved. - * - * nwmatcher-base.js - A fast CSS selector engine and matcher - * - * Author: Diego Perini - * Version: 1.3.0beta - * Created: 20070722 - * Release: 20121122 - * - * License: - * http://javascript.nwbox.com/NWMatcher/MIT-LICENSE - * Download: - * http://javascript.nwbox.com/NWMatcher/nwmatcher.js - */ - -(function(global, factory) { - - if (typeof module === 'object' && typeof exports === 'object') { - module.exports = function (browserGlobal) { - var exports = { }; - factory(browserGlobal, exports); - return exports; - }; - } else { - if (!global.NW) { - global.NW = { }; - } - if (!global.NW.Dom) { - global.NW.Dom = { }; - } - factory(global, global.NW.Dom); - } - -})(this, function(global, exports) { - - var version = 'nwmatcher-1.3.0beta', - - Dom = exports, - - doc = global.document, - root = doc.documentElement, - - slice = [ ].slice, - - isSingleMatch, - isSingleSelect, - - lastSlice, - lastContext, - lastPosition, - - lastMatcher, - lastSelector, - - lastPartsMatch, - lastPartsSelect, - - prefixes = '[#.:]?', - operators = '([~*^$|!]?={1})', - whitespace = '[\\x20\\t\\n\\r\\f]*', - combinators = '[\\x20]|[>+~][^>+~]', - pseudoparms = '(?:[-+]?\\d*n)?[-+]?\\d*', - - quotedvalue = '"[^"]*"' + "|'[^']*'", - skipgroup = '\\[.*\\]|\\(.*\\)|\\{.*\\}', - - encoding = '(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)', - identifier = '(?:-?[_a-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+', - - attrcheck = '(' + quotedvalue + '|' + identifier + ')', - attributes = whitespace + '(' + encoding + '+:?' + encoding + '+)' + - whitespace + '(?:' + operators + whitespace + attrcheck + ')?' + whitespace, - - attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'), - - pseudoclass = '((?:' + - pseudoparms + '|' + quotedvalue + '|' + - prefixes + '|' + encoding + '+|' + - '\\[' + attributes + '\\]|' + - '\\(.+\\)|' + whitespace + '|' + - ',)+)', - - extensions = '.+', - - standardValidator = - '(?=[\\x20\\t\\n\\r\\f]*[^>+~(){}<>])' + - '(' + - '\\*' + - '|(?:' + prefixes + identifier + ')' + - '|' + combinators + - '|\\[' + attributes + '\\]' + - '|\\(' + pseudoclass + '\\)' + - '|\\{' + extensions + '\\}' + - '|,' + - ')+', - - extendedValidator = standardValidator.replace(pseudoclass, '.*'), - - reValidator = RegExp(standardValidator, 'g'), - - reTrimSpaces = RegExp('^' + - whitespace + '|' + whitespace + '$', 'g'), - - reSplitGroup = RegExp('(' + - '[^,\\\\\\[\\]]+' + - '|\\[[^[\\]]*\\]|\\[.*\\]' + - '|\\([^()]+\\)|\\(.*\\)' + - '|\\{[^{}]+\\}|\\{.*\\}' + - '|\\\\.' + - ')+', 'g'), - - reSplitToken = RegExp('(' + - '\\[' + attributes + '\\]|' + - '\\(' + pseudoclass + '\\)|' + - '[^\\x20>+~]|\\\\.)+', 'g'), - - reWhiteSpace = /[\x20\t\n\r\f]+/g, - - reOptimizeSelector = RegExp(identifier + '|^$'), - - ATTR_URIDATA = { - action: 2, cite: 2, codebase: 2, data: 2, href: 2, - longdesc: 2, lowsrc: 2, src: 2, usemap: 2 - }, - - Selectors = { }, - - Operators = { - '=': "n=='%m'", - '^=': "n.indexOf('%m')==0", - '*=': "n.indexOf('%m')>-1", - '|=': "(n+'-').indexOf('%m-')==0", - '~=': "(' '+n+' ').indexOf(' %m ')>-1", - '$=': "n.substr(n.length-'%m'.length)=='%m'" - }, - - Optimize = { - ID: RegExp('^\\*?#(' + encoding + '+)|' + skipgroup), - TAG: RegExp('^(' + encoding + '+)|' + skipgroup), - CLASS: RegExp('^\\*?\\.(' + encoding + '+$)|' + skipgroup) - }, - - Patterns = { - universal: /^\*(.*)/, - id: RegExp('^#(' + encoding + '+)(.*)'), - tagName: RegExp('^(' + encoding + '+)(.*)'), - className: RegExp('^\\.(' + encoding + '+)(.*)'), - attribute: RegExp('^\\[' + attrmatcher + '\\](.*)'), - children: /^[\x20\t\n\r\f]*\>[\x20\t\n\r\f]*(.*)/, - adjacent: /^[\x20\t\n\r\f]*\+[\x20\t\n\r\f]*(.*)/, - relative: /^[\x20\t\n\r\f]*\~[\x20\t\n\r\f]*(.*)/, - ancestor: /^[\x20\t\n\r\f]+(.*)/ - }, - - QUIRKS_MODE, - XML_DOCUMENT, - - GEBTN = 'getElementsByTagName' in doc, - GEBCN = 'getElementsByClassName' in doc, - - IE_LT_9 = typeof doc.addEventListener != 'function', - - INSENSITIVE_MAP = { - 'href': 1, 'lang': 1, 'src': 1, 'style': 1, 'title': 1, - 'type': 1, 'xmlns': 1, 'xml:lang': 1, 'xml:space': 1 - }, - - REFLECTED = { 'value': 1, 'checked': 1, 'selected': 1 }, - - TO_UPPER_CASE = IE_LT_9 ? '.toUpperCase()' : '', - - ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break;else continue main;', - REJECT_NODE = IE_LT_9 ? 'if(e.nodeName<"A")continue;' : '', - - Config = { - CACHING: false, - SIMPLENOT: true, - USE_HTML5: false, - USE_QSAPI: false, - VERBOSITY: true - }, - - configure = - function(option) { - if (typeof option == 'string') { return Config[option]; } - if (typeof option != 'object') { return false; } - for (var i in option) { - Config[i] = !!option[i]; - if (i == 'SIMPLENOT') { - matchContexts = { }; - matchResolvers = { }; - selectContexts = { }; - selectResolvers = { }; - Config['USE_QSAPI'] = false; - reValidator = RegExp(extendedValidator, 'g'); - } else if (i == 'USE_QSAPI') { - reValidator = RegExp(standardValidator, 'g'); - } - } - return true; - }, - - concatCall = - function(data, elements, callback) { - var i = -1, element; - while ((element = elements[++i])) { - if (false === callback(data[data.length] = element)) { break; } - } - return data; - }, - - emit = - function(message) { - message = 'SYNTAX_ERR: ' + message + ' '; - if (Config.VERBOSITY) { - throw SyntaxError(message); - } else { - if (global.console && global.console.log) { - global.console.log(message); - } else { - global.status += message; - } - } - }, - - switchContext = - function(from, force) { - var oldDoc = doc; - lastContext = from; - doc = from.ownerDocument || from; - if (force || oldDoc !== doc) { - root = doc.documentElement; - XML_DOCUMENT = doc.createElement('DiV').nodeName == 'DiV'; - QUIRKS_MODE = !XML_DOCUMENT && - typeof doc.compatMode == 'string' ? - doc.compatMode.indexOf('CSS') < 0 : - (function() { - var style = document.createElement('div').style; - return style && (style.width = 1) && style.width == '1px'; - })(); - - Config.CACHING && Dom.setCache(true, doc); - } - }, - - byIdRaw = - function(id, elements) { - var i = 0, element = null; - while ((element = elements[i])) { - if (element.getAttribute('id') == id) { - break; - } - ++i; - } - return element; - }, - - _byId = !('fileSize' in doc) ? - function(id, from) { - id = id.replace(/\\/g, ''); - return from.getElementById && from.getElementById(id) || - byIdRaw(id, from.getElementsByTagName('*')); - } : - function(id, from) { - var element = null; - id = id.replace(/\\/g, ''); - if (XML_DOCUMENT || from.nodeType != 9) { - return byIdRaw(id, from.getElementsByTagName('*')); - } - if ((element = from.getElementById(id)) && - element.name == id && from.getElementsByName) { - return byIdRaw(id, from.getElementsByName(id)); - } - return element; - }, - - byId = - function(id, from) { - switchContext(from || (from = doc)); - return _byId(id, from); - }, - - getAttr = - function(node, attribute) { - return ( - ATTR_URIDATA[attribute] ? node.getAttribute(attribute, 2) || '' : - ((node = node.attributes[attribute]) && node.value) || ''); - }, - - compile = - function(selector, source, mode) { - - var parts = typeof selector == 'string' ? selector.match(reSplitGroup) : selector; - - typeof source == 'string' || (source = ''); - - if (parts.length == 1) { - source += compileSelector(parts[0], mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } else { - var i = -1, seen = { }, token; - while ((token = parts[++i])) { - token = token.replace(reTrimSpaces, ''); - if (!seen[token] && (seen[token] = true)) { - source += compileSelector(token, mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } - } - } - - if (mode) - return Function('c,s,r,d,h,g,f,v', - 'var N,n,x=0,k=-1,e;main:while((e=c[++k])){' + source + '}return r;'); - else - return Function('e,s,r,d,h,g,f,v', - 'var N,n,x=0,k=e;' + source + 'return false;'); - }, - - FILTER = - 'var z=v[@]||(v[@]=[]),l=z.length-1;' + - 'while(l>=0&&z[l]!==e)--l;' + - 'if(l!==-1){break;}' + - 'z[z.length]=e;', - - compileSelector = - function(selector, source, mode) { - - var k = 0, expr, match, name, result, status, test, type; - - while (selector) { - - k++; - - if ((match = selector.match(Patterns.universal))) { - expr = ''; - } - - else if ((match = selector.match(Patterns.id))) { - source = 'if(' + (XML_DOCUMENT ? - 's.getAttr(e,"id")' : - '(e.submit?s.getAttr(e,"id"):e.id)') + - '=="' + match[1] + '"' + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.tagName))) { - source = 'if(e.nodeName' + (XML_DOCUMENT ? - '=="' + match[1] + '"' : TO_UPPER_CASE + - '=="' + match[1].toUpperCase() + '"') + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.className))) { - source = 'if((n=' + (XML_DOCUMENT ? - 'e.getAttribute("class")' : 'e.className') + - ')&&n.length&&(" "+' + (QUIRKS_MODE ? 'n.toLowerCase()' : 'n') + - '.replace(' + reWhiteSpace + '," ")+" ").indexOf(" ' + - (QUIRKS_MODE ? match[1].toLowerCase() : match[1]) + ' ")>-1' + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.attribute))) { - if (match[2] && !Operators[match[2]]) { - emit('Unsupported operator in attribute selectors "' + selector + '"'); - return ''; - } - name = match[1].toLowerCase(); - if (match[2] && match[4] && (type = Operators[match[2]])) { - test = name in INSENSITIVE_MAP; - match[4] = match[4].replace(/\\([0-9a-f]{2,2})/, '\\x$1'); - type = type.replace(/\%m/g, test ? match[4].toLowerCase() : match[4]); - expr = 'n=s.getAttr(e,"' + name + '")' + (test ? '.toLowerCase()' : '') + ';'; - } else if (!match[2]) { - if (REFLECTED[name]) { - test = 'default' + name.charAt(0).toUpperCase() + name.slice(1); - expr = 'n=e["' + test + '"];'; - type = 'n'; - } else { - expr = 'n=e.attributes["' + name + '"];'; - type = IE_LT_9 ? 'n&&n.specified' : 'n'; - } - } else if (match[2] == '!=' || match[2] == '=') { - expr = 'n=e.attributes["' + name + '"];'; - type = 'n&&n.value' + match[2] + '="' + match[4] + '"'; - } else { - expr = ''; - type = 'false'; - } - source = expr + 'if(' + type + '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.adjacent))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&(e=e.previousSibling)){if(e.nodeName>"@"){' + source + 'break;}}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.relative))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;e=e.parentNode.firstChild;while(e&&e!==N' + k + '){if(e.nodeName>"@"){' + source + '}e=e.nextSibling;}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.children))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + 'break;}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.ancestor))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + '}e=N' + k + ';'; - } - - else { - - expr = false; - status = false; - for (expr in Selectors) { - if ((match = selector.match(Selectors[expr].Expression)) && match[1]) { - result = Selectors[expr].Callback(match, source); - source = result.source; - status = result.status; - if (status) { break; } - } - } - if (!status) { - emit('Unknown pseudo-class selector "' + selector + '"'); - return ''; - } - if (!expr) { - emit('Unknown token in selector "' + selector + '"'); - return ''; - } - - } - - if (!match) { - emit('Invalid syntax in selector "' + selector + '"'); - return ''; - } - - selector = match && match[match.length - 1]; - } - - return source; - }, - - match = - function(element, selector, from, callback) { - - var parts; - - if (!(element && element.nodeName > '@')) { - emit('Invalid element argument'); - return false; - } else if (!selector || typeof selector != 'string') { - emit('Invalid selector argument'); - return false; - } else if (lastContext !== from) { - switchContext(from || (from = element.ownerDocument)); - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, element, from)); - - if (lastMatcher != selector) { - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleMatch = (parts = selector.match(reSplitGroup)).length < 2; - lastMatcher = selector; - lastPartsMatch = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return false; - } - } else parts = lastPartsMatch; - - if (!matchResolvers[selector] || matchContexts[selector] !== from) { - matchResolvers[selector] = compile(isSingleMatch ? [selector] : parts, '', false); - matchContexts[selector] = from; - } - - return matchResolvers[selector](element, Snapshot, [ ], doc, root, from, callback, { }); - }, - - first = - function(selector, from) { - return select(selector, from, function() { return false; })[0] || null; - }, - - select = - function(selector, from, callback) { - - var i, changed, element, elements, parts, token, original = selector; - - if (arguments.length === 0) { - emit('Missing required selector parameters'); - return [ ]; - } else if (selector === '') { - emit('Empty selector string'); - return [ ]; - } else if (typeof selector != 'string') { - return [ ]; - } else if (from && !(/1|9|11/).test(from.nodeType)) { - emit('Invalid context element'); - return [ ]; - } else if (lastContext !== from) { - switchContext(from || (from = doc)); - } - - if (Config.CACHING && (elements = Dom.loadResults(original, from, doc, root))) { - return callback ? concatCall([ ], elements, callback) : elements; - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, from)); - - if ((changed = lastSelector != selector)) { - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleSelect = (parts = selector.match(reSplitGroup)).length < 2; - lastSelector = selector; - lastPartsSelect = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return [ ]; - } - } else parts = lastPartsSelect; - - if (from.nodeType == 11) { - - elements = from.childNodes; - - } else if (isSingleSelect) { - - if (changed) { - parts = selector.match(reSplitToken); - token = parts[parts.length - 1]; - lastSlice = token.split(':not')[0]; - lastPosition = selector.length - token.length; - } - - if ((parts = lastSlice.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, from))) { - if (match(element, selector)) { - callback && callback(element); - elements = [ element ]; - } else elements = [ ]; - } - } - - else if ((parts = selector.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, doc))) { - if ('#' + token == selector) { - callback && callback(element); - elements = [ element ]; - } - if (/[>+~]/.test(selector)) { - from = element.parentNode; - } else { - selector = selector.replace('#' + token, '*'); - lastPosition -= token.length + 1; - from = element; - } - } else elements = [ ]; - } - - if (elements) { - Config.CACHING && Dom.saveResults(original, from, doc, elements); - return elements; - } - - if (!XML_DOCUMENT && GEBTN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) { - if ((elements = from.getElementsByTagName(token)).length === 0) return [ ]; - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*'); - } - - else if (!XML_DOCUMENT && GEBCN && (parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) { - if ((elements = from.getElementsByClassName(token.replace(/\\/g, ''))).length === 0) return [ ]; - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, - reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1)) ? '' : '*'); - } - - } - - if (!elements) { - if (IE_LT_9) { - elements = /^(?:applet|object)$/i.test(from.nodeName) ? - from.childNodes : from.all; - } else { - elements = from.getElementsByTagName('*'); - } - } - - if (!selectResolvers[selector] || selectContexts[selector] !== from) { - selectResolvers[selector] = compile(isSingleSelect ? [selector] : parts, REJECT_NODE, true); - selectContexts[selector] = from; - } - - elements = selectResolvers[selector](elements, Snapshot, [ ], doc, root, from, callback, { }); - - Config.CACHING && Dom.saveResults(original, from, doc, elements); - - return elements; - }, - - matchContexts = { }, - matchResolvers = { }, - - selectContexts = { }, - selectResolvers = { }, - - Snapshot = { - byId: _byId, - match: match, - select: select, - getAttr: getAttr - }; - - Tokens = { - prefixes: prefixes, - encoding: encoding, - operators: operators, - whitespace: whitespace, - identifier: identifier, - attributes: attributes, - combinators: combinators, - pseudoclass: pseudoclass, - pseudoparms: pseudoparms, - quotedvalue: quotedvalue - }; - - Dom.ACCEPT_NODE = ACCEPT_NODE; - - Dom.emit = emit; - - Dom.byId = byId; - Dom.match = match; - Dom.first = first; - Dom.select = select; - Dom.compile = compile; - Dom.configure = configure; - - Dom.Config = Config; - Dom.Operators = Operators; - Dom.Selectors = Selectors; - Dom.Snapshot = Snapshot; - Dom.Tokens = Tokens; - - Dom.setCache = function() { return; }; - Dom.loadResults = function() { return; }; - Dom.saveResults = function() { return; }; - - Dom.shortcuts = function(x) { return x; }; - - Dom.registerOperator = - function(symbol, resolver) { - Operators[symbol] || (Operators[symbol] = resolver); - }; - - Dom.registerSelector = - function(name, rexp, func) { - Selectors[name] || (Selectors[name] = { - Expression: rexp, - Callback: func - }); - }; - - switchContext(doc, true); - -}); diff --git a/node_modules/jsdom/node_modules/nwmatcher/src/OLD2/nwmatcher-base.js.GITHUB b/node_modules/jsdom/node_modules/nwmatcher/src/OLD2/nwmatcher-base.js.GITHUB deleted file mode 100644 index 29c6eea..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/src/OLD2/nwmatcher-base.js.GITHUB +++ /dev/null @@ -1,673 +0,0 @@ -/* - * Copyright (C) 2007-2012 Diego Perini - * All rights reserved. - * - * nwmatcher-base.js - A fast CSS selector engine and matcher - * - * Author: Diego Perini - * Version: 1.3.0 - * Created: 20070722 - * Release: 20121203 - * - * License: - * http://javascript.nwbox.com/NWMatcher/MIT-LICENSE - * Download: - * http://javascript.nwbox.com/NWMatcher/nwmatcher.js - */ - -(function(global, factory) { - - if (typeof module === 'object' && typeof exports === 'object') { - module.exports = function (browserGlobal) { - var exports = { }; - factory(browserGlobal, exports); - return exports; - }; - } else { - if (!global.NW) { - global.NW = { }; - } - if (!global.NW.Dom) { - global.NW.Dom = { }; - } - factory(global, global.NW.Dom); - } - -})(this, function(global, exports) { - - var version = 'nwmatcher-1.3.0', - - Dom = exports, - - doc = global.document, - root = doc.documentElement, - - slice = [ ].slice, - - isSingleMatch, - isSingleSelect, - - lastSlice, - lastContext, - lastPosition, - - lastMatcher, - lastSelector, - - lastPartsMatch, - lastPartsSelect, - - prefixes = '[#.:]?', - operators = '([~*^$|!]?={1})', - whitespace = '[\\x20\\t\\n\\r\\f]*', - combinators = '[\\x20]|[>+~][^>+~]', - pseudoparms = '(?:[-+]?\\d*n)?[-+]?\\d*', - - quotedvalue = '"[^"]*"' + "|'[^']*'", - skipgroup = '\\[.*\\]|\\(.*\\)|\\{.*\\}', - - encoding = '(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)', - identifier = '(?:-?[_a-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+', - - attrcheck = '(' + quotedvalue + '|' + identifier + ')', - attributes = whitespace + '(' + encoding + '+:?' + encoding + '+)' + - whitespace + '(?:' + operators + whitespace + attrcheck + ')?' + whitespace, - - attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'), - - pseudoclass = '((?:' + - pseudoparms + '|' + quotedvalue + '|' + - prefixes + '|' + encoding + '+|' + - '\\[' + attributes + '\\]|' + - '\\(.+\\)|' + whitespace + '|' + - ',)+)', - - extensions = '.+', - - standardValidator = - '(?=[\\x20\\t\\n\\r\\f]*[^>+~(){}<>])' + - '(' + - '\\*' + - '|(?:' + prefixes + identifier + ')' + - '|' + combinators + - '|\\[' + attributes + '\\]' + - '|\\(' + pseudoclass + '\\)' + - '|\\{' + extensions + '\\}' + - '|(?:,|' + whitespace + ')' + - ')+', - - extendedValidator = standardValidator.replace(pseudoclass, '.*'), - - reValidator = RegExp(standardValidator, 'g'), - - reTrimSpaces = RegExp('^' + - whitespace + '|' + whitespace + '$', 'g'), - - reSplitGroup = RegExp('(' + - '[^,\\\\()[\\]]+' + - '|\\[[^[\\]]*\\]|\\[.*\\]' + - '|\\([^()]+\\)|\\(.*\\)' + - '|\\{[^{}]+\\}|\\{.*\\}' + - '|\\\\.' + - ')+', 'g'), - - reSplitToken = RegExp('(' + - '\\[' + attributes + '\\]|' + - '\\(' + pseudoclass + '\\)|' + - '[^\\x20\\t\\n\\r\\f>+~]|\\\\.)+', 'g'), - - reWhiteSpace = /[\x20\t\n\r\f]+/g, - - reOptimizeSelector = RegExp(identifier + '|^$'), - - ATTR_BOOLEAN = { - checked: 1, disabled: 1, ismap: 1, - multiple: 1, readonly: 1, selected: 1 - }, - - ATTR_URIDATA = { - action: 2, cite: 2, codebase: 2, data: 2, href: 2, - longdesc: 2, lowsrc: 2, src: 2, usemap: 2 - }, - - Selectors = { }, - - Operators = { - '=': "n=='%m'", - '^=': "n.indexOf('%m')==0", - '*=': "n.indexOf('%m')>-1", - '|=': "(n+'-').indexOf('%m-')==0", - '~=': "(' '+n+' ').indexOf(' %m ')>-1", - '$=': "n.substr(n.length-'%m'.length)=='%m'" - }, - - Optimize = { - ID: RegExp('^\\*?#(' + encoding + '+)|' + skipgroup), - TAG: RegExp('^(' + encoding + '+)|' + skipgroup), - CLASS: RegExp('^\\*?\\.(' + encoding + '+$)|' + skipgroup) - }, - - Patterns = { - universal: /^\*(.*)/, - id: RegExp('^#(' + encoding + '+)(.*)'), - tagName: RegExp('^(' + encoding + '+)(.*)'), - className: RegExp('^\\.(' + encoding + '+)(.*)'), - attribute: RegExp('^\\[' + attrmatcher + '\\](.*)'), - children: /^[\x20\t\n\r\f]*\>[\x20\t\n\r\f]*(.*)/, - adjacent: /^[\x20\t\n\r\f]*\+[\x20\t\n\r\f]*(.*)/, - relative: /^[\x20\t\n\r\f]*\~[\x20\t\n\r\f]*(.*)/, - ancestor: /^[\x20\t\n\r\f]+(.*)/ - }, - - QUIRKS_MODE, - XML_DOCUMENT, - - GEBTN = 'getElementsByTagName' in doc, - GEBCN = 'getElementsByClassName' in doc, - - IE_LT_9 = typeof doc.addEventListener != 'function', - - INSENSITIVE_MAP = { - 'href': 1, 'lang': 1, 'src': 1, 'style': 1, 'title': 1, - 'type': 1, 'xmlns': 1, 'xml:lang': 1, 'xml:space': 1 - }, - - REFLECTED = { 'value': 1, 'checked': 1, 'selected': 1 }, - - TO_UPPER_CASE = IE_LT_9 ? '.toUpperCase()' : '', - - ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break main;else continue main;', - REJECT_NODE = IE_LT_9 ? 'if(e.nodeName<"A")continue;' : '', - - Config = { - CACHING: false, - SIMPLENOT: true, - UNIQUE_ID: true, - USE_HTML5: true, - VERBOSITY: true - }, - - configure = - function(option) { - if (typeof option == 'string') { return Config[option]; } - if (typeof option != 'object') { return false; } - for (var i in option) { - Config[i] = !!option[i]; - if (i == 'SIMPLENOT') { - matchContexts = { }; - matchResolvers = { }; - selectContexts = { }; - selectResolvers = { }; - } - } - reValidator = RegExp(Config.SIMPLENOT ? - standardValidator : extendedValidator, 'g'); - return true; - }, - - concatCall = - function(data, elements, callback) { - var i = -1, element; - while ((element = elements[++i])) { - if (false === callback(data[data.length] = element)) { break; } - } - return data; - }, - - emit = - function(message) { - if (Config.VERBOSITY) { throw SyntaxError(message); } - if (global.console && global.console.log) { - global.console.log(message); - } - }, - - switchContext = - function(from, force) { - var oldDoc = doc; - lastContext = from; - doc = from.ownerDocument || from; - if (force || oldDoc !== doc) { - root = doc.documentElement; - XML_DOCUMENT = doc.createElement('DiV').nodeName == 'DiV'; - QUIRKS_MODE = !XML_DOCUMENT && - typeof doc.compatMode == 'string' ? - doc.compatMode.indexOf('CSS') < 0 : - (function() { - var style = document.createElement('div').style; - return style && (style.width = 1) && style.width == '1px'; - })(); - - Config.CACHING && Dom.setCache(true, doc); - } - }, - - byIdRaw = - function(id, elements) { - var i = 0, element = null; - while ((element = elements[i])) { - if (element.getAttribute('id') == id) { - break; - } - ++i; - } - return element; - }, - - _byId = !('fileSize' in doc) ? - function(id, from) { - id = id.replace(/\\([^\\]{1})/g, '$1'); - return from.getElementById && from.getElementById(id) || - byIdRaw(id, from.getElementsByTagName('*')); - } : - function(id, from) { - var element = null; - id = id.replace(/\\([^\\]{1})/g, '$1'); - if (XML_DOCUMENT || from.nodeType != 9) { - return byIdRaw(id, from.getElementsByTagName('*')); - } - if ((element = from.getElementById(id)) && - element.name == id && from.getElementsByName) { - return byIdRaw(id, from.getElementsByName(id)); - } - return element; - }, - - byId = - function(id, from) { - switchContext(from || (from = doc)); - return _byId(id, from); - }, - - getAttribute = - function(node, attribute) { - if (typeof node[attribute] == 'object') { - return node.attributes[attribute] && - node.attributes[attribute].value || ''; - } - return ( - attribute == 'type' ? node.getAttribute(attribute) || '' : - ATTR_URIDATA[attribute] ? node.getAttribute(attribute, 2) || '' : - ATTR_BOOLEAN[attribute] ? node.getAttribute(attribute) ? attribute : 'false' : - ((node = node.getAttributeNode(attribute)) && node.value) || ''); - }, - - compile = - function(selector, source, mode) { - - var parts = typeof selector == 'string' ? selector.match(reSplitGroup) : selector; - - typeof source == 'string' || (source = ''); - - if (parts.length == 1) { - source += compileSelector(parts[0], mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } else { - var i = -1, seen = { }, token; - while ((token = parts[++i])) { - token = token.replace(reTrimSpaces, ''); - if (!seen[token] && (seen[token] = true)) { - source += compileSelector(token, mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } - } - } - - if (mode) - return Function('c,s,r,d,h,g,f,v', - 'var N,n,x=0,k=-1,e;main:while((e=c[++k])){' + source + '}return r;'); - else - return Function('e,s,r,d,h,g,f,v', - 'var N,n,x=0,k=e;' + source + 'return false;'); - }, - - FILTER = - 'var z=v[@]||(v[@]=[]),l=z.length-1;' + - 'while(l>=0&&z[l]!==e)--l;' + - 'if(l!==-1){break;}' + - 'z[z.length]=e;', - - compileSelector = - function(selector, source, mode) { - - var k = 0, expr, match, name, result, status, test, type; - - while (selector) { - - k++; - - if ((match = selector.match(Patterns.universal))) { - expr = ''; - } - - else if ((match = selector.match(Patterns.id))) { - source = 'if(' + (XML_DOCUMENT ? - 's.getAttribute(e,"id")' : - '(e.submit?s.getAttribute(e,"id"):e.id)') + - '=="' + match[1] + '"' + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.tagName))) { - source = 'if(e.nodeName' + (XML_DOCUMENT ? - '=="' + match[1] + '"' : TO_UPPER_CASE + - '=="' + match[1].toUpperCase() + '"') + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.className))) { - source = 'if((n=' + (XML_DOCUMENT ? - 'e.getAttribute("class")' : 'e.className') + - ')&&n.length&&(" "+' + (QUIRKS_MODE ? 'n.toLowerCase()' : 'n') + - '.replace(' + reWhiteSpace + '," ")+" ").indexOf(" ' + - (QUIRKS_MODE ? match[1].toLowerCase() : match[1]) + ' ")>-1' + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.attribute))) { - if (match[2] && !Operators[match[2]]) { - emit('Unsupported operator in attribute selectors "' + selector + '"'); - return ''; - } - name = match[1].toLowerCase(); - if (match[2] && match[4] && (type = Operators[match[2]])) { - test = name in INSENSITIVE_MAP; - match[4] = match[4].replace(/(\x22|\x27)/g, '\\$1'); - match[4] = match[4].replace(/\\([0-9a-f]{2,2})/, '\\x$1'); - type = type.replace(/\%m/g, match[4].toLowerCase()); - expr = 'n=s.getAttribute(e,"' + name + '").toLowerCase();'; - } else if (!match[2]) { - if (REFLECTED[name]) { - test = 'default' + name.charAt(0).toUpperCase() + name.slice(1); - expr = 'n=e["' + test + '"];'; - type = 'n'; - } else { - expr = 'n=e.attributes["' + name + '"];'; - type = IE_LT_9 ? 'n&&n.specified' : 'n'; - } - } else if (match[2] == '!=' || match[2] == '=') { - expr = 'n=e.attributes["' + name + '"];'; - match[4] = match[4].replace(/(\x22|\x27)/g, '\\$1'); - type = 'n&&n.value' + match[2] + '="' + match[4] + '"'; - } else { - expr = ''; - type = 'false'; - } - source = expr + 'if(' + type + '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.adjacent))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&(e=e.previousSibling)){if(e.nodeName>"@"){' + source + 'break;}}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.relative))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;e=e.parentNode.firstChild;while(e&&e!==N' + k + '){if(e.nodeName>"@"){' + source + '}e=e.nextSibling;}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.children))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + 'break;}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.ancestor))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + '}e=N' + k + ';'; - } - - else { - - expr = false; - status = false; - for (expr in Selectors) { - if ((match = selector.match(Selectors[expr].Expression)) && match[1]) { - result = Selectors[expr].Callback(match, source); - source = result.source; - status = result.status; - if (status) { break; } - } - } - - if (!status) { - emit('Unknown pseudo-class selector "' + selector + '"'); - return ''; - } - - if (!expr) { - emit('Unknown token in selector "' + selector + '"'); - return ''; - } - - } - - if (!match) { - emit('Invalid syntax in selector "' + selector + '"'); - return ''; - } - - selector = match && match[match.length - 1]; - } - - return source; - }, - - match = - function(element, selector, from, callback) { - - var parts; - - if (!(element && element.nodeName > '@')) { - emit('Invalid element argument'); - return false; - } else if (!selector || typeof selector != 'string') { - emit('Invalid selector argument'); - return false; - } else if (lastContext !== from) { - switchContext(from || (from = element.ownerDocument)); - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, element, from)); - - if (lastMatcher != selector) { - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleMatch = (parts = selector.match(reSplitGroup)).length < 2; - lastMatcher = selector; - lastPartsMatch = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return false; - } - } else parts = lastPartsMatch; - - if (!matchResolvers[selector] || matchContexts[selector] !== from) { - matchResolvers[selector] = compile(isSingleMatch ? [selector] : parts, '', false); - matchContexts[selector] = from; - } - - return matchResolvers[selector](element, Snapshot, [ ], doc, root, from, callback, { }); - }, - - first = - function(selector, from) { - return select(selector, from, function() { return false; })[0] || null; - }, - - select = - function(selector, from, callback) { - - var i, changed, element, elements, parts, token, original = selector; - - if (arguments.length === 0) { - emit('Not enough arguments'); - return [ ]; - } else if (typeof selector != 'string') { - return [ ]; - } else if (!(/[>+~*\w\u00a1-\uffff]/.test(selector))) { - emit('Invalid or illegal selector string'); - return [ ]; - } else if (from && !(/1|9|11/).test(from.nodeType)) { - emit('Invalid or illegal context element'); - return [ ]; - } else if (lastContext !== from) { - switchContext(from || (from = doc)); - } - - if (Config.CACHING && (elements = Dom.loadResults(original, from, doc, root))) { - return callback ? concatCall([ ], elements, callback) : elements; - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, from)); - - if ((changed = lastSelector != selector)) { - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleSelect = (parts = selector.match(reSplitGroup)).length < 2; - lastSelector = selector; - lastPartsSelect = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return [ ]; - } - } else parts = lastPartsSelect; - - if (from.nodeType == 11) { - - elements = from.childNodes; - - } else if (isSingleSelect) { - - if (changed) { - parts = selector.match(reSplitToken); - token = parts[parts.length - 1]; - lastSlice = token.split(':not')[0]; - lastPosition = selector.length - token.length; - } - - if (Config.UNIQUE_ID && (parts = lastSlice.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, from))) { - if (match(element, selector)) { - callback && callback(element); - elements = [ element ]; - } else elements = [ ]; - } - } - - else if (Config.UNIQUE_ID && (parts = selector.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, doc))) { - if ('#' + token == selector) { - callback && callback(element); - elements = [ element ]; - } else if (/[>+~]/.test(selector)) { - from = element.parentNode; - } else { - from = element; - } - } else elements = [ ]; - } - - if (elements) { - Config.CACHING && Dom.saveResults(original, from, doc, elements); - return elements; - } - - if (!XML_DOCUMENT && GEBTN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) { - if ((elements = from.getElementsByTagName(token)).length === 0) return [ ]; - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*'); - } - - else if (!XML_DOCUMENT && GEBCN && (parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) { - if ((elements = from.getElementsByClassName(token.replace(/\\([^\\]{1})/g, '$1'))).length === 0) return [ ]; - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, - reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1)) ? '' : '*'); - } - - } - - if (!elements) { - if (IE_LT_9) { - elements = /^(?:applet|object)$/i.test(from.nodeName) ? - from.childNodes : from.all; - } else { - elements = from.getElementsByTagName('*'); - } - } - - if (!selectResolvers[selector] || selectContexts[selector] !== from) { - selectResolvers[selector] = compile(isSingleSelect ? [selector] : parts, REJECT_NODE, true); - selectContexts[selector] = from; - } - - elements = selectResolvers[selector](elements, Snapshot, [ ], doc, root, from, callback, { }); - - Config.CACHING && Dom.saveResults(original, from, doc, elements); - - return elements; - }, - - matchContexts = { }, - matchResolvers = { }, - - selectContexts = { }, - selectResolvers = { }, - - Snapshot = { - byId: _byId, - match: match, - select: select, - getAttribute: getAttribute - }; - - Tokens = { - prefixes: prefixes, - encoding: encoding, - operators: operators, - whitespace: whitespace, - identifier: identifier, - attributes: attributes, - combinators: combinators, - pseudoclass: pseudoclass, - pseudoparms: pseudoparms, - quotedvalue: quotedvalue - }; - - Dom.ACCEPT_NODE = ACCEPT_NODE; - - Dom.emit = emit; - - Dom.byId = byId; - Dom.match = match; - Dom.first = first; - Dom.select = select; - Dom.compile = compile; - Dom.configure = configure; - - Dom.Config = Config; - Dom.Operators = Operators; - Dom.Selectors = Selectors; - Dom.Snapshot = Snapshot; - Dom.Tokens = Tokens; - - Dom.setCache = function() { return; }; - Dom.loadResults = function() { return; }; - Dom.saveResults = function() { return; }; - - Dom.shortcuts = function(x) { return x; }; - - Dom.registerOperator = - function(symbol, resolver) { - Operators[symbol] || (Operators[symbol] = resolver); - }; - - Dom.registerSelector = - function(name, rexp, func) { - Selectors[name] || (Selectors[name] = { - Expression: rexp, - Callback: func - }); - }; - - switchContext(doc, true); - -}); diff --git a/node_modules/jsdom/node_modules/nwmatcher/src/OLD2/nwmatcher-base.js.NEW b/node_modules/jsdom/node_modules/nwmatcher/src/OLD2/nwmatcher-base.js.NEW deleted file mode 100644 index 088b80c..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/src/OLD2/nwmatcher-base.js.NEW +++ /dev/null @@ -1,697 +0,0 @@ -/* - * Copyright (C) 2007-2012 Diego Perini - * All rights reserved. - * - * nwmatcher-base.js - A fast CSS selector engine and matcher - * - * Author: Diego Perini - * Version: 1.3.0 - * Created: 20070722 - * Release: 20121203 - * - * License: - * http://javascript.nwbox.com/NWMatcher/MIT-LICENSE - * Download: - * http://javascript.nwbox.com/NWMatcher/nwmatcher.js - */ - -(function(global, factory) { - - if (typeof module === 'object' && typeof exports === 'object') { - module.exports = function (browserGlobal) { - var exports = { }; - factory(browserGlobal, exports); - return exports; - }; - } else { - if (!global.NW) { - global.NW = { }; - } - if (!global.NW.Dom) { - global.NW.Dom = { }; - } - factory(global, global.NW.Dom); - } - -})(this, function(global, exports) { - - var version = 'nwmatcher-1.3.0', - - Dom = exports, - - doc = global.document, - root = doc.documentElement, - - slice = [ ].slice, - - isSingleMatch, - isSingleSelect, - - lastSlice, - lastContext, - lastPosition, - - lastMatcher, - lastSelector, - - lastPartsMatch, - lastPartsSelect, - - prefixes = '[#.:]?', - operators = '([~*^$|!]?={1})', - whitespace = '[\\x20\\t\\n\\r\\f]*', - combinators = '[\\x20]|[>+~][^>+~]', - pseudoparms = '(?:[-+]?\\d*n)?[-+]?\\d*', - - quotedvalue = '"[^"]*"' + "|'[^']*'", - skipgroup = '\\[.*\\]|\\(.*\\)|\\{.*\\}', - - encoding = '(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)', - identifier = '(?:-?[_a-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+', - - attrcheck = '(' + quotedvalue + '|' + identifier + ')', - attributes = whitespace + '(' + encoding + '+:?' + encoding + '+)' + - whitespace + '(?:' + operators + whitespace + attrcheck + ')?' + whitespace, - - attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'), - - pseudoclass = '((?:' + - pseudoparms + '|' + quotedvalue + '|' + - prefixes + '|' + encoding + '+|' + - '\\[' + attributes + '\\]|' + - '\\(.+\\)|' + whitespace + '|' + - ',)+)', - - extensions = '.+', - - standardValidator = - '(?=[\\x20\\t\\n\\r\\f]*[^>+~(){}<>])' + - '(' + - '\\*' + - '|(?:' + prefixes + identifier + ')' + - '|' + combinators + - '|\\[' + attributes + '\\]' + - '|\\(' + pseudoclass + '\\)' + - '|\\{' + extensions + '\\}' + - '|(?:,|' + whitespace + ')' + - ')+', - - extendedValidator = standardValidator.replace(pseudoclass, '.*'), - - reValidator = RegExp(standardValidator, 'g'), - - reTrimSpaces = RegExp('^' + - whitespace + '|' + whitespace + '$', 'g'), - - reSplitGroup = RegExp('(' + - '[^,\\\\()[\\]]+' + - '|\\[[^[\\]]*\\]|\\[.*\\]' + - '|\\([^()]+\\)|\\(.*\\)' + - '|\\{[^{}]+\\}|\\{.*\\}' + - '|\\\\.' + - ')+', 'g'), - - reSplitToken = RegExp('(' + - '\\[' + attributes + '\\]|' + - '\\(' + pseudoclass + '\\)|' + - '[^\\x20\\t\\n\\r\\f>+~]|\\\\.)+', 'g'), - - reWhiteSpace = /[\x20\t\n\r\f]+/g, - - reOptimizeSelector = RegExp(identifier + '|^$'), - - ATTR_DEFAULT = { - value: 'defaultValue', - checked: 'defaultChecked', - selected: 'defaultSelected' - }, - - ATTR_BOOLEAN = { - checked: 1, disabled: 1, ismap: 1, - multiple: 1, readonly: 1, selected: 1 - }, - - ATTR_URIDATA = { - action: 2, cite: 2, codebase: 2, data: 2, href: 2, - longdesc: 2, lowsrc: 2, src: 2, usemap: 2 - }, - - Selectors = { }, - - Operators = { - '=': "n=='%m'", - '^=': "n.indexOf('%m')==0", - '*=': "n.indexOf('%m')>-1", - '|=': "(n+'-').indexOf('%m-')==0", - '~=': "(' '+n+' ').indexOf(' %m ')>-1", - '$=': "n.substr(n.length-'%m'.length)=='%m'" - }, - - Optimize = { - ID: RegExp('^\\*?#(' + encoding + '+)|' + skipgroup), - TAG: RegExp('^(' + encoding + '+)|' + skipgroup), - CLASS: RegExp('^\\*?\\.(' + encoding + '+$)|' + skipgroup) - }, - - Patterns = { - universal: /^\*(.*)/, - id: RegExp('^#(' + encoding + '+)(.*)'), - tagName: RegExp('^(' + encoding + '+)(.*)'), - className: RegExp('^\\.(' + encoding + '+)(.*)'), - attribute: RegExp('^\\[' + attrmatcher + '\\](.*)'), - children: /^[\x20\t\n\r\f]*\>[\x20\t\n\r\f]*(.*)/, - adjacent: /^[\x20\t\n\r\f]*\+[\x20\t\n\r\f]*(.*)/, - relative: /^[\x20\t\n\r\f]*\~[\x20\t\n\r\f]*(.*)/, - ancestor: /^[\x20\t\n\r\f]+(.*)/ - }, - - QUIRKS_MODE, - XML_DOCUMENT, - - GEBTN = 'getElementsByTagName' in doc, - GEBCN = 'getElementsByClassName' in doc, - - IE_LT_9 = typeof doc.addEventListener != 'function', - - INSENSITIVE_MAP = { - 'href': 1, 'lang': 1, 'src': 1, 'style': 1, 'title': 1, - 'type': 1, 'xmlns': 1, 'xml:lang': 1, 'xml:space': 1 - }, - - TO_UPPER_CASE = IE_LT_9 ? '.toUpperCase()' : '', - - ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break main;else continue main;', - REJECT_NODE = IE_LT_9 ? 'if(e.nodeName<"A")continue;' : '', - - Config = { - CACHING: false, - SIMPLENOT: true, - UNIQUE_ID: true, - USE_HTML5: true, - VERBOSITY: true - }, - - configure = - function(option) { - if (typeof option == 'string') { return Config[option]; } - if (typeof option != 'object') { return false; } - for (var i in option) { - Config[i] = !!option[i]; - if (i == 'SIMPLENOT') { - matchContexts = { }; - matchResolvers = { }; - selectContexts = { }; - selectResolvers = { }; - } - } - reValidator = RegExp(Config.SIMPLENOT ? - standardValidator : extendedValidator, 'g'); - return true; - }, - - concatCall = - function(data, elements, callback) { - var i = -1, element; - while ((element = elements[++i])) { - if (false === callback(data[data.length] = element)) { break; } - } - return data; - }, - - emit = - function(message) { - if (Config.VERBOSITY) { throw SyntaxError(message); } - if (global.console && global.console.log) { - global.console.log(message); - } - }, - - switchContext = - function(from, force) { - var oldDoc = doc; - lastContext = from; - doc = from.ownerDocument || from; - if (force || oldDoc !== doc) { - root = doc.documentElement; - XML_DOCUMENT = doc.createElement('DiV').nodeName == 'DiV'; - QUIRKS_MODE = !XML_DOCUMENT && - typeof doc.compatMode == 'string' ? - doc.compatMode.indexOf('CSS') < 0 : - (function() { - var style = document.createElement('div').style; - return style && (style.width = 1) && style.width == '1px'; - })(); - - Config.CACHING && Dom.setCache(true, doc); - } - }, - - byIdRaw = - function(id, elements) { - var i = 0, element = null; - while ((element = elements[i])) { - if (element.getAttribute('id') == id) { - break; - } - ++i; - } - return element; - }, - - _byId = !('fileSize' in doc) ? - function(id, from) { - id = id.replace(/\\([^\\]{1})/g, '$1'); - return from.getElementById && from.getElementById(id) || - byIdRaw(id, from.getElementsByTagName('*')); - } : - function(id, from) { - var element = null; - id = id.replace(/\\([^\\]{1})/g, '$1'); - if (XML_DOCUMENT || from.nodeType != 9) { - return byIdRaw(id, from.getElementsByTagName('*')); - } - if ((element = from.getElementById(id)) && - element.name == id && from.getElementsByName) { - return byIdRaw(id, from.getElementsByName(id)); - } - return element; - }, - - byId = - function(id, from) { - switchContext(from || (from = doc)); - return _byId(id, from); - }, - - getAttribute = - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (typeof node[attribute] == 'object') { - return node.attributes[attribute] && - node.attributes[attribute].value || ''; - } - return ( - attribute == 'type' ? node.getAttribute(attribute) || '' : - ATTR_URIDATA[attribute] ? node.getAttribute(attribute, 2) || '' : - ATTR_BOOLEAN[attribute] ? node.getAttribute(attribute) ? attribute : 'false' : - ((node = node.getAttributeNode(attribute)) && node.value) || ''); - }, - - hasAttribute = root.hasAttribute ? - function(node, attribute) { - node.hasAttribute(attribute); - } : - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (ATTR_DEFAULT[attribute]) { - return !!node[ATTR_DEFAULT[attribute]]; - } - node = node.getAttributeNode(attribute); - return !!(node && (node.specified || node.nodeValue)); - }, - - compile = - function(selector, source, mode) { - - var parts = typeof selector == 'string' ? selector.match(reSplitGroup) : selector; - - typeof source == 'string' || (source = ''); - - if (parts.length == 1) { - source += compileSelector(parts[0], mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } else { - var i = -1, seen = { }, token; - while ((token = parts[++i])) { - token = token.replace(reTrimSpaces, ''); - if (!seen[token] && (seen[token] = true)) { - source += compileSelector(token, mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } - } - } - - if (mode) - return Function('c,s,r,d,h,g,f,v', - 'var N,n,x=0,k=-1,e;main:while((e=c[++k])){' + source + '}return r;'); - else - return Function('e,s,r,d,h,g,f,v', - 'var N,n,x=0,k=e;' + source + 'return false;'); - }, - - FILTER = - 'var z=v[@]||(v[@]=[]),l=z.length-1;' + - 'while(l>=0&&z[l]!==e)--l;' + - 'if(l!==-1){break;}' + - 'z[z.length]=e;', - - compileSelector = - function(selector, source, mode) { - - var k = 0, expr, match, name, result, status, test, type; - - while (selector) { - - k++; - - if ((match = selector.match(Patterns.universal))) { - expr = ''; - } - - else if ((match = selector.match(Patterns.id))) { - source = 'if(' + (XML_DOCUMENT ? - 's.getAttribute(e,"id")' : - '(e.submit?s.getAttribute(e,"id"):e.id)') + - '=="' + match[1] + '"' + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.tagName))) { - source = 'if(e.nodeName' + (XML_DOCUMENT ? - '=="' + match[1] + '"' : TO_UPPER_CASE + - '=="' + match[1].toUpperCase() + '"') + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.className))) { - source = 'if((n=' + (XML_DOCUMENT ? - 'e.getAttribute("class")' : 'e.className') + - ')&&n.length&&(" "+' + (QUIRKS_MODE ? 'n.toLowerCase()' : 'n') + - '.replace(' + reWhiteSpace + '," ")+" ").indexOf(" ' + - (QUIRKS_MODE ? match[1].toLowerCase() : match[1]) + ' ")>-1' + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.attribute))) { - if (match[2] && !Operators[match[2]]) { - emit('Unsupported operator in attribute selectors "' + selector + '"'); - return ''; - } - expr = ''; - type = 'false'; - name = match[1].toLowerCase(); - if (match[2] && match[4] && (type = Operators[match[2]])) { - test = match[4].replace(/(\x22|\x27)/g, '\\$1'); - test = test.replace(/\\([0-9a-f]{2,2})/g, '\\x$1'); - expr = 'n=s.getAttribute(e,"' + name + '").toLowerCase();'; - type = type.replace(/\%m/g, test.toLowerCase()); - } else if (!match[2]) { - expr = 'n=s.hasAttribute(e,"' + name + '");'; - type = 'n'; -/* - expr = 'n=e.' + (IE_LT_9 ? - 'getAttributeNode("' + name + '");' : - 'hasAttribute("' + name + '");'); - type = IE_LT_9 ? ATTR_DEFAULT[name] ? - '!!e.' + ATTR_DEFAULT[name] : - 'n&&(n.specified||n.nodeValue)' : 'n'; -*/ - } else if (match[2] == '!=' || match[2] == '=') { - test = match[4].replace(/(\x22|\x27)/g, '\\$1'); - expr = 'n=e.getAttribute("' + name + '");'; - type = 'n' + match[2] + '="' + test + '"'; - } - source = expr + 'if(' + type + '){' + source + '}'; -//if (name == 'multiple') alert(source); - } - - else if ((match = selector.match(Patterns.adjacent))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&(e=e.previousSibling)){if(e.nodeName>"@"){' + source + 'break;}}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.relative))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;e=e.parentNode.firstChild;while(e&&e!==N' + k + '){if(e.nodeName>"@"){' + source + '}e=e.nextSibling;}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.children))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + 'break;}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.ancestor))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + '}e=N' + k + ';'; - } - - else { - - expr = false; - status = false; - for (expr in Selectors) { - if ((match = selector.match(Selectors[expr].Expression)) && match[1]) { - result = Selectors[expr].Callback(match, source); - source = result.source; - status = result.status; - if (status) { break; } - } - } - - if (!status) { - emit('Unknown pseudo-class selector "' + selector + '"'); - return ''; - } - - if (!expr) { - emit('Unknown token in selector "' + selector + '"'); - return ''; - } - - } - - if (!match) { - emit('Invalid syntax in selector "' + selector + '"'); - return ''; - } - - selector = match && match[match.length - 1]; - } - - return source; - }, - - match = - function(element, selector, from, callback) { - - var parts; - - if (!(element && element.nodeName > '@')) { - emit('Invalid element argument'); - return false; - } else if (!selector || typeof selector != 'string') { - emit('Invalid selector argument'); - return false; - } else if (lastContext !== from) { - switchContext(from || (from = element.ownerDocument)); - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, element, from)); - - if (lastMatcher != selector) { - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleMatch = (parts = selector.match(reSplitGroup)).length < 2; - lastMatcher = selector; - lastPartsMatch = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return false; - } - } else parts = lastPartsMatch; - - if (!matchResolvers[selector] || matchContexts[selector] !== from) { - matchResolvers[selector] = compile(isSingleMatch ? [selector] : parts, '', false); - matchContexts[selector] = from; - } - - return matchResolvers[selector](element, Snapshot, [ ], doc, root, from, callback, { }); - }, - - first = - function(selector, from) { - return select(selector, from, function() { return false; })[0] || null; - }, - - select = - function(selector, from, callback) { - - var i, changed, element, elements, parts, token, original = selector; - - if (arguments.length === 0) { - emit('Not enough arguments'); - return [ ]; - } else if (typeof selector != 'string') { - return [ ]; - } else if (!(/[>+~*\w\u00a1-\uffff]/.test(selector))) { - emit('Invalid or illegal selector string'); - return [ ]; - } else if (from && !(/1|9|11/).test(from.nodeType)) { - emit('Invalid or illegal context element'); - return [ ]; - } else if (lastContext !== from) { - switchContext(from || (from = doc)); - } - - if (Config.CACHING && (elements = Dom.loadResults(original, from, doc, root))) { - return callback ? concatCall([ ], elements, callback) : elements; - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, from)); - - if ((changed = lastSelector != selector)) { - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleSelect = (parts = selector.match(reSplitGroup)).length < 2; - lastSelector = selector; - lastPartsSelect = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return [ ]; - } - } else parts = lastPartsSelect; - - if (from.nodeType == 11) { - - elements = from.childNodes; - - } else if (isSingleSelect) { - - if (changed) { - parts = selector.match(reSplitToken); - token = parts[parts.length - 1]; - lastSlice = token.split(':not')[0]; - lastPosition = selector.length - token.length; - } - - if (Config.UNIQUE_ID && (parts = lastSlice.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, from))) { - if (match(element, selector)) { - callback && callback(element); - elements = [ element ]; - } else elements = [ ]; - } - } - - else if (Config.UNIQUE_ID && (parts = selector.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, doc))) { - if ('#' + token == selector) { - callback && callback(element); - elements = [ element ]; - } else if (/[>+~]/.test(selector)) { - from = element.parentNode; - } else { - from = element; - } - } else elements = [ ]; - } - - if (elements) { - Config.CACHING && Dom.saveResults(original, from, doc, elements); - return elements; - } - - if (!XML_DOCUMENT && GEBTN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) { - if ((elements = from.getElementsByTagName(token)).length === 0) return [ ]; - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*'); - } - - else if (!XML_DOCUMENT && GEBCN && (parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) { - if ((elements = from.getElementsByClassName(token.replace(/\\([^\\]{1})/g, '$1'))).length === 0) return [ ]; - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, - reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1)) ? '' : '*'); - } - - } - - if (!elements) { - if (IE_LT_9) { - elements = /^(?:applet|object)$/i.test(from.nodeName) ? - from.childNodes : from.all; - } else { - elements = from.getElementsByTagName('*'); - } - } - - if (!selectResolvers[selector] || selectContexts[selector] !== from) { - selectResolvers[selector] = compile(isSingleSelect ? [selector] : parts, REJECT_NODE, true); - selectContexts[selector] = from; - } - - elements = selectResolvers[selector](elements, Snapshot, [ ], doc, root, from, callback, { }); - - Config.CACHING && Dom.saveResults(original, from, doc, elements); - - return elements; - }, - - FN = function(x) { return x; }, - - matchContexts = { }, - matchResolvers = { }, - - selectContexts = { }, - selectResolvers = { }, - - Snapshot = { - byId: _byId, - match: match, - select: select, - getAttribute: getAttribute, - hasAttribute: hasAttribute - }; - - Tokens = { - prefixes: prefixes, - encoding: encoding, - operators: operators, - whitespace: whitespace, - identifier: identifier, - attributes: attributes, - combinators: combinators, - pseudoclass: pseudoclass, - pseudoparms: pseudoparms, - quotedvalue: quotedvalue - }; - - Dom.ACCEPT_NODE = ACCEPT_NODE; - - Dom.emit = emit; - - Dom.byId = byId; - Dom.match = match; - Dom.first = first; - Dom.select = select; - Dom.compile = compile; - Dom.configure = configure; - - Dom.Config = Config; - - Dom.Operators = Operators; - Dom.Selectors = Selectors; - - Dom.Snapshot = Snapshot; - Dom.Tokens = Tokens; - - Dom.loadResults = FN; - Dom.saveResults = FN; - Dom.setCache = FN; - - Dom.shortcuts = FN; - - Dom.registerOperator = - function(symbol, resolver) { - Operators[symbol] || (Operators[symbol] = resolver); - }; - - Dom.registerSelector = - function(name, rexp, func) { - Selectors[name] || (Selectors[name] = { - Expression: rexp, - Callback: func - }); - }; - - switchContext(doc, true); - -}); diff --git a/node_modules/jsdom/node_modules/nwmatcher/src/OLD2/nwmatcher-base.js.NEW2 b/node_modules/jsdom/node_modules/nwmatcher/src/OLD2/nwmatcher-base.js.NEW2 deleted file mode 100644 index 7ad69c0..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/src/OLD2/nwmatcher-base.js.NEW2 +++ /dev/null @@ -1,686 +0,0 @@ -/* - * Copyright (C) 2007-2012 Diego Perini - * All rights reserved. - * - * nwmatcher-base.js - A fast CSS selector engine and matcher - * - * Author: Diego Perini - * Version: 1.3.0 - * Created: 20070722 - * Release: 20121203 - * - * License: - * http://javascript.nwbox.com/NWMatcher/MIT-LICENSE - * Download: - * http://javascript.nwbox.com/NWMatcher/nwmatcher.js - */ - -(function(global, factory) { - - if (typeof module === 'object' && typeof exports === 'object') { - module.exports = function (browserGlobal) { - var exports = { }; - factory(browserGlobal, exports); - return exports; - }; - } else { - if (!global.NW) { - global.NW = { }; - } - if (!global.NW.Dom) { - global.NW.Dom = { }; - } - factory(global, global.NW.Dom); - } - -})(this, function(global, exports) { - - var version = 'nwmatcher-1.3.0', - - Dom = exports, - - doc = global.document, - root = doc.documentElement, - - slice = [ ].slice, - - isSingleMatch, - isSingleSelect, - - lastSlice, - lastContext, - lastPosition, - - lastMatcher, - lastSelector, - - lastPartsMatch, - lastPartsSelect, - - prefixes = '[#.:]?', - operators = '([~*^$|!]?={1})', - whitespace = '[\\x20\\t\\n\\r\\f]*', - combinators = '[\\x20]|[>+~][^>+~]', - pseudoparms = '(?:[-+]?\\d*n)?[-+]?\\d*', - - quotedvalue = '"[^"]*"' + "|'[^']*'", - skipgroup = '\\[.*\\]|\\(.*\\)|\\{.*\\}', - - encoding = '(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)', - identifier = '(?:-?[_a-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+', - - attrcheck = '(' + quotedvalue + '|' + identifier + ')', - attributes = whitespace + '(' + encoding + '+:?' + encoding + '+)' + - whitespace + '(?:' + operators + whitespace + attrcheck + ')?' + whitespace, - - attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'), - - pseudoclass = '((?:' + - pseudoparms + '|' + quotedvalue + '|' + - prefixes + '|' + encoding + '+|' + - '\\[' + attributes + '\\]|' + - '\\(.+\\)|' + whitespace + '|' + - ',)+)', - - extensions = '.+', - - standardValidator = - '(?=[\\x20\\t\\n\\r\\f]*[^>+~(){}<>])' + - '(' + - '\\*' + - '|(?:' + prefixes + identifier + ')' + - '|' + combinators + - '|\\[' + attributes + '\\]' + - '|\\(' + pseudoclass + '\\)' + - '|\\{' + extensions + '\\}' + - '|(?:,|' + whitespace + ')' + - ')+', - - extendedValidator = standardValidator.replace(pseudoclass, '.*'), - - reValidator = RegExp(standardValidator, 'g'), - - reTrimSpaces = RegExp('^' + - whitespace + '|' + whitespace + '$', 'g'), - - reSplitGroup = RegExp('(' + - '[^,\\\\()[\\]]+' + - '|\\[[^[\\]]*\\]|\\[.*\\]' + - '|\\([^()]+\\)|\\(.*\\)' + - '|\\{[^{}]+\\}|\\{.*\\}' + - '|\\\\.' + - ')+', 'g'), - - reSplitToken = RegExp('(' + - '\\[' + attributes + '\\]|' + - '\\(' + pseudoclass + '\\)|' + - '[^\\x20\\t\\n\\r\\f>+~]|\\\\.)+', 'g'), - - reWhiteSpace = /[\x20\t\n\r\f]+/g, - - reOptimizeSelector = RegExp(identifier + '|^$'), - - ATTR_DEFAULT = { - value: 'defaultValue', - checked: 'defaultChecked', - selected: 'defaultSelected' - }, - - ATTR_BOOLEAN = { - checked: 1, disabled: 1, ismap: 1, - multiple: 1, readonly: 1, selected: 1 - }, - - ATTR_URIDATA = { - action: 2, cite: 2, codebase: 2, data: 2, href: 2, - longdesc: 2, lowsrc: 2, src: 2, usemap: 2 - }, - - Selectors = { }, - - Operators = { - '=': "n=='%m'", - '^=': "n.indexOf('%m')==0", - '*=': "n.indexOf('%m')>-1", - '|=': "(n+'-').indexOf('%m-')==0", - '~=': "(' '+n+' ').indexOf(' %m ')>-1", - '$=': "n.substr(n.length-'%m'.length)=='%m'" - }, - - Optimize = { - ID: RegExp('^\\*?#(' + encoding + '+)|' + skipgroup), - TAG: RegExp('^(' + encoding + '+)|' + skipgroup), - CLASS: RegExp('^\\*?\\.(' + encoding + '+$)|' + skipgroup) - }, - - Patterns = { - universal: /^\*(.*)/, - id: RegExp('^#(' + encoding + '+)(.*)'), - tagName: RegExp('^(' + encoding + '+)(.*)'), - className: RegExp('^\\.(' + encoding + '+)(.*)'), - attribute: RegExp('^\\[' + attrmatcher + '\\](.*)'), - children: /^[\x20\t\n\r\f]*\>[\x20\t\n\r\f]*(.*)/, - adjacent: /^[\x20\t\n\r\f]*\+[\x20\t\n\r\f]*(.*)/, - relative: /^[\x20\t\n\r\f]*\~[\x20\t\n\r\f]*(.*)/, - ancestor: /^[\x20\t\n\r\f]+(.*)/ - }, - - QUIRKS_MODE, - XML_DOCUMENT, - - GEBTN = 'getElementsByTagName' in doc, - GEBCN = 'getElementsByClassName' in doc, - - IE_LT_9 = typeof doc.addEventListener != 'function', - - INSENSITIVE_MAP = { - 'href': 1, 'lang': 1, 'src': 1, 'style': 1, 'title': 1, - 'type': 1, 'xmlns': 1, 'xml:lang': 1, 'xml:space': 1 - }, - - TO_UPPER_CASE = IE_LT_9 ? '.toUpperCase()' : '', - - ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break main;else continue main;', - REJECT_NODE = IE_LT_9 ? 'if(e.nodeName<"A")continue;' : '', - - Config = { - CACHING: false, - SIMPLENOT: true, - UNIQUE_ID: true, - USE_HTML5: true, - VERBOSITY: true - }, - - configure = - function(option) { - if (typeof option == 'string') { return Config[option]; } - if (typeof option != 'object') { return false; } - for (var i in option) { - Config[i] = !!option[i]; - if (i == 'SIMPLENOT') { - matchContexts = { }; - matchResolvers = { }; - selectContexts = { }; - selectResolvers = { }; - } - } - reValidator = RegExp(Config.SIMPLENOT ? - standardValidator : extendedValidator, 'g'); - return true; - }, - - concatCall = - function(data, elements, callback) { - var i = -1, element; - while ((element = elements[++i])) { - if (false === callback(data[data.length] = element)) { break; } - } - return data; - }, - - emit = - function(message) { - if (Config.VERBOSITY) { throw SyntaxError(message); } - if (global.console && global.console.log) { - global.console.log(message); - } - }, - - switchContext = - function(from, force) { - var oldDoc = doc; - lastContext = from; - doc = from.ownerDocument || from; - if (force || oldDoc !== doc) { - root = doc.documentElement; - XML_DOCUMENT = doc.createElement('DiV').nodeName == 'DiV'; - QUIRKS_MODE = !XML_DOCUMENT && - typeof doc.compatMode == 'string' ? - doc.compatMode.indexOf('CSS') < 0 : - (function() { - var style = document.createElement('div').style; - return style && (style.width = 1) && style.width == '1px'; - })(); - - Config.CACHING && Dom.setCache(true, doc); - } - }, - - byIdRaw = - function(id, elements) { - var i = 0, element = null; - while ((element = elements[i])) { - if (element.getAttribute('id') == id) { - break; - } - ++i; - } - return element; - }, - - _byId = !('fileSize' in doc) ? - function(id, from) { - id = id.replace(/\\([^\\]{1})/g, '$1'); - return from.getElementById && from.getElementById(id) || - byIdRaw(id, from.getElementsByTagName('*')); - } : - function(id, from) { - var element = null; - id = id.replace(/\\([^\\]{1})/g, '$1'); - if (XML_DOCUMENT || from.nodeType != 9) { - return byIdRaw(id, from.getElementsByTagName('*')); - } - if ((element = from.getElementById(id)) && - element.name == id && from.getElementsByName) { - return byIdRaw(id, from.getElementsByName(id)); - } - return element; - }, - - byId = - function(id, from) { - switchContext(from || (from = doc)); - return _byId(id, from); - }, - - getAttribute = - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (typeof node[attribute] == 'object') { - return node.attributes[attribute] && - node.attributes[attribute].value || ''; - } - return ( - attribute == 'type' ? node.getAttribute(attribute) || '' : - ATTR_URIDATA[attribute] ? node.getAttribute(attribute, 2) || '' : - ATTR_BOOLEAN[attribute] ? node.getAttribute(attribute) ? attribute : 'false' : - ((node = node.getAttributeNode(attribute)) && node.value) || ''); - }, - - hasAttribute = root.hasAttribute ? - function(node, attribute) { - node.hasAttribute(attribute); - } : - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (ATTR_DEFAULT[attribute]) { - return !!node[ATTR_DEFAULT[attribute]]; - } - node = node.getAttributeNode(attribute); - return !!(node && (node.specified || node.nodeValue)); - }, - - compile = - function(selector, source, mode) { - - var parts = typeof selector == 'string' ? selector.match(reSplitGroup) : selector; - - typeof source == 'string' || (source = ''); - - if (parts.length == 1) { - source += compileSelector(parts[0], mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } else { - var i = -1, seen = { }, token; - while ((token = parts[++i])) { - token = token.replace(reTrimSpaces, ''); - if (!seen[token] && (seen[token] = true)) { - source += compileSelector(token, mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } - } - } - - if (mode) - return Function('c,s,r,d,h,g,f,v', - 'var N,n,x=0,k=-1,e;main:while((e=c[++k])){' + source + '}return r;'); - else - return Function('e,s,r,d,h,g,f,v', - 'var N,n,x=0,k=e;' + source + 'return false;'); - }, - - FILTER = - 'var z=v[@]||(v[@]=[]),l=z.length-1;' + - 'while(l>=0&&z[l]!==e)--l;' + - 'if(l!==-1){break;}' + - 'z[z.length]=e;', - - compileSelector = - function(selector, source, mode) { - - var k = 0, expr, match, name, result, status, test, type; - - while (selector) { - - k++; - - if ((match = selector.match(Patterns.universal))) { - expr = ''; - } - - else if ((match = selector.match(Patterns.id))) { - source = 'if(' + (XML_DOCUMENT ? - 's.getAttribute(e,"id")' : - '(e.submit?s.getAttribute(e,"id"):e.id)') + - '=="' + match[1] + '"' + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.tagName))) { - source = 'if(e.nodeName' + (XML_DOCUMENT ? - '=="' + match[1] + '"' : TO_UPPER_CASE + - '=="' + match[1].toUpperCase() + '"') + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.className))) { - source = 'if((n=' + (XML_DOCUMENT ? - 'e.getAttribute("class")' : 'e.className') + - ')&&n.length&&(" "+' + (QUIRKS_MODE ? 'n.toLowerCase()' : 'n') + - '.replace(' + reWhiteSpace + '," ")+" ").indexOf(" ' + - (QUIRKS_MODE ? match[1].toLowerCase() : match[1]) + ' ")>-1' + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.attribute))) { - if (match[2] && !Operators[match[2]]) { - emit('Unsupported operator in attribute selectors "' + selector + '"'); - return ''; - } - expr = ''; - type = 'false'; - name = match[1].toLowerCase(); - test = match[4].replace(/(\x22|\x27)/g, '\\$1'); - if (match[2] && match[4] && (type = Operators[match[2]])) { - expr = 'n=s.getAttribute(e,"' + name + '");'; - type = type.replace(/\%m/g, test); - } else if (!match[2]) { - expr = 'n=s.hasAttribute(e,"' + name + '");'; - type = 'n'; - } else if (match[2] == '!=' || match[2] == '=') { - expr = 'n=e.getAttribute("' + name + '");'; - type = 'n' + match[2] + '="' + test + '"'; - } - source = expr + 'if(' + type + '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.adjacent))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&(e=e.previousSibling)){if(e.nodeName>"@"){' + source + 'break;}}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.relative))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;e=e.parentNode.firstChild;while(e&&e!==N' + k + '){if(e.nodeName>"@"){' + source + '}e=e.nextSibling;}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.children))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + 'break;}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.ancestor))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + '}e=N' + k + ';'; - } - - else { - - expr = false; - status = false; - for (expr in Selectors) { - if ((match = selector.match(Selectors[expr].Expression)) && match[1]) { - result = Selectors[expr].Callback(match, source); - source = result.source; - status = result.status; - if (status) { break; } - } - } - - if (!status) { - emit('Unknown pseudo-class selector "' + selector + '"'); - return ''; - } - - if (!expr) { - emit('Unknown token in selector "' + selector + '"'); - return ''; - } - - } - - if (!match) { - emit('Invalid syntax in selector "' + selector + '"'); - return ''; - } - - selector = match && match[match.length - 1]; - } - - return source; - }, - - match = - function(element, selector, from, callback) { - - var parts; - - if (!(element && element.nodeName > '@')) { - emit('Invalid element argument'); - return false; - } else if (!selector || typeof selector != 'string') { - emit('Invalid selector argument'); - return false; - } else if (lastContext !== from) { - switchContext(from || (from = element.ownerDocument)); - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, element, from)); - - if (lastMatcher != selector) { - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleMatch = (parts = selector.match(reSplitGroup)).length < 2; - lastMatcher = selector; - lastPartsMatch = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return false; - } - } else parts = lastPartsMatch; - - if (!matchResolvers[selector] || matchContexts[selector] !== from) { - matchResolvers[selector] = compile(isSingleMatch ? [selector] : parts, '', false); - matchContexts[selector] = from; - } - - return matchResolvers[selector](element, Snapshot, [ ], doc, root, from, callback, { }); - }, - - first = - function(selector, from) { - return select(selector, from, function() { return false; })[0] || null; - }, - - select = - function(selector, from, callback) { - - var i, changed, element, elements, parts, token, original = selector; - - if (arguments.length === 0) { - emit('Not enough arguments'); - return [ ]; - } else if (typeof selector != 'string') { - return [ ]; - } else if (!(/[>+~*\w\u00a1-\uffff]/.test(selector))) { - emit('Invalid or illegal selector string'); - return [ ]; - } else if (from && !(/1|9|11/).test(from.nodeType)) { - emit('Invalid or illegal context element'); - return [ ]; - } else if (lastContext !== from) { - switchContext(from || (from = doc)); - } - - if (Config.CACHING && (elements = Dom.loadResults(original, from, doc, root))) { - return callback ? concatCall([ ], elements, callback) : elements; - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, from)); - - if ((changed = lastSelector != selector)) { - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleSelect = (parts = selector.match(reSplitGroup)).length < 2; - lastSelector = selector; - lastPartsSelect = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return [ ]; - } - } else parts = lastPartsSelect; - - if (from.nodeType == 11) { - - elements = from.childNodes; - - } else if (isSingleSelect) { - - if (changed) { - parts = selector.match(reSplitToken); - token = parts[parts.length - 1]; - lastSlice = token.split(':not')[0]; - lastPosition = selector.length - token.length; - } - - if (Config.UNIQUE_ID && (parts = lastSlice.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, from))) { - if (match(element, selector)) { - callback && callback(element); - elements = [ element ]; - } else elements = [ ]; - } - } - - else if (Config.UNIQUE_ID && (parts = selector.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, doc))) { - if ('#' + token == selector) { - callback && callback(element); - elements = [ element ]; - } else if (/[>+~]/.test(selector)) { - from = element.parentNode; - } else { - from = element; - } - } else elements = [ ]; - } - - if (elements) { - Config.CACHING && Dom.saveResults(original, from, doc, elements); - return elements; - } - - if (!XML_DOCUMENT && GEBTN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) { - if ((elements = from.getElementsByTagName(token)).length === 0) return [ ]; - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*'); - } - - else if (!XML_DOCUMENT && GEBCN && (parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) { - if ((elements = from.getElementsByClassName(token.replace(/\\([^\\]{1})/g, '$1'))).length === 0) return [ ]; - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, - reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1)) ? '' : '*'); - } - - } - - if (!elements) { - if (IE_LT_9) { - elements = /^(?:applet|object)$/i.test(from.nodeName) ? - from.childNodes : from.all; - } else { - elements = from.getElementsByTagName('*'); - } - } - - if (!selectResolvers[selector] || selectContexts[selector] !== from) { - selectResolvers[selector] = compile(isSingleSelect ? [selector] : parts, REJECT_NODE, true); - selectContexts[selector] = from; - } - - elements = selectResolvers[selector](elements, Snapshot, [ ], doc, root, from, callback, { }); - - Config.CACHING && Dom.saveResults(original, from, doc, elements); - - return elements; - }, - - FN = function(x) { return x; }, - - matchContexts = { }, - matchResolvers = { }, - - selectContexts = { }, - selectResolvers = { }, - - Snapshot = { - byId: _byId, - match: match, - select: select, - getAttribute: getAttribute, - hasAttribute: hasAttribute - }; - - Tokens = { - prefixes: prefixes, - encoding: encoding, - operators: operators, - whitespace: whitespace, - identifier: identifier, - attributes: attributes, - combinators: combinators, - pseudoclass: pseudoclass, - pseudoparms: pseudoparms, - quotedvalue: quotedvalue - }; - - Dom.ACCEPT_NODE = ACCEPT_NODE; - - Dom.emit = emit; - - Dom.byId = byId; - Dom.match = match; - Dom.first = first; - Dom.select = select; - Dom.compile = compile; - Dom.configure = configure; - - Dom.Config = Config; - - Dom.Operators = Operators; - Dom.Selectors = Selectors; - - Dom.Snapshot = Snapshot; - Dom.Tokens = Tokens; - - Dom.loadResults = FN; - Dom.saveResults = FN; - Dom.setCache = FN; - - Dom.shortcuts = FN; - - Dom.registerOperator = - function(symbol, resolver) { - Operators[symbol] || (Operators[symbol] = resolver); - }; - - Dom.registerSelector = - function(name, rexp, func) { - Selectors[name] || (Selectors[name] = { - Expression: rexp, - Callback: func - }); - }; - - switchContext(doc, true); - -}); diff --git a/node_modules/jsdom/node_modules/nwmatcher/src/OLD2/nwmatcher-base.js.NEW3 b/node_modules/jsdom/node_modules/nwmatcher/src/OLD2/nwmatcher-base.js.NEW3 deleted file mode 100644 index e2c5916..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/src/OLD2/nwmatcher-base.js.NEW3 +++ /dev/null @@ -1,684 +0,0 @@ -/* - * Copyright (C) 2007-2012 Diego Perini - * All rights reserved. - * - * nwmatcher-base.js - A fast CSS selector engine and matcher - * - * Author: Diego Perini - * Version: 1.3.0 - * Created: 20070722 - * Release: 20121203 - * - * License: - * http://javascript.nwbox.com/NWMatcher/MIT-LICENSE - * Download: - * http://javascript.nwbox.com/NWMatcher/nwmatcher.js - */ - -(function(global, factory) { - - if (typeof module === 'object' && typeof exports === 'object') { - module.exports = function (browserGlobal) { - var exports = { }; - factory(browserGlobal, exports); - return exports; - }; - } else { - if (!global.NW) { - global.NW = { }; - } - if (!global.NW.Dom) { - global.NW.Dom = { }; - } - factory(global, global.NW.Dom); - } - -})(this, function(global, exports) { - - var version = 'nwmatcher-1.3.0', - - Dom = exports, - - doc = global.document, - root = doc.documentElement, - - slice = [ ].slice, - - isSingleMatch, - isSingleSelect, - - lastSlice, - lastContext, - lastPosition, - - lastMatcher, - lastSelector, - - lastPartsMatch, - lastPartsSelect, - - prefixes = '[#.:]?', - operators = '([~*^$|!]?={1})', - whitespace = '[\\x20\\t\\n\\r\\f]*', - combinators = '[\\x20]|[>+~][^>+~]', - pseudoparms = '(?:[-+]?\\d*n)?[-+]?\\d*', - - quotedvalue = '"[^"]*"' + "|'[^']*'", - skipgroup = '\\[.*\\]|\\(.*\\)|\\{.*\\}', - - encoding = '(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)', - identifier = '(?:-?[_a-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+', - - attrcheck = '(' + quotedvalue + '|' + identifier + ')', - attributes = - '\\s*(' + encoding + '+:?' + encoding + '+)' + - '\\s*(?:' + operators + '\\s*' + attrcheck + ')?\\s*', - - attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'), - - pseudoclass = '((?:' + - pseudoparms + '|' + quotedvalue + '|' + - prefixes + '|' + encoding + '+|' + - '\\[' + attributes + '\\]|' + - '\\(.+\\)|\\s*|' + - ',)+)', - - extensions = '.+', - - standardValidator = - '(?=\\s*[^>+~(){}<>])' + - '(' + - '\\*' + - '|(?:' + prefixes + identifier + ')' + - '|' + combinators + - '|\\[' + attributes + '\\]' + - '|\\(' + pseudoclass + '\\)' + - '|\\{' + extensions + '\\}' + - '|(?:,|\\s*)' + - ')+', - - extendedValidator = standardValidator.replace(pseudoclass, '.*'), - - reValidator = RegExp(standardValidator, 'g'), - - reTrimSpaces = RegExp('^\\s*|\\s*$', 'g'), - - reSplitGroup = RegExp('(' + - '[^,\\\\()[\\]]+' + - '|\\[[^[\\]]*\\]|\\[.*\\]' + - '|\\([^()]+\\)|\\(.*\\)' + - '|\\{[^{}]+\\}|\\{.*\\}' + - '|\\\\.' + - ')+', 'g'), - - reSplitToken = RegExp('(' + - '\\[' + attributes + '\\]|' + - '\\(' + pseudoclass + '\\)|' + - '[^\\s>+~]|\\\\.)+', 'g'), - - reOptimizeSelector = RegExp(identifier + '|^$'), - - ATTR_DEFAULT = { - value: 'defaultValue', - checked: 'defaultChecked', - selected: 'defaultSelected' - }, - - ATTR_BOOLEAN = { - checked: 1, disabled: 1, ismap: 1, - multiple: 1, readonly: 1, selected: 1 - }, - - ATTR_URIDATA = { - action: 2, cite: 2, codebase: 2, data: 2, href: 2, - longdesc: 2, lowsrc: 2, src: 2, usemap: 2 - }, - - Selectors = { }, - - Operators = { - '=': "n=='%m'", - '^=': "n.indexOf('%m')==0", - '*=': "n.indexOf('%m')>-1", - '|=': "(n+'-').indexOf('%m-')==0", - '~=': "(' '+n+' ').indexOf(' %m ')>-1", - '$=': "n.substr(n.length-'%m'.length)=='%m'" - }, - - Optimize = { - ID: RegExp('^\\*?#(' + encoding + '+)|' + skipgroup), - TAG: RegExp('^(' + encoding + '+)|' + skipgroup), - CLASS: RegExp('^\\*?\\.(' + encoding + '+$)|' + skipgroup) - }, - - Patterns = { - universal: /^\*(.*)/, - id: RegExp('^#(' + encoding + '+)(.*)'), - tagName: RegExp('^(' + encoding + '+)(.*)'), - className: RegExp('^\\.(' + encoding + '+)(.*)'), - attribute: RegExp('^\\[' + attrmatcher + '\\](.*)'), - children: /^\s*\>\s*(.*)/, - adjacent: /^\s*\+\s*(.*)/, - relative: /^\s*\~\s*(.*)/, - ancestor: /^\s+(.*)/ - }, - - QUIRKS_MODE, - XML_DOCUMENT, - - GEBTN = 'getElementsByTagName' in doc, - GEBCN = 'getElementsByClassName' in doc, - - IE_LT_9 = typeof doc.addEventListener != 'function', - - INSENSITIVE_MAP = { - 'href': 1, 'lang': 1, 'src': 1, 'style': 1, 'title': 1, - 'type': 1, 'xmlns': 1, 'xml:lang': 1, 'xml:space': 1 - }, - - TO_UPPER_CASE = IE_LT_9 ? '.toUpperCase()' : '', - - ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break main;else continue main;', - REJECT_NODE = IE_LT_9 ? 'if(e.nodeName<"A")continue;' : '', - - Config = { - CACHING: false, - SIMPLENOT: true, - UNIQUE_ID: true, - USE_HTML5: true, - VERBOSITY: true - }, - - configure = - function(option) { - if (typeof option == 'string') { return Config[option]; } - if (typeof option != 'object') { return false; } - for (var i in option) { - Config[i] = !!option[i]; - if (i == 'SIMPLENOT') { - matchContexts = { }; - matchResolvers = { }; - selectContexts = { }; - selectResolvers = { }; - } - } - reValidator = RegExp(Config.SIMPLENOT ? - standardValidator : extendedValidator, 'g'); - return true; - }, - - concatCall = - function(data, elements, callback) { - var i = -1, element; - while ((element = elements[++i])) { - if (false === callback(data[data.length] = element)) { break; } - } - return data; - }, - - emit = - function(message) { - if (Config.VERBOSITY) { throw SyntaxError(message); } - if (global.console && global.console.log) { - global.console.log(message); - } - }, - - switchContext = - function(from, force) { - var oldDoc = doc; - lastContext = from; - doc = from.ownerDocument || from; - if (force || oldDoc !== doc) { - root = doc.documentElement; - XML_DOCUMENT = doc.createElement('DiV').nodeName == 'DiV'; - QUIRKS_MODE = !XML_DOCUMENT && - typeof doc.compatMode == 'string' ? - doc.compatMode.indexOf('CSS') < 0 : - (function() { - var style = document.createElement('div').style; - return style && (style.width = 1) && style.width == '1px'; - })(); - - Config.CACHING && Dom.setCache(true, doc); - } - }, - - byIdRaw = - function(id, elements) { - var i = 0, element = null; - while ((element = elements[i])) { - if (element.getAttribute('id') == id) { - break; - } - ++i; - } - return element; - }, - - _byId = !('fileSize' in doc) ? - function(id, from) { - id = id.replace(/\\([^\\]{1})/g, '$1'); - return from.getElementById && from.getElementById(id) || - byIdRaw(id, from.getElementsByTagName('*')); - } : - function(id, from) { - var element = null; - id = id.replace(/\\([^\\]{1})/g, '$1'); - if (XML_DOCUMENT || from.nodeType != 9) { - return byIdRaw(id, from.getElementsByTagName('*')); - } - if ((element = from.getElementById(id)) && - element.name == id && from.getElementsByName) { - return byIdRaw(id, from.getElementsByName(id)); - } - return element; - }, - - byId = - function(id, from) { - switchContext(from || (from = doc)); - return _byId(id, from); - }, - - getAttribute = - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (typeof node[attribute] == 'object') { - return node.attributes[attribute] && - node.attributes[attribute].value || ''; - } - return ( - attribute == 'type' ? node.getAttribute(attribute) || '' : - ATTR_URIDATA[attribute] ? node.getAttribute(attribute, 2) || '' : - ATTR_BOOLEAN[attribute] ? node.getAttribute(attribute) ? attribute : 'false' : - ((node = node.getAttributeNode(attribute)) && node.value) || ''); - }, - - hasAttribute = root.hasAttribute ? - function(node, attribute) { - node.hasAttribute(attribute); - } : - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (ATTR_DEFAULT[attribute]) { - return !!node[ATTR_DEFAULT[attribute]]; - } - node = node.getAttributeNode(attribute); - return !!(node && (node.specified || node.nodeValue)); - }, - - compile = - function(selector, source, mode) { - - var parts = typeof selector == 'string' ? selector.match(reSplitGroup) : selector; - - typeof source == 'string' || (source = ''); - - if (parts.length == 1) { - source += compileSelector(parts[0], mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } else { - var i = -1, seen = { }, token; - while ((token = parts[++i])) { - token = token.replace(reTrimSpaces, ''); - if (!seen[token] && (seen[token] = true)) { - source += compileSelector(token, mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } - } - } - - if (mode) - return Function('c,s,r,d,h,g,f,v', - 'var N,n,x=0,k=-1,e;main:while((e=c[++k])){' + source + '}return r;'); - else - return Function('e,s,r,d,h,g,f,v', - 'var N,n,x=0,k=e;' + source + 'return false;'); - }, - - FILTER = - 'var z=v[@]||(v[@]=[]),l=z.length-1;' + - 'while(l>=0&&z[l]!==e)--l;' + - 'if(l!==-1){break;}' + - 'z[z.length]=e;', - - compileSelector = - function(selector, source, mode) { - - var k = 0, expr, match, name, result, status, test, type; - - while (selector) { - - k++; - - if ((match = selector.match(Patterns.universal))) { - expr = ''; - } - - else if ((match = selector.match(Patterns.id))) { - source = 'if(' + (XML_DOCUMENT ? - 's.getAttribute(e,"id")' : - '(e.submit?s.getAttribute(e,"id"):e.id)') + - '=="' + match[1] + '"' + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.tagName))) { - source = 'if(e.nodeName' + (XML_DOCUMENT ? - '=="' + match[1] + '"' : TO_UPPER_CASE + - '=="' + match[1].toUpperCase() + '"') + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.className))) { - source = 'if((n=' + (XML_DOCUMENT ? - 'e.getAttribute("class")' : 'e.className') + - ')&&n.length&&(" "+' + (QUIRKS_MODE ? 'n.toLowerCase()' : 'n') + - '.replace(/\\s+/g," ")+" ").indexOf(" ' + - (QUIRKS_MODE ? match[1].toLowerCase() : match[1]) + ' ")>-1' + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.attribute))) { - if (match[2] && !Operators[match[2]]) { - emit('Unsupported operator in attribute selectors "' + selector + '"'); - return ''; - } - expr = ''; - type = 'false'; - name = match[1].toLowerCase(); - if (match[2] && match[4] && (type = Operators[match[2]])) { - test = match[4].replace(/(\x22|\x27)/g, '\\$1'); - expr = 'n=s.getAttribute(e,"' + name + '");'; - type = type.replace(/\%m/g, test); - } else if (!match[2]) { - expr = 'n=s.hasAttribute(e,"' + name + '");'; - type = 'n'; - } else if (match[2] == '!=' || match[2] == '=') { - expr = 'n=e.getAttribute("' + name + '");'; - type = 'n' + match[2] + '="' + match[4] + '"'; - } - source = expr + 'if(' + type + '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.adjacent))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&(e=e.previousSibling)){if(e.nodeName>"@"){' + source + 'break;}}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.relative))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;e=e.parentNode.firstChild;while(e&&e!==N' + k + '){if(e.nodeName>"@"){' + source + '}e=e.nextSibling;}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.children))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + 'break;}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.ancestor))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + '}e=N' + k + ';'; - } - - else { - - expr = false; - status = false; - for (expr in Selectors) { - if ((match = selector.match(Selectors[expr].Expression)) && match[1]) { - result = Selectors[expr].Callback(match, source); - source = result.source; - status = result.status; - if (status) { break; } - } - } - - if (!status) { - emit('Unknown pseudo-class selector "' + selector + '"'); - return ''; - } - - if (!expr) { - emit('Unknown token in selector "' + selector + '"'); - return ''; - } - - } - - if (!match) { - emit('Invalid syntax in selector "' + selector + '"'); - return ''; - } - - selector = match && match[match.length - 1]; - } - - return source; - }, - - match = - function(element, selector, from, callback) { - - var parts; - - if (!(element && element.nodeName > '@')) { - emit('Invalid element argument'); - return false; - } else if (!selector || typeof selector != 'string') { - emit('Invalid selector argument'); - return false; - } else if (lastContext !== from) { - switchContext(from || (from = element.ownerDocument)); - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, element, from)); - - if (lastMatcher != selector) { - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleMatch = (parts = selector.match(reSplitGroup)).length < 2; - lastMatcher = selector; - lastPartsMatch = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return false; - } - } else parts = lastPartsMatch; - - if (!matchResolvers[selector] || matchContexts[selector] !== from) { - matchResolvers[selector] = compile(isSingleMatch ? [selector] : parts, '', false); - matchContexts[selector] = from; - } - - return matchResolvers[selector](element, Snapshot, [ ], doc, root, from, callback, { }); - }, - - first = - function(selector, from) { - return select(selector, from, function() { return false; })[0] || null; - }, - - select = - function(selector, from, callback) { - - var i, changed, element, elements, parts, token, original = selector; - - if (arguments.length === 0) { - emit('Not enough arguments'); - return [ ]; - } else if (typeof selector != 'string') { - return [ ]; - } else if (!(/[>+~*\w\u00a1-\uffff]/.test(selector))) { - emit('Invalid or illegal selector string'); - return [ ]; - } else if (from && !(/1|9|11/).test(from.nodeType)) { - emit('Invalid or illegal context element'); - return [ ]; - } else if (lastContext !== from) { - switchContext(from || (from = doc)); - } - - if (Config.CACHING && (elements = Dom.loadResults(original, from, doc, root))) { - return callback ? concatCall([ ], elements, callback) : elements; - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, from)); - - if ((changed = lastSelector != selector)) { - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleSelect = (parts = selector.match(reSplitGroup)).length < 2; - lastSelector = selector; - lastPartsSelect = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return [ ]; - } - } else parts = lastPartsSelect; - - if (from.nodeType == 11) { - - elements = from.childNodes; - - } else if (isSingleSelect) { - - if (changed) { - parts = selector.match(reSplitToken); - token = parts[parts.length - 1]; - lastSlice = token.split(':not')[0]; - lastPosition = selector.length - token.length; - } - - if (Config.UNIQUE_ID && (parts = lastSlice.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, from))) { - if (match(element, selector)) { - callback && callback(element); - elements = [ element ]; - } else elements = [ ]; - } - } - - else if (Config.UNIQUE_ID && (parts = selector.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, doc))) { - if ('#' + token == selector) { - callback && callback(element); - elements = [ element ]; - } else if (/[>+~]/.test(selector)) { - from = element.parentNode; - } else { - from = element; - } - } else elements = [ ]; - } - - if (elements) { - Config.CACHING && Dom.saveResults(original, from, doc, elements); - return elements; - } - - if (!XML_DOCUMENT && GEBTN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) { - if ((elements = from.getElementsByTagName(token)).length === 0) return [ ]; - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*'); - } - - else if (!XML_DOCUMENT && GEBCN && (parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) { - if ((elements = from.getElementsByClassName(token.replace(/\\([^\\]{1})/g, '$1'))).length === 0) return [ ]; - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, - reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1)) ? '' : '*'); - } - - } - - if (!elements) { - if (IE_LT_9) { - elements = /^(?:applet|object)$/i.test(from.nodeName) ? - from.childNodes : from.all; - } else { - elements = from.getElementsByTagName('*'); - } - } - - if (!selectResolvers[selector] || selectContexts[selector] !== from) { - selectResolvers[selector] = compile(isSingleSelect ? [selector] : parts, REJECT_NODE, true); - selectContexts[selector] = from; - } - - elements = selectResolvers[selector](elements, Snapshot, [ ], doc, root, from, callback, { }); - - Config.CACHING && Dom.saveResults(original, from, doc, elements); - - return elements; - }, - - FN = function(x) { return x; }, - - matchContexts = { }, - matchResolvers = { }, - - selectContexts = { }, - selectResolvers = { }, - - Snapshot = { - byId: _byId, - match: match, - select: select, - getAttribute: getAttribute, - hasAttribute: hasAttribute - }; - - Tokens = { - prefixes: prefixes, - encoding: encoding, - operators: operators, - whitespace: whitespace, - identifier: identifier, - attributes: attributes, - combinators: combinators, - pseudoclass: pseudoclass, - pseudoparms: pseudoparms, - quotedvalue: quotedvalue - }; - - Dom.ACCEPT_NODE = ACCEPT_NODE; - - Dom.emit = emit; - - Dom.byId = byId; - Dom.match = match; - Dom.first = first; - Dom.select = select; - Dom.compile = compile; - Dom.configure = configure; - - Dom.Config = Config; - - Dom.Operators = Operators; - Dom.Selectors = Selectors; - - Dom.Snapshot = Snapshot; - Dom.Tokens = Tokens; - - Dom.loadResults = FN; - Dom.saveResults = FN; - Dom.setCache = FN; - - Dom.shortcuts = FN; - - Dom.registerOperator = - function(symbol, resolver) { - Operators[symbol] || (Operators[symbol] = resolver); - }; - - Dom.registerSelector = - function(name, rexp, func) { - Selectors[name] || (Selectors[name] = { - Expression: rexp, - Callback: func - }); - }; - - switchContext(doc, true); - -}); diff --git a/node_modules/jsdom/node_modules/nwmatcher/src/OLD2/nwmatcher-base.js.NEW4 b/node_modules/jsdom/node_modules/nwmatcher/src/OLD2/nwmatcher-base.js.NEW4 deleted file mode 100644 index 634192b..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/src/OLD2/nwmatcher-base.js.NEW4 +++ /dev/null @@ -1,691 +0,0 @@ -/* - * Copyright (C) 2007-2012 Diego Perini - * All rights reserved. - * - * nwmatcher-base.js - A fast CSS selector engine and matcher - * - * Author: Diego Perini - * Version: 1.3.0 - * Created: 20070722 - * Release: 20121203 - * - * License: - * http://javascript.nwbox.com/NWMatcher/MIT-LICENSE - * Download: - * http://javascript.nwbox.com/NWMatcher/nwmatcher.js - */ - -(function(global, factory) { - - if (typeof module === 'object' && typeof exports === 'object') { - module.exports = function (browserGlobal) { - var exports = { }; - factory(browserGlobal, exports); - return exports; - }; - } else { - if (!global.NW) { - global.NW = { }; - } - if (!global.NW.Dom) { - global.NW.Dom = { }; - } - factory(global, global.NW.Dom); - } - -})(this, function(global, exports) { - - var version = 'nwmatcher-1.3.0', - - Dom = exports, - - doc = global.document, - root = doc.documentElement, - - slice = [ ].slice, - - isSingleMatch, - isSingleSelect, - - lastSlice, - lastContext, - lastPosition, - - lastMatcher, - lastSelector, - - lastPartsMatch, - lastPartsSelect, - - prefixes = '[#.:]?', - operators = '([~*^$|!]?={1})', - whitespace = '[\\x20\\t\\n\\r\\f]*', - combinators = '[\\x20]|[>+~][^>+~]', - pseudoparms = '(?:[-+]?\\d*n)?[-+]?\\d*', - - quotedvalue = '"[^"]*"' + "|'[^']*'", - skipgroup = '\\[.*\\]|\\(.*\\)|\\{.*\\}', - - encoding = '(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)', - identifier = '(?:-?[_a-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+', - - attrcheck = '(' + quotedvalue + '|' + identifier + ')', - attributes = whitespace + '(' + encoding + '+:?' + encoding + '+)' + - whitespace + '(?:' + operators + whitespace + attrcheck + ')?' + whitespace, - - attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'), - - pseudoclass = '((?:' + - pseudoparms + '|' + quotedvalue + '|' + - prefixes + '|' + encoding + '+|' + - '\\[' + attributes + '\\]|' + - '\\(.+\\)|' + whitespace + '|' + - ',)+)', - - extensions = '.+', - - standardValidator = - '(?=[\\x20\\t\\n\\r\\f]*[^>+~(){}<>])' + - '(' + - '\\*' + - '|(?:' + prefixes + identifier + ')' + - '|' + combinators + - '|\\[' + attributes + '\\]' + - '|\\(' + pseudoclass + '\\)' + - '|\\{' + extensions + '\\}' + - '|(?:,|' + whitespace + ')' + - ')+', - - extendedValidator = standardValidator.replace(pseudoclass, '.*'), - - reValidator = RegExp(standardValidator, 'g'), - - reTrimSpaces = RegExp('^' + - whitespace + '|' + whitespace + '$', 'g'), - - reSplitGroup = RegExp('(' + - '[^,\\\\()[\\]]+' + - '|\\[[^[\\]]*\\]|\\[.*\\]' + - '|\\([^()]+\\)|\\(.*\\)' + - '|\\{[^{}]+\\}|\\{.*\\}' + - '|\\\\.' + - ')+', 'g'), - - reSplitToken = RegExp('(' + - '\\[' + attributes + '\\]|' + - '\\(' + pseudoclass + '\\)|' + - '[^\\x20\\t\\n\\r\\f>+~]|\\\\.)+', 'g'), - - reWhiteSpace = /[\x20\t\n\r\f]+/g, - - reOptimizeSelector = RegExp(identifier + '|^$'), - - ATTR_DEFAULT = { - value: 'defaultValue', - checked: 'defaultChecked', - selected: 'defaultSelected' - }, - - ATTR_BOOLEAN = { - checked: 1, disabled: 1, ismap: 1, - multiple: 1, readonly: 1, selected: 1 - }, - - ATTR_URIDATA = { - action: 2, cite: 2, codebase: 2, data: 2, href: 2, - longdesc: 2, lowsrc: 2, src: 2, usemap: 2 - }, - - Selectors = { }, - - Operators = { - '=': "n=='%m'", - '^=': "n.indexOf('%m')==0", - '*=': "n.indexOf('%m')>-1", - '|=': "(n+'-').indexOf('%m-')==0", - '~=': "(' '+n+' ').indexOf(' %m ')>-1", - '$=': "n.substr(n.length-'%m'.length)=='%m'" - }, - - Optimize = { - ID: RegExp('^\\*?#(' + encoding + '+)|' + skipgroup), - TAG: RegExp('^(' + encoding + '+)|' + skipgroup), - CLASS: RegExp('^\\*?\\.(' + encoding + '+$)|' + skipgroup) - }, - - Patterns = { - universal: /^\*(.*)/, - id: RegExp('^#(' + encoding + '+)(.*)'), - tagName: RegExp('^(' + encoding + '+)(.*)'), - className: RegExp('^\\.(' + encoding + '+)(.*)'), - attribute: RegExp('^\\[' + attrmatcher + '\\](.*)'), - children: /^[\x20\t\n\r\f]*\>[\x20\t\n\r\f]*(.*)/, - adjacent: /^[\x20\t\n\r\f]*\+[\x20\t\n\r\f]*(.*)/, - relative: /^[\x20\t\n\r\f]*\~[\x20\t\n\r\f]*(.*)/, - ancestor: /^[\x20\t\n\r\f]+(.*)/ - }, - - QUIRKS_MODE, - XML_DOCUMENT, - - GEBTN = 'getElementsByTagName' in doc, - GEBCN = 'getElementsByClassName' in doc, - - IE_LT_9 = typeof doc.addEventListener != 'function', - - INSENSITIVE_MAP = { - 'href': 1, 'lang': 1, 'src': 1, 'style': 1, 'title': 1, - 'type': 1, 'xmlns': 1, 'xml:lang': 1, 'xml:space': 1 - }, - - TO_UPPER_CASE = IE_LT_9 ? '.toUpperCase()' : '', - - ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break main;else continue main;', - REJECT_NODE = IE_LT_9 ? 'if(e.nodeName<"A")continue;' : '', - - Config = { - CACHING: false, - SIMPLENOT: true, - UNIQUE_ID: true, - USE_HTML5: true, - VERBOSITY: true - }, - - configure = - function(option) { - if (typeof option == 'string') { return Config[option]; } - if (typeof option != 'object') { return false; } - for (var i in option) { - Config[i] = !!option[i]; - if (i == 'SIMPLENOT') { - matchContexts = { }; - matchResolvers = { }; - selectContexts = { }; - selectResolvers = { }; - } - } - reValidator = RegExp(Config.SIMPLENOT ? - standardValidator : extendedValidator, 'g'); - return true; - }, - - concatCall = - function(data, elements, callback) { - var i = -1, element; - while ((element = elements[++i])) { - if (false === callback(data[data.length] = element)) { break; } - } - return data; - }, - - emit = - function(message) { - if (Config.VERBOSITY) { throw SyntaxError(message); } - if (global.console && global.console.log) { - global.console.log(message); - } - }, - - switchContext = - function(from, force) { - var oldDoc = doc; - lastContext = from; - doc = from.ownerDocument || from; - if (force || oldDoc !== doc) { - root = doc.documentElement; - XML_DOCUMENT = doc.createElement('DiV').nodeName == 'DiV'; - QUIRKS_MODE = !XML_DOCUMENT && - typeof doc.compatMode == 'string' ? - doc.compatMode.indexOf('CSS') < 0 : - (function() { - var style = document.createElement('div').style; - return style && (style.width = 1) && style.width == '1px'; - })(); - - Config.CACHING && Dom.setCache(true, doc); - } - }, - - byIdRaw = - function(id, elements) { - var i = 0, element = null; - while ((element = elements[i])) { - if (element.getAttribute('id') == id) { - break; - } - ++i; - } - return element; - }, - - _byId = !('fileSize' in doc) ? - function(id, from) { - id = id.replace(/\\([^\\]{1})/g, '$1'); - return from.getElementById && from.getElementById(id) || - byIdRaw(id, from.getElementsByTagName('*')); - } : - function(id, from) { - var element = null; - id = id.replace(/\\([^\\]{1})/g, '$1'); - if (XML_DOCUMENT || from.nodeType != 9) { - return byIdRaw(id, from.getElementsByTagName('*')); - } - if ((element = from.getElementById(id)) && - element.name == id && from.getElementsByName) { - return byIdRaw(id, from.getElementsByName(id)); - } - return element; - }, - - byId = - function(id, from) { - switchContext(from || (from = doc)); - return _byId(id, from); - }, - - getAttribute = - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (typeof node[attribute] == 'object') { - return node.attributes[attribute] && - node.attributes[attribute].value || ''; - } - return ( - attribute == 'type' ? node.getAttribute(attribute) || '' : - ATTR_URIDATA[attribute] ? node.getAttribute(attribute, 2) || '' : - ATTR_BOOLEAN[attribute] ? node.getAttribute(attribute) ? attribute : 'false' : - ((node = node.getAttributeNode(attribute)) && node.value) || ''); - }, - - hasAttribute = root.hasAttribute ? - function(node, attribute) { - return node.hasAttribute(attribute); - } : - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (ATTR_DEFAULT[attribute]) { - return !!node[ATTR_DEFAULT[attribute]]; - } - node = node.getAttributeNode(attribute); - return !!(node && (node.specified || node.nodeValue)); - }, - - compile = - function(selector, source, mode) { - - var parts = typeof selector == 'string' ? selector.match(reSplitGroup) : selector; - - typeof source == 'string' || (source = ''); - - if (parts.length == 1) { - source += compileSelector(parts[0], mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } else { - var i = -1, seen = { }, token; - while ((token = parts[++i])) { - token = token.replace(reTrimSpaces, ''); - if (!seen[token] && (seen[token] = true)) { - source += compileSelector(token, mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } - } - } - - if (mode) - return Function('c,s,r,d,h,g,f,v', - 'var N,n,x=0,k=-1,e;main:while((e=c[++k])){' + source + '}return r;'); - else - return Function('e,s,r,d,h,g,f,v', - 'var N,n,x=0,k=e;' + source + 'return false;'); - }, - - FILTER = - 'var z=v[@]||(v[@]=[]),l=z.length-1;' + - 'while(l>=0&&z[l]!==e)--l;' + - 'if(l!==-1){break;}' + - 'z[z.length]=e;', - - compileSelector = - function(selector, source, mode) { - - var k = 0, expr, match, name, result, status, test, type; - - while (selector) { - - k++; - - if ((match = selector.match(Patterns.universal))) { - expr = ''; - } - - else if ((match = selector.match(Patterns.id))) { - source = 'if(' + (XML_DOCUMENT ? - 's.getAttribute(e,"id")' : - '(e.submit?s.getAttribute(e,"id"):e.id)') + - '=="' + match[1] + '"' + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.tagName))) { - source = 'if(e.nodeName' + (XML_DOCUMENT ? - '=="' + match[1] + '"' : TO_UPPER_CASE + - '=="' + match[1].toUpperCase() + '"') + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.className))) { - source = 'if((n=' + (XML_DOCUMENT ? - 'e.getAttribute("class")' : 'e.className') + - ')&&n.length&&(" "+' + (QUIRKS_MODE ? 'n.toLowerCase()' : 'n') + - '.replace(' + reWhiteSpace + '," ")+" ").indexOf(" ' + - (QUIRKS_MODE ? match[1].toLowerCase() : match[1]) + ' ")>-1' + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.attribute))) { - if (match[2] && !Operators[match[2]]) { - emit('Unsupported operator in attribute selectors "' + selector + '"'); - return ''; - } - expr = ''; - type = 'false'; -// name = match[1]; - if (match[2] && match[4] && (type = Operators[match[2]])) { - match[4] = match[4].replace(/(\x22|\x27)/g, '\\$1'); - match[4] = match[4].replace(/\\([0-9a-f]{2,2})/g, '\\x$1'); -// expr = 'n=s.getAttribute(e,"' + name + '");'; - type = type.replace(/\%m/g, match[4]); -// } else if (!match[2]) { -// expr = 'n=s.hasAttribute(e,"' + name + '");'; -// type = 'n'; - } else if (match[2] == '!=' || match[2] == '=') { -// expr = 'n=e.getAttribute("' + name + '");'; - type = 'n' + match[2] + '="' + match[4] + '"'; - } - - expr = 'n=s.' + (match[2] ? 'get' : 'has') + 'Attribute(e,"' + match[1] + '");'; - source = expr + 'if(' + (match[2] ? type : 'n') + '){' + source + '}'; - -// source = expr + 'if(' + type + '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.adjacent))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&(e=e.previousSibling)){if(e.nodeName>"@"){' + source + 'break;}}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.relative))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;e=e.parentNode.firstChild;while(e&&e!==N' + k + '){if(e.nodeName>"@"){' + source + '}e=e.nextSibling;}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.children))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + 'break;}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.ancestor))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + '}e=N' + k + ';'; - } - - else { - - expr = false; - status = false; - for (expr in Selectors) { - if ((match = selector.match(Selectors[expr].Expression)) && match[1]) { - result = Selectors[expr].Callback(match, source); - source = result.source; - status = result.status; - if (status) { break; } - } - } - - if (!status) { - emit('Unknown pseudo-class selector "' + selector + '"'); - return ''; - } - - if (!expr) { - emit('Unknown token in selector "' + selector + '"'); - return ''; - } - - } - - if (!match) { - emit('Invalid syntax in selector "' + selector + '"'); - return ''; - } - - selector = match && match[match.length - 1]; - } - - return source; - }, - - match = - function(element, selector, from, callback) { - - var parts; - - if (!(element && element.nodeName > '@')) { - emit('Invalid element argument'); - return false; - } else if (!selector || typeof selector != 'string') { - emit('Invalid selector argument'); - return false; - } else if (lastContext !== from) { - switchContext(from || (from = element.ownerDocument)); - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, element, from)); - - if (lastMatcher != selector) { - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleMatch = (parts = selector.match(reSplitGroup)).length < 2; - lastMatcher = selector; - lastPartsMatch = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return false; - } - } else parts = lastPartsMatch; - - if (!matchResolvers[selector] || matchContexts[selector] !== from) { - matchResolvers[selector] = compile(isSingleMatch ? [selector] : parts, '', false); - matchContexts[selector] = from; - } - - return matchResolvers[selector](element, Snapshot, [ ], doc, root, from, callback, { }); - }, - - first = - function(selector, from) { - return select(selector, from, function() { return false; })[0] || null; - }, - - select = - function(selector, from, callback) { - - var i, changed, element, elements, parts, token, original = selector; - - if (arguments.length === 0) { - emit('Not enough arguments'); - return [ ]; - } else if (typeof selector != 'string') { - return [ ]; - } else if (!(/[>+~*\w\u00a1-\uffff]/.test(selector))) { - emit('Invalid or illegal selector string'); - return [ ]; - } else if (from && !(/1|9|11/).test(from.nodeType)) { - emit('Invalid or illegal context element'); - return [ ]; - } else if (lastContext !== from) { - switchContext(from || (from = doc)); - } - - if (Config.CACHING && (elements = Dom.loadResults(original, from, doc, root))) { - return callback ? concatCall([ ], elements, callback) : elements; - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, from)); - - if ((changed = lastSelector != selector)) { - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleSelect = (parts = selector.match(reSplitGroup)).length < 2; - lastSelector = selector; - lastPartsSelect = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return [ ]; - } - } else parts = lastPartsSelect; - - if (from.nodeType == 11) { - - elements = from.childNodes; - - } else if (isSingleSelect) { - - if (changed) { - parts = selector.match(reSplitToken); - token = parts[parts.length - 1]; - lastSlice = token.split(':not')[0]; - lastPosition = selector.length - token.length; - } - - if (Config.UNIQUE_ID && (parts = lastSlice.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, from))) { - if (match(element, selector)) { - callback && callback(element); - elements = [ element ]; - } else elements = [ ]; - } - } - - else if (Config.UNIQUE_ID && (parts = selector.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, doc))) { - if ('#' + token == selector) { - callback && callback(element); - elements = [ element ]; - } else if (/[>+~]/.test(selector)) { - from = element.parentNode; - } else { - from = element; - } - } else elements = [ ]; - } - - if (elements) { - Config.CACHING && Dom.saveResults(original, from, doc, elements); - return elements; - } - - if (!XML_DOCUMENT && GEBTN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) { - if ((elements = from.getElementsByTagName(token)).length === 0) return [ ]; - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*'); - } - - else if (!XML_DOCUMENT && GEBCN && (parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) { - if ((elements = from.getElementsByClassName(token.replace(/\\([^\\]{1})/g, '$1'))).length === 0) return [ ]; - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, - reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1)) ? '' : '*'); - } - - } - - if (!elements) { - if (IE_LT_9) { - elements = /^(?:applet|object)$/i.test(from.nodeName) ? - from.childNodes : from.all; - } else { - elements = from.getElementsByTagName('*'); - } - } - - if (!selectResolvers[selector] || selectContexts[selector] !== from) { - selectResolvers[selector] = compile(isSingleSelect ? [selector] : parts, REJECT_NODE, true); - selectContexts[selector] = from; - } - - elements = selectResolvers[selector](elements, Snapshot, [ ], doc, root, from, callback, { }); - - Config.CACHING && Dom.saveResults(original, from, doc, elements); - - return elements; - }, - - FN = function(x) { return x; }, - - matchContexts = { }, - matchResolvers = { }, - - selectContexts = { }, - selectResolvers = { }, - - Snapshot = { - byId: _byId, - match: match, - select: select, - getAttribute: getAttribute, - hasAttribute: hasAttribute - }; - - Tokens = { - prefixes: prefixes, - encoding: encoding, - operators: operators, - whitespace: whitespace, - identifier: identifier, - attributes: attributes, - combinators: combinators, - pseudoclass: pseudoclass, - pseudoparms: pseudoparms, - quotedvalue: quotedvalue - }; - - Dom.ACCEPT_NODE = ACCEPT_NODE; - - Dom.emit = emit; - - Dom.byId = byId; - Dom.match = match; - Dom.first = first; - Dom.select = select; - Dom.compile = compile; - Dom.configure = configure; - - Dom.Config = Config; - - Dom.Operators = Operators; - Dom.Selectors = Selectors; - - Dom.Snapshot = Snapshot; - Dom.Tokens = Tokens; - - Dom.loadResults = FN; - Dom.saveResults = FN; - Dom.setCache = FN; - - Dom.shortcuts = FN; - - Dom.registerOperator = - function(symbol, resolver) { - Operators[symbol] || (Operators[symbol] = resolver); - }; - - Dom.registerSelector = - function(name, rexp, func) { - Selectors[name] || (Selectors[name] = { - Expression: rexp, - Callback: func - }); - }; - - switchContext(doc, true); - -}); diff --git a/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-cache.js b/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-cache.js deleted file mode 100644 index 6f8afb6..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-cache.js +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (C) 2007-2012 Diego Perini - * All rights reserved. - * - * Caching/memoization module for NWMatcher - * - * Added capabilities: - * - * - Mutation Events are feature tested and used safely - * - handle caching different document types HTML/XML/SVG - * - store result sets for different selectors / contexts - * - simultaneously control mutation on multiple documents - * - */ - -(function(global) { - - // export the public API for CommonJS implementations, - // for headless JS engines or for standard web browsers - var Dom = - // as CommonJS/NodeJS module - typeof exports == 'object' ? exports : - // create or extend NW namespace - ((global.NW || (global.NW = { })) && - (global.NW.Dom || (global.NW.Dom = { }))), - - Contexts = { }, - Results = { }, - - isEnabled = false, - isExpired = true, - isPaused = false, - - context = global.document, - root = context.documentElement, - - // last time cache initialization was called - lastCalled = 0, - - // minimum time allowed between calls to the cache initialization - minCacheRest = 15, //ms - - mutationTest = - function(type, callback) { - var isSupported = false, - root = document.documentElement, - div = document.createElement('div'), - handler = function() { isSupported = true; }; - root.insertBefore(div, root.firstChild); - div.addEventListener(type, handler, true); - if (callback && callback.call) callback(div); - div.removeEventListener(type, handler, true); - root.removeChild(div); - return isSupported; - }, - - // check for Mutation Events, DOMAttrModified should be - // enough to ensure DOMNodeInserted/DOMNodeRemoved exist - HACKED_MUTATION_EVENTS = false, - - NATIVE_MUTATION_EVENTS = root.addEventListener ? - mutationTest('DOMAttrModified', function(e) { e.setAttribute('id', 'nw'); }) : false, - - loadResults = - function(selector, from, doc, root) { - if (isEnabled && !isPaused) { - if (!isExpired) { - if (Results[selector] && Contexts[selector] === from) { - return Results[selector]; - } - } else { - // pause caching while we are getting - // hammered by dom mutations (jdalton) - now = new Date; - if ((now - lastCalled) < minCacheRest) { - isPaused = isExpired = true; - setTimeout(function() { isPaused = false; }, minCacheRest); - } else setCache(true, doc); - lastCalled = now; - } - } - return undefined; - }, - - saveResults = - function(selector, from, doc, data) { - Contexts[selector] = from; - Results[selector] = data; - return; - }, - - /*-------------------------------- CACHING ---------------------------------*/ - - // invoked by mutation events to expire cached parts - mutationWrapper = - function(event) { - var d = event.target.ownerDocument || event.target; - stopMutation(d); - expireCache(d); - }, - - // append mutation events - startMutation = - function(d) { - if (!d.isCaching && d.addEventListener) { - // FireFox/Opera/Safari/KHTML have support for Mutation Events - d.addEventListener('DOMAttrModified', mutationWrapper, true); - d.addEventListener('DOMNodeInserted', mutationWrapper, true); - d.addEventListener('DOMNodeRemoved', mutationWrapper, true); - d.isCaching = true; - } - }, - - // remove mutation events - stopMutation = - function(d) { - if (d.isCaching && d.removeEventListener) { - d.removeEventListener('DOMAttrModified', mutationWrapper, true); - d.removeEventListener('DOMNodeInserted', mutationWrapper, true); - d.removeEventListener('DOMNodeRemoved', mutationWrapper, true); - d.isCaching = false; - } - }, - - // enable/disable context caching system - // @d optional document context (iframe, xml document) - // script loading context will be used as default context - setCache = - function(enable, d) { - if (!!enable) { - isExpired = false; - startMutation(d); - } else { - isExpired = true; - stopMutation(d); - } - isEnabled = !!enable; - }, - - // expire complete cache - // can be invoked by Mutation Events or - // programmatically by other code/scripts - // document context is mandatory no checks - expireCache = - function(d) { - isExpired = true; - Contexts = { }; - Results = { }; - }; - - if (!NATIVE_MUTATION_EVENTS && root.addEventListener && Element && Element.prototype) { - if (mutationTest('DOMNodeInserted', function(e) { e.appendChild(document.createElement('div')); }) && - mutationTest('DOMNodeRemoved', function(e) { e.removeChild(e.appendChild(document.createElement('div'))); })) { - HACKED_MUTATION_EVENTS = true; - Element.prototype._setAttribute = Element.prototype.setAttribute; - Element.prototype.setAttribute = - function(name, val) { - this._setAttribute(name, val); - mutationWrapper({ - target: this, - type: 'DOMAttrModified', - attrName: name, - attrValue: val }); - }; - } - } - - isEnabled = NATIVE_MUTATION_EVENTS || HACKED_MUTATION_EVENTS; - - /*------------------------------- PUBLIC API -------------------------------*/ - - // save results into cache - Dom.saveResults = saveResults; - - // load results from cache - Dom.loadResults = loadResults; - - // expire DOM tree cache - Dom.expireCache = expireCache; - - // enable/disable cache - Dom.setCache = setCache; - -})(this); diff --git a/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-jquery.js b/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-jquery.js deleted file mode 100644 index b0a4ea7..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-jquery.js +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (C) 2007-2009 Diego Perini - * All rights reserved. - * - * this is just a small example to show - * how an extension for NWMatcher could be - * adapted to handle special jQuery selectors - * - * Child Selectors - * :even, :odd, :eq, :lt, :gt, :first, :last, :nth - * - * Pseudo Selectors - * :has, :button, :header, :input, :checkbox, :radio, :file, :image - * :password, :reset, :submit, :text, :hidden, :visible, :parent - * - */ - -// for structural pseudo-classes extensions -NW.Dom.registerSelector( - 'jquery:child', - /^\:((?:(nth|eq|lt|gt)\(([^()]*)\))|(?:even|odd|first|last))(.*)/i, - function(match, source, selector) { - - var status = true, ACCEPT_NODE = NW.Dom.ACCEPT_NODE; - - switch (match[1].toLowerCase()) { - case 'odd': - source = source.replace(ACCEPT_NODE, 'if((x=x^1)==0){' + ACCEPT_NODE + '}'); - break; - case 'even': - source = source.replace(ACCEPT_NODE, 'if((x=x^1)==1){' + ACCEPT_NODE + '}'); - break; - case 'first': - source = 'n=h.getElementsByTagName(e.nodeName);if(n.length&&n[0]===e){' + source + '}'; - break; - case 'last': - source = 'n=h.getElementsByTagName(e.nodeName);if(n.length&&n[n.length-1]===e){' + source + '}'; - break; - default: - switch (match[2].toLowerCase()) { - case 'nth': - source = 'n=h.getElementsByTagName(e.nodeName);if(n.length&&n[' + match[3] + ']===e){' + source + '}'; - break; - case 'eq': - source = source.replace(ACCEPT_NODE, 'if(x++==' + match[3] + '){' + ACCEPT_NODE + '}'); - break; - case 'lt': - source = source.replace(ACCEPT_NODE, 'if(x++<' + match[3] + '){' + ACCEPT_NODE + '}'); - break; - case 'gt': - source = source.replace(ACCEPT_NODE, 'if(x++>' + match[3] + '){' + ACCEPT_NODE + '}'); - break; - default: - status = false; - break; - } - break; - } - - // compiler will add this to "source" - return { - 'source': source, - 'status': status - }; - -}); - - -// for element pseudo-classes extensions -NW.Dom.registerSelector( - 'jquery:pseudo', - /^\:(has|checkbox|file|image|password|radio|reset|submit|text|button|input|header|hidden|visible|parent)(?:\(\s*(["']*)?([^'"()]*)\2\s*\))?(.*)/i, - function(match, source) { - - var status = true, ACCEPT_NODE = NW.Dom.ACCEPT_NODE; - - switch(match[1].toLowerCase()) { - case 'has': - source = source.replace(ACCEPT_NODE, 'if(e.getElementsByTagName("' + match[3].replace(/^\s|\s$/g, '') + '")[0]){' + ACCEPT_NODE + '}'); - break; - case 'checkbox': - case 'file': - case 'image': - case 'password': - case 'radio': - case 'reset': - case 'submit': - case 'text': - // :checkbox, :file, :image, :password, :radio, :reset, :submit, :text ... - source = 'if(e.type&&e.getAttribute("type")=="' + match[1] + '"){' + source + '}'; - break; - case 'button': - case 'input': - source = 'if(e.type||/button/i.test(e.nodeName)){' + source + '}'; - break; - case 'header': - source = 'if(/h[1-6]/i.test(e.nodeName)){' + source + '}'; - break; - case 'hidden': - source = 'if(!e.offsetWidth&&!e.offsetHeight){' + source + '}'; - break; - case 'visible': - source = 'if(e.offsetWidth||e.offsetHeight){' + source + '}'; - break; - case 'parent': - source += 'if(e.firstChild){' + source + '}'; - break; - default: - status = false; - break; - } - - // compiler will add this to "source" - return { - 'source': source, - 'status': status - }; - -}); diff --git a/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-pseudos.js b/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-pseudos.js deleted file mode 100644 index da5a323..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-pseudos.js +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Copyright (C) 2007-2012 Diego Perini - * All rights reserved. - * - * CSS3 pseudo-classes extension for NWMatcher - * - * Added capabilities: - * - * - structural pseudo-classes - * - * :root, :empty, - * :nth-child(), nth-of-type(), - * :nth-last-child(), nth-last-of-type(), - * :first-child, :last-child, :only-child - * :first-of-type, :last-of-type, :only-of-type - * - * - negation, language, target and UI element pseudo-classes - * - * :not(), :target, :lang(), :target - * :link, :visited, :active, :focus, :hover, - * :checked, :disabled, :enabled, :selected - */ - -(function() { - - var LINK_NODES = { - 'a': 1, 'A': 1, - 'area': 1, 'AREA': 1, - 'link': 1, 'LINK': 1 - }, - - root = document.documentElement, - - contains = 'compareDocumentPosition' in root ? - function(container, element) { - return (container.compareDocumentPosition(element) & 16) == 16; - } : 'contains' in root ? - function(container, element) { - return element.nodeType == 1 && container.contains(element); - } : - function(container, element) { - while ((element = element.parentNode) && element.nodeType == 1) { - if (element === container) return true; - } - return false; - }, - - isLink = - function(element) { - return element.getAttribute('href') && LINK_NODES[element.nodeName]; - }, - - isEmpty = - function(node) { - node = node.firstChild; - while (node) { - if (node.nodeType == 3 || node.nodeName > '@') return false; - node = node.nextSibling; - } - return true; - }, - - nthElement = - function(element, last) { - var count = 1, succ = last ? 'nextSibling' : 'previousSibling'; - while ((element = element[succ])) { - if (element.nodeName > '@') ++count; - } - return count; - }, - - nthOfType = - function(element, last) { - var count = 1, succ = last ? 'nextSibling' : 'previousSibling', type = element.nodeName; - while ((element = element[succ])) { - if (element.nodeName == type) ++count; - } - return count; - }; - - NW.Dom.Snapshot['contains'] = contains; - - NW.Dom.Snapshot['isLink'] = isLink; - NW.Dom.Snapshot['isEmpty'] = isEmpty; - NW.Dom.Snapshot['nthOfType'] = nthOfType; - NW.Dom.Snapshot['nthElement'] = nthElement; - -})(); - -NW.Dom.registerSelector( - 'nwmatcher:spseudos', - /^\:(root|empty|(?:first|last|only)(?:-child|-of-type)|nth(?:-last)?(?:-child|-of-type)\(\s*(even|odd|(?:[-+]{0,1}\d*n\s*)?[-+]{0,1}\s*\d*)\s*\))?(.*)/i, - function(match, source) { - - var a, n, b, status = true, test, type; - - switch (match[1]) { - - case 'root': - if (match[3]) - source = 'if(e===h||s.contains(h,e)){' + source + '}'; - else - source = 'if(e===h){' + source + '}'; - break; - - case 'empty': - source = 'if(s.isEmpty(e)){' + source + '}'; - break; - - default: - if (match[1] && match[2]) { - - if (match[2] == 'n') { - source = 'if(e!==h){' + source + '}'; - break; - } else if (match[2] == 'even') { - a = 2; - b = 0; - } else if (match[2] == 'odd') { - a = 2; - b = 1; - } else { - b = ((n = match[2].match(/(-?\d+)$/)) ? parseInt(n[1], 10) : 0); - a = ((n = match[2].match(/(-?\d*)n/i)) ? parseInt(n[1], 10) : 0); - if (n && n[1] == '-') a = -1; - } - test = a > 1 ? - (/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' : - 'n>=' + b + '&&(n-(' + b + '))%' + a + '==0' : a < -1 ? - (/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' : - 'n<=' + b + '&&(n-(' + b + '))%' + a + '==0' : a=== 0 ? - 'n==' + b : - (/last/i.test(match[1])) ? - a == -1 ? 'n>=' + b : 'n<=' + b : - a == -1 ? 'n<=' + b : 'n>=' + b; - source = - 'if(e!==h){' + - 'n=s[' + (/-of-type/i.test(match[1]) ? '"nthOfType"' : '"nthElement"') + ']' + - '(e,' + (/last/i.test(match[1]) ? 'true' : 'false') + ');' + - 'if(' + test + '){' + source + '}' + - '}'; - - } else if (match[1]) { - - a = /first/i.test(match[1]) ? 'previous' : 'next'; - n = /only/i.test(match[1]) ? 'previous' : 'next'; - b = /first|last/i.test(match[1]); - type = /-of-type/i.test(match[1]) ? '&&n.nodeName!==e.nodeName' : '&&n.nodeName<"@"'; - source = 'if(e!==h){' + - ( 'n=e;while((n=n.' + a + 'Sibling)' + type + ');if(!n){' + (b ? source : - 'n=e;while((n=n.' + n + 'Sibling)' + type + ');if(!n){' + source + '}') + '}' ) + '}'; - - } else { - - status = false; - - } - break; - } - - return { - 'source': source, - 'status': status - }; - -}); - -NW.Dom.registerSelector( - 'nwmatcher:dpseudos', - /^\:(link|visited|target|active|focus|hover|checked|disabled|enabled|selected|lang\(([-\w]{2,})\)|not\(([^()]*|.*)\))?(.*)/i, - (function() { - - var doc = document, - Config = NW.Dom.Config, - Tokens = NW.Dom.Tokens, - - reTrimSpace = RegExp('^\\s+|\\s+$', 'g'), - - reSimpleNot = RegExp('^((?!:not)' + - '(' + Tokens.prefixes + '|' + Tokens.identifier + - '|\\([^()]*\\))+|\\[' + Tokens.attributes + '\\])$'); - - return function(match, source) { - - var expr, status = true, test; - - switch (match[1].match(/^\w+/)[0]) { - - case 'not': - expr = match[3].replace(reTrimSpace, ''); - if (Config.SIMPLENOT && !reSimpleNot.test(expr)) { - NW.Dom.emit('Negation pseudo-class only accepts simple selectors "' + match.join('') + '"'); - } else { - if ('compatMode' in doc) { - source = 'if(!' + NW.Dom.compile(expr, '', false) + '(e,s,r,d,h,g)){' + source + '}'; - } else { - source = 'if(!s.match(e, "' + expr.replace(/\x22/g, '\\"') + '",g)){' + source +'}'; - } - } - break; - - case 'checked': - source = 'if((typeof e.form!=="undefined"&&(/^(?:radio|checkbox)$/i).test(e.type)&&e.checked)' + - (Config.USE_HTML5 ? '||(/^option$/i.test(e.nodeName)&&(e.selected||e.checked))' : '') + - '){' + source + '}'; - break; - - case 'disabled': - source = 'if(((typeof e.form!=="undefined"' + - (Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') + - ')||s.isLink(e))&&e.disabled===true){' + source + '}'; - break; - - case 'enabled': - source = 'if(((typeof e.form!=="undefined"' + - (Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') + - ')||s.isLink(e))&&e.disabled===false){' + source + '}'; - break; - - case 'lang': - test = ''; - if (match[2]) test = match[2].substr(0, 2) + '-'; - source = 'do{(n=e.lang||"").toLowerCase();' + - 'if((n==""&&h.lang=="' + match[2].toLowerCase() + '")||' + - '(n&&(n=="' + match[2].toLowerCase() + - '"||n.substr(0,3)=="' + test.toLowerCase() + '")))' + - '{' + source + 'break;}}while((e=e.parentNode)&&e!==g);'; - break; - - case 'target': - n = doc.location ? doc.location.hash : ''; - if (n) { - source = 'if(e.id=="' + n.slice(1) + '"){' + source + '}'; - } - break; - - case 'link': - source = 'if(s.isLink(e)&&!e.visited){' + source + '}'; - break; - - case 'visited': - source = 'if(s.isLink(e)&&e.visited){' + source + '}'; - break; - - case 'active': - source = 'if(e===d.activeElement){' + source + '}'; - break; - - case 'hover': - source = 'if(e===d.hoverElement){' + source + '}'; - break; - - case 'focus': - source = 'hasFocus' in doc ? - 'if(e===d.activeElement&&d.hasFocus()&&(e.type||e.href||!isNaN(e.tabIndex))){' + source + '}' : - 'if(e===d.activeElement&&(e.type||e.href)){' + source + '}'; - break; - - case 'selected': - source = 'if(/^option$/i.test(e.nodeName)&&(e.selected||e.checked)){' + source + '}'; - break; - - default: - status = false; - break; - } - - return { - 'source': source, - 'status': status - }; - - }; - - })()); diff --git a/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-shortcuts.js b/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-shortcuts.js deleted file mode 100644 index ce6ce62..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-shortcuts.js +++ /dev/null @@ -1,35 +0,0 @@ -NW.Dom.shortcuts = (function() { - - // match missing R/L context - var nextID = 0, - reLeftContext = /^[\x20\t\n\r\f]*[>+~]/, - reRightContext = /[>+~][\x20\t\n\r\f]*$/; - - return function(selector, from, alt) { - - // add left context if missing - if (reLeftContext.test(selector)) { - if (from.nodeType == 9) { - selector = '* ' + selector; - } else if (/html|body/i.test(from.nodeName)) { - selector = from.nodeName + ' ' + selector; - } else if (alt) { - selector = NW.Dom.shortcuts(selector, alt); - } else if (from.nodeType == 1 && from.id) { - selector = '#' + from.id + ' ' + selector; - } else { - ++nextID; - selector = '#' + (from.id = 'NW' + nextID) + ' ' + selector; - //NW.Dom.emit('Unable to resolve a context for the shortcut selector "' + selector + '"'); - } - } - - // add right context if missing - if (reRightContext.test(selector)) { - selector += ' *'; - } - - return selector; - }; - -})(); diff --git a/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-thin.js b/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-thin.js deleted file mode 100644 index 184170b..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-thin.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * NWMatcher 1.3.0 - Fast CSS3 Selector Engine - * Copyright (C) 2007-2012 Diego Perini - * See http://nwbox.com/license - */ -(function(d,e){if(typeof module==='object'&&typeof exports==='object'){module.exports=function(b){var a={};e(b,a);return a}}else{if(!d.NW){d.NW={}}if(!d.NW.Dom){d.NW.Dom={}}e(d,d.NW.Dom)}})(this,function(x,bn){var bH='nwmatcher-1.3.0',g=bn,i=x.document,t=i.documentElement,bI=[].slice,bc,J,y,z,u,bd,be,bf,bg,K='[#.:]?',bh='([~*^$|!]?={1})',p='[\\x20\\t\\n\\r\\f]*',bi='[\\x20]|[>+~][^>+~]',bj='(?:[-+]?\\d*n)?[-+]?\\d*',L='"[^"]*"'+"|'[^']*'",M='\\[.*\\]|\\(.*\\)|\\{.*\\}',n='(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)',A='(?:-?[_0-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+',bk='('+L+'|'+A+')',v=p+'('+n+'+:?'+n+'+)'+p+'(?:'+bh+p+bk+')?'+p,bo=v.replace(bk,'([\\x22\\x27]*)((?:\\\\?.)*?)\\3'),B='((?:'+bj+'|'+L+'|'+K+'|'+n+'+|\\['+v+'\\]|\\(.+\\)|'+p+'|,)+)',bp='.+',N='(?=[\\x20\\t\\n\\r\\f]*[^>+~(){}<>])(\\*|(?:'+K+A+')|'+bi+'|\\['+v+'\\]|\\('+B+'\\)|\\{'+bp+'\\}|(?:,|'+p+'))+',bq=N.replace(B,'.*'),O=RegExp(N,'g'),P=RegExp('^'+p+'|'+p+'$','g'),Q=RegExp('([^,\\\\()[\\]]+|\\[[^[\\]]*\\]|\\[.*\\]|\\([^()]+\\)|\\(.*\\)|\\{[^{}]+\\}|\\{.*\\}|\\\\.)+','g'),br=RegExp('(\\['+v+'\\]|\\('+B+'\\)|[^\\x20\\t\\n\\r\\f>+~]|\\\\.)+','g'),bs=/[\x20\t\n\r\f]+/g,bt=RegExp(A+'|^$'),bu={checked:1,disabled:1,ismap:1,multiple:1,readonly:1,selected:1},bl={value:'defaultValue',checked:'defaultChecked',selected:'defaultSelected'},bv={action:2,cite:2,codebase:2,data:2,href:2,longdesc:2,lowsrc:2,src:2,usemap:2},s={},w={'=':"n=='%m'",'^=':"n.indexOf('%m')==0",'*=':"n.indexOf('%m')>-1",'|=':"(n+'-').indexOf('%m-')==0",'~=':"(' '+n+' ').indexOf(' %m ')>-1",'$=':"n.substr(n.length-'%m'.length)=='%m'"},C={ID:RegExp('^\\*?#('+n+'+)|'+M),TAG:RegExp('^('+n+'+)|'+M),CLASS:RegExp('^\\*?\\.('+n+'+$)|'+M)},q={universal:/^\*(.*)/,id:RegExp('^#('+n+'+)(.*)'),tagName:RegExp('^('+n+'+)(.*)'),className:RegExp('^\\.('+n+'+)(.*)'),attribute:RegExp('^\\['+bo+'\\](.*)'),children:/^[\x20\t\n\r\f]*\>[\x20\t\n\r\f]*(.*)/,adjacent:/^[\x20\t\n\r\f]*\+[\x20\t\n\r\f]*(.*)/,relative:/^[\x20\t\n\r\f]*\~[\x20\t\n\r\f]*(.*)/,ancestor:/^[\x20\t\n\r\f]+(.*)/},R,r,bw='getElementsByTagName'in i,bx='getElementsByClassName'in i,S=typeof i.addEventListener!='function',by={'href':1,'lang':1,'src':1,'style':1,'title':1,'type':1,'xmlns':1,'xml:lang':1,'xml:space':1},bz=S?'.toUpperCase()':'',T='r[r.length]=c[k];if(f&&false===f(c[k]))break main;else continue main;',bA=S?'if(e.nodeName<"A")continue;':'',l={CACHING:false,SIMPLENOT:true,UNIQUE_ID:true,USE_HTML5:true,VERBOSITY:true},bB=function(b){if(typeof b=='string'){return l[b]}if(typeof b!='object'){return false}for(var a in b){l[a]=!!b[a];if(a=='SIMPLENOT'){U={};D={};V={};E={}}}O=RegExp(l.SIMPLENOT?N:bq,'g');return true},bC=function(b,a,d){var e=-1,h;while((h=a[++e])){if(false===d(b[b.length]=h)){break}}return b},m=function(b){if(l.VERBOSITY){throw Error(b);}if(x.console&&x.console.log){x.console.log(b)}},F=function(a,d){var e=i;z=a;i=a.ownerDocument||a;if(d||e!==i){t=i.documentElement;r=i.createElement('DiV').nodeName=='DiV';R=!r&&typeof i.compatMode=='string'?i.compatMode.indexOf('CSS')<0:(function(){var b=document.createElement('div').style;return b&&(b.width=1)&&b.width=='1px'})();l.CACHING&&g.setCache(true,i)}},W=function(b,a){var d=0,e=null;while((e=a[d])){if(e.getAttribute('id')==b){break}++d}return e},G=!('fileSize'in i)?function(b,a){b=b.replace(/\\([^\\]{1})/g,'$1');return a.getElementById&&a.getElementById(b)||W(b,a.getElementsByTagName('*'))}:function(b,a){var d=null;b=b.replace(/\\([^\\]{1})/g,'$1');if(r||a.nodeType!=9){return W(b,a.getElementsByTagName('*'))}if((d=a.getElementById(b))&&d.name==b&&a.getElementsByName){return W(b,a.getElementsByName(b))}return d},bD=function(b,a){a||(a=i);if(z!==a){F(a)}return G(b,a)},bE=function(b,a){a=a.toLowerCase();if(typeof b[a]=='object'){return b.attributes[a]&&b.attributes[a].value||''}return(a=='type'?b.getAttribute(a)||'':bv[a]?b.getAttribute(a,2)||'':bu[a]?b.getAttribute(a)?a:'false':((b=b.getAttributeNode(a))&&b.value)||'')},bF=t.hasAttribute?function(b,a){return b.hasAttribute(a)}:function(b,a){a=a.toLowerCase();if(bl[a]){return!!b[bl[a]]}b=b.getAttributeNode(a);return!!(b&&b.specified)},X=function(b,a,d){var e=typeof b=='string'?b.match(Q):b;typeof a=='string'||(a='');if(e.length==1){a+=bm(e[0],d?T:'f&&f(k);return true;',d)}else{var h=-1,c={},f;while((f=e[++h])){f=f.replace(P,'');if(!c[f]&&(c[f]=true)){a+=bm(f,d?T:'f&&f(k);return true;',d)}}}if(d)return Function('c,s,r,d,h,g,f,v','var N,n,x=0,k=-1,e;main:while((e=c[++k])){'+a+'}return r;');else return Function('e,s,r,d,h,g,f,v','var N,n,x=0,k=e;'+a+'return false;')},H='var z=v[@]||(v[@]=[]),l=z.length-1;while(l>=0&&z[l]!==e)--l;if(l!==-1){break;}z[z.length]=e;',bm=function(b,a,d){var e=0,h,c,f,j,k,o,Y;while(b){e++;if((c=b.match(q.universal))){h=''}else if((c=b.match(q.id))){a='if('+(r?'s.getAttribute(e,"id")':'(e.submit?s.getAttribute(e,"id"):e.id)')+'=="'+c[1]+'"){'+a+'}'}else if((c=b.match(q.tagName))){a='if(e.nodeName'+(r?'=="'+c[1]+'"':bz+'=="'+c[1].toUpperCase()+'"')+'){'+a+'}'}else if((c=b.match(q.className))){a='if((n='+(r?'e.getAttribute("class")':'e.className')+')&&n.length&&(" "+'+(R?'n.toLowerCase()':'n')+'.replace('+bs+'," ")+" ").indexOf(" '+(R?c[1].toLowerCase():c[1])+' ")>-1){'+a+'}'}else if((c=b.match(q.attribute))){if(c[2]&&!w[c[2]]){m('Unsupported operator in attribute selectors "'+b+'"');return''}o='false';if(c[4]){Y=by[c[1].toLowerCase()];c[4]=(Y?c[4].toLowerCase():c[4]).replace(/\\([0-9a-f]{2,2})/g,'\\x$1').replace(/(\x22|\x27)/g,'\\$1')}if(c[2]&&c[4]&&(o=w[c[2]])){o=o.replace(/\%m/g,c[4])}else if(c[2]=='!='||c[2]=='='){o='n'+c[2]+'="'+c[4]+'"'}h='n=s.'+(c[2]?'get':'has')+'Attribute(e,"'+c[1]+'")'+(Y?'.toLowerCase();':';');a=h+'if('+(c[2]?o:'n')+'){'+a+'}'}else if((c=b.match(q.adjacent))){a=(d?'':H.replace(/@/g,e))+a;a='var N'+e+'=e;while(e&&(e=e.previousSibling)){if(e.nodeName>"@"){'+a+'break;}}e=N'+e+';'}else if((c=b.match(q.relative))){a=(d?'':H.replace(/@/g,e))+a;a='var N'+e+'=e;e=e.parentNode.firstChild;while(e&&e!==N'+e+'){if(e.nodeName>"@"){'+a+'}e=e.nextSibling;}e=N'+e+';'}else if((c=b.match(q.children))){a=(d?'':H.replace(/@/g,e))+a;a='var N'+e+'=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){'+a+'break;}e=N'+e+';'}else if((c=b.match(q.ancestor))){a=(d?'':H.replace(/@/g,e))+a;a='var N'+e+'=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){'+a+'}e=N'+e+';'}else{h=false;k=false;for(h in s){if((c=b.match(s[h].Expression))&&c[1]){j=s[h].Callback(c,a);a=j.source;k=j.status;if(k){break}}}if(!k){m('Unknown pseudo-class selector "'+b+'"');return''}if(!h){m('Unknown token in selector "'+b+'"');return''}}if(!c){m('Invalid syntax in selector "'+b+'"');return''}b=c&&c[c.length-1]}return a},Z=function(b,a,d,e){var h;if(!(b&&b.nodeName>'@')){m('Invalid element argument');return false}else if(!a||typeof a!='string'){m('Invalid selector argument');return false}else if(z!==d){F(d||(d=b.ownerDocument))}a=a.replace(P,'');l.SHORTCUTS&&(a=NW.Dom.shortcuts(a,b,d));if(bd!=a){if((h=a.match(O))&&h[0]==a){bc=(h=a.match(Q)).length<2;bd=a;bf=h}else{m('The string "'+a+'", is not a valid CSS selector');return false}}else h=bf;if(!D[a]||U[a]!==d){D[a]=X(bc?[a]:h,'',false);U[a]=d}return D[a](b,ba,[],i,t,d,e,{})},bG=function(b,a){return bb(b,a,function(){return false})[0]||null},bb=function(b,a,d){var e,h,c,f,j,k,o=b;if(arguments.length===0){m('Not enough arguments');return[]}else if(typeof b!='string'){return[]}else if(!(/[>+~*\w\u00a1-\uffff]/.test(b))){m('Invalid or illegal selector string');return[]}else if(a&&!(/1|9|11/).test(a.nodeType)){m('Invalid or illegal context element');return[]}else if(z!==a){F(a||(a=i))}if(l.CACHING&&(f=g.loadResults(o,a,i,t))){return d?bC([],f,d):f}b=b.replace(P,'');l.SHORTCUTS&&(b=NW.Dom.shortcuts(b,a));if((h=be!=b)){if((j=b.match(O))&&j[0]==b){J=(j=b.match(Q)).length<2;be=b;bg=j}else{m('The string "'+b+'", is not a valid CSS selector');return[]}}else j=bg;if(a.nodeType==11){f=a.childNodes}else if(J){if(h){j=b.match(br);k=j[j.length-1];y=k.split(':not')[0];u=b.length-k.length}if(l.UNIQUE_ID&&(j=y.match(C.ID))&&(k=j[1])){if((c=G(k,a))){if(Z(c,b)){d&&d(c);f=[c]}else f=[]}}else if(l.UNIQUE_ID&&(j=b.match(C.ID))&&(k=j[1])){if((c=G(k,i))){if('#'+k==b){d&&d(c);f=[c]}else if(/[>+~]/.test(b)){a=c.parentNode}else{a=c}}else f=[]}if(f){l.CACHING&&g.saveResults(o,a,i,f);return f}if(!r&&bw&&(j=y.match(C.TAG))&&(k=j[1])){if((f=a.getElementsByTagName(k)).length===0)return[];b=b.slice(0,u)+b.slice(u).replace(k,'*')}else if(!r&&bx&&(j=y.match(C.CLASS))&&(k=j[1])){if((f=a.getElementsByClassName(k.replace(/\\([^\\]{1})/g,'$1'))).length===0)return[];b=b.slice(0,u)+b.slice(u).replace('.'+k,bt.test(b.charAt(b.indexOf(k)-1))?'':'*')}}if(!f){if(S){f=/^(?:applet|object)$/i.test(a.nodeName)?a.childNodes:a.all}else{f=a.getElementsByTagName('*')}}if(!E[b]||V[b]!==a){E[b]=X(J?[b]:j,bA,true);V[b]=a}f=E[b](f,ba,[],i,t,a,d,{});l.CACHING&&g.saveResults(o,a,i,f);return f},I=function(b){return b},U={},D={},V={},E={},ba={byId:G,match:Z,select:bb,getAttribute:bE,hasAttribute:bF};Tokens={prefixes:K,encoding:n,operators:bh,whitespace:p,identifier:A,attributes:v,combinators:bi,pseudoclass:B,pseudoparms:bj,quotedvalue:L};g.ACCEPT_NODE=T;g.emit=m;g.byId=bD;g.match=Z;g.first=bG;g.select=bb;g.compile=X;g.configure=bB;g.Config=l;g.Operators=w;g.Selectors=s;g.Snapshot=ba;g.Tokens=Tokens;g.setCache=I;g.shortcuts=I;g.loadResults=I;g.saveResults=I;g.registerOperator=function(b,a){w[b]||(w[b]=a)};g.registerSelector=function(b,a,d){s[b]||(s[b]={Expression:a,Callback:d})};F(i,true)}); -(function(){var h={'a':1,'A':1,'area':1,'AREA':1,'link':1,'LINK':1},g=document.documentElement,f='compareDocumentPosition'in g?function(b,a){return(b.compareDocumentPosition(a)&16)==16}:'contains'in g?function(b,a){return a.nodeType==1&&b.contains(a)}:function(b,a){while((a=a.parentNode)&&a.nodeType==1){if(a===b)return true}return false},i=function(b){return b.getAttribute('href')&&h[b.nodeName]},j=function(b){b=b.firstChild;while(b){if(b.nodeType==3||b.nodeName>'@')return false;b=b.nextSibling}return true},k=function(b,a){var c=1,e=a?'nextSibling':'previousSibling';while((b=b[e])){if(b.nodeName>'@')++c}return c},l=function(b,a){var c=1,e=a?'nextSibling':'previousSibling',d=b.nodeName;while((b=b[e])){if(b.nodeName==d)++c}return c};NW.Dom.Snapshot['contains']=f;NW.Dom.Snapshot['isLink']=i;NW.Dom.Snapshot['isEmpty']=j;NW.Dom.Snapshot['nthOfType']=l;NW.Dom.Snapshot['nthElement']=k})();NW.Dom.registerSelector('nwmatcher:spseudos',/^\:(root|empty|(?:first|last|only)(?:-child|-of-type)|nth(?:-last)?(?:-child|-of-type)\(\s*(even|odd|(?:[-+]{0,1}\d*n\s*)?[-+]{0,1}\s*\d*)\s*\))?(.*)/i,function(b,a){var c,e,d,h=true,g,f;switch(b[1]){case'root':if(b[3])a='if(e===h||s.contains(h,e)){'+a+'}';else a='if(e===h){'+a+'}';break;case'empty':a='if(s.isEmpty(e)){'+a+'}';break;default:if(b[1]&&b[2]){if(b[2]=='n'){a='if(e!==h){'+a+'}';break}else if(b[2]=='even'){c=2;d=0}else if(b[2]=='odd'){c=2;d=1}else{d=((e=b[2].match(/(-?\d+)$/))?parseInt(e[1],10):0);c=((e=b[2].match(/(-?\d*)n/i))?parseInt(e[1],10):0);if(e&&e[1]=='-')c=-1}g=c>1?(/last/i.test(b[1]))?'(n-('+d+'))%'+c+'==0':'n>='+d+'&&(n-('+d+'))%'+c+'==0':c<-1?(/last/i.test(b[1]))?'(n-('+d+'))%'+c+'==0':'n<='+d+'&&(n-('+d+'))%'+c+'==0':c===0?'n=='+d:(/last/i.test(b[1]))?c==-1?'n>='+d:'n<='+d:c==-1?'n<='+d:'n>='+d;a='if(e!==h){n=s['+(/-of-type/i.test(b[1])?'"nthOfType"':'"nthElement"')+'](e,'+(/last/i.test(b[1])?'true':'false')+');if('+g+'){'+a+'}}'}else if(b[1]){c=/first/i.test(b[1])?'previous':'next';e=/only/i.test(b[1])?'previous':'next';d=/first|last/i.test(b[1]);f=/-of-type/i.test(b[1])?'&&n.nodeName!==e.nodeName':'&&n.nodeName<"@"';a='if(e!==h){'+('n=e;while((n=n.'+c+'Sibling)'+f+');if(!n){'+(d?a:'n=e;while((n=n.'+e+'Sibling)'+f+');if(!n){'+a+'}')+'}')+'}'}else{h=false}break}return{'source':a,'status':h}});NW.Dom.registerSelector('nwmatcher:dpseudos',/^\:(link|visited|target|active|focus|hover|checked|disabled|enabled|selected|lang\(([-\w]{2,})\)|not\(([^()]*|.*)\))?(.*)/i,(function(){var h=document,g=NW.Dom.Config,f=NW.Dom.Tokens,i=RegExp('^'+f.whitespace+'|'+f.whitespace+'$','g'),j=RegExp('^((?!:not)('+f.prefixes+'|'+f.identifier+'|\\([^()]*\\))+|\\['+f.attributes+'\\])$');return function(b,a){var c,e=true,d;switch(b[1].match(/^\w+/)[0]){case'not':c=b[3].replace(i,'');if(g.SIMPLENOT&&!j.test(c)){NW.Dom.emit('Negation pseudo-class only accepts simple selectors "'+b.join('')+'"')}else{if('compatMode'in h){a='if(!'+NW.Dom.compile(c,'',false)+'(e,s,r,d,h,g)){'+a+'}'}else{a='if(!s.match(e, "'+c.replace(/\x22/g,'\\"')+'",g)){'+a+'}'}}break;case'checked':a='if((typeof e.form!=="undefined"&&(/^(?:radio|checkbox)$/i).test(e.type)&&e.checked)'+(g.USE_HTML5?'||(/^option$/i.test(e.nodeName)&&(e.selected||e.checked))':'')+'){'+a+'}';break;case'disabled':a='if(((typeof e.form!=="undefined"'+(g.USE_HTML5?'':'&&!(/^hidden$/i).test(e.type)')+')||s.isLink(e))&&e.disabled===true){'+a+'}';break;case'enabled':a='if(((typeof e.form!=="undefined"'+(g.USE_HTML5?'':'&&!(/^hidden$/i).test(e.type)')+')||s.isLink(e))&&e.disabled===false){'+a+'}';break;case'lang':d='';if(b[2])d=b[2].substr(0,2)+'-';a='do{(n=e.lang||"").toLowerCase();if((n==""&&h.lang=="'+b[2].toLowerCase()+'")||(n&&(n=="'+b[2].toLowerCase()+'"||n.substr(0,3)=="'+d.toLowerCase()+'"))){'+a+'break;}}while((e=e.parentNode)&&e!==g);';break;case'target':n=h.location?h.location.hash:'';if(n){a='if(e.id=="'+n.slice(1)+'"){'+a+'}'}break;case'link':a='if(s.isLink(e)&&!e.visited){'+a+'}';break;case'visited':a='if(s.isLink(e)&&e.visited){'+a+'}';break;case'active':a='if(e===d.activeElement){'+a+'}';break;case'hover':a='if(e===d.hoverElement){'+a+'}';break;case'focus':a='hasFocus'in h?'if(e===d.activeElement&&d.hasFocus()&&(e.type||e.href||!isNaN(e.tabIndex))){'+a+'}':'if(e===d.activeElement&&(e.type||e.href)){'+a+'}';break;case'selected':a='if(/^option$/i.test(e.nodeName)&&(e.selected||e.checked)){'+a+'}';break;default:e=false;break}return{'source':a,'status':e}}})()); diff --git a/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-traversal.js b/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-traversal.js deleted file mode 100644 index 9d2b62f..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-traversal.js +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Element Traversal methods from Juriy Zaytsev (kangax) - * used to emulate Prototype up/down/previous/next methods - */ - -(function(D){ - - // TODO: all of this needs tests - var match = D.match, select = D.select, root = document.documentElement, - - // Use the Element Traversal API if available. - nextElement = 'nextElementSibling', - previousElement = 'previousElementSibling', - parentElement = 'parentElement'; - - // Fall back to the DOM Level 1 API. - if (!(nextElement in root)) nextElement = 'nextSibling'; - if (!(previousElement in root)) previousElement = 'previousSibling'; - if (!(parentElement in root)) parentElement = 'parentNode'; - - function walkElements(property, element, expr) { - var i = 0, isIndex = typeof expr == 'number'; - if (typeof expr == 'undefined') { - isIndex = true; - expr = 0; - } - while ((element = element[property])) { - if (element.nodeType != 1) continue; - if (isIndex) { - ++i; - if (i == expr) return element; - } else if (match(element, expr)) { - return element; - } - } - return null; - } - - /** - * @method up - * @param {HTMLElement} element element to walk from - * @param {String | Number} expr CSS expression or an index - * @return {HTMLElement | null} - */ - function up(element, expr) { - return walkElements(parentElement, element, expr); - } - /** - * @method next - * @param {HTMLElement} element element to walk from - * @param {String | Number} expr CSS expression or an index - * @return {HTMLElement | null} - */ - function next(element, expr) { - return walkElements(nextElement, element, expr); - } - /** - * @method previous - * @param {HTMLElement} element element to walk from - * @param {String | Number} expr CSS expression or an index - * @return {HTMLElement | null} - */ - function previous(element, expr) { - return walkElements(previousElement, element, expr); - } - /** - * @method down - * @param {HTMLElement} element element to walk from - * @param {String | Number} expr CSS expression or an index - * @return {HTMLElement | null} - */ - function down(element, expr) { - var isIndex = typeof expr == 'number', descendants, index, descendant; - if (expr === null) { - element = element.firstChild; - while (element && element.nodeType != 1) element = element[nextElement]; - return element; - } - if (!isIndex && match(element, expr) || isIndex && expr === 0) return element; - descendants = select('*', element); - if (isIndex) return descendants[expr] || null; - index = 0; - while ((descendant = descendants[index]) && !match(descendant, expr)) { ++index; } - return descendant || null; - } - D.up = up; - D.down = down; - D.next = next; - D.previous = previous; -})(NW.Dom); diff --git a/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-webforms.js b/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-webforms.js deleted file mode 100644 index f8fabc2..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/src/modules/nwmatcher-webforms.js +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2007-2010 Diego Perini - * All rights reserved. - * - * this is just a small example to show - * how an extension for NWMatcher could be - * adapted to handle WebForms/HTML5 selectors - * - * Pseudo Selectors - * :default, :indeterminate, :optional, :required, - * :valid, :invalid, :in-range, :out-of-range, - * :read-only, :read-write - * :has, :matches (not yet in a defined specification) - * - */ - -// for UI pseudo-classes extensions (WebForms/HTML5) -NW.Dom.registerSelector( - 'html5:pseudos', - /^\:(default|indeterminate|optional|required|valid|invalid|in-range|out-of-range|read-only|read-write)(.*)/, - function(match, source) { - - var status = true, - - HTML5PseudoClasses = { - 'default': 4, 'indeterminate': 4, 'invalid': 4, 'valid': 4, - 'optional': 4, 'required': 4, 'read-write': 4, 'read-only': 4 - }; - - switch (match[1]) { - - // HTML5 UI element states (form controls) - case 'default': - // only radio buttons, check boxes and option elements - source = 'if(((typeof e.form!=="undefined"&&(/radio|checkbox/i).test(e.type))||/option/i.test(e.nodeName))&&(e.defaultChecked||e.defaultSelected)){' + source + '}'; - break; - - case 'indeterminate': - // only radio buttons, check boxes and option elements - source = 'if(typeof e.form!=="undefined"&&(/radio|checkbox/i).test(e.type)&&s.select("[checked]",e.form).length===0){' + source + '}'; - break; - - case 'optional': - // only fields for which "required" applies - source = 'if(typeof e.form!=="undefined"&&typeof e.required!="undefined"&&!e.required){' + source + '}'; - break; - - case 'required': - // only fields for which "required" applies - source = 'if(typeof e.form!=="undefined"&&typeof e.required!="undefined"&&e.required){' + source + '}'; - break; - - case 'read-write': - // only fields for which "readOnly" applies - source = 'if(typeof e.form!=="undefined"&&typeof e.readOnly!="undefined"&&!e.readOnly){' + source + '}'; - break; - - case 'read-only': - // only fields for which "readOnly" applies - source = 'if(typeof e.form!=="undefined"&&typeof e.readOnly!="undefined"&&e.readOnly){' + source + '}'; - break; - - case 'invalid': - // only fields for which validity applies - source = 'if(typeof e.form!=="undefined"&&typeof e.validity=="object"&&!e.validity.valid){' + source + '}'; - break; - - case 'valid': - // only fields for which validity applies - source = 'if(typeof e.form!=="undefined"&&typeof e.validity=="object"&&e.validity.valid){' + source + '}'; - break; - - case 'in-range': - // only fields for which validity applies - source = 'if(typeof e.form!=="undefined"&&' + - '(s.getAttribute(e,"min")||s.getAttribute(e,"max"))&&' + - 'typeof e.validity=="object"&&!e.validity.typeMismatch&&' + - '!e.validity.rangeUnderflow&&!e.validity.rangeOverflow){' + source + '}'; - break; - - case 'out-of-range': - // only fields for which validity applies - source = 'if(typeof e.form!=="undefined"&&' + - '(s.getAttribute(e,"min")||s.getAttribute(e,"max"))&&' + - 'typeof e.validity=="object"&&(e.validity.rangeUnderflow||e.validity.rangeOverflow)){' + source + '}'; - break; - - default: - status = false; - break; - - } - - // compiler will add this to "source" - return { - 'source': source, - 'status': status - }; - -}); diff --git a/node_modules/jsdom/node_modules/nwmatcher/src/nwmatcher-base.js b/node_modules/jsdom/node_modules/nwmatcher/src/nwmatcher-base.js deleted file mode 100644 index 43e7e7f..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/src/nwmatcher-base.js +++ /dev/null @@ -1,686 +0,0 @@ -/* - * Copyright (C) 2007-2012 Diego Perini - * All rights reserved. - * - * nwmatcher-base.js - A fast CSS selector engine and matcher - * - * Author: Diego Perini - * Version: 1.3.0 - * Created: 20070722 - * Release: 20130110 - * - * License: - * http://javascript.nwbox.com/NWMatcher/MIT-LICENSE - * Download: - * http://javascript.nwbox.com/NWMatcher/nwmatcher.js - */ - -(function(global, factory) { - - if (typeof module === 'object' && typeof exports === 'object') { - module.exports = function (browserGlobal) { - var exports = { }; - factory(browserGlobal, exports); - return exports; - }; - } else { - if (!global.NW) { - global.NW = { }; - } - if (!global.NW.Dom) { - global.NW.Dom = { }; - } - factory(global, global.NW.Dom); - } - -})(this, function(global, exports) { - - var version = 'nwmatcher-1.3.0', - - Dom = exports, - - doc = global.document, - root = doc.documentElement, - - slice = [ ].slice, - - isSingleMatch, - isSingleSelect, - - lastSlice, - lastContext, - lastPosition, - - lastMatcher, - lastSelector, - - lastPartsMatch, - lastPartsSelect, - - prefixes = '[#.:]?', - operators = '([~*^$|!]?={1})', - whitespace = '[\\x20\\t\\n\\r\\f]*', - combinators = '[\\x20]|[>+~][^>+~]', - pseudoparms = '(?:[-+]?\\d*n)?[-+]?\\d*', - - quotedvalue = '"[^"]*"' + "|'[^']*'", - skipgroup = '\\[.*\\]|\\(.*\\)|\\{.*\\}', - - encoding = '(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)', - identifier = '(?:-?[_a-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+', - - attrcheck = '(' + quotedvalue + '|' + identifier + ')', - attributes = whitespace + '(' + encoding + '+:?' + encoding + '+)' + - whitespace + '(?:' + operators + whitespace + attrcheck + ')?' + whitespace, - - attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'), - - pseudoclass = '((?:' + - pseudoparms + '|' + quotedvalue + '|' + - prefixes + '|' + encoding + '+|' + - '\\[' + attributes + '\\]|' + - '\\(.+\\)|' + whitespace + '|' + - ',)+)', - - extensions = '.+', - - standardValidator = - '(?=[\\x20\\t\\n\\r\\f]*[^>+~(){}<>])' + - '(' + - '\\*' + - '|(?:' + prefixes + identifier + ')' + - '|' + combinators + - '|\\[' + attributes + '\\]' + - '|\\(' + pseudoclass + '\\)' + - '|\\{' + extensions + '\\}' + - '|(?:,|' + whitespace + ')' + - ')+', - - extendedValidator = standardValidator.replace(pseudoclass, '.*'), - - reValidator = RegExp(standardValidator, 'g'), - - reTrimSpaces = RegExp('^' + - whitespace + '|' + whitespace + '$', 'g'), - - reSplitGroup = RegExp('(' + - '[^,\\\\()[\\]]+' + - '|\\[[^[\\]]*\\]|\\[.*\\]' + - '|\\([^()]+\\)|\\(.*\\)' + - '|\\{[^{}]+\\}|\\{.*\\}' + - '|\\\\.' + - ')+', 'g'), - - reSplitToken = RegExp('(' + - '\\[' + attributes + '\\]|' + - '\\(' + pseudoclass + '\\)|' + - '[^\\x20\\t\\n\\r\\f>+~]|\\\\.)+', 'g'), - - reWhiteSpace = /[\x20\t\n\r\f]+/g, - - reOptimizeSelector = RegExp(identifier + '|^$'), - - ATTR_BOOLEAN = { - checked: 1, disabled: 1, ismap: 1, - multiple: 1, readonly: 1, selected: 1 - }, - - ATTR_DEFAULT = { - value: 'defaultValue', - checked: 'defaultChecked', - selected: 'defaultSelected' - }, - - ATTR_URIDATA = { - action: 2, cite: 2, codebase: 2, data: 2, href: 2, - longdesc: 2, lowsrc: 2, src: 2, usemap: 2 - }, - - Selectors = { }, - - Operators = { - '=': "n=='%m'", - '^=': "n.indexOf('%m')==0", - '*=': "n.indexOf('%m')>-1", - '|=': "(n+'-').indexOf('%m-')==0", - '~=': "(' '+n+' ').indexOf(' %m ')>-1", - '$=': "n.substr(n.length-'%m'.length)=='%m'" - }, - - Optimize = { - ID: RegExp('^\\*?#(' + encoding + '+)|' + skipgroup), - TAG: RegExp('^(' + encoding + '+)|' + skipgroup), - CLASS: RegExp('^\\*?\\.(' + encoding + '+$)|' + skipgroup) - }, - - Patterns = { - universal: /^\*(.*)/, - id: RegExp('^#(' + encoding + '+)(.*)'), - tagName: RegExp('^(' + encoding + '+)(.*)'), - className: RegExp('^\\.(' + encoding + '+)(.*)'), - attribute: RegExp('^\\[' + attrmatcher + '\\](.*)'), - children: /^[\x20\t\n\r\f]*\>[\x20\t\n\r\f]*(.*)/, - adjacent: /^[\x20\t\n\r\f]*\+[\x20\t\n\r\f]*(.*)/, - relative: /^[\x20\t\n\r\f]*\~[\x20\t\n\r\f]*(.*)/, - ancestor: /^[\x20\t\n\r\f]+(.*)/ - }, - - QUIRKS_MODE, - XML_DOCUMENT, - - GEBTN = 'getElementsByTagName' in doc, - GEBCN = 'getElementsByClassName' in doc, - - IE_LT_9 = typeof doc.addEventListener != 'function', - - INSENSITIVE_MAP = { - 'href': 1, 'lang': 1, 'src': 1, 'style': 1, 'title': 1, - 'type': 1, 'xmlns': 1, 'xml:lang': 1, 'xml:space': 1 - }, - - TO_UPPER_CASE = IE_LT_9 ? '.toUpperCase()' : '', - - ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break main;else continue main;', - REJECT_NODE = IE_LT_9 ? 'if(e.nodeName<"A")continue;' : '', - - Config = { - CACHING: false, - SIMPLENOT: true, - UNIQUE_ID: true, - USE_HTML5: true, - VERBOSITY: true - }, - - configure = - function(option) { - if (typeof option == 'string') { return Config[option]; } - if (typeof option != 'object') { return false; } - for (var i in option) { - Config[i] = !!option[i]; - if (i == 'SIMPLENOT') { - matchContexts = { }; - matchResolvers = { }; - selectContexts = { }; - selectResolvers = { }; - } - } - reValidator = RegExp(Config.SIMPLENOT ? - standardValidator : extendedValidator, 'g'); - return true; - }, - - concatCall = - function(data, elements, callback) { - var i = -1, element; - while ((element = elements[++i])) { - if (false === callback(data[data.length] = element)) { break; } - } - return data; - }, - - emit = - function(message) { - if (Config.VERBOSITY) { throw Error(message); } - if (global.console && global.console.log) { - global.console.log(message); - } - }, - - switchContext = - function(from, force) { - var oldDoc = doc; - lastContext = from; - doc = from.ownerDocument || from; - if (force || oldDoc !== doc) { - root = doc.documentElement; - XML_DOCUMENT = doc.createElement('DiV').nodeName == 'DiV'; - QUIRKS_MODE = !XML_DOCUMENT && - typeof doc.compatMode == 'string' ? - doc.compatMode.indexOf('CSS') < 0 : - (function() { - var style = document.createElement('div').style; - return style && (style.width = 1) && style.width == '1px'; - })(); - - Config.CACHING && Dom.setCache(true, doc); - } - }, - - byIdRaw = - function(id, elements) { - var i = 0, element = null; - while ((element = elements[i])) { - if (element.getAttribute('id') == id) { - break; - } - ++i; - } - return element; - }, - - _byId = !('fileSize' in doc) ? - function(id, from) { - id = id.replace(/\\([^\\]{1})/g, '$1'); - return from.getElementById && from.getElementById(id) || - byIdRaw(id, from.getElementsByTagName('*')); - } : - function(id, from) { - var element = null; - id = id.replace(/\\([^\\]{1})/g, '$1'); - if (XML_DOCUMENT || from.nodeType != 9) { - return byIdRaw(id, from.getElementsByTagName('*')); - } - if ((element = from.getElementById(id)) && - element.name == id && from.getElementsByName) { - return byIdRaw(id, from.getElementsByName(id)); - } - return element; - }, - - byId = - function(id, from) { - from || (from = doc); - if (lastContext !== from) { switchContext(from); } - return _byId(id, from); - }, - - getAttribute = - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (typeof node[attribute] == 'object') { - return node.attributes[attribute] && - node.attributes[attribute].value || ''; - } - return ( - attribute == 'type' ? node.getAttribute(attribute) || '' : - ATTR_URIDATA[attribute] ? node.getAttribute(attribute, 2) || '' : - ATTR_BOOLEAN[attribute] ? node.getAttribute(attribute) ? attribute : 'false' : - ((node = node.getAttributeNode(attribute)) && node.value) || ''); - }, - - hasAttribute = root.hasAttribute ? - function(node, attribute) { - return node.hasAttribute(attribute); - } : - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (ATTR_DEFAULT[attribute]) { - return !!node[ATTR_DEFAULT[attribute]]; - } - node = node.getAttributeNode(attribute); - return !!(node && node.specified); - }, - - compile = - function(selector, source, mode) { - - var parts = typeof selector == 'string' ? selector.match(reSplitGroup) : selector; - - typeof source == 'string' || (source = ''); - - if (parts.length == 1) { - source += compileSelector(parts[0], mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } else { - var i = -1, seen = { }, token; - while ((token = parts[++i])) { - token = token.replace(reTrimSpaces, ''); - if (!seen[token] && (seen[token] = true)) { - source += compileSelector(token, mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } - } - } - - if (mode) - return Function('c,s,r,d,h,g,f,v', - 'var N,n,x=0,k=-1,e;main:while((e=c[++k])){' + source + '}return r;'); - else - return Function('e,s,r,d,h,g,f,v', - 'var N,n,x=0,k=e;' + source + 'return false;'); - }, - - FILTER = - 'var z=v[@]||(v[@]=[]),l=z.length-1;' + - 'while(l>=0&&z[l]!==e)--l;' + - 'if(l!==-1){break;}' + - 'z[z.length]=e;', - - compileSelector = - function(selector, source, mode) { - - var k = 0, expr, match, name, result, status, test, type; - - while (selector) { - - k++; - - if ((match = selector.match(Patterns.universal))) { - expr = ''; - } - - else if ((match = selector.match(Patterns.id))) { - source = 'if(' + (XML_DOCUMENT ? - 's.getAttribute(e,"id")' : - '(e.submit?s.getAttribute(e,"id"):e.id)') + - '=="' + match[1] + '"' + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.tagName))) { - source = 'if(e.nodeName' + (XML_DOCUMENT ? - '=="' + match[1] + '"' : TO_UPPER_CASE + - '=="' + match[1].toUpperCase() + '"') + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.className))) { - source = 'if((n=' + (XML_DOCUMENT ? - 'e.getAttribute("class")' : 'e.className') + - ')&&n.length&&(" "+' + (QUIRKS_MODE ? 'n.toLowerCase()' : 'n') + - '.replace(' + reWhiteSpace + '," ")+" ").indexOf(" ' + - (QUIRKS_MODE ? match[1].toLowerCase() : match[1]) + ' ")>-1' + - '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.attribute))) { - if (match[2] && !Operators[match[2]]) { - emit('Unsupported operator in attribute selectors "' + selector + '"'); - return ''; - } - test = 'false'; - if (match[4]) { - type = INSENSITIVE_MAP[match[1].toLowerCase()]; - match[4] = - (type ? match[4].toLowerCase() : match[4]) - .replace(/\\([0-9a-f]{2,2})/g, '\\x$1') - .replace(/(\x22|\x27)/g, '\\$1'); - } - if (match[2] && match[4] && (test = Operators[match[2]])) { - test = test.replace(/\%m/g, match[4]); - } else if (match[2] == '!=' || match[2] == '=') { - test = 'n' + match[2] + '="' + match[4] + '"'; - } - expr = 'n=s.' + (match[2] ? 'get' : 'has') + 'Attribute(e,"' + match[1] + '")' + (type ? '.toLowerCase();' : ';'); - source = expr + 'if(' + (match[2] ? test : 'n') + '){' + source + '}'; - } - - else if ((match = selector.match(Patterns.adjacent))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&(e=e.previousSibling)){if(e.nodeName>"@"){' + source + 'break;}}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.relative))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;e=e.parentNode.firstChild;while(e&&e!==N' + k + '){if(e.nodeName>"@"){' + source + '}e=e.nextSibling;}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.children))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + 'break;}e=N' + k + ';'; - } - - else if ((match = selector.match(Patterns.ancestor))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + '}e=N' + k + ';'; - } - - else { - - expr = false; - status = false; - for (expr in Selectors) { - if ((match = selector.match(Selectors[expr].Expression)) && match[1]) { - result = Selectors[expr].Callback(match, source); - source = result.source; - status = result.status; - if (status) { break; } - } - } - - if (!status) { - emit('Unknown pseudo-class selector "' + selector + '"'); - return ''; - } - - if (!expr) { - emit('Unknown token in selector "' + selector + '"'); - return ''; - } - - } - - if (!match) { - emit('Invalid syntax in selector "' + selector + '"'); - return ''; - } - - selector = match && match[match.length - 1]; - } - - return source; - }, - - match = - function(element, selector, from, callback) { - - var parts; - - if (!(element && element.nodeName > '@')) { - emit('Invalid element argument'); - return false; - } else if (!selector || typeof selector != 'string') { - emit('Invalid selector argument'); - return false; - } else if (lastContext !== from) { - switchContext(from || (from = element.ownerDocument)); - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, element, from)); - - if (lastMatcher != selector) { - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleMatch = (parts = selector.match(reSplitGroup)).length < 2; - lastMatcher = selector; - lastPartsMatch = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return false; - } - } else parts = lastPartsMatch; - - if (!matchResolvers[selector] || matchContexts[selector] !== from) { - matchResolvers[selector] = compile(isSingleMatch ? [selector] : parts, '', false); - matchContexts[selector] = from; - } - - return matchResolvers[selector](element, Snapshot, [ ], doc, root, from, callback, { }); - }, - - first = - function(selector, from) { - return select(selector, from, function() { return false; })[0] || null; - }, - - select = - function(selector, from, callback) { - - var i, changed, element, elements, parts, token, original = selector; - - if (arguments.length === 0) { - emit('Not enough arguments'); - return [ ]; - } else if (typeof selector != 'string') { - return [ ]; - } else if (!(/[>+~*\w\u00a1-\uffff]/.test(selector))) { - emit('Invalid or illegal selector string'); - return [ ]; - } else if (from && !(/1|9|11/).test(from.nodeType)) { - emit('Invalid or illegal context element'); - return [ ]; - } else if (lastContext !== from) { - switchContext(from || (from = doc)); - } - - if (Config.CACHING && (elements = Dom.loadResults(original, from, doc, root))) { - return callback ? concatCall([ ], elements, callback) : elements; - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, from)); - - if ((changed = lastSelector != selector)) { - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleSelect = (parts = selector.match(reSplitGroup)).length < 2; - lastSelector = selector; - lastPartsSelect = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return [ ]; - } - } else parts = lastPartsSelect; - - if (from.nodeType == 11) { - - elements = from.childNodes; - - } else if (isSingleSelect) { - - if (changed) { - parts = selector.match(reSplitToken); - token = parts[parts.length - 1]; - lastSlice = token.split(':not')[0]; - lastPosition = selector.length - token.length; - } - - if (Config.UNIQUE_ID && (parts = lastSlice.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, from))) { - if (match(element, selector)) { - callback && callback(element); - elements = [ element ]; - } else elements = [ ]; - } - } - - else if (Config.UNIQUE_ID && (parts = selector.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, doc))) { - if ('#' + token == selector) { - callback && callback(element); - elements = [ element ]; - } else if (/[>+~]/.test(selector)) { - from = element.parentNode; - } else { - from = element; - } - } else elements = [ ]; - } - - if (elements) { - Config.CACHING && Dom.saveResults(original, from, doc, elements); - return elements; - } - - if (!XML_DOCUMENT && GEBTN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) { - if ((elements = from.getElementsByTagName(token)).length === 0) return [ ]; - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*'); - } - - else if (!XML_DOCUMENT && GEBCN && (parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) { - if ((elements = from.getElementsByClassName(token.replace(/\\([^\\]{1})/g, '$1'))).length === 0) return [ ]; - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, - reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1)) ? '' : '*'); - } - - } - - if (!elements) { - if (IE_LT_9) { - elements = /^(?:applet|object)$/i.test(from.nodeName) ? - from.childNodes : from.all; - } else { - elements = from.getElementsByTagName('*'); - } - } - - if (!selectResolvers[selector] || selectContexts[selector] !== from) { - selectResolvers[selector] = compile(isSingleSelect ? [selector] : parts, REJECT_NODE, true); - selectContexts[selector] = from; - } - - elements = selectResolvers[selector](elements, Snapshot, [ ], doc, root, from, callback, { }); - - Config.CACHING && Dom.saveResults(original, from, doc, elements); - - return elements; - }, - - FN = function(x) { return x; }, - - matchContexts = { }, - matchResolvers = { }, - - selectContexts = { }, - selectResolvers = { }, - - Snapshot = { - byId: _byId, - match: match, - select: select, - getAttribute: getAttribute, - hasAttribute: hasAttribute - }; - - Tokens = { - prefixes: prefixes, - encoding: encoding, - operators: operators, - whitespace: whitespace, - identifier: identifier, - attributes: attributes, - combinators: combinators, - pseudoclass: pseudoclass, - pseudoparms: pseudoparms, - quotedvalue: quotedvalue - }; - - Dom.ACCEPT_NODE = ACCEPT_NODE; - - Dom.emit = emit; - - Dom.byId = byId; - Dom.match = match; - Dom.first = first; - Dom.select = select; - Dom.compile = compile; - Dom.configure = configure; - - Dom.Config = Config; - - Dom.Operators = Operators; - Dom.Selectors = Selectors; - - Dom.Snapshot = Snapshot; - Dom.Tokens = Tokens; - - Dom.setCache = FN; - Dom.shortcuts = FN; - Dom.loadResults = FN; - Dom.saveResults = FN; - - Dom.registerOperator = - function(symbol, resolver) { - Operators[symbol] || (Operators[symbol] = resolver); - }; - - Dom.registerSelector = - function(name, rexp, func) { - Selectors[name] || (Selectors[name] = { - Expression: rexp, - Callback: func - }); - }; - - switchContext(doc, true); - -}); diff --git a/node_modules/jsdom/node_modules/nwmatcher/src/nwmatcher.js b/node_modules/jsdom/node_modules/nwmatcher/src/nwmatcher.js deleted file mode 100644 index 63873ea..0000000 --- a/node_modules/jsdom/node_modules/nwmatcher/src/nwmatcher.js +++ /dev/null @@ -1,1659 +0,0 @@ -/* - * Copyright (C) 2007-2012 Diego Perini - * All rights reserved. - * - * nwmatcher.js - A fast CSS selector engine and matcher - * - * Author: Diego Perini - * Version: 1.3.0 - * Created: 20070722 - * Release: 20130110 - * - * License: - * http://javascript.nwbox.com/NWMatcher/MIT-LICENSE - * Download: - * http://javascript.nwbox.com/NWMatcher/nwmatcher.js - */ - -(function(global, factory) { - - if (typeof module === 'object' && typeof exports === 'object') { - // in a Node.js environment, the nwmatcher functions will operate on - // the passed "browserGlobal" and will be returned in an object - module.exports = function (browserGlobal) { - var exports = { }; - factory(browserGlobal, exports); - return exports; - }; - } else { - // in a browser environment, the nwmatcher functions will operate on - // the "global" loading them and be attached to "global.NW.Dom" - if (!global.NW) { - global.NW = { }; - } - if (!global.NW.Dom) { - global.NW.Dom = { }; - } - factory(global, global.NW.Dom); - } - -})(this, function(global, exports) { - - var version = 'nwmatcher-1.3.0', - - Dom = exports, - - // processing context & root element - doc = global.document, - root = doc.documentElement, - - // save utility methods references - slice = [ ].slice, - string = { }.toString, - - // persist previous parsed data - isSingleMatch, - isSingleSelect, - - lastSlice, - lastContext, - lastPosition, - - lastMatcher, - lastSelector, - - lastPartsMatch, - lastPartsSelect, - - // accepted prefix identifiers - // (id, class & pseudo-class) - prefixes = '[#.:]?', - - // accepted attribute operators - operators = '([~*^$|!]?={1})', - - // accepted whitespace characters - whitespace = '[\\x20\\t\\n\\r\\f]*', - - // 4 combinators F E, F>E, F+E, F~E - combinators = '[\\x20]|[>+~][^>+~]', - - // an+b format params for pseudo-classes - pseudoparms = '(?:[-+]?\\d*n)?[-+]?\\d*', - - // CSS quoted string values - quotedvalue = '"[^"]*"' + "|'[^']*'", - - // skip round brackets groups - skipround = '\\([^()]+\\)|\\(.*\\)', - // skip curly brackets groups - skipcurly = '\\{[^{}]+\\}|\\{.*\\}', - // skip square brackets groups - skipsquare = '\\[[^[\\]]*\\]|\\[.*\\]', - - // skip [ ], ( ), { } brackets groups - skipgroup = '\\[.*\\]|\\(.*\\)|\\{.*\\}', - - // http://www.w3.org/TR/css3-syntax/#characters - // unicode/ISO 10646 characters 161 and higher - // NOTE: Safari 2.0.x crashes with escaped (\\) - // Unicode ranges in regular expressions so we - // use a negated character range class instead - encoding = '(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)', - - // CSS identifier syntax - identifier = '(?:-?[_a-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+', - - // build attribute string - attrcheck = '(' + quotedvalue + '|' + identifier + ')', - attributes = whitespace + '(' + encoding + '+:?' + encoding + '+)' + - whitespace + '(?:' + operators + whitespace + attrcheck + ')?' + whitespace, - attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'), - - // build pseudoclass string - pseudoclass = '((?:' + - // an+b parameters or quoted string - pseudoparms + '|' + quotedvalue + '|' + - // id, class, pseudo-class selector - prefixes + '|' + encoding + '+|' + - // nested HTML attribute selector - '\\[' + attributes + '\\]|' + - // nested pseudo-class selector - '\\(.+\\)|' + whitespace + '|' + - // nested pseudos/separators - ',)+)', - - // placeholder for extensions - extensions = '.+', - - // CSS3: syntax scanner and - // one pass validation only - // using regular expression - standardValidator = - // discard start - '(?=[\\x20\\t\\n\\r\\f]*[^>+~(){}<>])' + - // open match group - '(' + - //universal selector - '\\*' + - // id/class/tag/pseudo-class identifier - '|(?:' + prefixes + identifier + ')' + - // combinator selector - '|' + combinators + - // HTML attribute selector - '|\\[' + attributes + '\\]' + - // pseudo-classes parameters - '|\\(' + pseudoclass + '\\)' + - // dom properties selector (extension) - '|\\{' + extensions + '\\}' + - // selector group separator (comma) - '|(?:,|' + whitespace + ')' + - // close match group - ')+', - - // validator for complex selectors in ':not()' pseudo-classes - extendedValidator = standardValidator.replace(pseudoclass, '.*'), - - // validator for standard selectors as default - reValidator = new RegExp(standardValidator, 'g'), - - // whitespace is any combination of these 5 character [\x20\t\n\r\f] - // http://www.w3.org/TR/css3-selectors/#selector-syntax - reTrimSpaces = new RegExp('^' + - whitespace + '|' + whitespace + '$', 'g'), - - // only allow simple selectors nested in ':not()' pseudo-classes - reSimpleNot = new RegExp('^(' + - '(?!:not)' + - '(' + prefixes + - '|' + identifier + - '|\\([^()]*\\))+' + - '|\\[' + attributes + '\\]' + - ')$'), - - // split comma groups, exclude commas from - // quotes '' "" and from brackets () [] {} - reSplitGroup = new RegExp('(' + - '[^,\\\\()[\\]]+' + - '|' + skipsquare + - '|' + skipround + - '|' + skipcurly + - '|\\\\.' + - ')+', 'g'), - - // split last, right most, selector group token - reSplitToken = new RegExp('(' + - '\\[' + attributes + '\\]|' + - '\\(' + pseudoclass + '\\)|' + - '[^\\x20\\t\\r\\n\\f>+~]|\\\\.)+', 'g'), - - // for in excess whitespace removal - reWhiteSpace = /[\x20\t\n\r\f]+/g, - - reOptimizeSelector = new RegExp(identifier + '|^$'), - - /*----------------------------- FEATURE TESTING ----------------------------*/ - - // detect native methods - isNative = (function() { - var s = (doc.appendChild + '').replace(/appendChild/g, ''); - return function(object, method) { - var m = object && object[method] || false; - return m && typeof m != 'string' && - s == (m + '').replace(new RegExp(method, 'g'), ''); - }; - })(), - - // NATIVE_XXXXX true if method exist and is callable - // detect if DOM methods are native in browsers - NATIVE_FOCUS = isNative(doc, 'hasFocus'), - NATIVE_QSAPI = isNative(doc, 'querySelector'), - NATIVE_GEBID = isNative(doc, 'getElementById'), - NATIVE_GEBTN = isNative(root, 'getElementsByTagName'), - NATIVE_GEBCN = isNative(root, 'getElementsByClassName'), - - // detect native getAttribute/hasAttribute methods, - // frameworks extend these to elements, but it seems - // this does not work for XML namespaced attributes, - // used to check both getAttribute/hasAttribute in IE - NATIVE_GET_ATTRIBUTE = isNative(root, 'getAttribute'), - NATIVE_HAS_ATTRIBUTE = isNative(root, 'hasAttribute'), - - // check if slice() can convert nodelist to array - // see http://yura.thinkweb2.com/cft/ - NATIVE_SLICE_PROTO = - (function() { - var isBuggy = false, id = root.id; - root.id = 'length'; - try { - isBuggy = !!slice.call(doc.childNodes, 0)[0]; - } catch(e) { } - root.id = id; - return isBuggy; - })(), - - // supports the new traversal API - NATIVE_TRAVERSAL_API = - 'nextElementSibling' in root && 'previousElementSibling' in root, - - // BUGGY_XXXXX true if method is feature tested and has known bugs - // detect buggy gEBID - BUGGY_GEBID = NATIVE_GEBID ? - (function() { - var isBuggy = true, x = 'x' + String(+new Date), - a = doc.createElementNS ? 'a' : ''; - (a = doc.createElement(a)).name = x; - root.insertBefore(a, root.firstChild); - isBuggy = !!doc.getElementById(x); - root.removeChild(a); - return isBuggy; - })() : - true, - - // detect IE gEBTN comment nodes bug - BUGGY_GEBTN = NATIVE_GEBTN ? - (function() { - var div = doc.createElement('div'); - div.appendChild(doc.createComment('')); - return !!div.getElementsByTagName('*')[0]; - })() : - true, - - // detect Opera gEBCN second class and/or UTF8 bugs as well as Safari 3.2 - // caching class name results and not detecting when changed, - // tests are based on the jQuery selector test suite - BUGGY_GEBCN = NATIVE_GEBCN ? - (function() { - var isBuggy, div = doc.createElement('div'), test = '\u53f0\u5317'; - - // Opera tests - div.appendChild(doc.createElement('span')). - setAttribute('class', test + 'abc ' + test); - div.appendChild(doc.createElement('span')). - setAttribute('class', 'x'); - - isBuggy = !div.getElementsByClassName(test)[0]; - - // Safari test - div.lastChild.className = test; - return isBuggy || div.getElementsByClassName(test).length != 2; - })() : - true, - - // detect IE bug with dynamic attributes - BUGGY_GET_ATTRIBUTE = NATIVE_GET_ATTRIBUTE ? - (function() { - var input = doc.createElement('input'); - input.setAttribute('value', 5); - return input.defaultValue != 5; - })() : - true, - - // detect IE bug with non-standard boolean attributes - BUGGY_HAS_ATTRIBUTE = NATIVE_HAS_ATTRIBUTE ? - (function() { - var option = doc.createElement('option'); - option.setAttribute('selected', 'selected'); - return !option.hasAttribute('selected'); - })() : - true, - - // detect Safari bug with selected option elements - BUGGY_SELECTED = - (function() { - var select = doc.createElement('select'); - select.appendChild(doc.createElement('option')); - return !select.firstChild.selected; - })(), - - // initialized with the loading context - // and reset for each different context - BUGGY_QUIRKS_GEBCN, - BUGGY_QUIRKS_QSAPI, - - QUIRKS_MODE, - XML_DOCUMENT, - - // detect Opera browser - OPERA = /opera/i.test(string.call(global.opera)), - - // skip simpe selector optimizations for Opera >= 11 - OPERA_QSAPI = OPERA && parseFloat(opera.version()) >= 11, - - // check Seletor API implementations - RE_BUGGY_QSAPI = NATIVE_QSAPI ? - (function() { - var pattern = [ ], div = doc.createElement('div'), element, - - expect = function(selector, context, element, n) { - var result = false; - context.appendChild(element); - try { result = context.querySelectorAll(selector).length == n; } catch(e) { } - while (context.firstChild) { context.removeChild(context.firstChild); } - return result; - }; - - // ^= $= *= operators bugs whith empty values (Opera 10 / IE8) - element = doc.createElement('p'); - element.setAttribute('class', ''); - expect('[class^=""]', div, element, 1) && - pattern.push('[*^$]=[\\x20\\t\\n\\r\\f]*(?:""|' + "'')"); - - // :checked bug with option elements (Firefox 3.6.x) - // it wrongly includes 'selected' options elements - // HTML5 rules says selected options also match - element = doc.createElement('option'); - element.setAttribute('selected', 'selected'); - expect(':checked', div, element, 0) && - pattern.push(':checked'); - - // :enabled :disabled bugs with hidden fields (Firefox 3.5) - // http://www.w3.org/TR/html5/links.html#selector-enabled - // http://www.w3.org/TR/css3-selectors/#enableddisabled - // not supported by IE8 Query Selector - element = doc.createElement('input'); - element.setAttribute('type', 'hidden'); - expect(':enabled', div, element, 0) && - pattern.push(':enabled', ':disabled'); - - // :link bugs with hyperlinks matching (Firefox/Safari) - element = doc.createElement('link'); - element.setAttribute('href', 'x'); - expect(':link', div, element, 1) || - pattern.push(':link'); - - // avoid attribute selectors for IE QSA - if (BUGGY_HAS_ATTRIBUTE) { - // IE fails in reading: - // - original values for input/textarea - // - original boolean values for controls - pattern.push('\\[[\\x20\\t\\n\\r\\f]*(?:checked|disabled|ismap|multiple|readonly|selected|value)'); - } - - return pattern.length ? - new RegExp(pattern.join('|')) : - { 'test': function() { return false; } }; - - })() : - true, - - // matches class selectors - RE_CLASS = new RegExp('(?:\\[[\\x20\\t\\n\\r\\f]*class\\b|\\.' + identifier + ')'), - - // matches simple id, tag & class selectors - RE_SIMPLE_SELECTOR = new RegExp( - !(BUGGY_GEBTN && BUGGY_GEBCN) ? !OPERA ? - '^(?:\\*|[.#]?-?[_a-zA-Z]{1}' + encoding + '*)$' : - '^(?:\\*|#-?[_a-zA-Z]{1}' + encoding + '*)$' : - '^#?-?[_a-zA-Z]{1}' + encoding + '*$'), - - /*----------------------------- LOOKUP OBJECTS -----------------------------*/ - - LINK_NODES = { 'a': 1, 'A': 1, 'area': 1, 'AREA': 1, 'link': 1, 'LINK': 1 }, - - // boolean attributes should return attribute name instead of true/false - ATTR_BOOLEAN = { - 'checked': 1, 'disabled': 1, 'ismap': 1, - 'multiple': 1, 'readonly': 1, 'selected': 1 - }, - - // dynamic attributes that needs to be checked against original HTML value - ATTR_DEFAULT = { - 'value': 'defaultValue', - 'checked': 'defaultChecked', - 'selected': 'defaultSelected' - }, - - // attributes referencing URI data values need special treatment in IE - ATTR_URIDATA = { - 'action': 2, 'cite': 2, 'codebase': 2, 'data': 2, 'href': 2, - 'longdesc': 2, 'lowsrc': 2, 'src': 2, 'usemap': 2 - }, - - // HTML 5 draft specifications - // http://www.whatwg.org/specs/web-apps/current-work/#selectors - HTML_TABLE = { - // class attribute must be treated case-insensitive in HTML quirks mode - // initialized by default to Standard Mode (case-sensitive), - // set dynamically by the attribute resolver - 'class': 0, - 'accept': 1, 'accept-charset': 1, 'align': 1, 'alink': 1, 'axis': 1, - 'bgcolor': 1, 'charset': 1, 'checked': 1, 'clear': 1, 'codetype': 1, 'color': 1, - 'compact': 1, 'declare': 1, 'defer': 1, 'dir': 1, 'direction': 1, 'disabled': 1, - 'enctype': 1, 'face': 1, 'frame': 1, 'hreflang': 1, 'http-equiv': 1, 'lang': 1, - 'language': 1, 'link': 1, 'media': 1, 'method': 1, 'multiple': 1, 'nohref': 1, - 'noresize': 1, 'noshade': 1, 'nowrap': 1, 'readonly': 1, 'rel': 1, 'rev': 1, - 'rules': 1, 'scope': 1, 'scrolling': 1, 'selected': 1, 'shape': 1, 'target': 1, - 'text': 1, 'type': 1, 'valign': 1, 'valuetype': 1, 'vlink': 1 - }, - - // the following attributes must be treated case-insensitive in XHTML mode - // Niels Leenheer http://rakaz.nl/item/css_selector_bugs_case_sensitivity - XHTML_TABLE = { - 'accept': 1, 'accept-charset': 1, 'alink': 1, 'axis': 1, - 'bgcolor': 1, 'charset': 1, 'codetype': 1, 'color': 1, - 'enctype': 1, 'face': 1, 'hreflang': 1, 'http-equiv': 1, - 'lang': 1, 'language': 1, 'link': 1, 'media': 1, 'rel': 1, - 'rev': 1, 'target': 1, 'text': 1, 'type': 1, 'vlink': 1 - }, - - /*-------------------------- REGULAR EXPRESSIONS ---------------------------*/ - - // placeholder to add functionalities - Selectors = { - // as a simple example this will check - // for chars not in standard ascii table - // - // 'mySpecialSelector': { - // 'Expression': /\u0080-\uffff/, - // 'Callback': mySelectorCallback - // } - // - // 'mySelectorCallback' will be invoked - // only after passing all other standard - // checks and only if none of them worked - }, - - // attribute operators - Operators = { - '=': "n=='%m'", - '^=': "n.indexOf('%m')==0", - '*=': "n.indexOf('%m')>-1", - '|=': "(n+'-').indexOf('%m-')==0", - '~=': "(' '+n+' ').indexOf(' %m ')>-1", - '$=': "n.substr(n.length-'%m'.length)=='%m'" - }, - - // optimization expressions - Optimize = { - ID: new RegExp('^\\*?#(' + encoding + '+)|' + skipgroup), - TAG: new RegExp('^(' + encoding + '+)|' + skipgroup), - CLASS: new RegExp('^\\*?\\.(' + encoding + '+$)|' + skipgroup) - }, - - // precompiled Regular Expressions - Patterns = { - // structural pseudo-classes and child selectors - spseudos: /^\:(root|empty|(?:first|last|only)(?:-child|-of-type)|nth(?:-last)?(?:-child|-of-type)\(\s*(even|odd|(?:[-+]{0,1}\d*n\s*)?[-+]{0,1}\s*\d*)\s*\))?(.*)/i, - // uistates + dynamic + negation pseudo-classes - dpseudos: /^\:(link|visited|target|active|focus|hover|checked|disabled|enabled|selected|lang\(([-\w]{2,})\)|not\(([^()]*|.*)\))?(.*)/i, - // element attribute matcher - attribute: new RegExp('^\\[' + attrmatcher + '\\](.*)'), - // E > F - children: /^[\x20\t\n\r\f]*\>[\x20\t\n\r\f]*(.*)/, - // E + F - adjacent: /^[\x20\t\n\r\f]*\+[\x20\t\n\r\f]*(.*)/, - // E ~ F - relative: /^[\x20\t\n\r\f]*\~[\x20\t\n\r\f]*(.*)/, - // E F - ancestor: /^[\x20\t\n\r\f]+(.*)/, - // all - universal: /^\*(.*)/, - // id - id: new RegExp('^#(' + encoding + '+)(.*)'), - // tag - tagName: new RegExp('^(' + encoding + '+)(.*)'), - // class - className: new RegExp('^\\.(' + encoding + '+)(.*)') - }, - - /*------------------------------ UTIL METHODS ------------------------------*/ - - // concat elements to data - concatList = - function(data, elements) { - var i = -1, element; - if (!data.length && Array.slice) - return Array.slice(elements); - while ((element = elements[++i])) - data[data.length] = element; - return data; - }, - - // concat elements to data and callback - concatCall = - function(data, elements, callback) { - var i = -1, element; - while ((element = elements[++i])) { - if (false === callback(data[data.length] = element)) { break; } - } - return data; - }, - - // change context specific variables - switchContext = - function(from, force) { - var div, oldDoc = doc; - // save passed context - lastContext = from; - // set new context document - doc = from.ownerDocument || from; - if (force || oldDoc !== doc) { - // set document root - root = doc.documentElement; - // set host environment flags - XML_DOCUMENT = doc.createElement('DiV').nodeName == 'DiV'; - - // In quirks mode css class names are case insensitive. - // In standards mode they are case sensitive. See docs: - // https://developer.mozilla.org/en/Mozilla_Quirks_Mode_Behavior - // http://www.whatwg.org/specs/web-apps/current-work/#selectors - QUIRKS_MODE = !XML_DOCUMENT && - typeof doc.compatMode == 'string' ? - doc.compatMode.indexOf('CSS') < 0 : - (function() { - var style = doc.createElement('div').style; - return style && (style.width = 1) && style.width == '1px'; - })(); - - div = doc.createElement('div'); - div.appendChild(doc.createElement('p')).setAttribute('class', 'xXx'); - div.appendChild(doc.createElement('p')).setAttribute('class', 'xxx'); - - // GEBCN buggy in quirks mode, match count is: - // Firefox 3.0+ [xxx = 1, xXx = 1] - // Opera 10.63+ [xxx = 0, xXx = 2] - BUGGY_QUIRKS_GEBCN = - !XML_DOCUMENT && NATIVE_GEBCN && QUIRKS_MODE && - (div.getElementsByClassName('xxx').length != 2 || - div.getElementsByClassName('xXx').length != 2); - - // QSAPI buggy in quirks mode, match count is: - // At least Chrome 4+, Firefox 3.5+, Opera 10.x+, Safari 4+ [xxx = 1, xXx = 2] - // Safari 3.2 QSA doesn't work with mixedcase in quirksmode [xxx = 1, xXx = 0] - // https://bugs.webkit.org/show_bug.cgi?id=19047 - // must test the attribute selector '[class~=xxx]' - // before '.xXx' or the bug may not present itself - BUGGY_QUIRKS_QSAPI = - !XML_DOCUMENT && NATIVE_QSAPI && QUIRKS_MODE && - (div.querySelectorAll('[class~=xxx]').length != 2 || - div.querySelectorAll('.xXx').length != 2); - - Config.CACHING && Dom.setCache(true, doc); - } - }, - - /*------------------------------ DOM METHODS -------------------------------*/ - - // element by id (raw) - // @return reference or null - byIdRaw = - function(id, elements) { - var i = -1, element = null; - while ((element = elements[++i])) { - if (element.getAttribute('id') == id) { - break; - } - } - return element; - }, - - // element by id - // @return reference or null - _byId = !BUGGY_GEBID ? - function(id, from) { - id = id.replace(/\\([^\\]{1})/g, '$1'); - return from.getElementById && from.getElementById(id) || - byIdRaw(id, from.getElementsByTagName('*')); - } : - function(id, from) { - var element = null; - id = id.replace(/\\([^\\]{1})/g, '$1'); - if (XML_DOCUMENT || from.nodeType != 9) { - return byIdRaw(id, from.getElementsByTagName('*')); - } - if ((element = from.getElementById(id)) && - element.name == id && from.getElementsByName) { - return byIdRaw(id, from.getElementsByName(id)); - } - return element; - }, - - // publicly exposed byId - // @return reference or null - byId = - function(id, from) { - from || (from = doc); - if (lastContext !== from) { switchContext(from); } - return _byId(id, from); - }, - - // elements by tag (raw) - // @return array - byTagRaw = - function(tag, from) { - var any = tag == '*', element = from, elements = [ ], next = element.firstChild; - any || (tag = tag.toUpperCase()); - while ((element = next)) { - if (element.tagName > '@' && (any || element.tagName.toUpperCase() == tag)) { - elements[elements.length] = element; - } - if ((next = element.firstChild || element.nextSibling)) continue; - while (!next && (element = element.parentNode) && element !== from) { - next = element.nextSibling; - } - } - return elements; - }, - - // elements by tag - // @return array - _byTag = !BUGGY_GEBTN && NATIVE_SLICE_PROTO ? - function(tag, from) { - return XML_DOCUMENT || from.nodeType == 11 ? byTagRaw(tag, from) : - slice.call(from.getElementsByTagName(tag), 0); - } : - function(tag, from) { - var i = -1, j = i, data = [ ], - element, elements = from.getElementsByTagName(tag); - if (tag == '*') { - while ((element = elements[++i])) { - if (element.nodeName > '@') - data[++j] = element; - } - } else { - while ((element = elements[++i])) { - data[i] = element; - } - } - return data; - }, - - // publicly exposed byTag - // @return array - byTag = - function(tag, from) { - from || (from = doc); - if (lastContext !== from) { switchContext(from); } - return _byTag(tag, from); - }, - - // publicly exposed byName - // @return array - byName = - function(name, from) { - return select('[name="' + name.replace(/\\([^\\]{1})/g, '$1') + '"]', from); - }, - - // elements by class (raw) - // @return array - byClassRaw = - function(name, from) { - var i = -1, j = i, data = [ ], element, elements = _byTag('*', from), n; - name = ' ' + (QUIRKS_MODE ? name.toLowerCase() : name).replace(/\\([^\\]{1})/g, '$1') + ' '; - while ((element = elements[++i])) { - n = XML_DOCUMENT ? element.getAttribute('class') : element.className; - if (n && n.length && (' ' + (QUIRKS_MODE ? n.toLowerCase() : n). - replace(reWhiteSpace, ' ') + ' ').indexOf(name) > -1) { - data[++j] = element; - } - } - return data; - }, - - // elements by class - // @return array - _byClass = - function(name, from) { - return (BUGGY_GEBCN || BUGGY_QUIRKS_GEBCN || XML_DOCUMENT || !from.getElementsByClassName) ? - byClassRaw(name, from) : slice.call(from.getElementsByClassName(name.replace(/\\([^\\]{1})/g, '$1')), 0); - }, - - // publicly exposed byClass - // @return array - byClass = - function(name, from) { - from || (from = doc); - if (lastContext !== from) { switchContext(from); } - return _byClass(name, from); - }, - - // check element is descendant of container - // @return boolean - contains = 'compareDocumentPosition' in root ? - function(container, element) { - return (container.compareDocumentPosition(element) & 16) == 16; - } : 'contains' in root ? - function(container, element) { - return container !== element && container.contains(element); - } : - function(container, element) { - while ((element = element.parentNode)) { - if (element === container) return true; - } - return false; - }, - - // attribute value - // @return string - getAttribute = !BUGGY_GET_ATTRIBUTE ? - function(node, attribute) { - return node.getAttribute(attribute) || ''; - } : - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (typeof node[attribute] == 'object') { - return node.attributes[attribute] && - node.attributes[attribute].value || ''; - } - return ( - // 'type' can only be read by using native getAttribute - attribute == 'type' ? node.getAttribute(attribute) || '' : - // specific URI data attributes (parameter 2 to fix IE bug) - ATTR_URIDATA[attribute] ? node.getAttribute(attribute, 2) || '' : - // boolean attributes should return name instead of true/false - ATTR_BOOLEAN[attribute] ? node.getAttribute(attribute) ? attribute : 'false' : - ((node = node.getAttributeNode(attribute)) && node.value) || ''); - }, - - // attribute presence - // @return boolean - hasAttribute = !BUGGY_HAS_ATTRIBUTE ? - function(node, attribute) { - return XML_DOCUMENT ? - !!node.getAttribute(attribute) : - node.hasAttribute(attribute); - } : - function(node, attribute) { - attribute = attribute.toLowerCase(); - if (ATTR_DEFAULT[attribute]) { - return !!node[ATTR_DEFAULT[attribute]]; - } - // read the attribute node - node = node.getAttributeNode(attribute); - return !!(node && node.specified); - }, - - // check node emptyness - // @return boolean - isEmpty = - function(node) { - node = node.firstChild; - while (node) { - if (node.nodeType == 3 || node.nodeName > '@') return false; - node = node.nextSibling; - } - return true; - }, - - // check if element matches the :link pseudo - // @return boolean - isLink = - function(element) { - return hasAttribute(element,'href') && LINK_NODES[element.nodeName]; - }, - - // child position by nodeType - // @return number - nthElement = - function(element, last) { - var count = 1, succ = last ? 'nextSibling' : 'previousSibling'; - while ((element = element[succ])) { - if (element.nodeName > '@') ++count; - } - return count; - }, - - // child position by nodeName - // @return number - nthOfType = - function(element, last) { - var count = 1, succ = last ? 'nextSibling' : 'previousSibling', type = element.nodeName; - while ((element = element[succ])) { - if (element.nodeName == type) ++count; - } - return count; - }, - - /*------------------------------- DEBUGGING --------------------------------*/ - - // get/set (string/object) working modes - configure = - function(option) { - if (typeof option == 'string') { return Config[option]; } - if (typeof option != 'object') { return false; } - for (var i in option) { - Config[i] = !!option[i]; - if (i == 'SIMPLENOT') { - matchContexts = { }; - matchResolvers = { }; - selectContexts = { }; - selectResolvers = { }; - Config['USE_QSAPI'] = false; - } else if (i == 'USE_QSAPI') { - Config[i] = !!option[i] && NATIVE_QSAPI; - } - } - reValidator = new RegExp(Config.SIMPLENOT ? - standardValidator : extendedValidator, 'g'); - return true; - }, - - // control user notifications - emit = - function(message) { - if (Config.VERBOSITY) { throw new Error(message); } - if (global.console && global.console.log) { - global.console.log(message); - } - }, - - Config = { - - // used to enable/disable caching of result sets - CACHING: false, - - // by default do not add missing left/right context - // to selector string shortcuts like "+div" or "ul>" - // callable Dom.shortcuts method has to be available - SHORTCUTS: false, - - // by default disable complex selectors nested in - // ':not()' pseudo-classes, as for specifications - SIMPLENOT: true, - - // strict QSA match all non-unique IDs (false) - // speed & libs compat match unique ID (true) - UNIQUE_ID: true, - - // HTML5 handling for the ":checked" pseudo-class - USE_HTML5: true, - - // controls enabling the Query Selector API branch - USE_QSAPI: NATIVE_QSAPI, - - // controls the engine error/warning notifications - VERBOSITY: true - - }, - - /*---------------------------- COMPILER METHODS ----------------------------*/ - - // code string reused to build compiled functions - ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break main;else continue main;', - - // compile a comma separated group of selector - // @mode boolean true for select, false for match - // return a compiled function - compile = - function(selector, source, mode) { - - var parts = typeof selector == 'string' ? selector.match(reSplitGroup) : selector; - - // ensures that source is a string - typeof source == 'string' || (source = ''); - - if (parts.length == 1) { - source += compileSelector(parts[0], mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } else { - // for each selector in the group - var i = -1, seen = { }, token; - while ((token = parts[++i])) { - token = token.replace(reTrimSpaces, ''); - // avoid repeating the same token - // in comma separated group (p, p) - if (!seen[token] && (seen[token] = true)) { - source += compileSelector(token, mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode); - } - } - } - - if (mode) { - // for select method - return new Function('c,s,r,d,h,g,f,v', - 'var N,n,x=0,k=-1,e;main:while((e=c[++k])){' + source + '}return r;'); - } else { - // for match method - return new Function('e,s,r,d,h,g,f,v', - 'var N,n,x=0,k=e;' + source + 'return false;'); - } - }, - - // allows to cache already visited nodes - FILTER = - 'var z=v[@]||(v[@]=[]),l=z.length-1;' + - 'while(l>=0&&z[l]!==e)--l;' + - 'if(l!==-1){break;}' + - 'z[z.length]=e;', - - // compile a CSS3 string selector into ad-hoc javascript matching function - // @return string (to be compiled) - compileSelector = - function(selector, source, mode) { - - var a, b, n, k = 0, expr, match, result, status, test, type; - - while (selector) { - - k++; - - // *** Universal selector - // * match all (empty block, do not remove) - if ((match = selector.match(Patterns.universal))) { - // do nothing, handled in the compiler where - // BUGGY_GEBTN return comment nodes (ex: IE) - expr = ''; - } - - // *** ID selector - // #Foo Id case sensitive - else if ((match = selector.match(Patterns.id))) { - // document can contain conflicting elements (id/name) - // prototype selector unit need this method to recover bad HTML forms - source = 'if(' + (XML_DOCUMENT ? - 's.getAttribute(e,"id")' : - '(e.submit?s.getAttribute(e,"id"):e.id)') + - '=="' + match[1] + '"' + - '){' + source + '}'; - } - - // *** Type selector - // Foo Tag (case insensitive) - else if ((match = selector.match(Patterns.tagName))) { - // both tagName and nodeName properties may be upper/lower case - // depending on their creation NAMESPACE in createElementNS() - source = 'if(e.nodeName' + (XML_DOCUMENT ? - '=="' + match[1] + '"' : '.toUpperCase()' + - '=="' + match[1].toUpperCase() + '"') + - '){' + source + '}'; - } - - // *** Class selector - // .Foo Class (case sensitive) - else if ((match = selector.match(Patterns.className))) { - // W3C CSS3 specs: element whose "class" attribute has been assigned a - // list of whitespace-separated values, see section 6.4 Class selectors - // and notes at the bottom; explicitly non-normative in this specification. - source = 'if((n=' + (XML_DOCUMENT ? - 's.getAttribute(e,"class")' : 'e.className') + - ')&&n.length&&(" "+' + (QUIRKS_MODE ? 'n.toLowerCase()' : 'n') + - '.replace(' + reWhiteSpace + '," ")+" ").indexOf(" ' + - (QUIRKS_MODE ? match[1].toLowerCase() : match[1]) + ' ")>-1' + - '){' + source + '}'; - } - - // *** Attribute selector - // [attr] [attr=value] [attr="value"] [attr='value'] and !=, *=, ~=, |=, ^=, $= - // case sensitivity is treated differently depending on the document type (see map) - else if ((match = selector.match(Patterns.attribute))) { - - // xml namespaced attribute ? - expr = match[1].split(':'); - expr = expr.length == 2 ? expr[1] : expr[0] + ''; - - if (match[2] && !Operators[match[2]]) { - emit('Unsupported operator in attribute selectors "' + selector + '"'); - return ''; - } - - test = false; - type = 'false'; - - // replace Operators parameter if needed - if (match[2] && match[4] && (type = Operators[match[2]])) { - // case treatment depends on document - HTML_TABLE['class'] = QUIRKS_MODE ? 1 : 0; - // replace escaped values and HTML entities - match[4] = match[4].replace(/(\x22|\x27)/g, '\\$1'); - match[4] = match[4].replace(/\\([0-9a-f]{2,2})/g, '\\x$1'); - test = (XML_DOCUMENT ? XHTML_TABLE : HTML_TABLE)[expr.toLowerCase()]; - type = type.replace(/\%m/g, test ? match[4].toLowerCase() : match[4]); - } else if (match[2] == '!=' || match[2] == '=') { - match[4] = match[4].replace(/(\x22|\x27)/g, '\\$1'); - type = 'n' + match[2] + '="' + match[4] + '"'; - } - - // build expression for has/getAttribute - expr = 'n=s.' + (match[2] ? 'get' : 'has') + - 'Attribute(e,"' + match[1] + '")' + - (test ? '.toLowerCase();' : ';'); - - source = expr + 'if(' + (match[2] ? type : 'n') + '){' + source + '}'; - } - - // *** Adjacent sibling combinator - // E + F (F adiacent sibling of E) - else if ((match = selector.match(Patterns.adjacent))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = NATIVE_TRAVERSAL_API ? - 'var N' + k + '=e;while(e&&(e=e.previousElementSibling)){' + source + 'break;}e=N' + k + ';' : - 'var N' + k + '=e;while(e&&(e=e.previousSibling)){if(e.nodeName>"@"){' + source + 'break;}}e=N' + k + ';'; - } - - // *** General sibling combinator - // E ~ F (F relative sibling of E) - else if ((match = selector.match(Patterns.relative))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = NATIVE_TRAVERSAL_API ? - ('var N' + k + '=e;e=e.parentNode.firstElementChild;' + - 'while(e&&e!==N' + k + '){' + source + 'e=e.nextElementSibling;}e=N' + k + ';') : - ('var N' + k + '=e;e=e.parentNode.firstChild;' + - 'while(e&&e!==N' + k + '){if(e.nodeName>"@"){' + source + '}e=e.nextSibling;}e=N' + k + ';'); - } - - // *** Child combinator - // E > F (F children of E) - else if ((match = selector.match(Patterns.children))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + 'break;}e=N' + k + ';'; - } - - // *** Descendant combinator - // E F (E ancestor of F) - else if ((match = selector.match(Patterns.ancestor))) { - source = (mode ? '' : FILTER.replace(/@/g, k)) + source; - source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + '}e=N' + k + ';'; - } - - // *** Structural pseudo-classes - // :root, :empty, - // :first-child, :last-child, :only-child, - // :first-of-type, :last-of-type, :only-of-type, - // :nth-child(), :nth-last-child(), :nth-of-type(), :nth-last-of-type() - else if ((match = selector.match(Patterns.spseudos)) && match[1]) { - - switch (match[1]) { - case 'root': - // element root of the document - if (match[3]) { - source = 'if(e===h||s.contains(h,e)){' + source + '}'; - } else { - source = 'if(e===h){' + source + '}'; - } - break; - - case 'empty': - // element that has no children - source = 'if(s.isEmpty(e)){' + source + '}'; - break; - - default: - if (match[1] && match[2]) { - if (match[2] == 'n') { - source = 'if(e!==h){' + source + '}'; - break; - } else if (match[2] == 'even') { - a = 2; - b = 0; - } else if (match[2] == 'odd') { - a = 2; - b = 1; - } else { - // assumes correct "an+b" format, "b" before "a" to keep "n" values - b = ((n = match[2].match(/(-?\d+)$/)) ? parseInt(n[1], 10) : 0); - a = ((n = match[2].match(/(-?\d*)n/i)) ? parseInt(n[1], 10) : 0); - if (n && n[1] == '-') a = -1; - } - - // build test expression out of structural pseudo (an+b) parameters - // see here: http://www.w3.org/TR/css3-selectors/#nth-child-pseudo - test = a > 1 ? - (/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' : - 'n>=' + b + '&&(n-(' + b + '))%' + a + '==0' : a < -1 ? - (/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' : - 'n<=' + b + '&&(n-(' + b + '))%' + a + '==0' : a=== 0 ? - 'n==' + b : - (/last/i.test(match[1])) ? - a == -1 ? 'n>=' + b : 'n<=' + b : - a == -1 ? 'n<=' + b : 'n>=' + b; - - // 4 cases: 1 (nth) x 4 (child, of-type, last-child, last-of-type) - source = - 'if(e!==h){' + - 'n=s[' + (/-of-type/i.test(match[1]) ? '"nthOfType"' : '"nthElement"') + ']' + - '(e,' + (/last/i.test(match[1]) ? 'true' : 'false') + ');' + - 'if(' + test + '){' + source + '}' + - '}'; - - } else { - // 6 cases: 3 (first, last, only) x 1 (child) x 2 (-of-type) - a = /first/i.test(match[1]) ? 'previous' : 'next'; - n = /only/i.test(match[1]) ? 'previous' : 'next'; - b = /first|last/i.test(match[1]); - - type = /-of-type/i.test(match[1]) ? '&&n.nodeName!=e.nodeName' : '&&n.nodeName<"@"'; - - source = 'if(e!==h){' + - ( 'n=e;while((n=n.' + a + 'Sibling)' + type + ');if(!n){' + (b ? source : - 'n=e;while((n=n.' + n + 'Sibling)' + type + ');if(!n){' + source + '}') + '}' ) + '}'; - } - break; - } - - } - - // *** negation, user action and target pseudo-classes - // *** UI element states and dynamic pseudo-classes - // CSS3 :not, :checked, :enabled, :disabled, :target - // CSS3 :active, :hover, :focus - // CSS3 :link, :visited - else if ((match = selector.match(Patterns.dpseudos)) && match[1]) { - - switch (match[1].match(/^\w+/)[0]) { - // CSS3 negation pseudo-class - case 'not': - // compile nested selectors, DO NOT pass the callback parameter - // SIMPLENOT allow disabling complex selectors nested - // in ':not()' pseudo-classes, breaks some test units - expr = match[3].replace(reTrimSpaces, ''); - - if (Config.SIMPLENOT && !reSimpleNot.test(expr)) { - // see above, log error but continue execution - emit('Negation pseudo-class only accepts simple selectors "' + selector + '"'); - return ''; - } else { - if ('compatMode' in doc) { - source = 'if(!' + compile(expr, '', false) + '(e,s,r,d,h,g)){' + source + '}'; - } else { - source = 'if(!s.match(e, "' + expr.replace(/\x22/g, '\\"') + '",g)){' + source +'}'; - } - } - break; - - // CSS3 UI element states - case 'checked': - // for radio buttons checkboxes (HTML4) and options (HTML5) - source = 'if((typeof e.form!=="undefined"&&(/^(?:radio|checkbox)$/i).test(e.type)&&e.checked)' + - (Config.USE_HTML5 ? '||(/^option$/i.test(e.nodeName)&&(e.selected||e.checked))' : '') + - '){' + source + '}'; - break; - case 'disabled': - // does not consider hidden input fields - source = 'if(((typeof e.form!=="undefined"' + - (Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') + - ')||s.isLink(e))&&e.disabled===true){' + source + '}'; - break; - case 'enabled': - // does not consider hidden input fields - source = 'if(((typeof e.form!=="undefined"' + - (Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') + - ')||s.isLink(e))&&e.disabled===false){' + source + '}'; - break; - - // CSS3 lang pseudo-class - case 'lang': - test = ''; - if (match[2]) test = match[2].substr(0, 2) + '-'; - source = 'do{(n=e.lang||"").toLowerCase();' + - 'if((n==""&&h.lang=="' + match[2].toLowerCase() + '")||' + - '(n&&(n=="' + match[2].toLowerCase() + - '"||n.substr(0,3)=="' + test.toLowerCase() + '")))' + - '{' + source + 'break;}}while((e=e.parentNode)&&e!==g);'; - break; - - // CSS3 target pseudo-class - case 'target': - n = doc.location ? doc.location.hash : ''; - if (n) { - source = 'if(e.id=="' + n.slice(1) + '"){' + source + '}'; - } - break; - - // CSS3 dynamic pseudo-classes - case 'link': - source = 'if(s.isLink(e)&&!e.visited){' + source + '}'; - break; - case 'visited': - source = 'if(s.isLink(e)&&e.visited){' + source + '}'; - break; - - // CSS3 user action pseudo-classes IE & FF3 have native support - // these capabilities may be emulated by some event managers - case 'active': - if (XML_DOCUMENT) break; - source = 'if(e===d.activeElement){' + source + '}'; - break; - case 'hover': - if (XML_DOCUMENT) break; - source = 'if(e===d.hoverElement){' + source + '}'; - break; - case 'focus': - if (XML_DOCUMENT) break; - source = NATIVE_FOCUS ? - 'if(e===d.activeElement&&d.hasFocus()&&(e.type||e.href||!isNaN(e.tabIndex))){' + source + '}' : - 'if(e===d.activeElement&&(e.type||e.href)){' + source + '}'; - break; - - // CSS2 selected pseudo-classes, not part of current CSS3 drafts - // the 'selected' property is only available for option elements - case 'selected': - // fix Safari selectedIndex property bug - expr = BUGGY_SELECTED ? '||(n=e.parentNode)&&n.options[n.selectedIndex]===e' : ''; - source = 'if(/^option$/i.test(e.nodeName)&&(e.selected||e.checked' + expr + ')){' + source + '}'; - break; - - default: - break; - } - - } - - else { - - // this is where external extensions are - // invoked if expressions match selectors - expr = false; - status = false; - for (expr in Selectors) { - if ((match = selector.match(Selectors[expr].Expression)) && match[1]) { - result = Selectors[expr].Callback(match, source); - source = result.source; - status = result.status; - if (status) { break; } - } - } - - // if an extension fails to parse the selector - // it must return a false boolean in "status" - if (!status) { - // log error but continue execution, don't throw real exceptions - // because blocking following processes maybe is not a good idea - emit('Unknown pseudo-class selector "' + selector + '"'); - return ''; - } - - if (!expr) { - // see above, log error but continue execution - emit('Unknown token in selector "' + selector + '"'); - return ''; - } - - } - - // error if no matches found by the pattern scan - if (!match) { - emit('Invalid syntax in selector "' + selector + '"'); - return ''; - } - - // ensure "match" is not null or empty since - // we do not throw real DOMExceptions above - selector = match && match[match.length - 1]; - } - - return source; - }, - - /*----------------------------- QUERY METHODS ------------------------------*/ - - // match element with selector - // @return boolean - match = - function(element, selector, from, callback) { - - var parts; - - if (!(element && element.nodeName > '@')) { - emit('Invalid element argument'); - return false; - } else if (!selector || typeof selector != 'string') { - emit('Invalid selector argument'); - return false; - } else if (from && from.nodeType == 1 && !contains(from, element)) { - return false; - } else if (lastContext !== from) { - // reset context data when it changes - // and ensure context is set to a default - switchContext(from || (from = element.ownerDocument)); - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, element, from)); - - if (lastMatcher != selector) { - // process valid selector strings - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleMatch = (parts = selector.match(reSplitGroup)).length < 2; - // save passed selector - lastMatcher = selector; - lastPartsMatch = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return false; - } - } else parts = lastPartsMatch; - - // compile matcher resolver if necessary - if (!matchResolvers[selector] || matchContexts[selector] !== from) { - matchResolvers[selector] = compile(isSingleMatch ? [selector] : parts, '', false); - matchContexts[selector] = from; - } - - return matchResolvers[selector](element, Snapshot, [ ], doc, root, from, callback, { }); - }, - - // select only the first element - // matching selector (document ordered) - first = - function(selector, from) { - return select(selector, from, function() { return false; })[0] || null; - }, - - // select elements matching selector - // using new Query Selector API - // or cross-browser client API - // @return array - select = - function(selector, from, callback) { - - var i, changed, element, elements, parts, token, original = selector; - - if (arguments.length === 0) { - emit('Not enough arguments'); - return [ ]; - } else if (typeof selector != 'string') { - return [ ]; - } else if (!(/[>+~*\w\u00a1-\uffff]/.test(selector))) { - emit('Invalid or illegal selector string'); - return [ ]; - } else if (from && !(/1|9|11/).test(from.nodeType)) { - emit('Invalid or illegal context element'); - return [ ]; - } else if (lastContext !== from) { - // reset context data when it changes - // and ensure context is set to a default - switchContext(from || (from = doc)); - } - - if (Config.CACHING && (elements = Dom.loadResults(original, from, doc, root))) { - return callback ? concatCall([ ], elements, callback) : elements; - } - - if (!OPERA_QSAPI && RE_SIMPLE_SELECTOR.test(selector)) { - switch (selector.charAt(0)) { - case '#': - if (Config.UNIQUE_ID && (element = _byId(selector.slice(1), from))) { - elements = [ element ]; - } else elements = [ ]; - break; - case '.': - elements = _byClass(selector.slice(1), from); - break; - default: - elements = _byTag(selector, from); - break; - } - } - - else if (!XML_DOCUMENT && Config.USE_QSAPI && - !(BUGGY_QUIRKS_QSAPI && RE_CLASS.test(selector)) && - !RE_BUGGY_QSAPI.test(selector)) { - try { - elements = from.querySelectorAll(selector); - } catch(e) { } - } - - if (elements) { - elements = callback ? concatCall([ ], elements, callback) : - NATIVE_SLICE_PROTO ? slice.call(elements) : concatList([ ], elements); - Config.CACHING && Dom.saveResults(original, from, doc, elements); - return elements; - } - - selector = selector.replace(reTrimSpaces, ''); - - Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, from)); - - if ((changed = lastSelector != selector)) { - // process valid selector strings - if ((parts = selector.match(reValidator)) && parts[0] == selector) { - isSingleSelect = (parts = selector.match(reSplitGroup)).length < 2; - // save passed selector - lastSelector = selector; - lastPartsSelect = parts; - } else { - emit('The string "' + selector + '", is not a valid CSS selector'); - return [ ]; - } - } else parts = lastPartsSelect; - - // commas separators are treated sequentially to maintain order - if (from.nodeType == 11) { - - elements = from.childNodes; - - } else if (!XML_DOCUMENT && isSingleSelect) { - - if (changed) { - // get right most selector token - parts = selector.match(reSplitToken); - token = parts[parts.length - 1]; - - // only last slice before :not rules - lastSlice = token.split(':not')[0]; - - // position where token was found - lastPosition = selector.length - token.length; - } - - // ID optimization RTL, to reduce number of elements to visit - if (Config.UNIQUE_ID && (parts = lastSlice.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, from))) { - if (match(element, selector)) { - callback && callback(element); - elements = [ element ]; - } else elements = [ ]; - } - } - - // ID optimization LTR, to reduce selection context searches - else if (Config.UNIQUE_ID && (parts = selector.match(Optimize.ID)) && (token = parts[1])) { - if ((element = _byId(token, doc))) { - if ('#' + token == selector) { - callback && callback(element); - elements = [ element ]; - } else if (/[>+~]/.test(selector)) { - from = element.parentNode; - } else { - from = element; - } - } else elements = [ ]; - } - - if (elements) { - Config.CACHING && Dom.saveResults(original, from, doc, elements); - return elements; - } - - if (!NATIVE_GEBCN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) { - if ((elements = _byTag(token, from)).length === 0) { return [ ]; } - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*'); - } - - else if ((parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) { - if ((elements = _byClass(token, from)).length === 0) { return [ ]; } - if (reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1))) { - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, ''); - } else { - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, '*'); - } - } - - else if ((parts = selector.match(Optimize.CLASS)) && (token = parts[1])) { - if ((elements = _byClass(token, from)).length === 0) { return [ ]; } - for (i = 0, els = [ ]; elements.length > i; ++i) { - els = concatList(els, elements[i].getElementsByTagName('*')); - } - elements = els; - if (reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1))) { - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, ''); - } else { - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token, '*'); - } - } - - else if (NATIVE_GEBCN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) { - if ((elements = _byTag(token, from)).length === 0) { return [ ]; } - selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*'); - } - - } - - if (!elements) { - elements = /^(?:applet|object)$/i.test(from.nodeName) ? from.childNodes : _byTag('*', from); - } - // end of prefiltering pass - - // compile selector resolver if necessary - if (!selectResolvers[selector] || selectContexts[selector] !== from) { - selectResolvers[selector] = compile(isSingleSelect ? [selector] : parts, '', true); - selectContexts[selector] = from; - } - - elements = selectResolvers[selector](elements, Snapshot, [ ], doc, root, from, callback, { }); - - Config.CACHING && Dom.saveResults(original, from, doc, elements); - - return elements; - }, - - /*-------------------------------- STORAGE ---------------------------------*/ - - // empty function handler - FN = function(x) { return x; }, - - // compiled match functions returning booleans - matchContexts = { }, - matchResolvers = { }, - - // compiled select functions returning collections - selectContexts = { }, - selectResolvers = { }, - - // used to pass methods to compiled functions - Snapshot = { - - // element indexing methods - nthElement: nthElement, - nthOfType: nthOfType, - - // element inspection methods - getAttribute: getAttribute, - hasAttribute: hasAttribute, - - // element selection methods - byClass: _byClass, - byName: byName, - byTag: _byTag, - byId: _byId, - - // helper/check methods - contains: contains, - isEmpty: isEmpty, - isLink: isLink, - - // selection/matching - select: select, - match: match - }, - - Tokens = { - prefixes: prefixes, - encoding: encoding, - operators: operators, - whitespace: whitespace, - identifier: identifier, - attributes: attributes, - combinators: combinators, - pseudoclass: pseudoclass, - pseudoparms: pseudoparms, - quotedvalue: quotedvalue - }; - - /*------------------------------- PUBLIC API -------------------------------*/ - - // code referenced by extensions - Dom.ACCEPT_NODE = ACCEPT_NODE; - - // log resolvers errors/warnings - Dom.emit = emit; - - // retrieve element by id attr - Dom.byId = byId; - - // retrieve elements by tag name - Dom.byTag = byTag; - - // retrieve elements by name attr - Dom.byName = byName; - - // retrieve elements by class name - Dom.byClass = byClass; - - // read the value of the attribute - // as was in the original HTML code - Dom.getAttribute = getAttribute; - - // check for the attribute presence - // as was in the original HTML code - Dom.hasAttribute = hasAttribute; - - // element match selector, return boolean true/false - Dom.match = match; - - // first element match only, return element or null - Dom.first = first; - - // elements matching selector, starting from element - Dom.select = select; - - // compile selector into ad-hoc javascript resolver - Dom.compile = compile; - - // check that two elements are ancestor/descendant - Dom.contains = contains; - - // handle selector engine configuration settings - Dom.configure = configure; - - // initialize caching for each document - Dom.setCache = FN; - - // load previously collected result set - Dom.loadResults = FN; - - // save previously collected result set - Dom.saveResults = FN; - - // handle missing context in selector strings - Dom.shortcuts = FN; - - // options enabing specific engine functionality - Dom.Config = Config; - - // pass methods references to compiled resolvers - Dom.Snapshot = Snapshot; - - // operators descriptor - // for attribute operators extensions - Dom.Operators = Operators; - - // selectors descriptor - // for pseudo-class selectors extensions - Dom.Selectors = Selectors; - - // export string patterns - Dom.Tokens = Tokens; - - // add or overwrite user defined operators - Dom.registerOperator = - function(symbol, resolver) { - Operators[symbol] || (Operators[symbol] = resolver); - }; - - // add selector patterns for user defined callbacks - Dom.registerSelector = - function(name, rexp, func) { - Selectors[name] || (Selectors[name] = { - Expression: rexp, - Callback: func - }); - }; - - /*---------------------------------- INIT ----------------------------------*/ - - // init context specific variables - switchContext(doc, true); - -}); diff --git a/node_modules/jsdom/node_modules/request/LICENSE b/node_modules/jsdom/node_modules/request/LICENSE deleted file mode 100644 index a4a9aee..0000000 --- a/node_modules/jsdom/node_modules/request/LICENSE +++ /dev/null @@ -1,55 +0,0 @@ -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/node_modules/jsdom/node_modules/request/README.md b/node_modules/jsdom/node_modules/request/README.md deleted file mode 100644 index d1f5c56..0000000 --- a/node_modules/jsdom/node_modules/request/README.md +++ /dev/null @@ -1,310 +0,0 @@ -# Request -- Simplified HTTP request method - -## Install - -

        `s.\n\n# More Examples\n\n## Creating a document-less window\n\n```js\nvar jsdom = require(\"jsdom\");\nvar window = jsdom.createWindow();\n\nconsole.log(window.document); // output: undefined\n```\n\n## Creating a document\n\n```js\nvar jsdom = require(\"jsdom\");\nvar doc = new (jsdom.level(1, \"core\").Document)();\n\nconsole.log(doc.nodeName); // outputs: #document\n```\n\n## Creating a browser-like BOM/DOM/Window\n\n```js\nvar jsdom = require(\"jsdom\").jsdom;\nvar document = jsdom(\"hello world\");\nvar window = document.createWindow();\n\nconsole.log(window.document.innerHTML);\n// output: \"hello world\"\n\nconsole.log(window.innerWidth);\n// output: 1024\n\nconsole.log(typeof window.document.getElementsByClassName);\n// outputs: function\n```\n\n## jQueryify\n\n```js\nvar jsdom = require(\"jsdom\");\nvar window = jsdom.jsdom().createWindow();\n\njsdom.jQueryify(window, \"http://code.jquery.com/jquery.js\", function () {\n window.$(\"body\").append('
        Hello World, It works
        ');\n\n console.log(window.$(\".testing\").text());\n});\n```\n\n## Passing objects to scripts inside the page\n\n```js\nvar jsdom = require(\"jsdom\").jsdom;\nvar window = jsdom().createWindow();\n\nwindow.__myObject = { foo: \"bar\" };\n\nvar scriptEl = window.document.createElement(\"script\");\nscriptEl.src = \"anotherScript.js\";\nwindow.document.body.appendChild(scriptEl);\n\n// anotherScript.js will have the ability to read `window.__myObject`, even\n// though it originated in Node!\n```\n\n# Test Compliance:\n\n```\n level1/core 532/532 100%\n level1/html 238/238 100%\n level1/svg 527/527 100%\n level2/core 283/283 100%\n level2/html 697/697 100%\n level2/style 10/10 100%\n level2/extra 4/4 100%\n level2/events 24/24 100%\n level3/xpath 93/93 100%\n window/index 5/5 100%\n window/script 10/10 100%\n window/frame 14/14 100%\n sizzle/index 9/14 64%\n jsdom/index 86/86 100%\n jsonp/jsonp 1/1 100%\n browser/contextifyReplacement 4/4 100%\n browser/index 22/22 100%\n------------------------------------------------------\nTOTALS: 5/2564 failed; 99% success\n```\n\n## Running the tests\n\nFirst you'll want to `npm install`. To run all the tests, use `npm test`, which just calls `node test/runner`.\n\nUsing `test/runner` directly, you can slice and dice which tests your want to run from different levels. Usage is as follows:\n\n```\ntest/runner --help\nRun the jsdom test suite\n\nOptions:\n-s, --suites suites that you want to run. ie: -s level1/core,1/html,html [string]\n-f, --fail-fast stop on the first failed test\n-h, --help show the help\n-t, --tests choose the test cases to run. ie: -t jquery\n```\n", - "_id": "jsdom@0.3.4", - "dist": { - "shasum": "346d31d2efbfaa29843aeeabe28fb868a51da566" - }, - "_from": "jsdom" -} diff --git a/node_modules/jsdom/test.css b/node_modules/jsdom/test.css deleted file mode 100644 index 1e903c7..0000000 --- a/node_modules/jsdom/test.css +++ /dev/null @@ -1,6 +0,0 @@ - -@media screen,handheld { - .citation *.printonly { - display: none; - } -} diff --git a/node_modules/jsdom/test.js b/node_modules/jsdom/test.js deleted file mode 100644 index 83ba3ca..0000000 --- a/node_modules/jsdom/test.js +++ /dev/null @@ -1,17 +0,0 @@ -"use strict"; - -var assert = require("assert"); -var jsdom = require("./lib/jsdom"); -var cssom = require("cssom"); - -console.log(cssom.parse(require("fs").readFileSync('test.css', 'utf-8'))); - -jsdom.env({ - html: '', - config: { - ProcessExternalResources: ["script", "link"] - }, - done: function (errors, window) { - window.getComputedStyle(window.document.body); - } -}); diff --git a/node_modules/request/LICENSE b/node_modules/request/LICENSE deleted file mode 100644 index a4a9aee..0000000 --- a/node_modules/request/LICENSE +++ /dev/null @@ -1,55 +0,0 @@ -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/node_modules/request/README.md b/node_modules/request/README.md deleted file mode 100644 index d1f5c56..0000000 --- a/node_modules/request/README.md +++ /dev/null @@ -1,310 +0,0 @@ -# Request -- Simplified HTTP request method - -## Install - -
        -  npm install request
        -
        - -Or from source: - -
        -  git clone git://github.com/mikeal/request.git 
        -  cd request
        -  npm link
        -
        - -## Super simple to use - -Request is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default. - -```javascript -var request = require('request'); -request('http://www.google.com', function (error, response, body) { - if (!error && response.statusCode == 200) { - console.log(body) // Print the google web page. - } -}) -``` - -## Streaming - -You can stream any response to a file stream. - -```javascript -request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png')) -``` - -You can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers. - -```javascript -fs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json')) -``` - -Request can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers. - -```javascript -request.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png')) -``` - -Now let's get fancy. - -```javascript -http.createServer(function (req, resp) { - if (req.url === '/doodle.png') { - if (req.method === 'PUT') { - req.pipe(request.put('http://mysite.com/doodle.png')) - } else if (req.method === 'GET' || req.method === 'HEAD') { - request.get('http://mysite.com/doodle.png').pipe(resp) - } - } -}) -``` - -You can also pipe() from a http.ServerRequest instance and to a http.ServerResponse instance. The HTTP method and headers will be sent as well as the entity-body data. Which means that, if you don't really care about security, you can do: - -```javascript -http.createServer(function (req, resp) { - if (req.url === '/doodle.png') { - var x = request('http://mysite.com/doodle.png') - req.pipe(x) - x.pipe(resp) - } -}) -``` - -And since pipe() returns the destination stream in node 0.5.x you can do one line proxying :) - -```javascript -req.pipe(request('http://mysite.com/doodle.png')).pipe(resp) -``` - -Also, none of this new functionality conflicts with requests previous features, it just expands them. - -```javascript -var r = request.defaults({'proxy':'http://localproxy.com'}) - -http.createServer(function (req, resp) { - if (req.url === '/doodle.png') { - r.get('http://google.com/doodle.png').pipe(resp) - } -}) -``` -You can still use intermediate proxies, the requests will still follow HTTP forwards, etc. - -## Forms - -`request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API. - -Url encoded forms are simple - -```javascript -request.post('http://service.com/upload', {form:{key:'value'}}) -// or -request.post('http://service.com/upload').form({key:'value'}) -``` - -For `multipart/form-data` we use the [form-data](https://github.com/felixge/node-form-data) library by [@felixge](https://github.com/felixge). You don't need to worry about piping the form object or setting the headers, `request` will handle that for you. - -```javascript -var r = request.post('http://service.com/upload') -var form = r.form() -form.append('my_field', 'my_value') -form.append('my_buffer', new Buffer([1, 2, 3])) -form.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png')) -form.append('remote_file', request('http://google.com/doodle.png')) -``` - -## OAuth Signing - -```javascript -// Twitter OAuth -var qs = require('querystring') - , oauth = - { callback: 'http://mysite.com/callback/' - , consumer_key: CONSUMER_KEY - , consumer_secret: CONSUMER_SECRET - } - , url = 'https://api.twitter.com/oauth/request_token' - ; -request.post({url:url, oauth:oauth}, function (e, r, body) { - // Assume by some stretch of magic you aquired the verifier - var access_token = qs.parse(body) - , oauth = - { consumer_key: CONSUMER_KEY - , consumer_secret: CONSUMER_SECRET - , token: access_token.oauth_token - , verifier: VERIFIER - , token_secret: access_token.oauth_token_secret - } - , url = 'https://api.twitter.com/oauth/access_token' - ; - request.post({url:url, oauth:oauth}, function (e, r, body) { - var perm_token = qs.parse(body) - , oauth = - { consumer_key: CONSUMER_KEY - , consumer_secret: CONSUMER_SECRET - , token: perm_token.oauth_token - , token_secret: perm_token.oauth_token_secret - } - , url = 'https://api.twitter.com/1/users/show.json?' - , params = - { screen_name: perm_token.screen_name - , user_id: perm_token.user_id - } - ; - url += qs.stringify(params) - request.get({url:url, oauth:oauth, json:true}, function (e, r, user) { - console.log(user) - }) - }) -}) -``` - - - -### request(options, callback) - -The first argument can be either a url or an options object. The only required option is uri, all others are optional. - -* `uri` || `url` - fully qualified uri or a parsed url object from url.parse() -* `qs` - object containing querystring values to be appended to the uri -* `method` - http method, defaults to GET -* `headers` - http headers, defaults to {} -* `body` - entity body for POST and PUT requests. Must be buffer or string. -* `form` - when passed an object this will set `body` but to a querystring representation of value and adds `Content-type: application/x-www-form-urlencoded; charset=utf-8` header. When passed no option a FormData instance is returned that will be piped to request. -* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header. Additionally, parses the response body as json. -* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below. -* `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true. -* `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects. defaults to false. -* `maxRedirects` - the maximum number of redirects to follow, defaults to 10. -* `encoding` - Encoding to be used on `setEncoding` of response data. If set to `null`, the body is returned as a Buffer. -* `pool` - A hash object containing the agents for these requests. If omitted this request will use the global pool which is set to node's default maxSockets. -* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool. -* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request -* `proxy` - An HTTP proxy to be used. Support proxy Auth with Basic Auth the same way it's supported with the `url` parameter by embedding the auth info in the uri. -* `oauth` - Options for OAuth HMAC-SHA1 signing, see documentation above. -* `strictSSL` - Set to `true` to require that SSL certificates be valid. Note: to use your own certificate authority, you need to specify an agent that was created with that ca as an option. -* `jar` - Set to `false` if you don't want cookies to be remembered for future use or define your custom cookie jar (see examples section) -* `aws` - object containing aws signing information, should have the properties `key` and `secret` as well as `bucket` unless you're specifying your bucket as part of the path, or you are making a request that doesn't use a bucket (i.e. GET Services) - - -The callback argument gets 3 arguments. The first is an error when applicable (usually from the http.Client option not the http.ClientRequest object). The second in an http.ClientResponse object. The third is the response body String or Buffer. - -## Convenience methods - -There are also shorthand methods for different HTTP METHODs and some other conveniences. - -### request.defaults(options) - -This method returns a wrapper around the normal request API that defaults to whatever options you pass in to it. - -### request.put - -Same as request() but defaults to `method: "PUT"`. - -```javascript -request.put(url) -``` - -### request.post - -Same as request() but defaults to `method: "POST"`. - -```javascript -request.post(url) -``` - -### request.head - -Same as request() but defaults to `method: "HEAD"`. - -```javascript -request.head(url) -``` - -### request.del - -Same as request() but defaults to `method: "DELETE"`. - -```javascript -request.del(url) -``` - -### request.get - -Alias to normal request method for uniformity. - -```javascript -request.get(url) -``` -### request.cookie - -Function that creates a new cookie. - -```javascript -request.cookie('cookie_string_here') -``` -### request.jar - -Function that creates a new cookie jar. - -```javascript -request.jar() -``` - - -## Examples: - -```javascript - var request = require('request') - , rand = Math.floor(Math.random()*100000000).toString() - ; - request( - { method: 'PUT' - , uri: 'http://mikeal.iriscouch.com/testjs/' + rand - , multipart: - [ { 'content-type': 'application/json' - , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}}) - } - , { body: 'I am an attachment' } - ] - } - , function (error, response, body) { - if(response.statusCode == 201){ - console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand) - } else { - console.log('error: '+ response.statusCode) - console.log(body) - } - } - ) -``` -Cookies are enabled by default (so they can be used in subsequent requests). To disable cookies set jar to false (either in defaults or in the options sent). - -```javascript -var request = request.defaults({jar: false}) -request('http://www.google.com', function () { - request('http://images.google.com') -}) -``` - -If you to use a custom cookie jar (instead of letting request use its own global cookie jar) you do so by setting the jar default or by specifying it as an option: - -```javascript -var j = request.jar() -var request = request.defaults({jar:j}) -request('http://www.google.com', function () { - request('http://images.google.com') -}) -``` -OR - -```javascript -var j = request.jar() -var cookie = request.cookie('your_cookie_here') -j.add(cookie) -request({url: 'http://www.google.com', jar: j}, function () { - request('http://images.google.com') -}) -``` diff --git a/node_modules/request/aws.js b/node_modules/request/aws.js deleted file mode 100644 index 4d8d950..0000000 --- a/node_modules/request/aws.js +++ /dev/null @@ -1,191 +0,0 @@ - -/*! - * knox - auth - * Copyright(c) 2010 LearnBoost - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var crypto = require('crypto') - , parse = require('url').parse - ; - -/** - * Valid keys. - */ - -var keys = - [ 'acl' - , 'location' - , 'logging' - , 'notification' - , 'partNumber' - , 'policy' - , 'requestPayment' - , 'torrent' - , 'uploadId' - , 'uploads' - , 'versionId' - , 'versioning' - , 'versions' - , 'website' - ] - -/** - * Return an "Authorization" header value with the given `options` - * in the form of "AWS :" - * - * @param {Object} options - * @return {String} - * @api private - */ - -exports.authorization = function(options){ - return 'AWS ' + options.key + ':' + exports.sign(options) -} - -/** - * Simple HMAC-SHA1 Wrapper - * - * @param {Object} options - * @return {String} - * @api private - */ - -exports.hmacSha1 = function(options){ - return crypto.createHmac('sha1', options.secret).update(options.message).digest('base64') -} - -/** - * Create a base64 sha1 HMAC for `options`. - * - * @param {Object} options - * @return {String} - * @api private - */ - -exports.sign = function(options){ - options.message = exports.stringToSign(options) - return exports.hmacSha1(options) -} - -/** - * Create a base64 sha1 HMAC for `options`. - * - * Specifically to be used with S3 presigned URLs - * - * @param {Object} options - * @return {String} - * @api private - */ - -exports.signQuery = function(options){ - options.message = exports.queryStringToSign(options) - return exports.hmacSha1(options) -} - -/** - * Return a string for sign() with the given `options`. - * - * Spec: - * - * \n - * \n - * \n - * \n - * [headers\n] - * - * - * @param {Object} options - * @return {String} - * @api private - */ - -exports.stringToSign = function(options){ - var headers = options.amazonHeaders || '' - if (headers) headers += '\n' - var r = - [ options.verb - , options.md5 - , options.contentType - , options.date.toUTCString() - , headers + options.resource - ] - return r.join('\n') -} - -/** - * Return a string for sign() with the given `options`, but is meant exclusively - * for S3 presigned URLs - * - * Spec: - * - * \n - * - * - * @param {Object} options - * @return {String} - * @api private - */ - -exports.queryStringToSign = function(options){ - return 'GET\n\n\n' + options.date + '\n' + options.resource -}; - -/** - * Perform the following: - * - * - ignore non-amazon headers - * - lowercase fields - * - sort lexicographically - * - trim whitespace between ":" - * - join with newline - * - * @param {Object} headers - * @return {String} - * @api private - */ - -exports.canonicalizeHeaders = function(headers){ - var buf = [] - , fields = Object.keys(headers) - ; - for (var i = 0, len = fields.length; i < len; ++i) { - var field = fields[i] - , val = headers[field] - , field = field.toLowerCase() - ; - if (0 !== field.indexOf('x-amz')) continue - buf.push(field + ':' + val) - } - return buf.sort().join('\n') -}; - -/** - * Perform the following: - * - * - ignore non sub-resources - * - sort lexicographically - * - * @param {String} resource - * @return {String} - * @api private - */ - -exports.canonicalizeResource = function(resource){ - var url = parse(resource, true) - , path = url.pathname - , buf = [] - ; - - Object.keys(url.query).forEach(function(key){ - if (!~keys.indexOf(key)) return - var val = '' == url.query[key] ? '' : '=' + encodeURIComponent(url.query[key]) - buf.push(key + val) - }) - - return path + (buf.length ? '?' + buf.sort().join('&') : '') -}; diff --git a/node_modules/request/forever.js b/node_modules/request/forever.js deleted file mode 100644 index 1e1d4b9..0000000 --- a/node_modules/request/forever.js +++ /dev/null @@ -1,103 +0,0 @@ -module.exports = ForeverAgent -ForeverAgent.SSL = ForeverAgentSSL - -var util = require('util') - , Agent = require('http').Agent - , net = require('net') - , tls = require('tls') - , AgentSSL = require('https').Agent - -function ForeverAgent(options) { - var self = this - self.options = options || {} - self.requests = {} - self.sockets = {} - self.freeSockets = {} - self.maxSockets = self.options.maxSockets || Agent.defaultMaxSockets - self.minSockets = self.options.minSockets || ForeverAgent.defaultMinSockets - self.on('free', function(socket, host, port) { - var name = host + ':' + port - if (self.requests[name] && self.requests[name].length) { - self.requests[name].shift().onSocket(socket) - } else if (self.sockets[name].length < self.minSockets) { - if (!self.freeSockets[name]) self.freeSockets[name] = [] - self.freeSockets[name].push(socket) - - // if an error happens while we don't use the socket anyway, meh, throw the socket away - function onIdleError() { - socket.destroy() - } - socket._onIdleError = onIdleError - socket.on('error', onIdleError) - } else { - // If there are no pending requests just destroy the - // socket and it will get removed from the pool. This - // gets us out of timeout issues and allows us to - // default to Connection:keep-alive. - socket.destroy() - } - }) - -} -util.inherits(ForeverAgent, Agent) - -ForeverAgent.defaultMinSockets = 5 - - -ForeverAgent.prototype.createConnection = net.createConnection -ForeverAgent.prototype.addRequestNoreuse = Agent.prototype.addRequest -ForeverAgent.prototype.addRequest = function(req, host, port) { - var name = host + ':' + port - if (this.freeSockets[name] && this.freeSockets[name].length > 0 && !req.useChunkedEncodingByDefault) { - var idleSocket = this.freeSockets[name].pop() - idleSocket.removeListener('error', idleSocket._onIdleError) - delete idleSocket._onIdleError - req._reusedSocket = true - req.onSocket(idleSocket) - } else { - this.addRequestNoreuse(req, host, port) - } -} - -ForeverAgent.prototype.removeSocket = function(s, name, host, port) { - if (this.sockets[name]) { - var index = this.sockets[name].indexOf(s) - if (index !== -1) { - this.sockets[name].splice(index, 1) - } - } else if (this.sockets[name] && this.sockets[name].length === 0) { - // don't leak - delete this.sockets[name] - delete this.requests[name] - } - - if (this.freeSockets[name]) { - var index = this.freeSockets[name].indexOf(s) - if (index !== -1) { - this.freeSockets[name].splice(index, 1) - if (this.freeSockets[name].length === 0) { - delete this.freeSockets[name] - } - } - } - - if (this.requests[name] && this.requests[name].length) { - // If we have pending requests and a socket gets closed a new one - // needs to be created to take over in the pool for the one that closed. - this.createSocket(name, host, port).emit('free') - } -} - -function ForeverAgentSSL (options) { - ForeverAgent.call(this, options) -} -util.inherits(ForeverAgentSSL, ForeverAgent) - -ForeverAgentSSL.prototype.createConnection = createConnectionSSL -ForeverAgentSSL.prototype.addRequestNoreuse = AgentSSL.prototype.addRequest - -function createConnectionSSL (port, host, options) { - options.port = port - options.host = host - return tls.connect(options) -} diff --git a/node_modules/request/main.js b/node_modules/request/main.js deleted file mode 100644 index 27b470b..0000000 --- a/node_modules/request/main.js +++ /dev/null @@ -1,1123 +0,0 @@ -// Copyright 2010-2012 Mikeal Rogers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -var http = require('http') - , https = false - , tls = false - , url = require('url') - , util = require('util') - , stream = require('stream') - , qs = require('querystring') - , oauth = require('./oauth') - , uuid = require('./uuid') - , ForeverAgent = require('./forever') - , Cookie = require('./vendor/cookie') - , CookieJar = require('./vendor/cookie/jar') - , cookieJar = new CookieJar - , tunnel = require('./tunnel') - , aws = require('./aws') - - , mime = require('mime') - , FormData = require('form-data') - ; - -if (process.logging) { - var log = process.logging('request') -} - -try { - https = require('https') -} catch (e) {} - -try { - tls = require('tls') -} catch (e) {} - -function toBase64 (str) { - return (new Buffer(str || "", "ascii")).toString("base64") -} - -// Hacky fix for pre-0.4.4 https -if (https && !https.Agent) { - https.Agent = function (options) { - http.Agent.call(this, options) - } - util.inherits(https.Agent, http.Agent) - https.Agent.prototype._getConnection = function (host, port, cb) { - var s = tls.connect(port, host, this.options, function () { - // do other checks here? - if (cb) cb() - }) - return s - } -} - -function isReadStream (rs) { - if (rs.readable && rs.path && rs.mode) { - return true - } -} - -function copy (obj) { - var o = {} - Object.keys(obj).forEach(function (i) { - o[i] = obj[i] - }) - return o -} - -var isUrl = /^https?:/ - -var globalPool = {} - -function Request (options) { - stream.Stream.call(this) - this.readable = true - this.writable = true - - if (typeof options === 'string') { - options = {uri:options} - } - - var reserved = Object.keys(Request.prototype) - for (var i in options) { - if (reserved.indexOf(i) === -1) { - this[i] = options[i] - } else { - if (typeof options[i] === 'function') { - delete options[i] - } - } - } - options = copy(options) - - this.init(options) -} -util.inherits(Request, stream.Stream) -Request.prototype.init = function (options) { - var self = this - - if (!options) options = {} - if (process.env.NODE_DEBUG && /request/.test(process.env.NODE_DEBUG)) console.error('REQUEST', options) - if (!self.pool && self.pool !== false) self.pool = globalPool - self.dests = [] - self.__isRequestRequest = true - - // Protect against double callback - if (!self._callback && self.callback) { - self._callback = self.callback - self.callback = function () { - if (self._callbackCalled) return // Print a warning maybe? - self._callback.apply(self, arguments) - self._callbackCalled = true - } - self.on('error', self.callback.bind()) - self.on('complete', self.callback.bind(self, null)) - } - - if (self.url) { - // People use this property instead all the time so why not just support it. - self.uri = self.url - delete self.url - } - - if (!self.uri) { - // this will throw if unhandled but is handleable when in a redirect - return self.emit('error', new Error("options.uri is a required argument")) - } else { - if (typeof self.uri == "string") self.uri = url.parse(self.uri) - } - if (self.proxy) { - if (typeof self.proxy == 'string') self.proxy = url.parse(self.proxy) - - // do the HTTP CONNECT dance using koichik/node-tunnel - if (http.globalAgent && self.uri.protocol === "https:") { - var tunnelFn = self.proxy.protocol === "http:" - ? tunnel.httpsOverHttp : tunnel.httpsOverHttps - - var tunnelOptions = { proxy: { host: self.proxy.hostname - , port: +self.proxy.port - , proxyAuth: self.proxy.auth } - , ca: this.ca } - - self.agent = tunnelFn(tunnelOptions) - self.tunnel = true - } - } - - if (!self.uri.host || !self.uri.pathname) { - // Invalid URI: it may generate lot of bad errors, like "TypeError: Cannot call method 'indexOf' of undefined" in CookieJar - // Detect and reject it as soon as possible - var faultyUri = url.format(self.uri) - var message = 'Invalid URI "' + faultyUri + '"' - if (Object.keys(options).length === 0) { - // No option ? This can be the sign of a redirect - // As this is a case where the user cannot do anything (he didn't call request directly with this URL) - // he should be warned that it can be caused by a redirection (can save some hair) - message += '. This can be caused by a crappy redirection.' - } - self.emit('error', new Error(message)) - return // This error was fatal - } - - self._redirectsFollowed = self._redirectsFollowed || 0 - self.maxRedirects = (self.maxRedirects !== undefined) ? self.maxRedirects : 10 - self.followRedirect = (self.followRedirect !== undefined) ? self.followRedirect : true - self.followAllRedirects = (self.followAllRedirects !== undefined) ? self.followAllRedirects : false - if (self.followRedirect || self.followAllRedirects) - self.redirects = self.redirects || [] - - self.headers = self.headers ? copy(self.headers) : {} - - self.setHost = false - if (!self.headers.host) { - self.headers.host = self.uri.hostname - if (self.uri.port) { - if ( !(self.uri.port === 80 && self.uri.protocol === 'http:') && - !(self.uri.port === 443 && self.uri.protocol === 'https:') ) - self.headers.host += (':'+self.uri.port) - } - self.setHost = true - } - - self.jar(self._jar || options.jar) - - if (!self.uri.pathname) {self.uri.pathname = '/'} - if (!self.uri.port) { - if (self.uri.protocol == 'http:') {self.uri.port = 80} - else if (self.uri.protocol == 'https:') {self.uri.port = 443} - } - - if (self.proxy && !self.tunnel) { - self.port = self.proxy.port - self.host = self.proxy.hostname - } else { - self.port = self.uri.port - self.host = self.uri.hostname - } - - self.clientErrorHandler = function (error) { - if (self._aborted) return - - if (self.setHost) delete self.headers.host - if (self.req._reusedSocket && error.code === 'ECONNRESET' - && self.agent.addRequestNoreuse) { - self.agent = { addRequest: self.agent.addRequestNoreuse.bind(self.agent) } - self.start() - self.req.end() - return - } - if (self.timeout && self.timeoutTimer) { - clearTimeout(self.timeoutTimer) - self.timeoutTimer = null - } - self.emit('error', error) - } - - self._parserErrorHandler = function (error) { - if (this.res) { - if (this.res.request) { - this.res.request.emit('error', error) - } else { - this.res.emit('error', error) - } - } else { - this._httpMessage.emit('error', error) - } - } - - if (options.form) { - self.form(options.form) - } - - if (options.oauth) { - self.oauth(options.oauth) - } - - if (options.aws) { - self.aws(options.aws) - } - - if (self.uri.auth && !self.headers.authorization) { - self.headers.authorization = "Basic " + toBase64(self.uri.auth.split(':').map(function(item){ return qs.unescape(item)}).join(':')) - } - if (self.proxy && self.proxy.auth && !self.headers['proxy-authorization'] && !self.tunnel) { - self.headers['proxy-authorization'] = "Basic " + toBase64(self.proxy.auth.split(':').map(function(item){ return qs.unescape(item)}).join(':')) - } - - if (options.qs) self.qs(options.qs) - - if (self.uri.path) { - self.path = self.uri.path - } else { - self.path = self.uri.pathname + (self.uri.search || "") - } - - if (self.path.length === 0) self.path = '/' - - if (self.proxy && !self.tunnel) self.path = (self.uri.protocol + '//' + self.uri.host + self.path) - - if (options.json) { - self.json(options.json) - } else if (options.multipart) { - self.boundary = uuid() - self.multipart(options.multipart) - } - - if (self.body) { - var length = 0 - if (!Buffer.isBuffer(self.body)) { - if (Array.isArray(self.body)) { - for (var i = 0; i < self.body.length; i++) { - length += self.body[i].length - } - } else { - self.body = new Buffer(self.body) - length = self.body.length - } - } else { - length = self.body.length - } - if (length) { - if(!self.headers['content-length'] && !self.headers['Content-Length']) - self.headers['content-length'] = length - } else { - throw new Error('Argument error, options.body.') - } - } - - var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol - , defaultModules = {'http:':http, 'https:':https} - , httpModules = self.httpModules || {} - ; - self.httpModule = httpModules[protocol] || defaultModules[protocol] - - if (!self.httpModule) return this.emit('error', new Error("Invalid protocol")) - - if (options.ca) self.ca = options.ca - - if (!self.agent) { - if (options.agentOptions) self.agentOptions = options.agentOptions - - if (options.agentClass) { - self.agentClass = options.agentClass - } else if (options.forever) { - self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL - } else { - self.agentClass = self.httpModule.Agent - } - } - - if (self.pool === false) { - self.agent = false - } else { - self.agent = self.agent || self.getAgent() - if (self.maxSockets) { - // Don't use our pooling if node has the refactored client - self.agent.maxSockets = self.maxSockets - } - if (self.pool.maxSockets) { - // Don't use our pooling if node has the refactored client - self.agent.maxSockets = self.pool.maxSockets - } - } - - self.once('pipe', function (src) { - if (self.ntick && self._started) throw new Error("You cannot pipe to this stream after the outbound request has started.") - self.src = src - if (isReadStream(src)) { - if (!self.headers['content-type'] && !self.headers['Content-Type']) - self.headers['content-type'] = mime.lookup(src.path) - } else { - if (src.headers) { - for (var i in src.headers) { - if (!self.headers[i]) { - self.headers[i] = src.headers[i] - } - } - } - if (self._json && !self.headers['content-type'] && !self.headers['Content-Type']) - self.headers['content-type'] = 'application/json' - if (src.method && !self.method) { - self.method = src.method - } - } - - self.on('pipe', function () { - console.error("You have already piped to this stream. Pipeing twice is likely to break the request.") - }) - }) - - process.nextTick(function () { - if (self._aborted) return - - if (self._form) { - self.setHeaders(self._form.getHeaders()) - self._form.pipe(self) - } - if (self.body) { - if (Array.isArray(self.body)) { - self.body.forEach(function (part) { - self.write(part) - }) - } else { - self.write(self.body) - } - self.end() - } else if (self.requestBodyStream) { - console.warn("options.requestBodyStream is deprecated, please pass the request object to stream.pipe.") - self.requestBodyStream.pipe(self) - } else if (!self.src) { - if (self.method !== 'GET' && typeof self.method !== 'undefined') { - self.headers['content-length'] = 0 - } - self.end() - } - self.ntick = true - }) -} - -// Must call this when following a redirect from https to http or vice versa -// Attempts to keep everything as identical as possible, but update the -// httpModule, Tunneling agent, and/or Forever Agent in use. -Request.prototype._updateProtocol = function () { - var self = this - var protocol = self.uri.protocol - - if (protocol === 'https:') { - // previously was doing http, now doing https - // if it's https, then we might need to tunnel now. - if (self.proxy) { - self.tunnel = true - var tunnelFn = self.proxy.protocol === 'http:' - ? tunnel.httpsOverHttp : tunnel.httpsOverHttps - var tunnelOptions = { proxy: { host: self.proxy.hostname - , post: +self.proxy.port - , proxyAuth: self.proxy.auth } - , ca: self.ca } - self.agent = tunnelFn(tunnelOptions) - return - } - - self.httpModule = https - switch (self.agentClass) { - case ForeverAgent: - self.agentClass = ForeverAgent.SSL - break - case http.Agent: - self.agentClass = https.Agent - break - default: - // nothing we can do. Just hope for the best. - return - } - - // if there's an agent, we need to get a new one. - if (self.agent) self.agent = self.getAgent() - - } else { - if (log) log('previously https, now http') - // previously was doing https, now doing http - // stop any tunneling. - if (self.tunnel) self.tunnel = false - self.httpModule = http - switch (self.agentClass) { - case ForeverAgent.SSL: - self.agentClass = ForeverAgent - break - case https.Agent: - self.agentClass = http.Agent - break - default: - // nothing we can do. just hope for the best - return - } - - // if there's an agent, then get a new one. - if (self.agent) { - self.agent = null - self.agent = self.getAgent() - } - } -} - -Request.prototype.getAgent = function () { - var Agent = this.agentClass - var options = {} - if (this.agentOptions) { - for (var i in this.agentOptions) { - options[i] = this.agentOptions[i] - } - } - if (this.ca) options.ca = this.ca - - var poolKey = '' - - // different types of agents are in different pools - if (Agent !== this.httpModule.Agent) { - poolKey += Agent.name - } - - if (!this.httpModule.globalAgent) { - // node 0.4.x - options.host = this.host - options.port = this.port - if (poolKey) poolKey += ':' - poolKey += this.host + ':' + this.port - } - - // ca option is only relevant if proxy or destination are https - var proxy = this.proxy - if (typeof proxy === 'string') proxy = url.parse(proxy) - var caRelevant = (proxy && proxy.protocol === 'https:') || this.uri.protocol === 'https:' - if (options.ca && caRelevant) { - if (poolKey) poolKey += ':' - poolKey += options.ca - } - - if (!poolKey && Agent === this.httpModule.Agent && this.httpModule.globalAgent) { - // not doing anything special. Use the globalAgent - return this.httpModule.globalAgent - } - - // we're using a stored agent. Make sure it's protocol-specific - poolKey = this.uri.protocol + poolKey - - // already generated an agent for this setting - if (this.pool[poolKey]) return this.pool[poolKey] - - return this.pool[poolKey] = new Agent(options) -} - -Request.prototype.start = function () { - var self = this - - if (self._aborted) return - - self._started = true - self.method = self.method || 'GET' - self.href = self.uri.href - if (log) log('%method %href', self) - - if (self.src && self.src.stat && self.src.stat.size && !self.headers['content-length'] && !self.headers['Content-Length']) { - self.headers['content-length'] = self.src.stat.size - } - if (self._aws) { - self.aws(self._aws, true) - } - self.req = self.httpModule.request(self, function (response) { - if (response.connection.listeners('error').indexOf(self._parserErrorHandler) === -1) { - response.connection.once('error', self._parserErrorHandler) - } - if (self._aborted) return - if (self._paused) response.pause() - - self.response = response - response.request = self - response.toJSON = toJSON - - if (self.httpModule === https && - self.strictSSL && - !response.client.authorized) { - var sslErr = response.client.authorizationError - self.emit('error', new Error('SSL Error: '+ sslErr)) - return - } - - if (self.setHost) delete self.headers.host - if (self.timeout && self.timeoutTimer) { - clearTimeout(self.timeoutTimer) - self.timeoutTimer = null - } - - var addCookie = function (cookie) { - if (self._jar) self._jar.add(new Cookie(cookie)) - else cookieJar.add(new Cookie(cookie)) - } - - if (response.headers['set-cookie'] && (!self._disableCookies)) { - if (Array.isArray(response.headers['set-cookie'])) response.headers['set-cookie'].forEach(addCookie) - else addCookie(response.headers['set-cookie']) - } - - if (response.statusCode >= 300 && response.statusCode < 400 && - (self.followAllRedirects || - (self.followRedirect && (self.method !== 'PUT' && self.method !== 'POST' && self.method !== 'DELETE'))) && - response.headers.location) { - if (self._redirectsFollowed >= self.maxRedirects) { - self.emit('error', new Error("Exceeded maxRedirects. Probably stuck in a redirect loop "+self.uri.href)) - return - } - self._redirectsFollowed += 1 - - if (!isUrl.test(response.headers.location)) { - response.headers.location = url.resolve(self.uri.href, response.headers.location) - } - - var uriPrev = self.uri - self.uri = url.parse(response.headers.location) - - // handle the case where we change protocol from https to http or vice versa - if (self.uri.protocol !== uriPrev.protocol) { - self._updateProtocol() - } - - self.redirects.push( - { statusCode : response.statusCode - , redirectUri: response.headers.location - } - ) - if (self.followAllRedirects) self.method = 'GET' - // self.method = 'GET' // Force all redirects to use GET || commented out fixes #215 - delete self.src - delete self.req - delete self.agent - delete self._started - delete self.body - delete self._form - if (self.headers) { - delete self.headers.host - delete self.headers['content-type'] - delete self.headers['content-length'] - } - if (log) log('Redirect to %uri', self) - self.init() - return // Ignore the rest of the response - } else { - self._redirectsFollowed = self._redirectsFollowed || 0 - // Be a good stream and emit end when the response is finished. - // Hack to emit end on close because of a core bug that never fires end - response.on('close', function () { - if (!self._ended) self.response.emit('end') - }) - - if (self.encoding) { - if (self.dests.length !== 0) { - console.error("Ingoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.") - } else { - response.setEncoding(self.encoding) - } - } - - self.dests.forEach(function (dest) { - self.pipeDest(dest) - }) - - response.on("data", function (chunk) { - self._destdata = true - self.emit("data", chunk) - }) - response.on("end", function (chunk) { - self._ended = true - self.emit("end", chunk) - }) - response.on("close", function () {self.emit("close")}) - - self.emit('response', response) - - if (self.callback) { - var buffer = [] - var bodyLen = 0 - self.on("data", function (chunk) { - buffer.push(chunk) - bodyLen += chunk.length - }) - self.on("end", function () { - if (self._aborted) return - - if (buffer.length && Buffer.isBuffer(buffer[0])) { - var body = new Buffer(bodyLen) - var i = 0 - buffer.forEach(function (chunk) { - chunk.copy(body, i, 0, chunk.length) - i += chunk.length - }) - if (self.encoding === null) { - response.body = body - } else { - response.body = body.toString(self.encoding) - } - } else if (buffer.length) { - response.body = buffer.join('') - } - - if (self._json) { - try { - response.body = JSON.parse(response.body) - } catch (e) {} - } - - self.emit('complete', response, response.body) - }) - } - } - }) - - if (self.timeout && !self.timeoutTimer) { - self.timeoutTimer = setTimeout(function () { - self.req.abort() - var e = new Error("ETIMEDOUT") - e.code = "ETIMEDOUT" - self.emit("error", e) - }, self.timeout) - - // Set additional timeout on socket - in case if remote - // server freeze after sending headers - if (self.req.setTimeout) { // only works on node 0.6+ - self.req.setTimeout(self.timeout, function () { - if (self.req) { - self.req.abort() - var e = new Error("ESOCKETTIMEDOUT") - e.code = "ESOCKETTIMEDOUT" - self.emit("error", e) - } - }) - } - } - - self.req.on('error', self.clientErrorHandler) - self.req.on('drain', function() { - self.emit('drain') - }) - self.on('end', function() { - if ( self.req.connection ) self.req.connection.removeListener('error', self._parserErrorHandler) - }) - self.emit('request', self.req) -} - -Request.prototype.abort = function () { - this._aborted = true - - if (this.req) { - this.req.abort() - } - else if (this.response) { - this.response.abort() - } - - this.emit("abort") -} - -Request.prototype.pipeDest = function (dest) { - var response = this.response - // Called after the response is received - if (dest.headers) { - dest.headers['content-type'] = response.headers['content-type'] - if (response.headers['content-length']) { - dest.headers['content-length'] = response.headers['content-length'] - } - } - if (dest.setHeader) { - for (var i in response.headers) { - dest.setHeader(i, response.headers[i]) - } - dest.statusCode = response.statusCode - } - if (this.pipefilter) this.pipefilter(response, dest) -} - -// Composable API -Request.prototype.setHeader = function (name, value, clobber) { - if (clobber === undefined) clobber = true - if (clobber || !this.headers.hasOwnProperty(name)) this.headers[name] = value - else this.headers[name] += ',' + value - return this -} -Request.prototype.setHeaders = function (headers) { - for (var i in headers) {this.setHeader(i, headers[i])} - return this -} -Request.prototype.qs = function (q, clobber) { - var base - if (!clobber && this.uri.query) base = qs.parse(this.uri.query) - else base = {} - - for (var i in q) { - base[i] = q[i] - } - - this.uri = url.parse(this.uri.href.split('?')[0] + '?' + qs.stringify(base)) - this.url = this.uri - - return this -} -Request.prototype.form = function (form) { - if (form) { - this.headers['content-type'] = 'application/x-www-form-urlencoded; charset=utf-8' - this.body = qs.stringify(form).toString('utf8') - return this - } - // create form-data object - this._form = new FormData() - return this._form -} -Request.prototype.multipart = function (multipart) { - var self = this - self.body = [] - - if (!self.headers['content-type']) { - self.headers['content-type'] = 'multipart/related; boundary=' + self.boundary - } else { - self.headers['content-type'] = self.headers['content-type'].split(';')[0] + '; boundary=' + self.boundary - } - - if (!multipart.forEach) throw new Error('Argument error, options.multipart.') - - if (self.preambleCRLF) { - self.body.push(new Buffer('\r\n')) - } - - multipart.forEach(function (part) { - var body = part.body - if(body == null) throw Error('Body attribute missing in multipart.') - delete part.body - var preamble = '--' + self.boundary + '\r\n' - Object.keys(part).forEach(function (key) { - preamble += key + ': ' + part[key] + '\r\n' - }) - preamble += '\r\n' - self.body.push(new Buffer(preamble)) - self.body.push(new Buffer(body)) - self.body.push(new Buffer('\r\n')) - }) - self.body.push(new Buffer('--' + self.boundary + '--')) - return self -} -Request.prototype.json = function (val) { - this.setHeader('accept', 'application/json') - this._json = true - if (typeof val === 'boolean') { - if (typeof this.body === 'object') { - this.setHeader('content-type', 'application/json') - this.body = JSON.stringify(this.body) - } - } else { - this.setHeader('content-type', 'application/json') - this.body = JSON.stringify(val) - } - return this -} -function getHeader(name, headers) { - var result, re, match - Object.keys(headers).forEach(function (key) { - re = new RegExp(name, 'i') - match = key.match(re) - if (match) result = headers[key] - }) - return result -} -Request.prototype.aws = function (opts, now) { - if (!now) { - this._aws = opts - return this - } - var date = new Date() - this.setHeader('date', date.toUTCString()) - var auth = - { key: opts.key - , secret: opts.secret - , verb: this.method.toUpperCase() - , date: date - , contentType: getHeader('content-type', this.headers) || '' - , md5: getHeader('content-md5', this.headers) || '' - , amazonHeaders: aws.canonicalizeHeaders(this.headers) - } - if (opts.bucket && this.path) { - auth.resource = '/' + opts.bucket + this.path - } else if (opts.bucket && !this.path) { - auth.resource = '/' + opts.bucket - } else if (!opts.bucket && this.path) { - auth.resource = this.path - } else if (!opts.bucket && !this.path) { - auth.resource = '/' - } - auth.resource = aws.canonicalizeResource(auth.resource) - this.setHeader('authorization', aws.authorization(auth)) - - return this -} - -Request.prototype.oauth = function (_oauth) { - var form - if (this.headers['content-type'] && - this.headers['content-type'].slice(0, 'application/x-www-form-urlencoded'.length) === - 'application/x-www-form-urlencoded' - ) { - form = qs.parse(this.body) - } - if (this.uri.query) { - form = qs.parse(this.uri.query) - } - if (!form) form = {} - var oa = {} - for (var i in form) oa[i] = form[i] - for (var i in _oauth) oa['oauth_'+i] = _oauth[i] - if (!oa.oauth_version) oa.oauth_version = '1.0' - if (!oa.oauth_timestamp) oa.oauth_timestamp = Math.floor( (new Date()).getTime() / 1000 ).toString() - if (!oa.oauth_nonce) oa.oauth_nonce = uuid().replace(/-/g, '') - - oa.oauth_signature_method = 'HMAC-SHA1' - - var consumer_secret = oa.oauth_consumer_secret - delete oa.oauth_consumer_secret - var token_secret = oa.oauth_token_secret - delete oa.oauth_token_secret - - var baseurl = this.uri.protocol + '//' + this.uri.host + this.uri.pathname - var signature = oauth.hmacsign(this.method, baseurl, oa, consumer_secret, token_secret) - - // oa.oauth_signature = signature - for (var i in form) { - if ( i.slice(0, 'oauth_') in _oauth) { - // skip - } else { - delete oa['oauth_'+i] - if (i !== 'x_auth_mode') delete oa[i] - } - } - this.headers.Authorization = - 'OAuth '+Object.keys(oa).sort().map(function (i) {return i+'="'+oauth.rfc3986(oa[i])+'"'}).join(',') - this.headers.Authorization += ',oauth_signature="' + oauth.rfc3986(signature) + '"' - return this -} -Request.prototype.jar = function (jar) { - var cookies - - if (this._redirectsFollowed === 0) { - this.originalCookieHeader = this.headers.cookie - } - - if (jar === false) { - // disable cookies - cookies = false - this._disableCookies = true - } else if (jar) { - // fetch cookie from the user defined cookie jar - cookies = jar.get({ url: this.uri.href }) - } else { - // fetch cookie from the global cookie jar - cookies = cookieJar.get({ url: this.uri.href }) - } - - if (cookies && cookies.length) { - var cookieString = cookies.map(function (c) { - return c.name + "=" + c.value - }).join("; ") - - if (this.originalCookieHeader) { - // Don't overwrite existing Cookie header - this.headers.cookie = this.originalCookieHeader + '; ' + cookieString - } else { - this.headers.cookie = cookieString - } - } - this._jar = jar - return this -} - - -// Stream API -Request.prototype.pipe = function (dest, opts) { - if (this.response) { - if (this._destdata) { - throw new Error("You cannot pipe after data has been emitted from the response.") - } else if (this._ended) { - throw new Error("You cannot pipe after the response has been ended.") - } else { - stream.Stream.prototype.pipe.call(this, dest, opts) - this.pipeDest(dest) - return dest - } - } else { - this.dests.push(dest) - stream.Stream.prototype.pipe.call(this, dest, opts) - return dest - } -} -Request.prototype.write = function () { - if (!this._started) this.start() - return this.req.write.apply(this.req, arguments) -} -Request.prototype.end = function (chunk) { - if (chunk) this.write(chunk) - if (!this._started) this.start() - this.req.end() -} -Request.prototype.pause = function () { - if (!this.response) this._paused = true - else this.response.pause.apply(this.response, arguments) -} -Request.prototype.resume = function () { - if (!this.response) this._paused = false - else this.response.resume.apply(this.response, arguments) -} -Request.prototype.destroy = function () { - if (!this._ended) this.end() -} - -// organize params for post, put, head, del -function initParams(uri, options, callback) { - if ((typeof options === 'function') && !callback) callback = options - if (options && typeof options === 'object') { - options.uri = uri - } else if (typeof uri === 'string') { - options = {uri:uri} - } else { - options = uri - uri = options.uri - } - return { uri: uri, options: options, callback: callback } -} - -function request (uri, options, callback) { - if (typeof uri === 'undefined') throw new Error('undefined is not a valid uri or options object.') - if ((typeof options === 'function') && !callback) callback = options - if (options && typeof options === 'object') { - options.uri = uri - } else if (typeof uri === 'string') { - options = {uri:uri} - } else { - options = uri - } - - if (callback) options.callback = callback - var r = new Request(options) - return r -} - -module.exports = request - -request.initParams = initParams - -request.defaults = function (options, requester) { - var def = function (method) { - var d = function (uri, opts, callback) { - var params = initParams(uri, opts, callback) - for (var i in options) { - if (params.options[i] === undefined) params.options[i] = options[i] - } - if(typeof requester === 'function') { - if(method === request) { - method = requester - } else { - params.options._requester = requester - } - } - return method(params.options, params.callback) - } - return d - } - var de = def(request) - de.get = def(request.get) - de.post = def(request.post) - de.put = def(request.put) - de.head = def(request.head) - de.del = def(request.del) - de.cookie = def(request.cookie) - de.jar = request.jar - return de -} - -request.forever = function (agentOptions, optionsArg) { - var options = {} - if (optionsArg) { - for (option in optionsArg) { - options[option] = optionsArg[option] - } - } - if (agentOptions) options.agentOptions = agentOptions - options.forever = true - return request.defaults(options) -} - -request.get = request -request.post = function (uri, options, callback) { - var params = initParams(uri, options, callback) - params.options.method = 'POST' - return request(params.uri || null, params.options, params.callback) -} -request.put = function (uri, options, callback) { - var params = initParams(uri, options, callback) - params.options.method = 'PUT' - return request(params.uri || null, params.options, params.callback) -} -request.head = function (uri, options, callback) { - var params = initParams(uri, options, callback) - params.options.method = 'HEAD' - if (params.options.body || - params.options.requestBodyStream || - (params.options.json && typeof params.options.json !== 'boolean') || - params.options.multipart) { - throw new Error("HTTP HEAD requests MUST NOT include a request body.") - } - return request(params.uri || null, params.options, params.callback) -} -request.del = function (uri, options, callback) { - var params = initParams(uri, options, callback) - params.options.method = 'DELETE' - if(typeof params.options._requester === 'function') { - request = params.options._requester - } - return request(params.uri || null, params.options, params.callback) -} -request.jar = function () { - return new CookieJar -} -request.cookie = function (str) { - if (str && str.uri) str = str.uri - if (typeof str !== 'string') throw new Error("The cookie function only accepts STRING as param") - return new Cookie(str) -} - -// Safe toJSON - -function getSafe (self, uuid) { - if (typeof self === 'object' || typeof self === 'function') var safe = {} - if (Array.isArray(self)) var safe = [] - - var recurse = [] - - Object.defineProperty(self, uuid, {}) - - var attrs = Object.keys(self).filter(function (i) { - if (i === uuid) return false - if ( (typeof self[i] !== 'object' && typeof self[i] !== 'function') || self[i] === null) return true - return !(Object.getOwnPropertyDescriptor(self[i], uuid)) - }) - - - for (var i=0;i $(BUILDDIR)/async.min.js - -test: - nodeunit test - -clean: - rm -rf $(BUILDDIR) - -lint: - nodelint --config nodelint.cfg lib/async.js - -.PHONY: test build all diff --git a/node_modules/request/node_modules/form-data/node_modules/async/README.md b/node_modules/request/node_modules/form-data/node_modules/async/README.md deleted file mode 100644 index 039d942..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/async/README.md +++ /dev/null @@ -1,970 +0,0 @@ -# Async.js - -Async is a utility module which provides straight-forward, powerful functions -for working with asynchronous JavaScript. Although originally designed for -use with [node.js](http://nodejs.org), it can also be used directly in the -browser. - -Async provides around 20 functions that include the usual 'functional' -suspects (map, reduce, filter, forEach…) as well as some common patterns -for asynchronous flow control (parallel, series, waterfall…). All these -functions assume you follow the node.js convention of providing a single -callback as the last argument of your async function. - - -## Quick Examples - - async.map(['file1','file2','file3'], fs.stat, function(err, results){ - // results is now an array of stats for each file - }); - - async.filter(['file1','file2','file3'], path.exists, function(results){ - // results now equals an array of the existing files - }); - - async.parallel([ - function(){ ... }, - function(){ ... } - ], callback); - - async.series([ - function(){ ... }, - function(){ ... } - ]); - -There are many more functions available so take a look at the docs below for a -full list. This module aims to be comprehensive, so if you feel anything is -missing please create a GitHub issue for it. - - -## Download - -Releases are available for download from -[GitHub](http://github.com/caolan/async/downloads). -Alternatively, you can install using Node Package Manager (npm): - - npm install async - - -__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 17.5kb Uncompressed - -__Production:__ [async.min.js](https://github.com/caolan/async/raw/master/dist/async.min.js) - 1.7kb Packed and Gzipped - - -## In the Browser - -So far its been tested in IE6, IE7, IE8, FF3.6 and Chrome 5. Usage: - - - - - -## Documentation - -### Collections - -* [forEach](#forEach) -* [map](#map) -* [filter](#filter) -* [reject](#reject) -* [reduce](#reduce) -* [detect](#detect) -* [sortBy](#sortBy) -* [some](#some) -* [every](#every) -* [concat](#concat) - -### Flow Control - -* [series](#series) -* [parallel](#parallel) -* [whilst](#whilst) -* [until](#until) -* [waterfall](#waterfall) -* [queue](#queue) -* [auto](#auto) -* [iterator](#iterator) -* [apply](#apply) -* [nextTick](#nextTick) - -### Utils - -* [memoize](#memoize) -* [log](#log) -* [dir](#dir) -* [noConflict](#noConflict) - - -## Collections - - -### forEach(arr, iterator, callback) - -Applies an iterator function to each item in an array, in parallel. -The iterator is called with an item from the list and a callback for when it -has finished. If the iterator passes an error to this callback, the main -callback for the forEach function is immediately called with the error. - -Note, that since this function applies the iterator to each item in parallel -there is no guarantee that the iterator functions will complete in order. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed. -* callback(err) - A callback which is called after all the iterator functions - have finished, or an error has occurred. - -__Example__ - - // assuming openFiles is an array of file names and saveFile is a function - // to save the modified contents of that file: - - async.forEach(openFiles, saveFile, function(err){ - // if any of the saves produced an error, err would equal that error - }); - ---------------------------------------- - - -### forEachSeries(arr, iterator, callback) - -The same as forEach only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. This means the iterator functions will complete in order. - - ---------------------------------------- - - -### map(arr, iterator, callback) - -Produces a new array of values by mapping each value in the given array through -the iterator function. The iterator is called with an item from the array and a -callback for when it has finished processing. The callback takes 2 arguments, -an error and the transformed item from the array. If the iterator passes an -error to this callback, the main callback for the map function is immediately -called with the error. - -Note, that since this function applies the iterator to each item in parallel -there is no guarantee that the iterator functions will complete in order, however -the results array will be in the same order as the original array. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed - with an error (which can be null) and a transformed item. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is an array of the - transformed items from the original array. - -__Example__ - - async.map(['file1','file2','file3'], fs.stat, function(err, results){ - // results is now an array of stats for each file - }); - ---------------------------------------- - - -### mapSeries(arr, iterator, callback) - -The same as map only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. The results array will be in the same order as the original. - - ---------------------------------------- - - -### filter(arr, iterator, callback) - -__Alias:__ select - -Returns a new array of all the values which pass an async truth test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like path.exists. This operation is -performed in parallel, but the results array will be in the same order as the -original. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed. -* callback(results) - A callback which is called after all the iterator - functions have finished. - -__Example__ - - async.filter(['file1','file2','file3'], path.exists, function(results){ - // results now equals an array of the existing files - }); - ---------------------------------------- - - -### filterSeries(arr, iterator, callback) - -__alias:__ selectSeries - -The same as filter only the iterator is applied to each item in the array in -series. The next iterator is only called once the current one has completed -processing. The results array will be in the same order as the original. - ---------------------------------------- - - -### reject(arr, iterator, callback) - -The opposite of filter. Removes values that pass an async truth test. - ---------------------------------------- - - -### rejectSeries(arr, iterator, callback) - -The same as filter, only the iterator is applied to each item in the array -in series. - - ---------------------------------------- - - -### reduce(arr, memo, iterator, callback) - -__aliases:__ inject, foldl - -Reduces a list of values into a single value using an async iterator to return -each successive step. Memo is the initial state of the reduction. This -function only operates in series. For performance reasons, it may make sense to -split a call to this function into a parallel map, then use the normal -Array.prototype.reduce on the results. This function is for situations where -each step in the reduction needs to be async, if you can get the data before -reducing it then its probably a good idea to do so. - -__Arguments__ - -* arr - An array to iterate over. -* memo - The initial state of the reduction. -* iterator(memo, item, callback) - A function applied to each item in the - array to produce the next step in the reduction. The iterator is passed a - callback which accepts an optional error as its first argument, and the state - of the reduction as the second. If an error is passed to the callback, the - reduction is stopped and the main callback is immediately called with the - error. -* callback(err, result) - A callback which is called after all the iterator - functions have finished. Result is the reduced value. - -__Example__ - - async.reduce([1,2,3], 0, function(memo, item, callback){ - // pointless async: - process.nextTick(function(){ - callback(null, memo + item) - }); - }, function(err, result){ - // result is now equal to the last value of memo, which is 6 - }); - ---------------------------------------- - - -### reduceRight(arr, memo, iterator, callback) - -__Alias:__ foldr - -Same as reduce, only operates on the items in the array in reverse order. - - ---------------------------------------- - - -### detect(arr, iterator, callback) - -Returns the first value in a list that passes an async truth test. The -iterator is applied in parallel, meaning the first iterator to return true will -fire the detect callback with that result. That means the result might not be -the first item in the original array (in terms of order) that passes the test. - -If order within the original array is important then look at detectSeries. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed. -* callback(result) - A callback which is called as soon as any iterator returns - true, or after all the iterator functions have finished. Result will be - the first item in the array that passes the truth test (iterator) or the - value undefined if none passed. - -__Example__ - - async.detect(['file1','file2','file3'], path.exists, function(result){ - // result now equals the first file in the list that exists - }); - ---------------------------------------- - - -### detectSeries(arr, iterator, callback) - -The same as detect, only the iterator is applied to each item in the array -in series. This means the result is always the first in the original array (in -terms of array order) that passes the truth test. - - ---------------------------------------- - - -### sortBy(arr, iterator, callback) - -Sorts a list by the results of running each value through an async iterator. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed - with an error (which can be null) and a value to use as the sort criteria. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is the items from - the original array sorted by the values returned by the iterator calls. - -__Example__ - - async.sortBy(['file1','file2','file3'], function(file, callback){ - fs.stat(file, function(err, stats){ - callback(err, stats.mtime); - }); - }, function(err, results){ - // results is now the original array of files sorted by - // modified date - }); - - ---------------------------------------- - - -### some(arr, iterator, callback) - -__Alias:__ any - -Returns true if at least one element in the array satisfies an async test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like path.exists. Once any iterator -call returns true, the main callback is immediately called. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed. -* callback(result) - A callback which is called as soon as any iterator returns - true, or after all the iterator functions have finished. Result will be - either true or false depending on the values of the async tests. - -__Example__ - - async.some(['file1','file2','file3'], path.exists, function(result){ - // if result is true then at least one of the files exists - }); - ---------------------------------------- - - -### every(arr, iterator, callback) - -__Alias:__ all - -Returns true if every element in the array satisfies an async test. -_The callback for each iterator call only accepts a single argument of true or -false, it does not accept an error argument first!_ This is in-line with the -way node libraries work with truth tests like path.exists. - -__Arguments__ - -* arr - An array to iterate over. -* iterator(item, callback) - A truth test to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed. -* callback(result) - A callback which is called after all the iterator - functions have finished. Result will be either true or false depending on - the values of the async tests. - -__Example__ - - async.every(['file1','file2','file3'], path.exists, function(result){ - // if result is true then every file exists - }); - ---------------------------------------- - - -### concat(arr, iterator, callback) - -Applies an iterator to each item in a list, concatenating the results. Returns the -concatenated list. The iterators are called in parallel, and the results are -concatenated as they return. There is no guarantee that the results array will -be returned in the original order of the arguments passed to the iterator function. - -__Arguments__ - -* arr - An array to iterate over -* iterator(item, callback) - A function to apply to each item in the array. - The iterator is passed a callback which must be called once it has completed - with an error (which can be null) and an array of results. -* callback(err, results) - A callback which is called after all the iterator - functions have finished, or an error has occurred. Results is an array containing - the concatenated results of the iterator function. - -__Example__ - - async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){ - // files is now a list of filenames that exist in the 3 directories - }); - ---------------------------------------- - - -### concatSeries(arr, iterator, callback) - -Same as async.concat, but executes in series instead of parallel. - - -## Flow Control - - -### series(tasks, [callback]) - -Run an array of functions in series, each one running once the previous -function has completed. If any functions in the series pass an error to its -callback, no more functions are run and the callback for the series is -immediately called with the value of the error. Once the tasks have completed, -the results are passed to the final callback as an array. - -It is also possible to use an object instead of an array. Each property will be -run as a function and the results will be passed to the final callback as an object -instead of an array. This can be a more readable way of handling results from -async.series. - - -__Arguments__ - -* tasks - An array or object containing functions to run, each function is passed - a callback it must call on completion. -* callback(err, results) - An optional callback to run once all the functions - have completed. This function gets an array of all the arguments passed to - the callbacks used in the array. - -__Example__ - - async.series([ - function(callback){ - // do some stuff ... - callback(null, 'one'); - }, - function(callback){ - // do some more stuff ... - callback(null, 'two'); - }, - ], - // optional callback - function(err, results){ - // results is now equal to ['one', 'two'] - }); - - - // an example using an object instead of an array - async.series({ - one: function(callback){ - setTimeout(function(){ - callback(null, 1); - }, 200); - }, - two: function(callback){ - setTimeout(function(){ - callback(null, 2); - }, 100); - }, - }, - function(err, results) { - // results is now equals to: {one: 1, two: 2} - }); - - ---------------------------------------- - - -### parallel(tasks, [callback]) - -Run an array of functions in parallel, without waiting until the previous -function has completed. If any of the functions pass an error to its -callback, the main callback is immediately called with the value of the error. -Once the tasks have completed, the results are passed to the final callback as an -array. - -It is also possible to use an object instead of an array. Each property will be -run as a function and the results will be passed to the final callback as an object -instead of an array. This can be a more readable way of handling results from -async.parallel. - - -__Arguments__ - -* tasks - An array or object containing functions to run, each function is passed a - callback it must call on completion. -* callback(err, results) - An optional callback to run once all the functions - have completed. This function gets an array of all the arguments passed to - the callbacks used in the array. - -__Example__ - - async.parallel([ - function(callback){ - setTimeout(function(){ - callback(null, 'one'); - }, 200); - }, - function(callback){ - setTimeout(function(){ - callback(null, 'two'); - }, 100); - }, - ], - // optional callback - function(err, results){ - // in this case, the results array will equal ['two','one'] - // because the functions were run in parallel and the second - // function had a shorter timeout before calling the callback. - }); - - - // an example using an object instead of an array - async.parallel({ - one: function(callback){ - setTimeout(function(){ - callback(null, 1); - }, 200); - }, - two: function(callback){ - setTimeout(function(){ - callback(null, 2); - }, 100); - }, - }, - function(err, results) { - // results is now equals to: {one: 1, two: 2} - }); - - ---------------------------------------- - - -### whilst(test, fn, callback) - -Repeatedly call fn, while test returns true. Calls the callback when stopped, -or an error occurs. - -__Arguments__ - -* test() - synchronous truth test to perform before each execution of fn. -* fn(callback) - A function to call each time the test passes. The function is - passed a callback which must be called once it has completed with an optional - error as the first argument. -* callback(err) - A callback which is called after the test fails and repeated - execution of fn has stopped. - -__Example__ - - var count = 0; - - async.whilst( - function () { return count < 5; }, - function (callback) { - count++; - setTimeout(callback, 1000); - }, - function (err) { - // 5 seconds have passed - } - }); - - ---------------------------------------- - - -### until(test, fn, callback) - -Repeatedly call fn, until test returns true. Calls the callback when stopped, -or an error occurs. - -The inverse of async.whilst. - - ---------------------------------------- - - -### waterfall(tasks, [callback]) - -Runs an array of functions in series, each passing their results to the next in -the array. However, if any of the functions pass an error to the callback, the -next function is not executed and the main callback is immediately called with -the error. - -__Arguments__ - -* tasks - An array of functions to run, each function is passed a callback it - must call on completion. -* callback(err) - An optional callback to run once all the functions have - completed. This function gets passed any error that may have occurred. - -__Example__ - - async.waterfall([ - function(callback){ - callback(null, 'one', 'two'); - }, - function(arg1, arg2, callback){ - callback(null, 'three'); - }, - function(arg1, callback){ - // arg1 now equals 'three' - callback(null, 'done'); - } - ]); - - ---------------------------------------- - - -### queue(worker, concurrency) - -Creates a queue object with the specified concurrency. Tasks added to the -queue will be processed in parallel (up to the concurrency limit). If all -workers are in progress, the task is queued until one is available. Once -a worker has completed a task, the task's callback is called. - -__Arguments__ - -* worker(task, callback) - An asynchronous function for processing a queued - task. -* concurrency - An integer for determining how many worker functions should be - run in parallel. - -__Queue objects__ - -The queue object returned by this function has the following properties and -methods: - -* length() - a function returning the number of items waiting to be processed. -* concurrency - an integer for determining how many worker functions should be - run in parallel. This property can be changed after a queue is created to - alter the concurrency on-the-fly. -* push(task, [callback]) - add a new task to the queue, the callback is called - once the worker has finished processing the task. -* saturated - a callback that is called when the queue length hits the concurrency and further tasks will be queued -* empty - a callback that is called when the last item from the queue is given to a worker -* drain - a callback that is called when the last item from the queue has returned from the worker - -__Example__ - - // create a queue object with concurrency 2 - - var q = async.queue(function (task, callback) { - console.log('hello ' + task.name). - callback(); - }, 2); - - - // assign a callback - q.drain = function() { - console.log('all items have been processed'); - } - - // add some items to the queue - - q.push({name: 'foo'}, function (err) { - console.log('finished processing foo'); - }); - q.push({name: 'bar'}, function (err) { - console.log('finished processing bar'); - }); - - ---------------------------------------- - - -### auto(tasks, [callback]) - -Determines the best order for running functions based on their requirements. -Each function can optionally depend on other functions being completed first, -and each function is run as soon as its requirements are satisfied. If any of -the functions pass and error to their callback, that function will not complete -(so any other functions depending on it will not run) and the main callback -will be called immediately with the error. - -__Arguments__ - -* tasks - An object literal containing named functions or an array of - requirements, with the function itself the last item in the array. The key - used for each function or array is used when specifying requirements. The - syntax is easier to understand by looking at the example. -* callback(err) - An optional callback which is called when all the tasks have - been completed. The callback may receive an error as an argument. - -__Example__ - - async.auto({ - get_data: function(callback){ - // async code to get some data - }, - make_folder: function(callback){ - // async code to create a directory to store a file in - // this is run at the same time as getting the data - }, - write_file: ['get_data', 'make_folder', function(callback){ - // once there is some data and the directory exists, - // write the data to a file in the directory - }], - email_link: ['write_file', function(callback){ - // once the file is written let's email a link to it... - }] - }); - -This is a fairly trivial example, but to do this using the basic parallel and -series functions would look like this: - - async.parallel([ - function(callback){ - // async code to get some data - }, - function(callback){ - // async code to create a directory to store a file in - // this is run at the same time as getting the data - } - ], - function(results){ - async.series([ - function(callback){ - // once there is some data and the directory exists, - // write the data to a file in the directory - }, - email_link: ['write_file', function(callback){ - // once the file is written let's email a link to it... - } - ]); - }); - -For a complicated series of async tasks using the auto function makes adding -new tasks much easier and makes the code more readable. - - ---------------------------------------- - - -### iterator(tasks) - -Creates an iterator function which calls the next function in the array, -returning a continuation to call the next one after that. Its also possible to -'peek' the next iterator by doing iterator.next(). - -This function is used internally by the async module but can be useful when -you want to manually control the flow of functions in series. - -__Arguments__ - -* tasks - An array of functions to run, each function is passed a callback it - must call on completion. - -__Example__ - - var iterator = async.iterator([ - function(){ sys.p('one'); }, - function(){ sys.p('two'); }, - function(){ sys.p('three'); } - ]); - - node> var iterator2 = iterator(); - 'one' - node> var iterator3 = iterator2(); - 'two' - node> iterator3(); - 'three' - node> var nextfn = iterator2.next(); - node> nextfn(); - 'three' - - ---------------------------------------- - - -### apply(function, arguments..) - -Creates a continuation function with some arguments already applied, a useful -shorthand when combined with other flow control functions. Any arguments -passed to the returned function are added to the arguments originally passed -to apply. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to automatically apply when the - continuation is called. - -__Example__ - - // using apply - - async.parallel([ - async.apply(fs.writeFile, 'testfile1', 'test1'), - async.apply(fs.writeFile, 'testfile2', 'test2'), - ]); - - - // the same process without using apply - - async.parallel([ - function(callback){ - fs.writeFile('testfile1', 'test1', callback); - }, - function(callback){ - fs.writeFile('testfile2', 'test2', callback); - }, - ]); - -It's possible to pass any number of additional arguments when calling the -continuation: - - node> var fn = async.apply(sys.puts, 'one'); - node> fn('two', 'three'); - one - two - three - ---------------------------------------- - - -### nextTick(callback) - -Calls the callback on a later loop around the event loop. In node.js this just -calls process.nextTick, in the browser it falls back to setTimeout(callback, 0), -which means other higher priority events may precede the execution of the callback. - -This is used internally for browser-compatibility purposes. - -__Arguments__ - -* callback - The function to call on a later loop around the event loop. - -__Example__ - - var call_order = []; - async.nextTick(function(){ - call_order.push('two'); - // call_order now equals ['one','two] - }); - call_order.push('one') - - -## Utils - - -### memoize(fn, [hasher]) - -Caches the results of an async function. When creating a hash to store function -results against, the callback is omitted from the hash and an optional hash -function can be used. - -__Arguments__ - -* fn - the function you to proxy and cache results from. -* hasher - an optional function for generating a custom hash for storing - results, it has all the arguments applied to it apart from the callback, and - must be synchronous. - -__Example__ - - var slow_fn = function (name, callback) { - // do something - callback(null, result); - }; - var fn = async.memoize(slow_fn); - - // fn can now be used as if it were slow_fn - fn('some name', function () { - // callback - }); - - - -### log(function, arguments) - -Logs the result of an async function to the console. Only works in node.js or -in browsers that support console.log and console.error (such as FF and Chrome). -If multiple arguments are returned from the async function, console.log is -called on each argument in order. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to apply to the function. - -__Example__ - - var hello = function(name, callback){ - setTimeout(function(){ - callback(null, 'hello ' + name); - }, 1000); - }; - - node> async.log(hello, 'world'); - 'hello world' - - ---------------------------------------- - - -### dir(function, arguments) - -Logs the result of an async function to the console using console.dir to -display the properties of the resulting object. Only works in node.js or -in browsers that support console.dir and console.error (such as FF and Chrome). -If multiple arguments are returned from the async function, console.dir is -called on each argument in order. - -__Arguments__ - -* function - The function you want to eventually apply all arguments to. -* arguments... - Any number of arguments to apply to the function. - -__Example__ - - var hello = function(name, callback){ - setTimeout(function(){ - callback(null, {hello: name}); - }, 1000); - }; - - node> async.dir(hello, 'world'); - {hello: 'world'} - - ---------------------------------------- - - -### noConflict() - -Changes the value of async back to its original value, returning a reference to the -async object. diff --git a/node_modules/request/node_modules/form-data/node_modules/async/async.min.js.gzip b/node_modules/request/node_modules/form-data/node_modules/async/async.min.js.gzip deleted file mode 100644 index e1c32944465c634d9b609622b37972d1ae8e6e7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1859 zcmV-J2fX+niwFpUH4aSx17UM{ZeuQOX>KlRa{$d)OOx9+4E`&dJ!r^8tJqh0RZrV# zZ=H17-aJ0=C0o0)cwe{Z%@F7vMl6BIVG?Up_q$mIcJ^&y2_Vq3=Im_>A)%=wm zRM|H1UCQ!Wg?FMX>M~b$eE0e-N!vm+Sy>Qze$T2qmYlm4KJcX3XLTqN91Adg8<}0$l>2$&!4KwRQ*L(Nw8`Hdo+t}rs${2EMTi7(9>F{v~n`LU|lDFTN#B?dOCp(dzEuskQM+O-E&H1&YCh#iml zi4<*~hnwCB+XzaUU=84sc1HQrH&bpRFk`~=Br2gaYEw)$o?wcPlg8*d>nw?R_@3ph zidomukX@}6kY9SiFs~J)8=Gd^M21i(G+KPvYdq>e>9Uq&(6B4SC&a#o&2hWH4BYlSH>uKEi9n30?Sh3G;4_GGWRFU!ynmh-%Jfljc<1oxAviD z9fi-|tEvWkuKFswvmbX>U6qWq=s4!zI*u?K1gWXCjDq84f~ZIu)zDYToN8BUAGrAi z&2ug>iaTo2kY;(KDgZ=|@i(I$6MC*zxe1YZ+0WQjdNQmxpO8dx`vc8$c5a0wPIM zwTgyv+zsYEtcj(~YgU{RV*v~>15f|OlFNlS@wb_xt+tlrSWUDE+9y@>)0{1u?0q&W zx}>eKxHYTMX-r6? zwy5`6+7QRR$DGWuLJky#KW2^?6i&BCUlFOG+;n>*Rwk&T*a5&i(op1bd=j0*-G$r$dt<7}^7< zmYYGtmh9+CL8_f6<%^zSDb$2#tS-|pw0jF6K^kEn7{E5g%<~h?5L7-xP~q%113&p$ zHm9^WMFsp#*y><@dK1}0G?}n*P5!~6-P*PjiJOblK2pPZ!AH}GC2FG8VRk}S0Y|U~ z0M02T+BZj5fpRr<&9w_)cO3a;4Y3j+0+6aVL+6VXM3@mDcDIvV+`mhL$7BgH25UBp zEkM?+)Z2nGce&X7=u zTF5y4G*cIc%Z7&~w(vJg8l$wXm(f3QvM^l|RnC}wtKY6qpM5*_cEjBX@}@&+f66RB z!LW5Jet}+UP(U2}vnzHKI(t&XW23Ts)2s%*Sz-}1qn>Z-xexm+ucv1;ykwwjL9Xg{ zPlyzr%*?m;6X=c76w9_~vV2w|EQnu}sz2|AqQJjf)v8G;7+;Ur?wTfN++$l+st~7G zgxCP$@rSm5pCxM;99uA0oQdaHbmKk|*_$P>z&^zuEWmF0m`0wqAaF_NZf2EZJ_~>r zB;ZQl#z4p-)E#=#D%V_ph{y=}x~tWg_Zqt;o}^@)-iC>}>SGDSWA z(uz3hq{3lz^YsGl#i70ap59&)zP4{7RaIpb1fwCSi|qsyydW6SLQJgwoi2p5+v*gB zVpHytBe{p4dwo31DjdR(9v;-8%>J3)K%0F*Q6IB$|2ku)su=X%cBf?!E~8_4wAX@Z xGIF@2s}wJS#afNxut~Qx9u+Qm9U5>4tV;&(tNFTZoYVmy`WKn%6PvIY007E|gZuyh diff --git a/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.css b/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.css deleted file mode 100644 index 274434a..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.css +++ /dev/null @@ -1,70 +0,0 @@ -/*! - * Styles taken from qunit.css - */ - -h1#nodeunit-header, h1.nodeunit-header { - padding: 15px; - font-size: large; - background-color: #06b; - color: white; - font-family: 'trebuchet ms', verdana, arial; - margin: 0; -} - -h1#nodeunit-header a { - color: white; -} - -h2#nodeunit-banner { - height: 2em; - border-bottom: 1px solid white; - background-color: #eee; - margin: 0; - font-family: 'trebuchet ms', verdana, arial; -} -h2#nodeunit-banner.pass { - background-color: green; -} -h2#nodeunit-banner.fail { - background-color: red; -} - -h2#nodeunit-userAgent, h2.nodeunit-userAgent { - padding: 10px; - background-color: #eee; - color: black; - margin: 0; - font-size: small; - font-weight: normal; - font-family: 'trebuchet ms', verdana, arial; - font-size: 10pt; -} - -div#nodeunit-testrunner-toolbar { - background: #eee; - border-top: 1px solid black; - padding: 10px; - font-family: 'trebuchet ms', verdana, arial; - margin: 0; - font-size: 10pt; -} - -ol#nodeunit-tests { - font-family: 'trebuchet ms', verdana, arial; - font-size: 10pt; -} -ol#nodeunit-tests li strong { - cursor:pointer; -} -ol#nodeunit-tests .pass { - color: green; -} -ol#nodeunit-tests .fail { - color: red; -} - -p#nodeunit-testresult { - margin-left: 1em; - font-size: 10pt; - font-family: 'trebuchet ms', verdana, arial; -} diff --git a/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.js b/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.js deleted file mode 100644 index 5957184..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/async/deps/nodeunit.js +++ /dev/null @@ -1,1966 +0,0 @@ -/*! - * Nodeunit - * https://github.com/caolan/nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - * - * json2.js - * http://www.JSON.org/json2.js - * Public Domain. - * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - */ -nodeunit = (function(){ -/* - http://www.JSON.org/json2.js - 2010-11-17 - - Public Domain. - - NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - - See http://www.JSON.org/js.html - - - This code should be minified before deployment. - See http://javascript.crockford.com/jsmin.html - - USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO - NOT CONTROL. - - - This file creates a global JSON object containing two methods: stringify - and parse. - - JSON.stringify(value, replacer, space) - value any JavaScript value, usually an object or array. - - replacer an optional parameter that determines how object - values are stringified for objects. It can be a - function or an array of strings. - - space an optional parameter that specifies the indentation - of nested structures. If it is omitted, the text will - be packed without extra whitespace. If it is a number, - it will specify the number of spaces to indent at each - level. If it is a string (such as '\t' or ' '), - it contains the characters used to indent at each level. - - This method produces a JSON text from a JavaScript value. - - When an object value is found, if the object contains a toJSON - method, its toJSON method will be called and the result will be - stringified. A toJSON method does not serialize: it returns the - value represented by the name/value pair that should be serialized, - or undefined if nothing should be serialized. The toJSON method - will be passed the key associated with the value, and this will be - bound to the value - - For example, this would serialize Dates as ISO strings. - - Date.prototype.toJSON = function (key) { - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - return this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z'; - }; - - You can provide an optional replacer method. It will be passed the - key and value of each member, with this bound to the containing - object. The value that is returned from your method will be - serialized. If your method returns undefined, then the member will - be excluded from the serialization. - - If the replacer parameter is an array of strings, then it will be - used to select the members to be serialized. It filters the results - such that only members with keys listed in the replacer array are - stringified. - - Values that do not have JSON representations, such as undefined or - functions, will not be serialized. Such values in objects will be - dropped; in arrays they will be replaced with null. You can use - a replacer function to replace those with JSON values. - JSON.stringify(undefined) returns undefined. - - The optional space parameter produces a stringification of the - value that is filled with line breaks and indentation to make it - easier to read. - - If the space parameter is a non-empty string, then that string will - be used for indentation. If the space parameter is a number, then - the indentation will be that many spaces. - - Example: - - text = JSON.stringify(['e', {pluribus: 'unum'}]); - // text is '["e",{"pluribus":"unum"}]' - - - text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); - // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' - - text = JSON.stringify([new Date()], function (key, value) { - return this[key] instanceof Date ? - 'Date(' + this[key] + ')' : value; - }); - // text is '["Date(---current time---)"]' - - - JSON.parse(text, reviver) - This method parses a JSON text to produce an object or array. - It can throw a SyntaxError exception. - - The optional reviver parameter is a function that can filter and - transform the results. It receives each of the keys and values, - and its return value is used instead of the original value. - If it returns what it received, then the structure is not modified. - If it returns undefined then the member is deleted. - - Example: - - // Parse the text. Values that look like ISO date strings will - // be converted to Date objects. - - myData = JSON.parse(text, function (key, value) { - var a; - if (typeof value === 'string') { - a = -/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); - if (a) { - return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], - +a[5], +a[6])); - } - } - return value; - }); - - myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { - var d; - if (typeof value === 'string' && - value.slice(0, 5) === 'Date(' && - value.slice(-1) === ')') { - d = new Date(value.slice(5, -1)); - if (d) { - return d; - } - } - return value; - }); - - - This is a reference implementation. You are free to copy, modify, or - redistribute. -*/ - -/*jslint evil: true, strict: false, regexp: false */ - -/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, - call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, - getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, - lastIndex, length, parse, prototype, push, replace, slice, stringify, - test, toJSON, toString, valueOf -*/ - - -// Create a JSON object only if one does not already exist. We create the -// methods in a closure to avoid creating global variables. - -if (!this.JSON) { - this.JSON = {}; -} - -(function () { - "use strict"; - - function f(n) { - // Format integers to have at least two digits. - return n < 10 ? '0' + n : n; - } - - if (typeof Date.prototype.toJSON !== 'function') { - - Date.prototype.toJSON = function (key) { - - return isFinite(this.valueOf()) ? - this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z' : null; - }; - - String.prototype.toJSON = - Number.prototype.toJSON = - Boolean.prototype.toJSON = function (key) { - return this.valueOf(); - }; - } - - var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - gap, - indent, - meta = { // table of character substitutions - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '"' : '\\"', - '\\': '\\\\' - }, - rep; - - - function quote(string) { - -// If the string contains no control characters, no quote characters, and no -// backslash characters, then we can safely slap some quotes around it. -// Otherwise we must also replace the offending characters with safe escape -// sequences. - - escapable.lastIndex = 0; - return escapable.test(string) ? - '"' + string.replace(escapable, function (a) { - var c = meta[a]; - return typeof c === 'string' ? c : - '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }) + '"' : - '"' + string + '"'; - } - - - function str(key, holder) { - -// Produce a string from holder[key]. - - var i, // The loop counter. - k, // The member key. - v, // The member value. - length, - mind = gap, - partial, - value = holder[key]; - -// If the value has a toJSON method, call it to obtain a replacement value. - - if (value && typeof value === 'object' && - typeof value.toJSON === 'function') { - value = value.toJSON(key); - } - -// If we were called with a replacer function, then call the replacer to -// obtain a replacement value. - - if (typeof rep === 'function') { - value = rep.call(holder, key, value); - } - -// What happens next depends on the value's type. - - switch (typeof value) { - case 'string': - return quote(value); - - case 'number': - -// JSON numbers must be finite. Encode non-finite numbers as null. - - return isFinite(value) ? String(value) : 'null'; - - case 'boolean': - case 'null': - -// If the value is a boolean or null, convert it to a string. Note: -// typeof null does not produce 'null'. The case is included here in -// the remote chance that this gets fixed someday. - - return String(value); - -// If the type is 'object', we might be dealing with an object or an array or -// null. - - case 'object': - -// Due to a specification blunder in ECMAScript, typeof null is 'object', -// so watch out for that case. - - if (!value) { - return 'null'; - } - -// Make an array to hold the partial results of stringifying this object value. - - gap += indent; - partial = []; - -// Is the value an array? - - if (Object.prototype.toString.apply(value) === '[object Array]') { - -// The value is an array. Stringify every element. Use null as a placeholder -// for non-JSON values. - - length = value.length; - for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || 'null'; - } - -// Join all of the elements together, separated with commas, and wrap them in -// brackets. - - v = partial.length === 0 ? '[]' : - gap ? '[\n' + gap + - partial.join(',\n' + gap) + '\n' + - mind + ']' : - '[' + partial.join(',') + ']'; - gap = mind; - return v; - } - -// If the replacer is an array, use it to select the members to be stringified. - - if (rep && typeof rep === 'object') { - length = rep.length; - for (i = 0; i < length; i += 1) { - k = rep[i]; - if (typeof k === 'string') { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } else { - -// Otherwise, iterate through all of the keys in the object. - - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = str(k, value); - if (v) { - partial.push(quote(k) + (gap ? ': ' : ':') + v); - } - } - } - } - -// Join all of the member texts together, separated with commas, -// and wrap them in braces. - - v = partial.length === 0 ? '{}' : - gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + - mind + '}' : '{' + partial.join(',') + '}'; - gap = mind; - return v; - } - } - -// If the JSON object does not yet have a stringify method, give it one. - - if (typeof JSON.stringify !== 'function') { - JSON.stringify = function (value, replacer, space) { - -// The stringify method takes a value and an optional replacer, and an optional -// space parameter, and returns a JSON text. The replacer can be a function -// that can replace values, or an array of strings that will select the keys. -// A default replacer method can be provided. Use of the space parameter can -// produce text that is more easily readable. - - var i; - gap = ''; - indent = ''; - -// If the space parameter is a number, make an indent string containing that -// many spaces. - - if (typeof space === 'number') { - for (i = 0; i < space; i += 1) { - indent += ' '; - } - -// If the space parameter is a string, it will be used as the indent string. - - } else if (typeof space === 'string') { - indent = space; - } - -// If there is a replacer, it must be a function or an array. -// Otherwise, throw an error. - - rep = replacer; - if (replacer && typeof replacer !== 'function' && - (typeof replacer !== 'object' || - typeof replacer.length !== 'number')) { - throw new Error('JSON.stringify'); - } - -// Make a fake root object containing our value under the key of ''. -// Return the result of stringifying the value. - - return str('', {'': value}); - }; - } - - -// If the JSON object does not yet have a parse method, give it one. - - if (typeof JSON.parse !== 'function') { - JSON.parse = function (text, reviver) { - -// The parse method takes a text and an optional reviver function, and returns -// a JavaScript value if the text is a valid JSON text. - - var j; - - function walk(holder, key) { - -// The walk method is used to recursively walk the resulting structure so -// that modifications can be made. - - var k, v, value = holder[key]; - if (value && typeof value === 'object') { - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== undefined) { - value[k] = v; - } else { - delete value[k]; - } - } - } - } - return reviver.call(holder, key, value); - } - - -// Parsing happens in four stages. In the first stage, we replace certain -// Unicode characters with escape sequences. JavaScript handles many characters -// incorrectly, either silently deleting them, or treating them as line endings. - - text = String(text); - cx.lastIndex = 0; - if (cx.test(text)) { - text = text.replace(cx, function (a) { - return '\\u' + - ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }); - } - -// In the second stage, we run the text against regular expressions that look -// for non-JSON patterns. We are especially concerned with '()' and 'new' -// because they can cause invocation, and '=' because it can cause mutation. -// But just to be safe, we want to reject all unexpected forms. - -// We split the second stage into 4 regexp operations in order to work around -// crippling inefficiencies in IE's and Safari's regexp engines. First we -// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we -// replace all simple value tokens with ']' characters. Third, we delete all -// open brackets that follow a colon or comma or that begin the text. Finally, -// we look to see that the remaining characters are only whitespace or ']' or -// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. - - if (/^[\],:{}\s]*$/ -.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') -.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') -.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { - -// In the third stage we use the eval function to compile the text into a -// JavaScript structure. The '{' operator is subject to a syntactic ambiguity -// in JavaScript: it can begin a block or an object literal. We wrap the text -// in parens to eliminate the ambiguity. - - j = eval('(' + text + ')'); - -// In the optional fourth stage, we recursively walk the new structure, passing -// each name/value pair to a reviver function for possible transformation. - - return typeof reviver === 'function' ? - walk({'': j}, '') : j; - } - -// If the text is not JSON parseable, then a SyntaxError is thrown. - - throw new SyntaxError('JSON.parse'); - }; - } -}()); -var assert = this.assert = {}; -var types = {}; -var core = {}; -var nodeunit = {}; -var reporter = {}; -/*global setTimeout: false, console: false */ -(function () { - - var async = {}; - - // global on the server, window in the browser - var root = this, - previous_async = root.async; - - if (typeof module !== 'undefined' && module.exports) { - module.exports = async; - } - else { - root.async = async; - } - - async.noConflict = function () { - root.async = previous_async; - return async; - }; - - //// cross-browser compatiblity functions //// - - var _forEach = function (arr, iterator) { - if (arr.forEach) { - return arr.forEach(iterator); - } - for (var i = 0; i < arr.length; i += 1) { - iterator(arr[i], i, arr); - } - }; - - var _map = function (arr, iterator) { - if (arr.map) { - return arr.map(iterator); - } - var results = []; - _forEach(arr, function (x, i, a) { - results.push(iterator(x, i, a)); - }); - return results; - }; - - var _reduce = function (arr, iterator, memo) { - if (arr.reduce) { - return arr.reduce(iterator, memo); - } - _forEach(arr, function (x, i, a) { - memo = iterator(memo, x, i, a); - }); - return memo; - }; - - var _keys = function (obj) { - if (Object.keys) { - return Object.keys(obj); - } - var keys = []; - for (var k in obj) { - if (obj.hasOwnProperty(k)) { - keys.push(k); - } - } - return keys; - }; - - var _indexOf = function (arr, item) { - if (arr.indexOf) { - return arr.indexOf(item); - } - for (var i = 0; i < arr.length; i += 1) { - if (arr[i] === item) { - return i; - } - } - return -1; - }; - - //// exported async module functions //// - - //// nextTick implementation with browser-compatible fallback //// - async.nextTick = function (fn) { - if (typeof process === 'undefined' || !(process.nextTick)) { - setTimeout(fn, 0); - } - else { - process.nextTick(fn); - } - }; - - async.forEach = function (arr, iterator, callback) { - if (!arr.length) { - return callback(); - } - var completed = 0; - _forEach(arr, function (x) { - iterator(x, function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed === arr.length) { - callback(); - } - } - }); - }); - }; - - async.forEachSeries = function (arr, iterator, callback) { - if (!arr.length) { - return callback(); - } - var completed = 0; - var iterate = function () { - iterator(arr[completed], function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed === arr.length) { - callback(); - } - else { - iterate(); - } - } - }); - }; - iterate(); - }; - - - var doParallel = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.forEach].concat(args)); - }; - }; - var doSeries = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.forEachSeries].concat(args)); - }; - }; - - - var _asyncMap = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (err, v) { - results[x.index] = v; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - }; - async.map = doParallel(_asyncMap); - async.mapSeries = doSeries(_asyncMap); - - - // reduce only has a series version, as doing reduce in parallel won't - // work in many situations. - async.reduce = function (arr, memo, iterator, callback) { - async.forEachSeries(arr, function (x, callback) { - iterator(memo, x, function (err, v) { - memo = v; - callback(err); - }); - }, function (err) { - callback(err, memo); - }); - }; - // inject alias - async.inject = async.reduce; - // foldl alias - async.foldl = async.reduce; - - async.reduceRight = function (arr, memo, iterator, callback) { - var reversed = _map(arr, function (x) { - return x; - }).reverse(); - async.reduce(reversed, memo, iterator, callback); - }; - // foldr alias - async.foldr = async.reduceRight; - - var _filter = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.filter = doParallel(_filter); - async.filterSeries = doSeries(_filter); - // select alias - async.select = async.filter; - async.selectSeries = async.filterSeries; - - var _reject = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (!v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.reject = doParallel(_reject); - async.rejectSeries = doSeries(_reject); - - var _detect = function (eachfn, arr, iterator, main_callback) { - eachfn(arr, function (x, callback) { - iterator(x, function (result) { - if (result) { - main_callback(x); - } - else { - callback(); - } - }); - }, function (err) { - main_callback(); - }); - }; - async.detect = doParallel(_detect); - async.detectSeries = doSeries(_detect); - - async.some = function (arr, iterator, main_callback) { - async.forEach(arr, function (x, callback) { - iterator(x, function (v) { - if (v) { - main_callback(true); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(false); - }); - }; - // any alias - async.any = async.some; - - async.every = function (arr, iterator, main_callback) { - async.forEach(arr, function (x, callback) { - iterator(x, function (v) { - if (!v) { - main_callback(false); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(true); - }); - }; - // all alias - async.all = async.every; - - async.sortBy = function (arr, iterator, callback) { - async.map(arr, function (x, callback) { - iterator(x, function (err, criteria) { - if (err) { - callback(err); - } - else { - callback(null, {value: x, criteria: criteria}); - } - }); - }, function (err, results) { - if (err) { - return callback(err); - } - else { - var fn = function (left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }; - callback(null, _map(results.sort(fn), function (x) { - return x.value; - })); - } - }); - }; - - async.auto = function (tasks, callback) { - callback = callback || function () {}; - var keys = _keys(tasks); - if (!keys.length) { - return callback(null); - } - - var completed = []; - - var listeners = []; - var addListener = function (fn) { - listeners.unshift(fn); - }; - var removeListener = function (fn) { - for (var i = 0; i < listeners.length; i += 1) { - if (listeners[i] === fn) { - listeners.splice(i, 1); - return; - } - } - }; - var taskComplete = function () { - _forEach(listeners, function (fn) { - fn(); - }); - }; - - addListener(function () { - if (completed.length === keys.length) { - callback(null); - } - }); - - _forEach(keys, function (k) { - var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k]; - var taskCallback = function (err) { - if (err) { - callback(err); - // stop subsequent errors hitting callback multiple times - callback = function () {}; - } - else { - completed.push(k); - taskComplete(); - } - }; - var requires = task.slice(0, Math.abs(task.length - 1)) || []; - var ready = function () { - return _reduce(requires, function (a, x) { - return (a && _indexOf(completed, x) !== -1); - }, true); - }; - if (ready()) { - task[task.length - 1](taskCallback); - } - else { - var listener = function () { - if (ready()) { - removeListener(listener); - task[task.length - 1](taskCallback); - } - }; - addListener(listener); - } - }); - }; - - async.waterfall = function (tasks, callback) { - if (!tasks.length) { - return callback(); - } - callback = callback || function () {}; - var wrapIterator = function (iterator) { - return function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - var args = Array.prototype.slice.call(arguments, 1); - var next = iterator.next(); - if (next) { - args.push(wrapIterator(next)); - } - else { - args.push(callback); - } - async.nextTick(function () { - iterator.apply(null, args); - }); - } - }; - }; - wrapIterator(async.iterator(tasks))(); - }; - - async.parallel = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.map(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args || null); - }); - } - }, callback); - } - else { - var results = {}; - async.forEach(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.series = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.mapSeries(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args || null); - }); - } - }, callback); - } - else { - var results = {}; - async.forEachSeries(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.iterator = function (tasks) { - var makeCallback = function (index) { - var fn = function () { - if (tasks.length) { - tasks[index].apply(null, arguments); - } - return fn.next(); - }; - fn.next = function () { - return (index < tasks.length - 1) ? makeCallback(index + 1): null; - }; - return fn; - }; - return makeCallback(0); - }; - - async.apply = function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - return function () { - return fn.apply( - null, args.concat(Array.prototype.slice.call(arguments)) - ); - }; - }; - - var _concat = function (eachfn, arr, fn, callback) { - var r = []; - eachfn(arr, function (x, cb) { - fn(x, function (err, y) { - r = r.concat(y || []); - cb(err); - }); - }, function (err) { - callback(err, r); - }); - }; - async.concat = doParallel(_concat); - async.concatSeries = doSeries(_concat); - - async.whilst = function (test, iterator, callback) { - if (test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.whilst(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.until = function (test, iterator, callback) { - if (!test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.until(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.queue = function (worker, concurrency) { - var workers = 0; - var tasks = []; - var q = { - concurrency: concurrency, - push: function (data, callback) { - tasks.push({data: data, callback: callback}); - async.nextTick(q.process); - }, - process: function () { - if (workers < q.concurrency && tasks.length) { - var task = tasks.splice(0, 1)[0]; - workers += 1; - worker(task.data, function () { - workers -= 1; - if (task.callback) { - task.callback.apply(task, arguments); - } - q.process(); - }); - } - }, - length: function () { - return tasks.length; - } - }; - return q; - }; - - var _console_fn = function (name) { - return function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - fn.apply(null, args.concat([function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (typeof console !== 'undefined') { - if (err) { - if (console.error) { - console.error(err); - } - } - else if (console[name]) { - _forEach(args, function (x) { - console[name](x); - }); - } - } - }])); - }; - }; - async.log = _console_fn('log'); - async.dir = _console_fn('dir'); - /*async.info = _console_fn('info'); - async.warn = _console_fn('warn'); - async.error = _console_fn('error');*/ - -}()); -(function(exports){ -/** - * This file is based on the node.js assert module, but with some small - * changes for browser-compatibility - * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! - */ - - -/** - * Added for browser compatibility - */ - -var _keys = function(obj){ - if(Object.keys) return Object.keys(obj); - var keys = []; - for(var k in obj){ - if(obj.hasOwnProperty(k)) keys.push(k); - } - return keys; -}; - - - -// http://wiki.commonjs.org/wiki/Unit_Testing/1.0 -// -// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! -// -// Originally from narwhal.js (http://narwhaljs.org) -// Copyright (c) 2009 Thomas Robinson <280north.com> -// -// 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. - - -var pSlice = Array.prototype.slice; - -// 1. The assert module provides functions that throw -// AssertionError's when particular conditions are not met. The -// assert module must conform to the following interface. - -var assert = exports; - -// 2. The AssertionError is defined in assert. -// new assert.AssertionError({message: message, actual: actual, expected: expected}) - -assert.AssertionError = function AssertionError (options) { - this.name = "AssertionError"; - this.message = options.message; - this.actual = options.actual; - this.expected = options.expected; - this.operator = options.operator; - var stackStartFunction = options.stackStartFunction || fail; - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, stackStartFunction); - } -}; -// code from util.inherits in node -assert.AssertionError.super_ = Error; - - -// EDITED FOR BROWSER COMPATIBILITY: replaced Object.create call -// TODO: test what effect this may have -var ctor = function () { this.constructor = assert.AssertionError; }; -ctor.prototype = Error.prototype; -assert.AssertionError.prototype = new ctor(); - - -assert.AssertionError.prototype.toString = function() { - if (this.message) { - return [this.name+":", this.message].join(' '); - } else { - return [ this.name+":" - , JSON.stringify(this.expected ) - , this.operator - , JSON.stringify(this.actual) - ].join(" "); - } -}; - -// assert.AssertionError instanceof Error - -assert.AssertionError.__proto__ = Error.prototype; - -// At present only the three keys mentioned above are used and -// understood by the spec. Implementations or sub modules can pass -// other keys to the AssertionError's constructor - they will be -// ignored. - -// 3. All of the following functions must throw an AssertionError -// when a corresponding condition is not met, with a message that -// may be undefined if not provided. All assertion methods provide -// both the actual and expected values to the assertion error for -// display purposes. - -function fail(actual, expected, message, operator, stackStartFunction) { - throw new assert.AssertionError({ - message: message, - actual: actual, - expected: expected, - operator: operator, - stackStartFunction: stackStartFunction - }); -} - -// EXTENSION! allows for well behaved errors defined elsewhere. -assert.fail = fail; - -// 4. Pure assertion tests whether a value is truthy, as determined -// by !!guard. -// assert.ok(guard, message_opt); -// This statement is equivalent to assert.equal(true, guard, -// message_opt);. To test strictly for the value true, use -// assert.strictEqual(true, guard, message_opt);. - -assert.ok = function ok(value, message) { - if (!!!value) fail(value, true, message, "==", assert.ok); -}; - -// 5. The equality assertion tests shallow, coercive equality with -// ==. -// assert.equal(actual, expected, message_opt); - -assert.equal = function equal(actual, expected, message) { - if (actual != expected) fail(actual, expected, message, "==", assert.equal); -}; - -// 6. The non-equality assertion tests for whether two objects are not equal -// with != assert.notEqual(actual, expected, message_opt); - -assert.notEqual = function notEqual(actual, expected, message) { - if (actual == expected) { - fail(actual, expected, message, "!=", assert.notEqual); - } -}; - -// 7. The equivalence assertion tests a deep equality relation. -// assert.deepEqual(actual, expected, message_opt); - -assert.deepEqual = function deepEqual(actual, expected, message) { - if (!_deepEqual(actual, expected)) { - fail(actual, expected, message, "deepEqual", assert.deepEqual); - } -}; - -function _deepEqual(actual, expected) { - // 7.1. All identical values are equivalent, as determined by ===. - if (actual === expected) { - return true; - // 7.2. If the expected value is a Date object, the actual value is - // equivalent if it is also a Date object that refers to the same time. - } else if (actual instanceof Date && expected instanceof Date) { - return actual.getTime() === expected.getTime(); - - // 7.3. Other pairs that do not both pass typeof value == "object", - // equivalence is determined by ==. - } else if (typeof actual != 'object' && typeof expected != 'object') { - return actual == expected; - - // 7.4. For all other Object pairs, including Array objects, equivalence is - // determined by having the same number of owned properties (as verified - // with Object.prototype.hasOwnProperty.call), the same set of keys - // (although not necessarily the same order), equivalent values for every - // corresponding key, and an identical "prototype" property. Note: this - // accounts for both named and indexed properties on Arrays. - } else { - return objEquiv(actual, expected); - } -} - -function isUndefinedOrNull (value) { - return value === null || value === undefined; -} - -function isArguments (object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; -} - -function objEquiv (a, b) { - if (isUndefinedOrNull(a) || isUndefinedOrNull(b)) - return false; - // an identical "prototype" property. - if (a.prototype !== b.prototype) return false; - //~~~I've managed to break Object.keys through screwy arguments passing. - // Converting to array solves the problem. - if (isArguments(a)) { - if (!isArguments(b)) { - return false; - } - a = pSlice.call(a); - b = pSlice.call(b); - return _deepEqual(a, b); - } - try{ - var ka = _keys(a), - kb = _keys(b), - key, i; - } catch (e) {//happens when one is a string literal and the other isn't - return false; - } - // having the same number of owned properties (keys incorporates hasOwnProperty) - if (ka.length != kb.length) - return false; - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] != kb[i]) - return false; - } - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!_deepEqual(a[key], b[key] )) - return false; - } - return true; -} - -// 8. The non-equivalence assertion tests for any deep inequality. -// assert.notDeepEqual(actual, expected, message_opt); - -assert.notDeepEqual = function notDeepEqual(actual, expected, message) { - if (_deepEqual(actual, expected)) { - fail(actual, expected, message, "notDeepEqual", assert.notDeepEqual); - } -}; - -// 9. The strict equality assertion tests strict equality, as determined by ===. -// assert.strictEqual(actual, expected, message_opt); - -assert.strictEqual = function strictEqual(actual, expected, message) { - if (actual !== expected) { - fail(actual, expected, message, "===", assert.strictEqual); - } -}; - -// 10. The strict non-equality assertion tests for strict inequality, as determined by !==. -// assert.notStrictEqual(actual, expected, message_opt); - -assert.notStrictEqual = function notStrictEqual(actual, expected, message) { - if (actual === expected) { - fail(actual, expected, message, "!==", assert.notStrictEqual); - } -}; - -function _throws (shouldThrow, block, err, message) { - var exception = null, - threw = false, - typematters = true; - - message = message || ""; - - //handle optional arguments - if (arguments.length == 3) { - if (typeof(err) == "string") { - message = err; - typematters = false; - } - } else if (arguments.length == 2) { - typematters = false; - } - - try { - block(); - } catch (e) { - threw = true; - exception = e; - } - - if (shouldThrow && !threw) { - fail( "Missing expected exception" - + (err && err.name ? " ("+err.name+")." : '.') - + (message ? " " + message : "") - ); - } - if (!shouldThrow && threw && typematters && exception instanceof err) { - fail( "Got unwanted exception" - + (err && err.name ? " ("+err.name+")." : '.') - + (message ? " " + message : "") - ); - } - if ((shouldThrow && threw && typematters && !(exception instanceof err)) || - (!shouldThrow && threw)) { - throw exception; - } -}; - -// 11. Expected to throw an error: -// assert.throws(block, Error_opt, message_opt); - -assert.throws = function(block, /*optional*/error, /*optional*/message) { - _throws.apply(this, [true].concat(pSlice.call(arguments))); -}; - -// EXTENSION! This is annoying to write outside this module. -assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) { - _throws.apply(this, [false].concat(pSlice.call(arguments))); -}; - -assert.ifError = function (err) { if (err) {throw err;}}; -})(assert); -(function(exports){ -/*! - * Nodeunit - * Copyright (c) 2010 Caolan McMahon - * MIT Licensed - * - * THIS FILE SHOULD BE BROWSER-COMPATIBLE JS! - * Only code on that line will be removed, its mostly to avoid requiring code - * that is node specific - */ - -/** - * Module dependencies - */ - - - -/** - * Creates assertion objects representing the result of an assert call. - * Accepts an object or AssertionError as its argument. - * - * @param {object} obj - * @api public - */ - -exports.assertion = function (obj) { - return { - method: obj.method || '', - message: obj.message || (obj.error && obj.error.message) || '', - error: obj.error, - passed: function () { - return !this.error; - }, - failed: function () { - return Boolean(this.error); - } - }; -}; - -/** - * Creates an assertion list object representing a group of assertions. - * Accepts an array of assertion objects. - * - * @param {Array} arr - * @param {Number} duration - * @api public - */ - -exports.assertionList = function (arr, duration) { - var that = arr || []; - that.failures = function () { - var failures = 0; - for (var i=0; i(' + - '' + assertions.failures() + ', ' + - '' + assertions.passes() + ', ' + - assertions.length + - ')
        '; - test.className = assertions.failures() ? 'fail': 'pass'; - test.appendChild(strong); - - var aList = document.createElement('ol'); - aList.style.display = 'none'; - test.onclick = function () { - var d = aList.style.display; - aList.style.display = (d == 'none') ? 'block': 'none'; - }; - for (var i=0; i' + (a.error.stack || a.error) + ''; - li.className = 'fail'; - } - else { - li.innerHTML = a.message || a.method || 'no message'; - li.className = 'pass'; - } - aList.appendChild(li); - } - test.appendChild(aList); - tests.appendChild(test); - }, - done: function (assertions) { - var end = new Date().getTime(); - var duration = end - start; - - var failures = assertions.failures(); - banner.className = failures ? 'fail': 'pass'; - - result.innerHTML = 'Tests completed in ' + duration + - ' milliseconds.
        ' + - assertions.passes() + ' assertions of ' + - '' + assertions.length + ' passed, ' + - assertions.failures() + ' failed.'; - } - }); -}; -})(reporter); -nodeunit = core; -nodeunit.assert = assert; -nodeunit.reporter = reporter; -nodeunit.run = reporter.run; -return nodeunit; })(); diff --git a/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js b/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js deleted file mode 100644 index f89741e..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js +++ /dev/null @@ -1 +0,0 @@ -/*global setTimeout: false, console: false */(function(){var a={};var b=this,c=b.async;typeof module!=="undefined"&&module.exports?module.exports=a:b.async=a,a.noConflict=function(){b.async=c;return a};var d=function(a,b){if(a.forEach)return a.forEach(b);for(var c=0;cd?1:0};d(null,e(b.sort(c),function(a){return a.value}))})},a.auto=function(a,b){b=b||function(){};var c=g(a);if(!c.length)return b(null);var e=[];var i=[];var j=function(a){i.unshift(a)};var k=function(a){for(var b=0;b b ? 1 : 0; - }; - callback(null, _map(results.sort(fn), function (x) { - return x.value; - })); - } - }); - }; - - async.auto = function (tasks, callback) { - callback = callback || function () {}; - var keys = _keys(tasks); - if (!keys.length) { - return callback(null); - } - - var completed = []; - - var listeners = []; - var addListener = function (fn) { - listeners.unshift(fn); - }; - var removeListener = function (fn) { - for (var i = 0; i < listeners.length; i += 1) { - if (listeners[i] === fn) { - listeners.splice(i, 1); - return; - } - } - }; - var taskComplete = function () { - _forEach(listeners, function (fn) { - fn(); - }); - }; - - addListener(function () { - if (completed.length === keys.length) { - callback(null); - } - }); - - _forEach(keys, function (k) { - var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k]; - var taskCallback = function (err) { - if (err) { - callback(err); - // stop subsequent errors hitting callback multiple times - callback = function () {}; - } - else { - completed.push(k); - taskComplete(); - } - }; - var requires = task.slice(0, Math.abs(task.length - 1)) || []; - var ready = function () { - return _reduce(requires, function (a, x) { - return (a && _indexOf(completed, x) !== -1); - }, true); - }; - if (ready()) { - task[task.length - 1](taskCallback); - } - else { - var listener = function () { - if (ready()) { - removeListener(listener); - task[task.length - 1](taskCallback); - } - }; - addListener(listener); - } - }); - }; - - async.waterfall = function (tasks, callback) { - if (!tasks.length) { - return callback(); - } - callback = callback || function () {}; - var wrapIterator = function (iterator) { - return function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - var args = Array.prototype.slice.call(arguments, 1); - var next = iterator.next(); - if (next) { - args.push(wrapIterator(next)); - } - else { - args.push(callback); - } - async.nextTick(function () { - iterator.apply(null, args); - }); - } - }; - }; - wrapIterator(async.iterator(tasks))(); - }; - - async.parallel = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.map(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args); - }); - } - }, callback); - } - else { - var results = {}; - async.forEach(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.series = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.mapSeries(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args); - }); - } - }, callback); - } - else { - var results = {}; - async.forEachSeries(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.iterator = function (tasks) { - var makeCallback = function (index) { - var fn = function () { - if (tasks.length) { - tasks[index].apply(null, arguments); - } - return fn.next(); - }; - fn.next = function () { - return (index < tasks.length - 1) ? makeCallback(index + 1): null; - }; - return fn; - }; - return makeCallback(0); - }; - - async.apply = function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - return function () { - return fn.apply( - null, args.concat(Array.prototype.slice.call(arguments)) - ); - }; - }; - - var _concat = function (eachfn, arr, fn, callback) { - var r = []; - eachfn(arr, function (x, cb) { - fn(x, function (err, y) { - r = r.concat(y || []); - cb(err); - }); - }, function (err) { - callback(err, r); - }); - }; - async.concat = doParallel(_concat); - async.concatSeries = doSeries(_concat); - - async.whilst = function (test, iterator, callback) { - if (test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.whilst(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.until = function (test, iterator, callback) { - if (!test()) { - iterator(function (err) { - if (err) { - return callback(err); - } - async.until(test, iterator, callback); - }); - } - else { - callback(); - } - }; - - async.queue = function (worker, concurrency) { - var workers = 0; - var tasks = []; - var q = { - concurrency: concurrency, - saturated: null, - empty: null, - drain: null, - push: function (data, callback) { - tasks.push({data: data, callback: callback}); - if(q.saturated && tasks.length == concurrency) q.saturated(); - async.nextTick(q.process); - }, - process: function () { - if (workers < q.concurrency && tasks.length) { - var task = tasks.splice(0, 1)[0]; - if(q.empty && tasks.length == 0) q.empty(); - workers += 1; - worker(task.data, function () { - workers -= 1; - if (task.callback) { - task.callback.apply(task, arguments); - } - if(q.drain && tasks.length + workers == 0) q.drain(); - q.process(); - }); - } - }, - length: function () { - return tasks.length; - }, - running: function () { - return workers; - } - }; - return q; - }; - - var _console_fn = function (name) { - return function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - fn.apply(null, args.concat([function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (typeof console !== 'undefined') { - if (err) { - if (console.error) { - console.error(err); - } - } - else if (console[name]) { - _forEach(args, function (x) { - console[name](x); - }); - } - } - }])); - }; - }; - async.log = _console_fn('log'); - async.dir = _console_fn('dir'); - /*async.info = _console_fn('info'); - async.warn = _console_fn('warn'); - async.error = _console_fn('error');*/ - - async.memoize = function (fn, hasher) { - var memo = {}; - hasher = hasher || function (x) { - return x; - }; - return function () { - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - var key = hasher.apply(null, args); - if (key in memo) { - callback.apply(null, memo[key]); - } - else { - fn.apply(null, args.concat([function () { - memo[key] = arguments; - callback.apply(null, arguments); - }])); - } - }; - }; - -}()); diff --git a/node_modules/request/node_modules/form-data/node_modules/async/nodelint.cfg b/node_modules/request/node_modules/form-data/node_modules/async/nodelint.cfg deleted file mode 100644 index 457a967..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/async/nodelint.cfg +++ /dev/null @@ -1,4 +0,0 @@ -var options = { - indent: 4, - onevar: false -}; diff --git a/node_modules/request/node_modules/form-data/node_modules/async/package.json b/node_modules/request/node_modules/form-data/node_modules/async/package.json deleted file mode 100644 index e5646d7..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/async/package.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "async", - "description": "Higher-order functions and common patterns for asynchronous code", - "main": "./index", - "author": { - "name": "Caolan McMahon" - }, - "version": "0.1.9", - "repository": { - "type": "git", - "url": "git://github.com/caolan/async.git" - }, - "bugs": { - "url": "http://github.com/caolan/async/issues" - }, - "licenses": [ - { - "type": "MIT", - "url": "http://github.com/caolan/async/raw/master/LICENSE" - } - ], - "_npmUser": { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - "_id": "async@0.1.9", - "dependencies": {}, - "devDependencies": {}, - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "_engineSupported": true, - "_npmVersion": "1.1.24", - "_nodeVersion": "v0.8.1", - "_defaultsLoaded": true, - "dist": { - "shasum": "fd9b6aca66495fd0f7e97f86e71c7706ca9ae754" - }, - "_from": "async@0.1.9" -} diff --git a/node_modules/request/node_modules/form-data/node_modules/async/test/.swp b/node_modules/request/node_modules/form-data/node_modules/async/test/.swp deleted file mode 100644 index ece9b6bb6a4f01d31a8613468ccc9244e256ea4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2y>1gh5XU!k2=O6!fx#G*1bfd;q(nN!t|DZl1PM@R*c9ixB|hhTd)%IJ+yq_& z3R-G9L;(dAk3r27P#`h8Hj0FhDR2|%Kho^%?9R;1{jOTw_FGTx@6)#25G>b(c>C(Z z{-Njzc}a*kGFg`WCKRNaX>-TxySGFHn-?2hK00ck)1V8`;KmY_l00ck)1pbRatF`szv%4rQ2h}JO z&i%`hkMQef!&#D>HT{)qIkZB`K-8$SMB#Eo565YIOg)_yA?@62cf$csiJIY&p>aV; zS`zJsiOzJTi5`We&Z7~}Y-mkcHTzSdlTe@N*jMYNNtz#pT-S?SSJF;oz2PRsbQbfN z^T_JwW1Yu3q^Bx4tT)t7Y)Y+euPUh$byuyaj_Nj)9PpNm{ZJJ3#yWe(d8R*fCe5FD z*G_m-$$oUq=Ctm6anI2SxelGUw*7iAFe4o-xY}N$2f8XJw40WE>)n)7+DmQ4?=>s* V?{PKv`7hd=TWkEtC4RDw_ysbD&=&vz diff --git a/node_modules/request/node_modules/form-data/node_modules/async/test/test-async.js b/node_modules/request/node_modules/form-data/node_modules/async/test/test-async.js deleted file mode 100644 index 8c2cebd..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/async/test/test-async.js +++ /dev/null @@ -1,1367 +0,0 @@ -var async = require('../lib/async'); - - -exports['auto'] = function(test){ - var callOrder = []; - var testdata = [{test: 'test'}]; - async.auto({ - task1: ['task2', function(callback){ - setTimeout(function(){ - callOrder.push('task1'); - callback(); - }, 25); - }], - task2: function(callback){ - setTimeout(function(){ - callOrder.push('task2'); - callback(); - }, 50); - }, - task3: ['task2', function(callback){ - callOrder.push('task3'); - callback(); - }], - task4: ['task1', 'task2', function(callback){ - callOrder.push('task4'); - callback(); - }] - }, - function(err){ - test.same(callOrder, ['task2','task3','task1','task4']); - test.done(); - }); -}; - -exports['auto empty object'] = function(test){ - async.auto({}, function(err){ - test.done(); - }); -}; - -exports['auto error'] = function(test){ - test.expect(1); - async.auto({ - task1: function(callback){ - callback('testerror'); - }, - task2: ['task1', function(callback){ - test.ok(false, 'task2 should not be called'); - callback(); - }], - task3: function(callback){ - callback('testerror2'); - } - }, - function(err){ - test.equals(err, 'testerror'); - }); - setTimeout(test.done, 100); -}; - -exports['auto no callback'] = function(test){ - async.auto({ - task1: function(callback){callback();}, - task2: ['task1', function(callback){callback(); test.done();}] - }); -}; - -exports['waterfall'] = function(test){ - test.expect(6); - var call_order = []; - async.waterfall([ - function(callback){ - call_order.push('fn1'); - setTimeout(function(){callback(null, 'one', 'two');}, 0); - }, - function(arg1, arg2, callback){ - call_order.push('fn2'); - test.equals(arg1, 'one'); - test.equals(arg2, 'two'); - setTimeout(function(){callback(null, arg1, arg2, 'three');}, 25); - }, - function(arg1, arg2, arg3, callback){ - call_order.push('fn3'); - test.equals(arg1, 'one'); - test.equals(arg2, 'two'); - test.equals(arg3, 'three'); - callback(null, 'four'); - }, - function(arg4, callback){ - call_order.push('fn4'); - test.same(call_order, ['fn1','fn2','fn3','fn4']); - callback(null, 'test'); - } - ], function(err){ - test.done(); - }); -}; - -exports['waterfall empty array'] = function(test){ - async.waterfall([], function(err){ - test.done(); - }); -}; - -exports['waterfall no callback'] = function(test){ - async.waterfall([ - function(callback){callback();}, - function(callback){callback(); test.done();} - ]); -}; - -exports['waterfall async'] = function(test){ - var call_order = []; - async.waterfall([ - function(callback){ - call_order.push(1); - callback(); - call_order.push(2); - }, - function(callback){ - call_order.push(3); - callback(); - }, - function(){ - test.same(call_order, [1,2,3]); - test.done(); - } - ]); -}; - -exports['waterfall error'] = function(test){ - test.expect(1); - async.waterfall([ - function(callback){ - callback('error'); - }, - function(callback){ - test.ok(false, 'next function should not be called'); - callback(); - } - ], function(err){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['waterfall multiple callback calls'] = function(test){ - var call_order = []; - var arr = [ - function(callback){ - call_order.push(1); - // call the callback twice. this should call function 2 twice - callback(null, 'one', 'two'); - callback(null, 'one', 'two'); - }, - function(arg1, arg2, callback){ - call_order.push(2); - callback(null, arg1, arg2, 'three'); - }, - function(arg1, arg2, arg3, callback){ - call_order.push(3); - callback(null, 'four'); - }, - function(arg4){ - call_order.push(4); - arr[3] = function(){ - call_order.push(4); - test.same(call_order, [1,2,2,3,3,4,4]); - test.done(); - }; - } - ]; - async.waterfall(arr); -}; - - -exports['parallel'] = function(test){ - var call_order = []; - async.parallel([ - function(callback){ - setTimeout(function(){ - call_order.push(1); - callback(null, 1); - }, 25); - }, - function(callback){ - setTimeout(function(){ - call_order.push(2); - callback(null, 2); - }, 50); - }, - function(callback){ - setTimeout(function(){ - call_order.push(3); - callback(null, 3,3); - }, 15); - } - ], - function(err, results){ - test.equals(err, null); - test.same(call_order, [3,1,2]); - test.same(results, [1,2,[3,3]]); - test.done(); - }); -}; - -exports['parallel empty array'] = function(test){ - async.parallel([], function(err, results){ - test.equals(err, null); - test.same(results, []); - test.done(); - }); -}; - -exports['parallel error'] = function(test){ - async.parallel([ - function(callback){ - callback('error', 1); - }, - function(callback){ - callback('error2', 2); - } - ], - function(err, results){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 100); -}; - -exports['parallel no callback'] = function(test){ - async.parallel([ - function(callback){callback();}, - function(callback){callback(); test.done();}, - ]); -}; - -exports['parallel object'] = function(test){ - var call_order = []; - async.parallel({ - one: function(callback){ - setTimeout(function(){ - call_order.push(1); - callback(null, 1); - }, 25); - }, - two: function(callback){ - setTimeout(function(){ - call_order.push(2); - callback(null, 2); - }, 50); - }, - three: function(callback){ - setTimeout(function(){ - call_order.push(3); - callback(null, 3,3); - }, 15); - } - }, - function(err, results){ - test.equals(err, null); - test.same(call_order, [3,1,2]); - test.same(results, { - one: 1, - two: 2, - three: [3,3] - }); - test.done(); - }); -}; - -exports['series'] = function(test){ - var call_order = []; - async.series([ - function(callback){ - setTimeout(function(){ - call_order.push(1); - callback(null, 1); - }, 25); - }, - function(callback){ - setTimeout(function(){ - call_order.push(2); - callback(null, 2); - }, 50); - }, - function(callback){ - setTimeout(function(){ - call_order.push(3); - callback(null, 3,3); - }, 15); - } - ], - function(err, results){ - test.equals(err, null); - test.same(results, [1,2,[3,3]]); - test.same(call_order, [1,2,3]); - test.done(); - }); -}; - -exports['series empty array'] = function(test){ - async.series([], function(err, results){ - test.equals(err, null); - test.same(results, []); - test.done(); - }); -}; - -exports['series error'] = function(test){ - test.expect(1); - async.series([ - function(callback){ - callback('error', 1); - }, - function(callback){ - test.ok(false, 'should not be called'); - callback('error2', 2); - } - ], - function(err, results){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 100); -}; - -exports['series no callback'] = function(test){ - async.series([ - function(callback){callback();}, - function(callback){callback(); test.done();}, - ]); -}; - -exports['series object'] = function(test){ - var call_order = []; - async.series({ - one: function(callback){ - setTimeout(function(){ - call_order.push(1); - callback(null, 1); - }, 25); - }, - two: function(callback){ - setTimeout(function(){ - call_order.push(2); - callback(null, 2); - }, 50); - }, - three: function(callback){ - setTimeout(function(){ - call_order.push(3); - callback(null, 3,3); - }, 15); - } - }, - function(err, results){ - test.equals(err, null); - test.same(results, { - one: 1, - two: 2, - three: [3,3] - }); - test.same(call_order, [1,2,3]); - test.done(); - }); -}; - -exports['iterator'] = function(test){ - var call_order = []; - var iterator = async.iterator([ - function(){call_order.push(1);}, - function(arg1){ - test.equals(arg1, 'arg1'); - call_order.push(2); - }, - function(arg1, arg2){ - test.equals(arg1, 'arg1'); - test.equals(arg2, 'arg2'); - call_order.push(3); - } - ]); - iterator(); - test.same(call_order, [1]); - var iterator2 = iterator(); - test.same(call_order, [1,1]); - var iterator3 = iterator2('arg1'); - test.same(call_order, [1,1,2]); - var iterator4 = iterator3('arg1', 'arg2'); - test.same(call_order, [1,1,2,3]); - test.equals(iterator4, undefined); - test.done(); -}; - -exports['iterator empty array'] = function(test){ - var iterator = async.iterator([]); - test.equals(iterator(), undefined); - test.equals(iterator.next(), undefined); - test.done(); -}; - -exports['iterator.next'] = function(test){ - var call_order = []; - var iterator = async.iterator([ - function(){call_order.push(1);}, - function(arg1){ - test.equals(arg1, 'arg1'); - call_order.push(2); - }, - function(arg1, arg2){ - test.equals(arg1, 'arg1'); - test.equals(arg2, 'arg2'); - call_order.push(3); - } - ]); - var fn = iterator.next(); - var iterator2 = fn('arg1'); - test.same(call_order, [2]); - iterator2('arg1','arg2'); - test.same(call_order, [2,3]); - test.equals(iterator2.next(), undefined); - test.done(); -}; - -exports['forEach'] = function(test){ - var args = []; - async.forEach([1,3,2], function(x, callback){ - setTimeout(function(){ - args.push(x); - callback(); - }, x*25); - }, function(err){ - test.same(args, [1,2,3]); - test.done(); - }); -}; - -exports['forEach empty array'] = function(test){ - test.expect(1); - async.forEach([], function(x, callback){ - test.ok(false, 'iterator should not be called'); - callback(); - }, function(err){ - test.ok(true, 'should call callback'); - }); - setTimeout(test.done, 25); -}; - -exports['forEach error'] = function(test){ - test.expect(1); - async.forEach([1,2,3], function(x, callback){ - callback('error'); - }, function(err){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['forEachSeries'] = function(test){ - var args = []; - async.forEachSeries([1,3,2], function(x, callback){ - setTimeout(function(){ - args.push(x); - callback(); - }, x*25); - }, function(err){ - test.same(args, [1,3,2]); - test.done(); - }); -}; - -exports['forEachSeries empty array'] = function(test){ - test.expect(1); - async.forEachSeries([], function(x, callback){ - test.ok(false, 'iterator should not be called'); - callback(); - }, function(err){ - test.ok(true, 'should call callback'); - }); - setTimeout(test.done, 25); -}; - -exports['forEachSeries error'] = function(test){ - test.expect(2); - var call_order = []; - async.forEachSeries([1,2,3], function(x, callback){ - call_order.push(x); - callback('error'); - }, function(err){ - test.same(call_order, [1]); - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['map'] = function(test){ - var call_order = []; - async.map([1,3,2], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(null, x*2); - }, x*25); - }, function(err, results){ - test.same(call_order, [1,2,3]); - test.same(results, [2,6,4]); - test.done(); - }); -}; - -exports['map original untouched'] = function(test){ - var a = [1,2,3]; - async.map(a, function(x, callback){ - callback(null, x*2); - }, function(err, results){ - test.same(results, [2,4,6]); - test.same(a, [1,2,3]); - test.done(); - }); -}; - -exports['map error'] = function(test){ - test.expect(1); - async.map([1,2,3], function(x, callback){ - callback('error'); - }, function(err, results){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['mapSeries'] = function(test){ - var call_order = []; - async.mapSeries([1,3,2], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(null, x*2); - }, x*25); - }, function(err, results){ - test.same(call_order, [1,3,2]); - test.same(results, [2,6,4]); - test.done(); - }); -}; - -exports['mapSeries error'] = function(test){ - test.expect(1); - async.mapSeries([1,2,3], function(x, callback){ - callback('error'); - }, function(err, results){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['reduce'] = function(test){ - var call_order = []; - async.reduce([1,2,3], 0, function(a, x, callback){ - call_order.push(x); - callback(null, a + x); - }, function(err, result){ - test.equals(result, 6); - test.same(call_order, [1,2,3]); - test.done(); - }); -}; - -exports['reduce async with non-reference memo'] = function(test){ - async.reduce([1,3,2], 0, function(a, x, callback){ - setTimeout(function(){callback(null, a + x)}, Math.random()*100); - }, function(err, result){ - test.equals(result, 6); - test.done(); - }); -}; - -exports['reduce error'] = function(test){ - test.expect(1); - async.reduce([1,2,3], 0, function(a, x, callback){ - callback('error'); - }, function(err, result){ - test.equals(err, 'error'); - }); - setTimeout(test.done, 50); -}; - -exports['inject alias'] = function(test){ - test.equals(async.inject, async.reduce); - test.done(); -}; - -exports['foldl alias'] = function(test){ - test.equals(async.foldl, async.reduce); - test.done(); -}; - -exports['reduceRight'] = function(test){ - var call_order = []; - var a = [1,2,3]; - async.reduceRight(a, 0, function(a, x, callback){ - call_order.push(x); - callback(null, a + x); - }, function(err, result){ - test.equals(result, 6); - test.same(call_order, [3,2,1]); - test.same(a, [1,2,3]); - test.done(); - }); -}; - -exports['foldr alias'] = function(test){ - test.equals(async.foldr, async.reduceRight); - test.done(); -}; - -exports['filter'] = function(test){ - async.filter([3,1,2], function(x, callback){ - setTimeout(function(){callback(x % 2);}, x*25); - }, function(results){ - test.same(results, [3,1]); - test.done(); - }); -}; - -exports['filter original untouched'] = function(test){ - var a = [3,1,2]; - async.filter(a, function(x, callback){ - callback(x % 2); - }, function(results){ - test.same(results, [3,1]); - test.same(a, [3,1,2]); - test.done(); - }); -}; - -exports['filterSeries'] = function(test){ - async.filterSeries([3,1,2], function(x, callback){ - setTimeout(function(){callback(x % 2);}, x*25); - }, function(results){ - test.same(results, [3,1]); - test.done(); - }); -}; - -exports['select alias'] = function(test){ - test.equals(async.select, async.filter); - test.done(); -}; - -exports['selectSeries alias'] = function(test){ - test.equals(async.selectSeries, async.filterSeries); - test.done(); -}; - -exports['reject'] = function(test){ - async.reject([3,1,2], function(x, callback){ - setTimeout(function(){callback(x % 2);}, x*25); - }, function(results){ - test.same(results, [2]); - test.done(); - }); -}; - -exports['reject original untouched'] = function(test){ - var a = [3,1,2]; - async.reject(a, function(x, callback){ - callback(x % 2); - }, function(results){ - test.same(results, [2]); - test.same(a, [3,1,2]); - test.done(); - }); -}; - -exports['rejectSeries'] = function(test){ - async.rejectSeries([3,1,2], function(x, callback){ - setTimeout(function(){callback(x % 2);}, x*25); - }, function(results){ - test.same(results, [2]); - test.done(); - }); -}; - -exports['some true'] = function(test){ - async.some([3,1,2], function(x, callback){ - setTimeout(function(){callback(x === 1);}, 0); - }, function(result){ - test.equals(result, true); - test.done(); - }); -}; - -exports['some false'] = function(test){ - async.some([3,1,2], function(x, callback){ - setTimeout(function(){callback(x === 10);}, 0); - }, function(result){ - test.equals(result, false); - test.done(); - }); -}; - -exports['some early return'] = function(test){ - var call_order = []; - async.some([1,2,3], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(x === 1); - }, x*25); - }, function(result){ - call_order.push('callback'); - }); - setTimeout(function(){ - test.same(call_order, [1,'callback',2,3]); - test.done(); - }, 100); -}; - -exports['any alias'] = function(test){ - test.equals(async.any, async.some); - test.done(); -}; - -exports['every true'] = function(test){ - async.every([1,2,3], function(x, callback){ - setTimeout(function(){callback(true);}, 0); - }, function(result){ - test.equals(result, true); - test.done(); - }); -}; - -exports['every false'] = function(test){ - async.every([1,2,3], function(x, callback){ - setTimeout(function(){callback(x % 2);}, 0); - }, function(result){ - test.equals(result, false); - test.done(); - }); -}; - -exports['every early return'] = function(test){ - var call_order = []; - async.every([1,2,3], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(x === 1); - }, x*25); - }, function(result){ - call_order.push('callback'); - }); - setTimeout(function(){ - test.same(call_order, [1,2,'callback',3]); - test.done(); - }, 100); -}; - -exports['all alias'] = function(test){ - test.equals(async.all, async.every); - test.done(); -}; - -exports['detect'] = function(test){ - var call_order = []; - async.detect([3,2,1], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(x == 2); - }, x*25); - }, function(result){ - call_order.push('callback'); - test.equals(result, 2); - }); - setTimeout(function(){ - test.same(call_order, [1,2,'callback',3]); - test.done(); - }, 100); -}; - -exports['detectSeries'] = function(test){ - var call_order = []; - async.detectSeries([3,2,1], function(x, callback){ - setTimeout(function(){ - call_order.push(x); - callback(x == 2); - }, x*25); - }, function(result){ - call_order.push('callback'); - test.equals(result, 2); - }); - setTimeout(function(){ - test.same(call_order, [3,2,'callback']); - test.done(); - }, 200); -}; - -exports['sortBy'] = function(test){ - async.sortBy([{a:1},{a:15},{a:6}], function(x, callback){ - setTimeout(function(){callback(null, x.a);}, 0); - }, function(err, result){ - test.same(result, [{a:1},{a:6},{a:15}]); - test.done(); - }); -}; - -exports['apply'] = function(test){ - test.expect(6); - var fn = function(){ - test.same(Array.prototype.slice.call(arguments), [1,2,3,4]) - }; - async.apply(fn, 1, 2, 3, 4)(); - async.apply(fn, 1, 2, 3)(4); - async.apply(fn, 1, 2)(3, 4); - async.apply(fn, 1)(2, 3, 4); - async.apply(fn)(1, 2, 3, 4); - test.equals( - async.apply(function(name){return 'hello ' + name}, 'world')(), - 'hello world' - ); - test.done(); -}; - - -// generates tests for console functions such as async.log -var console_fn_tests = function(name){ - - if (typeof console !== 'undefined') { - exports[name] = function(test){ - test.expect(5); - var fn = function(arg1, callback){ - test.equals(arg1, 'one'); - setTimeout(function(){callback(null, 'test');}, 0); - }; - var fn_err = function(arg1, callback){ - test.equals(arg1, 'one'); - setTimeout(function(){callback('error');}, 0); - }; - var _console_fn = console[name]; - var _error = console.error; - console[name] = function(val){ - test.equals(val, 'test'); - test.equals(arguments.length, 1); - console.error = function(val){ - test.equals(val, 'error'); - console[name] = _console_fn; - console.error = _error; - test.done(); - }; - async[name](fn_err, 'one'); - }; - async[name](fn, 'one'); - }; - - exports[name + ' with multiple result params'] = function(test){ - var fn = function(callback){callback(null,'one','two','three');}; - var _console_fn = console[name]; - var called_with = []; - console[name] = function(x){ - called_with.push(x); - }; - async[name](fn); - test.same(called_with, ['one','two','three']); - console[name] = _console_fn; - test.done(); - }; - } - - // browser-only test - exports[name + ' without console.' + name] = function(test){ - if (typeof window !== 'undefined') { - var _console = window.console; - window.console = undefined; - var fn = function(callback){callback(null, 'val');}; - var fn_err = function(callback){callback('error');}; - async[name](fn); - async[name](fn_err); - window.console = _console; - } - test.done(); - }; - -}; - -console_fn_tests('log'); -console_fn_tests('dir'); -/*console_fn_tests('info'); -console_fn_tests('warn'); -console_fn_tests('error');*/ - -exports['nextTick'] = function(test){ - var call_order = []; - async.nextTick(function(){call_order.push('two');}); - call_order.push('one'); - setTimeout(function(){ - test.same(call_order, ['one','two']); - test.done(); - }, 50); -}; - -exports['nextTick in the browser'] = function(test){ - if (typeof process !== 'undefined') { - // skip this test in node - return test.done(); - } - test.expect(1); - - var call_order = []; - async.nextTick(function(){call_order.push('two');}); - - call_order.push('one'); - setTimeout(function(){ - if (typeof process !== 'undefined') { - process.nextTick = _nextTick; - } - test.same(call_order, ['one','two']); - }, 50); - setTimeout(test.done, 100); -}; - -exports['noConflict - node only'] = function(test){ - if (typeof process !== 'undefined') { - // node only test - test.expect(3); - var fs = require('fs'); - var filename = __dirname + '/../lib/async.js'; - fs.readFile(filename, function(err, content){ - if(err) return test.done(); - var Script = process.binding('evals').Script; - - var s = new Script(content, filename); - var s2 = new Script( - content + 'this.async2 = this.async.noConflict();', - filename - ); - - var sandbox1 = {async: 'oldvalue'}; - s.runInNewContext(sandbox1); - test.ok(sandbox1.async); - - var sandbox2 = {async: 'oldvalue'}; - s2.runInNewContext(sandbox2); - test.equals(sandbox2.async, 'oldvalue'); - test.ok(sandbox2.async2); - - test.done(); - }); - } - else test.done(); -}; - -exports['concat'] = function(test){ - var call_order = []; - var iterator = function (x, cb) { - setTimeout(function(){ - call_order.push(x); - var r = []; - while (x > 0) { - r.push(x); - x--; - } - cb(null, r); - }, x*25); - }; - async.concat([1,3,2], iterator, function(err, results){ - test.same(results, [1,2,1,3,2,1]); - test.same(call_order, [1,2,3]); - test.ok(!err); - test.done(); - }); -}; - -exports['concat error'] = function(test){ - var iterator = function (x, cb) { - cb(new Error('test error')); - }; - async.concat([1,2,3], iterator, function(err, results){ - test.ok(err); - test.done(); - }); -}; - -exports['concatSeries'] = function(test){ - var call_order = []; - var iterator = function (x, cb) { - setTimeout(function(){ - call_order.push(x); - var r = []; - while (x > 0) { - r.push(x); - x--; - } - cb(null, r); - }, x*25); - }; - async.concatSeries([1,3,2], iterator, function(err, results){ - test.same(results, [1,3,2,1,2,1]); - test.same(call_order, [1,3,2]); - test.ok(!err); - test.done(); - }); -}; - -exports['until'] = function (test) { - var call_order = []; - - var count = 0; - async.until( - function () { - call_order.push(['test', count]); - return (count == 5); - }, - function (cb) { - call_order.push(['iterator', count]); - count++; - cb(); - }, - function (err) { - test.same(call_order, [ - ['test', 0], - ['iterator', 0], ['test', 1], - ['iterator', 1], ['test', 2], - ['iterator', 2], ['test', 3], - ['iterator', 3], ['test', 4], - ['iterator', 4], ['test', 5], - ]); - test.equals(count, 5); - test.done(); - } - ); -}; - -exports['whilst'] = function (test) { - var call_order = []; - - var count = 0; - async.whilst( - function () { - call_order.push(['test', count]); - return (count < 5); - }, - function (cb) { - call_order.push(['iterator', count]); - count++; - cb(); - }, - function (err) { - test.same(call_order, [ - ['test', 0], - ['iterator', 0], ['test', 1], - ['iterator', 1], ['test', 2], - ['iterator', 2], ['test', 3], - ['iterator', 3], ['test', 4], - ['iterator', 4], ['test', 5], - ]); - test.equals(count, 5); - test.done(); - } - ); -}; - -exports['queue'] = function (test) { - var call_order = [], - delays = [40,20,60,20]; - - // worker1: --1-4 - // worker2: -2---3 - // order of completion: 2,1,4,3 - - var q = async.queue(function (task, callback) { - setTimeout(function () { - call_order.push('process ' + task); - callback('error', 'arg'); - }, delays.splice(0,1)[0]); - }, 2); - - q.push(1, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 1); - call_order.push('callback ' + 1); - }); - q.push(2, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 2); - call_order.push('callback ' + 2); - }); - q.push(3, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 0); - call_order.push('callback ' + 3); - }); - q.push(4, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 0); - call_order.push('callback ' + 4); - }); - test.equal(q.length(), 4); - test.equal(q.concurrency, 2); - - setTimeout(function () { - test.same(call_order, [ - 'process 2', 'callback 2', - 'process 1', 'callback 1', - 'process 4', 'callback 4', - 'process 3', 'callback 3' - ]); - test.equal(q.concurrency, 2); - test.equal(q.length(), 0); - test.done(); - }, 200); -}; - -exports['queue changing concurrency'] = function (test) { - var call_order = [], - delays = [40,20,60,20]; - - // worker1: --1-2---3-4 - // order of completion: 1,2,3,4 - - var q = async.queue(function (task, callback) { - setTimeout(function () { - call_order.push('process ' + task); - callback('error', 'arg'); - }, delays.splice(0,1)[0]); - }, 2); - - q.push(1, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 3); - call_order.push('callback ' + 1); - }); - q.push(2, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 2); - call_order.push('callback ' + 2); - }); - q.push(3, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 1); - call_order.push('callback ' + 3); - }); - q.push(4, function (err, arg) { - test.equal(err, 'error'); - test.equal(arg, 'arg'); - test.equal(q.length(), 0); - call_order.push('callback ' + 4); - }); - test.equal(q.length(), 4); - test.equal(q.concurrency, 2); - q.concurrency = 1; - - setTimeout(function () { - test.same(call_order, [ - 'process 1', 'callback 1', - 'process 2', 'callback 2', - 'process 3', 'callback 3', - 'process 4', 'callback 4' - ]); - test.equal(q.concurrency, 1); - test.equal(q.length(), 0); - test.done(); - }, 250); -}; - -exports['queue push without callback'] = function (test) { - var call_order = [], - delays = [40,20,60,20]; - - // worker1: --1-4 - // worker2: -2---3 - // order of completion: 2,1,4,3 - - var q = async.queue(function (task, callback) { - setTimeout(function () { - call_order.push('process ' + task); - callback('error', 'arg'); - }, delays.splice(0,1)[0]); - }, 2); - - q.push(1); - q.push(2); - q.push(3); - q.push(4); - - setTimeout(function () { - test.same(call_order, [ - 'process 2', - 'process 1', - 'process 4', - 'process 3' - ]); - test.done(); - }, 200); -}; - -exports['memoize'] = function (test) { - test.expect(4); - var call_order = []; - - var fn = function (arg1, arg2, callback) { - call_order.push(['fn', arg1, arg2]); - callback(null, arg1 + arg2); - }; - - var fn2 = async.memoize(fn); - fn2(1, 2, function (err, result) { - test.equal(result, 3); - }); - fn2(1, 2, function (err, result) { - test.equal(result, 3); - }); - fn2(2, 2, function (err, result) { - test.equal(result, 4); - }); - - test.same(call_order, [['fn',1,2], ['fn',2,2]]); - test.done(); -}; - -exports['memoize error'] = function (test) { - test.expect(1); - var testerr = new Error('test'); - var fn = function (arg1, arg2, callback) { - callback(testerr, arg1 + arg2); - }; - async.memoize(fn)(1, 2, function (err, result) { - test.equal(err, testerr); - }); - test.done(); -}; - -exports['memoize custom hash function'] = function (test) { - test.expect(2); - var testerr = new Error('test'); - - var fn = function (arg1, arg2, callback) { - callback(testerr, arg1 + arg2); - }; - var fn2 = async.memoize(fn, function () { - return 'custom hash'; - }); - fn2(1, 2, function (err, result) { - test.equal(result, 3); - }); - fn2(2, 2, function (err, result) { - test.equal(result, 3); - }); - test.done(); -}; - -// Issue 10 on github: https://github.com/caolan/async/issues#issue/10 -exports['falsy return values in series'] = function (test) { - function taskFalse(callback) { - async.nextTick(function() { - callback(null, false); - }); - }; - function taskUndefined(callback) { - async.nextTick(function() { - callback(null, undefined); - }); - }; - function taskEmpty(callback) { - async.nextTick(function() { - callback(null); - }); - }; - function taskNull(callback) { - async.nextTick(function() { - callback(null, null); - }); - }; - async.series( - [taskFalse, taskUndefined, taskEmpty, taskNull], - function(err, results) { - test.same(results, [false, undefined, undefined, null]); - test.strictEqual(results[0], false); - test.strictEqual(results[1], undefined); - test.strictEqual(results[2], undefined); - test.strictEqual(results[3], null); - test.done(); - } - ); -}; - -// Issue 10 on github: https://github.com/caolan/async/issues#issue/10 -exports['falsy return values in parallel'] = function (test) { - function taskFalse(callback) { - async.nextTick(function() { - callback(null, false); - }); - }; - function taskUndefined(callback) { - async.nextTick(function() { - callback(null, undefined); - }); - }; - function taskEmpty(callback) { - async.nextTick(function() { - callback(null); - }); - }; - function taskNull(callback) { - async.nextTick(function() { - callback(null, null); - }); - }; - async.parallel( - [taskFalse, taskUndefined, taskEmpty, taskNull], - function(err, results) { - test.same(results, [false, undefined, undefined, null]); - test.strictEqual(results[0], false); - test.strictEqual(results[1], undefined); - test.strictEqual(results[2], undefined); - test.strictEqual(results[3], null); - test.done(); - } - ); -}; - -exports['queue events'] = function(test) { - var calls = []; - var q = async.queue(function(task, cb) { - // nop - calls.push('process ' + task); - cb(); - }, 3); - - q.saturated = function() { - test.ok(q.length() == 3, 'queue should be saturated now'); - calls.push('saturated'); - }; - q.empty = function() { - test.ok(q.length() == 0, 'queue should be empty now'); - calls.push('empty'); - }; - q.drain = function() { - test.ok( - q.length() == 0 && q.running() == 0, - 'queue should be empty now and no more workers should be running' - ); - calls.push('drain'); - test.same(calls, [ - 'saturated', - 'process foo', - 'foo cb', - 'process bar', - 'bar cb', - 'process zoo', - 'zoo cb', - 'process poo', - 'poo cb', - 'empty', - 'process moo', - 'moo cb', - 'drain', - ]); - test.done(); - }; - q.push('foo', function () {calls.push('foo cb');}); - q.push('bar', function () {calls.push('bar cb');}); - q.push('zoo', function () {calls.push('zoo cb');}); - q.push('poo', function () {calls.push('poo cb');}); - q.push('moo', function () {calls.push('moo cb');}); -}; diff --git a/node_modules/request/node_modules/form-data/node_modules/async/test/test.html b/node_modules/request/node_modules/form-data/node_modules/async/test/test.html deleted file mode 100644 index 2450e2d..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/async/test/test.html +++ /dev/null @@ -1,24 +0,0 @@ - - - Async.js Test Suite - - - - - - - - -

        Async.js Test Suite

        - - - diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/.npmignore b/node_modules/request/node_modules/form-data/node_modules/combined-stream/.npmignore deleted file mode 100644 index aba34f0..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -*.un~ -/node_modules -/test/tmp diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/License b/node_modules/request/node_modules/form-data/node_modules/combined-stream/License deleted file mode 100644 index 4804b7a..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/License +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011 Debuggable Limited - -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/node_modules/request/node_modules/form-data/node_modules/combined-stream/Makefile b/node_modules/request/node_modules/form-data/node_modules/combined-stream/Makefile deleted file mode 100644 index b4ff85a..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -SHELL := /bin/bash - -test: - @./test/run.js - -.PHONY: test - diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md b/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md deleted file mode 100644 index 1a9999e..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md +++ /dev/null @@ -1,132 +0,0 @@ -# combined-stream - -A stream that emits multiple other streams one after another. - -## Installation - -``` bash -npm install combined-stream -``` - -## Usage - -Here is a simple example that shows how you can use combined-stream to combine -two files into one: - -``` javascript -var CombinedStream = require('combined-stream'); -var fs = require('fs'); - -var combinedStream = CombinedStream.create(); -combinedStream.append(fs.createReadStream('file1.txt')); -combinedStream.append(fs.createReadStream('file2.txt')); - -combinedStream.pipe(fs.createWriteStream('combined.txt')); -``` - -While the example above works great, it will pause all source streams until -they are needed. If you don't want that to happen, you can set `pauseStreams` -to `false`: - -``` javascript -var CombinedStream = require('combined-stream'); -var fs = require('fs'); - -var combinedStream = CombinedStream.create({pauseStreams: false}); -combinedStream.append(fs.createReadStream('file1.txt')); -combinedStream.append(fs.createReadStream('file2.txt')); - -combinedStream.pipe(fs.createWriteStream('combined.txt')); -``` - -However, what if you don't have all the source streams yet, or you don't want -to allocate the resources (file descriptors, memory, etc.) for them right away? -Well, in that case you can simply provide a callback that supplies the stream -by calling a `next()` function: - -``` javascript -var CombinedStream = require('combined-stream'); -var fs = require('fs'); - -var combinedStream = CombinedStream.create(); -combinedStream.append(function(next) { - next(fs.createReadStream('file1.txt')); -}); -combinedStream.append(function(next) { - next(fs.createReadStream('file2.txt')); -}); - -combinedStream.pipe(fs.createWriteStream('combined.txt')); -``` - -## API - -### CombinedStream.create([options]) - -Returns a new combined stream object. Available options are: - -* `maxDataSize` -* `pauseStreams` - -The effect of those options is described below. - -### combinedStream.pauseStreams = true - -Whether to apply back pressure to the underlaying streams. If set to `false`, -the underlaying streams will never be paused. If set to `true`, the -underlaying streams will be paused right after being appended, as well as when -`delayedStream.pipe()` wants to throttle. - -### combinedStream.maxDataSize = 2 * 1024 * 1024 - -The maximum amount of bytes (or characters) to buffer for all source streams. -If this value is exceeded, `combinedStream` emits an `'error'` event. - -### combinedStream.dataSize = 0 - -The amount of bytes (or characters) currently buffered by `combinedStream`. - -### combinedStream.append(stream) - -Appends the given `stream` to the combinedStream object. If `pauseStreams` is -set to `true, this stream will also be paused right away. - -`streams` can also be a function that takes one parameter called `next`. `next` -is a function that must be invoked in order to provide the `next` stream, see -example above. - -Regardless of how the `stream` is appended, combined-stream always attaches an -`'error'` listener to it, so you don't have to do that manually. - -Special case: `stream` can also be a String or Buffer. - -### combinedStream.write(data) - -You should not call this, `combinedStream` takes care of piping the appended -streams into itself for you. - -### combinedStream.resume() - -Causes `combinedStream` to start drain the streams it manages. The function is -idempotent, and also emits a `'resume'` event each time which usually goes to -the stream that is currently being drained. - -### combinedStream.pause(); - -If `combinedStream.pauseStreams` is set to `false`, this does nothing. -Otherwise a `'pause'` event is emitted, this goes to the stream that is -currently being drained, so you can use it to apply back pressure. - -### combinedStream.end(); - -Sets `combinedStream.writable` to false, emits an `'end'` event, and removes -all streams from the queue. - -### combinedStream.destroy(); - -Same as `combinedStream.end()`, except it emits a `'close'` event instead of -`'end'`. - -## License - -combined-stream is licensed under the MIT license. diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js deleted file mode 100644 index 03754e6..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js +++ /dev/null @@ -1,183 +0,0 @@ -var util = require('util'); -var Stream = require('stream').Stream; -var DelayedStream = require('delayed-stream'); - -module.exports = CombinedStream; -function CombinedStream() { - this.writable = false; - this.readable = true; - this.dataSize = 0; - this.maxDataSize = 2 * 1024 * 1024; - this.pauseStreams = true; - - this._released = false; - this._streams = []; - this._currentStream = null; -} -util.inherits(CombinedStream, Stream); - -CombinedStream.create = function(options) { - var combinedStream = new this(); - - options = options || {}; - for (var option in options) { - combinedStream[option] = options[option]; - } - - return combinedStream; -}; - -CombinedStream.isStreamLike = function(stream) { - return (typeof stream !== 'function') - && (typeof stream !== 'string') - && (!Buffer.isBuffer(stream)); -}; - -CombinedStream.prototype.append = function(stream) { - var isStreamLike = CombinedStream.isStreamLike(stream); - - if (isStreamLike) { - if (!(stream instanceof DelayedStream)) { - stream.on('data', this._checkDataSize.bind(this)); - - stream = DelayedStream.create(stream, { - maxDataSize: Infinity, - pauseStream: this.pauseStreams, - }); - } - - this._handleErrors(stream); - - if (this.pauseStreams) { - stream.pause(); - } - } - - this._streams.push(stream); - return this; -}; - -CombinedStream.prototype.pipe = function(dest, options) { - Stream.prototype.pipe.call(this, dest, options); - this.resume(); -}; - -CombinedStream.prototype._getNext = function() { - this._currentStream = null; - var stream = this._streams.shift(); - - - if (!stream) { - this.end(); - return; - } - - if (typeof stream !== 'function') { - this._pipeNext(stream); - return; - } - - var getStream = stream; - getStream(function(stream) { - var isStreamLike = CombinedStream.isStreamLike(stream); - if (isStreamLike) { - stream.on('data', this._checkDataSize.bind(this)); - this._handleErrors(stream); - } - - this._pipeNext(stream); - }.bind(this)); -}; - -CombinedStream.prototype._pipeNext = function(stream) { - this._currentStream = stream; - - var isStreamLike = CombinedStream.isStreamLike(stream); - if (isStreamLike) { - stream.on('end', this._getNext.bind(this)) - stream.pipe(this, {end: false}); - return; - } - - var value = stream; - this.write(value); - this._getNext(); -}; - -CombinedStream.prototype._handleErrors = function(stream) { - var self = this; - stream.on('error', function(err) { - self._emitError(err); - }); -}; - -CombinedStream.prototype.write = function(data) { - this.emit('data', data); -}; - -CombinedStream.prototype.pause = function() { - if (!this.pauseStreams) { - return; - } - - this.emit('pause'); -}; - -CombinedStream.prototype.resume = function() { - if (!this._released) { - this._released = true; - this.writable = true; - this._getNext(); - } - - this.emit('resume'); -}; - -CombinedStream.prototype.end = function() { - this._reset(); - this.emit('end'); -}; - -CombinedStream.prototype.destroy = function() { - this._reset(); - this.emit('close'); -}; - -CombinedStream.prototype._reset = function() { - this.writable = false; - this._streams = []; - this._currentStream = null; -}; - -CombinedStream.prototype._checkDataSize = function() { - this._updateDataSize(); - if (this.dataSize <= this.maxDataSize) { - return; - } - - var message = - 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.' - this._emitError(new Error(message)); -}; - -CombinedStream.prototype._updateDataSize = function() { - this.dataSize = 0; - - var self = this; - this._streams.forEach(function(stream) { - if (!stream.dataSize) { - return; - } - - self.dataSize += stream.dataSize; - }); - - if (this._currentStream && this._currentStream.dataSize) { - this.dataSize += this._currentStream.dataSize; - } -}; - -CombinedStream.prototype._emitError = function(err) { - this._reset(); - this.emit('error', err); -}; diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore deleted file mode 100644 index 2fedb26..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -*.un~ -/node_modules/* diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License deleted file mode 100644 index 4804b7a..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2011 Debuggable Limited - -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/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile deleted file mode 100644 index b4ff85a..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -SHELL := /bin/bash - -test: - @./test/run.js - -.PHONY: test - diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md deleted file mode 100644 index 5cb5b35..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md +++ /dev/null @@ -1,154 +0,0 @@ -# delayed-stream - -Buffers events from a stream until you are ready to handle them. - -## Installation - -``` bash -npm install delayed-stream -``` - -## Usage - -The following example shows how to write a http echo server that delays its -response by 1000 ms. - -``` javascript -var DelayedStream = require('delayed-stream'); -var http = require('http'); - -http.createServer(function(req, res) { - var delayed = DelayedStream.create(req); - - setTimeout(function() { - res.writeHead(200); - delayed.pipe(res); - }, 1000); -}); -``` - -If you are not using `Stream#pipe`, you can also manually release the buffered -events by calling `delayedStream.resume()`: - -``` javascript -var delayed = DelayedStream.create(req); - -setTimeout(function() { - // Emit all buffered events and resume underlaying source - delayed.resume(); -}, 1000); -``` - -## Implementation - -In order to use this meta stream properly, here are a few things you should -know about the implementation. - -### Event Buffering / Proxying - -All events of the `source` stream are hijacked by overwriting the `source.emit` -method. Until node implements a catch-all event listener, this is the only way. - -However, delayed-stream still continues to emit all events it captures on the -`source`, regardless of whether you have released the delayed stream yet or -not. - -Upon creation, delayed-stream captures all `source` events and stores them in -an internal event buffer. Once `delayedStream.release()` is called, all -buffered events are emitted on the `delayedStream`, and the event buffer is -cleared. After that, delayed-stream merely acts as a proxy for the underlaying -source. - -### Error handling - -Error events on `source` are buffered / proxied just like any other events. -However, `delayedStream.create` attaches a no-op `'error'` listener to the -`source`. This way you only have to handle errors on the `delayedStream` -object, rather than in two places. - -### Buffer limits - -delayed-stream provides a `maxDataSize` property that can be used to limit -the amount of data being buffered. In order to protect you from bad `source` -streams that don't react to `source.pause()`, this feature is enabled by -default. - -## API - -### DelayedStream.create(source, [options]) - -Returns a new `delayedStream`. Available options are: - -* `pauseStream` -* `maxDataSize` - -The description for those properties can be found below. - -### delayedStream.source - -The `source` stream managed by this object. This is useful if you are -passing your `delayedStream` around, and you still want to access properties -on the `source` object. - -### delayedStream.pauseStream = true - -Whether to pause the underlaying `source` when calling -`DelayedStream.create()`. Modifying this property afterwards has no effect. - -### delayedStream.maxDataSize = 1024 * 1024 - -The amount of data to buffer before emitting an `error`. - -If the underlaying source is emitting `Buffer` objects, the `maxDataSize` -refers to bytes. - -If the underlaying source is emitting JavaScript strings, the size refers to -characters. - -If you know what you are doing, you can set this property to `Infinity` to -disable this feature. You can also modify this property during runtime. - -### delayedStream.maxDataSize = 1024 * 1024 - -The amount of data to buffer before emitting an `error`. - -If the underlaying source is emitting `Buffer` objects, the `maxDataSize` -refers to bytes. - -If the underlaying source is emitting JavaScript strings, the size refers to -characters. - -If you know what you are doing, you can set this property to `Infinity` to -disable this feature. - -### delayedStream.dataSize = 0 - -The amount of data buffered so far. - -### delayedStream.readable - -An ECMA5 getter that returns the value of `source.readable`. - -### delayedStream.resume() - -If the `delayedStream` has not been released so far, `delayedStream.release()` -is called. - -In either case, `source.resume()` is called. - -### delayedStream.pause() - -Calls `source.pause()`. - -### delayedStream.pipe(dest) - -Calls `delayedStream.resume()` and then proxies the arguments to `source.pipe`. - -### delayedStream.release() - -Emits and clears all events that have been buffered up so far. This does not -resume the underlaying source, use `delayedStream.resume()` instead. - -## License - -delayed-stream is licensed under the MIT license. diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js deleted file mode 100644 index 7c10d48..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js +++ /dev/null @@ -1,99 +0,0 @@ -var Stream = require('stream').Stream; -var util = require('util'); - -module.exports = DelayedStream; -function DelayedStream() { - this.source = null; - this.dataSize = 0; - this.maxDataSize = 1024 * 1024; - this.pauseStream = true; - - this._maxDataSizeExceeded = false; - this._released = false; - this._bufferedEvents = []; -} -util.inherits(DelayedStream, Stream); - -DelayedStream.create = function(source, options) { - var delayedStream = new this(); - - options = options || {}; - for (var option in options) { - delayedStream[option] = options[option]; - } - - delayedStream.source = source; - - var realEmit = source.emit; - source.emit = function() { - delayedStream._handleEmit(arguments); - return realEmit.apply(source, arguments); - }; - - source.on('error', function() {}); - if (delayedStream.pauseStream) { - source.pause(); - } - - return delayedStream; -}; - -DelayedStream.prototype.__defineGetter__('readable', function() { - return this.source.readable; -}); - -DelayedStream.prototype.resume = function() { - if (!this._released) { - this.release(); - } - - this.source.resume(); -}; - -DelayedStream.prototype.pause = function() { - this.source.pause(); -}; - -DelayedStream.prototype.release = function() { - this._released = true; - - this._bufferedEvents.forEach(function(args) { - this.emit.apply(this, args); - }.bind(this)); - this._bufferedEvents = []; -}; - -DelayedStream.prototype.pipe = function() { - var r = Stream.prototype.pipe.apply(this, arguments); - this.resume(); - return r; -}; - -DelayedStream.prototype._handleEmit = function(args) { - if (this._released) { - this.emit.apply(this, args); - return; - } - - if (args[0] === 'data') { - this.dataSize += args[1].length; - this._checkIfMaxDataSizeExceeded(); - } - - this._bufferedEvents.push(args); -}; - -DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() { - if (this._maxDataSizeExceeded) { - return; - } - - if (this.dataSize <= this.maxDataSize) { - return; - } - - this._maxDataSizeExceeded = true; - var message = - 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.' - this.emit('error', new Error(message)); -}; diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json deleted file mode 100644 index d394b92..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "author": { - "name": "Felix Geisendörfer", - "email": "felix@debuggable.com", - "url": "http://debuggable.com/" - }, - "name": "delayed-stream", - "description": "Buffers events from a stream until you are ready to handle them.", - "version": "0.0.5", - "homepage": "https://github.com/felixge/node-delayed-stream", - "repository": { - "type": "git", - "url": "git://github.com/felixge/node-delayed-stream.git" - }, - "main": "./lib/delayed_stream", - "engines": { - "node": ">=0.4.0" - }, - "dependencies": {}, - "devDependencies": { - "fake": "0.2.0", - "far": "0.0.1" - }, - "_npmUser": { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - "_id": "delayed-stream@0.0.5", - "optionalDependencies": {}, - "_engineSupported": true, - "_npmVersion": "1.1.24", - "_nodeVersion": "v0.8.1", - "_defaultsLoaded": true, - "dist": { - "shasum": "56f46a53506f656e1a549c63d8794c6cf8b6e1fc" - }, - "_from": "delayed-stream@0.0.5" -} diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js deleted file mode 100644 index 4d71b8a..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js +++ /dev/null @@ -1,6 +0,0 @@ -var common = module.exports; - -common.DelayedStream = require('..'); -common.assert = require('assert'); -common.fake = require('fake'); -common.PORT = 49252; diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js deleted file mode 100644 index 9ecad5b..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js +++ /dev/null @@ -1,38 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var DelayedStream = common.DelayedStream; -var http = require('http'); - -var UPLOAD = new Buffer(10 * 1024 * 1024); - -var server = http.createServer(function(req, res) { - var delayed = DelayedStream.create(req, {maxDataSize: UPLOAD.length}); - - setTimeout(function() { - res.writeHead(200); - delayed.pipe(res); - }, 10); -}); -server.listen(common.PORT, function() { - var request = http.request({ - method: 'POST', - port: common.PORT, - }); - - request.write(UPLOAD); - request.end(); - - request.on('response', function(res) { - var received = 0; - res - .on('data', function(chunk) { - received += chunk.length; - }) - .on('end', function() { - assert.equal(received, UPLOAD.length); - server.close(); - }); - }); -}); - - diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js deleted file mode 100644 index 6f417f3..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js +++ /dev/null @@ -1,21 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testAutoPause() { - var source = new Stream(); - - fake.expect(source, 'pause', 1); - var delayedStream = DelayedStream.create(source); - fake.verify(); -})(); - -(function testDisableAutoPause() { - var source = new Stream(); - fake.expect(source, 'pause', 0); - - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - fake.verify(); -})(); diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js deleted file mode 100644 index b50c397..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js +++ /dev/null @@ -1,14 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testDelayEventsUntilResume() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - - fake.expect(source, 'pause'); - delayedStream.pause(); - fake.verify(); -})(); diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js deleted file mode 100644 index fc4047e..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js +++ /dev/null @@ -1,48 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testDelayEventsUntilResume() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - - // delayedStream must not emit until we resume - fake.expect(delayedStream, 'emit', 0); - - // but our original source must emit - var params = []; - source.on('foo', function(param) { - params.push(param); - }); - - source.emit('foo', 1); - source.emit('foo', 2); - - // Make sure delayedStream did not emit, and source did - assert.deepEqual(params, [1, 2]); - fake.verify(); - - // After resume, delayedStream must playback all events - fake - .stub(delayedStream, 'emit') - .times(Infinity) - .withArg(1, 'newListener'); - fake.expect(delayedStream, 'emit', ['foo', 1]); - fake.expect(delayedStream, 'emit', ['foo', 2]); - fake.expect(source, 'resume'); - - delayedStream.resume(); - fake.verify(); - - // Calling resume again will delegate to source - fake.expect(source, 'resume'); - delayedStream.resume(); - fake.verify(); - - // Emitting more events directly leads to them being emitted - fake.expect(delayedStream, 'emit', ['foo', 3]); - source.emit('foo', 3); - fake.verify(); -})(); diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js deleted file mode 100644 index a9d35e7..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js +++ /dev/null @@ -1,15 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testHandleSourceErrors() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - - // We deal with this by attaching a no-op listener to 'error' on the source - // when creating a new DelayedStream. This way error events on the source - // won't throw. - source.emit('error', new Error('something went wrong')); -})(); diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js deleted file mode 100644 index 7638a2b..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js +++ /dev/null @@ -1,18 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testMaxDataSize() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {maxDataSize: 1024, pauseStream: false}); - - source.emit('data', new Buffer(1024)); - - fake - .expect(delayedStream, 'emit') - .withArg(1, 'error'); - source.emit('data', new Buffer(1)); - fake.verify(); -})(); diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js deleted file mode 100644 index 7d312ab..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js +++ /dev/null @@ -1,13 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testPipeReleases() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - - fake.expect(delayedStream, 'resume'); - delayedStream.pipe(new Stream()); -})(); diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js deleted file mode 100644 index d436163..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js +++ /dev/null @@ -1,13 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var fake = common.fake.create(); -var DelayedStream = common.DelayedStream; -var Stream = require('stream').Stream; - -(function testProxyReadableProperty() { - var source = new Stream(); - var delayedStream = DelayedStream.create(source, {pauseStream: false}); - - source.readable = fake.value('source.readable'); - assert.strictEqual(delayedStream.readable, source.readable); -})(); diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js deleted file mode 100755 index 0bb8e82..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node -var far = require('far').create(); - -far.add(__dirname); -far.include(/test-.*\.js$/); - -far.execute(); diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json b/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json deleted file mode 100644 index 7bb0fcf..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "author": { - "name": "Felix Geisendörfer", - "email": "felix@debuggable.com", - "url": "http://debuggable.com/" - }, - "name": "combined-stream", - "description": "A stream that emits multiple other streams one after another.", - "version": "0.0.3", - "homepage": "https://github.com/felixge/node-combined-stream", - "repository": { - "type": "git", - "url": "git://github.com/felixge/node-combined-stream.git" - }, - "main": "./lib/combined_stream", - "engines": { - "node": "*" - }, - "dependencies": { - "delayed-stream": "0.0.5" - }, - "devDependencies": { - "far": "0.0.1" - }, - "_npmUser": { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - "_id": "combined-stream@0.0.3", - "optionalDependencies": {}, - "_engineSupported": true, - "_npmVersion": "1.1.24", - "_nodeVersion": "v0.8.1", - "_defaultsLoaded": true, - "dist": { - "shasum": "c41c9899277b587901bb6ce4bf458b94693afafa" - }, - "_from": "combined-stream@0.0.3" -} diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/common.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/common.js deleted file mode 100644 index aa9ab3a..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/common.js +++ /dev/null @@ -1,12 +0,0 @@ -var common = module.exports; - -var path = require('path'); -var root = path.join(__dirname, '..'); - -common.dir = { - fixture: root + '/test/fixture', - tmp: root + '/test/tmp', -}; - -common.CombinedStream = require(root); -common.assert = require('assert'); diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file1.txt b/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file1.txt deleted file mode 100644 index 50e0218..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file1.txt +++ /dev/null @@ -1,256 +0,0 @@ -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 -10101010101010101010101010101010101010101010101010101010101010101010101010101010 -01010101010101010101010101010101010101010101010101010101010101010101010101010101 diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file2.txt b/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file2.txt deleted file mode 100644 index da1d821..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/fixture/file2.txt +++ /dev/null @@ -1,256 +0,0 @@ -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 -20202020202020202020202020202020202020202020202020202020202020202020202020202020 -02020202020202020202020202020202020202020202020202020202020202020202020202020202 diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-callback-streams.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-callback-streams.js deleted file mode 100644 index 44ecaba..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-callback-streams.js +++ /dev/null @@ -1,27 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; -var fs = require('fs'); - -var FILE1 = common.dir.fixture + '/file1.txt'; -var FILE2 = common.dir.fixture + '/file2.txt'; -var EXPECTED = fs.readFileSync(FILE1) + fs.readFileSync(FILE2); - -(function testDelayedStreams() { - var combinedStream = CombinedStream.create(); - combinedStream.append(function(next) { - next(fs.createReadStream(FILE1)); - }); - combinedStream.append(function(next) { - next(fs.createReadStream(FILE2)); - }); - - var tmpFile = common.dir.tmp + '/combined.txt'; - var dest = fs.createWriteStream(tmpFile); - combinedStream.pipe(dest); - - dest.on('end', function() { - var written = fs.readFileSync(tmpFile, 'utf8'); - assert.strictEqual(written, EXPECTED); - }); -})(); diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-data-size.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-data-size.js deleted file mode 100644 index e3fbd18..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-data-size.js +++ /dev/null @@ -1,34 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; - -(function testDataSizeGetter() { - var combinedStream = CombinedStream.create(); - - assert.strictEqual(combinedStream.dataSize, 0); - - // Test one stream - combinedStream._streams.push({dataSize: 10}); - combinedStream._updateDataSize(); - assert.strictEqual(combinedStream.dataSize, 10); - - // Test two streams - combinedStream._streams.push({dataSize: 23}); - combinedStream._updateDataSize(); - assert.strictEqual(combinedStream.dataSize, 33); - - // Test currentStream - combinedStream._currentStream = {dataSize: 20}; - combinedStream._updateDataSize(); - assert.strictEqual(combinedStream.dataSize, 53); - - // Test currentStream without dataSize - combinedStream._currentStream = {}; - combinedStream._updateDataSize(); - assert.strictEqual(combinedStream.dataSize, 33); - - // Test stream function - combinedStream._streams.push(function() {}); - combinedStream._updateDataSize(); - assert.strictEqual(combinedStream.dataSize, 33); -})(); diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js deleted file mode 100644 index c678575..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams-and-buffers-and-strings.js +++ /dev/null @@ -1,38 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; -var fs = require('fs'); - -var FILE1 = common.dir.fixture + '/file1.txt'; -var BUFFER = new Buffer('Bacon is delicious'); -var FILE2 = common.dir.fixture + '/file2.txt'; -var STRING = 'The € kicks the $\'s ass!'; - -var EXPECTED = - fs.readFileSync(FILE1) - + BUFFER - + fs.readFileSync(FILE2) - + STRING; -var GOT; - -(function testDelayedStreams() { - var combinedStream = CombinedStream.create(); - combinedStream.append(fs.createReadStream(FILE1)); - combinedStream.append(BUFFER); - combinedStream.append(fs.createReadStream(FILE2)); - combinedStream.append(function(next) { - next(STRING); - }); - - var tmpFile = common.dir.tmp + '/combined-file1-buffer-file2-string.txt'; - var dest = fs.createWriteStream(tmpFile); - combinedStream.pipe(dest); - - dest.on('close', function() { - GOT = fs.readFileSync(tmpFile, 'utf8'); - }); -})(); - -process.on('exit', function() { - assert.strictEqual(GOT, EXPECTED); -}); diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams.js deleted file mode 100644 index 263cfdf..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-delayed-streams.js +++ /dev/null @@ -1,35 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; -var fs = require('fs'); - -var FILE1 = common.dir.fixture + '/file1.txt'; -var FILE2 = common.dir.fixture + '/file2.txt'; -var EXPECTED = fs.readFileSync(FILE1) + fs.readFileSync(FILE2); -var GOT; - -(function testDelayedStreams() { - var combinedStream = CombinedStream.create(); - combinedStream.append(fs.createReadStream(FILE1)); - combinedStream.append(fs.createReadStream(FILE2)); - - var stream1 = combinedStream._streams[0]; - var stream2 = combinedStream._streams[1]; - - stream1.on('end', function() { - assert.equal(stream2.dataSize, 0); - }); - - var tmpFile = common.dir.tmp + '/combined.txt'; - var dest = fs.createWriteStream(tmpFile); - combinedStream.pipe(dest); - - dest.on('close', function() { - GOT = fs.readFileSync(tmpFile, 'utf8'); - }); -})(); - -process.on('exit', function() { - console.error(GOT.length, EXPECTED.length); - assert.strictEqual(GOT, EXPECTED); -}); diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-max-data-size.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-max-data-size.js deleted file mode 100644 index 25f47a4..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-max-data-size.js +++ /dev/null @@ -1,24 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; -var fs = require('fs'); - -var FILE1 = common.dir.fixture + '/file1.txt'; -var FILE2 = common.dir.fixture + '/file2.txt'; -var EXPECTED = fs.readFileSync(FILE1) + fs.readFileSync(FILE2); - -(function testDelayedStreams() { - var combinedStream = CombinedStream.create({pauseStreams: false, maxDataSize: 20736}); - combinedStream.append(fs.createReadStream(FILE1)); - combinedStream.append(fs.createReadStream(FILE2)); - - var gotErr = null; - combinedStream.on('error', function(err) { - gotErr = err; - }); - - process.on('exit', function() { - assert.ok(gotErr); - assert.ok(gotErr.message.match(/bytes/)); - }); -})(); diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-unpaused-streams.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-unpaused-streams.js deleted file mode 100644 index 30a3a6f..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/integration/test-unpaused-streams.js +++ /dev/null @@ -1,30 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var CombinedStream = common.CombinedStream; -var fs = require('fs'); - -var FILE1 = common.dir.fixture + '/file1.txt'; -var FILE2 = common.dir.fixture + '/file2.txt'; -var EXPECTED = fs.readFileSync(FILE1) + fs.readFileSync(FILE2); - -(function testDelayedStreams() { - var combinedStream = CombinedStream.create({pauseStreams: false}); - combinedStream.append(fs.createReadStream(FILE1)); - combinedStream.append(fs.createReadStream(FILE2)); - - var stream1 = combinedStream._streams[0]; - var stream2 = combinedStream._streams[1]; - - stream1.on('end', function() { - assert.ok(stream2.dataSize > 0); - }); - - var tmpFile = common.dir.tmp + '/combined.txt'; - var dest = fs.createWriteStream(tmpFile); - combinedStream.pipe(dest); - - dest.on('end', function() { - var written = fs.readFileSync(tmpFile, 'utf8'); - assert.strictEqual(written, EXPECTED); - }); -})(); diff --git a/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/run.js b/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/run.js deleted file mode 100755 index 0bb8e82..0000000 --- a/node_modules/request/node_modules/form-data/node_modules/combined-stream/test/run.js +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node -var far = require('far').create(); - -far.add(__dirname); -far.include(/test-.*\.js$/); - -far.execute(); diff --git a/node_modules/request/node_modules/form-data/package.json b/node_modules/request/node_modules/form-data/package.json deleted file mode 100644 index 1948a5e..0000000 --- a/node_modules/request/node_modules/form-data/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "author": { - "name": "Felix Geisendörfer", - "email": "felix@debuggable.com", - "url": "http://debuggable.com/" - }, - "name": "form-data", - "description": "A module to create readable `\"multipart/form-data\"` streams. Can be used to submit forms and file uploads to other web applications.", - "version": "0.0.3", - "repository": { - "type": "git", - "url": "git://github.com/felixge/node-form-data.git" - }, - "main": "./lib/form_data", - "engines": { - "node": "*" - }, - "dependencies": { - "combined-stream": "0.0.3", - "mime": "~1.2.2", - "async": "~0.1.9" - }, - "devDependencies": { - "fake": "0.2.1", - "far": "0.0.1", - "formidable": "1.0.2", - "request": "~2.9.203" - }, - "_npmUser": { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - "_id": "form-data@0.0.3", - "optionalDependencies": {}, - "_engineSupported": true, - "_npmVersion": "1.1.24", - "_nodeVersion": "v0.8.1", - "_defaultsLoaded": true, - "dist": { - "shasum": "6eea17b45790b42d779a1d581d1b3600fe0c7c0d" - }, - "_from": "form-data" -} diff --git a/node_modules/request/node_modules/form-data/test/common.js b/node_modules/request/node_modules/form-data/test/common.js deleted file mode 100644 index 8a26482..0000000 --- a/node_modules/request/node_modules/form-data/test/common.js +++ /dev/null @@ -1,14 +0,0 @@ -var common = module.exports; -var path = require('path'); - -var rootDir = path.join(__dirname, '..'); -common.dir = { - lib: rootDir + '/lib', - fixture: rootDir + '/test/fixture', - tmp: rootDir + '/test/tmp', -}; - -common.assert = require('assert'); -common.fake = require('fake'); - -common.port = 8432; diff --git a/node_modules/request/node_modules/form-data/test/fixture/bacon.txt b/node_modules/request/node_modules/form-data/test/fixture/bacon.txt deleted file mode 100644 index 9804bbd..0000000 --- a/node_modules/request/node_modules/form-data/test/fixture/bacon.txt +++ /dev/null @@ -1 +0,0 @@ -Bacon is delicious. diff --git a/node_modules/request/node_modules/form-data/test/fixture/unicycle.jpg b/node_modules/request/node_modules/form-data/test/fixture/unicycle.jpg deleted file mode 100644 index 7cea4dd71dc41cd51c84bfcec6b3e65c15a58507..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19806 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 diff --git a/node_modules/request/node_modules/form-data/test/integration/test-form-get-length.js b/node_modules/request/node_modules/form-data/test/integration/test-form-get-length.js deleted file mode 100644 index 44d3b4d..0000000 --- a/node_modules/request/node_modules/form-data/test/integration/test-form-get-length.js +++ /dev/null @@ -1,93 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var FormData = require(common.dir.lib + '/form_data'); -var fake = require('fake').create(); -var fs = require('fs'); - -(function testEmptyForm() { - var form = new FormData(); - var callback = fake.callback(arguments.callee.name + '-getLength'); - var calls = fake.expectAnytime(callback, [null, 0]).calls; - - form.getLength(callback); - - // Make sure our response is async - assert.strictEqual(calls.length, 0); -})(); - -(function testUtf8String() { - var FIELD = 'my_field'; - var VALUE = 'May the € be with you'; - - var form = new FormData(); - form.append(FIELD, VALUE); - var callback = fake.callback(arguments.callee.name + '-getLength'); - - var expectedLength = - form._overheadLength + - Buffer.byteLength(VALUE) + - form._lastBoundary().length; - - fake.expectAnytime(callback, [null, expectedLength]); - form.getLength(callback); -})(); - -(function testBuffer() { - var FIELD = 'my_field'; - var VALUE = new Buffer(23); - - var form = new FormData(); - form.append(FIELD, VALUE); - var callback = fake.callback(arguments.callee.name + '-getLength'); - - var expectedLength = - form._overheadLength + - VALUE.length + - form._lastBoundary().length; - - fake.expectAnytime(callback, [null, expectedLength]); - form.getLength(callback); -})(); - - -(function testStringFileBufferFile() { - var fields = [ - { - name: 'my_field', - value: 'Test 123', - }, - { - name: 'my_image', - value: fs.createReadStream(common.dir.fixture + '/unicycle.jpg'), - }, - { - name: 'my_buffer', - value: new Buffer('123'), - }, - { - name: 'my_txt', - value: fs.createReadStream(common.dir.fixture + '/bacon.txt'), - }, - ]; - - var form = new FormData(); - var expectedLength = 0; - - fields.forEach(function(field) { - form.append(field.name, field.value); - if (field.value.path) { - var stat = fs.statSync(field.value.path); - expectedLength += stat.size; - } else { - expectedLength += field.value.length; - } - }); - - expectedLength += form._overheadLength + form._lastBoundary().length; - - var callback = fake.callback(arguments.callee.name + '-getLength'); - fake.expectAnytime(callback, [null, expectedLength]); - form.getLength(callback); -})(); - - diff --git a/node_modules/request/node_modules/form-data/test/integration/test-get-boundary.js b/node_modules/request/node_modules/form-data/test/integration/test-get-boundary.js deleted file mode 100644 index 6dc2fb2..0000000 --- a/node_modules/request/node_modules/form-data/test/integration/test-get-boundary.js +++ /dev/null @@ -1,18 +0,0 @@ -var common = require('../common'); -var assert = common.assert; - -var FormData = require(common.dir.lib + '/form_data'); - -(function testOneBoundaryPerForm() { - var form = new FormData(); - var boundary = form.getBoundary(); - - assert.equal(boundary, form.getBoundary()); - assert.equal(boundary.length, 50); -})(); - -(function testUniqueBoundaryPerForm() { - var formA = new FormData(); - var formB = new FormData(); - assert.notEqual(formA.getBoundary(), formB.getBoundary()); -})(); diff --git a/node_modules/request/node_modules/form-data/test/integration/test-http-response.js b/node_modules/request/node_modules/form-data/test/integration/test-http-response.js deleted file mode 100644 index 8e183fe..0000000 --- a/node_modules/request/node_modules/form-data/test/integration/test-http-response.js +++ /dev/null @@ -1,121 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var http = require('http'); -var path = require('path'); -var mime = require('mime'); -var request = require('request'); -var parseUrl = require('url').parse; -var fs = require('fs'); -var FormData = require(common.dir.lib + '/form_data'); -var IncomingForm = require('formidable').IncomingForm; - -var remoteFile = 'http://nodejs.org/images/logo.png'; - -var FIELDS; -var server; - -var parsedUrl = parseUrl(remoteFile) - , options = { - method: 'get', - port: parsedUrl.port || 80, - path: parsedUrl.pathname, - host: parsedUrl.hostname - } - ; - -http.request(options, function(res) { - - FIELDS = [ - {name: 'my_field', value: 'my_value'}, - {name: 'my_buffer', value: new Buffer([1, 2, 3])}, - {name: 'remote_file', value: res } - ]; - - var form = new FormData(); - FIELDS.forEach(function(field) { - form.append(field.name, field.value); - }); - - server.listen(common.port, function() { - - form.submit('http://localhost:' + common.port + '/', function(err, res) { - - if (err) { - throw err; - } - - assert.strictEqual(res.statusCode, 200); - server.close(); - }); - - }); - - -}).end(); - -server = http.createServer(function(req, res) { - - // formidable is broken so let's do it manual way - // - // var form = new IncomingForm(); - // form.uploadDir = common.dir.tmp; - // form.parse(req); - // form - // .on('field', function(name, value) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(value, field.value+''); - // }) - // .on('file', function(name, file) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(file.name, path.basename(field.value.path)); - // // mime.lookup file.NAME == 'my_file' ? - // assert.strictEqual(file.type, mime.lookup(file.name)); - // }) - // .on('end', function() { - // res.writeHead(200); - // res.end('done'); - // }); - - // temp workaround - var data = ''; - req.setEncoding('utf8'); - - req.on('data', function(d) { - data += d; - }); - - req.on('end', function() { - - // check for the fields' traces - - // 1st field : my_field - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 2nd field : my_buffer - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 3rd field : remote_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(remoteFile)+'"') != -1 ); - // check for http://nodejs.org/images/logo.png traces - assert.ok( data.indexOf('ImageReady') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 ); - - res.writeHead(200); - res.end('done'); - - }); - -}); - - -process.on('exit', function() { - assert.strictEqual(FIELDS.length, 0); -}); diff --git a/node_modules/request/node_modules/form-data/test/integration/test-pipe.js b/node_modules/request/node_modules/form-data/test/integration/test-pipe.js deleted file mode 100644 index acc39df..0000000 --- a/node_modules/request/node_modules/form-data/test/integration/test-pipe.js +++ /dev/null @@ -1,111 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var http = require('http'); -var path = require('path'); -var mime = require('mime'); -var request = require('request'); -var fs = require('fs'); -var FormData = require(common.dir.lib + '/form_data'); -var IncomingForm = require('formidable').IncomingForm; - -var remoteFile = 'http://nodejs.org/images/logo.png'; - -var FIELDS = [ - {name: 'my_field', value: 'my_value'}, - {name: 'my_buffer', value: new Buffer([1, 2, 3])}, - {name: 'my_file', value: fs.createReadStream(common.dir.fixture + '/unicycle.jpg')}, - {name: 'remote_file', value: request(remoteFile) } -]; - -var server = http.createServer(function(req, res) { - - // formidable is broken so let's do it manual way - // - // var form = new IncomingForm(); - // form.uploadDir = common.dir.tmp; - // form.parse(req); - // form - // .on('field', function(name, value) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(value, field.value+''); - // }) - // .on('file', function(name, file) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(file.name, path.basename(field.value.path)); - // assert.strictEqual(file.type, mime.lookup(file.name)); - // }) - // .on('end', function() { - // res.writeHead(200); - // res.end('done'); - // }); - - // temp workaround - var data = ''; - req.setEncoding('utf8'); - - req.on('data', function(d) { - data += d; - }); - - req.on('end', function() { - // check for the fields' traces - - // 1st field : my_field - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 2nd field : my_buffer - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 3rd field : my_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for unicycle.jpg traces - assert.ok( data.indexOf('2005:06:21 01:44:12') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(field.value.path) ) != -1 ); - - // 4th field : remote_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for http://nodejs.org/images/logo.png traces - assert.ok( data.indexOf('ImageReady') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 ); - - res.writeHead(200); - res.end('done'); - - }); - - -}); - -server.listen(common.port, function() { - var form = new FormData(); - FIELDS.forEach(function(field) { - form.append(field.name, field.value); - }); - - var request = http.request({ - method: 'post', - port: common.port, - path: '/upload', - headers: form.getHeaders() - }); - - form.pipe(request); - - request.on('response', function(res) { - server.close(); - }); -}); - -process.on('exit', function() { - assert.strictEqual(FIELDS.length, 0); -}); diff --git a/node_modules/request/node_modules/form-data/test/integration/test-submit.js b/node_modules/request/node_modules/form-data/test/integration/test-submit.js deleted file mode 100644 index c40e88f..0000000 --- a/node_modules/request/node_modules/form-data/test/integration/test-submit.js +++ /dev/null @@ -1,107 +0,0 @@ -var common = require('../common'); -var assert = common.assert; -var http = require('http'); -var path = require('path'); -var mime = require('mime'); -var request = require('request'); -var fs = require('fs'); -var FormData = require(common.dir.lib + '/form_data'); -var IncomingForm = require('formidable').IncomingForm; - -var remoteFile = 'http://nodejs.org/images/logo.png'; - -var FIELDS = [ - {name: 'my_field', value: 'my_value'}, - {name: 'my_buffer', value: new Buffer([1, 2, 3])}, - {name: 'my_file', value: fs.createReadStream(common.dir.fixture + '/unicycle.jpg') }, - {name: 'remote_file', value: request(remoteFile) } -]; - -var server = http.createServer(function(req, res) { - - // formidable is broken so let's do it manual way - // - // var form = new IncomingForm(); - // form.uploadDir = common.dir.tmp; - // form.parse(req); - // form - // .on('field', function(name, value) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(value, field.value+''); - // }) - // .on('file', function(name, file) { - // var field = FIELDS.shift(); - // assert.strictEqual(name, field.name); - // assert.strictEqual(file.name, path.basename(field.value.path)); - // // mime.lookup file.NAME == 'my_file' ? - // assert.strictEqual(file.type, mime.lookup(file.name)); - // }) - // .on('end', function() { - // res.writeHead(200); - // res.end('done'); - // }); - - // temp workaround - var data = ''; - req.setEncoding('utf8'); - req.on('data', function(d) { - data += d; - }); - req.on('end', function() { - // check for the fields' traces - - // 1st field : my_field - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 2nd field : my_buffer - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 3rd field : my_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for unicycle.jpg traces - assert.ok( data.indexOf('2005:06:21 01:44:12') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(field.value.path) ) != -1 ); - - // 4th field : remote_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for http://nodejs.org/images/logo.png traces - assert.ok( data.indexOf('ImageReady') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 ); - - res.writeHead(200); - res.end('done'); - - }); - -}); - -server.listen(common.port, function() { - var form = new FormData(); - FIELDS.forEach(function(field) { - form.append(field.name, field.value); - }); - - form.submit('http://localhost:' + common.port + '/', function(err, res) { - - if (err) { - throw err; - } - - assert.strictEqual(res.statusCode, 200); - server.close(); - }); - -}); - -process.on('exit', function() { - assert.strictEqual(FIELDS.length, 0); -}); diff --git a/node_modules/request/node_modules/form-data/test/run.js b/node_modules/request/node_modules/form-data/test/run.js deleted file mode 100755 index 0bb8e82..0000000 --- a/node_modules/request/node_modules/form-data/test/run.js +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env node -var far = require('far').create(); - -far.add(__dirname); -far.include(/test-.*\.js$/); - -far.execute(); diff --git a/node_modules/request/node_modules/mime/LICENSE b/node_modules/request/node_modules/mime/LICENSE deleted file mode 100644 index 451fc45..0000000 --- a/node_modules/request/node_modules/mime/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2010 Benjamin Thomas, Robert Kieffer - -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/node_modules/request/node_modules/mime/README.md b/node_modules/request/node_modules/mime/README.md deleted file mode 100644 index b90552a..0000000 --- a/node_modules/request/node_modules/mime/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# mime - -Comprehensive MIME type mapping API. Includes all 600+ types and 800+ extensions defined by the Apache project, plus additional types submitted by the node.js community. - -## Install - -Install with [npm](http://github.com/isaacs/npm): - - npm install mime - -## API - Queries - -### mime.lookup(path) -Get the mime type associated with a file. Performs a case-insensitive lookup using the extension in `path` (the substring after the last '/' or '.'). E.g. - - var mime = require('mime'); - - mime.lookup('/path/to/file.txt'); // => 'text/plain' - mime.lookup('file.txt'); // => 'text/plain' - mime.lookup('.TXT'); // => 'text/plain' - mime.lookup('htm'); // => 'text/html' - -### mime.extension(type) -Get the default extension for `type` - - mime.extension('text/html'); // => 'html' - mime.extension('application/octet-stream'); // => 'bin' - -### mime.charsets.lookup() - -Map mime-type to charset - - mime.charsets.lookup('text/plain'); // => 'UTF-8' - -(The logic for charset lookups is pretty rudimentary. Feel free to suggest improvements.) - -## API - Defining Custom Types - -The following APIs allow you to add your own type mappings within your project. If you feel a type should be included as part of node-mime, see [requesting new types](https://github.com/broofa/node-mime/wiki/Requesting-New-Types). - -### mime.define() - -Add custom mime/extension mappings - - mime.define({ - 'text/x-some-format': ['x-sf', 'x-sft', 'x-sfml'], - 'application/x-my-type': ['x-mt', 'x-mtt'], - // etc ... - }); - - mime.lookup('x-sft'); // => 'text/x-some-format' - -The first entry in the extensions array is returned by `mime.extension()`. E.g. - - mime.extension('text/x-some-format'); // => 'x-sf' - -### mime.load(filepath) - -Load mappings from an Apache ".types" format file - - mime.load('./my_project.types'); - -The .types file format is simple - See the `types` dir for examples. diff --git a/node_modules/request/node_modules/mime/mime.js b/node_modules/request/node_modules/mime/mime.js deleted file mode 100644 index 1e00585..0000000 --- a/node_modules/request/node_modules/mime/mime.js +++ /dev/null @@ -1,104 +0,0 @@ -var path = require('path'); -var fs = require('fs'); - -function Mime() { - // Map of extension -> mime type - this.types = Object.create(null); - - // Map of mime type -> extension - this.extensions = Object.create(null); -} - -/** - * Define mimetype -> extension mappings. Each key is a mime-type that maps - * to an array of extensions associated with the type. The first extension is - * used as the default extension for the type. - * - * e.g. mime.define({'audio/ogg', ['oga', 'ogg', 'spx']}); - * - * @param map (Object) type definitions - */ -Mime.prototype.define = function (map) { - for (var type in map) { - var exts = map[type]; - - for (var i = 0; i < exts.length; i++) { - this.types[exts[i]] = type; - } - - // Default extension is the first one we encounter - if (!this.extensions[type]) { - this.extensions[type] = exts[0]; - } - } -}; - -/** - * Load an Apache2-style ".types" file - * - * This may be called multiple times (it's expected). Where files declare - * overlapping types/extensions, the last file wins. - * - * @param file (String) path of file to load. - */ -Mime.prototype.load = function(file) { - // Read file and split into lines - var map = {}, - content = fs.readFileSync(file, 'ascii'), - lines = content.split(/[\r\n]+/); - - lines.forEach(function(line) { - // Clean up whitespace/comments, and split into fields - var fields = line.replace(/\s*#.*|^\s*|\s*$/g, '').split(/\s+/); - map[fields.shift()] = fields; - }); - - this.define(map); -}; - -/** - * Lookup a mime type based on extension - */ -Mime.prototype.lookup = function(path, fallback) { - var ext = path.replace(/.*[\.\/]/, '').toLowerCase(); - - return this.types[ext] || fallback || this.default_type; -}; - -/** - * Return file extension associated with a mime type - */ -Mime.prototype.extension = function(mimeType) { - return this.extensions[mimeType]; -}; - -// Default instance -var mime = new Mime(); - -// Load local copy of -// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types -mime.load(path.join(__dirname, 'types/mime.types')); - -// Load additional types from node.js community -mime.load(path.join(__dirname, 'types/node.types')); - -// Default type -mime.default_type = mime.lookup('bin'); - -// -// Additional API specific to the default instance -// - -mime.Mime = Mime; - -/** - * Lookup a charset based on mime type. - */ -mime.charsets = { - lookup: function(mimeType, fallback) { - // Assume text types are utf8 - return (/^text\//).test(mimeType) ? 'UTF-8' : fallback; - } -} - -module.exports = mime; diff --git a/node_modules/request/node_modules/mime/package.json b/node_modules/request/node_modules/mime/package.json deleted file mode 100644 index 06e2ee5..0000000 --- a/node_modules/request/node_modules/mime/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "author": { - "name": "Robert Kieffer", - "email": "robert@broofa.com", - "url": "http://github.com/broofa" - }, - "contributors": [ - { - "name": "Benjamin Thomas", - "email": "benjamin@benjaminthomas.org", - "url": "http://github.com/bentomas" - } - ], - "dependencies": {}, - "description": "A comprehensive library for mime-type mapping", - "devDependencies": {}, - "keywords": [ - "util", - "mime" - ], - "main": "mime.js", - "name": "mime", - "repository": { - "url": "git://github.com/broofa/node-mime.git", - "type": "git" - }, - "version": "1.2.7", - "_npmUser": { - "name": "mikeal", - "email": "mikeal.rogers@gmail.com" - }, - "_id": "mime@1.2.7", - "optionalDependencies": {}, - "engines": { - "node": "*" - }, - "_engineSupported": true, - "_npmVersion": "1.1.24", - "_nodeVersion": "v0.8.1", - "_defaultsLoaded": true, - "_from": "mime" -} diff --git a/node_modules/request/node_modules/mime/test.js b/node_modules/request/node_modules/mime/test.js deleted file mode 100644 index cbad034..0000000 --- a/node_modules/request/node_modules/mime/test.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Usage: node test.js - */ - -var mime = require('./mime'); -var assert = require('assert'); - -function eq(a, b) { - console.log('Test: ' + a + ' === ' + b); - assert.strictEqual.apply(null, arguments); -} - -console.log(Object.keys(mime.extensions).length + ' types'); -console.log(Object.keys(mime.types).length + ' extensions\n'); - -// -// Test mime lookups -// - -eq('text/plain', mime.lookup('text.txt')); -eq('text/plain', mime.lookup('.text.txt')); -eq('text/plain', mime.lookup('.txt')); -eq('text/plain', mime.lookup('txt')); -eq('application/octet-stream', mime.lookup('text.nope')); -eq('fallback', mime.lookup('text.fallback', 'fallback')); -eq('application/octet-stream', mime.lookup('constructor')); -eq('text/plain', mime.lookup('TEXT.TXT')); -eq('text/event-stream', mime.lookup('text/event-stream')); -eq('application/x-web-app-manifest+json', mime.lookup('text.webapp')); - -// -// Test extensions -// - -eq('txt', mime.extension(mime.types.text)); -eq('html', mime.extension(mime.types.htm)); -eq('bin', mime.extension('application/octet-stream')); -eq(undefined, mime.extension('constructor')); - -// -// Test node types -// - -eq('application/octet-stream', mime.lookup('file.buffer')); -eq('audio/mp4', mime.lookup('file.m4a')); - -// -// Test charsets -// - -eq('UTF-8', mime.charsets.lookup('text/plain')); -eq(undefined, mime.charsets.lookup(mime.types.js)); -eq('fallback', mime.charsets.lookup('application/octet-stream', 'fallback')); - -console.log('\nOK'); diff --git a/node_modules/request/node_modules/mime/types/mime.types b/node_modules/request/node_modules/mime/types/mime.types deleted file mode 100644 index b90b165..0000000 --- a/node_modules/request/node_modules/mime/types/mime.types +++ /dev/null @@ -1,1588 +0,0 @@ -# This file maps Internet media types to unique file extension(s). -# Although created for httpd, this file is used by many software systems -# and has been placed in the public domain for unlimited redisribution. -# -# The table below contains both registered and (common) unregistered types. -# A type that has no unique extension can be ignored -- they are listed -# here to guide configurations toward known types and to make it easier to -# identify "new" types. File extensions are also commonly used to indicate -# content languages and encodings, so choose them carefully. -# -# Internet media types should be registered as described in RFC 4288. -# The registry is at . -# -# MIME type (lowercased) Extensions -# ============================================ ========== -# application/1d-interleaved-parityfec -# application/3gpp-ims+xml -# application/activemessage -application/andrew-inset ez -# application/applefile -application/applixware aw -application/atom+xml atom -application/atomcat+xml atomcat -# application/atomicmail -application/atomsvc+xml atomsvc -# application/auth-policy+xml -# application/batch-smtp -# application/beep+xml -# application/calendar+xml -# application/cals-1840 -# application/ccmp+xml -application/ccxml+xml ccxml -application/cdmi-capability cdmia -application/cdmi-container cdmic -application/cdmi-domain cdmid -application/cdmi-object cdmio -application/cdmi-queue cdmiq -# application/cea-2018+xml -# application/cellml+xml -# application/cfw -# application/cnrp+xml -# application/commonground -# application/conference-info+xml -# application/cpl+xml -# application/csta+xml -# application/cstadata+xml -application/cu-seeme cu -# application/cybercash -application/davmount+xml davmount -# application/dca-rft -# application/dec-dx -# application/dialog-info+xml -# application/dicom -# application/dns -application/docbook+xml dbk -# application/dskpp+xml -application/dssc+der dssc -application/dssc+xml xdssc -# application/dvcs -application/ecmascript ecma -# application/edi-consent -# application/edi-x12 -# application/edifact -application/emma+xml emma -# application/epp+xml -application/epub+zip epub -# application/eshop -# application/example -application/exi exi -# application/fastinfoset -# application/fastsoap -# application/fits -application/font-tdpfr pfr -# application/framework-attributes+xml -application/gml+xml gml -application/gpx+xml gpx -application/gxf gxf -# application/h224 -# application/held+xml -# application/http -application/hyperstudio stk -# application/ibe-key-request+xml -# application/ibe-pkg-reply+xml -# application/ibe-pp-data -# application/iges -# application/im-iscomposing+xml -# application/index -# application/index.cmd -# application/index.obj -# application/index.response -# application/index.vnd -application/inkml+xml ink inkml -# application/iotp -application/ipfix ipfix -# application/ipp -# application/isup -application/java-archive jar -application/java-serialized-object ser -application/java-vm class -application/javascript js -application/json json -application/jsonml+json jsonml -# application/kpml-request+xml -# application/kpml-response+xml -application/lost+xml lostxml -application/mac-binhex40 hqx -application/mac-compactpro cpt -# application/macwriteii -application/mads+xml mads -application/marc mrc -application/marcxml+xml mrcx -application/mathematica ma nb mb -# application/mathml-content+xml -# application/mathml-presentation+xml -application/mathml+xml mathml -# application/mbms-associated-procedure-description+xml -# application/mbms-deregister+xml -# application/mbms-envelope+xml -# application/mbms-msk+xml -# application/mbms-msk-response+xml -# application/mbms-protection-description+xml -# application/mbms-reception-report+xml -# application/mbms-register+xml -# application/mbms-register-response+xml -# application/mbms-user-service-description+xml -application/mbox mbox -# application/media_control+xml -application/mediaservercontrol+xml mscml -application/metalink+xml metalink -application/metalink4+xml meta4 -application/mets+xml mets -# application/mikey -application/mods+xml mods -# application/moss-keys -# application/moss-signature -# application/mosskey-data -# application/mosskey-request -application/mp21 m21 mp21 -application/mp4 mp4s -# application/mpeg4-generic -# application/mpeg4-iod -# application/mpeg4-iod-xmt -# application/msc-ivr+xml -# application/msc-mixer+xml -application/msword doc dot -application/mxf mxf -# application/nasdata -# application/news-checkgroups -# application/news-groupinfo -# application/news-transmission -# application/nss -# application/ocsp-request -# application/ocsp-response -application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy -application/oda oda -application/oebps-package+xml opf -application/ogg ogx -application/omdoc+xml omdoc -application/onenote onetoc onetoc2 onetmp onepkg -application/oxps oxps -# application/parityfec -application/patch-ops-error+xml xer -application/pdf pdf -application/pgp-encrypted pgp -# application/pgp-keys -application/pgp-signature asc sig -application/pics-rules prf -# application/pidf+xml -# application/pidf-diff+xml -application/pkcs10 p10 -application/pkcs7-mime p7m p7c -application/pkcs7-signature p7s -application/pkcs8 p8 -application/pkix-attr-cert ac -application/pkix-cert cer -application/pkix-crl crl -application/pkix-pkipath pkipath -application/pkixcmp pki -application/pls+xml pls -# application/poc-settings+xml -application/postscript ai eps ps -# application/prs.alvestrand.titrax-sheet -application/prs.cww cww -# application/prs.nprend -# application/prs.plucker -# application/prs.rdf-xml-crypt -# application/prs.xsf+xml -application/pskc+xml pskcxml -# application/qsig -application/rdf+xml rdf -application/reginfo+xml rif -application/relax-ng-compact-syntax rnc -# application/remote-printing -application/resource-lists+xml rl -application/resource-lists-diff+xml rld -# application/riscos -# application/rlmi+xml -application/rls-services+xml rs -application/rpki-ghostbusters gbr -application/rpki-manifest mft -application/rpki-roa roa -# application/rpki-updown -application/rsd+xml rsd -application/rss+xml rss -application/rtf rtf -# application/rtx -# application/samlassertion+xml -# application/samlmetadata+xml -application/sbml+xml sbml -application/scvp-cv-request scq -application/scvp-cv-response scs -application/scvp-vp-request spq -application/scvp-vp-response spp -application/sdp sdp -# application/set-payment -application/set-payment-initiation setpay -# application/set-registration -application/set-registration-initiation setreg -# application/sgml -# application/sgml-open-catalog -application/shf+xml shf -# application/sieve -# application/simple-filter+xml -# application/simple-message-summary -# application/simplesymbolcontainer -# application/slate -# application/smil -application/smil+xml smi smil -# application/soap+fastinfoset -# application/soap+xml -application/sparql-query rq -application/sparql-results+xml srx -# application/spirits-event+xml -application/srgs gram -application/srgs+xml grxml -application/sru+xml sru -application/ssdl+xml ssdl -application/ssml+xml ssml -# application/tamp-apex-update -# application/tamp-apex-update-confirm -# application/tamp-community-update -# application/tamp-community-update-confirm -# application/tamp-error -# application/tamp-sequence-adjust -# application/tamp-sequence-adjust-confirm -# application/tamp-status-query -# application/tamp-status-response -# application/tamp-update -# application/tamp-update-confirm -application/tei+xml tei teicorpus -application/thraud+xml tfi -# application/timestamp-query -# application/timestamp-reply -application/timestamped-data tsd -# application/tve-trigger -# application/ulpfec -# application/vcard+xml -# application/vemmi -# application/vividence.scriptfile -# application/vnd.3gpp.bsf+xml -application/vnd.3gpp.pic-bw-large plb -application/vnd.3gpp.pic-bw-small psb -application/vnd.3gpp.pic-bw-var pvb -# application/vnd.3gpp.sms -# application/vnd.3gpp2.bcmcsinfo+xml -# application/vnd.3gpp2.sms -application/vnd.3gpp2.tcap tcap -application/vnd.3m.post-it-notes pwn -application/vnd.accpac.simply.aso aso -application/vnd.accpac.simply.imp imp -application/vnd.acucobol acu -application/vnd.acucorp atc acutc -application/vnd.adobe.air-application-installer-package+zip air -application/vnd.adobe.formscentral.fcdt fcdt -application/vnd.adobe.fxp fxp fxpl -# application/vnd.adobe.partial-upload -application/vnd.adobe.xdp+xml xdp -application/vnd.adobe.xfdf xfdf -# application/vnd.aether.imp -# application/vnd.ah-barcode -application/vnd.ahead.space ahead -application/vnd.airzip.filesecure.azf azf -application/vnd.airzip.filesecure.azs azs -application/vnd.amazon.ebook azw -application/vnd.americandynamics.acc acc -application/vnd.amiga.ami ami -# application/vnd.amundsen.maze+xml -application/vnd.android.package-archive apk -application/vnd.anser-web-certificate-issue-initiation cii -application/vnd.anser-web-funds-transfer-initiation fti -application/vnd.antix.game-component atx -application/vnd.apple.installer+xml mpkg -application/vnd.apple.mpegurl m3u8 -# application/vnd.arastra.swi -application/vnd.aristanetworks.swi swi -application/vnd.astraea-software.iota iota -application/vnd.audiograph aep -# application/vnd.autopackage -# application/vnd.avistar+xml -application/vnd.blueice.multipass mpm -# application/vnd.bluetooth.ep.oob -application/vnd.bmi bmi -application/vnd.businessobjects rep -# application/vnd.cab-jscript -# application/vnd.canon-cpdl -# application/vnd.canon-lips -# application/vnd.cendio.thinlinc.clientconf -application/vnd.chemdraw+xml cdxml -application/vnd.chipnuts.karaoke-mmd mmd -application/vnd.cinderella cdy -# application/vnd.cirpack.isdn-ext -application/vnd.claymore cla -application/vnd.cloanto.rp9 rp9 -application/vnd.clonk.c4group c4g c4d c4f c4p c4u -application/vnd.cluetrust.cartomobile-config c11amc -application/vnd.cluetrust.cartomobile-config-pkg c11amz -# application/vnd.collection+json -# application/vnd.commerce-battelle -application/vnd.commonspace csp -application/vnd.contact.cmsg cdbcmsg -application/vnd.cosmocaller cmc -application/vnd.crick.clicker clkx -application/vnd.crick.clicker.keyboard clkk -application/vnd.crick.clicker.palette clkp -application/vnd.crick.clicker.template clkt -application/vnd.crick.clicker.wordbank clkw -application/vnd.criticaltools.wbs+xml wbs -application/vnd.ctc-posml pml -# application/vnd.ctct.ws+xml -# application/vnd.cups-pdf -# application/vnd.cups-postscript -application/vnd.cups-ppd ppd -# application/vnd.cups-raster -# application/vnd.cups-raw -# application/vnd.curl -application/vnd.curl.car car -application/vnd.curl.pcurl pcurl -# application/vnd.cybank -application/vnd.dart dart -application/vnd.data-vision.rdz rdz -application/vnd.dece.data uvf uvvf uvd uvvd -application/vnd.dece.ttml+xml uvt uvvt -application/vnd.dece.unspecified uvx uvvx -application/vnd.dece.zip uvz uvvz -application/vnd.denovo.fcselayout-link fe_launch -# application/vnd.dir-bi.plate-dl-nosuffix -application/vnd.dna dna -application/vnd.dolby.mlp mlp -# application/vnd.dolby.mobile.1 -# application/vnd.dolby.mobile.2 -application/vnd.dpgraph dpg -application/vnd.dreamfactory dfac -application/vnd.ds-keypoint kpxx -application/vnd.dvb.ait ait -# application/vnd.dvb.dvbj -# application/vnd.dvb.esgcontainer -# application/vnd.dvb.ipdcdftnotifaccess -# application/vnd.dvb.ipdcesgaccess -# application/vnd.dvb.ipdcesgaccess2 -# application/vnd.dvb.ipdcesgpdd -# application/vnd.dvb.ipdcroaming -# application/vnd.dvb.iptv.alfec-base -# application/vnd.dvb.iptv.alfec-enhancement -# application/vnd.dvb.notif-aggregate-root+xml -# application/vnd.dvb.notif-container+xml -# application/vnd.dvb.notif-generic+xml -# application/vnd.dvb.notif-ia-msglist+xml -# application/vnd.dvb.notif-ia-registration-request+xml -# application/vnd.dvb.notif-ia-registration-response+xml -# application/vnd.dvb.notif-init+xml -# application/vnd.dvb.pfr -application/vnd.dvb.service svc -# application/vnd.dxr -application/vnd.dynageo geo -# application/vnd.easykaraoke.cdgdownload -# application/vnd.ecdis-update -application/vnd.ecowin.chart mag -# application/vnd.ecowin.filerequest -# application/vnd.ecowin.fileupdate -# application/vnd.ecowin.series -# application/vnd.ecowin.seriesrequest -# application/vnd.ecowin.seriesupdate -# application/vnd.emclient.accessrequest+xml -application/vnd.enliven nml -# application/vnd.eprints.data+xml -application/vnd.epson.esf esf -application/vnd.epson.msf msf -application/vnd.epson.quickanime qam -application/vnd.epson.salt slt -application/vnd.epson.ssf ssf -# application/vnd.ericsson.quickcall -application/vnd.eszigno3+xml es3 et3 -# application/vnd.etsi.aoc+xml -# application/vnd.etsi.cug+xml -# application/vnd.etsi.iptvcommand+xml -# application/vnd.etsi.iptvdiscovery+xml -# application/vnd.etsi.iptvprofile+xml -# application/vnd.etsi.iptvsad-bc+xml -# application/vnd.etsi.iptvsad-cod+xml -# application/vnd.etsi.iptvsad-npvr+xml -# application/vnd.etsi.iptvservice+xml -# application/vnd.etsi.iptvsync+xml -# application/vnd.etsi.iptvueprofile+xml -# application/vnd.etsi.mcid+xml -# application/vnd.etsi.overload-control-policy-dataset+xml -# application/vnd.etsi.sci+xml -# application/vnd.etsi.simservs+xml -# application/vnd.etsi.tsl+xml -# application/vnd.etsi.tsl.der -# application/vnd.eudora.data -application/vnd.ezpix-album ez2 -application/vnd.ezpix-package ez3 -# application/vnd.f-secure.mobile -application/vnd.fdf fdf -application/vnd.fdsn.mseed mseed -application/vnd.fdsn.seed seed dataless -# application/vnd.ffsns -# application/vnd.fints -application/vnd.flographit gph -application/vnd.fluxtime.clip ftc -# application/vnd.font-fontforge-sfd -application/vnd.framemaker fm frame maker book -application/vnd.frogans.fnc fnc -application/vnd.frogans.ltf ltf -application/vnd.fsc.weblaunch fsc -application/vnd.fujitsu.oasys oas -application/vnd.fujitsu.oasys2 oa2 -application/vnd.fujitsu.oasys3 oa3 -application/vnd.fujitsu.oasysgp fg5 -application/vnd.fujitsu.oasysprs bh2 -# application/vnd.fujixerox.art-ex -# application/vnd.fujixerox.art4 -# application/vnd.fujixerox.hbpl -application/vnd.fujixerox.ddd ddd -application/vnd.fujixerox.docuworks xdw -application/vnd.fujixerox.docuworks.binder xbd -# application/vnd.fut-misnet -application/vnd.fuzzysheet fzs -application/vnd.genomatix.tuxedo txd -# application/vnd.geocube+xml -application/vnd.geogebra.file ggb -application/vnd.geogebra.tool ggt -application/vnd.geometry-explorer gex gre -application/vnd.geonext gxt -application/vnd.geoplan g2w -application/vnd.geospace g3w -# application/vnd.globalplatform.card-content-mgt -# application/vnd.globalplatform.card-content-mgt-response -application/vnd.gmx gmx -application/vnd.google-earth.kml+xml kml -application/vnd.google-earth.kmz kmz -application/vnd.grafeq gqf gqs -# application/vnd.gridmp -application/vnd.groove-account gac -application/vnd.groove-help ghf -application/vnd.groove-identity-message gim -application/vnd.groove-injector grv -application/vnd.groove-tool-message gtm -application/vnd.groove-tool-template tpl -application/vnd.groove-vcard vcg -# application/vnd.hal+json -application/vnd.hal+xml hal -application/vnd.handheld-entertainment+xml zmm -application/vnd.hbci hbci -# application/vnd.hcl-bireports -application/vnd.hhe.lesson-player les -application/vnd.hp-hpgl hpgl -application/vnd.hp-hpid hpid -application/vnd.hp-hps hps -application/vnd.hp-jlyt jlt -application/vnd.hp-pcl pcl -application/vnd.hp-pclxl pclxl -# application/vnd.httphone -application/vnd.hydrostatix.sof-data sfd-hdstx -# application/vnd.hzn-3d-crossword -# application/vnd.ibm.afplinedata -# application/vnd.ibm.electronic-media -application/vnd.ibm.minipay mpy -application/vnd.ibm.modcap afp listafp list3820 -application/vnd.ibm.rights-management irm -application/vnd.ibm.secure-container sc -application/vnd.iccprofile icc icm -application/vnd.igloader igl -application/vnd.immervision-ivp ivp -application/vnd.immervision-ivu ivu -# application/vnd.informedcontrol.rms+xml -# application/vnd.informix-visionary -# application/vnd.infotech.project -# application/vnd.infotech.project+xml -# application/vnd.innopath.wamp.notification -application/vnd.insors.igm igm -application/vnd.intercon.formnet xpw xpx -application/vnd.intergeo i2g -# application/vnd.intertrust.digibox -# application/vnd.intertrust.nncp -application/vnd.intu.qbo qbo -application/vnd.intu.qfx qfx -# application/vnd.iptc.g2.conceptitem+xml -# application/vnd.iptc.g2.knowledgeitem+xml -# application/vnd.iptc.g2.newsitem+xml -# application/vnd.iptc.g2.newsmessage+xml -# application/vnd.iptc.g2.packageitem+xml -# application/vnd.iptc.g2.planningitem+xml -application/vnd.ipunplugged.rcprofile rcprofile -application/vnd.irepository.package+xml irp -application/vnd.is-xpr xpr -application/vnd.isac.fcs fcs -application/vnd.jam jam -# application/vnd.japannet-directory-service -# application/vnd.japannet-jpnstore-wakeup -# application/vnd.japannet-payment-wakeup -# application/vnd.japannet-registration -# application/vnd.japannet-registration-wakeup -# application/vnd.japannet-setstore-wakeup -# application/vnd.japannet-verification -# application/vnd.japannet-verification-wakeup -application/vnd.jcp.javame.midlet-rms rms -application/vnd.jisp jisp -application/vnd.joost.joda-archive joda -application/vnd.kahootz ktz ktr -application/vnd.kde.karbon karbon -application/vnd.kde.kchart chrt -application/vnd.kde.kformula kfo -application/vnd.kde.kivio flw -application/vnd.kde.kontour kon -application/vnd.kde.kpresenter kpr kpt -application/vnd.kde.kspread ksp -application/vnd.kde.kword kwd kwt -application/vnd.kenameaapp htke -application/vnd.kidspiration kia -application/vnd.kinar kne knp -application/vnd.koan skp skd skt skm -application/vnd.kodak-descriptor sse -application/vnd.las.las+xml lasxml -# application/vnd.liberty-request+xml -application/vnd.llamagraphics.life-balance.desktop lbd -application/vnd.llamagraphics.life-balance.exchange+xml lbe -application/vnd.lotus-1-2-3 123 -application/vnd.lotus-approach apr -application/vnd.lotus-freelance pre -application/vnd.lotus-notes nsf -application/vnd.lotus-organizer org -application/vnd.lotus-screencam scm -application/vnd.lotus-wordpro lwp -application/vnd.macports.portpkg portpkg -# application/vnd.marlin.drm.actiontoken+xml -# application/vnd.marlin.drm.conftoken+xml -# application/vnd.marlin.drm.license+xml -# application/vnd.marlin.drm.mdcf -application/vnd.mcd mcd -application/vnd.medcalcdata mc1 -application/vnd.mediastation.cdkey cdkey -# application/vnd.meridian-slingshot -application/vnd.mfer mwf -application/vnd.mfmp mfm -application/vnd.micrografx.flo flo -application/vnd.micrografx.igx igx -application/vnd.mif mif -# application/vnd.minisoft-hp3000-save -# application/vnd.mitsubishi.misty-guard.trustweb -application/vnd.mobius.daf daf -application/vnd.mobius.dis dis -application/vnd.mobius.mbk mbk -application/vnd.mobius.mqy mqy -application/vnd.mobius.msl msl -application/vnd.mobius.plc plc -application/vnd.mobius.txf txf -application/vnd.mophun.application mpn -application/vnd.mophun.certificate mpc -# application/vnd.motorola.flexsuite -# application/vnd.motorola.flexsuite.adsi -# application/vnd.motorola.flexsuite.fis -# application/vnd.motorola.flexsuite.gotap -# application/vnd.motorola.flexsuite.kmr -# application/vnd.motorola.flexsuite.ttc -# application/vnd.motorola.flexsuite.wem -# application/vnd.motorola.iprm -application/vnd.mozilla.xul+xml xul -application/vnd.ms-artgalry cil -# application/vnd.ms-asf -application/vnd.ms-cab-compressed cab -# application/vnd.ms-color.iccprofile -application/vnd.ms-excel xls xlm xla xlc xlt xlw -application/vnd.ms-excel.addin.macroenabled.12 xlam -application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb -application/vnd.ms-excel.sheet.macroenabled.12 xlsm -application/vnd.ms-excel.template.macroenabled.12 xltm -application/vnd.ms-fontobject eot -application/vnd.ms-htmlhelp chm -application/vnd.ms-ims ims -application/vnd.ms-lrm lrm -# application/vnd.ms-office.activex+xml -application/vnd.ms-officetheme thmx -# application/vnd.ms-opentype -# application/vnd.ms-package.obfuscated-opentype -application/vnd.ms-pki.seccat cat -application/vnd.ms-pki.stl stl -# application/vnd.ms-playready.initiator+xml -application/vnd.ms-powerpoint ppt pps pot -application/vnd.ms-powerpoint.addin.macroenabled.12 ppam -application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm -application/vnd.ms-powerpoint.slide.macroenabled.12 sldm -application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm -application/vnd.ms-powerpoint.template.macroenabled.12 potm -# application/vnd.ms-printing.printticket+xml -application/vnd.ms-project mpp mpt -# application/vnd.ms-tnef -# application/vnd.ms-wmdrm.lic-chlg-req -# application/vnd.ms-wmdrm.lic-resp -# application/vnd.ms-wmdrm.meter-chlg-req -# application/vnd.ms-wmdrm.meter-resp -application/vnd.ms-word.document.macroenabled.12 docm -application/vnd.ms-word.template.macroenabled.12 dotm -application/vnd.ms-works wps wks wcm wdb -application/vnd.ms-wpl wpl -application/vnd.ms-xpsdocument xps -application/vnd.mseq mseq -# application/vnd.msign -# application/vnd.multiad.creator -# application/vnd.multiad.creator.cif -# application/vnd.music-niff -application/vnd.musician mus -application/vnd.muvee.style msty -application/vnd.mynfc taglet -# application/vnd.ncd.control -# application/vnd.ncd.reference -# application/vnd.nervana -# application/vnd.netfpx -application/vnd.neurolanguage.nlu nlu -application/vnd.nitf ntf nitf -application/vnd.noblenet-directory nnd -application/vnd.noblenet-sealer nns -application/vnd.noblenet-web nnw -# application/vnd.nokia.catalogs -# application/vnd.nokia.conml+wbxml -# application/vnd.nokia.conml+xml -# application/vnd.nokia.isds-radio-presets -# application/vnd.nokia.iptv.config+xml -# application/vnd.nokia.landmark+wbxml -# application/vnd.nokia.landmark+xml -# application/vnd.nokia.landmarkcollection+xml -# application/vnd.nokia.n-gage.ac+xml -application/vnd.nokia.n-gage.data ngdat -application/vnd.nokia.n-gage.symbian.install n-gage -# application/vnd.nokia.ncd -# application/vnd.nokia.pcd+wbxml -# application/vnd.nokia.pcd+xml -application/vnd.nokia.radio-preset rpst -application/vnd.nokia.radio-presets rpss -application/vnd.novadigm.edm edm -application/vnd.novadigm.edx edx -application/vnd.novadigm.ext ext -# application/vnd.ntt-local.file-transfer -# application/vnd.ntt-local.sip-ta_remote -# application/vnd.ntt-local.sip-ta_tcp_stream -application/vnd.oasis.opendocument.chart odc -application/vnd.oasis.opendocument.chart-template otc -application/vnd.oasis.opendocument.database odb -application/vnd.oasis.opendocument.formula odf -application/vnd.oasis.opendocument.formula-template odft -application/vnd.oasis.opendocument.graphics odg -application/vnd.oasis.opendocument.graphics-template otg -application/vnd.oasis.opendocument.image odi -application/vnd.oasis.opendocument.image-template oti -application/vnd.oasis.opendocument.presentation odp -application/vnd.oasis.opendocument.presentation-template otp -application/vnd.oasis.opendocument.spreadsheet ods -application/vnd.oasis.opendocument.spreadsheet-template ots -application/vnd.oasis.opendocument.text odt -application/vnd.oasis.opendocument.text-master odm -application/vnd.oasis.opendocument.text-template ott -application/vnd.oasis.opendocument.text-web oth -# application/vnd.obn -# application/vnd.oftn.l10n+json -# application/vnd.oipf.contentaccessdownload+xml -# application/vnd.oipf.contentaccessstreaming+xml -# application/vnd.oipf.cspg-hexbinary -# application/vnd.oipf.dae.svg+xml -# application/vnd.oipf.dae.xhtml+xml -# application/vnd.oipf.mippvcontrolmessage+xml -# application/vnd.oipf.pae.gem -# application/vnd.oipf.spdiscovery+xml -# application/vnd.oipf.spdlist+xml -# application/vnd.oipf.ueprofile+xml -# application/vnd.oipf.userprofile+xml -application/vnd.olpc-sugar xo -# application/vnd.oma-scws-config -# application/vnd.oma-scws-http-request -# application/vnd.oma-scws-http-response -# application/vnd.oma.bcast.associated-procedure-parameter+xml -# application/vnd.oma.bcast.drm-trigger+xml -# application/vnd.oma.bcast.imd+xml -# application/vnd.oma.bcast.ltkm -# application/vnd.oma.bcast.notification+xml -# application/vnd.oma.bcast.provisioningtrigger -# application/vnd.oma.bcast.sgboot -# application/vnd.oma.bcast.sgdd+xml -# application/vnd.oma.bcast.sgdu -# application/vnd.oma.bcast.simple-symbol-container -# application/vnd.oma.bcast.smartcard-trigger+xml -# application/vnd.oma.bcast.sprov+xml -# application/vnd.oma.bcast.stkm -# application/vnd.oma.cab-address-book+xml -# application/vnd.oma.cab-feature-handler+xml -# application/vnd.oma.cab-pcc+xml -# application/vnd.oma.cab-user-prefs+xml -# application/vnd.oma.dcd -# application/vnd.oma.dcdc -application/vnd.oma.dd2+xml dd2 -# application/vnd.oma.drm.risd+xml -# application/vnd.oma.group-usage-list+xml -# application/vnd.oma.pal+xml -# application/vnd.oma.poc.detailed-progress-report+xml -# application/vnd.oma.poc.final-report+xml -# application/vnd.oma.poc.groups+xml -# application/vnd.oma.poc.invocation-descriptor+xml -# application/vnd.oma.poc.optimized-progress-report+xml -# application/vnd.oma.push -# application/vnd.oma.scidm.messages+xml -# application/vnd.oma.xcap-directory+xml -# application/vnd.omads-email+xml -# application/vnd.omads-file+xml -# application/vnd.omads-folder+xml -# application/vnd.omaloc-supl-init -application/vnd.openofficeorg.extension oxt -# application/vnd.openxmlformats-officedocument.custom-properties+xml -# application/vnd.openxmlformats-officedocument.customxmlproperties+xml -# application/vnd.openxmlformats-officedocument.drawing+xml -# application/vnd.openxmlformats-officedocument.drawingml.chart+xml -# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml -# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml -# application/vnd.openxmlformats-officedocument.extended-properties+xml -# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml -# application/vnd.openxmlformats-officedocument.presentationml.comments+xml -# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml -# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml -application/vnd.openxmlformats-officedocument.presentationml.presentation pptx -# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml -application/vnd.openxmlformats-officedocument.presentationml.slide sldx -# application/vnd.openxmlformats-officedocument.presentationml.slide+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml -# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml -application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx -# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml -# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml -# application/vnd.openxmlformats-officedocument.presentationml.tags+xml -application/vnd.openxmlformats-officedocument.presentationml.template potx -# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml -# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx -# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml -# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml -# application/vnd.openxmlformats-officedocument.theme+xml -# application/vnd.openxmlformats-officedocument.themeoverride+xml -# application/vnd.openxmlformats-officedocument.vmldrawing -# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.document docx -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx -# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml -# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml -# application/vnd.openxmlformats-package.core-properties+xml -# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml -# application/vnd.openxmlformats-package.relationships+xml -# application/vnd.quobject-quoxdocument -# application/vnd.osa.netdeploy -application/vnd.osgeo.mapguide.package mgp -# application/vnd.osgi.bundle -application/vnd.osgi.dp dp -application/vnd.osgi.subsystem esa -# application/vnd.otps.ct-kip+xml -application/vnd.palm pdb pqa oprc -# application/vnd.paos.xml -application/vnd.pawaafile paw -application/vnd.pg.format str -application/vnd.pg.osasli ei6 -# application/vnd.piaccess.application-licence -application/vnd.picsel efif -application/vnd.pmi.widget wg -# application/vnd.poc.group-advertisement+xml -application/vnd.pocketlearn plf -application/vnd.powerbuilder6 pbd -# application/vnd.powerbuilder6-s -# application/vnd.powerbuilder7 -# application/vnd.powerbuilder7-s -# application/vnd.powerbuilder75 -# application/vnd.powerbuilder75-s -# application/vnd.preminet -application/vnd.previewsystems.box box -application/vnd.proteus.magazine mgz -application/vnd.publishare-delta-tree qps -application/vnd.pvi.ptid1 ptid -# application/vnd.pwg-multiplexed -# application/vnd.pwg-xhtml-print+xml -# application/vnd.qualcomm.brew-app-res -application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb -# application/vnd.radisys.moml+xml -# application/vnd.radisys.msml+xml -# application/vnd.radisys.msml-audit+xml -# application/vnd.radisys.msml-audit-conf+xml -# application/vnd.radisys.msml-audit-conn+xml -# application/vnd.radisys.msml-audit-dialog+xml -# application/vnd.radisys.msml-audit-stream+xml -# application/vnd.radisys.msml-conf+xml -# application/vnd.radisys.msml-dialog+xml -# application/vnd.radisys.msml-dialog-base+xml -# application/vnd.radisys.msml-dialog-fax-detect+xml -# application/vnd.radisys.msml-dialog-fax-sendrecv+xml -# application/vnd.radisys.msml-dialog-group+xml -# application/vnd.radisys.msml-dialog-speech+xml -# application/vnd.radisys.msml-dialog-transform+xml -# application/vnd.rainstor.data -# application/vnd.rapid -application/vnd.realvnc.bed bed -application/vnd.recordare.musicxml mxl -application/vnd.recordare.musicxml+xml musicxml -# application/vnd.renlearn.rlprint -application/vnd.rig.cryptonote cryptonote -application/vnd.rim.cod cod -application/vnd.rn-realmedia rm -application/vnd.rn-realmedia-vbr rmvb -application/vnd.route66.link66+xml link66 -# application/vnd.rs-274x -# application/vnd.ruckus.download -# application/vnd.s3sms -application/vnd.sailingtracker.track st -# application/vnd.sbm.cid -# application/vnd.sbm.mid2 -# application/vnd.scribus -# application/vnd.sealed.3df -# application/vnd.sealed.csf -# application/vnd.sealed.doc -# application/vnd.sealed.eml -# application/vnd.sealed.mht -# application/vnd.sealed.net -# application/vnd.sealed.ppt -# application/vnd.sealed.tiff -# application/vnd.sealed.xls -# application/vnd.sealedmedia.softseal.html -# application/vnd.sealedmedia.softseal.pdf -application/vnd.seemail see -application/vnd.sema sema -application/vnd.semd semd -application/vnd.semf semf -application/vnd.shana.informed.formdata ifm -application/vnd.shana.informed.formtemplate itp -application/vnd.shana.informed.interchange iif -application/vnd.shana.informed.package ipk -application/vnd.simtech-mindmapper twd twds -application/vnd.smaf mmf -# application/vnd.smart.notebook -application/vnd.smart.teacher teacher -# application/vnd.software602.filler.form+xml -# application/vnd.software602.filler.form-xml-zip -application/vnd.solent.sdkm+xml sdkm sdkd -application/vnd.spotfire.dxp dxp -application/vnd.spotfire.sfs sfs -# application/vnd.sss-cod -# application/vnd.sss-dtf -# application/vnd.sss-ntf -application/vnd.stardivision.calc sdc -application/vnd.stardivision.draw sda -application/vnd.stardivision.impress sdd -application/vnd.stardivision.math smf -application/vnd.stardivision.writer sdw vor -application/vnd.stardivision.writer-global sgl -application/vnd.stepmania.package smzip -application/vnd.stepmania.stepchart sm -# application/vnd.street-stream -application/vnd.sun.xml.calc sxc -application/vnd.sun.xml.calc.template stc -application/vnd.sun.xml.draw sxd -application/vnd.sun.xml.draw.template std -application/vnd.sun.xml.impress sxi -application/vnd.sun.xml.impress.template sti -application/vnd.sun.xml.math sxm -application/vnd.sun.xml.writer sxw -application/vnd.sun.xml.writer.global sxg -application/vnd.sun.xml.writer.template stw -# application/vnd.sun.wadl+xml -application/vnd.sus-calendar sus susp -application/vnd.svd svd -# application/vnd.swiftview-ics -application/vnd.symbian.install sis sisx -application/vnd.syncml+xml xsm -application/vnd.syncml.dm+wbxml bdm -application/vnd.syncml.dm+xml xdm -# application/vnd.syncml.dm.notification -# application/vnd.syncml.ds.notification -application/vnd.tao.intent-module-archive tao -application/vnd.tcpdump.pcap pcap cap dmp -application/vnd.tmobile-livetv tmo -application/vnd.trid.tpt tpt -application/vnd.triscape.mxs mxs -application/vnd.trueapp tra -# application/vnd.truedoc -# application/vnd.ubisoft.webplayer -application/vnd.ufdl ufd ufdl -application/vnd.uiq.theme utz -application/vnd.umajin umj -application/vnd.unity unityweb -application/vnd.uoml+xml uoml -# application/vnd.uplanet.alert -# application/vnd.uplanet.alert-wbxml -# application/vnd.uplanet.bearer-choice -# application/vnd.uplanet.bearer-choice-wbxml -# application/vnd.uplanet.cacheop -# application/vnd.uplanet.cacheop-wbxml -# application/vnd.uplanet.channel -# application/vnd.uplanet.channel-wbxml -# application/vnd.uplanet.list -# application/vnd.uplanet.list-wbxml -# application/vnd.uplanet.listcmd -# application/vnd.uplanet.listcmd-wbxml -# application/vnd.uplanet.signal -application/vnd.vcx vcx -# application/vnd.vd-study -# application/vnd.vectorworks -# application/vnd.verimatrix.vcas -# application/vnd.vidsoft.vidconference -application/vnd.visio vsd vst vss vsw -application/vnd.visionary vis -# application/vnd.vividence.scriptfile -application/vnd.vsf vsf -# application/vnd.wap.sic -# application/vnd.wap.slc -application/vnd.wap.wbxml wbxml -application/vnd.wap.wmlc wmlc -application/vnd.wap.wmlscriptc wmlsc -application/vnd.webturbo wtb -# application/vnd.wfa.wsc -# application/vnd.wmc -# application/vnd.wmf.bootstrap -# application/vnd.wolfram.mathematica -# application/vnd.wolfram.mathematica.package -application/vnd.wolfram.player nbp -application/vnd.wordperfect wpd -application/vnd.wqd wqd -# application/vnd.wrq-hp3000-labelled -application/vnd.wt.stf stf -# application/vnd.wv.csp+wbxml -# application/vnd.wv.csp+xml -# application/vnd.wv.ssp+xml -application/vnd.xara xar -application/vnd.xfdl xfdl -# application/vnd.xfdl.webform -# application/vnd.xmi+xml -# application/vnd.xmpie.cpkg -# application/vnd.xmpie.dpkg -# application/vnd.xmpie.plan -# application/vnd.xmpie.ppkg -# application/vnd.xmpie.xlim -application/vnd.yamaha.hv-dic hvd -application/vnd.yamaha.hv-script hvs -application/vnd.yamaha.hv-voice hvp -application/vnd.yamaha.openscoreformat osf -application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg -# application/vnd.yamaha.remote-setup -application/vnd.yamaha.smaf-audio saf -application/vnd.yamaha.smaf-phrase spf -# application/vnd.yamaha.through-ngn -# application/vnd.yamaha.tunnel-udpencap -application/vnd.yellowriver-custom-menu cmp -application/vnd.zul zir zirz -application/vnd.zzazz.deck+xml zaz -application/voicexml+xml vxml -# application/vq-rtcpxr -# application/watcherinfo+xml -# application/whoispp-query -# application/whoispp-response -application/widget wgt -application/winhlp hlp -# application/wita -# application/wordperfect5.1 -application/wsdl+xml wsdl -application/wspolicy+xml wspolicy -application/x-7z-compressed 7z -application/x-abiword abw -application/x-ace-compressed ace -# application/x-amf -application/x-apple-diskimage dmg -application/x-authorware-bin aab x32 u32 vox -application/x-authorware-map aam -application/x-authorware-seg aas -application/x-bcpio bcpio -application/x-bittorrent torrent -application/x-blorb blb blorb -application/x-bzip bz -application/x-bzip2 bz2 boz -application/x-cbr cbr cba cbt cbz cb7 -application/x-cdlink vcd -application/x-cfs-compressed cfs -application/x-chat chat -application/x-chess-pgn pgn -application/x-conference nsc -# application/x-compress -application/x-cpio cpio -application/x-csh csh -application/x-debian-package deb udeb -application/x-dgc-compressed dgc -application/x-director dir dcr dxr cst cct cxt w3d fgd swa -application/x-doom wad -application/x-dtbncx+xml ncx -application/x-dtbook+xml dtb -application/x-dtbresource+xml res -application/x-dvi dvi -application/x-envoy evy -application/x-eva eva -application/x-font-bdf bdf -# application/x-font-dos -# application/x-font-framemaker -application/x-font-ghostscript gsf -# application/x-font-libgrx -application/x-font-linux-psf psf -application/x-font-otf otf -application/x-font-pcf pcf -application/x-font-snf snf -# application/x-font-speedo -# application/x-font-sunos-news -application/x-font-ttf ttf ttc -application/x-font-type1 pfa pfb pfm afm -application/x-font-woff woff -# application/x-font-vfont -application/x-freearc arc -application/x-futuresplash spl -application/x-gca-compressed gca -application/x-glulx ulx -application/x-gnumeric gnumeric -application/x-gramps-xml gramps -application/x-gtar gtar -# application/x-gzip -application/x-hdf hdf -application/x-install-instructions install -application/x-iso9660-image iso -application/x-java-jnlp-file jnlp -application/x-latex latex -application/x-lzh-compressed lzh lha -application/x-mie mie -application/x-mobipocket-ebook prc mobi -application/x-ms-application application -application/x-ms-shortcut lnk -application/x-ms-wmd wmd -application/x-ms-wmz wmz -application/x-ms-xbap xbap -application/x-msaccess mdb -application/x-msbinder obd -application/x-mscardfile crd -application/x-msclip clp -application/x-msdownload exe dll com bat msi -application/x-msmediaview mvb m13 m14 -application/x-msmetafile wmf wmz emf emz -application/x-msmoney mny -application/x-mspublisher pub -application/x-msschedule scd -application/x-msterminal trm -application/x-mswrite wri -application/x-netcdf nc cdf -application/x-nzb nzb -application/x-pkcs12 p12 pfx -application/x-pkcs7-certificates p7b spc -application/x-pkcs7-certreqresp p7r -application/x-rar-compressed rar -application/x-research-info-systems ris -application/x-sh sh -application/x-shar shar -application/x-shockwave-flash swf -application/x-silverlight-app xap -application/x-sql sql -application/x-stuffit sit -application/x-stuffitx sitx -application/x-subrip srt -application/x-sv4cpio sv4cpio -application/x-sv4crc sv4crc -application/x-t3vm-image t3 -application/x-tads gam -application/x-tar tar -application/x-tcl tcl -application/x-tex tex -application/x-tex-tfm tfm -application/x-texinfo texinfo texi -application/x-tgif obj -application/x-ustar ustar -application/x-wais-source src -application/x-x509-ca-cert der crt -application/x-xfig fig -application/x-xliff+xml xlf -application/x-xpinstall xpi -application/x-xz xz -application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 -# application/x400-bp -application/xaml+xml xaml -# application/xcap-att+xml -# application/xcap-caps+xml -application/xcap-diff+xml xdf -# application/xcap-el+xml -# application/xcap-error+xml -# application/xcap-ns+xml -# application/xcon-conference-info-diff+xml -# application/xcon-conference-info+xml -application/xenc+xml xenc -application/xhtml+xml xhtml xht -# application/xhtml-voice+xml -application/xml xml xsl -application/xml-dtd dtd -# application/xml-external-parsed-entity -# application/xmpp+xml -application/xop+xml xop -application/xproc+xml xpl -application/xslt+xml xslt -application/xspf+xml xspf -application/xv+xml mxml xhvml xvml xvm -application/yang yang -application/yin+xml yin -application/zip zip -# audio/1d-interleaved-parityfec -# audio/32kadpcm -# audio/3gpp -# audio/3gpp2 -# audio/ac3 -audio/adpcm adp -# audio/amr -# audio/amr-wb -# audio/amr-wb+ -# audio/asc -# audio/atrac-advanced-lossless -# audio/atrac-x -# audio/atrac3 -audio/basic au snd -# audio/bv16 -# audio/bv32 -# audio/clearmode -# audio/cn -# audio/dat12 -# audio/dls -# audio/dsr-es201108 -# audio/dsr-es202050 -# audio/dsr-es202211 -# audio/dsr-es202212 -# audio/dv -# audio/dvi4 -# audio/eac3 -# audio/evrc -# audio/evrc-qcp -# audio/evrc0 -# audio/evrc1 -# audio/evrcb -# audio/evrcb0 -# audio/evrcb1 -# audio/evrcwb -# audio/evrcwb0 -# audio/evrcwb1 -# audio/example -# audio/fwdred -# audio/g719 -# audio/g722 -# audio/g7221 -# audio/g723 -# audio/g726-16 -# audio/g726-24 -# audio/g726-32 -# audio/g726-40 -# audio/g728 -# audio/g729 -# audio/g7291 -# audio/g729d -# audio/g729e -# audio/gsm -# audio/gsm-efr -# audio/gsm-hr-08 -# audio/ilbc -# audio/ip-mr_v2.5 -# audio/isac -# audio/l16 -# audio/l20 -# audio/l24 -# audio/l8 -# audio/lpc -audio/midi mid midi kar rmi -# audio/mobile-xmf -audio/mp4 mp4a -# audio/mp4a-latm -# audio/mpa -# audio/mpa-robust -audio/mpeg mpga mp2 mp2a mp3 m2a m3a -# audio/mpeg4-generic -# audio/musepack -audio/ogg oga ogg spx -# audio/opus -# audio/parityfec -# audio/pcma -# audio/pcma-wb -# audio/pcmu-wb -# audio/pcmu -# audio/prs.sid -# audio/qcelp -# audio/red -# audio/rtp-enc-aescm128 -# audio/rtp-midi -# audio/rtx -audio/s3m s3m -audio/silk sil -# audio/smv -# audio/smv0 -# audio/smv-qcp -# audio/sp-midi -# audio/speex -# audio/t140c -# audio/t38 -# audio/telephone-event -# audio/tone -# audio/uemclip -# audio/ulpfec -# audio/vdvi -# audio/vmr-wb -# audio/vnd.3gpp.iufp -# audio/vnd.4sb -# audio/vnd.audiokoz -# audio/vnd.celp -# audio/vnd.cisco.nse -# audio/vnd.cmles.radio-events -# audio/vnd.cns.anp1 -# audio/vnd.cns.inf1 -audio/vnd.dece.audio uva uvva -audio/vnd.digital-winds eol -# audio/vnd.dlna.adts -# audio/vnd.dolby.heaac.1 -# audio/vnd.dolby.heaac.2 -# audio/vnd.dolby.mlp -# audio/vnd.dolby.mps -# audio/vnd.dolby.pl2 -# audio/vnd.dolby.pl2x -# audio/vnd.dolby.pl2z -# audio/vnd.dolby.pulse.1 -audio/vnd.dra dra -audio/vnd.dts dts -audio/vnd.dts.hd dtshd -# audio/vnd.dvb.file -# audio/vnd.everad.plj -# audio/vnd.hns.audio -audio/vnd.lucent.voice lvp -audio/vnd.ms-playready.media.pya pya -# audio/vnd.nokia.mobile-xmf -# audio/vnd.nortel.vbk -audio/vnd.nuera.ecelp4800 ecelp4800 -audio/vnd.nuera.ecelp7470 ecelp7470 -audio/vnd.nuera.ecelp9600 ecelp9600 -# audio/vnd.octel.sbc -# audio/vnd.qcelp -# audio/vnd.rhetorex.32kadpcm -audio/vnd.rip rip -# audio/vnd.sealedmedia.softseal.mpeg -# audio/vnd.vmx.cvsd -# audio/vorbis -# audio/vorbis-config -audio/webm weba -audio/x-aac aac -audio/x-aiff aif aiff aifc -audio/x-caf caf -audio/x-flac flac -audio/x-matroska mka -audio/x-mpegurl m3u -audio/x-ms-wax wax -audio/x-ms-wma wma -audio/x-pn-realaudio ram ra -audio/x-pn-realaudio-plugin rmp -# audio/x-tta -audio/x-wav wav -audio/xm xm -chemical/x-cdx cdx -chemical/x-cif cif -chemical/x-cmdf cmdf -chemical/x-cml cml -chemical/x-csml csml -# chemical/x-pdb -chemical/x-xyz xyz -image/bmp bmp -image/cgm cgm -# image/example -# image/fits -image/g3fax g3 -image/gif gif -image/ief ief -# image/jp2 -image/jpeg jpeg jpg jpe -# image/jpm -# image/jpx -image/ktx ktx -# image/naplps -image/png png -image/prs.btif btif -# image/prs.pti -image/sgi sgi -image/svg+xml svg svgz -# image/t38 -image/tiff tiff tif -# image/tiff-fx -image/vnd.adobe.photoshop psd -# image/vnd.cns.inf2 -image/vnd.dece.graphic uvi uvvi uvg uvvg -image/vnd.dvb.subtitle sub -image/vnd.djvu djvu djv -image/vnd.dwg dwg -image/vnd.dxf dxf -image/vnd.fastbidsheet fbs -image/vnd.fpx fpx -image/vnd.fst fst -image/vnd.fujixerox.edmics-mmr mmr -image/vnd.fujixerox.edmics-rlc rlc -# image/vnd.globalgraphics.pgb -# image/vnd.microsoft.icon -# image/vnd.mix -image/vnd.ms-modi mdi -image/vnd.ms-photo wdp -image/vnd.net-fpx npx -# image/vnd.radiance -# image/vnd.sealed.png -# image/vnd.sealedmedia.softseal.gif -# image/vnd.sealedmedia.softseal.jpg -# image/vnd.svf -image/vnd.wap.wbmp wbmp -image/vnd.xiff xif -image/webp webp -image/x-3ds 3ds -image/x-cmu-raster ras -image/x-cmx cmx -image/x-freehand fh fhc fh4 fh5 fh7 -image/x-icon ico -image/x-mrsid-image sid -image/x-pcx pcx -image/x-pict pic pct -image/x-portable-anymap pnm -image/x-portable-bitmap pbm -image/x-portable-graymap pgm -image/x-portable-pixmap ppm -image/x-rgb rgb -image/x-tga tga -image/x-xbitmap xbm -image/x-xpixmap xpm -image/x-xwindowdump xwd -# message/cpim -# message/delivery-status -# message/disposition-notification -# message/example -# message/external-body -# message/feedback-report -# message/global -# message/global-delivery-status -# message/global-disposition-notification -# message/global-headers -# message/http -# message/imdn+xml -# message/news -# message/partial -message/rfc822 eml mime -# message/s-http -# message/sip -# message/sipfrag -# message/tracking-status -# message/vnd.si.simp -# model/example -model/iges igs iges -model/mesh msh mesh silo -model/vnd.collada+xml dae -model/vnd.dwf dwf -# model/vnd.flatland.3dml -model/vnd.gdl gdl -# model/vnd.gs-gdl -# model/vnd.gs.gdl -model/vnd.gtw gtw -# model/vnd.moml+xml -model/vnd.mts mts -# model/vnd.parasolid.transmit.binary -# model/vnd.parasolid.transmit.text -model/vnd.vtu vtu -model/vrml wrl vrml -model/x3d+binary x3db x3dbz -model/x3d+vrml x3dv x3dvz -model/x3d+xml x3d x3dz -# multipart/alternative -# multipart/appledouble -# multipart/byteranges -# multipart/digest -# multipart/encrypted -# multipart/example -# multipart/form-data -# multipart/header-set -# multipart/mixed -# multipart/parallel -# multipart/related -# multipart/report -# multipart/signed -# multipart/voice-message -# text/1d-interleaved-parityfec -text/cache-manifest appcache -text/calendar ics ifb -text/css css -text/csv csv -# text/directory -# text/dns -# text/ecmascript -# text/enriched -# text/example -# text/fwdred -text/html html htm -# text/javascript -text/n3 n3 -# text/parityfec -text/plain txt text conf def list log in -# text/prs.fallenstein.rst -text/prs.lines.tag dsc -# text/vnd.radisys.msml-basic-layout -# text/red -# text/rfc822-headers -text/richtext rtx -# text/rtf -# text/rtp-enc-aescm128 -# text/rtx -text/sgml sgml sgm -# text/t140 -text/tab-separated-values tsv -text/troff t tr roff man me ms -text/turtle ttl -# text/ulpfec -text/uri-list uri uris urls -text/vcard vcard -# text/vnd.abc -text/vnd.curl curl -text/vnd.curl.dcurl dcurl -text/vnd.curl.scurl scurl -text/vnd.curl.mcurl mcurl -# text/vnd.dmclientscript -text/vnd.dvb.subtitle sub -# text/vnd.esmertec.theme-descriptor -text/vnd.fly fly -text/vnd.fmi.flexstor flx -text/vnd.graphviz gv -text/vnd.in3d.3dml 3dml -text/vnd.in3d.spot spot -# text/vnd.iptc.newsml -# text/vnd.iptc.nitf -# text/vnd.latex-z -# text/vnd.motorola.reflex -# text/vnd.ms-mediapackage -# text/vnd.net2phone.commcenter.command -# text/vnd.si.uricatalogue -text/vnd.sun.j2me.app-descriptor jad -# text/vnd.trolltech.linguist -# text/vnd.wap.si -# text/vnd.wap.sl -text/vnd.wap.wml wml -text/vnd.wap.wmlscript wmls -text/x-asm s asm -text/x-c c cc cxx cpp h hh dic -text/x-fortran f for f77 f90 -text/x-java-source java -text/x-opml opml -text/x-pascal p pas -text/x-nfo nfo -text/x-setext etx -text/x-sfv sfv -text/x-uuencode uu -text/x-vcalendar vcs -text/x-vcard vcf -# text/xml -# text/xml-external-parsed-entity -# video/1d-interleaved-parityfec -video/3gpp 3gp -# video/3gpp-tt -video/3gpp2 3g2 -# video/bmpeg -# video/bt656 -# video/celb -# video/dv -# video/example -video/h261 h261 -video/h263 h263 -# video/h263-1998 -# video/h263-2000 -video/h264 h264 -# video/h264-rcdo -# video/h264-svc -video/jpeg jpgv -# video/jpeg2000 -video/jpm jpm jpgm -video/mj2 mj2 mjp2 -# video/mp1s -# video/mp2p -# video/mp2t -video/mp4 mp4 mp4v mpg4 -# video/mp4v-es -video/mpeg mpeg mpg mpe m1v m2v -# video/mpeg4-generic -# video/mpv -# video/nv -video/ogg ogv -# video/parityfec -# video/pointer -video/quicktime qt mov -# video/raw -# video/rtp-enc-aescm128 -# video/rtx -# video/smpte292m -# video/ulpfec -# video/vc1 -# video/vnd.cctv -video/vnd.dece.hd uvh uvvh -video/vnd.dece.mobile uvm uvvm -# video/vnd.dece.mp4 -video/vnd.dece.pd uvp uvvp -video/vnd.dece.sd uvs uvvs -video/vnd.dece.video uvv uvvv -# video/vnd.directv.mpeg -# video/vnd.directv.mpeg-tts -# video/vnd.dlna.mpeg-tts -video/vnd.dvb.file dvb -video/vnd.fvt fvt -# video/vnd.hns.video -# video/vnd.iptvforum.1dparityfec-1010 -# video/vnd.iptvforum.1dparityfec-2005 -# video/vnd.iptvforum.2dparityfec-1010 -# video/vnd.iptvforum.2dparityfec-2005 -# video/vnd.iptvforum.ttsavc -# video/vnd.iptvforum.ttsmpeg2 -# video/vnd.motorola.video -# video/vnd.motorola.videop -video/vnd.mpegurl mxu m4u -video/vnd.ms-playready.media.pyv pyv -# video/vnd.nokia.interleaved-multimedia -# video/vnd.nokia.videovoip -# video/vnd.objectvideo -# video/vnd.sealed.mpeg1 -# video/vnd.sealed.mpeg4 -# video/vnd.sealed.swf -# video/vnd.sealedmedia.softseal.mov -video/vnd.uvvu.mp4 uvu uvvu -video/vnd.vivo viv -video/webm webm -video/x-f4v f4v -video/x-fli fli -video/x-flv flv -video/x-m4v m4v -video/x-matroska mkv mk3d mks -video/x-mng mng -video/x-ms-asf asf asx -video/x-ms-vob vob -video/x-ms-wm wm -video/x-ms-wmv wmv -video/x-ms-wmx wmx -video/x-ms-wvx wvx -video/x-msvideo avi -video/x-sgi-movie movie -video/x-smv smv -x-conference/x-cooltalk ice diff --git a/node_modules/request/node_modules/mime/types/node.types b/node_modules/request/node_modules/mime/types/node.types deleted file mode 100644 index 9097334..0000000 --- a/node_modules/request/node_modules/mime/types/node.types +++ /dev/null @@ -1,59 +0,0 @@ -# What: Google Chrome Extension -# Why: To allow apps to (work) be served with the right content type header. -# http://codereview.chromium.org/2830017 -# Added by: niftylettuce -application/x-chrome-extension crx - -# What: OTF Message Silencer -# Why: To silence the "Resource interpreted as font but transferred with MIME -# type font/otf" message that occurs in Google Chrome -# Added by: niftylettuce -font/opentype otf - -# What: HTC support -# Why: To properly render .htc files such as CSS3PIE -# Added by: niftylettuce -text/x-component htc - -# What: HTML5 application cache manifest -# Why: De-facto standard. Required by Mozilla browser when serving HTML5 apps -# per https://developer.mozilla.org/en/offline_resources_in_firefox -# Added by: louisremi -text/cache-manifest appcache manifest - -# What: node binary buffer format -# Why: semi-standard extension w/in the node community -# Added by: tootallnate -application/octet-stream buffer - -# What: The "protected" MP-4 formats used by iTunes. -# Why: Required for streaming music to browsers (?) -# Added by: broofa -application/mp4 m4p -audio/mp4 m4a - -# What: Music playlist format (http://en.wikipedia.org/wiki/M3U) -# Why: See https://github.com/bentomas/node-mime/pull/6 -# Added by: mjrusso -application/x-mpegURL m3u8 - -# What: Video format, Part of RFC1890 -# Why: See https://github.com/bentomas/node-mime/pull/6 -# Added by: mjrusso -video/MP2T ts - -# What: The FLAC lossless codec format -# Why: Streaming and serving FLAC audio -# Added by: jacobrask -audio/flac flac - -# What: EventSource mime type -# Why: mime type of Server-Sent Events stream -# http://www.w3.org/TR/eventsource/#text-event-stream -# Added by: francois2metz -text/event-stream event-stream - -# What: Mozilla App manifest mime type -# Why: https://developer.mozilla.org/en/Apps/Manifest#Serving_manifests -# Added by: ednapiranha -application/x-web-app-manifest+json webapp diff --git a/node_modules/request/oauth.js b/node_modules/request/oauth.js deleted file mode 100644 index e35bfa6..0000000 --- a/node_modules/request/oauth.js +++ /dev/null @@ -1,43 +0,0 @@ -var crypto = require('crypto') - , qs = require('querystring') - ; - -function sha1 (key, body) { - return crypto.createHmac('sha1', key).update(body).digest('base64') -} - -function rfc3986 (str) { - return encodeURIComponent(str) - .replace(/!/g,'%21') - .replace(/\*/g,'%2A') - .replace(/\(/g,'%28') - .replace(/\)/g,'%29') - .replace(/'/g,'%27') - ; -} - -function hmacsign (httpMethod, base_uri, params, consumer_secret, token_secret) { - // adapted from https://dev.twitter.com/docs/auth/oauth and - // https://dev.twitter.com/docs/auth/creating-signature - - var querystring = Object.keys(params).sort().map(function(key){ - // big WTF here with the escape + encoding but it's what twitter wants - return escape(rfc3986(key)) + "%3D" + escape(rfc3986(params[key])) - }).join('%26') - - var base = [ - httpMethod ? httpMethod.toUpperCase() : 'GET', - rfc3986(base_uri), - querystring - ].join('&') - - var key = [ - consumer_secret, - token_secret || '' - ].map(rfc3986).join('&') - - return sha1(key, base) -} - -exports.hmacsign = hmacsign -exports.rfc3986 = rfc3986 diff --git a/node_modules/request/package.json b/node_modules/request/package.json deleted file mode 100644 index bc2b653..0000000 --- a/node_modules/request/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "request", - "description": "Simplified HTTP request client.", - "tags": [ - "http", - "simple", - "util", - "utility" - ], - "version": "2.12.0", - "author": { - "name": "Mikeal Rogers", - "email": "mikeal.rogers@gmail.com" - }, - "repository": { - "type": "git", - "url": "http://github.com/mikeal/request.git" - }, - "bugs": { - "url": "http://github.com/mikeal/request/issues" - }, - "engines": [ - "node >= 0.3.6" - ], - "main": "./main", - "dependencies": { - "form-data": "~0.0.3", - "mime": "~1.2.7" - }, - "bundleDependencies": [ - "form-data", - "mime" - ], - "scripts": { - "test": "node tests/run.js" - }, - "readme": "# Request -- Simplified HTTP request method\n\n## Install\n\n
        \n  npm install request\n
        \n\nOr from source:\n\n
        \n  git clone git://github.com/mikeal/request.git \n  cd request\n  npm link\n
        \n\n## Super simple to use\n\nRequest is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default.\n\n```javascript\nvar request = require('request');\nrequest('http://www.google.com', function (error, response, body) {\n if (!error && response.statusCode == 200) {\n console.log(body) // Print the google web page.\n }\n})\n```\n\n## Streaming\n\nYou can stream any response to a file stream.\n\n```javascript\nrequest('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))\n```\n\nYou can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers.\n\n```javascript\nfs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json'))\n```\n\nRequest can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers.\n\n```javascript\nrequest.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png'))\n```\n\nNow let's get fancy.\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n if (req.method === 'PUT') {\n req.pipe(request.put('http://mysite.com/doodle.png'))\n } else if (req.method === 'GET' || req.method === 'HEAD') {\n request.get('http://mysite.com/doodle.png').pipe(resp)\n } \n }\n})\n```\n\nYou can also pipe() from a http.ServerRequest instance and to a http.ServerResponse instance. The HTTP method and headers will be sent as well as the entity-body data. Which means that, if you don't really care about security, you can do:\n\n```javascript\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n var x = request('http://mysite.com/doodle.png')\n req.pipe(x)\n x.pipe(resp)\n }\n})\n```\n\nAnd since pipe() returns the destination stream in node 0.5.x you can do one line proxying :)\n\n```javascript\nreq.pipe(request('http://mysite.com/doodle.png')).pipe(resp)\n```\n\nAlso, none of this new functionality conflicts with requests previous features, it just expands them.\n\n```javascript\nvar r = request.defaults({'proxy':'http://localproxy.com'})\n\nhttp.createServer(function (req, resp) {\n if (req.url === '/doodle.png') {\n r.get('http://google.com/doodle.png').pipe(resp)\n }\n})\n```\nYou can still use intermediate proxies, the requests will still follow HTTP forwards, etc.\n\n## Forms\n\n`request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API.\n\nUrl encoded forms are simple\n\n```javascript\nrequest.post('http://service.com/upload', {form:{key:'value'}})\n// or\nrequest.post('http://service.com/upload').form({key:'value'})\n```\n\nFor `multipart/form-data` we use the [form-data](https://github.com/felixge/node-form-data) library by [@felixge](https://github.com/felixge). You don't need to worry about piping the form object or setting the headers, `request` will handle that for you.\n\n```javascript\nvar r = request.post('http://service.com/upload')\nvar form = r.form()\nform.append('my_field', 'my_value')\nform.append('my_buffer', new Buffer([1, 2, 3]))\nform.append('my_file', fs.createReadStream(path.join(__dirname, 'doodle.png'))\nform.append('remote_file', request('http://google.com/doodle.png'))\n```\n\n## OAuth Signing\n\n```javascript\n// Twitter OAuth\nvar qs = require('querystring')\n , oauth =\n { callback: 'http://mysite.com/callback/'\n , consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n }\n , url = 'https://api.twitter.com/oauth/request_token'\n ;\nrequest.post({url:url, oauth:oauth}, function (e, r, body) {\n // Assume by some stretch of magic you aquired the verifier\n var access_token = qs.parse(body)\n , oauth = \n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: access_token.oauth_token\n , verifier: VERIFIER\n , token_secret: access_token.oauth_token_secret\n }\n , url = 'https://api.twitter.com/oauth/access_token'\n ;\n request.post({url:url, oauth:oauth}, function (e, r, body) {\n var perm_token = qs.parse(body)\n , oauth = \n { consumer_key: CONSUMER_KEY\n , consumer_secret: CONSUMER_SECRET\n , token: perm_token.oauth_token\n , token_secret: perm_token.oauth_token_secret\n }\n , url = 'https://api.twitter.com/1/users/show.json?'\n , params = \n { screen_name: perm_token.screen_name\n , user_id: perm_token.user_id\n }\n ;\n url += qs.stringify(params)\n request.get({url:url, oauth:oauth, json:true}, function (e, r, user) {\n console.log(user)\n })\n })\n})\n```\n\n\n\n### request(options, callback)\n\nThe first argument can be either a url or an options object. The only required option is uri, all others are optional.\n\n* `uri` || `url` - fully qualified uri or a parsed url object from url.parse()\n* `qs` - object containing querystring values to be appended to the uri\n* `method` - http method, defaults to GET\n* `headers` - http headers, defaults to {}\n* `body` - entity body for POST and PUT requests. Must be buffer or string.\n* `form` - when passed an object this will set `body` but to a querystring representation of value and adds `Content-type: application/x-www-form-urlencoded; charset=utf-8` header. When passed no option a FormData instance is returned that will be piped to request.\n* `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header. Additionally, parses the response body as json.\n* `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below.\n* `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true.\n* `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects. defaults to false.\n* `maxRedirects` - the maximum number of redirects to follow, defaults to 10.\n* `encoding` - Encoding to be used on `setEncoding` of response data. If set to `null`, the body is returned as a Buffer.\n* `pool` - A hash object containing the agents for these requests. If omitted this request will use the global pool which is set to node's default maxSockets.\n* `pool.maxSockets` - Integer containing the maximum amount of sockets in the pool.\n* `timeout` - Integer containing the number of milliseconds to wait for a request to respond before aborting the request\t\n* `proxy` - An HTTP proxy to be used. Support proxy Auth with Basic Auth the same way it's supported with the `url` parameter by embedding the auth info in the uri.\n* `oauth` - Options for OAuth HMAC-SHA1 signing, see documentation above.\n* `strictSSL` - Set to `true` to require that SSL certificates be valid. Note: to use your own certificate authority, you need to specify an agent that was created with that ca as an option.\n* `jar` - Set to `false` if you don't want cookies to be remembered for future use or define your custom cookie jar (see examples section)\n* `aws` - object containing aws signing information, should have the properties `key` and `secret` as well as `bucket` unless you're specifying your bucket as part of the path, or you are making a request that doesn't use a bucket (i.e. GET Services)\n\n\nThe callback argument gets 3 arguments. The first is an error when applicable (usually from the http.Client option not the http.ClientRequest object). The second in an http.ClientResponse object. The third is the response body String or Buffer.\n\n## Convenience methods\n\nThere are also shorthand methods for different HTTP METHODs and some other conveniences.\n\n### request.defaults(options) \n \nThis method returns a wrapper around the normal request API that defaults to whatever options you pass in to it.\n\n### request.put\n\nSame as request() but defaults to `method: \"PUT\"`.\n\n```javascript\nrequest.put(url)\n```\n\n### request.post\n\nSame as request() but defaults to `method: \"POST\"`.\n\n```javascript\nrequest.post(url)\n```\n\n### request.head\n\nSame as request() but defaults to `method: \"HEAD\"`.\n\n```javascript\nrequest.head(url)\n```\n\n### request.del\n\nSame as request() but defaults to `method: \"DELETE\"`.\n\n```javascript\nrequest.del(url)\n```\n\n### request.get\n\nAlias to normal request method for uniformity.\n\n```javascript\nrequest.get(url)\n```\n### request.cookie\n\nFunction that creates a new cookie.\n\n```javascript\nrequest.cookie('cookie_string_here')\n```\n### request.jar\n\nFunction that creates a new cookie jar.\n\n```javascript\nrequest.jar()\n```\n\n\n## Examples:\n\n```javascript\n var request = require('request')\n , rand = Math.floor(Math.random()*100000000).toString()\n ;\n request(\n { method: 'PUT'\n , uri: 'http://mikeal.iriscouch.com/testjs/' + rand\n , multipart: \n [ { 'content-type': 'application/json'\n , body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})\n }\n , { body: 'I am an attachment' }\n ] \n }\n , function (error, response, body) {\n if(response.statusCode == 201){\n console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand)\n } else {\n console.log('error: '+ response.statusCode)\n console.log(body)\n }\n }\n )\n```\nCookies are enabled by default (so they can be used in subsequent requests). To disable cookies set jar to false (either in defaults or in the options sent).\n\n```javascript\nvar request = request.defaults({jar: false})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\n\nIf you to use a custom cookie jar (instead of letting request use its own global cookie jar) you do so by setting the jar default or by specifying it as an option:\n\n```javascript\nvar j = request.jar()\nvar request = request.defaults({jar:j})\nrequest('http://www.google.com', function () {\n request('http://images.google.com')\n})\n```\nOR\n\n```javascript\nvar j = request.jar()\nvar cookie = request.cookie('your_cookie_here')\nj.add(cookie)\nrequest({url: 'http://www.google.com', jar: j}, function () {\n request('http://images.google.com')\n})\n```\n", - "_id": "request@2.12.0", - "_from": "request" -} diff --git a/node_modules/request/tests/googledoodle.png b/node_modules/request/tests/googledoodle.png deleted file mode 100644 index f80c9c52d3c507996535a19ee0bcfe3821de322d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38510 zcmbTdbx>Tv*DX4@1RI>-?lQRh;O>J3cXtmG2<{Nv-Gaj)!C~;=9^56kgvjIf-COs* z`_+3@uipNr&#CTO-Bo9w?%r#!{crW(20#V?_y67C|Fq9LQ8BOoHd!M}SOAc+G2 zAj7>)0*`=qJHYpaOC6sL}92G*SfIn&^bI(&p}TJYgwBS{5F}^fKY8 z#Su*dEpG_q|A9vN-}rCSz`_3q0Tlu5ty>NVc!P&WKte=DMMOe+8~2|TAtC{hsc}J4 zD0rIY?ljzCDX93;#Z3bQv~TF)sdIEZo+X5qyVo}|+NI5dpVI!V12Eo}1`k940we%G z_hnUqcD*yl3?kMW4bGdQ<%S+Nq>-S=Nrt}4WwkjGq>OTY%!B=CJ8w#IenptLVpc_V z1`f4~Xi@?&sD@*|R)6y)`SB0wheqC}eNj-v9bcmL2^X6*MoZm{esqIwe2z;JRYD?H zR`$jhNv|+C@Vp5MD0Bx=i}7t@UfDUk|38gA#%a#oGvFUC_!A^7VE7@Eu7 zDy*la? z46rH)2FlGnV3n*)<-E8exU`^3QBJh~j)^!{)iNuDXE4+=EIIn_*NRI0z|;&@DLxnl z+|_CRDWB5}X@042CH!UDJgH(rDj%2suACjAniipk{VR5Fexn+!oRl=fVu^c_Azb}S zY-3Y2cN{j_9osMJo&bB|j}L0aTK@pGdMANi7YzZUb3A&(6vt*lb5pCgKK}rqxhS|J zW74A%DRgbR8s)MaSXBY`$gbvx%2lLRaLE$BRFaVZVXwhVdE=WLTFYKD0v z6H}C{+FOqTAxB%WH&WLLnM1E(u6{)FtCn!}PHo&@GgY~}a`OuO`478g$0?$syQKc> z!-o)$Frmd$X?=!eNdhD~lM*D8krn&Frxa>@pj|~|=4d}0k@iCz$_s0Nx5}?G;u*TS zn9Au(${5pdW|Ij4$}m$M(-t>T0iQMZKR^?D`9IN~SQW7inU>KGmi~WM5S|H8< zvb8MtTf*rP;8O8{brk?qSwOV{zcUKHDSg*6^5w*~+0q5BZ_DHzWQn-IJq6cyir2e7 zqDr&0bMC%os)oDb!n|(BdmbU?Y7UXrk)s48QFNLB0<5hCU0IA;c||y|tcph{Q2IWv zf_Z2l){Fw+5BTwm)xfB2BHU?X|X$n zGKNfNQ$PxO2~BlQT*J38kd!2+LK3`i+ctZA?^?sMJw2$oA;&=ZGk*;6kvo=A{4u#d zQ$#rWAuYQl*;<>CszpQ=)q9Y)SD^4{hDCU0Qf5R4e?2hg4i6YZ)3Mi7Z`6_ER1)*e zW%D$9K(RkJKWKb8IM<;ULBRWCiKRW+F~3mGBQ!N?-zU^>bQqUxIVF$N;{A^Cic`4@ z8|=wo{ebS1>de%@?*Jqx-JID82IjKpP=**KeX7C^l}M)ad@+DlG{AkdPDeObbAv7_ z(5I*&To3RbBAU=o77DkzOBQ;V&=h%4nTfmIQs{vrB&wa`ux82QE4LQ%Q5%Z`2hmb2byW*cHDV{3L|IuNBax7f<}C%C2A z++doKajscVL@P-+A)(a|hqBjfZ3kr2RV2eO?yE*x60JbO;~fj2DMlyDdp91?wXNpJ zE>N4zyY6zd-bp(~y1H`BH|92Y%!?)J0{IEo9SWPO6<=2S@BcVMbgjgq0Flc_)+y&v zA{5I2IlZExjVpfR&pI$)WP*Tq7%3#!I3~RxZp)Omv>`;my-Cj)QnCaWX1?tS)lnII zJQi79FVvRf4fxTYZdka(C+qbZFCwnk={4r;y`vz)T$atsSAs*v8w-qF0Re;iZ9MAVRF!!uD=}9I6_tQT>jE4JE*?3Yjx!#~Z z;r-NcBqJT1M&76pBK77!K!m0>J*!rgP)rIO1WG1EbI)`2`j+-U-7#YqOCi8p z5GTcNIs_oaTuob(XDs;gE7}`lr{`lvy<=^+?tG5qxVpBM1BWW*!O&-%Ac~8qmhY)Q zw;)I@s>WC5&D`Qwd4DRM3#F$1QaIE#GgdSB!G7jdDn9xRwpt^`uY(DM&>qr`PkGi> z6dnjnQBoeqi!`n&LcAw)`Z_MneS#X-%AC8RZ?CRT-H)kBDR(g;hkf!!%rdG9Jku*8 z0y}drhjJU@POVJg%c4ms^jOmpd(e~?L*pV?pF3C8pIy=~g-wz|`#XH4tel3K{{ULM znm+Y4)$RvYDF?r~^^^(d$$2DWbNG4vc(KO=bn~a=AzF%UX$Mu8kSFvRFoB@mW4WsD<#ELzQS}8d|&1PYl*$16$cgbqPc3aqRam=hCrW_9XUE9)bhfw0em!RReZ{byNW7oqK zf4e3w-+yksWY}RBKGPz<9W&>v9Tm6~lkbHE*6in+) z&8f5m+b=V1q+=T2L61xlBhCEic@OA@Xl#U)RFvL zwqbEdo(=FQllnsIUxs_P=uJxqGA7|276dIIR3Q9bKiQ)H>ebL*{%fY7t64uOKp+se z@mW~Fd>fegjN2F&S@CU+5y@J}?qs)Hy_hs4M46>$(UNm<(uBeh`mFk`o5v^>|8u0m zjDy&4U?eW^W=mB7-r{b*3IT$-yiLBo=GHd##Lp7_frR}CVcjU@h$p#fCwuX3NJQ*W zP%sEfU!pBP`f8uZioRCUTd#dRmvJ!PmueJpJ_YHD{z@5yE)1js-a;z%Bdl%xwjLd1VOn^jkZVUX&hzb z{FAvog1FV`J06+{vj69GPbz=wXJ%hpmi_#Y`9)vh)pZk&+K;6sKCh(Rvs>Tl$JPt8 zNqS?GIz63H-^sZ9oC=@I@#n z1N?q(tE;x)2Fqm6adD05u zai3KTqYoYB3%Ah zR^A((Hqaaim)wd`NNH<|*OE3(wd{C}G?UaX6%8DmIikM*cCY4?*3#m~;`=={`RJ|* zawd~VO-*)7lVc-pRhSg=xtu?yVc+PG4Y$l2L}HdnA@`r=)wxj=z2!@8DuWJ(0!UL8 zR{=s9Jj5>)%b>EJJb(b*3y1Gh=~)ZAi!Ugif4C-jsfh@P2eCROCq;_HYM9JyZB2)- zM#9*YI(@1^=`k+U0!s=CLE~B})>v4+wb;#j5LaCr{z_E;7#$rPwSQS?caM4GWAa(P z8Axuu)T4C=yr&%53xZ-nb$R1IIgtfUg1hXykv|D-N@RcW9`p8AVS$?HW`Z(3cD19U z0p4VLq5y2+BlIsidW*!xj%8K;Gsp+O{#w=jT(b;%kJ8V!jk>+h6CaoLOJsKI*DD@5 z=MPAQnLmlFmVt)u6d7|OITKT{EP8DU9A&{anM3uu=3-NO#o69*;U9kT&o?5suG3mw zwL(Db7z2ic0D%NK`933!a7McQvi%1-1&Xh{<>~;nt(!; zHqNGpi4~zph8XDwMI;P&kz%{;?+=W#EP3u~e@V#nk2Y`Ty&$;D1#Hs8bzVAVH`L6U z7rB)ib>!6jX&no*r=tz}ESfr_i#$OIiv|D&0nEYIz{cc;)!RJsW-eHPBxs1(SIZtB zOklO4+Lt0#{RKWu#RH@f33uRk&g8IVUyVPnsK^>hW-8i}lR7Yy z*sE>nLFWl;XuZ7}n6$=|?&}{Rc3SyHPN_W0f28W<|l-9cwM6@Ee}uj*@FX zShe9KE;dV3TtEU~&G}l}43uJzbjztA;VF<5`U!zl2SVj%g~xUlEx!C_BsCtr+`raU ztt4aLd&-oMZaUgDyZO57!~B9gR}&tuaOjU%IL2futWLx~KFIBae~NveGjem#m3!{x zT;=TjOu4)f-Edu&KvoYl2h^0tjvKDv=cxCSKnR!8nEQU2v+?VE>hp{MnNdvnON7oc(YoxL=9-!7EbAG#xv&LM zKSqF69nF4agI?#F8^dEg@$i#sWT7kP4T&{kCcDo%sLT5xnNmD=moFh=x?zM1l*T@Va z?gkn;5$N?Uv=%lRSkyG*UZxpn(~k1}wB%~>BC7zDSbKH7b2CFi&AJ=obNEm;T`*+w z;K$ph3a0WA8DgbnoZ^Xm^?uA-*nVp(juoi1Yg^&s|^-NARSuD<=HsIXfZra>-MGsvSY?U&as?ypvgq?8tRO*KqdUOd( zmcl{|2RdU~E4+oHu|&{xxu-F1lO>8-5(i3PdjPMj!u;~w&0G(hWgZk(&f22TZVl|#VKGS$DgL=eS5?IckjxRuTRLzekUuyzFMMl@7|!2AoT5rE%*{gG*vcgIFGwTOm9& z65k3madQ=caR{FYcqP%|W<0($0|;6HjivBJ`k#Y77m7xo>u)L>X=;*+&9L_p6$r2d zI90L=4w1%=>B&I32~I1m$~RCMK$@ZizM-@?t2nQTEfix9f%mR< z?eEgcc8jahwbj3kGQ;c{pD70zZ%fX0j%lp8V~NXDB0)2rS?JO@MGT;LOH};ww?hhe z4fnMMoi%T3^NJSZ5WRiR8K0GKwna{}bAy_N_zQ{cI(vjTD>UI7|5%f1jo`Wc;xCh# zQXYPl!cOlp%ltJ9qK`nrKST}NDbn&C!gMCMveh(oIuM5M?b;?0M*yp)?TI;>SQ5>#&% z*i#GzcYDy?^Crhk~OuVx+7ZlzF66#3M^XLn*R7Z zgih#LC|x=e<`l&guJ}(3`r6&+wpd~TR-UHu@zAQveXz~48D)w|8`@-Eo31g&Yn zb1pOl9ll%%A|85;1gH6o&Ya#y;Rjf3^sx@k=;u-VLFb!?ZTFHHcE>ut(k+Ah#02_n zdCLllxj)m$09i~c* z4sAJZ)n%}7vat9x0u_k~vzO)Ng>CuMZrIVHFDh+Zc48ip;0uZAa@23)pEOOsw!DcQ zb6ra5{{dQmTmF*syrDKOAlUdpxiRf;_=B!oP8ZU{%`(xe-1F$-K7kf)56#I9Dve<# zP$0WcKl52QqXLLA`Kzyn;L`y{n&b#y#}|w=_lCK140M_!he?)s<`@+u&;Vk(SBb^pd?eF7 zO)|N5Qh2(&-fRB)nsr&Q_xd-M0J%G_L`;%vk|T9VZgt7n^4r3O<$cF7a8FU;-6sPE84hmky?+vZush7ePKO; zYvai{KCHy^XM7O31ZbY^Did@amD45?6hkUuHQp+u?e^(Yk|lqugNZ~4Nz2wwm9Jjg zetbaV?*88Q*uhXh5famXrJzs%015yAp&x+!HM-C1Keq|f_`EVFRurukTs8}f)e>K9 ztFo;Qvw>W%p|pn6{c>EFEnJlGL^Gz4uIuXRiqa^hoUSOa+Q1jFD@;fE7|&=xK)R;5 z<3}U@u%J56ts%=X4o!`57A`HUi%V^th~gYnjM@{0K(aC`x2!=8y0qmc6k1&<)2$lf z!5gS?OcA)VKkheW{C-8CG)z4IW7oc|ga48tcMPxJ zj$svSf;-viK=!i>T6D?IXO%%s=8Y;%<_QPKH~iW;e}KiH3t9pxcdB$h1d_j6t+(s9UY1q`VVl4l_>gA1JiwE zMn#<;`5)j#t3GvF28{@D5rj_-(AFp&fVm)Ufhm(g_*|$V5w&DJQl+1E`;WybpO1?C zInqxaHWF`c{&MH^8SVT7Tu++~yT|{`N`23F=9AZvGBC7i^hr;tJ^#tRg4RM|{=R>- zC@y9suSStk&P)d6{m|W#ApZ|QXy?rN(S2%Ro~P#@KsO@%!&BP?i|5FaBaSl_?XF`o z2!qAlZeS@JJTx}eS})yU7lBBL z*u0j%H6;>@ZZYQhyl(RoM!1WGm@N21y*=4HWBh)#tnp##(3ablu0nYLM&$x5?ZQ-M z2ID}b_uUEX7_BL~iv5fq5sZU>h+6R$MD|mV-O-X=W4CH3^H_U1&jQBD-6timY8rcO zeP{mxA~E|~#&oJb+GgLKj4z*$+CUZQ4N7^y+*_9iCj$N@M^fvWbs0N|WIf!~N!srF zh?gRo-^R^SQ&XikA`RFOJsrh2K8FqL+TRF~Mg}aj!Z$;kCpHIwh|hT6Lu?nw^_jD< z2&U&p2ms;ZsY=eKXEQ5Y8H6W=VFzliG;~za(J09~2tOMnGjUcAvMJm(m4OtJORJ8eGNPs{TL2_mkza35ndG* z0|1LHdFwE$`c^p%XS-j3G832EYA^Dbo!UVKY%!i5^<(op?r^LfgC<{vF*Wf090#K0 zq!J4>)ac8OWDMC6Ha(X2rTaHX#bY)nfz&G|nQUQrcKST8TdJVm>sVGT>($`VRyJAq>z+f7O6o;h67POr@jS>mmIia~30sds1&w%gNiXYr&KN`|bK^9h z0GkkPl@EG6MomWb_uMak2febsYoi|YF{TQzZC_!Kd_or`GGuVoU?q!~WU#bP z_yrV82Dg+O5K$fZ<`SAKT+x3XI_lRysI424x->6<6N?i#{+7H;8m=>}ICZb3TU>_y z1JLXzC2w3A^_MZDBT_3#;|nq?0kqO3B;U>^{7B?uUOeHMI`}jsY|3e*s zFa2Zrrl}ov9du;U*O1%so0&+issgH&+PR(~t1`paBvY-E#ScU>?SzjpDx&np$i|Ly z_@k*>&aPgcl7DD9ivhAlRs>Co5pVlnoosW%afq<3p-=_HDNP<=9DZTH+~Rnc&^^20 ziMn*q<#!++b(-KuJ9KX!WkACI@37TP;uYIbgX+oxcUe9(4D!g>-qTHNsDqJ z-S1~SFzk)z%466Jo{D5k(10Lr(#N zERQ%(nAA8IHAU?77Ma)t6?2(Il~xwIMQ#Kjs_ij1r+K!ziY`{aT|nvmW4PN93IAO3z!mo|T}s0lE3eg*`-I?^r^5ZO6K zP9)a@=~h;Ry;&iK0mqr#c}ssU z@Rm7+v~3-UlRjc-n+luwe4o07;>yxd6|h;*txerkSh4z_c;;=7X&j=!0I~UF0Mj2G z9C4Qg4oa(4uD+CC4Jc&5GNA-Gwq`Z}I5x{m3Ajs&xxItp$i)_0_8$T+H@TloT76>G z47;3a96LO=ye4X}NE=e(Q(<)}p~FJ5N*2+m*zeEu#8N@cayuuRaEN5#SUchTREc0I z|2A%R?9M-fnvaul*0EpXQFlvFt#Quj4U%kyV|LwLb26(Mt@+k2w346Q_D`>3TOjE?+yt93paKVB=o z)V^yLNc-x%EVPlfQ>T&>#ac0!iUT%yf5@84jiw#Q$c6>+jkRc#tWJ;3ecygk-Eb=t zuyV`Yb>5P#-nYcu6*UH=Zx;3NYIYY)X-5XCWf`Ed95~uJ+_R}*i11FNDO4FOySvwG zaUQC+5Hb}lAx=KRCj#@I-EF=S_&P!7V$#KrK92eOWRx~SQu-%&q-Bv zEI3e=bk6fX@i=$rm{Oc;9Q@zY}3Z#!+!vK{AMY2ySI@E#Ks)DoniDXr_rv z=`vsZs*x=0kLN+*J$?V6yM#X<<(rDS0VBehJN+JjbnramIj2N|Ip#7LVX8D9%6;(4 z!^=#jv_jEv)&E0IFkDk4OK;{wcI;P@WZA7qEuA=`emCl)af?f}yUL%~r2=PXhQ8gH zo;Dv5Oy-(Fzg2b_&D@)gJ2-s?GQ-g(P7oFryq}Kk;9#!mWiMol3c+Ibv^2T1C5ar~MMNhBKRVa2b%n3x7>$5ccX&x6rCbBB zgxczdgO?R|L0IIs`@>3Ki1qmDGh<4aGI$!dvR6H{vO`>*i9?iW1$`7zeB^abhVp;M zV4x$W=b6#rG70u38RL%ySfXw1$VX4PZoQhlF7MS2S zt8&vx)1{#1*e6$45)usZ&3kX@>_&}0f>8De2ZJ=2;6>#tCDGE z`G7kUOWIvcXKHp{J&Ujz%8z63V39~;18P5n$39pz`Twrqx;gN!7E#@4-4YR9dfEMz zv6Zaw@jxH6_;WVd-Lj`CvIftY=#Yp)jRJucGyqA%gcc*%AYQ8r)qn<7n+l&`HIoj zZyQ#-%YubZA7~A-_z(O~>}f_R?5ab9L&+7`B+kDU7lONQxaT%u4((HP*K#Ym_LU;~wNQOqu(WyMglj_J!^t z?F}{gj*c$oqxcXX-B;_qK1?wh>6&>=-*Q89SuB@SAzn-A&Y(D%+u#8t z9==OWaOSXV%_}ynd2N|J(FNZoDIeGe{{}EiO z0yXsr_?^RKJM%ll4D>YP;Rk66kJ8eX>ZJuu z8#*Kcit?@T?x2$MIv2I-8FFbFxO!6G`da7!Vn$jvC7G(F;-AdppEsh*wqOi5rAOKR z@5ia`dpcEvR~+NG$eMW?K!t}t8zk6na*VVDdRN&fR3510_!)5cvpaq_{h`QhZPtV6 zrjI011_4<95E*LD-9R<;#`_lXg4L_{ougt8^P??gM$6S1izZ@D{$pryu72KlvOld4 zrex4?!Ob=-vY?*On1njvKojp@B`it`WUwC>064EC#x%pZzS)Bsv{+ZHeAjNWZcLvmI>ZL2-|NGe+4}i_6HD4)Ri#gsS!aYrwEL#b;u#0^eg2@#VnLTg z%isQ;GMr659zW!rb=G7Dq_~_(2nU+Y2eh1~OYCV1X%B|RG^c1RQKO^JE9{w0?U?t< zN-C{%n&SED;p!1!NMEfpAqPP%3MQ?XS{TegIXX|uxxKtyj0i-(Egdhi8WdD*J^*0Jv>B;uI1@pK5Ck}nvLd(LH z*qT3q@fEyvb+t2iQx&;m7B#_GR9ZNZa6sUjbaoL96KRHu7juGx=#OzrWSSo&cGA0M zoS8Mg34h42U7)U_dSX7H5C24N$V#E~yL4BZLe`8zaop0SmV=DvI;J~T<0TfkdVNh3 zKRbrwZl$jz+&=&h<(=ufmf46;UYZ9*dOt3FSW@!1kh#%lbYn}9eAe`iG-;!8`lzf1 z%&^`#1dy!%j;tWLSxycM%M4oJ5s_sOj{83Vn19R~%3D5Ya*32l?gfYB8-9Y?3kfqDsikK7hyY$*5JKgascgi%%P>sx83v3_?Vx z`zF!5)a3|?tzxy~Wgi)-6kievyA=uR`y3u4v}SQFp8L8mGLt}09qr)}-F^x0LbAX> zA*hQVQ6@Il4%S%`kdmnzy*0-QN}{dWs()Xj#8Ll=@{Bp%!gmcL+@tbFpa;HcIJSkt9|aY3C* zd@9}(%~#zIK8Pz~Kxs2Bg(-7WOyEOm!7ZQH#_S7Z>OAV5WID zfpM$0)WF~_7(1DXwis9;=?;Xa(m{K~3hZdC*E|1FSlc|yNdWGh#u(p*rqM@?VX%A3 zNBGIhvK+MaEE0xIiFlPBO*UZk80D)({6tW;X+LxWm@G}_X)poZ!$jH{QGyCrz{@ff=H-G$kQE4N|+y~aL3f~`1K@* zX4ECaZgN_DNhwF6R@SIC&HGK`VOk`Dwz>jJ97>`H#8MsG&eztPA2X5H2XjsF$Q_By zO|wh5gZsT(Yy~zC4K_cq`=>1(`n1HeuZ-Jb&Vv@T3@h!d(bFjnP}KXr#GAA1!UGrj|&4=YpZJY%KGW@DS73UnbVXD$;uf1 znyh75n3wv+U%lA8&<)DOeJ6&-=o0zulmyXSVNX%$s4H_-{B>zF(AvF0%W49Fw_h&% zr+<#*1kEe)Y_Y(6Q+&L{i_-!Sq;``ctNlhiP~ah?aO_=tY!~F)H?it*ldmpGiYC06 zh{E>2ptQa`dckvrM2>y3@U|e6WSZLo z@fs^)E3&r4RxmwPntpgzmt7T8sjV}iFby-4&n#(GAtWU2{s92Me!msKsHfqW&uq1n z3A0K}Y^UHF+fVo;*mU88hS+xL>A^1uJL)l=A0sS?6JORTH-7y4J-Our&ZUj$0Tt|P zrkDaN|9mxQq33XJdKj2=6Z!)2NuinVr`zIx10y5jC^3CVDP5%JT!?D^w zKe>em+QP1$kVJcJDdn47sqjG68Pk#V8KvR15Vcw|GhkLzPX;{ARu&4DlnlP#6`#yO!Z6eXVo|U*2~nNO}A1I@+w^K2>WGTPVqgH6D|`@TC4P4ELU~!Lq%yx zUR%zjo9mD|CNEpq2nXn0=@T6W`>zUnn-#`IQt;%9(8>;{;);S!zax14LYD&KP|H;I zJCZK&*Y??U6^N)182j3J? z>mQqgN$grSE+5*3l_pk8FoWi0=a0LyeO~&)3MQjgP_iNT^=fF931?Z(ZZas?QlvzHruiw8Lps>x~ z15l*Ef{AAOLQ*m^!s3(jqV)PWcKf)w&Kly^dgSCJ|p85328siUTF8=sarbP%I za9OLh90KpanASg5?XFyH&&@focl_vZ$mXT&$MDp}ak=4Odh1oYQ6&ba$GDQ%%@@Fw z6Mu@&)4^LNOTurP0Ebea9ciH3^7!**(lYC}Q)6$-8msuvJ|6c0noZC;SS^BTWV}MS zu2c_wv4CqnOJyX1Dn1MztRk%5x+Oz)+oCQ*sKV)#6cRFLziUS!wZ=GxFk-zP5ZzP( zy?P3>qkwD{M)wA1A|M6Z(Zm;B!h0%jffl}CRN{7a-uw49G zOPG8aN`i&fnr){sO-aYXQ^u`rSSgtrl~q_OoZvRe1hl;=S^D%iEeiRLQIMi@;*4?r zCu$;+WrFQj%}x)MbFS9w4z$aebRvcoAA$1S^%NoI*H(_1fMQ&RrN^Q`BK?*y$f^L0@=-J`bZPO6zqkQ~`ZHVkX8jSW91#*lXW-dbWLPZ7 z5BItgcrXv5m`s&MGBQ(-z;Vz1In#UP41){O9f+bW{IefMrHpAHY{!jYRIgYoHR{bB z=Pvcu1d@8|f?V|<5Oya^j+kjLkL$nRt-{KuZ#+HVR+BXqdcYsa3KLnrSnrYPTU(dT zL}oT#Y`L<0LG^W^=Fk<0^-3r3HE10ZH7o8H))8?Bg`{BGGPR4pi4YQVt47v1d3S3W z*hh(~rabAr5R2LPzf6DV_WDtDQiB`(Ns4w6EW14^u=`ewkuKI8n~qokQZrUJT>JX| zv-;9n-3o)2s^*2bJPIz2_^Z)SlKs%yOz`|}6IFQqx_k*1AX@6{&m)!b4lqoMWWldR zO2!R|3h})D`?rEA21OE*!~>O@Ehe_9?G5Vv^{MKl zrq=%=zn)HF@(%zr7MEmVwppvSQD9igwR+DlTO@1L4(7#Ch{OWKl%yzRqr+VT0Pklk z{wIMHj~O8e2!Lw@S9GwuG+X|G+P)t0tq~iY3aYbg)Fh?b#oh8W>z$-6aH-9V3_5fK z$lb=L3YHbCfC0iP@bJ`MWg&?iS?P`YY~B)rP!rV|O%@(Jtk`hp*dr~qK8i;vk9LJJ zMW~)n(-a~ToZ{?TMO+D6sz)!JZK6B2bwqUIaE}VCJ1#H5nw{(v?=y{ zfs}Poo`64kF<=Om!K-;7>hXT@>F-c0{mD2xAL)sMns24=JI_5!H&1a)%m*+b|JLbv zr)tiXa9=V=4_s*_YAtHb0!7OErGC~jQYLD`=*U*5MHw>&Qv!E69DR`o_VRRZ~NuJ^YdrfzbAQVgMvB7yrG6N(0E|Drdk{a@Mr(Yzp37w-_nG;5ArDUPJh=jwI2K1O zHKxjgZRL%3N7)|>o5S}Qel;9^_N6p+|6|H*i*`uV?(g))>I*m4#h2_{e@aG9YQg(x zs_X^Tp77{ar)<=<8cHcNSl-xZ-FvmUO7=FrGt_Yc>{P{q3!+K7PhX(N0Pi750Iw5@ z=s>?9jz2-aJ*YMhv+MWi=W?SsTi&>X1zZNvv^1V{%`SNr(cpJ&msuqgh$w~MIwxDZ zz0zH(D%>9TGA_h(3$MyU(@16BghxiKN~5^!bI52l(t+Nc2T=en{Gr@3ygh2?|ykB_Mujh2w71x*fO9jiONQd4wfpu)3RexAE{@h^QfCAuE9|%d?yUT z!(VW(eVDaNKAm^gYe4&&NP6rejZO30)Blz2xf=nHIGGr~)pxmVdn(U*$UbguAC;K; z;U9q7(lV=RX&#B-P&QZJ&cplJEA3PRfUtpj9}0**S6)10S9E_o=On-qI#{{x_yxdJ zse%*W;rXfMm7lqpwg9C{ReHy$CiP7?3WVdnNwTDiz&fk=az#`n5Bu|=tNg*V{|UV# zp<~b7H|vK0!r>Bp8+n$?Sg;_R!K8}mOY@-MqfqlP2TP}+`R%Q|B5tfT*oM%bbPB^! zQc{SqjmMUX3PAN`rs?(AaXoQqca(ZFKMb1r*+#MVESgWkf#ZkVKk3dZ}FE!6Gkr%}QFX9qd5*K~g+st62AJ>m7e? z*W4K9#Drx+c|3+w>n#d#89S+O*mO#>pwlhFZ0j)#deso+FxH3xVOO;_hgF}Q;og?A z%M@sk5w!g})f?y*<_|=kUR!XSJByLofBtCvLwK!X`$GWRJ_CiKOJ1RU-a%Vh zrjdA+{J5eg-!$)pd~A(0_f+QbmQc5Y%>ubo-XUwkW=Zl8CNB1^NmqadqkltMq=_X% z1aH2U70N41wffkDMT?rrAtO-VQ{xreT)(pZKX+ z+9tbG+^*-StumcpTE+hZ00lN@BKD_#i{gu|?aL9=_Rvi=k9X*8v9#%t5#V5*e_Cgy z2|@JRsUhL6KzPy^!T#1N_VA{Ut&F#loe>C9Lpi>NIEv-rEqQ^$lY)v56^xVEjnjN% z>e#ZRi>+c66&b$c-dvK8z7g?DMNDV(EvbqGIx8BX;ZgFHbr@9dr@A?cdrkw}vo0~# zkG`nHW*6retXo~J?^pzuIeHwmMGm~seu~P!Yi`^wulQO~-x9OFeuey2w=o8!_>ReF zp$19}d}a*-TjkN^oG^h?Alxje)md0MF?mH6WKo<{7Fne*RL2uhtr1bpX^gP%y+y4N z$x@p*0pWxNp2lNB4a9DO)c$-Y<%aU^B=wm;Zj2K(K0>lO=_c0VPA|`sS=!|c<&>EZ zS!~#12rGSmW05Es&$$(0!&{|t0Yam(qMMvZ^VlG^OjpZaX!Xs}j5n5D8!TAz_Vr!z zL_5n~;dd`u#F!bv$AK;M`;5&FbEhc?WEE1?Smp>>Bk;_eB}~U%Y-83#2E!jLyC#jk znf0vFfWDEG_j&n%(q1U$Su63&?iTxXto0f|4o9XCi~FpUDMI+HO5DUc;i&6#F?_Yk z&%IC`l~uE(WUsF?f=P0q;#vQbUX3TpWT~$39TDn%ba33(ks_SRr9!7Z8s@K z@6lD&qsrRbd)?FU8eVgBJR!+&zadAjMXnYx}=7|kJf=}m| z_X#eyjulMk311Eyrnufe+QUKFTK~*3{NmbZ`aL7I{ zk-_zIC(KheVXM;(?otS0eX?ms_s3^lrLpMq>eXMiP8S#ycugB_KBvvy=*b z41Xv3d+??2ruwzH__Oqc5XRfj6u{IM;-JZKl(K*zzvb;>KDCk(Z$}wN43)PyO5&3{ zc0_ZN{U-~1S$U8<1*OX66K8Kt+rfVo26K@0+Ag#$1*@Z*Sf~1oicZE-w?>Lhf?q%4m+PiO6~W{7IJ|4*e?kJl&NeKsWq@~LmMm0H8ZVk&s7Lsg55h})Fs3Ho1yJr&lBC)J|1qu}) z2$&*3s8)cefOLXI2xeU=fj|HN2p%~8nj*{eM9~vOO%X=S=Z%y`I>nf=)>V8+z^3aHxMOi*>QCT&Jqek90{{VT+ z7{0Z8vuv|+(E%<=GNo#u!qe{9uIS1#S@c^g<}H(#xKnbJ-Z;CnW=U8lQq?F|uA?0y zptj)UImo1mH(ifVKo^~*ZXU70K*|zhYD=eK-ohJqn)N$hRwIkZuI99s=_JE0;UlW z9&7SXA`t-*^Ut(lp)Gw&PF0r0D-lhYi&XQ01au% z>x&)*Q5+Fx{{V5@1CG2SF2`ORBH#|@wB3P838}XZ>=ru&tGRjUiAN75Wo70i9GT>l zl#|sJ6FGYI+M=SW7{VeVZE<{ckEpDks-mIJk>t6~Cvr~Yl6NHTrBT98H0>Ss*N79G z#_0q5voj%tPsXjMw^9qh?7 zOs*|!T6b)CJG|pRWFBI^N`S^StvP-^O7cB5@Rn-YvRKzK*5E98s{-zG4$>v^Az@!f zJIGj{Dyq%1sX2!ba*_<4Txt&_y~z%Z}H#xoJO>uY}8F*}j7M>BBS3EvG7awR9&`M@2gi%+aLIQ+MVy3AM ziphzJ2Lh^?@O0ECJQ$B2Tsz087b? zTUE5YfQKNNIQwhp(<@t{yCa6SJ*S4;($Dp#1B3qnl0onau7;oMRh0Do9O0i%zjEZ> z!lKe{PT|UmIdI|f?iXEA>rr1H7Lax!$82@VwO{6aJ+igYk|bX==6AOeF~+1zwS#D_>0*Ft(`017Daq=sAg!aB?V5|6M**m#K!`U0%7BwcGi^A zmc1KomeFS87V}Xgt!s}L2Y5j&X~s)I_js~E*pr2*t`+m#r)@<}4BP>vjkArie9v5L zvj6}9000004gdf+008&^0QdmbN&o-=HdHJ3QAG`Ry*XM_6vSgS<8C&5o0TsWMwmLA zj$GDS-Q{wYJDXvaYnC>TE{&g4;j1|D?IAh2xe0U^jc*>%>76GFE`wFbp;xB%-g8v! zrH6BQt3AnB;wCfZ;BOR+T|$w0`@M!A8tiY3s#SrP!*dYmDtwTjS zBIqz(U}n2QE1%I6OUulaeY!oQ9pXK3u|&>tjn1c(3u-kYGBPDW0r~;bQ4$g$kdL3@ z8;`!V?xLuTn)9>DY0e^eu5&ZU%Gg=}{vgLlN5x*KnoXkg_Ity+2lz|Qei;p0+aqHN zMp%Ig)%GE2m~yxWX}51PI|RBe%9+wl(|HQ?oK%ZtD^q{Eng%e|}~5({{-ow9S4=J^j6;9+m=xBk#h=je*XvCQ$+EcH||5bKdUHq`sD zvI7ZByLo6P>BYKo0mvKON2+l#coP8m)eWWv5aTHzBgyZ zHawS0yFc|E+dlK#Cc_+BMhhUO(9YlE8*!UP+Q^bb>vG~8rCCN+MlHYuPNOvrbjTe_ zrkHDXX>EUE)g)8G_fy?5lMJ{HJ|&I>wm?609(G|PuG-WPU?$B_-RYXiJ-8XQFOkpufQwW%BSIs$U)G!Dx zFq4i>X~T!1-{e6GLmNxmCOxs&^7L9m3Hp9))*0m;#R8^ z1S~8|*YZhLo1nrT1|{Q$D47sdyCOVP4cqRB97<~zpX}#L>B`U2G<1%V;xoe}r;W_d zJ^_H%k~ZQE;>Ov=RO+6$f4rROgRWGKsZ}hJSh{3u1gb`+w@_T^ z^Ywa&Su1nThDL|CK6oQ43tDIK&WU3A`3<L2qPRp6}Mr}SG|^H)R>g_Is9=T`6P^1ISRPt zf+bZ>1GD(NBD2uo0AcWRteHeS`17l+2W`3zt^L(qY_xKYee`5EKgP~B{7DF`KBTgIj8ZZG z0R2ftu6Ia`%Z;+`ExmRcM#o@Z1m)CVtI-VH$jeVmtB>pijE0MkW>dR;BPjI5K?G6( zQB@QvN&;aGT+wG3q_4?~v9TpsyNi@92Ao+a*XXF-^mFppV}aurjn)1t4%#>aCZP@W z6y*>fA)+k8Mou;%qL1aI7{#$fIa%b3v>7x=I1%MX4pd1L!+`sUYr>|gnvNILR#e9o zJ9)Y84QTaqhy&(|BIJ$rU z>qToHq=#m@P)!9b#n(%dcJAo_djartY&}a zO024Bo2&Z^ziUlXqFbo-wQO@$)l@ve!4o14fw*AVfMmKsA<4n0Q zUgbqSfH?3T06YK(+eA$fG)3{=SF7?5*-AfyhkYj+v0O(;yo_Y!`v(OmkgKwIvIlV0 zVvxcBWXw|l4;<)=k>A<_jVU*=w;2?ZC@lW~4MH?Bg(v~l2AK~ab%Bf?OjMG4$o_$@ zV(r|9+-XKR+uTpWLxmBthgApWX4L`-fTl?#L+78Pj!18}Jpv*F{R3QAcZ5h>aga$+ zJl64pv6d-fKLt8aF9uLLymXj25`cZg!O27QAN1B0Jt2^ovF#NF(kG@>y}i$E9{rl4 zvql*b;}qQDU@&y0_*>OLq8>Q+FOSd91J1sT{T868rR=ek)g0MzsSO?tC64@DR8>rV z(ABN$iH)se&vL3T=(WkW*QgW#P;n%Y>b2On3xUi8>tfa0!lpb4zr+{==Tmm~Un3i* zZSD6R-pEFIk-*WnkS_GeP%D@lO@*Um)+z*D-(&!tN~)*vRWN}Hnk~@jIgE7-1pw;g zN5>k_v^0--X?YFLfaE+$DjrJ*iD&p^nor#_Wa4$o$3UbbMyF|7D!^{Y0nVC&_H>FE zrV$g0ZH_#BN^{e3sCk|TMI5dapl6xPnCJW~_+`VuD1{v|8gfcRzFp8RtCvz`@2a`X zqUIIbfT$}daS<}7GJhQYn#-+55j;$00~*bM*lc#fk6f(76h@WA6>>R~G5lqe8ZAZ8 z2T+`rsYmnWMBpCXX1AFDV4bGzZ5pFplbv4 zK+>udpqb7<{{Ri(2Z8{H0CfKTKR^At=Y4IcUs&-;3%|pIzn}g79;#A$F4J}h^|Q^S z;pCct6)4D=h<<<{37R&`GT)#B`9P&8a35gfUqO2dxVq=rR*{}Z@kq#D89(XD_7AuO zQp#psgakaa^s41+7YQ2rUP;Ng0=Hor)mM)fHzEPjlXOgB@*f)84|`){3(!->w;nzNq&3#PzR&e7 z8D+LZv~t(P&*hFe90$#<`7DP_MkKq#o`99hf@y)&4oV(W>L~pD7~Vts01mlaY}L8I z*eSh@GQ%uqi0U(O(k+n45ZP|4FHUM>kX?e+iDOQ@dMSQzk1HVt%Nz2T9dvo>5Y;UO zbzP$C`cj4XsivAantyq`Bm?A2NIqFqHI(eBE`m{*WR1-}hj08YwlOYBfy@}#UexuaZJ8klX*{7(CI~`i? zPGR$7fob$wLb{S#3c2Yf9@`y{QPBKG>tUSaNQYHZku=jGj-rP!5QHHBOmm#(5GhDf zhaw~316Q?3q2;4b69=0$71^R;;iDI zdBhm`v~o8)W88aefn145y0A=4Pb}rC4%$49RV0d$6@}Dlb;=!9w@9bMv#-?Z5K&dC z)D(FPn;3W~Mkq$bMzkT!bAk++HX>!}F^nKyL_~QV5o9_d(;32*H)^Y~n5P{yulW99 z3#}+r00iGj#H&TKBZAGjY^b2og1lKPp`)vFD%-_FGYoPM-FMm^Z8&iBS%x^cseYwETNZK#yiFy*i8@5!nZ!6yoESU~ubMvnQ>k>_s`FcFnufY) z{{UG8tu1tNG?u(!z!KgdOB_eE+!af4q-7Os^wCr{Sekv8G=c~_gST8A$3nT;{iR*J zx4Ga9Ke!my37T^l-JMV;-KK~Og(_JQnViQ9m4G_^v}Lxw-86&Xr;#}S05+^0q1y#b z9UXgH`pBMGPwu~Q@^JqEagZ+!x#w z=@=FEs|i3AFWZ1H2PNQiJ;IgbI!M|Kpl&wyhli-?^6I@<;NhI?tVa;hETazFBIAoB zwR<4a7DB}g_8w8gM@lIkm^}v(a*WkY%Naz|FIozur%HkyCj8unvAEv9M_eh}mobII zh3zG;jo|FyMhL;@j1kkpdjq=aYtuj07QdHSz~L>>SQ)_O4jac+GGvgojf1^`fQdDZ zvaCQsoHeLKK%{aYn^*jYS8adux+6e#xYu_!J!w)IQ^ms-S-@nS8rjall5`RrG5vU5 z?@U7I6a)kSKtMo11Ox|=5Fa2QA@T#Rg9H!=J18&R5i~^66eZmysXLBK+pg1L#k=WT zy>e43Wab7>+yqYEunXv0ZK?c`6I2Y{ozEt_sntqFNF;dPW#LQ6BA}FtwLMtCoH>rSvf9`r zY}fGHWw^Kp%~0kspna|u@fXVMd#z(mPB#N}SI>}FcX#!w*zN?ZMAKS}vcq*c#NO%o$)#C#F( zv7xQ@4Xj>s|Jzq-2Ii z>RV$EaVFI)9J9zw2cIY7nZvo~K2Cpj;9c$$@;})AKB|H+rb2@!W;#JM(p@6}0T$po zPEp{&!NjBU^T>aFa+amEReMuHNn!Bn7q^#HW_Z^uG=?*Cu^(*YohD7g6N49N003|) zx@;wKAJe4#Yfx6vT&X2BG?jA0F#Ak*ihXM{0UX&4I}i0TAV;Xe zc&MXt%Qsug(@Ea$_Payn4h9vh78yxG6hM4-l60!A(I|d|DL^%V-ESI;P|9V!UaG5J zdd(x``<&tjz#`Uj7qMLV)I4 zV?$Q!8|}MJ+2K9p&m2!9XyXUlmEH|#{-E+jxvorYMh= zl9F>-txTxRgAlutpYDrRdypA5WMVOzaM4*9(z5d6U$VR1|^L%@agT5i~^67ag9j`A)l;_tgI+Bz@PU~j2SQ-?;z<1#Sa2Y62hMgDAIeiofF@!#N58?j+LkCcN>)z94Wn<%zv)a!80GIdl*+Y`*%h66c zNe@r_aXBP`kQ<%5CE8eZfq?79IJwEh$2cCZlBnJwIs`lk00-}{pxuqze@19KbY*~d zlFKKqUPgc0^1>y%ok9iD&mu52Z46<=dMd1UHwE7>IdM~yiBc)qK6r$8 z(gXZPCm*> zCaP=|QF0=4cF2llJc?-vyz(V(Ch$Ga%dBc@ySA}`?J&DJz`<|>K0fI`)#=Q=(!r=N z*byecn{axGlK?1ibBlmEOg=v-m;iYlNa~Oxl$Yh)2R|fHn>am2Ix<Y_q` zan|v|F36er51!co>VH52exa<#O~&b_r+)k;fcya;^dB`4q<+?EMf^CEYqk{>cOVHx z5aG$rR&82W^!nMuM6FQx*!&=O{`H7L=d+>cQqDr?q%VZ;C z8Z##Y+ep2^50O)V9+2_yCNOK9>)!f_;7sPw2xro3hGi$i2JW|veC2TC$O0ld+uF|JExK~&Hx?v&JGT12Z^I|xyrw?OSUI?X z{r=!r3b>u9MpmK`0N_#*fw&F?M1%znBk}yk{{ZV;AAWy*Svm6m0HXI&!YR-J1b{!~ zDCoicj-gip{{T=C*1o8VaPJU53@Bkq&r6&}zIyd7#_!#>JDTnXVPwnmXA*(YMcsWQ zA!(_YL_nleZWHX>6Ye0`+1MpQ(YScY3sNv;FRA_$cyS2YSQBIDfZl zo21BNBEuo0-!KOyA)QyIlSiz6-9}76Kd!c4(k?gu0K?jDa6eYdjt}!gCO-v`>34A5 zV)F%Z_=-YPCMFLhBHV}lLG*xsPbb$e=h-9CZehtu{0$c$J7bBj$u(@~u2%(`qUki% zOyk>3uMh&N1_ACQLYt4jNa~1ABB+!faz^lK!qpC7H%)u1 zg^k!NTdCz68yyWE$|fE?lvGq}R2aubMzukVdj?IDDovU)WYsjAHEP`=fk>KVDF{#i z007Y!yP_tDnj&b4qA10@+yvKj8(qyI!W@UbQmO(^kqj?inbj&ReL8Dkv#|)hiKIKoj(Vx;%&nk>^(H z4Kgm!wyKf1t7Cy6eXtHrI&pY-tGiC?<*#O&jhPs7LCLE94#LS9qAISMsH!3@Uq`!b z)`INafORCHOeHtR$Os3UXesJxjQ#TrF32F`;@33tBas9zT<^N*V_=@KnRjo@>p0JG zkycBdF*->$f{>p@c9z&Ex$ zDNHE3uShC{kQp&INS!h$iHGu>!NBXLG}maFJ61%;+Aolrlg=3kigq5M(LWE!<&XGj^_wDSi(B4on41`t=2OU$v|37x;Y|qY_hwoa8Tde?=+d8nl6CK8`-UF;MRGDC zhAEdGqNXPvbwP2uTWs{tth!f4PfFfyk-?+TWQ?C7l6nMO`g(zS=tWhk)6~70xMb$U za;nYdZ?;67@bIMMptwn?&UI(lT0`b=`7cg`H011<&*zJmY{8rF5UJA|=E6qQbM8gtNO_?!Wp zbV9m>^m@SIhIXQ*fzvN(Et)U39FA}~dRHxc2-3AxNWdj2fx5AfV(}mzewVz5gKOvy zVD`Cadq1GAsgH)Hx$cMmX>`bAxv z`1h$92Q6GAZw5_Njv@9C`2hg{9d0S1ilQkXnSs$f5JBWY<`f*z=9ai+rE$CJY3SvA z!n5;JjqvI-Z8NW_~@sGhrzBbIkJD4TOzFEc=j_G?3=3*cO?l4+#EEfoa9gBIl?2=mB+ z)DtLf)6p6OPv|-aQraLcs*n!$ci_t@9w(Dp4tQAHGyD7a39 z*-2}*Mz=sxs?15ry5(#y(qMwFL_f-FAJlc+s9^%8*&`@n04R>OHjlAXSJYEMO%`UE z;jJIM< z+a(@MTI^DfCgoo{P)w*wPCQZcl!JiqRc7TKx;fNPL#ZyYS7wGCA)WNK3qP@~R zv9xa11N}raet#tp7p{{C=H-1V{{Wzj;Fvj-aATMVUZfKeHYZU1AS${!N*~ixR8-1D zH1QwS%<#eJPD%JQ6Y79x;G!h<)%Pp7RIIk_XNGU`xaI@#3q`voxq){Lj%#sbiD>px zMg7)nk=4~blR)TAx(ll1V-vQLW;pcgdg+U8T{Ws}lj&deI3Oj@BMl8F^2|NA6_|WdwQs01Lo>K-RmfYk()=^4S+iK9h-UXq$NAJ?RbAi9=0S~smihUVqq@(P@10!+X*3R+i>^DC)l@&{$w1>E`nYQ5F zr9nRGMjM0JW)#5e{zAI%p^euR5L1MB*-vCk9YW5FfG+JHviDSgIPT^rc`%&ZqJe>0HTm=Pa zo6y8Ab7tIfEiy5D~+b5w6_Xro^Z}AA0T$m!~a5n5r2w z5XBN0f@L`|OhW(|rznR41LOoa*9k)M=*D^f0B;q&V>yk7$!t25v)c5WEZk|uC$TS@ zKWbnR4pnTrX963Kk}3rfm_FqZ)xL4WUOK6q(BN8m6}@RJvZc!DJ%5RrLQZ$_q^&V8 z8!mXMhR1HH7LH0a9?&yQ#5lGhL`)Pf`9bm{=2INlrnu46cXjbNA7qeOBMw0arrUmk1TrhLUgR#o#>uQ^WjNB$MVLGXjXLx}kFu4K;fJtcS^b-`+dXr(`>Bh`< zjItbu&^>7n)S0#4J(z3iU3;ftt8<#$)Bs0SA1)a&?}7UgV7a~-t@)|$q{gC)wHpQ?ZPgZ5l`JJ9v; zJM~sN_#ICut%!RcXnuZ&@%3Dr$VaOf^;XLeN*!k4c=+-@OaB1xT6V6T(LLE6Ree0o zm5p#KX49{7G3mCBcmXEGq4{pnbxxY76izA|@b`u4Ri|*n$dl?w#`z$Qv0H_wM3>wN@DzokU9NzkY248flc*^=~+`S>fCMo!Ax<_ znzSIy8@|MqCf4dU<1G@A48=60*|nCOig^x0n5nmPEK!v*E+fow0*T0OQV|ZK@#HZ3 zW%8n$uj-UnJDm)lXS=JIG~=KgSO?1(Di{TPH$J7?<#OEZRNN);5*VEw)^qa7tO3A> zAg{aY0Uy_$W+PN<4jv!)-tbxAYF+q^{`EHsh2k?)b;H@U~;qp;|_I4P|@#R~4nc%dh9 zJc6p85jz)ruuPCeQzU|=iZ^Ko=Wrwy1j1DS2qgd#ay-y#IqGO8Wi7tr+_|IL;Kvyx zZ?1P z(~$u)mjxe!m_qxY^i5X0)btiOn&CynA5ii3AZZ+DJsj_GpSET4Sg=Arh<;13QAamDWYRo#*Kqo z&;wcrfB*oC=xf;*;fhm~#5q94FbPak02rnzgMlf4c>w_d@)~p4@Dpse4GL9{{)!*)HtA&l!J=e^dBE5P+Q8~JdqU?^ThvfReubrCdE9{S`mVm)n z?s7nTvVV!VEO)7CK57A>yn?NW4?!KcTbUzg##^GeP19aGlWf837}|xpJyoIQ9z#kr zZ9NSk9L>V9lF`exTna%H*F@wn0g50P1y^9Ux!zqCqNrnh<71D{E&LQ#)P(d4+xsJ+ zGWowW$f834tlBsCN*N_f&muw!(30w+1OEVVhf=}xey}uyReh_I#|?>}{$2T^oR}}u z8)vu%QLTcvjty?JF)$sChb71j(d#9;M84&l7md(@Z0I@Us*#u|nY@t2)@xzxn?z~( z*;fUxzpHP$`OkVC|E08*5o08*3#fGI#c004XjwnzW~ z0NEGrh?*kxp0y+9ZrLcJ=_c{A?Nn8&$~JPD93*s%qjw1jRc^Toen@hN7>3|O$Z8H~ zb6nC+2*NI5k@Z~8ewjH%?#_3ciY)nllaEBv_@h2T%ALMNzhZRVD4jCbU~OY^;u7^P zlsOY?BH@?k%2ivxsmx2Ro+g zcv!z^&uS%NV`Kb5oo*7{qM0^xY-!ZE!B|Vll2%mKdjpabh8_gOW~Vwc^)G6gs`$w%sbv&2PTLU^#z*f;aP9v9a5Q-36=_Ax zBB|Cmu62yMr&(3ps%4z0vd0ssyM>h#D7uRr!X`O{M8ZBtpChKKqLI!oc_rtWJ$!yY z`BBMPdJe>#3M1Ad;7S5Ke!K_t0RI3`)v@t|o*YcK7 z3{;vfHF?h9b@S zOhp<%EX}1!nTWA^$YMwLNIwVG&aie#qBQ*Q)<!b}PjNZl1N*2fqQPftTdm5>t|bCAO<+r&08A(&&{7A-gQz@z zVbv^F=hs!z(y)6^BR*N&pOO>5lIg?J?Gj^OPJBOcyRZ03C2Kcqy<~Xwy?|{MWwY5W zjozvXbnuu~m2PtWrQ?sbzMA%7M;(*1%M)ZA5w-_NbJ4DIoDcNisU&-1jq*JEEd-xH zxNqH7;2-X@cDc_wyjfLQTJ6tU)>2hNC=4m^$^>0;nms~pgp!PCn1Bb5sDG}s4zjww z>2j&8asL1^LO}2XW{-eUQ#H+qIpg(?_K&IG9|3{zUV2G{gVH_>B8kWQ^rSq0@GiAQ z%x7`Sf6Y`Y2-$Ae?whU6wVZWbZ1t^ivdpFOHL(OtX0;k?DFXzHr57K*Y2sLv|5yZIfuxxj&fZDoF=X%p!A`M8**?i0kMD4Gk@}ik9C+2#%5% z+Qu|;4QRk0F1>k`1(Is56$ko}`gp!sdCkILXhmNYRTr1ZIO-{|s_7*}PT}>&rp*$G z+#+)cl#pPVMC1__&;c)Sh2}ohJ1Bf|)#{xwPF)+xeMLJ);GNwpKywG2k&VI2o3=pM z+Fw&QhC5}(OcAtiJiMCY{{Ynd4@FAx+z2+~;J}|B>YxYz09xg_w&VD%hPTEbx=2!G zkbKMv;Q&*I43!ZC*GvwvPEas;NkJ%hFnkXl2Ug07q=G>-M}DKDhTQ)EBhh)u8)a_` zzwo3UABs`6>r|MFfZ7sw8kKiHI0A zkm)^5cGH*2d;XcNjw;rSOB95LOw8oQ=8t$BWD)H(*l@vC+l9WGwusVJ#$3*h9NKyj z;C|!Cu7R+Q>2c0vaJ6IJB~r=JiKa6+@^R8BN|=X4tCCW<;6*en@Gg=!T5cP49EI?* zX&c77vqJWnVAj;p#}uNP_#67lXSi{L)W&uav%$^W4|%OCQ{8M;mbVv{@zI`A0k@;S zWceR~Dog8QD@1t%10BdjOvj!H8 zn#enGUCW6RxoF+Qt)~#CvZ8;&ZfQ3nj-S;V^#K~r6rxfT3P-)QI#yp!YP~5f2z^~E z3+R4jo=*MW2YmcZoYToiA#{0lIs3hTzs+;_l1nyJIRg(*z?aX`K0w6~9t1e@0vP-%$+$QOay~#ne#Qw8vhN+x7T?EUn> z!P_#t9O;|DeJ4LriO(JcJ_I#lo|%r~93VXWGwbK)^HMpa478Oep>HxS;}nZLg3HFc zZlhNXyQV5@w^V>d5Ll%jxd)FQKkckuqSHF>&e>s0;;Nxf}o(qsR{nf`Cy0 z_#d{dZ=SV|-e-?PkHZVtI5~Y{sEK$?qEZ1s3Q*&ufB+r}QQ!-}2fzlYNO8-t%|&hO zIf}2@!uxWbr?!fuCnR- zwxzk#+3eJgnz~nD4vigN_i}3+&CWXyGk}Y*{g~|rp|nhA`?DJ18x8KpX3}{Q?d`h< zoRvi*6})s}N9tLXY7nZOHfR_`#uFW7KZvP-JL|KK&u!hGS$?Ghgttks>WQ&}_YO^O zQ5!Nt8|GYhaZpnWTMZLLO%Z9$#AL-V#stk7X$Ff(JI46B^>vSpZiDua?M9QwY&OS#(TjNAc5i~^66GTlBMZMST-vIAN9-kfOYGM#BL8zLM~A^J^Mdd;Vtv*$lkvvGx=p&%e(nV}yO4-p#OHjE>qn6@Hq+OufcB9Me3K&2>aq2Y!qc%y;{ z!y#isTF@{68vqAD0)qQ`^hD7YiDi*&imn_gk`2&FMVDP=3X&+IkwogMs;3f>G?O7j zOkofJ0OWNCIjw1Phz$cIo;k?eA!oG~P`~71TY$FvU3k01nLqcN;&B zp}ItShe;6XD~XZ_7pwSe%qB1{9O2qWYfOAqHccs1d!d%iRKxHwzTA0Pq2>M7&hE$CI%+I2{K; z^Xtr$le!hXjQU#M1%qG1t1vZ)WIjYaKO`k=!qlfq)OQ696B603L->&ffL$LH0Am??K3X zPCfvxFfsgNgQwX+x~?3$=}iO?OzN)XQym~GNFtaSRg^zh08)U6kH)#0=I2Q(19Eb3 zG1s3Us=~bulzL9?hjA}r=dAVFJS&Ws22LE@uaK^z7oK{POKD3!khU_}XoH2E z-t)WUb}_{Fbv^@N(X&7b3PNinM9~vORjs+7O*~PXBwt-9PKk;#6U7eg`th;kbx^Ur zF@;mOnSe<~#$x%(pXNGbbi~8S)Jap1I?~$bv0E0Yl6#G+U#MOmlH%6pDI9vfF^(4= zu3;JGTH>2@Qg?~ax4oy zqty0lz%f=Mf9${6`~B1NTB%C)f)VOX<>02GT@Y45cG7Wg**aNRa7%YD^B6;a|rl20RAHjLv!?>K0Wc|Z=r*kZb-5BTX zRhBHHLbWlB(5##_I5|ko%yAUNf(9o(IM4nRZZc?^DJVvpGW&&TKcP9`>w(HMt>z?7~1o`xCD}Ql(7wN z@dg|!^Y9x5UJCewaSyEQ6`a&cIGl&SEH$`=sCN( znh2_Z>RQIh+`Nz2_6g<079U$lq^2db7bzl_rxRZ2^X5q69=rM}ll$u%`<46i_-&W) z{{X_j6#O6ea##1Oo;rUG{oD5c0EzxB?mvau==}bAx<0LLuhW#@p#K0*eO9aL{nsCN z+{xen00(o!$KGez;m1C_JFI8wulm>3JIMI>vBktVJ$SQ>V|@O5EW=loOqwESiJ~as zxU8dcszI~I_-3(Nzvt|blbGy%QMa!33N%b=O0{if$vIKXSrn0DjHwJ>g09m?q13~} zwu)$Cx_X(@5C|ZRkydu-y#+RJxQR!%Dv>5O^N?kK#LK(IY~zC;Ny;oDtJmsdX<%7| zXgF|jFee)Afj|f9>M)6i1H5*9X1YE}soeTm-MQewVLl~?Z|N;wecO3~g-W?|_HK7| zPCKXgcP3&Cy1_FXTSZ8^na37&(g6V>0U1V<6~I*C@FtW@pkVzqudBN)zD6DOTBs*) zLAxFDAh-R>JS25c;=$<~>Q6xA(%V_L%_31Td$g+!7VHNC59TXs-KG2R1AK?@b%j^< zd#fPH{R<<#SO*O6u*M=Q|wQx5q~p5iNqz4aSTTCEDl-V~idx2oqiOUXF+$5@U$b4o#Ioy!*_|Pa!%E8 zhvkw6?J5G=^OG*SA1E6J?kE!mT#dxm{TZZUN2Aj*dH#suE=HikpiB#K1oY5ci0PI( z&!mZ*0qwlAu~3wexMliuc9$6&_lNs;SH2w_MUPq>5I@p}r2iC9;i%|mToQEE)}LL> z{gSbg#k=OvSSe#}l(?c2O1bg+X}E_%%>{3DgO5|wd5l@wDJem9C-W z%u0@AoNtiQg-`wN`-btohdFOu2#Fd6Yph>3*Irik{H%D)|6>6Dqc+hAFM~xjopiZ~ z6Zuy#hC5Rw=cx@69rFmer6zuf166sAfZc^dmwFe0T(pnfZvYxUtl#z+JgoO%_4Tei zPBcIkZX!5DZU=x1Uxxp`MSj<{j6H$^g2cc^1TcFmL0SvW5F+07Vc$1I|EX1M<5I~c zOKkwxlLE8apYf3|n-uFe$l)VEGgBGbl=?u%8CM|y=;d`O<6wEw0ZaRW632UFRE5Qk zStHVBl!{E|g){fO^Jp1~h1D<+#)Zv*3)MRri5MznVw6s2-B49KR(5(R_uR*=nd)Z` zCVIO~O{%=;syM|g(W)+V##-E-PjD{t=w$ZUnVvopnsrQPcr@7h@H}#m7zvPqLHUq_ ziszhgN;X)*^rlpvFkcTez0|$^Vdk?ffrJ6(RPX>yZ!H;;SS>pfn5MtCx#fsarNG1buKAud6v|cKXW-?sRiPvCW;UbGPQxNe$P49>0Pn%qM6mOxk z=jiuQ@K?Y9eMx^IGb2sF-JYriZO_GKTkX;t(n>L+qv%)n7*t!}j+hBH={d72QyL8V z{5&Ydxth{&tRv@!Cv|TUkYFdzbJypLHcH1CJ7`>rFXlU^HPgH3Y%uz@)VmK0XhuZx z<*u``+22x|;FbH?`-V0?7%7g&a1&|tf^pm`SO7poeV`puMqdnh`N3`Qh;LD<8u#AA zKJ~}@gt@~bPtk)cO^KfLL`mGJ0&CG`^MGE>*TchWIZSMcwYKOKFl7uK&T@*iWM$7> z|JBwa+cTwzXyyKJ6*>H1FP9D}`PC@)X%S&eA-7!v^6fWZ>ekJ(WbbO3y}B@Y<=5=} zd;55EeHeP7KG8^c$N}T{N#Ki*(4P@*kXF{fHH)5|vMgN5gt-+w;iZt0t4Z50hN{_n z*601lNN5@Tn_5KFGRKndR6tUf#)K4dBG{xMkDa#&*F^~KI>y!?S886h$Fy@F1)||M zkDy}ioyx{}s(NLfHDv;#lOwc;&<5o|ij}f70EHE)M9IYs9w^;mOij4wsa-0e0(dOu>!FIli#Y!1 z@BtdqFp9`M_87wkju5u@11fNiSg1NO4Fk3PuT2LM2X$8Hgz}0?gP6Lgp)F(prg>xI zxhZ1l)=gH^E0B#B)sC?ua$T^Zu;?0~LkiI8xy7n>3hh@xhmKi-yuYzn#-<|V5Av!M z_cWR_@@G=i9UoZz6OddsDqZTBB-r=~^6DuvTUMVMj&n*N>jDa~=y&nuU7;f8ScNH!SmyER%8-{JBT*!p|pTzs`{QGiX zMG_gtq~+H<4>Ha@_pC}Lgw6dDcN6_?nl!A*e4@8JguC4fZ3DB^A2jXDNh99z@PH1V z9^0KRTDNK>64Onfh^tqb?>~>L>e9wPkB&;Pzce{XV88cwnY~OLxj4HEs6Y}{(k@Xf zNEyJTwv6ubvrEuf*gu7?nIx;xU`Cr;?vk(h-;ay~$)9Q2wji&+qRuP(mG-RX4S5h_ z^w9*m<)rF!_}$0DoiFu4Qu5R!?TD5KGsCdXan&GS<(egnOCB&JL$_1kWWh0R@P_DX zDGP1w&QDydpZw~AxCZ(L<$T{Z>@Ww46hLq-*S2=2-F^3*@Vj4@h7`2e>C&x17Fz*I z2mw~O>y2%~y}gf%iqPK1JOnpU3eIWor)Gk;e;#lNxD%dfXy*H6^@8YlW)JnAFh+N5(#|3=hNrH74MbL&Aeib49i;M9sr12*wrU@&+0&T-_T!-pX z%fw1?=n8|JD6S+FY;yo8hOoSH*jX*1Y$317AlRo<$jzt=^~ci5z8$xe_IjXg@_k8e z!tpg7Xl5N}@FTTfqP>q_gbJTrRX~>gX;0~p*#kX!^=C9W=eFUHGIuy*@vIU)vtf;) zq}Z1j#G=nAI9vPL=EFIpRe0VM^53KtPf_{Jpp9mUrZKbHFJ|jiOcop-IkM8kqRDC9 z9`LDf;r*(QTG`C2l^-&<$YY^~4uOEkOu6bdz3G!{@DjCZ4_6+iTX^HKNE9HzX3~&` zji*m0M38&rt=rNMi4)$#qE!*8CN;{H=&&_GDl-d0DIqc~d^vHSc74cgPB%HbZgK0# zd;vWj6r66N>ur^-Q?$hN2k)wTZUu~-EJp90z})czoR8cGv%*@l#t>!7jzmYU^NB~1 z4=JiPhIsXyTTeYp;yY7XWyS)1g-!tqww$J7{bgpjpcDw*FPdw7oIx0nu$4pom zaRsk%=|FM+aWja1l%BAGmU3{MilbO zErTICYvcPN3a~+cqmOveU!>}y;;9qW8ww&kccS~U%(vM5NBJi~*|*czGgG&?%p(*l z9YnHW#_9>BMcK=U3S7Vt7t0LKYd6A2;$5OMgYWgPumJ@rZ*qvO>iy0;OV$7gHH!G;0 zVQM&&ve-CMV2GobJhL2ZM@DvfDe<+JjF0)w^)tPTDTFJ!J#q(;W>}Vh73luKo3|2? z9;pWS_|=Xv_ju;j0`D}U;WywBq#`+fd6*vai9%$Gl8TNy6T`Q?NA@JM;KB6n+B${V zR84cNf@_2>S9Ry&ByCX=gj#e^vV|PWT|hxpdL40X(s<+IH^BC;nrhCDH!Q5+Wn1vl zKmd^x)sEsHth2BvX!6${arulb=^-y6k6mpHxyXFplY;bHqGDL-;=AL@3vl=3)HB|W z8<)!<2<0(dJ?P~MCkgZ-5^tqWvSiun?PO08IK3)r+1oQJyiLZu=u$I$EL_0FQz!u7 z`|RrS^{P8oHz>7)NJ%#Ynps&iH1xfTc76kD+qBce@7?dsy8ncRKl!ZG$Z)r0+4nbq z=sR>S;d8Gb_q2}g{SgW1F8AqWF|wjhxUs|`5yoXz3M4PSfMF~&-;7*gRZ(rtmyh<& zsscE0=sIP9Drc>P6?CIxnpC^@!xUI-4;~BpeETx+UG$qut`Isu#qNt@*^buT4YADo zQuV&u@{>4`mSPumlJ?XmGR%v)gbdF;INL6B*bb(*%s@N=+5lF7`Wq1z=lHFyH%zb| zEIFj)c2g}^;pun>up=iDdPlTIK?^RVaY1>eAq!94{7aNew4B#s$$Z=Y@IW~EdK$edc&)T>ostG++D)Zz z_`CqzDLAG`&e&DPJD@W)%y~6@R%wrBvijj^+)+!b*0bI#2CcB!)lwXEWLuX*i};30 zN%Llk4ffQn-9U;l@|uUoyt8%i_Qt5;7Su((Hdf)x_J?z5zy5;JHcC?khCPF@%bhEj zLLt-@-j}G-E@G7H*TYQ+*(DuvTYH@fZO?Ri2B5KYBBAwCiSF{r=aXw+lg*vPi{sB> zUf08ki?;$9NPPt*)?=F-TkU4qc&@~Hq=ZAwc!L8fJgOsQm9Jz=PSU@VI1EMh-TVa8VS_{$IUS8&F)atk`^n3!-`R*%ac z>LIL(qT*`{AX1?dhL1{sj;u0{lF6iR2%7KYD{Cj0CztmJS)>|mXJf}*S-1gLFJa=- z<n`K7Bm>;=~qxqH5ANGM_`Li*J{i_gQ?z+;6$!h;qu1E~UcnU%o!IDw-0i6koN( zj`A;Rt1{dTG!fJ6&O9?^`KY3f*%06Np0=E4pL}S_4!z!b_X2N`Z;q)RvO@73{aLO5 o*^l@KiLVu39we%YkU9jx8~%ww|L*+%f9}89cYmM6li!Q~0sWHz(EtDd diff --git a/node_modules/request/tests/run.js b/node_modules/request/tests/run.js deleted file mode 100644 index 538a65c..0000000 --- a/node_modules/request/tests/run.js +++ /dev/null @@ -1,45 +0,0 @@ -var spawn = require('child_process').spawn - , exitCode = 0 - ; - -var tests = [ - 'test-body.js' - , 'test-cookie.js' - , 'test-cookiejar.js' - , 'test-defaults.js' - , 'test-errors.js' - , 'test-form.js' - , 'test-follow-all-303.js' - , 'test-follow-all.js' - , 'test-headers.js' - , 'test-httpModule.js' - , 'test-https.js' - , 'test-https-strict.js' - , 'test-oauth.js' - , 'test-params.js' - , 'test-pipes.js' - , 'test-pool.js' - , 'test-protocol-changing-redirect.js' - , 'test-proxy.js' - , 'test-piped-redirect.js' - , 'test-qs.js' - , 'test-redirect.js' - , 'test-timeout.js' - , 'test-toJSON.js' - , 'test-tunnel.js' -] - -var next = function () { - if (tests.length === 0) process.exit(exitCode); - - var file = tests.shift() - console.log(file) - var proc = spawn('node', [ 'tests/' + file ]) - proc.stdout.pipe(process.stdout) - proc.stderr.pipe(process.stderr) - proc.on('exit', function (code) { - exitCode += code || 0 - next() - }) -} -next() diff --git a/node_modules/request/tests/server.js b/node_modules/request/tests/server.js deleted file mode 100644 index b6eacba..0000000 --- a/node_modules/request/tests/server.js +++ /dev/null @@ -1,90 +0,0 @@ -var fs = require('fs') - , http = require('http') - , path = require('path') - , https = require('https') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - ; - -exports.createServer = function (port) { - port = port || 6767 - var s = http.createServer(function (req, resp) { - s.emit(req.url, req, resp); - }) - s.port = port - s.url = 'http://localhost:'+port - return s; -} - -exports.createSSLServer = function(port, opts) { - port = port || 16767 - - var options = { 'key' : path.join(__dirname, 'ssl', 'test.key') - , 'cert': path.join(__dirname, 'ssl', 'test.crt') - } - if (opts) { - for (var i in opts) options[i] = opts[i] - } - - for (var i in options) { - options[i] = fs.readFileSync(options[i]) - } - - var s = https.createServer(options, function (req, resp) { - s.emit(req.url, req, resp); - }) - s.port = port - s.url = 'https://localhost:'+port - return s; -} - -exports.createPostStream = function (text) { - var postStream = new stream.Stream(); - postStream.writeable = true; - postStream.readable = true; - setTimeout(function () {postStream.emit('data', new Buffer(text)); postStream.emit('end')}, 0); - return postStream; -} -exports.createPostValidator = function (text, reqContentType) { - var l = function (req, resp) { - var r = ''; - req.on('data', function (chunk) {r += chunk}) - req.on('end', function () { - if (req.headers['content-type'] && req.headers['content-type'].indexOf('boundary=') >= 0) { - var boundary = req.headers['content-type'].split('boundary=')[1]; - text = text.replace(/__BOUNDARY__/g, boundary); - } - if (r !== text) console.log(r, text); - assert.equal(r, text) - if (reqContentType) { - assert.ok(req.headers['content-type']) - assert.ok(~req.headers['content-type'].indexOf(reqContentType)) - } - resp.writeHead(200, {'content-type':'text/plain'}) - resp.write('OK') - resp.end() - }) - } - return l; -} -exports.createGetResponse = function (text, contentType) { - var l = function (req, resp) { - contentType = contentType || 'text/plain' - resp.writeHead(200, {'content-type':contentType}) - resp.write(text) - resp.end() - } - return l; -} -exports.createChunkResponse = function (chunks, contentType) { - var l = function (req, resp) { - contentType = contentType || 'text/plain' - resp.writeHead(200, {'content-type':contentType}) - chunks.forEach(function (chunk) { - resp.write(chunk) - }) - resp.end() - } - return l; -} diff --git a/node_modules/request/tests/squid.conf b/node_modules/request/tests/squid.conf deleted file mode 100644 index 0d4a3b6..0000000 --- a/node_modules/request/tests/squid.conf +++ /dev/null @@ -1,77 +0,0 @@ -# -# Recommended minimum configuration: -# -acl manager proto cache_object -acl localhost src 127.0.0.1/32 ::1 -acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1 - -# Example rule allowing access from your local networks. -# Adapt to list your (internal) IP networks from where browsing -# should be allowed -acl localnet src 10.0.0.0/8 # RFC1918 possible internal network -acl localnet src 172.16.0.0/12 # RFC1918 possible internal network -acl localnet src 192.168.0.0/16 # RFC1918 possible internal network -acl localnet src fc00::/7 # RFC 4193 local private network range -acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines - -acl SSL_ports port 443 -acl Safe_ports port 80 # http -acl Safe_ports port 21 # ftp -acl Safe_ports port 443 # https -acl Safe_ports port 70 # gopher -acl Safe_ports port 210 # wais -acl Safe_ports port 1025-65535 # unregistered ports -acl Safe_ports port 280 # http-mgmt -acl Safe_ports port 488 # gss-http -acl Safe_ports port 591 # filemaker -acl Safe_ports port 777 # multiling http -acl CONNECT method CONNECT - -# -# Recommended minimum Access Permission configuration: -# -# Only allow cachemgr access from localhost -http_access allow manager localhost -http_access deny manager - -# Deny requests to certain unsafe ports -http_access deny !Safe_ports - -# Deny CONNECT to other than secure SSL ports -#http_access deny CONNECT !SSL_ports - -# We strongly recommend the following be uncommented to protect innocent -# web applications running on the proxy server who think the only -# one who can access services on "localhost" is a local user -#http_access deny to_localhost - -# -# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS -# - -# Example rule allowing access from your local networks. -# Adapt localnet in the ACL section to list your (internal) IP networks -# from where browsing should be allowed -http_access allow localnet -http_access allow localhost - -# And finally deny all other access to this proxy -http_access deny all - -# Squid normally listens to port 3128 -http_port 3128 - -# We recommend you to use at least the following line. -hierarchy_stoplist cgi-bin ? - -# Uncomment and adjust the following to add a disk cache directory. -#cache_dir ufs /usr/local/var/cache 100 16 256 - -# Leave coredumps in the first cache dir -coredump_dir /usr/local/var/cache - -# Add any of your own refresh_pattern entries above these. -refresh_pattern ^ftp: 1440 20% 10080 -refresh_pattern ^gopher: 1440 0% 1440 -refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 -refresh_pattern . 0 20% 4320 diff --git a/node_modules/request/tests/ssl/ca/ca.cnf b/node_modules/request/tests/ssl/ca/ca.cnf deleted file mode 100644 index 425a889..0000000 --- a/node_modules/request/tests/ssl/ca/ca.cnf +++ /dev/null @@ -1,20 +0,0 @@ -[ req ] -default_bits = 1024 -days = 3650 -distinguished_name = req_distinguished_name -attributes = req_attributes -prompt = no -output_password = password - -[ req_distinguished_name ] -C = US -ST = CA -L = Oakland -O = request -OU = request Certificate Authority -CN = requestCA -emailAddress = mikeal@mikealrogers.com - -[ req_attributes ] -challengePassword = password challenge - diff --git a/node_modules/request/tests/ssl/ca/ca.crl b/node_modules/request/tests/ssl/ca/ca.crl deleted file mode 100644 index e69de29..0000000 diff --git a/node_modules/request/tests/ssl/ca/ca.crt b/node_modules/request/tests/ssl/ca/ca.crt deleted file mode 100644 index b4524e4..0000000 --- a/node_modules/request/tests/ssl/ca/ca.crt +++ /dev/null @@ -1,17 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICvTCCAiYCCQDn+P/MSbDsWjANBgkqhkiG9w0BAQUFADCBojELMAkGA1UEBhMC -VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMRAwDgYDVQQKEwdyZXF1 -ZXN0MSYwJAYDVQQLEx1yZXF1ZXN0IENlcnRpZmljYXRlIEF1dGhvcml0eTESMBAG -A1UEAxMJcmVxdWVzdENBMSYwJAYJKoZIhvcNAQkBFhdtaWtlYWxAbWlrZWFscm9n -ZXJzLmNvbTAeFw0xMjAzMDEyMjUwNTZaFw0yMjAyMjcyMjUwNTZaMIGiMQswCQYD -VQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNVBAcTB09ha2xhbmQxEDAOBgNVBAoT -B3JlcXVlc3QxJjAkBgNVBAsTHXJlcXVlc3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 -MRIwEAYDVQQDEwlyZXF1ZXN0Q0ExJjAkBgkqhkiG9w0BCQEWF21pa2VhbEBtaWtl -YWxyb2dlcnMuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7t9pQUAK4 -5XJYTI6NrF0n3G2HZsfN+rPYSVzzL8SuVyb1tHXos+vbPm3NKI4E8X1yVAXU8CjJ -5SqXnp4DAypAhaseho81cbhk7LXUhFz78OvAa+OD+xTAEAnNQ8tGUr4VGyplEjfD -xsBVuqV2j8GPNTftr+drOCFlqfAgMrBn4wIDAQABMA0GCSqGSIb3DQEBBQUAA4GB -ADVdTlVAL45R+PACNS7Gs4o81CwSclukBu4FJbxrkd4xGQmurgfRrYYKjtqiopQm -D7ysRamS3HMN9/VKq2T7r3z1PMHPAy7zM4uoXbbaTKwlnX4j/8pGPn8Ca3qHXYlo -88L/OOPc6Di7i7qckS3HFbXQCTiULtxWmy97oEuTwrAj ------END CERTIFICATE----- diff --git a/node_modules/request/tests/ssl/ca/ca.csr b/node_modules/request/tests/ssl/ca/ca.csr deleted file mode 100644 index e48c56e..0000000 --- a/node_modules/request/tests/ssl/ca/ca.csr +++ /dev/null @@ -1,13 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIICBjCCAW8CAQAwgaIxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEQMA4GA1UE -BxMHT2FrbGFuZDEQMA4GA1UEChMHcmVxdWVzdDEmMCQGA1UECxMdcmVxdWVzdCBD -ZXJ0aWZpY2F0ZSBBdXRob3JpdHkxEjAQBgNVBAMTCXJlcXVlc3RDQTEmMCQGCSqG -SIb3DQEJARYXbWlrZWFsQG1pa2VhbHJvZ2Vycy5jb20wgZ8wDQYJKoZIhvcNAQEB -BQADgY0AMIGJAoGBALu32lBQArjlclhMjo2sXSfcbYdmx836s9hJXPMvxK5XJvW0 -deiz69s+bc0ojgTxfXJUBdTwKMnlKpeengMDKkCFqx6GjzVxuGTstdSEXPvw68Br -44P7FMAQCc1Dy0ZSvhUbKmUSN8PGwFW6pXaPwY81N+2v52s4IWWp8CAysGfjAgMB -AAGgIzAhBgkqhkiG9w0BCQcxFBMScGFzc3dvcmQgY2hhbGxlbmdlMA0GCSqGSIb3 -DQEBBQUAA4GBAGJO7grHeVHXetjHEK8urIxdnvfB2qeZeObz4GPKIkqUurjr0rfj -bA3EK1kDMR5aeQWR8RunixdM16Q6Ry0lEdLVWkdSwRN9dmirIHT9cypqnD/FYOia -SdezZ0lUzXgmJIwRYRwB1KSMMocIf52ll/xC2bEGg7/ZAEuAyAgcZV3X ------END CERTIFICATE REQUEST----- diff --git a/node_modules/request/tests/ssl/ca/ca.key b/node_modules/request/tests/ssl/ca/ca.key deleted file mode 100644 index a53e7f7..0000000 --- a/node_modules/request/tests/ssl/ca/ca.key +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,C8B5887048377F02 - -nyD5ZH0Wup2uWsDvurq5mKDaDrf8lvNn9w0SH/ZkVnfR1/bkwqrFriqJWvZNUG+q -nS0iBYczsWLJnbub9a1zLOTENWUKVD5uqbC3aGHhnoUTNSa27DONgP8gHOn6JgR+ -GAKo01HCSTiVT4LjkwN337QKHnMP2fTzg+IoC/CigvMcq09hRLwU1/guq0GJKGwH -gTxYNuYmQC4Tjh8vdS4liF+Ve/P3qPR2CehZrIOkDT8PHJBGQJRo4xGUIB7Tpk38 -VCk+UZ0JCS2coY8VkY/9tqFJp/ZnnQQVmaNbdRqg7ECKL+bXnNo7yjzmazPZmPe3 -/ShbE0+CTt7LrjCaQAxWbeDzqfo1lQfgN1LulTm8MCXpQaJpv7v1VhIhQ7afjMYb -4thW/ypHPiYS2YJCAkAVlua9Oxzzh1qJoh8Df19iHtpd79Q77X/qf+1JvITlMu0U -gi7yEatmQcmYNws1mtTC1q2DXrO90c+NZ0LK/Alse6NRL/xiUdjug2iHeTf/idOR -Gg/5dSZbnnlj1E5zjSMDkzg6EHAFmHV4jYGSAFLEQgp4V3ZhMVoWZrvvSHgKV/Qh -FqrAK4INr1G2+/QTd09AIRzfy3/j6yD4A9iNaOsEf9Ua7Qh6RcALRCAZTWR5QtEf -dX+iSNJ4E85qXs0PqwkMDkoaxIJ+tmIRJY7y8oeylV8cfGAi8Soubt/i3SlR8IHC -uDMas/2OnwafK3N7ODeE1i7r7wkzQkSHaEz0TrF8XRnP25jAICCSLiMdAAjKfxVb -EvzsFSuAy3Jt6bU3hSLY9o4YVYKE+68ITMv9yNjvTsEiW+T+IbN34w== ------END RSA PRIVATE KEY----- diff --git a/node_modules/request/tests/ssl/ca/ca.srl b/node_modules/request/tests/ssl/ca/ca.srl deleted file mode 100644 index 17128db..0000000 --- a/node_modules/request/tests/ssl/ca/ca.srl +++ /dev/null @@ -1 +0,0 @@ -ADF62016AA40C9C3 diff --git a/node_modules/request/tests/ssl/ca/server.cnf b/node_modules/request/tests/ssl/ca/server.cnf deleted file mode 100644 index cd1fd1e..0000000 --- a/node_modules/request/tests/ssl/ca/server.cnf +++ /dev/null @@ -1,19 +0,0 @@ -[ req ] -default_bits = 1024 -days = 3650 -distinguished_name = req_distinguished_name -attributes = req_attributes -prompt = no - -[ req_distinguished_name ] -C = US -ST = CA -L = Oakland -O = request -OU = testing -CN = testing.request.mikealrogers.com -emailAddress = mikeal@mikealrogers.com - -[ req_attributes ] -challengePassword = password challenge - diff --git a/node_modules/request/tests/ssl/ca/server.crt b/node_modules/request/tests/ssl/ca/server.crt deleted file mode 100644 index efe96ce..0000000 --- a/node_modules/request/tests/ssl/ca/server.crt +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICejCCAeMCCQCt9iAWqkDJwzANBgkqhkiG9w0BAQUFADCBojELMAkGA1UEBhMC -VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMRAwDgYDVQQKEwdyZXF1 -ZXN0MSYwJAYDVQQLEx1yZXF1ZXN0IENlcnRpZmljYXRlIEF1dGhvcml0eTESMBAG -A1UEAxMJcmVxdWVzdENBMSYwJAYJKoZIhvcNAQkBFhdtaWtlYWxAbWlrZWFscm9n -ZXJzLmNvbTAeFw0xMjAzMDEyMjUwNTZaFw0yMjAyMjcyMjUwNTZaMIGjMQswCQYD -VQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNVBAcTB09ha2xhbmQxEDAOBgNVBAoT -B3JlcXVlc3QxEDAOBgNVBAsTB3Rlc3RpbmcxKTAnBgNVBAMTIHRlc3RpbmcucmVx -dWVzdC5taWtlYWxyb2dlcnMuY29tMSYwJAYJKoZIhvcNAQkBFhdtaWtlYWxAbWlr -ZWFscm9nZXJzLmNvbTBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDgVl0jMumvOpmM -20W5v9yhGgZj8hPhEQF/N7yCBVBn/rWGYm70IHC8T/pR5c0LkWc5gdnCJEvKWQjh -DBKxZD8FAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEABShRkNgFbgs4vUWW9R9deNJj -7HJoiTmvkmoOC7QzcYkjdgHbOxsSq3rBnwxsVjY9PAtPwBn0GRspOeG7KzKRgySB -kb22LyrCFKbEOfKO/+CJc80ioK9zEPVjGsFMyAB+ftYRqM+s/4cQlTg/m89l01wC -yapjN3RxZbInGhWR+jA= ------END CERTIFICATE----- diff --git a/node_modules/request/tests/ssl/ca/server.csr b/node_modules/request/tests/ssl/ca/server.csr deleted file mode 100644 index a8e7595..0000000 --- a/node_modules/request/tests/ssl/ca/server.csr +++ /dev/null @@ -1,11 +0,0 @@ ------BEGIN CERTIFICATE REQUEST----- -MIIBgjCCASwCAQAwgaMxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEQMA4GA1UE -BxMHT2FrbGFuZDEQMA4GA1UEChMHcmVxdWVzdDEQMA4GA1UECxMHdGVzdGluZzEp -MCcGA1UEAxMgdGVzdGluZy5yZXF1ZXN0Lm1pa2VhbHJvZ2Vycy5jb20xJjAkBgkq -hkiG9w0BCQEWF21pa2VhbEBtaWtlYWxyb2dlcnMuY29tMFwwDQYJKoZIhvcNAQEB -BQADSwAwSAJBAOBWXSMy6a86mYzbRbm/3KEaBmPyE+ERAX83vIIFUGf+tYZibvQg -cLxP+lHlzQuRZzmB2cIkS8pZCOEMErFkPwUCAwEAAaAjMCEGCSqGSIb3DQEJBzEU -ExJwYXNzd29yZCBjaGFsbGVuZ2UwDQYJKoZIhvcNAQEFBQADQQBD3E5WekQzCEJw -7yOcqvtPYIxGaX8gRKkYfLPoj3pm3GF5SGqtJKhylKfi89szHXgktnQgzff9FN+A -HidVJ/3u ------END CERTIFICATE REQUEST----- diff --git a/node_modules/request/tests/ssl/ca/server.js b/node_modules/request/tests/ssl/ca/server.js deleted file mode 100644 index 05e21c1..0000000 --- a/node_modules/request/tests/ssl/ca/server.js +++ /dev/null @@ -1,28 +0,0 @@ -var fs = require("fs") -var https = require("https") -var options = { key: fs.readFileSync("./server.key") - , cert: fs.readFileSync("./server.crt") } - -var server = https.createServer(options, function (req, res) { - res.writeHead(200) - res.end() - server.close() -}) -server.listen(1337) - -var ca = fs.readFileSync("./ca.crt") -var agent = new https.Agent({ host: "localhost", port: 1337, ca: ca }) - -https.request({ host: "localhost" - , method: "HEAD" - , port: 1337 - , headers: { host: "testing.request.mikealrogers.com" } - , agent: agent - , ca: [ ca ] - , path: "/" }, function (res) { - if (res.client.authorized) { - console.log("node test: OK") - } else { - throw new Error(res.client.authorizationError) - } -}).end() diff --git a/node_modules/request/tests/ssl/ca/server.key b/node_modules/request/tests/ssl/ca/server.key deleted file mode 100644 index 72d8698..0000000 --- a/node_modules/request/tests/ssl/ca/server.key +++ /dev/null @@ -1,9 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIBOwIBAAJBAOBWXSMy6a86mYzbRbm/3KEaBmPyE+ERAX83vIIFUGf+tYZibvQg -cLxP+lHlzQuRZzmB2cIkS8pZCOEMErFkPwUCAwEAAQJAK+r8ZM2sze8s7FRo/ApB -iRBtO9fCaIdJwbwJnXKo4RKwZDt1l2mm+fzZ+/QaQNjY1oTROkIIXmnwRvZWfYlW -gQIhAPKYsG+YSBN9o8Sdp1DMyZ/rUifKX3OE6q9tINkgajDVAiEA7Ltqh01+cnt0 -JEnud/8HHcuehUBLMofeg0G+gCnSbXECIQCqDvkXsWNNLnS/3lgsnvH0Baz4sbeJ -rjIpuVEeg8eM5QIgbu0+9JmOV6ybdmmiMV4yAncoF35R/iKGVHDZCAsQzDECIQDZ -0jGz22tlo5YMcYSqrdD3U4sds1pwiAaWFRbCunoUJw== ------END RSA PRIVATE KEY----- diff --git a/node_modules/request/tests/ssl/npm-ca.crt b/node_modules/request/tests/ssl/npm-ca.crt deleted file mode 100644 index fde2fe9..0000000 --- a/node_modules/request/tests/ssl/npm-ca.crt +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIChzCCAfACCQDauvz/KHp8ejANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMC -VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMQwwCgYDVQQKEwNucG0x -IjAgBgNVBAsTGW5wbSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxDjAMBgNVBAMTBW5w -bUNBMRcwFQYJKoZIhvcNAQkBFghpQGl6cy5tZTAeFw0xMTA5MDUwMTQ3MTdaFw0y -MTA5MDIwMTQ3MTdaMIGHMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNV -BAcTB09ha2xhbmQxDDAKBgNVBAoTA25wbTEiMCAGA1UECxMZbnBtIENlcnRpZmlj -YXRlIEF1dGhvcml0eTEOMAwGA1UEAxMFbnBtQ0ExFzAVBgkqhkiG9w0BCQEWCGlA -aXpzLm1lMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLI4tIqPpRW+ACw9GE -OgBlJZwK5f8nnKCLK629Pv5yJpQKs3DENExAyOgDcyaF0HD0zk8zTp+ZsLaNdKOz -Gn2U181KGprGKAXP6DU6ByOJDWmTlY6+Ad1laYT0m64fERSpHw/hjD3D+iX4aMOl -y0HdbT5m1ZGh6SJz3ZqxavhHLQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAC4ySDbC -l7W1WpLmtLGEQ/yuMLUf6Jy/vr+CRp4h+UzL+IQpCv8FfxsYE7dhf/bmWTEupBkv -yNL18lipt2jSvR3v6oAHAReotvdjqhxddpe5Holns6EQd1/xEZ7sB1YhQKJtvUrl -ZNufy1Jf1r0ldEGeA+0ISck7s+xSh9rQD2Op ------END CERTIFICATE----- diff --git a/node_modules/request/tests/ssl/test.crt b/node_modules/request/tests/ssl/test.crt deleted file mode 100644 index b357f86..0000000 --- a/node_modules/request/tests/ssl/test.crt +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN CERTIFICATE----- -MIICQzCCAawCCQCO/XWtRFck1jANBgkqhkiG9w0BAQUFADBmMQswCQYDVQQGEwJU -SDEQMA4GA1UECBMHQmFuZ2tvazEOMAwGA1UEBxMFU2lsb20xGzAZBgNVBAoTElRo -ZSBSZXF1ZXN0IE1vZHVsZTEYMBYGA1UEAxMPcmVxdWVzdC5leGFtcGxlMB4XDTEx -MTIwMzAyMjkyM1oXDTIxMTEzMDAyMjkyM1owZjELMAkGA1UEBhMCVEgxEDAOBgNV -BAgTB0Jhbmdrb2sxDjAMBgNVBAcTBVNpbG9tMRswGQYDVQQKExJUaGUgUmVxdWVz -dCBNb2R1bGUxGDAWBgNVBAMTD3JlcXVlc3QuZXhhbXBsZTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwmctddZqlA48+NXs0yOy92DijcQV1jf87zMiYAIlNUto -wghVbTWgJU5r0pdKrD16AptnWJTzKanhItEX8XCCPgsNkq1afgTtJP7rNkwu3xcj -eIMkhJg/ay4ZnkbnhYdsii5VTU5prix6AqWRAhbkBgoA+iVyHyof8wvZyKBoFTMC -AwEAATANBgkqhkiG9w0BAQUFAAOBgQB6BybMJbpeiABgihDfEVBcAjDoQ8gUMgwV -l4NulugfKTDmArqnR9aPd4ET5jX5dkMP4bwCHYsvrcYDeWEQy7x5WWuylOdKhua4 -L4cEi2uDCjqEErIG3cc1MCOk6Cl6Ld6tkIzQSf953qfdEACRytOeUqLNQcrXrqeE -c7U8F6MWLQ== ------END CERTIFICATE----- diff --git a/node_modules/request/tests/ssl/test.key b/node_modules/request/tests/ssl/test.key deleted file mode 100644 index b85810d..0000000 --- a/node_modules/request/tests/ssl/test.key +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIICXgIBAAKBgQDCZy111mqUDjz41ezTI7L3YOKNxBXWN/zvMyJgAiU1S2jCCFVt -NaAlTmvSl0qsPXoCm2dYlPMpqeEi0RfxcII+Cw2SrVp+BO0k/us2TC7fFyN4gySE -mD9rLhmeRueFh2yKLlVNTmmuLHoCpZECFuQGCgD6JXIfKh/zC9nIoGgVMwIDAQAB -AoGBALXFwfUf8vHTSmGlrdZS2AGFPvEtuvldyoxi9K5u8xmdFCvxnOcLsF2RsTHt -Mu5QYWhUpNJoG+IGLTPf7RJdj/kNtEs7xXqWy4jR36kt5z5MJzqiK+QIgiO9UFWZ -fjUb6oeDnTIJA9YFBdYi97MDuL89iU/UK3LkJN3hd4rciSbpAkEA+MCkowF5kSFb -rkOTBYBXZfiAG78itDXN6DXmqb9XYY+YBh3BiQM28oxCeQYyFy6pk/nstnd4TXk6 -V/ryA2g5NwJBAMgRKTY9KvxJWbESeMEFe2iBIV0c26/72Amgi7ZKUCLukLfD4tLF -+WSZdmTbbqI1079YtwaiOVfiLm45Q/3B0eUCQAaQ/0eWSGE+Yi8tdXoVszjr4GXb -G81qBi91DMu6U1It+jNfIba+MPsiHLcZJMVb4/oWBNukN7bD1nhwFWdlnu0CQQCf -Is9WHkdvz2RxbZDxb8verz/7kXXJQJhx5+rZf7jIYFxqX3yvTNv3wf2jcctJaWlZ -fVZwB193YSivcgt778xlAkEAprYUz3jczjF5r2hrgbizPzPDR94tM5BTO3ki2v3w -kbf+j2g7FNAx6kZiVN8XwfLc8xEeUGiPKwtq3ddPDFh17w== ------END RSA PRIVATE KEY----- diff --git a/node_modules/request/tests/test-body.js b/node_modules/request/tests/test-body.js deleted file mode 100644 index a624397..0000000 --- a/node_modules/request/tests/test-body.js +++ /dev/null @@ -1,117 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , request = require('../main.js') - ; - -var s = server.createServer(); - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetBuffer : - { resp : server.createGetResponse(new Buffer("TESTING!")) - , encoding: null - , expectBody: new Buffer("TESTING!") - } - , testGetEncoding : - { resp : server.createGetResponse(new Buffer('efa3bfcea9e29883', 'hex')) - , encoding: 'hex' - , expectBody: "efa3bfcea9e29883" - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - , testPutMultipartPreambleCRLF : - { resp: server.createPostValidator( - '\r\n--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , preambleCRLF: true - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - test.uri = s.url + '/' + i - request(test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - console.log(Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) - diff --git a/node_modules/request/tests/test-cookie.js b/node_modules/request/tests/test-cookie.js deleted file mode 100644 index 6c6a7a7..0000000 --- a/node_modules/request/tests/test-cookie.js +++ /dev/null @@ -1,29 +0,0 @@ -var Cookie = require('../vendor/cookie') - , assert = require('assert'); - -var str = 'Sid="s543qactge.wKE61E01Bs%2BKhzmxrwrnug="; Path=/; httpOnly; Expires=Sat, 04 Dec 2010 23:27:28 GMT'; -var cookie = new Cookie(str); - -// test .toString() -assert.equal(cookie.toString(), str); - -// test .path -assert.equal(cookie.path, '/'); - -// test .httpOnly -assert.equal(cookie.httpOnly, true); - -// test .name -assert.equal(cookie.name, 'Sid'); - -// test .value -assert.equal(cookie.value, '"s543qactge.wKE61E01Bs%2BKhzmxrwrnug="'); - -// test .expires -assert.equal(cookie.expires instanceof Date, true); - -// test .path default -var cookie = new Cookie('foo=bar', { url: 'http://foo.com/bar' }); -assert.equal(cookie.path, '/bar'); - -console.log('All tests passed'); diff --git a/node_modules/request/tests/test-cookiejar.js b/node_modules/request/tests/test-cookiejar.js deleted file mode 100644 index 76fcd71..0000000 --- a/node_modules/request/tests/test-cookiejar.js +++ /dev/null @@ -1,90 +0,0 @@ -var Cookie = require('../vendor/cookie') - , Jar = require('../vendor/cookie/jar') - , assert = require('assert'); - -function expires(ms) { - return new Date(Date.now() + ms).toUTCString(); -} - -// test .get() expiration -(function() { - var jar = new Jar; - var cookie = new Cookie('sid=1234; path=/; expires=' + expires(1000)); - jar.add(cookie); - setTimeout(function(){ - var cookies = jar.get({ url: 'http://foo.com/foo' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], cookie); - setTimeout(function(){ - var cookies = jar.get({ url: 'http://foo.com/foo' }); - assert.equal(cookies.length, 0); - }, 1000); - }, 5); -})(); - -// test .get() path support -(function() { - var jar = new Jar; - var a = new Cookie('sid=1234; path=/'); - var b = new Cookie('sid=1111; path=/foo/bar'); - var c = new Cookie('sid=2222; path=/'); - jar.add(a); - jar.add(b); - jar.add(c); - - // should remove the duplicates - assert.equal(jar.cookies.length, 2); - - // same name, same path, latter prevails - var cookies = jar.get({ url: 'http://foo.com/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], c); - - // same name, diff path, path specifity prevails, latter prevails - var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], b); - - var jar = new Jar; - var a = new Cookie('sid=1111; path=/foo/bar'); - var b = new Cookie('sid=1234; path=/'); - jar.add(a); - jar.add(b); - - var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], a); - - var cookies = jar.get({ url: 'http://foo.com/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], b); - - var jar = new Jar; - var a = new Cookie('sid=1111; path=/foo/bar'); - var b = new Cookie('sid=3333; path=/foo/bar'); - var c = new Cookie('pid=3333; path=/foo/bar'); - var d = new Cookie('sid=2222; path=/foo/'); - var e = new Cookie('sid=1234; path=/'); - jar.add(a); - jar.add(b); - jar.add(c); - jar.add(d); - jar.add(e); - - var cookies = jar.get({ url: 'http://foo.com/foo/bar' }); - assert.equal(cookies.length, 2); - assert.equal(cookies[0], b); - assert.equal(cookies[1], c); - - var cookies = jar.get({ url: 'http://foo.com/foo/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], d); - - var cookies = jar.get({ url: 'http://foo.com/' }); - assert.equal(cookies.length, 1); - assert.equal(cookies[0], e); -})(); - -setTimeout(function() { - console.log('All tests passed'); -}, 1200); diff --git a/node_modules/request/tests/test-defaults.js b/node_modules/request/tests/test-defaults.js deleted file mode 100644 index ba09418..0000000 --- a/node_modules/request/tests/test-defaults.js +++ /dev/null @@ -1,114 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - ; - -var s = server.createServer(); - -s.listen(s.port, function () { - var counter = 0; - s.on('/get', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.method, 'GET') - resp.writeHead(200, {'Content-Type': 'text/plain'}); - resp.end('TESTING!'); - }); - - // test get(string, function) - request.defaults({headers:{foo:"bar"}})(s.url + '/get', function (e, r, b){ - if (e) throw e; - assert.deepEqual("TESTING!", b); - counter += 1; - }); - - s.on('/post', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.headers['content-type'], null); - assert.equal(req.method, 'POST') - resp.writeHead(200, {'Content-Type': 'application/json'}); - resp.end(JSON.stringify({foo:'bar'})); - }); - - // test post(string, object, function) - request.defaults({headers:{foo:"bar"}}).post(s.url + '/post', {json: true}, function (e, r, b){ - if (e) throw e; - assert.deepEqual('bar', b.foo); - counter += 1; - }); - - s.on('/post-body', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.headers['content-type'], 'application/json'); - assert.equal(req.method, 'POST') - resp.writeHead(200, {'Content-Type': 'application/json'}); - resp.end(JSON.stringify({foo:'bar'})); - }); - - // test post(string, object, function) with body - request.defaults({headers:{foo:"bar"}}).post(s.url + '/post-body', {json: true, body:{bar:"baz"}}, function (e, r, b){ - if (e) throw e; - assert.deepEqual('bar', b.foo); - counter += 1; - }); - - s.on('/del', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.method, 'DELETE') - resp.writeHead(200, {'Content-Type': 'application/json'}); - resp.end(JSON.stringify({foo:'bar'})); - }); - - // test .del(string, function) - request.defaults({headers:{foo:"bar"}, json:true}).del(s.url + '/del', function (e, r, b){ - if (e) throw e; - assert.deepEqual('bar', b.foo); - counter += 1; - }); - - s.on('/head', function (req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.method, 'HEAD') - resp.writeHead(200, {'Content-Type': 'text/plain'}); - resp.end(); - }); - - // test head.(object, function) - request.defaults({headers:{foo:"bar"}}).head({uri: s.url + '/head'}, function (e, r, b){ - if (e) throw e; - counter += 1; - }); - - s.on('/get_custom', function(req, resp) { - assert.equal(req.headers.foo, 'bar'); - assert.equal(req.headers.x, 'y'); - resp.writeHead(200, {'Content-Type': 'text/plain'}); - resp.end(); - }); - - // test custom request handler function - var defaultRequest = request.defaults({ - headers:{foo:"bar"} - , body: 'TESTING!' - }, function(uri, options, callback) { - var params = request.initParams(uri, options, callback); - options = params.options; - options.headers.x = 'y'; - - return request(params.uri, params.options, params.callback); - }); - - var msg = 'defaults test failed. head request should throw earlier'; - assert.throws(function() { - defaultRequest.head(s.url + '/get_custom', function(e, r, b) { - throw new Error(msg); - }); - counter+=1; - }, msg); - - defaultRequest.get(s.url + '/get_custom', function(e, r, b) { - if(e) throw e; - counter += 1; - console.log(counter.toString() + " tests passed."); - s.close(); - }); -}) diff --git a/node_modules/request/tests/test-errors.js b/node_modules/request/tests/test-errors.js deleted file mode 100644 index 1986a59..0000000 --- a/node_modules/request/tests/test-errors.js +++ /dev/null @@ -1,37 +0,0 @@ -var server = require('./server') - , events = require('events') - , assert = require('assert') - , request = require('../main.js') - ; - -var local = 'http://localhost:8888/asdf' - -try { - request({uri:local, body:{}}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Argument error, options.body.') -} - -try { - request({uri:local, multipart: 'foo'}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Argument error, options.multipart.') -} - -try { - request({uri:local, multipart: [{}]}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Body attribute missing in multipart.') -} - -try { - request(local, {multipart: [{}]}) - assert.fail("Should have throw") -} catch(e) { - assert.equal(e.message, 'Body attribute missing in multipart.') -} - -console.log("All tests passed.") diff --git a/node_modules/request/tests/test-follow-all-303.js b/node_modules/request/tests/test-follow-all-303.js deleted file mode 100644 index 3f2162d..0000000 --- a/node_modules/request/tests/test-follow-all-303.js +++ /dev/null @@ -1,30 +0,0 @@ -var request = require('../main'); -var http = require('http'); -var requests = 0; -var assert = require('assert'); - -var server = http.createServer(function (req, res) { - console.error(req.method, req.url); - requests ++; - - if (req.method === 'POST') { - console.error('send 303'); - res.setHeader('location', req.url); - res.statusCode = 303; - res.end('try again, i guess\n'); - } else { - console.error('send 200') - res.end('ok: ' + requests); - } -}); -server.listen(6767); - -request.post({ url: 'http://localhost:6767/foo', - followAllRedirects: true, - form: { foo: 'bar' } }, function (er, req, body) { - if (er) throw er; - assert.equal(body, 'ok: 2'); - assert.equal(requests, 2); - console.error('ok - ' + process.version); - server.close(); -}); diff --git a/node_modules/request/tests/test-follow-all.js b/node_modules/request/tests/test-follow-all.js deleted file mode 100644 index b78745b..0000000 --- a/node_modules/request/tests/test-follow-all.js +++ /dev/null @@ -1,35 +0,0 @@ -var request = require('../main'); -var http = require('http'); -var requests = 0; -var assert = require('assert'); - -var server = http.createServer(function (req, res) { - requests ++; - - // redirect everything 3 times, no matter what. - var c = req.headers.cookie; - - if (!c) c = 0; - else c = +c.split('=')[1] || 0; - - if (c > 3) { - res.end('ok: '+requests); - return; - } - - res.setHeader('set-cookie', 'c=' + (c + 1)); - res.setHeader('location', req.url); - res.statusCode = 302; - res.end('try again, i guess\n'); -}); -server.listen(6767); - -request.post({ url: 'http://localhost:6767/foo', - followAllRedirects: true, - form: { foo: 'bar' } }, function (er, req, body) { - if (er) throw er; - assert.equal(body, 'ok: 5'); - assert.equal(requests, 5); - console.error('ok - ' + process.version); - server.close(); -}); diff --git a/node_modules/request/tests/test-form.js b/node_modules/request/tests/test-form.js deleted file mode 100644 index aeefd31..0000000 --- a/node_modules/request/tests/test-form.js +++ /dev/null @@ -1,79 +0,0 @@ -var assert = require('assert') -var http = require('http'); -var path = require('path'); -var mime = require('mime'); -var request = require('../main.js'); -var fs = require('fs'); - -var remoteFile = 'http://nodejs.org/images/logo.png'; - -var FIELDS = [ - {name: 'my_field', value: 'my_value'}, - {name: 'my_buffer', value: new Buffer([1, 2, 3])}, - {name: 'my_file', value: fs.createReadStream(__dirname + '/unicycle.jpg')}, - {name: 'remote_file', value: request(remoteFile) } -]; - -var server = http.createServer(function(req, res) { - - // temp workaround - var data = ''; - req.setEncoding('utf8'); - - req.on('data', function(d) { - data += d; - }); - - req.on('end', function() { - // check for the fields' traces - - // 1st field : my_field - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 2nd field : my_buffer - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf(field.value) != -1 ); - - // 3rd field : my_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for unicycle.jpg traces - assert.ok( data.indexOf('2005:06:21 01:44:12') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(field.value.path) ) != -1 ); - - // 4th field : remote_file - var field = FIELDS.shift(); - assert.ok( data.indexOf('form-data; name="'+field.name+'"') != -1 ); - assert.ok( data.indexOf('; filename="'+path.basename(field.value.path)+'"') != -1 ); - // check for http://nodejs.org/images/logo.png traces - assert.ok( data.indexOf('ImageReady') != -1 ); - assert.ok( data.indexOf('Content-Type: '+mime.lookup(remoteFile) ) != -1 ); - - res.writeHead(200); - res.end('done'); - - }); - - -}); - -server.listen(8080, function() { - - var req = request.post('http://localhost:8080/upload', function () { - server.close(); - }) - var form = req.form() - - FIELDS.forEach(function(field) { - form.append(field.name, field.value); - }); - -}); - -process.on('exit', function() { - assert.strictEqual(FIELDS.length, 0); -}); diff --git a/node_modules/request/tests/test-headers.js b/node_modules/request/tests/test-headers.js deleted file mode 100644 index 31fe3f4..0000000 --- a/node_modules/request/tests/test-headers.js +++ /dev/null @@ -1,52 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - , Cookie = require('../vendor/cookie') - , Jar = require('../vendor/cookie/jar') - , s = server.createServer() - -s.listen(s.port, function () { - var serverUri = 'http://localhost:' + s.port - , numTests = 0 - , numOutstandingTests = 0 - - function createTest(requestObj, serverAssertFn) { - var testNumber = numTests; - numTests += 1; - numOutstandingTests += 1; - s.on('/' + testNumber, function (req, res) { - serverAssertFn(req, res); - res.writeHead(200); - res.end(); - }); - requestObj.url = serverUri + '/' + testNumber - request(requestObj, function (err, res, body) { - assert.ok(!err) - assert.equal(res.statusCode, 200) - numOutstandingTests -= 1 - if (numOutstandingTests === 0) { - console.log(numTests + ' tests passed.') - s.close() - } - }) - } - - // Issue #125: headers.cookie shouldn't be replaced when a cookie jar isn't specified - createTest({headers: {cookie: 'foo=bar'}}, function (req, res) { - assert.ok(req.headers.cookie) - assert.equal(req.headers.cookie, 'foo=bar') - }) - - // Issue #125: headers.cookie + cookie jar - var jar = new Jar() - jar.add(new Cookie('quux=baz')); - createTest({jar: jar, headers: {cookie: 'foo=bar'}}, function (req, res) { - assert.ok(req.headers.cookie) - assert.equal(req.headers.cookie, 'foo=bar; quux=baz') - }) - - // There should be no cookie header when neither headers.cookie nor a cookie jar is specified - createTest({}, function (req, res) { - assert.ok(!req.headers.cookie) - }) -}) diff --git a/node_modules/request/tests/test-httpModule.js b/node_modules/request/tests/test-httpModule.js deleted file mode 100644 index 1866de2..0000000 --- a/node_modules/request/tests/test-httpModule.js +++ /dev/null @@ -1,94 +0,0 @@ -var http = require('http') - , https = require('https') - , server = require('./server') - , assert = require('assert') - , request = require('../main.js') - - -var faux_requests_made = {'http':0, 'https':0} -function wrap_request(name, module) { - // Just like the http or https module, but note when a request is made. - var wrapped = {} - Object.keys(module).forEach(function(key) { - var value = module[key]; - - if(key != 'request') - wrapped[key] = value; - else - wrapped[key] = function(options, callback) { - faux_requests_made[name] += 1 - return value.apply(this, arguments) - } - }) - - return wrapped; -} - - -var faux_http = wrap_request('http', http) - , faux_https = wrap_request('https', https) - , plain_server = server.createServer() - , https_server = server.createSSLServer() - - -plain_server.listen(plain_server.port, function() { - plain_server.on('/plain', function (req, res) { - res.writeHead(200) - res.end('plain') - }) - plain_server.on('/to_https', function (req, res) { - res.writeHead(301, {'location':'https://localhost:'+https_server.port + '/https'}) - res.end() - }) - - https_server.listen(https_server.port, function() { - https_server.on('/https', function (req, res) { - res.writeHead(200) - res.end('https') - }) - https_server.on('/to_plain', function (req, res) { - res.writeHead(302, {'location':'http://localhost:'+plain_server.port + '/plain'}) - res.end() - }) - - run_tests() - run_tests({}) - run_tests({'http:':faux_http}) - run_tests({'https:':faux_https}) - run_tests({'http:':faux_http, 'https:':faux_https}) - }) -}) - -function run_tests(httpModules) { - var to_https = 'http://localhost:'+plain_server.port+'/to_https' - var to_plain = 'https://localhost:'+https_server.port+'/to_plain' - - request(to_https, {'httpModules':httpModules}, function (er, res, body) { - assert.ok(!er, 'Bounce to SSL worked') - assert.equal(body, 'https', 'Received HTTPS server body') - done() - }) - - request(to_plain, {'httpModules':httpModules}, function (er, res, body) { - assert.ok(!er, 'Bounce to plaintext server worked') - assert.equal(body, 'plain', 'Received HTTPS server body') - done() - }) -} - - -var passed = 0; -function done() { - passed += 1 - var expected = 10 - - if(passed == expected) { - plain_server.close() - https_server.close() - - assert.equal(faux_requests_made.http, 4, 'Wrapped http module called appropriately') - assert.equal(faux_requests_made.https, 4, 'Wrapped https module called appropriately') - - console.log((expected+2) + ' tests passed.') - } -} diff --git a/node_modules/request/tests/test-https-strict.js b/node_modules/request/tests/test-https-strict.js deleted file mode 100644 index 470b68d..0000000 --- a/node_modules/request/tests/test-https-strict.js +++ /dev/null @@ -1,97 +0,0 @@ -// a test where we validate the siguature of the keys -// otherwise exactly the same as the ssl test - -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - , fs = require('fs') - , path = require('path') - , opts = { key: path.resolve(__dirname, 'ssl/ca/server.key') - , cert: path.resolve(__dirname, 'ssl/ca/server.crt') } - , s = server.createSSLServer(null, opts) - , caFile = path.resolve(__dirname, 'ssl/ca/ca.crt') - , ca = fs.readFileSync(caFile) - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - test.uri = s.url + '/' + i - test.strictSSL = true - test.ca = ca - test.headers = { host: 'testing.request.mikealrogers.com' } - request(test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - console.log(Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) diff --git a/node_modules/request/tests/test-https.js b/node_modules/request/tests/test-https.js deleted file mode 100644 index 58e7db9..0000000 --- a/node_modules/request/tests/test-https.js +++ /dev/null @@ -1,86 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - -var s = server.createSSLServer(); - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - test.uri = s.url + '/' + i - request(test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - console.log(Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) diff --git a/node_modules/request/tests/test-oauth.js b/node_modules/request/tests/test-oauth.js deleted file mode 100644 index 72ca923..0000000 --- a/node_modules/request/tests/test-oauth.js +++ /dev/null @@ -1,117 +0,0 @@ -var hmacsign = require('../oauth').hmacsign - , assert = require('assert') - , qs = require('querystring') - , request = require('../main') - ; - -function getsignature (r) { - var sign - r.headers.Authorization.slice('OAuth '.length).replace(/,\ /g, ',').split(',').forEach(function (v) { - if (v.slice(0, 'oauth_signature="'.length) === 'oauth_signature="') sign = v.slice('oauth_signature="'.length, -1) - }) - return decodeURIComponent(sign) -} - -// Tests from Twitter documentation https://dev.twitter.com/docs/auth/oauth - -var reqsign = hmacsign('POST', 'https://api.twitter.com/oauth/request_token', - { oauth_callback: 'http://localhost:3005/the_dance/process_callback?service_provider_id=11' - , oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' - , oauth_nonce: 'QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk' - , oauth_signature_method: 'HMAC-SHA1' - , oauth_timestamp: '1272323042' - , oauth_version: '1.0' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98") - -console.log(reqsign) -console.log('8wUi7m5HFQy76nowoCThusfgB+Q=') -assert.equal(reqsign, '8wUi7m5HFQy76nowoCThusfgB+Q=') - -var accsign = hmacsign('POST', 'https://api.twitter.com/oauth/access_token', - { oauth_consumer_key: 'GDdmIQH6jhtmLUypg82g' - , oauth_nonce: '9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8' - , oauth_signature_method: 'HMAC-SHA1' - , oauth_token: '8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc' - , oauth_timestamp: '1272323047' - , oauth_verifier: 'pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY' - , oauth_version: '1.0' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA") - -console.log(accsign) -console.log('PUw/dHA4fnlJYM6RhXk5IU/0fCc=') -assert.equal(accsign, 'PUw/dHA4fnlJYM6RhXk5IU/0fCc=') - -var upsign = hmacsign('POST', 'http://api.twitter.com/1/statuses/update.json', - { oauth_consumer_key: "GDdmIQH6jhtmLUypg82g" - , oauth_nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y" - , oauth_signature_method: "HMAC-SHA1" - , oauth_token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw" - , oauth_timestamp: "1272325550" - , oauth_version: "1.0" - , status: 'setting up my twitter 私のさえずりを設定する' - }, "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98", "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA") - -console.log(upsign) -console.log('yOahq5m0YjDDjfjxHaXEsW9D+X0=') -assert.equal(upsign, 'yOahq5m0YjDDjfjxHaXEsW9D+X0=') - - -var rsign = request.post( - { url: 'https://api.twitter.com/oauth/request_token' - , oauth: - { callback: 'http://localhost:3005/the_dance/process_callback?service_provider_id=11' - , consumer_key: 'GDdmIQH6jhtmLUypg82g' - , nonce: 'QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk' - , timestamp: '1272323042' - , version: '1.0' - , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" - } - }) - -setTimeout(function () { - console.log(getsignature(rsign)) - assert.equal(reqsign, getsignature(rsign)) -}) - -var raccsign = request.post( - { url: 'https://api.twitter.com/oauth/access_token' - , oauth: - { consumer_key: 'GDdmIQH6jhtmLUypg82g' - , nonce: '9zWH6qe0qG7Lc1telCn7FhUbLyVdjEaL3MO5uHxn8' - , signature_method: 'HMAC-SHA1' - , token: '8ldIZyxQeVrFZXFOZH5tAwj6vzJYuLQpl0WUEYtWc' - , timestamp: '1272323047' - , verifier: 'pDNg57prOHapMbhv25RNf75lVRd6JDsni1AJJIDYoTY' - , version: '1.0' - , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" - , token_secret: "x6qpRnlEmW9JbQn4PQVVeVG8ZLPEx6A0TOebgwcuA" - } - }) - -setTimeout(function () { - console.log(getsignature(raccsign)) - assert.equal(accsign, getsignature(raccsign)) -}, 1) - -var rupsign = request.post( - { url: 'http://api.twitter.com/1/statuses/update.json' - , oauth: - { consumer_key: "GDdmIQH6jhtmLUypg82g" - , nonce: "oElnnMTQIZvqvlfXM56aBLAf5noGD0AQR3Fmi7Q6Y" - , signature_method: "HMAC-SHA1" - , token: "819797-Jxq8aYUDRmykzVKrgoLhXSq67TEa5ruc4GJC2rWimw" - , timestamp: "1272325550" - , version: "1.0" - , consumer_secret: "MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98" - , token_secret: "J6zix3FfA9LofH0awS24M3HcBYXO5nI1iYe8EfBA" - } - , form: {status: 'setting up my twitter 私のさえずりを設定する'} - }) -setTimeout(function () { - console.log(getsignature(rupsign)) - assert.equal(upsign, getsignature(rupsign)) -}, 1) - - - - diff --git a/node_modules/request/tests/test-params.js b/node_modules/request/tests/test-params.js deleted file mode 100644 index 5ddb311..0000000 --- a/node_modules/request/tests/test-params.js +++ /dev/null @@ -1,92 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - ; - -var s = server.createServer(); - -var tests = - { testGet : - { resp : server.createGetResponse("TESTING!") - , expectBody: "TESTING!" - } - , testGetChunkBreak : - { resp : server.createChunkResponse( - [ new Buffer([239]) - , new Buffer([163]) - , new Buffer([191]) - , new Buffer([206]) - , new Buffer([169]) - , new Buffer([226]) - , new Buffer([152]) - , new Buffer([131]) - ]) - , expectBody: "Ω☃" - } - , testGetBuffer : - { resp : server.createGetResponse(new Buffer("TESTING!")) - , encoding: null - , expectBody: new Buffer("TESTING!") - } - , testGetJSON : - { resp : server.createGetResponse('{"test":true}', 'application/json') - , json : true - , expectBody: {"test":true} - } - , testPutString : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : "PUTTINGDATA" - } - , testPutBuffer : - { resp : server.createPostValidator("PUTTINGDATA") - , method : "PUT" - , body : new Buffer("PUTTINGDATA") - } - , testPutJSON : - { resp : server.createPostValidator(JSON.stringify({foo: 'bar'})) - , method: "PUT" - , json: {foo: 'bar'} - } - , testPutMultipart : - { resp: server.createPostValidator( - '--__BOUNDARY__\r\n' + - 'content-type: text/html\r\n' + - '\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__\r\n\r\n' + - 'Oh hi.' + - '\r\n--__BOUNDARY__--' - ) - , method: "PUT" - , multipart: - [ {'content-type': 'text/html', 'body': 'Oh hi.'} - , {'body': 'Oh hi.'} - ] - } - } - -s.listen(s.port, function () { - - var counter = 0 - - for (i in tests) { - (function () { - var test = tests[i] - s.on('/'+i, test.resp) - //test.uri = s.url + '/' + i - request(s.url + '/' + i, test, function (err, resp, body) { - if (err) throw err - if (test.expectBody) { - assert.deepEqual(test.expectBody, body) - } - counter = counter - 1; - if (counter === 0) { - console.log(Object.keys(tests).length+" tests passed.") - s.close() - } - }) - counter++ - })() - } -}) diff --git a/node_modules/request/tests/test-piped-redirect.js b/node_modules/request/tests/test-piped-redirect.js deleted file mode 100644 index 25bf35d..0000000 --- a/node_modules/request/tests/test-piped-redirect.js +++ /dev/null @@ -1,52 +0,0 @@ -var http = require('http') - , assert = require('assert') - , request = require('../main.js') - ; - -var portOne = 8968 - , portTwo = 8969 - ; - - -// server one -var s1 = http.createServer(function (req, resp) -{ - if (req.url == '/original') - { - resp.writeHeader(302, {'location': '/redirected'}) - resp.end() - } - else if (req.url == '/redirected') - { - resp.writeHeader(200, {'content-type': 'text/plain'}) - resp.write('OK') - resp.end() - } - -}).listen(portOne); - - -// server two -var s2 = http.createServer(function (req, resp) -{ - - var x = request('http://localhost:'+portOne+'/original') - req.pipe(x) - x.pipe(resp) - -}).listen(portTwo, function() -{ - - var r = request('http://localhost:'+portTwo+'/original', function (err, res, body) { - - assert.equal(body, 'OK') - - s1.close() - s2.close() - - }); - - // it hangs, so wait a second :) - r.timeout = 1000; - -}); diff --git a/node_modules/request/tests/test-pipes.js b/node_modules/request/tests/test-pipes.js deleted file mode 100644 index 7162981..0000000 --- a/node_modules/request/tests/test-pipes.js +++ /dev/null @@ -1,216 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , fs = require('fs') - , request = require('../main.js') - , path = require('path') - , util = require('util') - ; - -var s = server.createServer(3453); - -function ValidationStream(str) { - this.str = str - this.buf = '' - this.on('data', function (data) { - this.buf += data - }) - this.on('end', function () { - assert.equal(this.str, this.buf) - }) - this.writable = true -} -util.inherits(ValidationStream, stream.Stream) -ValidationStream.prototype.write = function (chunk) { - this.emit('data', chunk) -} -ValidationStream.prototype.end = function (chunk) { - if (chunk) emit('data', chunk) - this.emit('end') -} - -s.listen(s.port, function () { - counter = 0; - - var check = function () { - counter = counter - 1 - if (counter === 0) { - console.log('All tests passed.') - setTimeout(function () { - process.exit(); - }, 500) - } - } - - // Test pipeing to a request object - s.once('/push', server.createPostValidator("mydata")); - - var mydata = new stream.Stream(); - mydata.readable = true - - counter++ - var r1 = request.put({url:'http://localhost:3453/push'}, function () { - check(); - }) - mydata.pipe(r1) - - mydata.emit('data', 'mydata'); - mydata.emit('end'); - - // Test pipeing to a request object with a json body - s.once('/push-json', server.createPostValidator("{\"foo\":\"bar\"}", "application/json")); - - var mybodydata = new stream.Stream(); - mybodydata.readable = true - - counter++ - var r2 = request.put({url:'http://localhost:3453/push-json',json:true}, function () { - check(); - }) - mybodydata.pipe(r2) - - mybodydata.emit('data', JSON.stringify({foo:"bar"})); - mybodydata.emit('end'); - - // Test pipeing from a request object. - s.once('/pull', server.createGetResponse("mypulldata")); - - var mypulldata = new stream.Stream(); - mypulldata.writable = true - - counter++ - request({url:'http://localhost:3453/pull'}).pipe(mypulldata) - - var d = ''; - - mypulldata.write = function (chunk) { - d += chunk; - } - mypulldata.end = function () { - assert.equal(d, 'mypulldata'); - check(); - }; - - - s.on('/cat', function (req, resp) { - if (req.method === "GET") { - resp.writeHead(200, {'content-type':'text/plain-test', 'content-length':4}); - resp.end('asdf') - } else if (req.method === "PUT") { - assert.equal(req.headers['content-type'], 'text/plain-test'); - assert.equal(req.headers['content-length'], 4) - var validate = ''; - - req.on('data', function (chunk) {validate += chunk}) - req.on('end', function () { - resp.writeHead(201); - resp.end(); - assert.equal(validate, 'asdf'); - check(); - }) - } - }) - s.on('/pushjs', function (req, resp) { - if (req.method === "PUT") { - assert.equal(req.headers['content-type'], 'application/javascript'); - check(); - } - }) - s.on('/catresp', function (req, resp) { - request.get('http://localhost:3453/cat').pipe(resp) - }) - s.on('/doodle', function (req, resp) { - if (req.headers['x-oneline-proxy']) { - resp.setHeader('x-oneline-proxy', 'yup') - } - resp.writeHead('200', {'content-type':'image/png'}) - fs.createReadStream(path.join(__dirname, 'googledoodle.png')).pipe(resp) - }) - s.on('/onelineproxy', function (req, resp) { - var x = request('http://localhost:3453/doodle') - req.pipe(x) - x.pipe(resp) - }) - - counter++ - fs.createReadStream(__filename).pipe(request.put('http://localhost:3453/pushjs')) - - counter++ - request.get('http://localhost:3453/cat').pipe(request.put('http://localhost:3453/cat')) - - counter++ - request.get('http://localhost:3453/catresp', function (e, resp, body) { - assert.equal(resp.headers['content-type'], 'text/plain-test'); - assert.equal(resp.headers['content-length'], 4) - check(); - }) - - var doodleWrite = fs.createWriteStream(path.join(__dirname, 'test.png')) - - counter++ - request.get('http://localhost:3453/doodle').pipe(doodleWrite) - - doodleWrite.on('close', function () { - assert.deepEqual(fs.readFileSync(path.join(__dirname, 'googledoodle.png')), fs.readFileSync(path.join(__dirname, 'test.png'))) - check() - }) - - process.on('exit', function () { - fs.unlinkSync(path.join(__dirname, 'test.png')) - }) - - counter++ - request.get({uri:'http://localhost:3453/onelineproxy', headers:{'x-oneline-proxy':'nope'}}, function (err, resp, body) { - assert.equal(resp.headers['x-oneline-proxy'], 'yup') - check() - }) - - s.on('/afterresponse', function (req, resp) { - resp.write('d') - resp.end() - }) - - counter++ - var afterresp = request.post('http://localhost:3453/afterresponse').on('response', function () { - var v = new ValidationStream('d') - afterresp.pipe(v) - v.on('end', check) - }) - - s.on('/forward1', function (req, resp) { - resp.writeHead(302, {location:'/forward2'}) - resp.end() - }) - s.on('/forward2', function (req, resp) { - resp.writeHead('200', {'content-type':'image/png'}) - resp.write('d') - resp.end() - }) - - counter++ - var validateForward = new ValidationStream('d') - validateForward.on('end', check) - request.get('http://localhost:3453/forward1').pipe(validateForward) - - // Test pipe options - s.once('/opts', server.createGetResponse('opts response')); - - var optsStream = new stream.Stream(); - optsStream.writable = true - - var optsData = ''; - optsStream.write = function (buf) { - optsData += buf; - if (optsData === 'opts response') { - setTimeout(check, 10); - } - } - - optsStream.end = function () { - assert.fail('end called') - }; - - counter++ - request({url:'http://localhost:3453/opts'}).pipe(optsStream, { end : false }) -}) diff --git a/node_modules/request/tests/test-pool.js b/node_modules/request/tests/test-pool.js deleted file mode 100644 index 1e7d578..0000000 --- a/node_modules/request/tests/test-pool.js +++ /dev/null @@ -1,16 +0,0 @@ -var request = require('../main') - , http = require('http') - , assert = require('assert') - ; - -var s = http.createServer(function (req, resp) { - resp.statusCode = 200; - resp.end('asdf'); -}).listen(8080, function () { - request({'url': 'http://localhost:8080', 'pool': false}, function (e, resp) { - var agent = resp.request.agent; - assert.strictEqual(typeof agent, 'boolean'); - assert.strictEqual(agent, false); - s.close(); - }); -}); \ No newline at end of file diff --git a/node_modules/request/tests/test-protocol-changing-redirect.js b/node_modules/request/tests/test-protocol-changing-redirect.js deleted file mode 100644 index f74e196..0000000 --- a/node_modules/request/tests/test-protocol-changing-redirect.js +++ /dev/null @@ -1,60 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - - -var s = server.createServer() -var ss = server.createSSLServer() -var sUrl = 'http://localhost:' + s.port -var ssUrl = 'https://localhost:' + ss.port - -s.listen(s.port, bouncy(s, ssUrl)) -ss.listen(ss.port, bouncy(ss, sUrl)) - -var hits = {} -var expect = {} -var pending = 0 -function bouncy (s, server) { return function () { - - var redirs = { a: 'b' - , b: 'c' - , c: 'd' - , d: 'e' - , e: 'f' - , f: 'g' - , g: 'h' - , h: 'end' } - - var perm = true - Object.keys(redirs).forEach(function (p) { - var t = redirs[p] - - // switch type each time - var type = perm ? 301 : 302 - perm = !perm - s.on('/' + p, function (req, res) { - res.writeHead(type, { location: server + '/' + t }) - res.end() - }) - }) - - s.on('/end', function (req, res) { - var h = req.headers['x-test-key'] - hits[h] = true - pending -- - if (pending === 0) done() - }) -}} - -for (var i = 0; i < 5; i ++) { - pending ++ - var val = 'test_' + i - expect[val] = true - request({ url: (i % 2 ? sUrl : ssUrl) + '/a' - , headers: { 'x-test-key': val } }) -} - -function done () { - assert.deepEqual(hits, expect) - process.exit(0) -} diff --git a/node_modules/request/tests/test-proxy.js b/node_modules/request/tests/test-proxy.js deleted file mode 100644 index 647157c..0000000 --- a/node_modules/request/tests/test-proxy.js +++ /dev/null @@ -1,39 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , fs = require('fs') - , request = require('../main.js') - , path = require('path') - , util = require('util') - ; - -var port = 6768 - , called = false - , proxiedHost = 'google.com' - ; - -var s = server.createServer(port) -s.listen(port, function () { - s.on('http://google.com/', function (req, res) { - called = true - assert.equal(req.headers.host, proxiedHost) - res.writeHeader(200) - res.end() - }) - request ({ - url: 'http://'+proxiedHost, - proxy: 'http://localhost:'+port - /* - //should behave as if these arguments where passed: - url: 'http://localhost:'+port, - headers: {host: proxiedHost} - //*/ - }, function (err, res, body) { - s.close() - }) -}) - -process.on('exit', function () { - assert.ok(called, 'the request must be made to the proxy server') -}) diff --git a/node_modules/request/tests/test-qs.js b/node_modules/request/tests/test-qs.js deleted file mode 100644 index 1aac22b..0000000 --- a/node_modules/request/tests/test-qs.js +++ /dev/null @@ -1,28 +0,0 @@ -var request = request = require('../main.js') - , assert = require('assert') - ; - - -// Test adding a querystring -var req1 = request.get({ uri: 'http://www.google.com', qs: { q : 'search' }}) -setTimeout(function() { - assert.equal('/?q=search', req1.path) -}, 1) - -// Test replacing a querystring value -var req2 = request.get({ uri: 'http://www.google.com?q=abc', qs: { q : 'search' }}) -setTimeout(function() { - assert.equal('/?q=search', req2.path) -}, 1) - -// Test appending a querystring value to the ones present in the uri -var req3 = request.get({ uri: 'http://www.google.com?x=y', qs: { q : 'search' }}) -setTimeout(function() { - assert.equal('/?x=y&q=search', req3.path) -}, 1) - -// Test leaving a querystring alone -var req4 = request.get({ uri: 'http://www.google.com?x=y'}) -setTimeout(function() { - assert.equal('/?x=y', req4.path) -}, 1) diff --git a/node_modules/request/tests/test-redirect.js b/node_modules/request/tests/test-redirect.js deleted file mode 100644 index b84844a..0000000 --- a/node_modules/request/tests/test-redirect.js +++ /dev/null @@ -1,154 +0,0 @@ -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - , Cookie = require('../vendor/cookie') - , Jar = require('../vendor/cookie/jar') - -var s = server.createServer() - -s.listen(s.port, function () { - var server = 'http://localhost:' + s.port; - var hits = {} - var passed = 0; - - bouncer(301, 'temp') - bouncer(302, 'perm') - bouncer(302, 'nope') - - function bouncer(code, label) { - var landing = label+'_landing'; - - s.on('/'+label, function (req, res) { - hits[label] = true; - res.writeHead(code, { - 'location':server + '/'+landing, - 'set-cookie': 'ham=eggs' - }) - res.end() - }) - - s.on('/'+landing, function (req, res) { - if (req.method !== 'GET') { // We should only accept GET redirects - console.error("Got a non-GET request to the redirect destination URL"); - res.writeHead(400); - res.end(); - return; - } - // Make sure the cookie doesn't get included twice, see #139: - // Make sure cookies are set properly after redirect - assert.equal(req.headers.cookie, 'foo=bar; quux=baz; ham=eggs'); - hits[landing] = true; - res.writeHead(200) - res.end(landing) - }) - } - - // Permanent bounce - var jar = new Jar() - jar.add(new Cookie('quux=baz')) - request({uri: server+'/perm', jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) - assert.ok(hits.perm, 'Original request is to /perm') - assert.ok(hits.perm_landing, 'Forward to permanent landing URL') - assert.equal(body, 'perm_landing', 'Got permanent landing content') - passed += 1 - done() - }) - - // Temporary bounce - request({uri: server+'/temp', jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(hits.temp_landing, 'Forward to temporary landing URL') - assert.equal(body, 'temp_landing', 'Got temporary landing content') - passed += 1 - done() - }) - - // Prevent bouncing. - request({uri:server+'/nope', jar: jar, headers: {cookie: 'foo=bar'}, followRedirect:false}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 302) throw new Error('Status is not 302: '+res.statusCode) - assert.ok(hits.nope, 'Original request to /nope') - assert.ok(!hits.nope_landing, 'No chasing the redirect') - assert.equal(res.statusCode, 302, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should not follow post redirects by default - request.post(server+'/temp', { jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 301) throw new Error('Status is not 301: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(!hits.temp_landing, 'No chasing the redirect when post') - assert.equal(res.statusCode, 301, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should follow post redirects when followAllRedirects true - request.post({uri:server+'/temp', followAllRedirects:true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(hits.temp_landing, 'Forward to temporary landing URL') - assert.equal(body, 'temp_landing', 'Got temporary landing content') - passed += 1 - done() - }) - - request.post({uri:server+'/temp', followAllRedirects:false, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 301) throw new Error('Status is not 301: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(!hits.temp_landing, 'No chasing the redirect') - assert.equal(res.statusCode, 301, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should not follow delete redirects by default - request.del(server+'/temp', { jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode < 301) throw new Error('Status is not a redirect.') - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(!hits.temp_landing, 'No chasing the redirect when delete') - assert.equal(res.statusCode, 301, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should not follow delete redirects even if followRedirect is set to true - request.del(server+'/temp', { followRedirect: true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 301) throw new Error('Status is not 301: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(!hits.temp_landing, 'No chasing the redirect when delete') - assert.equal(res.statusCode, 301, 'Response is the bounce itself') - passed += 1 - done() - }) - - // Should follow delete redirects when followAllRedirects true - request.del(server+'/temp', {followAllRedirects:true, jar: jar, headers: {cookie: 'foo=bar'}}, function (er, res, body) { - if (er) throw er - if (res.statusCode !== 200) throw new Error('Status is not 200: '+res.statusCode) - assert.ok(hits.temp, 'Original request is to /temp') - assert.ok(hits.temp_landing, 'Forward to temporary landing URL') - assert.equal(body, 'temp_landing', 'Got temporary landing content') - passed += 1 - done() - }) - - var reqs_done = 0; - function done() { - reqs_done += 1; - if(reqs_done == 9) { - console.log(passed + ' tests passed.') - s.close() - } - } -}) diff --git a/node_modules/request/tests/test-s3.js b/node_modules/request/tests/test-s3.js deleted file mode 100644 index 5f59c4a..0000000 --- a/node_modules/request/tests/test-s3.js +++ /dev/null @@ -1,13 +0,0 @@ -var request = require('../main') - -var r = request.get('https://log.curlybracecast.com.s3.amazonaws.com/', - { aws: - { key: 'AKIAI6KIQRRVMGK3WK5Q' - , secret: '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' - , bucket: 'log.curlybracecast.com' - } - }, function (e, resp, body) { - console.log(r.headers) - console.log(body) - } -) \ No newline at end of file diff --git a/node_modules/request/tests/test-timeout.js b/node_modules/request/tests/test-timeout.js deleted file mode 100644 index 673f8ad..0000000 --- a/node_modules/request/tests/test-timeout.js +++ /dev/null @@ -1,87 +0,0 @@ -var server = require('./server') - , events = require('events') - , stream = require('stream') - , assert = require('assert') - , request = require('../main.js') - ; - -var s = server.createServer(); -var expectedBody = "waited"; -var remainingTests = 5; - -s.listen(s.port, function () { - // Request that waits for 200ms - s.on('/timeout', function (req, resp) { - setTimeout(function(){ - resp.writeHead(200, {'content-type':'text/plain'}) - resp.write(expectedBody) - resp.end() - }, 200); - }); - - // Scenario that should timeout - var shouldTimeout = { - url: s.url + "/timeout", - timeout:100 - } - - - request(shouldTimeout, function (err, resp, body) { - assert.equal(err.code, "ETIMEDOUT"); - checkDone(); - }) - - - // Scenario that shouldn't timeout - var shouldntTimeout = { - url: s.url + "/timeout", - timeout:300 - } - - request(shouldntTimeout, function (err, resp, body) { - assert.equal(err, null); - assert.equal(expectedBody, body) - checkDone(); - }) - - // Scenario with no timeout set, so shouldn't timeout - var noTimeout = { - url: s.url + "/timeout" - } - - request(noTimeout, function (err, resp, body) { - assert.equal(err); - assert.equal(expectedBody, body) - checkDone(); - }) - - // Scenario with a negative timeout value, should be treated a zero or the minimum delay - var negativeTimeout = { - url: s.url + "/timeout", - timeout:-1000 - } - - request(negativeTimeout, function (err, resp, body) { - assert.equal(err.code, "ETIMEDOUT"); - checkDone(); - }) - - // Scenario with a float timeout value, should be rounded by setTimeout anyway - var floatTimeout = { - url: s.url + "/timeout", - timeout: 100.76 - } - - request(floatTimeout, function (err, resp, body) { - assert.equal(err.code, "ETIMEDOUT"); - checkDone(); - }) - - function checkDone() { - if(--remainingTests == 0) { - s.close(); - console.log("All tests passed."); - } - } -}) - diff --git a/node_modules/request/tests/test-toJSON.js b/node_modules/request/tests/test-toJSON.js deleted file mode 100644 index b7c67ef..0000000 --- a/node_modules/request/tests/test-toJSON.js +++ /dev/null @@ -1,14 +0,0 @@ -var request = require('../main') - , http = require('http') - , assert = require('assert') - ; - -var s = http.createServer(function (req, resp) { - resp.statusCode = 200 - resp.end('asdf') -}).listen(8080, function () { - var r = request('http://localhost:8080', function (e, resp) { - assert.equal(JSON.parse(JSON.stringify(r)).response.statusCode, 200) - s.close() - }) -}) \ No newline at end of file diff --git a/node_modules/request/tests/test-tunnel.js b/node_modules/request/tests/test-tunnel.js deleted file mode 100644 index 51e2126..0000000 --- a/node_modules/request/tests/test-tunnel.js +++ /dev/null @@ -1,63 +0,0 @@ -// test that we can tunnel a https request over an http proxy -// keeping all the CA and whatnot intact. -// -// Note: this requires that squid is installed. -// If the proxy fails to start, we'll just log a warning and assume success. - -var server = require('./server') - , assert = require('assert') - , request = require('../main.js') - , fs = require('fs') - , path = require('path') - , caFile = path.resolve(__dirname, 'ssl/npm-ca.crt') - , ca = fs.readFileSync(caFile) - , child_process = require('child_process') - , sqConf = path.resolve(__dirname, 'squid.conf') - , sqArgs = ['-f', sqConf, '-N', '-d', '5'] - , proxy = 'http://localhost:3128' - , hadError = null - -var squid = child_process.spawn('squid', sqArgs); -var ready = false - -squid.stderr.on('data', function (c) { - console.error('SQUIDERR ' + c.toString().trim().split('\n') - .join('\nSQUIDERR ')) - ready = c.toString().match(/ready to serve requests/i) -}) - -squid.stdout.on('data', function (c) { - console.error('SQUIDOUT ' + c.toString().trim().split('\n') - .join('\nSQUIDOUT ')) -}) - -squid.on('exit', function (c) { - console.error('squid: exit '+c) - if (c && !ready) { - console.error('squid must be installed to run this test.') - console.error('skipping this test. please install squid and run again if you need to test tunneling.') - c = null - hadError = null - process.exit(0) - return - } - - if (c) { - hadError = hadError || new Error('Squid exited with '+c) - } - if (hadError) throw hadError -}) - -setTimeout(function F () { - if (!ready) return setTimeout(F, 100) - request({ uri: 'https://registry.npmjs.org/' - , proxy: 'http://localhost:3128' - , strictSSL: true - , ca: ca - , json: true }, function (er, body) { - hadError = er - console.log(er || typeof body) - if (!er) console.log("ok") - squid.kill('SIGKILL') - }) -}, 100) diff --git a/node_modules/request/tests/unicycle.jpg b/node_modules/request/tests/unicycle.jpg deleted file mode 100644 index 7cea4dd71dc41cd51c84bfcec6b3e65c15a58507..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19806 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 diff --git a/node_modules/request/tunnel.js b/node_modules/request/tunnel.js deleted file mode 100644 index 3f7bbb9..0000000 --- a/node_modules/request/tunnel.js +++ /dev/null @@ -1,227 +0,0 @@ -'use strict' - -var net = require('net') - , tls = require('tls') - , http = require('http') - , https = require('https') - , events = require('events') - , assert = require('assert') - , util = require('util') - ; - -exports.httpOverHttp = httpOverHttp -exports.httpsOverHttp = httpsOverHttp -exports.httpOverHttps = httpOverHttps -exports.httpsOverHttps = httpsOverHttps - - -function httpOverHttp(options) { - var agent = new TunnelingAgent(options) - agent.request = http.request - return agent -} - -function httpsOverHttp(options) { - var agent = new TunnelingAgent(options) - agent.request = http.request - agent.createSocket = createSecureSocket - return agent -} - -function httpOverHttps(options) { - var agent = new TunnelingAgent(options) - agent.request = https.request - return agent -} - -function httpsOverHttps(options) { - var agent = new TunnelingAgent(options) - agent.request = https.request - agent.createSocket = createSecureSocket - return agent -} - - -function TunnelingAgent(options) { - var self = this - self.options = options || {} - self.proxyOptions = self.options.proxy || {} - self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets - self.requests = [] - self.sockets = [] - - self.on('free', function onFree(socket, host, port) { - for (var i = 0, len = self.requests.length; i < len; ++i) { - var pending = self.requests[i] - if (pending.host === host && pending.port === port) { - // Detect the request to connect same origin server, - // reuse the connection. - self.requests.splice(i, 1) - pending.request.onSocket(socket) - return - } - } - socket.destroy() - self.removeSocket(socket) - }) -} -util.inherits(TunnelingAgent, events.EventEmitter) - -TunnelingAgent.prototype.addRequest = function addRequest(req, host, port) { - var self = this - - if (self.sockets.length >= this.maxSockets) { - // We are over limit so we'll add it to the queue. - self.requests.push({host: host, port: port, request: req}) - return - } - - // If we are under maxSockets create a new one. - self.createSocket({host: host, port: port, request: req}, function(socket) { - socket.on('free', onFree) - socket.on('close', onCloseOrRemove) - socket.on('agentRemove', onCloseOrRemove) - req.onSocket(socket) - - function onFree() { - self.emit('free', socket, host, port) - } - - function onCloseOrRemove(err) { - self.removeSocket() - socket.removeListener('free', onFree) - socket.removeListener('close', onCloseOrRemove) - socket.removeListener('agentRemove', onCloseOrRemove) - } - }) -} - -TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { - var self = this - var placeholder = {} - self.sockets.push(placeholder) - - var connectOptions = mergeOptions({}, self.proxyOptions, - { method: 'CONNECT' - , path: options.host + ':' + options.port - , agent: false - } - ) - if (connectOptions.proxyAuth) { - connectOptions.headers = connectOptions.headers || {} - connectOptions.headers['Proxy-Authorization'] = 'Basic ' + - new Buffer(connectOptions.proxyAuth).toString('base64') - } - - debug('making CONNECT request') - var connectReq = self.request(connectOptions) - connectReq.useChunkedEncodingByDefault = false // for v0.6 - connectReq.once('response', onResponse) // for v0.6 - connectReq.once('upgrade', onUpgrade) // for v0.6 - connectReq.once('connect', onConnect) // for v0.7 or later - connectReq.once('error', onError) - connectReq.end() - - function onResponse(res) { - // Very hacky. This is necessary to avoid http-parser leaks. - res.upgrade = true - } - - function onUpgrade(res, socket, head) { - // Hacky. - process.nextTick(function() { - onConnect(res, socket, head) - }) - } - - function onConnect(res, socket, head) { - connectReq.removeAllListeners() - socket.removeAllListeners() - - if (res.statusCode === 200) { - assert.equal(head.length, 0) - debug('tunneling connection has established') - self.sockets[self.sockets.indexOf(placeholder)] = socket - cb(socket) - } else { - debug('tunneling socket could not be established, statusCode=%d', res.statusCode) - var error = new Error('tunneling socket could not be established, ' + 'statusCode=' + res.statusCode) - error.code = 'ECONNRESET' - options.request.emit('error', error) - self.removeSocket(placeholder) - } - } - - function onError(cause) { - connectReq.removeAllListeners() - - debug('tunneling socket could not be established, cause=%s\n', cause.message, cause.stack) - var error = new Error('tunneling socket could not be established, ' + 'cause=' + cause.message) - error.code = 'ECONNRESET' - options.request.emit('error', error) - self.removeSocket(placeholder) - } -} - -TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { - var pos = this.sockets.indexOf(socket) - if (pos === -1) return - - this.sockets.splice(pos, 1) - - var pending = this.requests.shift() - if (pending) { - // If we have pending requests and a socket gets closed a new one - // needs to be created to take over in the pool for the one that closed. - this.createSocket(pending, function(socket) { - pending.request.onSocket(socket) - }) - } -} - -function createSecureSocket(options, cb) { - var self = this - TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { - // 0 is dummy port for v0.6 - var secureSocket = tls.connect(0, mergeOptions({}, self.options, - { servername: options.host - , socket: socket - } - )) - cb(secureSocket) - }) -} - - -function mergeOptions(target) { - for (var i = 1, len = arguments.length; i < len; ++i) { - var overrides = arguments[i] - if (typeof overrides === 'object') { - var keys = Object.keys(overrides) - for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { - var k = keys[j] - if (overrides[k] !== undefined) { - target[k] = overrides[k] - } - } - } - } - return target -} - - -var debug -if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { - debug = function() { - var args = Array.prototype.slice.call(arguments) - if (typeof args[0] === 'string') { - args[0] = 'TUNNEL: ' + args[0] - } else { - args.unshift('TUNNEL:') - } - console.error.apply(console, args) - } -} else { - debug = function() {} -} -exports.debug = debug // for test diff --git a/node_modules/request/uuid.js b/node_modules/request/uuid.js deleted file mode 100644 index fc0588b..0000000 --- a/node_modules/request/uuid.js +++ /dev/null @@ -1,19 +0,0 @@ -module.exports = function () { - var s = [], itoh = '0123456789ABCDEF' - - // Make array of random hex digits. The UUID only has 32 digits in it, but we - // allocate an extra items to make room for the '-'s we'll be inserting. - for (var i = 0; i <36; i++) s[i] = Math.floor(Math.random()*0x10) - - // Conform to RFC-4122, section 4.4 - s[14] = 4; // Set 4 high bits of time_high field to version - s[19] = (s[19] & 0x3) | 0x8 // Specify 2 high bits of clock sequence - - // Convert to hex chars - for (var i = 0; i <36; i++) s[i] = itoh[s[i]] - - // Insert '-'s - s[8] = s[13] = s[18] = s[23] = '-' - - return s.join('') -} diff --git a/node_modules/request/vendor/cookie/index.js b/node_modules/request/vendor/cookie/index.js deleted file mode 100644 index ff44b3e..0000000 --- a/node_modules/request/vendor/cookie/index.js +++ /dev/null @@ -1,65 +0,0 @@ -/*! - * Tobi - Cookie - * Copyright(c) 2010 LearnBoost - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var url = require('url'); - -/** - * Initialize a new `Cookie` with the given cookie `str` and `req`. - * - * @param {String} str - * @param {IncomingRequest} req - * @api private - */ - -var Cookie = exports = module.exports = function Cookie(str, req) { - this.str = str; - - // Map the key/val pairs - str.split(/ *; */).reduce(function(obj, pair){ - var p = pair.indexOf('='); - var key = p > 0 ? pair.substring(0, p).trim() : pair.trim(); - var lowerCasedKey = key.toLowerCase(); - var value = p > 0 ? pair.substring(p + 1).trim() : true; - - if (!obj.name) { - // First key is the name - obj.name = key; - obj.value = value; - } - else if (lowerCasedKey === 'httponly') { - obj.httpOnly = value; - } - else { - obj[lowerCasedKey] = value; - } - return obj; - }, this); - - // Expires - this.expires = this.expires - ? new Date(this.expires) - : Infinity; - - // Default or trim path - this.path = this.path - ? this.path.trim(): req - ? url.parse(req.url).pathname: '/'; -}; - -/** - * Return the original cookie string. - * - * @return {String} - * @api public - */ - -Cookie.prototype.toString = function(){ - return this.str; -}; diff --git a/node_modules/request/vendor/cookie/jar.js b/node_modules/request/vendor/cookie/jar.js deleted file mode 100644 index 34920e0..0000000 --- a/node_modules/request/vendor/cookie/jar.js +++ /dev/null @@ -1,72 +0,0 @@ -/*! -* Tobi - CookieJar -* Copyright(c) 2010 LearnBoost -* MIT Licensed -*/ - -/** -* Module dependencies. -*/ - -var url = require('url'); - -/** -* Initialize a new `CookieJar`. -* -* @api private -*/ - -var CookieJar = exports = module.exports = function CookieJar() { - this.cookies = []; -}; - -/** -* Add the given `cookie` to the jar. -* -* @param {Cookie} cookie -* @api private -*/ - -CookieJar.prototype.add = function(cookie){ - this.cookies = this.cookies.filter(function(c){ - // Avoid duplication (same path, same name) - return !(c.name == cookie.name && c.path == cookie.path); - }); - this.cookies.push(cookie); -}; - -/** -* Get cookies for the given `req`. -* -* @param {IncomingRequest} req -* @return {Array} -* @api private -*/ - -CookieJar.prototype.get = function(req){ - var path = url.parse(req.url).pathname - , now = new Date - , specificity = {}; - return this.cookies.filter(function(cookie){ - if (0 == path.indexOf(cookie.path) && now < cookie.expires - && cookie.path.length > (specificity[cookie.name] || 0)) - return specificity[cookie.name] = cookie.path.length; - }); -}; - -/** -* Return Cookie string for the given `req`. -* -* @param {IncomingRequest} req -* @return {String} -* @api private -*/ - -CookieJar.prototype.cookieString = function(req){ - var cookies = this.get(req); - if (cookies.length) { - return cookies.map(function(cookie){ - return cookie.name + '=' + cookie.value; - }).join('; '); - } -}; diff --git a/node_modules/underscore/.npmignore b/node_modules/underscore/.npmignore deleted file mode 100644 index 2ce2684..0000000 --- a/node_modules/underscore/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -test/ -Rakefile -docs/ \ No newline at end of file diff --git a/node_modules/underscore/CNAME b/node_modules/underscore/CNAME deleted file mode 100644 index a007e65..0000000 --- a/node_modules/underscore/CNAME +++ /dev/null @@ -1 +0,0 @@ -underscorejs.org diff --git a/node_modules/underscore/CONTRIBUTING.md b/node_modules/underscore/CONTRIBUTING.md deleted file mode 100644 index 36a9934..0000000 --- a/node_modules/underscore/CONTRIBUTING.md +++ /dev/null @@ -1,9 +0,0 @@ -## How to contribute to Underscore.js - -* Before you open a ticket or send a pull request, [search](https://github.com/documentcloud/underscore/issues) for previous discussions about the same feature or issue. Add to the earlier ticket if you find one. - -* Before sending a pull request for a feature, be sure to have [tests](http://underscorejs.org/test/test.html). - -* Use the same coding style as the rest of the [codebase](https://github.com/documentcloud/underscore/blob/master/underscore.js). - -* In your pull request, do not add documentation or re-build the minified `underscore-min.js` file. We'll do those things before cutting a new release. \ No newline at end of file diff --git a/node_modules/underscore/LICENSE b/node_modules/underscore/LICENSE deleted file mode 100644 index 61d28c0..0000000 --- a/node_modules/underscore/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2009-2012 Jeremy Ashkenas, DocumentCloud - -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. \ No newline at end of file diff --git a/node_modules/underscore/README.md b/node_modules/underscore/README.md deleted file mode 100644 index b1f3e50..0000000 --- a/node_modules/underscore/README.md +++ /dev/null @@ -1,19 +0,0 @@ - __ - /\ \ __ - __ __ ___ \_\ \ __ _ __ ____ ___ ___ _ __ __ /\_\ ____ - /\ \/\ \ /' _ `\ /'_ \ /'__`\/\ __\/ ,__\ / ___\ / __`\/\ __\/'__`\ \/\ \ /',__\ - \ \ \_\ \/\ \/\ \/\ \ \ \/\ __/\ \ \//\__, `\/\ \__//\ \ \ \ \ \//\ __/ __ \ \ \/\__, `\ - \ \____/\ \_\ \_\ \___,_\ \____\\ \_\\/\____/\ \____\ \____/\ \_\\ \____\/\_\ _\ \ \/\____/ - \/___/ \/_/\/_/\/__,_ /\/____/ \/_/ \/___/ \/____/\/___/ \/_/ \/____/\/_//\ \_\ \/___/ - \ \____/ - \/___/ - -Underscore.js is a utility-belt library for JavaScript that provides -support for the usual functional suspects (each, map, reduce, filter...) -without extending any core JavaScript objects. - -For Docs, License, Tests, and pre-packed downloads, see: -http://underscorejs.org - -Many thanks to our contributors: -https://github.com/documentcloud/underscore/contributors diff --git a/node_modules/underscore/favicon.ico b/node_modules/underscore/favicon.ico deleted file mode 100644 index 03049683875ee7207b4ee62241fc6977956723c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1406 zcmZQzU<5(|0R|w+!H~hqz#zuJz@P!dKp_SNAO?x!16vCj7#y|msTh?T4S~@R7;Yi( a|NnmmMkru{0(Aax^D{300E2>o91H*{%ptM> diff --git a/node_modules/underscore/index.html b/node_modules/underscore/index.html deleted file mode 100644 index e62aa92..0000000 --- a/node_modules/underscore/index.html +++ /dev/null @@ -1,2407 +0,0 @@ - - - - - - - - - Underscore.js - - - - - - -
        - -

        - -

        - -

        - Underscore is a - utility-belt library for JavaScript that provides a lot of the - functional programming support that you would expect in - Prototype.js - (or Ruby), - but without extending any of the built-in JavaScript objects. It's the - tie to go along with jQuery's tux, - and Backbone.js's suspenders. -

        - -

        - Underscore provides 80-odd functions that support both the usual - functional suspects: map, select, invoke — - as well as more specialized helpers: function binding, javascript - templating, deep equality testing, and so on. It delegates to built-in - functions, if present, so modern browsers will use the - native implementations of forEach, map, reduce, - filter, every, some and indexOf. -

        - -

        - A complete Test & Benchmark Suite - is included for your perusal. -

        - -

        - You may also read through the annotated source code. -

        - -

        - The project is - hosted on GitHub. - You can report bugs and discuss features on the - issues page, - on Freenode in the #documentcloud channel, - or send tweets to @documentcloud. -

        - -

        - Underscore is an open-source component of DocumentCloud. -

        - -

        Downloads (Right-click, and use "Save As")

        - - - - - - - - - - - - - - - - - -
        Development Version (1.4.3)40kb, Uncompressed with Plentiful Comments
        Production Version (1.4.3)4kb, Minified and Gzipped
        Edge VersionUnreleased, current master, use at your own risk
        - -
        - -

        Collection Functions (Arrays or Objects)

        - -

        - each_.each(list, iterator, [context]) - Alias: forEach -
        - Iterates over a list of elements, yielding each in turn to an iterator - function. The iterator is bound to the context object, if one is - passed. Each invocation of iterator is called with three arguments: - (element, index, list). If list is a JavaScript object, iterator's - arguments will be (value, key, list). Delegates to the native - forEach function if it exists. -

        -
        -_.each([1, 2, 3], alert);
        -=> alerts each number in turn...
        -_.each({one : 1, two : 2, three : 3}, alert);
        -=> alerts each number value in turn...
        - -

        - map_.map(list, iterator, [context]) - Alias: collect -
        - Produces a new array of values by mapping each value in list - through a transformation function (iterator). If the native map method - exists, it will be used instead. If list is a JavaScript object, - iterator's arguments will be (value, key, list). -

        -
        -_.map([1, 2, 3], function(num){ return num * 3; });
        -=> [3, 6, 9]
        -_.map({one : 1, two : 2, three : 3}, function(num, key){ return num * 3; });
        -=> [3, 6, 9]
        - -

        - reduce_.reduce(list, iterator, memo, [context]) - Aliases: inject, foldl -
        - Also known as inject and foldl, reduce boils down a - list of values into a single value. Memo is the initial state - of the reduction, and each successive step of it should be returned by - iterator. The iterator is passed four arguments: the memo, - then the value and index (or key) of the iteration, - and finally a reference to the entire list. -

        -
        -var sum = _.reduce([1, 2, 3], function(memo, num){ return memo + num; }, 0);
        -=> 6
        -
        - -

        - reduceRight_.reduceRight(list, iterator, memo, [context]) - Alias: foldr -
        - The right-associative version of reduce. Delegates to the - JavaScript 1.8 version of reduceRight, if it exists. Foldr - is not as useful in JavaScript as it would be in a language with lazy - evaluation. -

        -
        -var list = [[0, 1], [2, 3], [4, 5]];
        -var flat = _.reduceRight(list, function(a, b) { return a.concat(b); }, []);
        -=> [4, 5, 2, 3, 0, 1]
        -
        - -

        - find_.find(list, iterator, [context]) - Alias: detect -
        - Looks through each value in the list, returning the first one that - passes a truth test (iterator). The function returns as - soon as it finds an acceptable element, and doesn't traverse the - entire list. -

        -
        -var even = _.find([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
        -=> 2
        -
        - -

        - filter_.filter(list, iterator, [context]) - Alias: select -
        - Looks through each value in the list, returning an array of all - the values that pass a truth test (iterator). Delegates to the - native filter method, if it exists. -

        -
        -var evens = _.filter([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
        -=> [2, 4, 6]
        -
        - -

        - where_.where(list, properties) -
        - Looks through each value in the list, returning an array of all - the values that contain all of the key-value pairs listed in properties. -

        -
        -_.where(listOfPlays, {author: "Shakespeare", year: 1611});
        -=> [{title: "Cymbeline", author: "Shakespeare", year: 1611},
        -    {title: "The Tempest", author: "Shakespeare", year: 1611}]
        -
        - -

        - reject_.reject(list, iterator, [context]) -
        - Returns the values in list without the elements that the truth - test (iterator) passes. The opposite of filter. -

        -
        -var odds = _.reject([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });
        -=> [1, 3, 5]
        -
        - -

        - every_.every(list, iterator, [context]) - Alias: all -
        - Returns true if all of the values in the list pass the iterator - truth test. Delegates to the native method every, if present. -

        -
        -_.every([true, 1, null, 'yes'], _.identity);
        -=> false
        -
        - -

        - some_.some(list, [iterator], [context]) - Alias: any -
        - Returns true if any of the values in the list pass the - iterator truth test. Short-circuits and stops traversing the list - if a true element is found. Delegates to the native method some, - if present. -

        -
        -_.some([null, 0, 'yes', false]);
        -=> true
        -
        - -

        - contains_.contains(list, value) - Alias: include -
        - Returns true if the value is present in the list. - Uses indexOf internally, if list is an Array. -

        -
        -_.contains([1, 2, 3], 3);
        -=> true
        -
        - -

        - invoke_.invoke(list, methodName, [*arguments]) -
        - Calls the method named by methodName on each value in the list. - Any extra arguments passed to invoke will be forwarded on to the - method invocation. -

        -
        -_.invoke([[5, 1, 7], [3, 2, 1]], 'sort');
        -=> [[1, 5, 7], [1, 2, 3]]
        -
        - -

        - pluck_.pluck(list, propertyName) -
        - A convenient version of what is perhaps the most common use-case for - map: extracting a list of property values. -

        -
        -var stooges = [{name : 'moe', age : 40}, {name : 'larry', age : 50}, {name : 'curly', age : 60}];
        -_.pluck(stooges, 'name');
        -=> ["moe", "larry", "curly"]
        -
        - -

        - max_.max(list, [iterator], [context]) -
        - Returns the maximum value in list. If iterator is passed, - it will be used on each value to generate the criterion by which the - value is ranked. -

        -
        -var stooges = [{name : 'moe', age : 40}, {name : 'larry', age : 50}, {name : 'curly', age : 60}];
        -_.max(stooges, function(stooge){ return stooge.age; });
        -=> {name : 'curly', age : 60};
        -
        - -

        - min_.min(list, [iterator], [context]) -
        - Returns the minimum value in list. If iterator is passed, - it will be used on each value to generate the criterion by which the - value is ranked. -

        -
        -var numbers = [10, 5, 100, 2, 1000];
        -_.min(numbers);
        -=> 2
        -
        - -

        - sortBy_.sortBy(list, iterator, [context]) -
        - Returns a sorted copy of list, ranked in ascending order by the - results of running each value through iterator. Iterator may - also be the string name of the property to sort by (eg. length). -

        -
        -_.sortBy([1, 2, 3, 4, 5, 6], function(num){ return Math.sin(num); });
        -=> [5, 4, 6, 3, 1, 2]
        -
        - -

        - groupBy_.groupBy(list, iterator) -
        - Splits a collection into sets, grouped by the result of running each - value through iterator. If iterator is a string instead of - a function, groups by the property named by iterator on each of - the values. -

        -
        -_.groupBy([1.3, 2.1, 2.4], function(num){ return Math.floor(num); });
        -=> {1: [1.3], 2: [2.1, 2.4]}
        -
        -_.groupBy(['one', 'two', 'three'], 'length');
        -=> {3: ["one", "two"], 5: ["three"]}
        -
        - -

        - countBy_.countBy(list, iterator) -
        - Sorts a list into groups and returns a count for the number of objects - in each group. - Similar to groupBy, but instead of returning a list of values, - returns a count for the number of values in that group. -

        -
        -_.countBy([1, 2, 3, 4, 5], function(num) {
        -  return num % 2 == 0 ? 'even' : 'odd';
        -});
        -=> {odd: 3, even: 2}
        -
        - -

        - shuffle_.shuffle(list) -
        - Returns a shuffled copy of the list, using a version of the - Fisher-Yates shuffle. -

        -
        -_.shuffle([1, 2, 3, 4, 5, 6]);
        -=> [4, 1, 6, 3, 5, 2]
        -
        - -

        - toArray_.toArray(list) -
        - Converts the list (anything that can be iterated over), into a - real Array. Useful for transmuting the arguments object. -

        -
        -(function(){ return _.toArray(arguments).slice(1); })(1, 2, 3, 4);
        -=> [2, 3, 4]
        -
        - -

        - size_.size(list) -
        - Return the number of values in the list. -

        -
        -_.size({one : 1, two : 2, three : 3});
        -=> 3
        -
        - -

        Array Functions

        - -

        - - Note: All array functions will also work on the arguments object. - However, Underscore functions are not designed to work on "sparse" arrays. - -

        - -

        - first_.first(array, [n]) - Alias: head, take -
        - Returns the first element of an array. Passing n will - return the first n elements of the array. -

        -
        -_.first([5, 4, 3, 2, 1]);
        -=> 5
        -
        - -

        - initial_.initial(array, [n]) -
        - Returns everything but the last entry of the array. Especially useful on - the arguments object. Pass n to exclude the last n elements - from the result. -

        -
        -_.initial([5, 4, 3, 2, 1]);
        -=> [5, 4, 3, 2]
        -
        - -

        - last_.last(array, [n]) -
        - Returns the last element of an array. Passing n will return - the last n elements of the array. -

        -
        -_.last([5, 4, 3, 2, 1]);
        -=> 1
        -
        - -

        - rest_.rest(array, [index]) - Alias: tail, drop -
        - Returns the rest of the elements in an array. Pass an index - to return the values of the array from that index onward. -

        -
        -_.rest([5, 4, 3, 2, 1]);
        -=> [4, 3, 2, 1]
        -
        - -

        - compact_.compact(array) -
        - Returns a copy of the array with all falsy values removed. - In JavaScript, false, null, 0, "", - undefined and NaN are all falsy. -

        -
        -_.compact([0, 1, false, 2, '', 3]);
        -=> [1, 2, 3]
        -
        - -

        - flatten_.flatten(array, [shallow]) -
        - Flattens a nested array (the nesting can be to any depth). If you - pass shallow, the array will only be flattened a single level. -

        -
        -_.flatten([1, [2], [3, [[4]]]]);
        -=> [1, 2, 3, 4];
        -
        -_.flatten([1, [2], [3, [[4]]]], true);
        -=> [1, 2, 3, [[4]]];
        -
        - -

        - without_.without(array, [*values]) -
        - Returns a copy of the array with all instances of the values - removed. -

        -
        -_.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
        -=> [2, 3, 4]
        -
        - -

        - union_.union(*arrays) -
        - Computes the union of the passed-in arrays: the list of unique items, - in order, that are present in one or more of the arrays. -

        -
        -_.union([1, 2, 3], [101, 2, 1, 10], [2, 1]);
        -=> [1, 2, 3, 101, 10]
        -
        - -

        - intersection_.intersection(*arrays) -
        - Computes the list of values that are the intersection of all the arrays. - Each value in the result is present in each of the arrays. -

        -
        -_.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]);
        -=> [1, 2]
        -
        - -

        - difference_.difference(array, *others) -
        - Similar to without, but returns the values from array that - are not present in the other arrays. -

        -
        -_.difference([1, 2, 3, 4, 5], [5, 2, 10]);
        -=> [1, 3, 4]
        -
        - -

        - uniq_.uniq(array, [isSorted], [iterator]) - Alias: unique -
        - Produces a duplicate-free version of the array, using === to test - object equality. If you know in advance that the array is sorted, - passing true for isSorted will run a much faster algorithm. - If you want to compute unique items based on a transformation, pass an - iterator function. -

        -
        -_.uniq([1, 2, 1, 3, 1, 4]);
        -=> [1, 2, 3, 4]
        -
        - -

        - zip_.zip(*arrays) -
        - Merges together the values of each of the arrays with the - values at the corresponding position. Useful when you have separate - data sources that are coordinated through matching array indexes. - If you're working with a matrix of nested arrays, zip.apply - can transpose the matrix in a similar fashion. -

        -
        -_.zip(['moe', 'larry', 'curly'], [30, 40, 50], [true, false, false]);
        -=> [["moe", 30, true], ["larry", 40, false], ["curly", 50, false]]
        -
        - -

        - object_.object(list, [values]) -
        - Converts arrays into objects. Pass either a single list of - [key, value] pairs, or a list of keys, and a list of values. -

        -
        -_.object(['moe', 'larry', 'curly'], [30, 40, 50]);
        -=> {moe: 30, larry: 40, curly: 50}
        -
        -_.object([['moe', 30], ['larry', 40], ['curly', 50]]);
        -=> {moe: 30, larry: 40, curly: 50}
        -
        - -

        - indexOf_.indexOf(array, value, [isSorted]) -
        - Returns the index at which value can be found in the array, - or -1 if value is not present in the array. Uses the native - indexOf function unless it's missing. If you're working with a - large array, and you know that the array is already sorted, pass true - for isSorted to use a faster binary search ... or, pass a number as - the third argument in order to look for the first matching value in the - array after the given index. -

        -
        -_.indexOf([1, 2, 3], 2);
        -=> 1
        -
        - -

        - lastIndexOf_.lastIndexOf(array, value, [fromIndex]) -
        - Returns the index of the last occurrence of value in the array, - or -1 if value is not present. Uses the native lastIndexOf - function if possible. Pass fromIndex to start your search at a - given index. -

        -
        -_.lastIndexOf([1, 2, 3, 1, 2, 3], 2);
        -=> 4
        -
        - -

        - sortedIndex_.sortedIndex(list, value, [iterator]) -
        - Uses a binary search to determine the index at which the value - should be inserted into the list in order to maintain the list's - sorted order. If an iterator is passed, it will be used to compute - the sort ranking of each value, including the value you pass. -

        -
        -_.sortedIndex([10, 20, 30, 40, 50], 35);
        -=> 3
        -
        - -

        - range_.range([start], stop, [step]) -
        - A function to create flexibly-numbered lists of integers, handy for - each and map loops. start, if omitted, defaults - to 0; step defaults to 1. Returns a list of integers - from start to stop, incremented (or decremented) by step, - exclusive. -

        -
        -_.range(10);
        -=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
        -_.range(1, 11);
        -=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        -_.range(0, 30, 5);
        -=> [0, 5, 10, 15, 20, 25]
        -_.range(0, -10, -1);
        -=> [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
        -_.range(0);
        -=> []
        -
        - -

        Function (uh, ahem) Functions

        - -

        - bind_.bind(function, object, [*arguments]) -
        - Bind a function to an object, meaning that whenever - the function is called, the value of this will be the object. - Optionally, bind arguments to the function to pre-fill them, - also known as partial application. -

        -
        -var func = function(greeting){ return greeting + ': ' + this.name };
        -func = _.bind(func, {name : 'moe'}, 'hi');
        -func();
        -=> 'hi: moe'
        -
        - -

        - bindAll_.bindAll(object, [*methodNames]) -
        - Binds a number of methods on the object, specified by - methodNames, to be run in the context of that object whenever they - are invoked. Very handy for binding functions that are going to be used - as event handlers, which would otherwise be invoked with a fairly useless - this. If no methodNames are provided, all of the object's - function properties will be bound to it. -

        -
        -var buttonView = {
        -  label   : 'underscore',
        -  onClick : function(){ alert('clicked: ' + this.label); },
        -  onHover : function(){ console.log('hovering: ' + this.label); }
        -};
        -_.bindAll(buttonView);
        -jQuery('#underscore_button').bind('click', buttonView.onClick);
        -=> When the button is clicked, this.label will have the correct value...
        -
        - -

        - memoize_.memoize(function, [hashFunction]) -
        - Memoizes a given function by caching the computed result. Useful - for speeding up slow-running computations. If passed an optional - hashFunction, it will be used to compute the hash key for storing - the result, based on the arguments to the original function. The default - hashFunction just uses the first argument to the memoized function - as the key. -

        -
        -var fibonacci = _.memoize(function(n) {
        -  return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
        -});
        -
        - -

        - delay_.delay(function, wait, [*arguments]) -
        - Much like setTimeout, invokes function after wait - milliseconds. If you pass the optional arguments, they will be - forwarded on to the function when it is invoked. -

        -
        -var log = _.bind(console.log, console);
        -_.delay(log, 1000, 'logged later');
        -=> 'logged later' // Appears after one second.
        -
        - -

        - defer_.defer(function, [*arguments]) -
        - Defers invoking the function until the current call stack has cleared, - similar to using setTimeout with a delay of 0. Useful for performing - expensive computations or HTML rendering in chunks without blocking the UI thread - from updating. If you pass the optional arguments, they will be - forwarded on to the function when it is invoked. -

        -
        -_.defer(function(){ alert('deferred'); });
        -// Returns from the function before the alert runs.
        -
        - -

        - throttle_.throttle(function, wait) -
        - Creates and returns a new, throttled version of the passed function, - that, when invoked repeatedly, will only actually call the original function - at most once per every wait - milliseconds. Useful for rate-limiting events that occur faster than you - can keep up with. -

        -
        -var throttled = _.throttle(updatePosition, 100);
        -$(window).scroll(throttled);
        -
        - -

        - debounce_.debounce(function, wait, [immediate]) -
        - Creates and returns a new debounced version of the passed function that - will postpone its execution until after - wait milliseconds have elapsed since the last time it - was invoked. Useful for implementing behavior that should only happen - after the input has stopped arriving. For example: rendering a - preview of a Markdown comment, recalculating a layout after the window - has stopped being resized, and so on. -

        - -

        - Pass true for the immediate parameter to cause - debounce to trigger the function on the leading instead of the - trailing edge of the wait interval. Useful in circumstances like - preventing accidental double-clicks on a "submit" button from firing a - second time. -

        - -
        -var lazyLayout = _.debounce(calculateLayout, 300);
        -$(window).resize(lazyLayout);
        -
        - -

        - once_.once(function) -
        - Creates a version of the function that can only be called one time. - Repeated calls to the modified function will have no effect, returning - the value from the original call. Useful for initialization functions, - instead of having to set a boolean flag and then check it later. -

        -
        -var initialize = _.once(createApplication);
        -initialize();
        -initialize();
        -// Application is only created once.
        -
        - -

        - after_.after(count, function) -
        - Creates a version of the function that will only be run after first - being called count times. Useful for grouping asynchronous responses, - where you want to be sure that all the async calls have finished, before - proceeding. -

        -
        -var renderNotes = _.after(notes.length, render);
        -_.each(notes, function(note) {
        -  note.asyncSave({success: renderNotes});
        -});
        -// renderNotes is run once, after all notes have saved.
        -
        - -

        - wrap_.wrap(function, wrapper) -
        - Wraps the first function inside of the wrapper function, - passing it as the first argument. This allows the wrapper to - execute code before and after the function runs, adjust the arguments, - and execute it conditionally. -

        -
        -var hello = function(name) { return "hello: " + name; };
        -hello = _.wrap(hello, function(func) {
        -  return "before, " + func("moe") + ", after";
        -});
        -hello();
        -=> 'before, hello: moe, after'
        -
        - -

        - compose_.compose(*functions) -
        - Returns the composition of a list of functions, where each function - consumes the return value of the function that follows. In math terms, - composing the functions f(), g(), and h() produces - f(g(h())). -

        -
        -var greet    = function(name){ return "hi: " + name; };
        -var exclaim  = function(statement){ return statement + "!"; };
        -var welcome = _.compose(exclaim, greet);
        -welcome('moe');
        -=> 'hi: moe!'
        -
        - -

        Object Functions

        - -

        - keys_.keys(object) -
        - Retrieve all the names of the object's properties. -

        -
        -_.keys({one : 1, two : 2, three : 3});
        -=> ["one", "two", "three"]
        -
        - -

        - values_.values(object) -
        - Return all of the values of the object's properties. -

        -
        -_.values({one : 1, two : 2, three : 3});
        -=> [1, 2, 3]
        -
        - -

        - pairs_.pairs(object) -
        - Convert an object into a list of [key, value] pairs. -

        -
        -_.pairs({one: 1, two: 2, three: 3});
        -=> [["one", 1], ["two", 2], ["three", 3]]
        -
        - -

        - invert_.invert(object) -
        - Returns a copy of the object where the keys have become the values - and the values the keys. For this to work, all of your object's values - should be unique and string serializable. -

        -
        -_.invert({Moe: "Moses", Larry: "Louis", Curly: "Jerome"});
        -=> {Moses: "Moe", Louis: "Larry", Jerome: "Curly"};
        -
        - -

        - functions_.functions(object) - Alias: methods -
        - Returns a sorted list of the names of every method in an object — - that is to say, the name of every function property of the object. -

        -
        -_.functions(_);
        -=> ["all", "any", "bind", "bindAll", "clone", "compact", "compose" ...
        -
        - -

        - extend_.extend(destination, *sources) -
        - Copy all of the properties in the source objects over to the - destination object, and return the destination object. - It's in-order, so the last source will override properties of the same - name in previous arguments. -

        -
        -_.extend({name : 'moe'}, {age : 50});
        -=> {name : 'moe', age : 50}
        -
        - -

        - pick_.pick(object, *keys) -
        - Return a copy of the object, filtered to only have values for - the whitelisted keys (or array of valid keys). -

        -
        -_.pick({name : 'moe', age: 50, userid : 'moe1'}, 'name', 'age');
        -=> {name : 'moe', age : 50}
        -
        - -

        - omit_.omit(object, *keys) -
        - Return a copy of the object, filtered to omit the blacklisted - keys (or array of keys). -

        -
        -_.omit({name : 'moe', age : 50, userid : 'moe1'}, 'userid');
        -=> {name : 'moe', age : 50}
        -
        - -

        - defaults_.defaults(object, *defaults) -
        - Fill in null and undefined properties in object with values from the - defaults objects, and return the object. As soon as the - property is filled, further defaults will have no effect. -

        -
        -var iceCream = {flavor : "chocolate"};
        -_.defaults(iceCream, {flavor : "vanilla", sprinkles : "lots"});
        -=> {flavor : "chocolate", sprinkles : "lots"}
        -
        - -

        - clone_.clone(object) -
        - Create a shallow-copied clone of the object. Any nested objects - or arrays will be copied by reference, not duplicated. -

        -
        -_.clone({name : 'moe'});
        -=> {name : 'moe'};
        -
        - -

        - tap_.tap(object, interceptor) -
        - Invokes interceptor with the object, and then returns object. - The primary purpose of this method is to "tap into" a method chain, in order to perform operations on intermediate results within the chain. -

        -
        -_.chain([1,2,3,200])
        -  .filter(function(num) { return num % 2 == 0; })
        -  .tap(alert)
        -  .map(function(num) { return num * num })
        -  .value();
        -=> // [2, 200] (alerted)
        -=> [4, 40000]
        -
        - -

        - has_.has(object, key) -
        - Does the object contain the given key? Identical to - object.hasOwnProperty(key), but uses a safe reference to the - hasOwnProperty function, in case it's been - overridden accidentally. -

        -
        -_.has({a: 1, b: 2, c: 3}, "b");
        -=> true
        -
        - -

        - isEqual_.isEqual(object, other) -
        - Performs an optimized deep comparison between the two objects, to determine - if they should be considered equal. -

        -
        -var moe   = {name : 'moe', luckyNumbers : [13, 27, 34]};
        -var clone = {name : 'moe', luckyNumbers : [13, 27, 34]};
        -moe == clone;
        -=> false
        -_.isEqual(moe, clone);
        -=> true
        -
        - -

        - isEmpty_.isEmpty(object) -
        - Returns true if object contains no values. -

        -
        -_.isEmpty([1, 2, 3]);
        -=> false
        -_.isEmpty({});
        -=> true
        -
        - -

        - isElement_.isElement(object) -
        - Returns true if object is a DOM element. -

        -
        -_.isElement(jQuery('body')[0]);
        -=> true
        -
        - -

        - isArray_.isArray(object) -
        - Returns true if object is an Array. -

        -
        -(function(){ return _.isArray(arguments); })();
        -=> false
        -_.isArray([1,2,3]);
        -=> true
        -
        - -

        - isObject_.isObject(value) -
        - Returns true if value is an Object. Note that JavaScript - arrays and functions are objects, while (normal) strings and numbers are not. -

        -
        -_.isObject({});
        -=> true
        -_.isObject(1);
        -=> false
        -
        - -

        - isArguments_.isArguments(object) -
        - Returns true if object is an Arguments object. -

        -
        -(function(){ return _.isArguments(arguments); })(1, 2, 3);
        -=> true
        -_.isArguments([1,2,3]);
        -=> false
        -
        - -

        - isFunction_.isFunction(object) -
        - Returns true if object is a Function. -

        -
        -_.isFunction(alert);
        -=> true
        -
        - -

        - isString_.isString(object) -
        - Returns true if object is a String. -

        -
        -_.isString("moe");
        -=> true
        -
        - -

        - isNumber_.isNumber(object) -
        - Returns true if object is a Number (including NaN). -

        -
        -_.isNumber(8.4 * 5);
        -=> true
        -
        - -

        - isFinite_.isFinite(object) -
        - Returns true if object is a finite Number. -

        -
        -_.isFinite(-101);
        -=> true
        -
        -_.isFinite(-Infinity);
        -=> false
        -
        - -

        - isBoolean_.isBoolean(object) -
        - Returns true if object is either true or false. -

        -
        -_.isBoolean(null);
        -=> false
        -
        - -

        - isDate_.isDate(object) -
        - Returns true if object is a Date. -

        -
        -_.isDate(new Date());
        -=> true
        -
        - -

        - isRegExp_.isRegExp(object) -
        - Returns true if object is a RegExp. -

        -
        -_.isRegExp(/moe/);
        -=> true
        -
        - -

        - isNaN_.isNaN(object) -
        - Returns true if object is NaN.
        Note: this is not - the same as the native isNaN function, which will also return - true if the variable is undefined. -

        -
        -_.isNaN(NaN);
        -=> true
        -isNaN(undefined);
        -=> true
        -_.isNaN(undefined);
        -=> false
        -
        - -

        - isNull_.isNull(object) -
        - Returns true if the value of object is null. -

        -
        -_.isNull(null);
        -=> true
        -_.isNull(undefined);
        -=> false
        -
        - -

        - isUndefined_.isUndefined(value) -
        - Returns true if value is undefined. -

        -
        -_.isUndefined(window.missingVariable);
        -=> true
        -
        - -

        Utility Functions

        - -

        - noConflict_.noConflict() -
        - Give control of the "_" variable back to its previous owner. Returns - a reference to the Underscore object. -

        -
        -var underscore = _.noConflict();
        - -

        - identity_.identity(value) -
        - Returns the same value that is used as the argument. In math: - f(x) = x
        - This function looks useless, but is used throughout Underscore as - a default iterator. -

        -
        -var moe = {name : 'moe'};
        -moe === _.identity(moe);
        -=> true
        - -

        - times_.times(n, iterator, [context]) -
        - Invokes the given iterator function n times. Each invocation of - iterator is called with an index argument. -
        - Note: this example uses the chaining syntax. -

        -
        -_(3).times(function(n){ genie.grantWishNumber(n); });
        - -

        - random_.random(min, max) -
        - Returns a random integer between min and max, inclusive. - If you only pass one argument, it will return a number between 0 - and that number. -

        -
        -_.random(0, 100);
        -=> 42
        - -

        - mixin_.mixin(object) -
        - Allows you to extend Underscore with your own utility functions. Pass - a hash of {name: function} definitions to have your functions - added to the Underscore object, as well as the OOP wrapper. -

        -
        -_.mixin({
        -  capitalize : function(string) {
        -    return string.charAt(0).toUpperCase() + string.substring(1).toLowerCase();
        -  }
        -});
        -_("fabio").capitalize();
        -=> "Fabio"
        -
        - -

        - uniqueId_.uniqueId([prefix]) -
        - Generate a globally-unique id for client-side models or DOM elements - that need one. If prefix is passed, the id will be appended to it. - Without prefix, returns an integer. -

        -
        -_.uniqueId('contact_');
        -=> 'contact_104'
        - -

        - escape_.escape(string) -
        - Escapes a string for insertion into HTML, replacing - &, <, >, ", ', and / characters. -

        -
        -_.escape('Curly, Larry & Moe');
        -=> "Curly, Larry &amp; Moe"
        - -

        - unescape_.unescape(string) -
        - The opposite of escape, replaces - &amp;, &lt;, &gt;, - &quot;, &#x27;, and &#x2F; - with their unescaped counterparts. -

        -
        -_.escape('Curly, Larry &amp; Moe');
        -=> "Curly, Larry & Moe"
        - -

        - result_.result(object, property) -
        - If the value of the named property is a function then invoke it; otherwise, return it. -

        -
        -var object = {cheese: 'crumpets', stuff: function(){ return 'nonsense'; }};
        -_.result(object, 'cheese');
        -=> "crumpets"
        -_.result(object, 'stuff');
        -=> "nonsense"
        - -

        - template_.template(templateString, [data], [settings]) -
        - Compiles JavaScript templates into functions that can be evaluated - for rendering. Useful for rendering complicated bits of HTML from JSON - data sources. Template functions can both interpolate variables, using - <%= … %>, as well as execute arbitrary JavaScript code, with - <% … %>. If you wish to interpolate a value, and have - it be HTML-escaped, use <%- … %> When you evaluate a template function, pass in a - data object that has properties corresponding to the template's free - variables. If you're writing a one-off, you can pass the data - object as the second parameter to template in order to render - immediately instead of returning a template function. The settings argument - should be a hash containing any _.templateSettings that should be overridden. -

        - -
        -var compiled = _.template("hello: <%= name %>");
        -compiled({name : 'moe'});
        -=> "hello: moe"
        -
        -var list = "<% _.each(people, function(name) { %> <li><%= name %></li> <% }); %>";
        -_.template(list, {people : ['moe', 'curly', 'larry']});
        -=> "<li>moe</li><li>curly</li><li>larry</li>"
        -
        -var template = _.template("<b><%- value %></b>");
        -template({value : '<script>'});
        -=> "<b>&lt;script&gt;</b>"
        - -

        - You can also use print from within JavaScript code. This is - sometimes more convenient than using <%= ... %>. -

        - -
        -var compiled = _.template("<% print('Hello ' + epithet); %>");
        -compiled({epithet: "stooge"});
        -=> "Hello stooge."
        - -

        - If ERB-style delimiters aren't your cup of tea, you can change Underscore's - template settings to use different symbols to set off interpolated code. - Define an interpolate regex to match expressions that should be - interpolated verbatim, an escape regex to match expressions that should - be inserted after being HTML escaped, and an evaluate regex to match - expressions that should be evaluated without insertion into the resulting - string. You may define or omit any combination of the three. - For example, to perform - Mustache.js - style templating: -

        - -
        -_.templateSettings = {
        -  interpolate : /\{\{(.+?)\}\}/g
        -};
        -
        -var template = _.template("Hello {{ name }}!");
        -template({name : "Mustache"});
        -=> "Hello Mustache!"
        - -

        - By default, template places the values from your data in the local scope - via the with statement. However, you can specify a single variable name - with the variable setting. This can significantly improve the speed - at which a template is able to render. -

        - -
        -_.template("Using 'with': <%= data.answer %>", {answer: 'no'}, {variable: 'data'});
        -=> "Using 'with': no"
        - -

        - Precompiling your templates can be a big help when debugging errors you can't - reproduce. This is because precompiled templates can provide line numbers and - a stack trace, something that is not possible when compiling templates on the client. - The source property is available on the compiled template - function for easy precompilation. -

        - -
        <script>
        -  JST.project = <%= _.template(jstText).source %>;
        -</script>
        - - -

        Chaining

        - -

        - You can use Underscore in either an object-oriented or a functional style, - depending on your preference. The following two lines of code are - identical ways to double a list of numbers. -

        - -
        -_.map([1, 2, 3], function(n){ return n * 2; });
        -_([1, 2, 3]).map(function(n){ return n * 2; });
        - -

        - Calling chain will cause all future method calls to return - wrapped objects. When you've finished the computation, use - value to retrieve the final value. Here's an example of chaining - together a map/flatten/reduce, in order to get the word count of - every word in a song. -

        - -
        -var lyrics = [
        -  {line : 1, words : "I'm a lumberjack and I'm okay"},
        -  {line : 2, words : "I sleep all night and I work all day"},
        -  {line : 3, words : "He's a lumberjack and he's okay"},
        -  {line : 4, words : "He sleeps all night and he works all day"}
        -];
        -
        -_.chain(lyrics)
        -  .map(function(line) { return line.words.split(' '); })
        -  .flatten()
        -  .reduce(function(counts, word) {
        -    counts[word] = (counts[word] || 0) + 1;
        -    return counts;
        -}, {}).value();
        -
        -=> {lumberjack : 2, all : 4, night : 2 ... }
        - -

        - In addition, the - Array prototype's methods - are proxied through the chained Underscore object, so you can slip a - reverse or a push into your chain, and continue to - modify the array. -

        - -

        - chain_.chain(obj) -
        - Returns a wrapped object. Calling methods on this object will continue - to return wrapped objects until value is used. -

        -
        -var stooges = [{name : 'curly', age : 25}, {name : 'moe', age : 21}, {name : 'larry', age : 23}];
        -var youngest = _.chain(stooges)
        -  .sortBy(function(stooge){ return stooge.age; })
        -  .map(function(stooge){ return stooge.name + ' is ' + stooge.age; })
        -  .first()
        -  .value();
        -=> "moe is 21"
        -
        - -

        - value_(obj).value() -
        - Extracts the value of a wrapped object. -

        -
        -_([1, 2, 3]).value();
        -=> [1, 2, 3]
        -
        - - - -

        - The Underscore documentation is also available in - Simplified Chinese. -

        - -

        - Underscore.lua, - a Lua port of the functions that are applicable in both languages. - Includes OOP-wrapping and chaining. - (source) -

        - -

        - Underscore.m, an Objective-C port - of many of the Underscore.js functions, using a syntax that encourages - chaining. - (source) -

        - -

        - _.m, an alternative - Objective-C port that tries to stick a little closer to the original - Underscore.js API. - (source) -

        - -

        - Underscore.php, - a PHP port of the functions that are applicable in both languages. - Includes OOP-wrapping and chaining. - (source) -

        - -

        - Underscore-perl, - a Perl port of many of the Underscore.js functions, - aimed at on Perl hashes and arrays. - (source) -

        - -

        - Underscore.cfc, - a Coldfusion port of many of the Underscore.js functions. - (source) -

        - -

        - Underscore.string, - an Underscore extension that adds functions for string-manipulation: - trim, startsWith, contains, capitalize, - reverse, sprintf, and more. -

        - -

        - Ruby's Enumerable module. -

        - -

        - Prototype.js, which provides - JavaScript with collection functions in the manner closest to Ruby's Enumerable. -

        - -

        - Oliver Steele's - Functional JavaScript, - which includes comprehensive higher-order function support as well as string lambdas. -

        - -

        - Michael Aufreiter's Data.js, - a data manipulation + persistence library for JavaScript. -

        - -

        - Python's itertools. -

        - -

        Change Log

        - -

        - 1.4.3Dec. 4, 2012Diff
        -

          -
        • - Improved Underscore compatibility with Adobe's JS engine that can be - used to script Illustrator, Photoshop, and friends. -
        • -
        • - Added a default _.identity iterator to countBy and - groupBy. -
        • -
        • - The uniq function can now take array, iterator, context - as the argument list. -
        • -
        • - The times function now returns the mapped array of iterator - results. -
        • -
        • - Simplified and fixed bugs in throttle. -
        • -
        -

        - -

        - 1.4.2Oct. 1, 2012Diff
        -

          -
        • - For backwards compatibility, returned to pre-1.4.0 behavior when - passing null to iteration functions. They now become no-ops - again. -
        • -
        -

        - -

        - 1.4.1Oct. 1, 2012Diff
        -

          -
        • - Fixed a 1.4.0 regression in the lastIndexOf function. -
        • -
        -

        - -

        - 1.4.0Sept. 27, 2012Diff
        -

          -
        • - Added a pairs function, for turning a JavaScript object - into [key, value] pairs ... as well as an object - function, for converting an array of [key, value] pairs - into an object. -
        • -
        • - Added a countBy function, for counting the number of objects - in a list that match a certain criteria. -
        • -
        • - Added an invert function, for performing a simple inversion - of the keys and values in an object. -
        • -
        • - Added a where function, for easy cases of filtering a list - for objects with specific values. -
        • -
        • - Added an omit function, for filtering an object to remove - certain keys. -
        • -
        • - Added a random function, to return a random number in a - given range. -
        • -
        • - _.debounce'd functions now return their last updated value, - just like _.throttle'd functions do. -
        • -
        • - The sortBy function now runs a stable sort algorithm. -
        • -
        • - Added the optional fromIndex option to indexOf and - lastIndexOf. -
        • -
        • - "Sparse" arrays are no longer supported in Underscore iteration - functions. Use a for loop instead (or better yet, an object). -
        • -
        • - The min and max functions may now be called on - very large arrays. -
        • -
        • - Interpolation in templates now represents null and - undefined as the empty string. -
        • -
        • - Underscore iteration functions no longer accept null values - as a no-op argument. You'll get an early error instead. -
        • -
        • - A number of edge-cases fixes and tweaks, which you can spot in the - diff. - Depending on how you're using Underscore, 1.4.0 may be more - backwards-incompatible than usual — please test when you upgrade. -
        • -
        -

        - -

        - 1.3.3April 10, 2012
        -

          -
        • - Many improvements to _.template, which now provides the - source of the template function as a property, for potentially - even more efficient pre-compilation on the server-side. You may now - also set the variable option when creating a template, - which will cause your passed-in data to be made available under the - variable you named, instead of using a with statement — - significantly improving the speed of rendering the template. -
        • -
        • - Added the pick function, which allows you to filter an - object literal with a whitelist of allowed property names. -
        • -
        • - Added the result function, for convenience when working - with APIs that allow either functions or raw properties. -
        • -
        • - Added the isFinite function, because sometimes knowing that - a value is a number just ain't quite enough. -
        • -
        • - The sortBy function may now also be passed the string name - of a property to use as the sort order on each object. -
        • -
        • - Fixed uniq to work with sparse arrays. -
        • -
        • - The difference function now performs a shallow flatten - instead of a deep one when computing array differences. -
        • -
        • - The debounce function now takes an immediate - parameter, which will cause the callback to fire on the leading - instead of the trailing edge. -
        • -
        -

        - -

        - 1.3.1Jan. 23, 2012
        -

          -
        • - Added an _.has function, as a safer way to use hasOwnProperty. -
        • -
        • - Added _.collect as an alias for _.map. Smalltalkers, rejoice. -
        • -
        • - Reverted an old change so that _.extend will correctly copy - over keys with undefined values again. -
        • -
        • - Bugfix to stop escaping slashes within interpolations in _.template. -
        • -
        -

        - -

        - 1.3.0Jan. 11, 2012
        -

          -
        • - Removed AMD (RequireJS) support from Underscore. If you'd like to use - Underscore with RequireJS, you can load it as a normal script, wrap - or patch your copy, or download a forked version. -
        • -
        -

        - -

        - 1.2.4Jan. 4, 2012
        -

          -
        • - You now can (and probably should, as it's simpler) - write _.chain(list) - instead of _(list).chain(). -
        • -
        • - Fix for escaped characters in Underscore templates, and for supporting - customizations of _.templateSettings that only define one or - two of the required regexes. -
        • -
        • - Fix for passing an array as the first argument to an _.wrap'd function. -
        • -
        • - Improved compatibility with ClojureScript, which adds a call - function to String.prototype. -
        • -
        -

        - -

        - 1.2.3Dec. 7, 2011
        -

          -
        • - Dynamic scope is now preserved for compiled _.template functions, - so you can use the value of this if you like. -
        • -
        • - Sparse array support of _.indexOf, _.lastIndexOf. -
        • -
        • - Both _.reduce and _.reduceRight can now be passed an - explicitly undefined value. (There's no reason why you'd - want to do this.) -
        • -
        -

        - -

        - 1.2.2Nov. 14, 2011
        -

          -
        • - Continued tweaks to _.isEqual semantics. Now JS primitives are - considered equivalent to their wrapped versions, and arrays are compared - by their numeric properties only (#351). -
        • -
        • - _.escape no longer tries to be smart about not double-escaping - already-escaped HTML entities. Now it just escapes regardless (#350). -
        • -
        • - In _.template, you may now leave semicolons out of evaluated - statements if you wish: <% }) %> (#369). -
        • -
        • - _.after(callback, 0) will now trigger the callback immediately, - making "after" easier to use with asynchronous APIs (#366). -
        • -
        -

        - -

        - 1.2.1Oct. 24, 2011
        -

          -
        • - Several important bug fixes for _.isEqual, which should now - do better on mutated Arrays, and on non-Array objects with - length properties. (#329) -
        • -
        • - jrburke contributed Underscore exporting for AMD module loaders, - and tonylukasavage for Appcelerator Titanium. - (#335, #338) -
        • -
        • - You can now _.groupBy(list, 'property') as a shortcut for - grouping values by a particular common property. -
        • -
        • - _.throttle'd functions now fire immediately upon invocation, - and are rate-limited thereafter (#170, #266). -
        • -
        • - Most of the _.is[Type] checks no longer ducktype. -
        • -
        • - The _.bind function now also works on constructors, a-la - ES5 ... but you would never want to use _.bind on a - constructor function. -
        • -
        • - _.clone no longer wraps non-object types in Objects. -
        • -
        • - _.find and _.filter are now the preferred names for - _.detect and _.select. -
        • -
        -

        - -

        - 1.2.0Oct. 5, 2011
        -

          -
        • - The _.isEqual function now - supports true deep equality comparisons, with checks for cyclic structures, - thanks to Kit Cambridge. -
        • -
        • - Underscore templates now support HTML escaping interpolations, using - <%- ... %> syntax. -
        • -
        • - Ryan Tenney contributed _.shuffle, which uses a modified - Fisher-Yates to give you a shuffled copy of an array. -
        • -
        • - _.uniq can now be passed an optional iterator, to determine by - what criteria an object should be considered unique. -
        • -
        • - _.last now takes an optional argument which will return the last - N elements of the list. -
        • -
        • - A new _.initial function was added, as a mirror of _.rest, - which returns all the initial values of a list (except the last N). -
        • -
        -

        - -

        - 1.1.7July 13, 2011
        - Added _.groupBy, which aggregates a collection into groups of like items. - Added _.union and _.difference, to complement the - (re-named) _.intersection. - Various improvements for support of sparse arrays. - _.toArray now returns a clone, if directly passed an array. - _.functions now also returns the names of functions that are present - in the prototype chain. -

        - -

        - 1.1.6April 18, 2011
        - Added _.after, which will return a function that only runs after - first being called a specified number of times. - _.invoke can now take a direct function reference. - _.every now requires an iterator function to be passed, which - mirrors the ECMA5 API. - _.extend no longer copies keys when the value is undefined. - _.bind now errors when trying to bind an undefined value. -

        - -

        - 1.1.5Mar 20, 2011
        - Added an _.defaults function, for use merging together JS objects - representing default options. - Added an _.once function, for manufacturing functions that should - only ever execute a single time. - _.bind now delegates to the native ECMAScript 5 version, - where available. - _.keys now throws an error when used on non-Object values, as in - ECMAScript 5. - Fixed a bug with _.keys when used over sparse arrays. -

        - -

        - 1.1.4Jan 9, 2011
        - Improved compliance with ES5's Array methods when passing null - as a value. _.wrap now correctly sets this for the - wrapped function. _.indexOf now takes an optional flag for - finding the insertion index in an array that is guaranteed to already - be sorted. Avoiding the use of .callee, to allow _.isArray - to work properly in ES5's strict mode. -

        - -

        - 1.1.3Dec 1, 2010
        - In CommonJS, Underscore may now be required with just:
        - var _ = require("underscore"). - Added _.throttle and _.debounce functions. - Removed _.breakLoop, in favor of an ECMA5-style un-break-able - each implementation — this removes the try/catch, and you'll now have - better stack traces for exceptions that are thrown within an Underscore iterator. - Improved the isType family of functions for better interoperability - with Internet Explorer host objects. - _.template now correctly escapes backslashes in templates. - Improved _.reduce compatibility with the ECMA5 version: - if you don't pass an initial value, the first item in the collection is used. - _.each no longer returns the iterated collection, for improved - consistency with ES5's forEach. -

        - -

        - 1.1.2
        - Fixed _.contains, which was mistakenly pointing at - _.intersect instead of _.include, like it should - have been. Added _.unique as an alias for _.uniq. -

        - -

        - 1.1.1
        - Improved the speed of _.template, and its handling of multiline - interpolations. Ryan Tenney contributed optimizations to many Underscore - functions. An annotated version of the source code is now available. -

        - -

        - 1.1.0
        - The method signature of _.reduce has been changed to match - the ECMAScript 5 signature, instead of the Ruby/Prototype.js version. - This is a backwards-incompatible change. _.template may now be - called with no arguments, and preserves whitespace. _.contains - is a new alias for _.include. -

        - -

        - 1.0.4
        - Andri Möll contributed the _.memoize - function, which can be used to speed up expensive repeated computations - by caching the results. -

        - -

        - 1.0.3
        - Patch that makes _.isEqual return false if any property - of the compared object has a NaN value. Technically the correct - thing to do, but of questionable semantics. Watch out for NaN comparisons. -

        - -

        - 1.0.2
        - Fixes _.isArguments in recent versions of Opera, which have - arguments objects as real Arrays. -

        - -

        - 1.0.1
        - Bugfix for _.isEqual, when comparing two objects with the same - number of undefined keys, but with different names. -

        - -

        - 1.0.0
        - Things have been stable for many months now, so Underscore is now - considered to be out of beta, at 1.0. Improvements since 0.6 - include _.isBoolean, and the ability to have _.extend - take multiple source objects. -

        - -

        - 0.6.0
        - Major release. Incorporates a number of - Mile Frawley's refactors for - safer duck-typing on collection functions, and cleaner internals. A new - _.mixin method that allows you to extend Underscore with utility - functions of your own. Added _.times, which works the same as in - Ruby or Prototype.js. Native support for ECMAScript 5's Array.isArray, - and Object.keys. -

        - -

        - 0.5.8
        - Fixed Underscore's collection functions to work on - NodeLists and - HTMLCollections - once more, thanks to - Justin Tulloss. -

        - -

        - 0.5.7
        - A safer implementation of _.isArguments, and a - faster _.isNumber,
        thanks to - Jed Schmidt. -

        - -

        - 0.5.6
        - Customizable delimiters for _.template, contributed by - Noah Sloan. -

        - -

        - 0.5.5
        - Fix for a bug in MobileSafari's OOP-wrapper, with the arguments object. -

        - -

        - 0.5.4
        - Fix for multiple single quotes within a template string for - _.template. See: - Rick Strahl's blog post. -

        - -

        - 0.5.2
        - New implementations of isArray, isDate, isFunction, - isNumber, isRegExp, and isString, thanks to - a suggestion from - Robert Kieffer. - Instead of doing Object#toString - comparisons, they now check for expected properties, which is less safe, - but more than an order of magnitude faster. Most other Underscore - functions saw minor speed improvements as a result. - Evgeniy Dolzhenko - contributed _.tap, - similar to Ruby 1.9's, - which is handy for injecting side effects (like logging) into chained calls. -

        - -

        - 0.5.1
        - Added an _.isArguments function. Lots of little safety checks - and optimizations contributed by - Noah Sloan and - Andri Möll. -

        - -

        - 0.5.0
        - [API Changes] _.bindAll now takes the context object as - its first parameter. If no method names are passed, all of the context - object's methods are bound to it, enabling chaining and easier binding. - _.functions now takes a single argument and returns the names - of its Function properties. Calling _.functions(_) will get you - the previous behavior. - Added _.isRegExp so that isEqual can now test for RegExp equality. - All of the "is" functions have been shrunk down into a single definition. - Karl Guertin contributed patches. -

        - -

        - 0.4.7
        - Added isDate, isNaN, and isNull, for completeness. - Optimizations for isEqual when checking equality between Arrays - or Dates. _.keys is now 25%–2X faster (depending on your - browser) which speeds up the functions that rely on it, such as _.each. -

        - -

        - 0.4.6
        - Added the range function, a port of the - Python - function of the same name, for generating flexibly-numbered lists - of integers. Original patch contributed by - Kirill Ishanov. -

        - -

        - 0.4.5
        - Added rest for Arrays and arguments objects, and aliased - first as head, and rest as tail, - thanks to Luke Sutton's patches. - Added tests ensuring that all Underscore Array functions also work on - arguments objects. -

        - -

        - 0.4.4
        - Added isString, and isNumber, for consistency. Fixed - _.isEqual(NaN, NaN) to return true (which is debatable). -

        - -

        - 0.4.3
        - Started using the native StopIteration object in browsers that support it. - Fixed Underscore setup for CommonJS environments. -

        - -

        - 0.4.2
        - Renamed the unwrapping function to value, for clarity. -

        - -

        - 0.4.1
        - Chained Underscore objects now support the Array prototype methods, so - that you can perform the full range of operations on a wrapped array - without having to break your chain. Added a breakLoop method - to break in the middle of any Underscore iteration. Added an - isEmpty function that works on arrays and objects. -

        - -

        - 0.4.0
        - All Underscore functions can now be called in an object-oriented style, - like so: _([1, 2, 3]).map(...);. Original patch provided by - Marc-André Cournoyer. - Wrapped objects can be chained through multiple - method invocations. A functions method - was added, providing a sorted list of all the functions in Underscore. -

        - -

        - 0.3.3
        - Added the JavaScript 1.8 function reduceRight. Aliased it - as foldr, and aliased reduce as foldl. -

        - -

        - 0.3.2
        - Now runs on stock Rhino - interpreters with: load("underscore.js"). - Added identity as a utility function. -

        - -

        - 0.3.1
        - All iterators are now passed in the original collection as their third - argument, the same as JavaScript 1.6's forEach. Iterating over - objects is now called with (value, key, collection), for details - see _.each. -

        - -

        - 0.3.0
        - Added Dmitry Baranovskiy's - comprehensive optimizations, merged in - Kris Kowal's patches to make Underscore - CommonJS and - Narwhal compliant. -

        - -

        - 0.2.0
        - Added compose and lastIndexOf, renamed inject to - reduce, added aliases for inject, filter, - every, some, and forEach. -

        - -

        - 0.1.1
        - Added noConflict, so that the "Underscore" object can be assigned to - other variables. -

        - -

        - 0.1.0
        - Initial release of Underscore.js. -

        - -

        - - A DocumentCloud Project - -

        - -
        - -
        - - - - - - diff --git a/node_modules/underscore/index.js b/node_modules/underscore/index.js deleted file mode 100644 index 2cf0ca5..0000000 --- a/node_modules/underscore/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('./underscore'); diff --git a/node_modules/underscore/package.json b/node_modules/underscore/package.json deleted file mode 100644 index 330ae77..0000000 --- a/node_modules/underscore/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "underscore", - "description": "JavaScript's functional programming helper library.", - "homepage": "http://underscorejs.org", - "keywords": [ - "util", - "functional", - "server", - "client", - "browser" - ], - "author": { - "name": "Jeremy Ashkenas", - "email": "jeremy@documentcloud.org" - }, - "repository": { - "type": "git", - "url": "git://github.com/documentcloud/underscore.git" - }, - "main": "underscore.js", - "version": "1.4.3", - "readme": " __\n /\\ \\ __\n __ __ ___ \\_\\ \\ __ _ __ ____ ___ ___ _ __ __ /\\_\\ ____\n /\\ \\/\\ \\ /' _ `\\ /'_ \\ /'__`\\/\\ __\\/ ,__\\ / ___\\ / __`\\/\\ __\\/'__`\\ \\/\\ \\ /',__\\\n \\ \\ \\_\\ \\/\\ \\/\\ \\/\\ \\ \\ \\/\\ __/\\ \\ \\//\\__, `\\/\\ \\__//\\ \\ \\ \\ \\ \\//\\ __/ __ \\ \\ \\/\\__, `\\\n \\ \\____/\\ \\_\\ \\_\\ \\___,_\\ \\____\\\\ \\_\\\\/\\____/\\ \\____\\ \\____/\\ \\_\\\\ \\____\\/\\_\\ _\\ \\ \\/\\____/\n \\/___/ \\/_/\\/_/\\/__,_ /\\/____/ \\/_/ \\/___/ \\/____/\\/___/ \\/_/ \\/____/\\/_//\\ \\_\\ \\/___/\n \\ \\____/\n \\/___/\n\nUnderscore.js is a utility-belt library for JavaScript that provides\nsupport for the usual functional suspects (each, map, reduce, filter...)\nwithout extending any core JavaScript objects.\n\nFor Docs, License, Tests, and pre-packed downloads, see:\nhttp://underscorejs.org\n\nMany thanks to our contributors:\nhttps://github.com/documentcloud/underscore/contributors\n", - "_id": "underscore@1.4.3", - "dist": { - "shasum": "b3d0aaa1ee74d886ea4f2648021a4f8ad779ed1d" - }, - "_from": "underscore" -} diff --git a/node_modules/underscore/raw/underscore.psd b/node_modules/underscore/raw/underscore.psd deleted file mode 100644 index 73ad2d7c8eebce69b4f46f31c0a1a8c2d523bc0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215540 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 diff --git a/node_modules/underscore/underscore-min.js b/node_modules/underscore/underscore-min.js deleted file mode 100644 index 7ed6e52..0000000 --- a/node_modules/underscore/underscore-min.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,v=e.reduce,h=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,_=Object.keys,j=i.bind,w=function(n){return n instanceof w?n:this instanceof w?(this._wrapped=n,void 0):new w(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=w),exports._=w):n._=w,w.VERSION="1.4.3";var A=w.each=w.forEach=function(n,t,e){if(null!=n)if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a in n)if(w.has(n,a)&&t.call(e,n[a],a,n)===r)return};w.map=w.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e[e.length]=t.call(r,n,u,i)}),e)};var O="Reduce of empty array with no initial value";w.reduce=w.foldl=w.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduce===v)return e&&(t=w.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(O);return r},w.reduceRight=w.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduceRight===h)return e&&(t=w.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=w.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(O);return r},w.find=w.detect=function(n,t,r){var e;return E(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},w.filter=w.select=function(n,t,r){var e=[];return null==n?e:g&&n.filter===g?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&(e[e.length]=n)}),e)},w.reject=function(n,t,r){return w.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},w.every=w.all=function(n,t,e){t||(t=w.identity);var u=!0;return null==n?u:d&&n.every===d?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var E=w.some=w.any=function(n,t,e){t||(t=w.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};w.contains=w.include=function(n,t){return null==n?!1:y&&n.indexOf===y?-1!=n.indexOf(t):E(n,function(n){return n===t})},w.invoke=function(n,t){var r=o.call(arguments,2);return w.map(n,function(n){return(w.isFunction(t)?t:n[t]).apply(n,r)})},w.pluck=function(n,t){return w.map(n,function(n){return n[t]})},w.where=function(n,t){return w.isEmpty(t)?[]:w.filter(n,function(n){for(var r in t)if(t[r]!==n[r])return!1;return!0})},w.max=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.max.apply(Math,n);if(!t&&w.isEmpty(n))return-1/0;var e={computed:-1/0,value:-1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a>=e.computed&&(e={value:n,computed:a})}),e.value},w.min=function(n,t,r){if(!t&&w.isArray(n)&&n[0]===+n[0]&&65535>n.length)return Math.min.apply(Math,n);if(!t&&w.isEmpty(n))return 1/0;var e={computed:1/0,value:1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;e.computed>a&&(e={value:n,computed:a})}),e.value},w.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=w.random(r++),e[r-1]=e[t],e[t]=n}),e};var F=function(n){return w.isFunction(n)?n:function(t){return t[n]}};w.sortBy=function(n,t,r){var e=F(t);return w.pluck(w.map(n,function(n,t,u){return{value:n,index:t,criteria:e.call(r,n,t,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||void 0===r)return 1;if(e>r||void 0===e)return-1}return n.indexi;){var o=i+a>>>1;u>r.call(e,n[o])?i=o+1:a=o}return i},w.toArray=function(n){return n?w.isArray(n)?o.call(n):n.length===+n.length?w.map(n,w.identity):w.values(n):[]},w.size=function(n){return null==n?0:n.length===+n.length?n.length:w.keys(n).length},w.first=w.head=w.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:o.call(n,0,t)},w.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},w.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},w.rest=w.tail=w.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},w.compact=function(n){return w.filter(n,w.identity)};var R=function(n,t,r){return A(n,function(n){w.isArray(n)?t?a.apply(r,n):R(n,t,r):r.push(n)}),r};w.flatten=function(n,t){return R(n,t,[])},w.without=function(n){return w.difference(n,o.call(arguments,1))},w.uniq=w.unique=function(n,t,r,e){w.isFunction(t)&&(e=r,r=t,t=!1);var u=r?w.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:w.contains(a,r))||(a.push(r),i.push(n[e]))}),i},w.union=function(){return w.uniq(c.apply(e,arguments))},w.intersection=function(n){var t=o.call(arguments,1);return w.filter(w.uniq(n),function(n){return w.every(t,function(t){return w.indexOf(t,n)>=0})})},w.difference=function(n){var t=c.apply(e,o.call(arguments,1));return w.filter(n,function(n){return!w.contains(t,n)})},w.zip=function(){for(var n=o.call(arguments),t=w.max(w.pluck(n,"length")),r=Array(t),e=0;t>e;e++)r[e]=w.pluck(n,""+e);return r},w.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},w.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=w.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},w.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},w.range=function(n,t,r){1>=arguments.length&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=Array(e);e>u;)i[u++]=n,n+=r;return i};var I=function(){};w.bind=function(n,t){var r,e;if(n.bind===j&&j)return j.apply(n,o.call(arguments,1));if(!w.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));I.prototype=n.prototype;var u=new I;I.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},w.bindAll=function(n){var t=o.call(arguments,1);return 0==t.length&&(t=w.functions(n)),A(t,function(t){n[t]=w.bind(n[t],n)}),n},w.memoize=function(n,t){var r={};return t||(t=w.identity),function(){var e=t.apply(this,arguments);return w.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},w.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},w.defer=function(n){return w.delay.apply(w,[n,1].concat(o.call(arguments,1)))},w.throttle=function(n,t){var r,e,u,i,a=0,o=function(){a=new Date,u=null,i=n.apply(r,e)};return function(){var c=new Date,l=t-(c-a);return r=this,e=arguments,0>=l?(clearTimeout(u),u=null,a=c,i=n.apply(r,e)):u||(u=setTimeout(o,l)),i}},w.debounce=function(n,t,r){var e,u;return function(){var i=this,a=arguments,o=function(){e=null,r||(u=n.apply(i,a))},c=r&&!e;return clearTimeout(e),e=setTimeout(o,t),c&&(u=n.apply(i,a)),u}},w.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},w.wrap=function(n,t){return function(){var r=[n];return a.apply(r,arguments),t.apply(this,r)}},w.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},w.after=function(n,t){return 0>=n?t():function(){return 1>--n?t.apply(this,arguments):void 0}},w.keys=_||function(n){if(n!==Object(n))throw new TypeError("Invalid object");var t=[];for(var r in n)w.has(n,r)&&(t[t.length]=r);return t},w.values=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push(n[r]);return t},w.pairs=function(n){var t=[];for(var r in n)w.has(n,r)&&t.push([r,n[r]]);return t},w.invert=function(n){var t={};for(var r in n)w.has(n,r)&&(t[n[r]]=r);return t},w.functions=w.methods=function(n){var t=[];for(var r in n)w.isFunction(n[r])&&t.push(r);return t.sort()},w.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},w.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},w.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)w.contains(r,u)||(t[u]=n[u]);return t},w.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)null==n[r]&&(n[r]=t[r])}),n},w.clone=function(n){return w.isObject(n)?w.isArray(n)?n.slice():w.extend({},n):n},w.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof w&&(n=n._wrapped),t instanceof w&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==t+"";case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;r.push(n),e.push(t);var a=0,o=!0;if("[object Array]"==u){if(a=n.length,o=a==t.length)for(;a--&&(o=S(n[a],t[a],r,e)););}else{var c=n.constructor,f=t.constructor;if(c!==f&&!(w.isFunction(c)&&c instanceof c&&w.isFunction(f)&&f instanceof f))return!1;for(var s in n)if(w.has(n,s)&&(a++,!(o=w.has(t,s)&&S(n[s],t[s],r,e))))break;if(o){for(s in t)if(w.has(t,s)&&!a--)break;o=!a}}return r.pop(),e.pop(),o};w.isEqual=function(n,t){return S(n,t,[],[])},w.isEmpty=function(n){if(null==n)return!0;if(w.isArray(n)||w.isString(n))return 0===n.length;for(var t in n)if(w.has(n,t))return!1;return!0},w.isElement=function(n){return!(!n||1!==n.nodeType)},w.isArray=x||function(n){return"[object Array]"==l.call(n)},w.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){w["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),w.isArguments(arguments)||(w.isArguments=function(n){return!(!n||!w.has(n,"callee"))}),w.isFunction=function(n){return"function"==typeof n},w.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},w.isNaN=function(n){return w.isNumber(n)&&n!=+n},w.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},w.isNull=function(n){return null===n},w.isUndefined=function(n){return void 0===n},w.has=function(n,t){return f.call(n,t)},w.noConflict=function(){return n._=t,this},w.identity=function(n){return n},w.times=function(n,t,r){for(var e=Array(n),u=0;n>u;u++)e[u]=t.call(r,u);return e},w.random=function(n,t){return null==t&&(t=n,n=0),n+(0|Math.random()*(t-n+1))};var T={escape:{"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"}};T.unescape=w.invert(T.escape);var M={escape:RegExp("["+w.keys(T.escape).join("")+"]","g"),unescape:RegExp("("+w.keys(T.unescape).join("|")+")","g")};w.each(["escape","unescape"],function(n){w[n]=function(t){return null==t?"":(""+t).replace(M[n],function(t){return T[n][t]})}}),w.result=function(n,t){if(null==n)return null;var r=n[t];return w.isFunction(r)?r.call(n):r},w.mixin=function(n){A(w.functions(n),function(t){var r=w[t]=n[t];w.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),z.call(this,r.apply(w,n))}})};var N=0;w.uniqueId=function(n){var t=""+ ++N;return n?n+t:t},w.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var q=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\t|\u2028|\u2029/g;w.template=function(n,t,r){r=w.defaults({},r,w.templateSettings);var e=RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,a,o){return i+=n.slice(u,o).replace(D,function(n){return"\\"+B[n]}),r&&(i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(i+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),a&&(i+="';\n"+a+"\n__p+='"),u=o+t.length,t}),i+="';\n",r.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var a=Function(r.variable||"obj","_",i)}catch(o){throw o.source=i,o}if(t)return a(t,w);var c=function(n){return a.call(this,n,w)};return c.source="function("+(r.variable||"obj")+"){\n"+i+"}",c},w.chain=function(n){return w(n).chain()};var z=function(n){return this._chain?w(n).chain():n};w.mixin(w),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];w.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],z.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];w.prototype[n]=function(){return z.call(this,t.apply(this._wrapped,arguments))}}),w.extend(w.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this); \ No newline at end of file diff --git a/node_modules/underscore/underscore.js b/node_modules/underscore/underscore.js deleted file mode 100644 index 4d83099..0000000 --- a/node_modules/underscore/underscore.js +++ /dev/null @@ -1,1221 +0,0 @@ -// Underscore.js 1.4.3 -// http://underscorejs.org -// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc. -// Underscore may be freely distributed under the MIT license. - -(function() { - - // Baseline setup - // -------------- - - // Establish the root object, `window` in the browser, or `global` on the server. - var root = this; - - // Save the previous value of the `_` variable. - var previousUnderscore = root._; - - // Establish the object that gets returned to break out of a loop iteration. - var breaker = {}; - - // Save bytes in the minified (but not gzipped) version: - var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; - - // Create quick reference variables for speed access to core prototypes. - var push = ArrayProto.push, - slice = ArrayProto.slice, - concat = ArrayProto.concat, - toString = ObjProto.toString, - hasOwnProperty = ObjProto.hasOwnProperty; - - // All **ECMAScript 5** native function implementations that we hope to use - // are declared here. - var - nativeForEach = ArrayProto.forEach, - nativeMap = ArrayProto.map, - nativeReduce = ArrayProto.reduce, - nativeReduceRight = ArrayProto.reduceRight, - nativeFilter = ArrayProto.filter, - nativeEvery = ArrayProto.every, - nativeSome = ArrayProto.some, - nativeIndexOf = ArrayProto.indexOf, - nativeLastIndexOf = ArrayProto.lastIndexOf, - nativeIsArray = Array.isArray, - nativeKeys = Object.keys, - nativeBind = FuncProto.bind; - - // Create a safe reference to the Underscore object for use below. - var _ = function(obj) { - if (obj instanceof _) return obj; - if (!(this instanceof _)) return new _(obj); - this._wrapped = obj; - }; - - // Export the Underscore object for **Node.js**, with - // backwards-compatibility for the old `require()` API. If we're in - // the browser, add `_` as a global object via a string identifier, - // for Closure Compiler "advanced" mode. - if (typeof exports !== 'undefined') { - if (typeof module !== 'undefined' && module.exports) { - exports = module.exports = _; - } - exports._ = _; - } else { - root._ = _; - } - - // Current version. - _.VERSION = '1.4.3'; - - // Collection Functions - // -------------------- - - // The cornerstone, an `each` implementation, aka `forEach`. - // Handles objects with the built-in `forEach`, arrays, and raw objects. - // Delegates to **ECMAScript 5**'s native `forEach` if available. - var each = _.each = _.forEach = function(obj, iterator, context) { - if (obj == null) return; - if (nativeForEach && obj.forEach === nativeForEach) { - obj.forEach(iterator, context); - } else if (obj.length === +obj.length) { - for (var i = 0, l = obj.length; i < l; i++) { - if (iterator.call(context, obj[i], i, obj) === breaker) return; - } - } else { - for (var key in obj) { - if (_.has(obj, key)) { - if (iterator.call(context, obj[key], key, obj) === breaker) return; - } - } - } - }; - - // Return the results of applying the iterator to each element. - // Delegates to **ECMAScript 5**'s native `map` if available. - _.map = _.collect = function(obj, iterator, context) { - var results = []; - if (obj == null) return results; - if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); - each(obj, function(value, index, list) { - results[results.length] = iterator.call(context, value, index, list); - }); - return results; - }; - - var reduceError = 'Reduce of empty array with no initial value'; - - // **Reduce** builds up a single result from a list of values, aka `inject`, - // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available. - _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) { - var initial = arguments.length > 2; - if (obj == null) obj = []; - if (nativeReduce && obj.reduce === nativeReduce) { - if (context) iterator = _.bind(iterator, context); - return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator); - } - each(obj, function(value, index, list) { - if (!initial) { - memo = value; - initial = true; - } else { - memo = iterator.call(context, memo, value, index, list); - } - }); - if (!initial) throw new TypeError(reduceError); - return memo; - }; - - // The right-associative version of reduce, also known as `foldr`. - // Delegates to **ECMAScript 5**'s native `reduceRight` if available. - _.reduceRight = _.foldr = function(obj, iterator, memo, context) { - var initial = arguments.length > 2; - if (obj == null) obj = []; - if (nativeReduceRight && obj.reduceRight === nativeReduceRight) { - if (context) iterator = _.bind(iterator, context); - return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator); - } - var length = obj.length; - if (length !== +length) { - var keys = _.keys(obj); - length = keys.length; - } - each(obj, function(value, index, list) { - index = keys ? keys[--length] : --length; - if (!initial) { - memo = obj[index]; - initial = true; - } else { - memo = iterator.call(context, memo, obj[index], index, list); - } - }); - if (!initial) throw new TypeError(reduceError); - return memo; - }; - - // Return the first value which passes a truth test. Aliased as `detect`. - _.find = _.detect = function(obj, iterator, context) { - var result; - any(obj, function(value, index, list) { - if (iterator.call(context, value, index, list)) { - result = value; - return true; - } - }); - return result; - }; - - // Return all the elements that pass a truth test. - // Delegates to **ECMAScript 5**'s native `filter` if available. - // Aliased as `select`. - _.filter = _.select = function(obj, iterator, context) { - var results = []; - if (obj == null) return results; - if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context); - each(obj, function(value, index, list) { - if (iterator.call(context, value, index, list)) results[results.length] = value; - }); - return results; - }; - - // Return all the elements for which a truth test fails. - _.reject = function(obj, iterator, context) { - return _.filter(obj, function(value, index, list) { - return !iterator.call(context, value, index, list); - }, context); - }; - - // Determine whether all of the elements match a truth test. - // Delegates to **ECMAScript 5**'s native `every` if available. - // Aliased as `all`. - _.every = _.all = function(obj, iterator, context) { - iterator || (iterator = _.identity); - var result = true; - if (obj == null) return result; - if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context); - each(obj, function(value, index, list) { - if (!(result = result && iterator.call(context, value, index, list))) return breaker; - }); - return !!result; - }; - - // Determine if at least one element in the object matches a truth test. - // Delegates to **ECMAScript 5**'s native `some` if available. - // Aliased as `any`. - var any = _.some = _.any = function(obj, iterator, context) { - iterator || (iterator = _.identity); - var result = false; - if (obj == null) return result; - if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context); - each(obj, function(value, index, list) { - if (result || (result = iterator.call(context, value, index, list))) return breaker; - }); - return !!result; - }; - - // Determine if the array or object contains a given value (using `===`). - // Aliased as `include`. - _.contains = _.include = function(obj, target) { - if (obj == null) return false; - if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1; - return any(obj, function(value) { - return value === target; - }); - }; - - // Invoke a method (with arguments) on every item in a collection. - _.invoke = function(obj, method) { - var args = slice.call(arguments, 2); - return _.map(obj, function(value) { - return (_.isFunction(method) ? method : value[method]).apply(value, args); - }); - }; - - // Convenience version of a common use case of `map`: fetching a property. - _.pluck = function(obj, key) { - return _.map(obj, function(value){ return value[key]; }); - }; - - // Convenience version of a common use case of `filter`: selecting only objects - // with specific `key:value` pairs. - _.where = function(obj, attrs) { - if (_.isEmpty(attrs)) return []; - return _.filter(obj, function(value) { - for (var key in attrs) { - if (attrs[key] !== value[key]) return false; - } - return true; - }); - }; - - // Return the maximum element or (element-based computation). - // Can't optimize arrays of integers longer than 65,535 elements. - // See: https://bugs.webkit.org/show_bug.cgi?id=80797 - _.max = function(obj, iterator, context) { - if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { - return Math.max.apply(Math, obj); - } - if (!iterator && _.isEmpty(obj)) return -Infinity; - var result = {computed : -Infinity, value: -Infinity}; - each(obj, function(value, index, list) { - var computed = iterator ? iterator.call(context, value, index, list) : value; - computed >= result.computed && (result = {value : value, computed : computed}); - }); - return result.value; - }; - - // Return the minimum element (or element-based computation). - _.min = function(obj, iterator, context) { - if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { - return Math.min.apply(Math, obj); - } - if (!iterator && _.isEmpty(obj)) return Infinity; - var result = {computed : Infinity, value: Infinity}; - each(obj, function(value, index, list) { - var computed = iterator ? iterator.call(context, value, index, list) : value; - computed < result.computed && (result = {value : value, computed : computed}); - }); - return result.value; - }; - - // Shuffle an array. - _.shuffle = function(obj) { - var rand; - var index = 0; - var shuffled = []; - each(obj, function(value) { - rand = _.random(index++); - shuffled[index - 1] = shuffled[rand]; - shuffled[rand] = value; - }); - return shuffled; - }; - - // An internal function to generate lookup iterators. - var lookupIterator = function(value) { - return _.isFunction(value) ? value : function(obj){ return obj[value]; }; - }; - - // Sort the object's values by a criterion produced by an iterator. - _.sortBy = function(obj, value, context) { - var iterator = lookupIterator(value); - return _.pluck(_.map(obj, function(value, index, list) { - return { - value : value, - index : index, - criteria : iterator.call(context, value, index, list) - }; - }).sort(function(left, right) { - var a = left.criteria; - var b = right.criteria; - if (a !== b) { - if (a > b || a === void 0) return 1; - if (a < b || b === void 0) return -1; - } - return left.index < right.index ? -1 : 1; - }), 'value'); - }; - - // An internal function used for aggregate "group by" operations. - var group = function(obj, value, context, behavior) { - var result = {}; - var iterator = lookupIterator(value || _.identity); - each(obj, function(value, index) { - var key = iterator.call(context, value, index, obj); - behavior(result, key, value); - }); - return result; - }; - - // Groups the object's values by a criterion. Pass either a string attribute - // to group by, or a function that returns the criterion. - _.groupBy = function(obj, value, context) { - return group(obj, value, context, function(result, key, value) { - (_.has(result, key) ? result[key] : (result[key] = [])).push(value); - }); - }; - - // Counts instances of an object that group by a certain criterion. Pass - // either a string attribute to count by, or a function that returns the - // criterion. - _.countBy = function(obj, value, context) { - return group(obj, value, context, function(result, key) { - if (!_.has(result, key)) result[key] = 0; - result[key]++; - }); - }; - - // Use a comparator function to figure out the smallest index at which - // an object should be inserted so as to maintain order. Uses binary search. - _.sortedIndex = function(array, obj, iterator, context) { - iterator = iterator == null ? _.identity : lookupIterator(iterator); - var value = iterator.call(context, obj); - var low = 0, high = array.length; - while (low < high) { - var mid = (low + high) >>> 1; - iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid; - } - return low; - }; - - // Safely convert anything iterable into a real, live array. - _.toArray = function(obj) { - if (!obj) return []; - if (_.isArray(obj)) return slice.call(obj); - if (obj.length === +obj.length) return _.map(obj, _.identity); - return _.values(obj); - }; - - // Return the number of elements in an object. - _.size = function(obj) { - if (obj == null) return 0; - return (obj.length === +obj.length) ? obj.length : _.keys(obj).length; - }; - - // Array Functions - // --------------- - - // Get the first element of an array. Passing **n** will return the first N - // values in the array. Aliased as `head` and `take`. The **guard** check - // allows it to work with `_.map`. - _.first = _.head = _.take = function(array, n, guard) { - if (array == null) return void 0; - return (n != null) && !guard ? slice.call(array, 0, n) : array[0]; - }; - - // Returns everything but the last entry of the array. Especially useful on - // the arguments object. Passing **n** will return all the values in - // the array, excluding the last N. The **guard** check allows it to work with - // `_.map`. - _.initial = function(array, n, guard) { - return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n)); - }; - - // Get the last element of an array. Passing **n** will return the last N - // values in the array. The **guard** check allows it to work with `_.map`. - _.last = function(array, n, guard) { - if (array == null) return void 0; - if ((n != null) && !guard) { - return slice.call(array, Math.max(array.length - n, 0)); - } else { - return array[array.length - 1]; - } - }; - - // Returns everything but the first entry of the array. Aliased as `tail` and `drop`. - // Especially useful on the arguments object. Passing an **n** will return - // the rest N values in the array. The **guard** - // check allows it to work with `_.map`. - _.rest = _.tail = _.drop = function(array, n, guard) { - return slice.call(array, (n == null) || guard ? 1 : n); - }; - - // Trim out all falsy values from an array. - _.compact = function(array) { - return _.filter(array, _.identity); - }; - - // Internal implementation of a recursive `flatten` function. - var flatten = function(input, shallow, output) { - each(input, function(value) { - if (_.isArray(value)) { - shallow ? push.apply(output, value) : flatten(value, shallow, output); - } else { - output.push(value); - } - }); - return output; - }; - - // Return a completely flattened version of an array. - _.flatten = function(array, shallow) { - return flatten(array, shallow, []); - }; - - // Return a version of the array that does not contain the specified value(s). - _.without = function(array) { - return _.difference(array, slice.call(arguments, 1)); - }; - - // Produce a duplicate-free version of the array. If the array has already - // been sorted, you have the option of using a faster algorithm. - // Aliased as `unique`. - _.uniq = _.unique = function(array, isSorted, iterator, context) { - if (_.isFunction(isSorted)) { - context = iterator; - iterator = isSorted; - isSorted = false; - } - var initial = iterator ? _.map(array, iterator, context) : array; - var results = []; - var seen = []; - each(initial, function(value, index) { - if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) { - seen.push(value); - results.push(array[index]); - } - }); - return results; - }; - - // Produce an array that contains the union: each distinct element from all of - // the passed-in arrays. - _.union = function() { - return _.uniq(concat.apply(ArrayProto, arguments)); - }; - - // Produce an array that contains every item shared between all the - // passed-in arrays. - _.intersection = function(array) { - var rest = slice.call(arguments, 1); - return _.filter(_.uniq(array), function(item) { - return _.every(rest, function(other) { - return _.indexOf(other, item) >= 0; - }); - }); - }; - - // Take the difference between one array and a number of other arrays. - // Only the elements present in just the first array will remain. - _.difference = function(array) { - var rest = concat.apply(ArrayProto, slice.call(arguments, 1)); - return _.filter(array, function(value){ return !_.contains(rest, value); }); - }; - - // Zip together multiple lists into a single array -- elements that share - // an index go together. - _.zip = function() { - var args = slice.call(arguments); - var length = _.max(_.pluck(args, 'length')); - var results = new Array(length); - for (var i = 0; i < length; i++) { - results[i] = _.pluck(args, "" + i); - } - return results; - }; - - // Converts lists into objects. Pass either a single array of `[key, value]` - // pairs, or two parallel arrays of the same length -- one of keys, and one of - // the corresponding values. - _.object = function(list, values) { - if (list == null) return {}; - var result = {}; - for (var i = 0, l = list.length; i < l; i++) { - if (values) { - result[list[i]] = values[i]; - } else { - result[list[i][0]] = list[i][1]; - } - } - return result; - }; - - // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**), - // we need this function. Return the position of the first occurrence of an - // item in an array, or -1 if the item is not included in the array. - // Delegates to **ECMAScript 5**'s native `indexOf` if available. - // If the array is large and already in sort order, pass `true` - // for **isSorted** to use binary search. - _.indexOf = function(array, item, isSorted) { - if (array == null) return -1; - var i = 0, l = array.length; - if (isSorted) { - if (typeof isSorted == 'number') { - i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted); - } else { - i = _.sortedIndex(array, item); - return array[i] === item ? i : -1; - } - } - if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted); - for (; i < l; i++) if (array[i] === item) return i; - return -1; - }; - - // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available. - _.lastIndexOf = function(array, item, from) { - if (array == null) return -1; - var hasIndex = from != null; - if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) { - return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item); - } - var i = (hasIndex ? from : array.length); - while (i--) if (array[i] === item) return i; - return -1; - }; - - // Generate an integer Array containing an arithmetic progression. A port of - // the native Python `range()` function. See - // [the Python documentation](http://docs.python.org/library/functions.html#range). - _.range = function(start, stop, step) { - if (arguments.length <= 1) { - stop = start || 0; - start = 0; - } - step = arguments[2] || 1; - - var len = Math.max(Math.ceil((stop - start) / step), 0); - var idx = 0; - var range = new Array(len); - - while(idx < len) { - range[idx++] = start; - start += step; - } - - return range; - }; - - // Function (ahem) Functions - // ------------------ - - // Reusable constructor function for prototype setting. - var ctor = function(){}; - - // Create a function bound to a given object (assigning `this`, and arguments, - // optionally). Binding with arguments is also known as `curry`. - // Delegates to **ECMAScript 5**'s native `Function.bind` if available. - // We check for `func.bind` first, to fail fast when `func` is undefined. - _.bind = function(func, context) { - var args, bound; - if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); - if (!_.isFunction(func)) throw new TypeError; - args = slice.call(arguments, 2); - return bound = function() { - if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments))); - ctor.prototype = func.prototype; - var self = new ctor; - ctor.prototype = null; - var result = func.apply(self, args.concat(slice.call(arguments))); - if (Object(result) === result) return result; - return self; - }; - }; - - // Bind all of an object's methods to that object. Useful for ensuring that - // all callbacks defined on an object belong to it. - _.bindAll = function(obj) { - var funcs = slice.call(arguments, 1); - if (funcs.length == 0) funcs = _.functions(obj); - each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); }); - return obj; - }; - - // Memoize an expensive function by storing its results. - _.memoize = function(func, hasher) { - var memo = {}; - hasher || (hasher = _.identity); - return function() { - var key = hasher.apply(this, arguments); - return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments)); - }; - }; - - // Delays a function for the given number of milliseconds, and then calls - // it with the arguments supplied. - _.delay = function(func, wait) { - var args = slice.call(arguments, 2); - return setTimeout(function(){ return func.apply(null, args); }, wait); - }; - - // Defers a function, scheduling it to run after the current call stack has - // cleared. - _.defer = function(func) { - return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1))); - }; - - // Returns a function, that, when invoked, will only be triggered at most once - // during a given window of time. - _.throttle = function(func, wait) { - var context, args, timeout, result; - var previous = 0; - var later = function() { - previous = new Date; - timeout = null; - result = func.apply(context, args); - }; - return function() { - var now = new Date; - var remaining = wait - (now - previous); - context = this; - args = arguments; - if (remaining <= 0) { - clearTimeout(timeout); - timeout = null; - previous = now; - result = func.apply(context, args); - } else if (!timeout) { - timeout = setTimeout(later, remaining); - } - return result; - }; - }; - - // Returns a function, that, as long as it continues to be invoked, will not - // be triggered. The function will be called after it stops being called for - // N milliseconds. If `immediate` is passed, trigger the function on the - // leading edge, instead of the trailing. - _.debounce = function(func, wait, immediate) { - var timeout, result; - return function() { - var context = this, args = arguments; - var later = function() { - timeout = null; - if (!immediate) result = func.apply(context, args); - }; - var callNow = immediate && !timeout; - clearTimeout(timeout); - timeout = setTimeout(later, wait); - if (callNow) result = func.apply(context, args); - return result; - }; - }; - - // Returns a function that will be executed at most one time, no matter how - // often you call it. Useful for lazy initialization. - _.once = function(func) { - var ran = false, memo; - return function() { - if (ran) return memo; - ran = true; - memo = func.apply(this, arguments); - func = null; - return memo; - }; - }; - - // Returns the first function passed as an argument to the second, - // allowing you to adjust arguments, run code before and after, and - // conditionally execute the original function. - _.wrap = function(func, wrapper) { - return function() { - var args = [func]; - push.apply(args, arguments); - return wrapper.apply(this, args); - }; - }; - - // Returns a function that is the composition of a list of functions, each - // consuming the return value of the function that follows. - _.compose = function() { - var funcs = arguments; - return function() { - var args = arguments; - for (var i = funcs.length - 1; i >= 0; i--) { - args = [funcs[i].apply(this, args)]; - } - return args[0]; - }; - }; - - // Returns a function that will only be executed after being called N times. - _.after = function(times, func) { - if (times <= 0) return func(); - return function() { - if (--times < 1) { - return func.apply(this, arguments); - } - }; - }; - - // Object Functions - // ---------------- - - // Retrieve the names of an object's properties. - // Delegates to **ECMAScript 5**'s native `Object.keys` - _.keys = nativeKeys || function(obj) { - if (obj !== Object(obj)) throw new TypeError('Invalid object'); - var keys = []; - for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key; - return keys; - }; - - // Retrieve the values of an object's properties. - _.values = function(obj) { - var values = []; - for (var key in obj) if (_.has(obj, key)) values.push(obj[key]); - return values; - }; - - // Convert an object into a list of `[key, value]` pairs. - _.pairs = function(obj) { - var pairs = []; - for (var key in obj) if (_.has(obj, key)) pairs.push([key, obj[key]]); - return pairs; - }; - - // Invert the keys and values of an object. The values must be serializable. - _.invert = function(obj) { - var result = {}; - for (var key in obj) if (_.has(obj, key)) result[obj[key]] = key; - return result; - }; - - // Return a sorted list of the function names available on the object. - // Aliased as `methods` - _.functions = _.methods = function(obj) { - var names = []; - for (var key in obj) { - if (_.isFunction(obj[key])) names.push(key); - } - return names.sort(); - }; - - // Extend a given object with all the properties in passed-in object(s). - _.extend = function(obj) { - each(slice.call(arguments, 1), function(source) { - if (source) { - for (var prop in source) { - obj[prop] = source[prop]; - } - } - }); - return obj; - }; - - // Return a copy of the object only containing the whitelisted properties. - _.pick = function(obj) { - var copy = {}; - var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); - each(keys, function(key) { - if (key in obj) copy[key] = obj[key]; - }); - return copy; - }; - - // Return a copy of the object without the blacklisted properties. - _.omit = function(obj) { - var copy = {}; - var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); - for (var key in obj) { - if (!_.contains(keys, key)) copy[key] = obj[key]; - } - return copy; - }; - - // Fill in a given object with default properties. - _.defaults = function(obj) { - each(slice.call(arguments, 1), function(source) { - if (source) { - for (var prop in source) { - if (obj[prop] == null) obj[prop] = source[prop]; - } - } - }); - return obj; - }; - - // Create a (shallow-cloned) duplicate of an object. - _.clone = function(obj) { - if (!_.isObject(obj)) return obj; - return _.isArray(obj) ? obj.slice() : _.extend({}, obj); - }; - - // Invokes interceptor with the obj, and then returns obj. - // The primary purpose of this method is to "tap into" a method chain, in - // order to perform operations on intermediate results within the chain. - _.tap = function(obj, interceptor) { - interceptor(obj); - return obj; - }; - - // Internal recursive comparison function for `isEqual`. - var eq = function(a, b, aStack, bStack) { - // Identical objects are equal. `0 === -0`, but they aren't identical. - // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal. - if (a === b) return a !== 0 || 1 / a == 1 / b; - // A strict comparison is necessary because `null == undefined`. - if (a == null || b == null) return a === b; - // Unwrap any wrapped objects. - if (a instanceof _) a = a._wrapped; - if (b instanceof _) b = b._wrapped; - // Compare `[[Class]]` names. - var className = toString.call(a); - if (className != toString.call(b)) return false; - switch (className) { - // Strings, numbers, dates, and booleans are compared by value. - case '[object String]': - // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is - // equivalent to `new String("5")`. - return a == String(b); - case '[object Number]': - // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for - // other numeric values. - return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b); - case '[object Date]': - case '[object Boolean]': - // Coerce dates and booleans to numeric primitive values. Dates are compared by their - // millisecond representations. Note that invalid dates with millisecond representations - // of `NaN` are not equivalent. - return +a == +b; - // RegExps are compared by their source patterns and flags. - case '[object RegExp]': - return a.source == b.source && - a.global == b.global && - a.multiline == b.multiline && - a.ignoreCase == b.ignoreCase; - } - if (typeof a != 'object' || typeof b != 'object') return false; - // Assume equality for cyclic structures. The algorithm for detecting cyclic - // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. - var length = aStack.length; - while (length--) { - // Linear search. Performance is inversely proportional to the number of - // unique nested structures. - if (aStack[length] == a) return bStack[length] == b; - } - // Add the first object to the stack of traversed objects. - aStack.push(a); - bStack.push(b); - var size = 0, result = true; - // Recursively compare objects and arrays. - if (className == '[object Array]') { - // Compare array lengths to determine if a deep comparison is necessary. - size = a.length; - result = size == b.length; - if (result) { - // Deep compare the contents, ignoring non-numeric properties. - while (size--) { - if (!(result = eq(a[size], b[size], aStack, bStack))) break; - } - } - } else { - // Objects with different constructors are not equivalent, but `Object`s - // from different frames are. - var aCtor = a.constructor, bCtor = b.constructor; - if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) && - _.isFunction(bCtor) && (bCtor instanceof bCtor))) { - return false; - } - // Deep compare objects. - for (var key in a) { - if (_.has(a, key)) { - // Count the expected number of properties. - size++; - // Deep compare each member. - if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break; - } - } - // Ensure that both objects contain the same number of properties. - if (result) { - for (key in b) { - if (_.has(b, key) && !(size--)) break; - } - result = !size; - } - } - // Remove the first object from the stack of traversed objects. - aStack.pop(); - bStack.pop(); - return result; - }; - - // Perform a deep comparison to check if two objects are equal. - _.isEqual = function(a, b) { - return eq(a, b, [], []); - }; - - // Is a given array, string, or object empty? - // An "empty" object has no enumerable own-properties. - _.isEmpty = function(obj) { - if (obj == null) return true; - if (_.isArray(obj) || _.isString(obj)) return obj.length === 0; - for (var key in obj) if (_.has(obj, key)) return false; - return true; - }; - - // Is a given value a DOM element? - _.isElement = function(obj) { - return !!(obj && obj.nodeType === 1); - }; - - // Is a given value an array? - // Delegates to ECMA5's native Array.isArray - _.isArray = nativeIsArray || function(obj) { - return toString.call(obj) == '[object Array]'; - }; - - // Is a given variable an object? - _.isObject = function(obj) { - return obj === Object(obj); - }; - - // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp. - each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) { - _['is' + name] = function(obj) { - return toString.call(obj) == '[object ' + name + ']'; - }; - }); - - // Define a fallback version of the method in browsers (ahem, IE), where - // there isn't any inspectable "Arguments" type. - if (!_.isArguments(arguments)) { - _.isArguments = function(obj) { - return !!(obj && _.has(obj, 'callee')); - }; - } - - // Optimize `isFunction` if appropriate. - if (typeof (/./) !== 'function') { - _.isFunction = function(obj) { - return typeof obj === 'function'; - }; - } - - // Is a given object a finite number? - _.isFinite = function(obj) { - return isFinite(obj) && !isNaN(parseFloat(obj)); - }; - - // Is the given value `NaN`? (NaN is the only number which does not equal itself). - _.isNaN = function(obj) { - return _.isNumber(obj) && obj != +obj; - }; - - // Is a given value a boolean? - _.isBoolean = function(obj) { - return obj === true || obj === false || toString.call(obj) == '[object Boolean]'; - }; - - // Is a given value equal to null? - _.isNull = function(obj) { - return obj === null; - }; - - // Is a given variable undefined? - _.isUndefined = function(obj) { - return obj === void 0; - }; - - // Shortcut function for checking if an object has a given property directly - // on itself (in other words, not on a prototype). - _.has = function(obj, key) { - return hasOwnProperty.call(obj, key); - }; - - // Utility Functions - // ----------------- - - // Run Underscore.js in *noConflict* mode, returning the `_` variable to its - // previous owner. Returns a reference to the Underscore object. - _.noConflict = function() { - root._ = previousUnderscore; - return this; - }; - - // Keep the identity function around for default iterators. - _.identity = function(value) { - return value; - }; - - // Run a function **n** times. - _.times = function(n, iterator, context) { - var accum = Array(n); - for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i); - return accum; - }; - - // Return a random integer between min and max (inclusive). - _.random = function(min, max) { - if (max == null) { - max = min; - min = 0; - } - return min + (0 | Math.random() * (max - min + 1)); - }; - - // List of HTML entities for escaping. - var entityMap = { - escape: { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''', - '/': '/' - } - }; - entityMap.unescape = _.invert(entityMap.escape); - - // Regexes containing the keys and values listed immediately above. - var entityRegexes = { - escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'), - unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g') - }; - - // Functions for escaping and unescaping strings to/from HTML interpolation. - _.each(['escape', 'unescape'], function(method) { - _[method] = function(string) { - if (string == null) return ''; - return ('' + string).replace(entityRegexes[method], function(match) { - return entityMap[method][match]; - }); - }; - }); - - // If the value of the named property is a function then invoke it; - // otherwise, return it. - _.result = function(object, property) { - if (object == null) return null; - var value = object[property]; - return _.isFunction(value) ? value.call(object) : value; - }; - - // Add your own custom functions to the Underscore object. - _.mixin = function(obj) { - each(_.functions(obj), function(name){ - var func = _[name] = obj[name]; - _.prototype[name] = function() { - var args = [this._wrapped]; - push.apply(args, arguments); - return result.call(this, func.apply(_, args)); - }; - }); - }; - - // Generate a unique integer id (unique within the entire client session). - // Useful for temporary DOM ids. - var idCounter = 0; - _.uniqueId = function(prefix) { - var id = '' + ++idCounter; - return prefix ? prefix + id : id; - }; - - // By default, Underscore uses ERB-style template delimiters, change the - // following template settings to use alternative delimiters. - _.templateSettings = { - evaluate : /<%([\s\S]+?)%>/g, - interpolate : /<%=([\s\S]+?)%>/g, - escape : /<%-([\s\S]+?)%>/g - }; - - // When customizing `templateSettings`, if you don't want to define an - // interpolation, evaluation or escaping regex, we need one that is - // guaranteed not to match. - var noMatch = /(.)^/; - - // Certain characters need to be escaped so that they can be put into a - // string literal. - var escapes = { - "'": "'", - '\\': '\\', - '\r': 'r', - '\n': 'n', - '\t': 't', - '\u2028': 'u2028', - '\u2029': 'u2029' - }; - - var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g; - - // JavaScript micro-templating, similar to John Resig's implementation. - // Underscore templating handles arbitrary delimiters, preserves whitespace, - // and correctly escapes quotes within interpolated code. - _.template = function(text, data, settings) { - settings = _.defaults({}, settings, _.templateSettings); - - // Combine delimiters into one regular expression via alternation. - var matcher = new RegExp([ - (settings.escape || noMatch).source, - (settings.interpolate || noMatch).source, - (settings.evaluate || noMatch).source - ].join('|') + '|$', 'g'); - - // Compile the template source, escaping string literals appropriately. - var index = 0; - var source = "__p+='"; - text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { - source += text.slice(index, offset) - .replace(escaper, function(match) { return '\\' + escapes[match]; }); - - if (escape) { - source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; - } - if (interpolate) { - source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; - } - if (evaluate) { - source += "';\n" + evaluate + "\n__p+='"; - } - index = offset + match.length; - return match; - }); - source += "';\n"; - - // If a variable is not specified, place data values in local scope. - if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; - - source = "var __t,__p='',__j=Array.prototype.join," + - "print=function(){__p+=__j.call(arguments,'');};\n" + - source + "return __p;\n"; - - try { - var render = new Function(settings.variable || 'obj', '_', source); - } catch (e) { - e.source = source; - throw e; - } - - if (data) return render(data, _); - var template = function(data) { - return render.call(this, data, _); - }; - - // Provide the compiled function source as a convenience for precompilation. - template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}'; - - return template; - }; - - // Add a "chain" function, which will delegate to the wrapper. - _.chain = function(obj) { - return _(obj).chain(); - }; - - // OOP - // --------------- - // If Underscore is called as a function, it returns a wrapped object that - // can be used OO-style. This wrapper holds altered versions of all the - // underscore functions. Wrapped objects may be chained. - - // Helper function to continue chaining intermediate results. - var result = function(obj) { - return this._chain ? _(obj).chain() : obj; - }; - - // Add all of the Underscore functions to the wrapper object. - _.mixin(_); - - // Add all mutator Array functions to the wrapper. - each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { - var method = ArrayProto[name]; - _.prototype[name] = function() { - var obj = this._wrapped; - method.apply(obj, arguments); - if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0]; - return result.call(this, obj); - }; - }); - - // Add all accessor Array functions to the wrapper. - each(['concat', 'join', 'slice'], function(name) { - var method = ArrayProto[name]; - _.prototype[name] = function() { - return result.call(this, method.apply(this._wrapped, arguments)); - }; - }); - - _.extend(_.prototype, { - - // Start chaining a wrapped Underscore object. - chain: function() { - this._chain = true; - return this; - }, - - // Extracts the result from a wrapped and chained object. - value: function() { - return this._wrapped; - } - - }); - -}).call(this);

        PLuF)Y~(CIqK`4!9vVOhzRwTBSd*;`U2(p%saOb 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 KG#*NqH10F8GP z4PQXRYc`Htvvp(|$=s1-uctmcHryi|KJ#ZtOLWz9(=~U+S+pZIi~&}yd2QsH_eZMn zpr=AT`K3Q&{e^VW>W=6LN?(Wfo?qrg6dK{(EQTnvHs;w2#TpspN(w&2!e8NcD*2$T zeETWi=(--kG%Hv6G%v1ZlvzhBIbgGb)#_|;Vbn59#UaVU5w%IPU!7y|T}_IXD56>$ ziKbQr^>YY-Gi&%oJej|I*vBM}t6RgàRmOG6=P~aF&brA>$n|~AWV?-s;bS016 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 z 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 z%0D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