summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorisaacs <i@izs.me>2012-09-12 15:13:07 -0700
committerisaacs <i@izs.me>2012-09-12 15:13:07 -0700
commitbb207c2827cd758dd273adb28badeb9ec2586939 (patch)
tree0ce4270a6a138345b41ce738eb8e517c7b890d7b
parentd3fa0dcb89d986f267b2394d347ef30f6a03dc56 (diff)
parent451ff1540ab536237e8d751d241d7fc3391a4087 (diff)
downloadnode-bb207c2827cd758dd273adb28badeb9ec2586939.tar.gz
Merge remote-tracking branch 'ry/v0.8' into master
Conflicts: ChangeLog src/node_version.h test/simple/test-util-inspect.js
-rw-r--r--ChangeLog47
-rwxr-xr-xconfigure8
-rw-r--r--deps/npm/doc/cli/faq.md15
-rw-r--r--deps/npm/doc/cli/index.md2
-rw-r--r--deps/npm/doc/cli/ls.md (renamed from deps/npm/doc/cli/list.md)0
-rw-r--r--deps/npm/html/api/bin.html2
-rw-r--r--deps/npm/html/api/bugs.html2
-rw-r--r--deps/npm/html/api/commands.html2
-rw-r--r--deps/npm/html/api/config.html2
-rw-r--r--deps/npm/html/api/deprecate.html2
-rw-r--r--deps/npm/html/api/docs.html2
-rw-r--r--deps/npm/html/api/edit.html2
-rw-r--r--deps/npm/html/api/explore.html2
-rw-r--r--deps/npm/html/api/help-search.html2
-rw-r--r--deps/npm/html/api/init.html2
-rw-r--r--deps/npm/html/api/install.html2
-rw-r--r--deps/npm/html/api/link.html2
-rw-r--r--deps/npm/html/api/load.html2
-rw-r--r--deps/npm/html/api/ls.html2
-rw-r--r--deps/npm/html/api/npm.html4
-rw-r--r--deps/npm/html/api/outdated.html2
-rw-r--r--deps/npm/html/api/owner.html2
-rw-r--r--deps/npm/html/api/pack.html2
-rw-r--r--deps/npm/html/api/prefix.html2
-rw-r--r--deps/npm/html/api/prune.html2
-rw-r--r--deps/npm/html/api/publish.html2
-rw-r--r--deps/npm/html/api/rebuild.html2
-rw-r--r--deps/npm/html/api/restart.html2
-rw-r--r--deps/npm/html/api/root.html2
-rw-r--r--deps/npm/html/api/run-script.html2
-rw-r--r--deps/npm/html/api/search.html2
-rw-r--r--deps/npm/html/api/shrinkwrap.html2
-rw-r--r--deps/npm/html/api/start.html2
-rw-r--r--deps/npm/html/api/stop.html2
-rw-r--r--deps/npm/html/api/submodule.html2
-rw-r--r--deps/npm/html/api/tag.html2
-rw-r--r--deps/npm/html/api/test.html2
-rw-r--r--deps/npm/html/api/uninstall.html2
-rw-r--r--deps/npm/html/api/unpublish.html2
-rw-r--r--deps/npm/html/api/update.html2
-rw-r--r--deps/npm/html/api/version.html2
-rw-r--r--deps/npm/html/api/view.html2
-rw-r--r--deps/npm/html/api/whoami.html2
-rw-r--r--deps/npm/html/doc/README.html2
-rw-r--r--deps/npm/html/doc/adduser.html2
-rw-r--r--deps/npm/html/doc/bin.html2
-rw-r--r--deps/npm/html/doc/bugs.html2
-rw-r--r--deps/npm/html/doc/build.html2
-rw-r--r--deps/npm/html/doc/bundle.html2
-rw-r--r--deps/npm/html/doc/cache.html2
-rw-r--r--deps/npm/html/doc/changelog.html2
-rw-r--r--deps/npm/html/doc/coding-style.html2
-rw-r--r--deps/npm/html/doc/completion.html2
-rw-r--r--deps/npm/html/doc/config.html2
-rw-r--r--deps/npm/html/doc/dedupe.html2
-rw-r--r--deps/npm/html/doc/deprecate.html2
-rw-r--r--deps/npm/html/doc/developers.html2
-rw-r--r--deps/npm/html/doc/disputes.html2
-rw-r--r--deps/npm/html/doc/docs.html2
-rw-r--r--deps/npm/html/doc/edit.html2
-rw-r--r--deps/npm/html/doc/explore.html2
-rw-r--r--deps/npm/html/doc/faq.html17
-rw-r--r--deps/npm/html/doc/folders.html2
-rw-r--r--deps/npm/html/doc/help-search.html2
-rw-r--r--deps/npm/html/doc/help.html2
-rw-r--r--deps/npm/html/doc/index.html4
-rw-r--r--deps/npm/html/doc/init.html2
-rw-r--r--deps/npm/html/doc/install.html2
-rw-r--r--deps/npm/html/doc/json.html2
-rw-r--r--deps/npm/html/doc/link.html2
-rw-r--r--deps/npm/html/doc/ls.html99
-rw-r--r--deps/npm/html/doc/npm.html4
-rw-r--r--deps/npm/html/doc/outdated.html2
-rw-r--r--deps/npm/html/doc/owner.html2
-rw-r--r--deps/npm/html/doc/pack.html2
-rw-r--r--deps/npm/html/doc/prefix.html2
-rw-r--r--deps/npm/html/doc/prune.html2
-rw-r--r--deps/npm/html/doc/publish.html2
-rw-r--r--deps/npm/html/doc/rebuild.html2
-rw-r--r--deps/npm/html/doc/registry.html2
-rw-r--r--deps/npm/html/doc/removing-npm.html2
-rw-r--r--deps/npm/html/doc/restart.html2
-rw-r--r--deps/npm/html/doc/root.html2
-rw-r--r--deps/npm/html/doc/run-script.html2
-rw-r--r--deps/npm/html/doc/scripts.html2
-rw-r--r--deps/npm/html/doc/search.html2
-rw-r--r--deps/npm/html/doc/semver.html2
-rw-r--r--deps/npm/html/doc/shrinkwrap.html2
-rw-r--r--deps/npm/html/doc/star.html2
-rw-r--r--deps/npm/html/doc/start.html2
-rw-r--r--deps/npm/html/doc/stop.html2
-rw-r--r--deps/npm/html/doc/submodule.html2
-rw-r--r--deps/npm/html/doc/tag.html2
-rw-r--r--deps/npm/html/doc/test.html2
-rw-r--r--deps/npm/html/doc/uninstall.html2
-rw-r--r--deps/npm/html/doc/unpublish.html2
-rw-r--r--deps/npm/html/doc/update.html2
-rw-r--r--deps/npm/html/doc/version.html2
-rw-r--r--deps/npm/html/doc/view.html2
-rw-r--r--deps/npm/html/doc/whoami.html2
-rw-r--r--deps/npm/html/static/style.css (renamed from deps/npm/html/style.css)0
-rw-r--r--deps/npm/html/static/webfonts/23242D_3_0.eot (renamed from deps/npm/html/webfonts/23242D_3_0.eot)bin9662 -> 9662 bytes
-rw-r--r--deps/npm/html/static/webfonts/23242D_3_0.ttf (renamed from deps/npm/html/webfonts/23242D_3_0.ttf)bin9356 -> 9356 bytes
-rw-r--r--deps/npm/html/static/webfonts/23242D_3_0.woff (renamed from deps/npm/html/webfonts/23242D_3_0.woff)bin4373 -> 4373 bytes
-rw-r--r--deps/npm/lib/ls.js3
-rw-r--r--deps/npm/lib/npm.js2
-rw-r--r--deps/npm/lib/search.js2
-rw-r--r--deps/npm/lib/utils/lifecycle.js2
-rw-r--r--deps/npm/man/man1/README.12
-rw-r--r--deps/npm/man/man1/adduser.12
-rw-r--r--deps/npm/man/man1/bin.12
-rw-r--r--deps/npm/man/man1/bugs.12
-rw-r--r--deps/npm/man/man1/build.12
-rw-r--r--deps/npm/man/man1/bundle.12
-rw-r--r--deps/npm/man/man1/cache.12
-rw-r--r--deps/npm/man/man1/changelog.12
-rw-r--r--deps/npm/man/man1/coding-style.12
-rw-r--r--deps/npm/man/man1/completion.12
-rw-r--r--deps/npm/man/man1/config.12
-rw-r--r--deps/npm/man/man1/dedupe.12
-rw-r--r--deps/npm/man/man1/deprecate.12
-rw-r--r--deps/npm/man/man1/developers.12
-rw-r--r--deps/npm/man/man1/disputes.12
-rw-r--r--deps/npm/man/man1/docs.12
-rw-r--r--deps/npm/man/man1/edit.12
-rw-r--r--deps/npm/man/man1/explore.12
-rw-r--r--deps/npm/man/man1/faq.114
-rw-r--r--deps/npm/man/man1/folders.12
-rw-r--r--deps/npm/man/man1/help-search.12
-rw-r--r--deps/npm/man/man1/help.12
-rw-r--r--deps/npm/man/man1/index.14
-rw-r--r--deps/npm/man/man1/init.12
-rw-r--r--deps/npm/man/man1/install.12
-rw-r--r--deps/npm/man/man1/json.12
-rw-r--r--deps/npm/man/man1/link.12
-rw-r--r--deps/npm/man/man1/ls.144
-rw-r--r--deps/npm/man/man1/npm.14
-rw-r--r--deps/npm/man/man1/outdated.12
-rw-r--r--deps/npm/man/man1/owner.12
-rw-r--r--deps/npm/man/man1/pack.12
-rw-r--r--deps/npm/man/man1/prefix.12
-rw-r--r--deps/npm/man/man1/prune.12
-rw-r--r--deps/npm/man/man1/publish.12
-rw-r--r--deps/npm/man/man1/rebuild.12
-rw-r--r--deps/npm/man/man1/registry.12
-rw-r--r--deps/npm/man/man1/removing-npm.12
-rw-r--r--deps/npm/man/man1/restart.12
-rw-r--r--deps/npm/man/man1/root.12
-rw-r--r--deps/npm/man/man1/run-script.12
-rw-r--r--deps/npm/man/man1/scripts.12
-rw-r--r--deps/npm/man/man1/search.12
-rw-r--r--deps/npm/man/man1/semver.12
-rw-r--r--deps/npm/man/man1/shrinkwrap.12
-rw-r--r--deps/npm/man/man1/star.12
-rw-r--r--deps/npm/man/man1/start.12
-rw-r--r--deps/npm/man/man1/stop.12
-rw-r--r--deps/npm/man/man1/submodule.12
-rw-r--r--deps/npm/man/man1/tag.12
-rw-r--r--deps/npm/man/man1/test.12
-rw-r--r--deps/npm/man/man1/uninstall.12
-rw-r--r--deps/npm/man/man1/unpublish.12
-rw-r--r--deps/npm/man/man1/update.12
-rw-r--r--deps/npm/man/man1/version.12
-rw-r--r--deps/npm/man/man1/view.12
-rw-r--r--deps/npm/man/man1/whoami.12
-rw-r--r--deps/npm/man/man3/bin.32
-rw-r--r--deps/npm/man/man3/bugs.32
-rw-r--r--deps/npm/man/man3/commands.32
-rw-r--r--deps/npm/man/man3/config.32
-rw-r--r--deps/npm/man/man3/deprecate.32
-rw-r--r--deps/npm/man/man3/docs.32
-rw-r--r--deps/npm/man/man3/edit.32
-rw-r--r--deps/npm/man/man3/explore.32
-rw-r--r--deps/npm/man/man3/help-search.32
-rw-r--r--deps/npm/man/man3/init.32
-rw-r--r--deps/npm/man/man3/install.32
-rw-r--r--deps/npm/man/man3/link.32
-rw-r--r--deps/npm/man/man3/load.32
-rw-r--r--deps/npm/man/man3/ls.32
-rw-r--r--deps/npm/man/man3/npm.34
-rw-r--r--deps/npm/man/man3/outdated.32
-rw-r--r--deps/npm/man/man3/owner.32
-rw-r--r--deps/npm/man/man3/pack.32
-rw-r--r--deps/npm/man/man3/prefix.32
-rw-r--r--deps/npm/man/man3/prune.32
-rw-r--r--deps/npm/man/man3/publish.32
-rw-r--r--deps/npm/man/man3/rebuild.32
-rw-r--r--deps/npm/man/man3/restart.32
-rw-r--r--deps/npm/man/man3/root.32
-rw-r--r--deps/npm/man/man3/run-script.32
-rw-r--r--deps/npm/man/man3/search.32
-rw-r--r--deps/npm/man/man3/shrinkwrap.32
-rw-r--r--deps/npm/man/man3/start.32
-rw-r--r--deps/npm/man/man3/stop.32
-rw-r--r--deps/npm/man/man3/submodule.32
-rw-r--r--deps/npm/man/man3/tag.32
-rw-r--r--deps/npm/man/man3/test.32
-rw-r--r--deps/npm/man/man3/uninstall.32
-rw-r--r--deps/npm/man/man3/unpublish.32
-rw-r--r--deps/npm/man/man3/update.32
-rw-r--r--deps/npm/man/man3/version.32
-rw-r--r--deps/npm/man/man3/view.32
-rw-r--r--deps/npm/man/man3/whoami.32
-rw-r--r--deps/npm/node_modules/fstream-npm/fstream-npm.js1
-rw-r--r--deps/npm/node_modules/fstream-npm/package.json4
-rw-r--r--deps/npm/node_modules/fstream/examples/filter-pipe.js131
-rw-r--r--deps/npm/node_modules/fstream/examples/pipe.js115
-rw-r--r--deps/npm/node_modules/fstream/examples/reader.js54
-rw-r--r--deps/npm/node_modules/fstream/examples/symlink-write.js24
-rw-r--r--deps/npm/node_modules/fstream/lib/abstract.js4
-rw-r--r--deps/npm/node_modules/fstream/lib/dir-reader.js1
-rw-r--r--deps/npm/node_modules/fstream/package.json17
-rw-r--r--deps/npm/node_modules/lru-cache/AUTHORS1
-rw-r--r--deps/npm/node_modules/lru-cache/lib/lru-cache.js4
-rw-r--r--deps/npm/node_modules/lru-cache/package.json13
-rw-r--r--deps/npm/node_modules/node-gyp/lib/configure.js16
-rw-r--r--deps/npm/node_modules/node-gyp/package.json4
-rw-r--r--deps/npm/node_modules/npm-registry-client/lib/request.js8
-rw-r--r--deps/npm/node_modules/npm-registry-client/package.json6
-rw-r--r--deps/npm/node_modules/npmconf/config-defs.js82
-rwxr-xr-x[-rw-r--r--]deps/npm/node_modules/npmconf/node_modules/config-chain/index.js2
-rw-r--r--deps/npm/node_modules/npmconf/node_modules/config-chain/package.json7
-rw-r--r--deps/npm/node_modules/npmconf/npmconf.js6
-rw-r--r--deps/npm/node_modules/npmconf/package.json7
-rw-r--r--deps/npm/node_modules/npmconf/test/basic.js3
-rw-r--r--deps/npm/node_modules/read-package-json/package.json4
-rw-r--r--deps/npm/node_modules/read-package-json/read-json.js7
-rw-r--r--deps/npm/package.json2
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/AUTHORS9
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/LICENSE23
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/README.md213
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/big-not-pretty.xml8002
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/example.js41
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/get-products.js58
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/hello-world.js4
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/not-pretty.xml8
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/pretty-print.js74
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/shopping.xml2
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/strict.dtd870
-rwxr-xr-xdeps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/switch-bench.js45
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/test.html15
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/test.xml1254
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/lib/sax.js1006
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/package.json75
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/buffer-overrun.js25
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/cdata-chunked.js11
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/cdata-end-split.js15
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/cdata-fake-end.js28
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/cdata-multiple.js15
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/cdata.js10
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/index.js86
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/issue-23.js43
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/issue-30.js24
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/issue-35.js15
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/issue-47.js13
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/issue-49.js31
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/parser-position.js28
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/script.js12
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/self-closing-child-strict.js40
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/self-closing-child.js40
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/self-closing-tag.js25
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/stray-ending.js17
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/trailing-non-whitespace.js17
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/unquoted.js17
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-issue-41.js67
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-rebinding.js59
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-strict.js71
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-unbound.js15
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js35
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-xml-default-prefix.js20
-rw-r--r--deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-xml-default-redefine.js40
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/.travis.yml3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/LICENSE63
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/README.markdown173
-rwxr-xr-xdeps/npm/test/packages/npm-test-platform/node_modules/browserify/bin/cmd.js162
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/__browserify_process.js48
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/assert.js303
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/buffer.js1130
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/buffer_ieee754.js84
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/events.js171
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/fs.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/https.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/net.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/path.js134
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/querystring.js250
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/stream.js119
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/sys.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/tls.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/tty.js2
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/url.js604
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/util.js312
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/doc/methods.markdown177
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/doc/recipes.markdown62
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/browserify.js368
-rwxr-xr-xdeps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/build.sh3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/index.html9
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/js/bar.js3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/js/entry.js5
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/js/foo.js5
-rwxr-xr-xdeps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/server.js9
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-middleware/index.html9
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-middleware/js/bar.js3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-middleware/js/entry.js5
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-middleware/js/foo.js5
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-middleware/server.js11
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/using-http/bundle.js813
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/using-http/entry.js25
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/using-http/index.html9
-rwxr-xr-xdeps/npm/test/packages/npm-test-platform/node_modules/browserify/example/using-http/server.js28
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/index.js255
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/lib/wrap.js527
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/lib/wrappers.js10
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/.npmignore11
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/CNAME1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/LICENSE22
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/README51
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/Rakefile78
-rwxr-xr-xdeps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/bin/cake7
-rwxr-xr-xdeps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/bin/coffee7
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/extras/jsl.conf44
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/browser.js92
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/cake.js111
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/coffee-script.js167
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/command.js500
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/grammar.js606
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/helpers.js77
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/index.js11
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/lexer.js788
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/nodes.js2986
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/optparse.js138
-rwxr-xr-xdeps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/parser.js683
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/repl.js261
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/rewriter.js349
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/scope.js146
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/package.json47
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/README.markdown45
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/example/base.js3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/example/dir.js3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/index.js29
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/package.json45
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/test/dirs.js66
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/example/bundle.js637
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/example/index.html12
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/example/test.js4
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/index.js68
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/package.json28
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/readme.markdown14
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/rng.js37
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/sha.js210
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/test/simple.js25
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/.travis.yml4
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/README.markdown55
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/example/cache.js5
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/index.js45
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/.gitignore.orig2
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/.gitignore.rej5
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/.npmignore2
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/.travis.yml4
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/LICENSE21
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/README.markdown61
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/examples/pow.js6
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/examples/pow.js.orig6
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/examples/pow.js.rej19
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/index.js94
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/package.json32
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/chmod.js38
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/clobber.js37
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/mkdirp.js28
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/perm.js32
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/perm_sync.js39
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/race.js41
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/rel.js32
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/return.js25
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/return_sync.js24
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/root.js18
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/sync.js32
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/umask.js28
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/umask_sync.js32
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/package.json45
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/test/cache.js58
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/.travis.yml4
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/README.markdown64
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/example/strings.js6
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/example/strings_src.js3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/index.js56
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/.npmignore4
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/README.html981
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/README.org578
-rwxr-xr-xdeps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/bin/uglifyjs332
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/docstyle.css75
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/lib/consolidator.js2599
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/lib/object-ast.js75
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/lib/parse-js.js1346
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/lib/process.js2011
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/lib/squeeze-more.js73
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/package.json24
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/package.json~24
-rwxr-xr-xdeps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/beautify.js28
-rwxr-xr-xdeps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/testparser.js403
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/array1.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/array2.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/array3.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/array4.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/assignment.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/concatstring.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/const.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/empty-blocks.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/forstatement.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/if.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/ifreturn.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/ifreturn2.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue10.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue11.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue13.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue14.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue16.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue17.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue20.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue21.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue25.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue27.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue278.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue28.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue29.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue30.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue34.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue4.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue48.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue50.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue53.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue54.1.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue68.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue69.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue9.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/mangle.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/null_string.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/strict-equals.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/var.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/whitespace.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/with.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/array1.js3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/array2.js4
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/array3.js4
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/array4.js6
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/assignment.js20
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/concatstring.js3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/const.js5
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/empty-blocks.js4
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/forstatement.js10
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/if.js6
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/ifreturn.js9
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/ifreturn2.js16
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue10.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue11.js3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue13.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue14.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue16.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue17.js4
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue20.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue21.js6
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue25.js7
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue27.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue278.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue28.js3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue29.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue30.js3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue34.js3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue4.js3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue48.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue50.js9
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue53.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue54.1.js3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue68.js5
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue69.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue9.js4
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/mangle.js5
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/null_string.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/strict-equals.js3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/var.js3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/whitespace.js21
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/with.js2
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/scripts.js55
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/uglify-js.js18
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/package.json45
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/both.js11
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/chained.js9
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/files/both.js4
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/files/chained.js5
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/files/nested.js22
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/files/strings.js13
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/files/word.js13
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/nested.js9
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/strings.js9
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/word.js12
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/README.markdown128
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/get/index.html9
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/get/main.js14
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/get/server.js15
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/headers/index.html9
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/headers/main.js18
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/headers/server.js18
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/post/index.html9
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/post/main.js16
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/post/server.js22
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/streaming/index.html9
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/streaming/main.js16
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/streaming/server.js24
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/index.js59
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/lib/request.js91
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/lib/response.js99
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/package.json42
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/nub/README.markdown23
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/nub/index.js64
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/nub/package.json44
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/nub/test/by.js51
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/nub/test/nub.js46
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/.travis.yml4
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/LICENSE21
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/README.markdown487
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/bool.js10
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/boolean_double.js7
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/boolean_single.js7
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/default_hash.js8
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/default_singles.js7
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/divide.js8
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/line_count.js20
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/line_count_options.js29
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/line_count_wrap.js29
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/nonopt.js4
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/reflect.js2
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/short.js3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/string.js11
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/usage-options.js19
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/xup.js10
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/index.js475
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/.npmignore1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/README.markdown70
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/example/center.js10
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/example/meat.js3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/index.js76
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/package.json40
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/test/break.js30
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/test/idleness.txt63
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/test/wrap.js31
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/package.json46
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/test/_.js71
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/test/_/argv.js2
-rwxr-xr-xdeps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/test/_/bin.js3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/test/parse.js420
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/test/usage.js292
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/.travis.yml4
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/README.markdown47
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/index.js105
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/package.json43
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/core.js12
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/filter.js15
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/mock.js64
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver.js157
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/bar/node_modules/foo/index.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/baz/doom.js0
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/baz/package.json3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/baz/quux.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/biz/node_modules/grux/index.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/biz/node_modules/tiv/index.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/cup.coffee1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/foo.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/mug.coffee0
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/mug.js0
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/other_path/lib/other-lib.js0
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/other_path/root.js0
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/README.markdown103
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/example/run/bundle.js473
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/example/run/entry.js6
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/example/run/index.html9
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/example/run/server.js6
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/index.js85
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/package.json41
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/testling/run.js22
-rwxr-xr-xdeps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/testling/test.sh11
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/package.json69
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/alias.js55
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/backbone.js21
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/bin.js39
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/bundle.js32
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/cache.js28
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee.js39
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/bar.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/baz.coffee1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/entry.coffee1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/foo.coffee1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/index.coffee5
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/nested/nested.coffee2
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/dnode.js27
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/dollar.js19
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/dollar/dollar/index.js7
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/entry.js36
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/entry/main.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/entry/one.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/entry/two.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/error_code.js24
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/error_code/src.js2
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/export.js52
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/export/entry.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field.js64
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/miss.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-miss/browser.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-miss/main.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-miss/package.json4
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-object/browser.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-object/main.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-object/package.json6
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-string/browser.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-string/main.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-string/package.json4
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-sub/browser/a.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-sub/browser/b.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-sub/main.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-sub/package.json4
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/object.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/string.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/sub.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/jade.js35
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/maxlisteners.js8
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/middleware.js31
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/multi_entry.js20
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/multi_entry/a.js2
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/multi_entry/b.js2
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/multi_entry/c.js3
-rwxr-xr-xdeps/npm/test/packages/npm-test-platform/node_modules/browserify/test/multi_ignore.js23
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/node_modules/beep/index.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/retarget.js27
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/seq.js47
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/subdep.js26
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/subdep/index.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/subdep/package.json6
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/util.js48
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/watch.js91
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/watch/a.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap.js43
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/a.js2
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/c.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/node_modules/b/main.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/node_modules/b/package.json3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/node_modules/skipmetoo/index.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/skipme.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/x.js0
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/testling/README.markdown29
-rwxr-xr-xdeps/npm/test/packages/npm-test-platform/node_modules/browserify/testling/test.sh28
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/testling/tick.js9
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/testling/util.js24
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/alias.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/body.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/body_debug.js1
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/entry.js2
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/entry_debug.js2
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/package.js3
-rw-r--r--deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/prelude.js176
-rw-r--r--deps/npm/test/packages/npm-test-shrinkwrap/node_modules/npm-test-single-file/index.js10
-rw-r--r--deps/npm/test/packages/npm-test-shrinkwrap/node_modules/npm-test-single-file/package.json27
-rw-r--r--deps/v8/src/accessors.cc3
-rw-r--r--deps/v8/src/ic.cc11
-rw-r--r--deps/v8/src/platform-macos.cc22
-rw-r--r--deps/v8/src/v8natives.js4
-rw-r--r--deps/v8/src/version.cc2
-rw-r--r--deps/v8/src/x64/code-stubs-x64.cc12
-rw-r--r--deps/v8/test/cctest/test-api.cc265
-rw-r--r--deps/v8/test/mjsunit/new-function.js34
-rw-r--r--deps/v8/test/mjsunit/regress/regress-145201.js107
-rw-r--r--doc/api/cluster.markdown19
-rw-r--r--doc/api/fs.markdown13
-rw-r--r--doc/api/http.markdown11
-rw-r--r--doc/api/process.markdown2
-rw-r--r--doc/blog/release/node-version-0-7-9-unstable.md2
-rw-r--r--doc/blog/release/v0.8.9.md97
-rw-r--r--doc/blog/release/version-0-6-11-stable.md6
-rw-r--r--doc/blog/release/version-0-6-12-stable.md4
-rw-r--r--doc/blog/release/version-0-6-14-stable.md6
-rw-r--r--doc/blog/release/version-0-6-15-stable.md4
-rw-r--r--doc/blog/release/version-0-6-16-stable.md2
-rw-r--r--doc/blog/release/version-0-6-18-stable.md6
-rw-r--r--doc/blog/release/version-0-7-10-unstable.md2
-rw-r--r--doc/blog/release/version-0-7-11-unstable.md4
-rw-r--r--doc/blog/release/version-0-7-12.md2
-rw-r--r--doc/blog/release/version-0-7-5-unstable.md2
-rw-r--r--doc/blog/release/version-0-7-6-unstable.md4
-rw-r--r--doc/blog/release/version-0-7-7-unstable.md8
-rw-r--r--doc/blog/release/version-0-7-8-unstable.md4
-rw-r--r--doc/blog/vulnerability/http-server-security-vulnerability-please-upgrade-to-0-6-17.md8
-rw-r--r--doc/community/index.html10
-rw-r--r--doc/index.html4
-rw-r--r--lib/http.js9
-rw-r--r--lib/stream.js2
-rw-r--r--lib/util.js8
-rw-r--r--test/simple/test-fs-watch.js2
-rw-r--r--test/simple/test-http-1.0-keep-alive.js148
-rw-r--r--test/simple/test-http-client-timeout-agent.js89
-rw-r--r--test/simple/test-util-inspect.js7
-rw-r--r--tools/doc/node_modules/marked/lib/marked.js2
698 files changed, 44230 insertions, 375 deletions
diff --git a/ChangeLog b/ChangeLog
index 5d5b698d7..a26c22f2f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -86,7 +86,52 @@
* Fix #3521 Make process.env more like a regular Object (isaacs)
-2012.08.22, Version 0.8.8 (Stable)
+2012.09.11, Version 0.8.9 (Stable), b88c3902b241cf934e75443b934f2033ad3915b1
+
+* v8: upgrade to 3.11.10.22
+
+* GYP: upgrade to r1477
+
+* npm: Upgrade to 1.1.61
+
+* npm: Don't create world-writable files (isaacs)
+
+* windows: fix single-accept mode for shared server sockets (Bert Belder)
+
+* windows: fix uninitialized memory access in uv_update_time() (Bert Belder)
+
+* windows: don't throw when a signal handler is attached (Bert Belder)
+
+* unix: fix memory leak in udp (Ben Noordhuis)
+
+* unix: map errno ESPIPE (Ben Noordhuis)
+
+* unix, windows: fix memory corruption in fs-poll.c (Ben Noordhuis)
+
+* sunos: fix os.cpus() on x86_64 (Ben Noordhuis)
+
+* child process: fix processes with IPC channel don't emit 'close' (Bert Belder)
+
+* build: add a "--dest-os" option to force a gyp "flavor" (Nathan Rajlich)
+
+* build: set `process.platform` to "sunos" on SunOS (Nathan Rajlich)
+
+* build: fix `make -j` fails after `make clean` (Bearice Ren)
+
+* build: fix openssl configuration for "arm" builds (Nathan Rajlich)
+
+* tls: support unix domain socket/named pipe in tls.connect (Shigeki Ohtsu)
+
+* https: make https.get() accept a URL (koichik)
+
+* http: respect HTTP/1.0 TE header (Ben Noordhuis)
+
+* crypto, tls: Domainify setSNICallback, pbkdf2, randomBytes (Ben Noordhuis)
+
+* stream.pipe: Don't call destroy() unless it's a function (isaacs)
+
+
+2012.08.22, Version 0.8.8 (Stable), a299c97bbc701f4d460e91214d7bfe7a9589d361
* V8: upgrade to 3.11.10.19
diff --git a/configure b/configure
index 50f265b23..3a33cfa9f 100755
--- a/configure
+++ b/configure
@@ -154,6 +154,12 @@ parser.add_option("--dest-cpu",
dest="dest_cpu",
help="CPU architecture to build for. Valid values are: arm, ia32, x64")
+parser.add_option("--dest-os",
+ action="store",
+ dest="dest_os",
+ help="Operating system to build for. Valid values are: "
+ "win, mac, solaris, freebsd, linux")
+
parser.add_option("--no-ifaddrs",
action="store_true",
dest="no_ifaddrs",
@@ -472,6 +478,8 @@ if options.use_ninja:
gyp_args = ['-f', 'ninja']
elif os.name == 'nt':
gyp_args = ['-f', 'msvs', '-G', 'msvs_version=2010']
+elif options.dest_os:
+ gyp_args = ['-f', 'make-' + options.dest_os]
else:
gyp_args = ['-f', 'make']
diff --git a/deps/npm/doc/cli/faq.md b/deps/npm/doc/cli/faq.md
index 938338c22..7fd43e9a3 100644
--- a/deps/npm/doc/cli/faq.md
+++ b/deps/npm/doc/cli/faq.md
@@ -211,20 +211,29 @@ means that publishes go over HTTP by default in those versions of node.
## I forgot my password, and can't publish. How do I reset it?
-Go to <http://admin.npmjs.org/reset>.
+Go to <https://npmjs.org/forgot>.
## I get ECONNREFUSED a lot. What's up?
Either the registry is down, or node's DNS isn't able to reach out.
-To check if the registry is down, open up
-<http://registry.npmjs.org/>
+To check if the registry is down, open up <http://registry.npmjs.org/>
in a web browser. This will also tell you if you are just unable to
access the internet for some reason.
If the registry IS down, let me know by emailing or posting an issue.
We'll have someone kick it or something.
+## Why no namespaces?
+
+Please see this discussion: <https://github.com/isaacs/npm/issues/798>
+
+tl;dr - It doesn't actually make things better, and can make them worse.
+
+If you want to namespace your own packages, you may: simply use the
+`-` character to separate the names. npm is a mostly anarchic system.
+There is not sufficient need to impose namespace rules on everyone.
+
## Who does npm?
`npm view npm author`
diff --git a/deps/npm/doc/cli/index.md b/deps/npm/doc/cli/index.md
index b2ffd1317..f8fde254d 100644
--- a/deps/npm/doc/cli/index.md
+++ b/deps/npm/doc/cli/index.md
@@ -106,7 +106,7 @@ npm-index(1) -- Index of all npm documentation
Symlink a package folder
-## npm-list(1)
+## npm-ls(1)
List installed packages
diff --git a/deps/npm/doc/cli/list.md b/deps/npm/doc/cli/ls.md
index 3dd709b62..3dd709b62 100644
--- a/deps/npm/doc/cli/list.md
+++ b/deps/npm/doc/cli/ls.md
diff --git a/deps/npm/html/api/bin.html b/deps/npm/html/api/bin.html
index 1c24be26a..01c4871ba 100644
--- a/deps/npm/html/api/bin.html
+++ b/deps/npm/html/api/bin.html
@@ -19,7 +19,7 @@
<p>This function should not be used programmatically. Instead, just refer
to the <code>npm.bin</code> member.</p>
</div>
-<p id="footer">bin &mdash; npm@1.1.59</p>
+<p id="footer">bin &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/bugs.html b/deps/npm/html/api/bugs.html
index c1cee4abf..e5f18be4a 100644
--- a/deps/npm/html/api/bugs.html
+++ b/deps/npm/html/api/bugs.html
@@ -25,7 +25,7 @@ optional version number.</p>
<p>This command will launch a browser, so this command may not be the most
friendly for programmatic use.</p>
</div>
-<p id="footer">bugs &mdash; npm@1.1.59</p>
+<p id="footer">bugs &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/commands.html b/deps/npm/html/api/commands.html
index d9a6460ea..ce4feb961 100644
--- a/deps/npm/html/api/commands.html
+++ b/deps/npm/html/api/commands.html
@@ -28,7 +28,7 @@ usage, or <code>man 3 npm-&lt;command&gt;</code> for programmatic usage.</p>
<ul><li><a href="../doc/index.html">index(1)</a></li></ul>
</div>
-<p id="footer">commands &mdash; npm@1.1.59</p>
+<p id="footer">commands &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/config.html b/deps/npm/html/api/config.html
index 6ce481e82..b982101bf 100644
--- a/deps/npm/html/api/config.html
+++ b/deps/npm/html/api/config.html
@@ -33,7 +33,7 @@ functions instead.</p>
<ul><li><a href="../api/npm.html">npm(3)</a></li></ul>
</div>
-<p id="footer">config &mdash; npm@1.1.59</p>
+<p id="footer">config &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/deprecate.html b/deps/npm/html/api/deprecate.html
index 3c9ed3371..7b043c158 100644
--- a/deps/npm/html/api/deprecate.html
+++ b/deps/npm/html/api/deprecate.html
@@ -30,7 +30,7 @@ install the package.</p></li></ul>
<ul><li><a href="../api/publish.html">publish(3)</a></li><li><a href="../api/unpublish.html">unpublish(3)</a></li><li><a href="../doc/registry.html">registry(1)</a></li></ul>
</div>
-<p id="footer">deprecate &mdash; npm@1.1.59</p>
+<p id="footer">deprecate &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/docs.html b/deps/npm/html/api/docs.html
index 1c2f29c48..5fbefe1da 100644
--- a/deps/npm/html/api/docs.html
+++ b/deps/npm/html/api/docs.html
@@ -25,7 +25,7 @@ optional version number.</p>
<p>This command will launch a browser, so this command may not be the most
friendly for programmatic use.</p>
</div>
-<p id="footer">docs &mdash; npm@1.1.59</p>
+<p id="footer">docs &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/edit.html b/deps/npm/html/api/edit.html
index e00d1f2f5..da0808857 100644
--- a/deps/npm/html/api/edit.html
+++ b/deps/npm/html/api/edit.html
@@ -30,7 +30,7 @@ to open. The package can optionally have a version number attached.</p>
<p>Since this command opens an editor in a new process, be careful about where
and how this is used.</p>
</div>
-<p id="footer">edit &mdash; npm@1.1.59</p>
+<p id="footer">edit &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/explore.html b/deps/npm/html/api/explore.html
index 18b86b16d..9f6129967 100644
--- a/deps/npm/html/api/explore.html
+++ b/deps/npm/html/api/explore.html
@@ -24,7 +24,7 @@ sure to use <code>npm rebuild &lt;pkg&gt;</code> if you make any changes.</p>
<p>The first element in the &#39;args&#39; parameter must be a package name. After that is the optional command, which can be any number of strings. All of the strings will be combined into one, space-delimited command.</p>
</div>
-<p id="footer">explore &mdash; npm@1.1.59</p>
+<p id="footer">explore &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/help-search.html b/deps/npm/html/api/help-search.html
index d6fc3e5d7..44618260d 100644
--- a/deps/npm/html/api/help-search.html
+++ b/deps/npm/html/api/help-search.html
@@ -32,7 +32,7 @@ Name of the file that matched</li></ul>
<p>The silent parameter is not neccessary not used, but it may in the future.</p>
</div>
-<p id="footer">help-search &mdash; npm@1.1.59</p>
+<p id="footer">help-search &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/init.html b/deps/npm/html/api/init.html
index f26eeffe6..a7b2fc208 100644
--- a/deps/npm/html/api/init.html
+++ b/deps/npm/html/api/init.html
@@ -35,7 +35,7 @@ then go ahead and use this programmatically.</p>
<p><a href="../doc/json.html">json(1)</a></p>
</div>
-<p id="footer">init &mdash; npm@1.1.59</p>
+<p id="footer">init &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/install.html b/deps/npm/html/api/install.html
index 29179c0b3..f05d33ab4 100644
--- a/deps/npm/html/api/install.html
+++ b/deps/npm/html/api/install.html
@@ -25,7 +25,7 @@ the name of a package to be installed.</p>
<p>Finally, &#39;callback&#39; is a function that will be called when all packages have been
installed or when an error has been encountered.</p>
</div>
-<p id="footer">install &mdash; npm@1.1.59</p>
+<p id="footer">install &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/link.html b/deps/npm/html/api/link.html
index c992db10a..dc6169a6f 100644
--- a/deps/npm/html/api/link.html
+++ b/deps/npm/html/api/link.html
@@ -39,7 +39,7 @@ npm.commands.link(&#39;redis&#39;, cb) # link-install the package</code></pre>
<p>Now, any changes to the redis package will be reflected in
the package in the current working directory</p>
</div>
-<p id="footer">link &mdash; npm@1.1.59</p>
+<p id="footer">link &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/load.html b/deps/npm/html/api/load.html
index 325aa1336..978865203 100644
--- a/deps/npm/html/api/load.html
+++ b/deps/npm/html/api/load.html
@@ -32,7 +32,7 @@ config object.</p>
<p>For a list of all the available command-line configs, see <code>npm help config</code></p>
</div>
-<p id="footer">load &mdash; npm@1.1.59</p>
+<p id="footer">load &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/ls.html b/deps/npm/html/api/ls.html
index c777eaeda..564ac3f41 100644
--- a/deps/npm/html/api/ls.html
+++ b/deps/npm/html/api/ls.html
@@ -59,7 +59,7 @@ project.</p>
This means that if a submodule a same dependency as a parent module, then the
dependency will only be output once.</p>
</div>
-<p id="footer">ls &mdash; npm@1.1.59</p>
+<p id="footer">ls &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/npm.html b/deps/npm/html/api/npm.html
index d91485312..5c4c09c0e 100644
--- a/deps/npm/html/api/npm.html
+++ b/deps/npm/html/api/npm.html
@@ -24,7 +24,7 @@ npm.load(configObject, function (er, npm) {
<h2 id="VERSION">VERSION</h2>
-<p>1.1.59</p>
+<p>1.1.61</p>
<h2 id="DESCRIPTION">DESCRIPTION</h2>
@@ -91,7 +91,7 @@ method names. Use the <code>npm.deref</code> method to find the real name.</p>
<pre><code>var cmd = npm.deref(&quot;unp&quot;) // cmd === &quot;unpublish&quot;</code></pre>
</div>
-<p id="footer">npm &mdash; npm@1.1.59</p>
+<p id="footer">npm &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/outdated.html b/deps/npm/html/api/outdated.html
index 2d105e9f8..c6164e06a 100644
--- a/deps/npm/html/api/outdated.html
+++ b/deps/npm/html/api/outdated.html
@@ -19,7 +19,7 @@ currently outdated.</p>
<p>If the &#39;packages&#39; parameter is left out, npm will check all packages.</p>
</div>
-<p id="footer">outdated &mdash; npm@1.1.59</p>
+<p id="footer">outdated &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/owner.html b/deps/npm/html/api/owner.html
index 0f488c7f2..dd72ba461 100644
--- a/deps/npm/html/api/owner.html
+++ b/deps/npm/html/api/owner.html
@@ -34,7 +34,7 @@ that is not implemented at this time.</p>
<ul><li><a href="../api/publish.html">publish(3)</a></li><li><a href="../doc/registry.html">registry(1)</a></li></ul>
</div>
-<p id="footer">owner &mdash; npm@1.1.59</p>
+<p id="footer">owner &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/pack.html b/deps/npm/html/api/pack.html
index 62249e5ad..3141ae1b2 100644
--- a/deps/npm/html/api/pack.html
+++ b/deps/npm/html/api/pack.html
@@ -25,7 +25,7 @@ overwritten the second time.</p>
<p>If no arguments are supplied, then npm packs the current package folder.</p>
</div>
-<p id="footer">pack &mdash; npm@1.1.59</p>
+<p id="footer">pack &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/prefix.html b/deps/npm/html/api/prefix.html
index 8f77d72bc..b1f101bd7 100644
--- a/deps/npm/html/api/prefix.html
+++ b/deps/npm/html/api/prefix.html
@@ -21,7 +21,7 @@
<p>This function is not useful programmatically</p>
</div>
-<p id="footer">prefix &mdash; npm@1.1.59</p>
+<p id="footer">prefix &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/prune.html b/deps/npm/html/api/prune.html
index 4e54f1646..15b7a7e1a 100644
--- a/deps/npm/html/api/prune.html
+++ b/deps/npm/html/api/prune.html
@@ -23,7 +23,7 @@
<p>Extraneous packages are packages that are not listed on the parent
package&#39;s dependencies list.</p>
</div>
-<p id="footer">prune &mdash; npm@1.1.59</p>
+<p id="footer">prune &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/publish.html b/deps/npm/html/api/publish.html
index d5e109a4f..c3cd3a37c 100644
--- a/deps/npm/html/api/publish.html
+++ b/deps/npm/html/api/publish.html
@@ -32,7 +32,7 @@ the registry. Overwrites when the &quot;force&quot; environment variable is set
<ul><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/adduser.html">adduser(1)</a></li><li><a href="../api/owner.html">owner(3)</a></li></ul>
</div>
-<p id="footer">publish &mdash; npm@1.1.59</p>
+<p id="footer">publish &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/rebuild.html b/deps/npm/html/api/rebuild.html
index 6c346426c..8a102b921 100644
--- a/deps/npm/html/api/rebuild.html
+++ b/deps/npm/html/api/rebuild.html
@@ -22,7 +22,7 @@ the new binary. If no &#39;packages&#39; parameter is specify, every package wil
<p>See <code>npm help build</code></p>
</div>
-<p id="footer">rebuild &mdash; npm@1.1.59</p>
+<p id="footer">rebuild &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/restart.html b/deps/npm/html/api/restart.html
index 2346846fe..9ffdf3083 100644
--- a/deps/npm/html/api/restart.html
+++ b/deps/npm/html/api/restart.html
@@ -27,7 +27,7 @@ in the <code>packages</code> parameter.</p>
<ul><li><a href="../api/start.html">start(3)</a></li><li><a href="../api/stop.html">stop(3)</a></li></ul>
</div>
-<p id="footer">restart &mdash; npm@1.1.59</p>
+<p id="footer">restart &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/root.html b/deps/npm/html/api/root.html
index f57131dce..12a92a44c 100644
--- a/deps/npm/html/api/root.html
+++ b/deps/npm/html/api/root.html
@@ -21,7 +21,7 @@
<p>This function is not useful programmatically.</p>
</div>
-<p id="footer">root &mdash; npm@1.1.59</p>
+<p id="footer">root &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/run-script.html b/deps/npm/html/api/run-script.html
index 4fb0bc7f0..21c9475c6 100644
--- a/deps/npm/html/api/run-script.html
+++ b/deps/npm/html/api/run-script.html
@@ -29,7 +29,7 @@ assumed to be the command to run. All other elements are ignored.</p>
<ul><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../api/test.html">test(3)</a></li><li><a href="../api/start.html">start(3)</a></li><li><a href="../api/restart.html">restart(3)</a></li><li><a href="../api/stop.html">stop(3)</a></li></ul>
</div>
-<p id="footer">run-script &mdash; npm@1.1.59</p>
+<p id="footer">run-script &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/search.html b/deps/npm/html/api/search.html
index 6db1f60d4..6d4414385 100644
--- a/deps/npm/html/api/search.html
+++ b/deps/npm/html/api/search.html
@@ -32,7 +32,7 @@ excluded term (the &quot;searchexclude&quot; config). The search is case insensi
and doesn&#39;t try to read your mind (it doesn&#39;t do any verb tense matching or the
like).</p>
</div>
-<p id="footer">search &mdash; npm@1.1.59</p>
+<p id="footer">search &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/shrinkwrap.html b/deps/npm/html/api/shrinkwrap.html
index d1b675a2a..73e5e7fb4 100644
--- a/deps/npm/html/api/shrinkwrap.html
+++ b/deps/npm/html/api/shrinkwrap.html
@@ -26,7 +26,7 @@ but the shrinkwrap file will still be written.</p>
<p>Finally, &#39;callback&#39; is a function that will be called when the shrinkwrap has
been saved.</p>
</div>
-<p id="footer">shrinkwrap &mdash; npm@1.1.59</p>
+<p id="footer">shrinkwrap &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/start.html b/deps/npm/html/api/start.html
index f560b331f..3c2cbab95 100644
--- a/deps/npm/html/api/start.html
+++ b/deps/npm/html/api/start.html
@@ -19,7 +19,7 @@
<p>npm can run tests on multiple packages. Just specify multiple packages
in the <code>packages</code> parameter.</p>
</div>
-<p id="footer">start &mdash; npm@1.1.59</p>
+<p id="footer">start &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/stop.html b/deps/npm/html/api/stop.html
index 91378a72c..6127e56a1 100644
--- a/deps/npm/html/api/stop.html
+++ b/deps/npm/html/api/stop.html
@@ -19,7 +19,7 @@
<p>npm can run stop on multiple packages. Just specify multiple packages
in the <code>packages</code> parameter.</p>
</div>
-<p id="footer">stop &mdash; npm@1.1.59</p>
+<p id="footer">stop &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/submodule.html b/deps/npm/html/api/submodule.html
index 50c07cdf8..61d265435 100644
--- a/deps/npm/html/api/submodule.html
+++ b/deps/npm/html/api/submodule.html
@@ -33,7 +33,7 @@ dependencies into the submodule folder.</p>
<ul><li>npm help json</li><li>git help submodule</li></ul>
</div>
-<p id="footer">submodule &mdash; npm@1.1.59</p>
+<p id="footer">submodule &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/tag.html b/deps/npm/html/api/tag.html
index 7da49c043..e45783b2f 100644
--- a/deps/npm/html/api/tag.html
+++ b/deps/npm/html/api/tag.html
@@ -29,7 +29,7 @@ parameter is missing or falsey (empty), the default froom the config will be
used. For more information about how to set this config, check
<code>man 3 npm-config</code> for programmatic usage or <code>man npm-config</code> for cli usage.</p>
</div>
-<p id="footer">tag &mdash; npm@1.1.59</p>
+<p id="footer">tag &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/test.html b/deps/npm/html/api/test.html
index 1e23e2a3b..f226f16d0 100644
--- a/deps/npm/html/api/test.html
+++ b/deps/npm/html/api/test.html
@@ -22,7 +22,7 @@ true.</p>
<p>npm can run tests on multiple packages. Just specify multiple packages
in the <code>packages</code> parameter.</p>
</div>
-<p id="footer">test &mdash; npm@1.1.59</p>
+<p id="footer">test &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/uninstall.html b/deps/npm/html/api/uninstall.html
index 1bf715df0..19c42640c 100644
--- a/deps/npm/html/api/uninstall.html
+++ b/deps/npm/html/api/uninstall.html
@@ -22,7 +22,7 @@ the name of a package to be uninstalled.</p>
<p>Finally, &#39;callback&#39; is a function that will be called when all packages have been
uninstalled or when an error has been encountered.</p>
</div>
-<p id="footer">uninstall &mdash; npm@1.1.59</p>
+<p id="footer">uninstall &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/unpublish.html b/deps/npm/html/api/unpublish.html
index 66a9e957a..5d9857ea5 100644
--- a/deps/npm/html/api/unpublish.html
+++ b/deps/npm/html/api/unpublish.html
@@ -26,7 +26,7 @@ is what is meant.</p>
<p>If no version is specified, or if all versions are removed then
the root package entry is removed from the registry entirely.</p>
</div>
-<p id="footer">unpublish &mdash; npm@1.1.59</p>
+<p id="footer">unpublish &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/update.html b/deps/npm/html/api/update.html
index 688414292..5f255709f 100644
--- a/deps/npm/html/api/update.html
+++ b/deps/npm/html/api/update.html
@@ -18,7 +18,7 @@
<p>The &#39;packages&#39; argument is an array of packages to update. The &#39;callback&#39; parameter will be called when done or when an error occurs.</p>
</div>
-<p id="footer">update &mdash; npm@1.1.59</p>
+<p id="footer">update &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/version.html b/deps/npm/html/api/version.html
index 3c8f28f81..386e2fd95 100644
--- a/deps/npm/html/api/version.html
+++ b/deps/npm/html/api/version.html
@@ -24,7 +24,7 @@ fail if the repo is not clean.</p>
parameter. The difference, however, is this function will fail if it does
not have exactly one element. The only element should be a version number.</p>
</div>
-<p id="footer">version &mdash; npm@1.1.59</p>
+<p id="footer">version &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/view.html b/deps/npm/html/api/view.html
index 92da7f010..29ba0a685 100644
--- a/deps/npm/html/api/view.html
+++ b/deps/npm/html/api/view.html
@@ -99,7 +99,7 @@ the field name.</p>
<p>corresponding to the list of fields selected.</p>
</div>
-<p id="footer">view &mdash; npm@1.1.59</p>
+<p id="footer">view &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/api/whoami.html b/deps/npm/html/api/whoami.html
index 4f566c169..82aaeb88f 100644
--- a/deps/npm/html/api/whoami.html
+++ b/deps/npm/html/api/whoami.html
@@ -21,7 +21,7 @@
<p>This function is not useful programmatically</p>
</div>
-<p id="footer">whoami &mdash; npm@1.1.59</p>
+<p id="footer">whoami &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/README.html b/deps/npm/html/doc/README.html
index 66e75af91..cb27261a0 100644
--- a/deps/npm/html/doc/README.html
+++ b/deps/npm/html/doc/README.html
@@ -240,7 +240,7 @@ will no doubt tell you to put the output in a gist or email.</p>
<ul><li><a href="../doc/npm.html">npm(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/help.html">help(1)</a></li><li><a href="../doc/index.html">index(1)</a></li></ul>
</div>
-<p id="footer"><a href="../doc/README.html">README</a> &mdash; npm@1.1.59</p>
+<p id="footer"><a href="../doc/README.html">README</a> &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/adduser.html b/deps/npm/html/doc/adduser.html
index 19ae047f5..acc0266f1 100644
--- a/deps/npm/html/doc/adduser.html
+++ b/deps/npm/html/doc/adduser.html
@@ -39,7 +39,7 @@ authorize on a new machine.</p>
<ul><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/owner.html">owner(1)</a></li><li><a href="../doc/whoami.html">whoami(1)</a></li></ul>
</div>
-<p id="footer">adduser &mdash; npm@1.1.59</p>
+<p id="footer">adduser &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/bin.html b/deps/npm/html/doc/bin.html
index 5dcf22201..134198f71 100644
--- a/deps/npm/html/doc/bin.html
+++ b/deps/npm/html/doc/bin.html
@@ -20,7 +20,7 @@
<ul><li><a href="../doc/prefix.html">prefix(1)</a></li><li><a href="../doc/root.html">root(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
</div>
-<p id="footer">bin &mdash; npm@1.1.59</p>
+<p id="footer">bin &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/bugs.html b/deps/npm/html/doc/bugs.html
index 5310fb2c2..c637d28aa 100644
--- a/deps/npm/html/doc/bugs.html
+++ b/deps/npm/html/doc/bugs.html
@@ -36,7 +36,7 @@ config param.</p>
<ul><li><a href="../doc/docs.html">docs(1)</a></li><li><a href="../doc/view.html">view(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/json.html">json(1)</a></li></ul>
</div>
-<p id="footer">bugs &mdash; npm@1.1.59</p>
+<p id="footer">bugs &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/build.html b/deps/npm/html/doc/build.html
index bbbeffcb7..82277ff8d 100644
--- a/deps/npm/html/doc/build.html
+++ b/deps/npm/html/doc/build.html
@@ -25,7 +25,7 @@ A folder containing a <code>package.json</code> file in its root.</li></ul>
<ul><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/link.html">link(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/json.html">json(1)</a></li></ul>
</div>
-<p id="footer">build &mdash; npm@1.1.59</p>
+<p id="footer">build &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/bundle.html b/deps/npm/html/doc/bundle.html
index 369b69c4d..1b37b0151 100644
--- a/deps/npm/html/doc/bundle.html
+++ b/deps/npm/html/doc/bundle.html
@@ -20,7 +20,7 @@ install packages into the local space.</p>
<ul><li><a href="../doc/install.html">install(1)</a></li></ul>
</div>
-<p id="footer">bundle &mdash; npm@1.1.59</p>
+<p id="footer">bundle &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/cache.html b/deps/npm/html/doc/cache.html
index 7c593fdd9..39c9092c6 100644
--- a/deps/npm/html/doc/cache.html
+++ b/deps/npm/html/doc/cache.html
@@ -66,7 +66,7 @@ they do not make an HTTP request to the registry.</p>
<ul><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/pack.html">pack(1)</a></li></ul>
</div>
-<p id="footer">cache &mdash; npm@1.1.59</p>
+<p id="footer">cache &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/changelog.html b/deps/npm/html/doc/changelog.html
index d59ccc45b..af186b1a8 100644
--- a/deps/npm/html/doc/changelog.html
+++ b/deps/npm/html/doc/changelog.html
@@ -65,7 +65,7 @@
<ul><li><a href="../doc/npm.html">npm(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li></ul>
</div>
-<p id="footer">changelog &mdash; npm@1.1.59</p>
+<p id="footer">changelog &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/coding-style.html b/deps/npm/html/doc/coding-style.html
index 528d40a53..7ab84d404 100644
--- a/deps/npm/html/doc/coding-style.html
+++ b/deps/npm/html/doc/coding-style.html
@@ -180,7 +180,7 @@ set to anything.&quot;</p>
<ul><li><a href="../doc/developers.html">developers(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/npm.html">npm(1)</a></li></ul>
</div>
-<p id="footer">coding-style &mdash; npm@1.1.59</p>
+<p id="footer">coding-style &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/completion.html b/deps/npm/html/doc/completion.html
index b8d8b1402..8661b8242 100644
--- a/deps/npm/html/doc/completion.html
+++ b/deps/npm/html/doc/completion.html
@@ -33,7 +33,7 @@ completions based on the arguments.</p>
<ul><li><a href="../doc/developers.html">developers(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/npm.html">npm(1)</a></li></ul>
</div>
-<p id="footer">completion &mdash; npm@1.1.59</p>
+<p id="footer">completion &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/config.html b/deps/npm/html/doc/config.html
index dce7d7b6a..d8ce82a5d 100644
--- a/deps/npm/html/doc/config.html
+++ b/deps/npm/html/doc/config.html
@@ -756,7 +756,7 @@ then answer &quot;no&quot; to any prompt.</p>
<ul><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/npm.html">npm(1)</a></li></ul>
</div>
-<p id="footer">config &mdash; npm@1.1.59</p>
+<p id="footer">config &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/dedupe.html b/deps/npm/html/doc/dedupe.html
index f284c7c2a..4a61e39f0 100644
--- a/deps/npm/html/doc/dedupe.html
+++ b/deps/npm/html/doc/dedupe.html
@@ -57,7 +57,7 @@ registry.</p>
<ul><li><a href="../doc/ls.html">ls(1)</a></li><li><a href="../doc/update.html">update(1)</a></li><li><a href="../doc/install.html">install(1)</a></li></ul>
</div>
-<p id="footer">dedupe &mdash; npm@1.1.59</p>
+<p id="footer">dedupe &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/deprecate.html b/deps/npm/html/doc/deprecate.html
index 8bb1455ea..6cbab62c3 100644
--- a/deps/npm/html/doc/deprecate.html
+++ b/deps/npm/html/doc/deprecate.html
@@ -29,7 +29,7 @@ something like this:</p>
<ul><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li></ul>
</div>
-<p id="footer">deprecate &mdash; npm@1.1.59</p>
+<p id="footer">deprecate &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/developers.html b/deps/npm/html/doc/developers.html
index 4f5230f1e..964d90c6f 100644
--- a/deps/npm/html/doc/developers.html
+++ b/deps/npm/html/doc/developers.html
@@ -160,7 +160,7 @@ from a fresh checkout.</p>
<ul><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/npm.html">npm(1)</a></li><li><a href="../doc/init.html">init(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/adduser.html">adduser(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li></ul>
</div>
-<p id="footer">developers &mdash; npm@1.1.59</p>
+<p id="footer">developers &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/disputes.html b/deps/npm/html/doc/disputes.html
index fc37c7533..9a496ce03 100644
--- a/deps/npm/html/doc/disputes.html
+++ b/deps/npm/html/doc/disputes.html
@@ -80,7 +80,7 @@ license statement)</li><li>Illegal content.</li></ol>
<ul><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/owner.html">owner(1)</a></li></ul>
</div>
-<p id="footer">disputes &mdash; npm@1.1.59</p>
+<p id="footer">disputes &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/docs.html b/deps/npm/html/doc/docs.html
index 228155c6a..9f2e7fe7d 100644
--- a/deps/npm/html/doc/docs.html
+++ b/deps/npm/html/doc/docs.html
@@ -37,7 +37,7 @@ config param.</p>
<ul><li><a href="../doc/view.html">view(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/json.html">json(1)</a></li></ul>
</div>
-<p id="footer">docs &mdash; npm@1.1.59</p>
+<p id="footer">docs &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/edit.html b/deps/npm/html/doc/edit.html
index c1d76c837..bb979e716 100644
--- a/deps/npm/html/doc/edit.html
+++ b/deps/npm/html/doc/edit.html
@@ -37,7 +37,7 @@ or <code>&quot;notepad&quot;</code> on Windows.</li><li>Type: path</li></ul>
<ul><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/explore.html">explore(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
</div>
-<p id="footer">edit &mdash; npm@1.1.59</p>
+<p id="footer">edit &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/explore.html b/deps/npm/html/doc/explore.html
index 5a199d2e7..c2839ff07 100644
--- a/deps/npm/html/doc/explore.html
+++ b/deps/npm/html/doc/explore.html
@@ -40,7 +40,7 @@ Windows</li><li>Type: path</li></ul>
<ul><li><a href="../doc/submodule.html">submodule(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/edit.html">edit(1)</a></li><li><a href="../doc/rebuild.html">rebuild(1)</a></li><li><a href="../doc/build.html">build(1)</a></li><li><a href="../doc/install.html">install(1)</a></li></ul>
</div>
-<p id="footer">explore &mdash; npm@1.1.59</p>
+<p id="footer">explore &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/faq.html b/deps/npm/html/doc/faq.html
index 61e676e42..c66b89d41 100644
--- a/deps/npm/html/doc/faq.html
+++ b/deps/npm/html/doc/faq.html
@@ -207,20 +207,29 @@ means that publishes go over HTTP by default in those versions of node.</p>
<h2 id="I-forgot-my-password-and-can-t-publish-How-do-I-reset-it">I forgot my password, and can&#39;t publish. How do I reset it?</h2>
-<p>Go to <a href="http://admin.npmjs.org/reset">http://admin.npmjs.org/reset</a>.</p>
+<p>Go to <a href="https://npmjs.org/forgot">https://npmjs.org/forgot</a>.</p>
<h2 id="I-get-ECONNREFUSED-a-lot-What-s-up">I get ECONNREFUSED a lot. What&#39;s up?</h2>
<p>Either the registry is down, or node&#39;s DNS isn&#39;t able to reach out.</p>
-<p>To check if the registry is down, open up
-<a href="http://registry.npmjs.org/">http://registry.npmjs.org/</a>
+<p>To check if the registry is down, open up <a href="http://registry.npmjs.org/">http://registry.npmjs.org/</a>
in a web browser. This will also tell you if you are just unable to
access the internet for some reason.</p>
<p>If the registry IS down, let me know by emailing or posting an issue.
We&#39;ll have someone kick it or something.</p>
+<h2 id="Why-no-namespaces">Why no namespaces?</h2>
+
+<p>Please see this discussion: <a href="https://github.com/isaacs/npm/issues/798">https://github.com/isaacs/npm/issues/798</a></p>
+
+<p>tl;dr - It doesn&#39;t actually make things better, and can make them worse.</p>
+
+<p>If you want to namespace your own packages, you may: simply use the
+<code>-</code> character to separate the names. npm is a mostly anarchic system.
+There is not sufficient need to impose namespace rules on everyone.</p>
+
<h2 id="Who-does-npm">Who does npm?</h2>
<p><code>npm view npm author</code></p>
@@ -241,7 +250,7 @@ We&#39;ll have someone kick it or something.</p>
<ul><li><a href="../doc/npm.html">npm(1)</a></li><li><a href="../doc/developers.html">developers(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li></ul>
</div>
-<p id="footer">faq &mdash; npm@1.1.59</p>
+<p id="footer">faq &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/folders.html b/deps/npm/html/doc/folders.html
index f20336723..e60ea6bc7 100644
--- a/deps/npm/html/doc/folders.html
+++ b/deps/npm/html/doc/folders.html
@@ -205,7 +205,7 @@ cannot be found elsewhere. See <code><a href="../doc/json.html">json(1)</a></co
<ul><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/pack.html">pack(1)</a></li><li><a href="../doc/cache.html">cache(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li></ul>
</div>
-<p id="footer">folders &mdash; npm@1.1.59</p>
+<p id="footer">folders &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/help-search.html b/deps/npm/html/doc/help-search.html
index 055b39b42..24d3faf11 100644
--- a/deps/npm/html/doc/help-search.html
+++ b/deps/npm/html/doc/help-search.html
@@ -38,7 +38,7 @@ where the terms were found in the documentation.</p>
<ul><li><a href="../doc/npm.html">npm(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/help.html">help(1)</a></li></ul>
</div>
-<p id="footer">help-search &mdash; npm@1.1.59</p>
+<p id="footer">help-search &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/help.html b/deps/npm/html/doc/help.html
index 748e3f89f..ab960dd17 100644
--- a/deps/npm/html/doc/help.html
+++ b/deps/npm/html/doc/help.html
@@ -36,7 +36,7 @@ matches are equivalent to specifying a topic name.</p>
<ul><li><a href="../doc/npm.html">npm(1)</a></li><li><a href="../doc/README.html">README</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/help-search.html">help-search(1)</a></li><li><a href="../doc/index.html">index(1)</a></li></ul>
</div>
-<p id="footer">help &mdash; npm@1.1.59</p>
+<p id="footer">help &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/index.html b/deps/npm/html/doc/index.html
index 085727969..fe72394d3 100644
--- a/deps/npm/html/doc/index.html
+++ b/deps/npm/html/doc/index.html
@@ -114,7 +114,7 @@
<p> Symlink a package folder</p>
-<h2 id="npm-list-1"><a href="../doc/list.html">list(1)</a></h2>
+<h2 id="npm-ls-1"><a href="../doc/ls.html">ls(1)</a></h2>
<p> List installed packages</p>
@@ -388,7 +388,7 @@
<p> Display npm username</p>
</div>
-<p id="footer">index &mdash; npm@1.1.59</p>
+<p id="footer">index &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/init.html b/deps/npm/html/doc/init.html
index 2334ce459..d2ae25c52 100644
--- a/deps/npm/html/doc/init.html
+++ b/deps/npm/html/doc/init.html
@@ -29,7 +29,7 @@ without a really good reason to do so.</p>
<ul><li><a href="https://github.com/isaacs/init-package-json">https://github.com/isaacs/init-package-json</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/version.html">version(1)</a></li></ul>
</div>
-<p id="footer">init &mdash; npm@1.1.59</p>
+<p id="footer">init &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/install.html b/deps/npm/html/doc/install.html
index 111fe996d..c5bf04805 100644
--- a/deps/npm/html/doc/install.html
+++ b/deps/npm/html/doc/install.html
@@ -133,7 +133,7 @@ affects a real use-case, it will be investigated.</p>
<ul><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/update.html">update(1)</a></li><li><a href="../doc/link.html">link(1)</a></li><li><a href="../doc/rebuild.html">rebuild(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/build.html">build(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/tag.html">tag(1)</a></li><li><a href="../doc/rm.html">rm(1)</a></li><li><a href="../doc/shrinkwrap.html">shrinkwrap(1)</a></li></ul>
</div>
-<p id="footer">install &mdash; npm@1.1.59</p>
+<p id="footer">install &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/json.html b/deps/npm/html/doc/json.html
index fcb297bdd..1bfeafa05 100644
--- a/deps/npm/html/doc/json.html
+++ b/deps/npm/html/doc/json.html
@@ -525,7 +525,7 @@ overridden.</p>
<ul><li><a href="../doc/semver.html">semver(1)</a></li><li><a href="../doc/init.html">init(1)</a></li><li><a href="../doc/version.html">version(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/help.html">help(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/rm.html">rm(1)</a></li></ul>
</div>
-<p id="footer">json &mdash; npm@1.1.59</p>
+<p id="footer">json &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/link.html b/deps/npm/html/doc/link.html
index 8d1a3c996..00af34f7a 100644
--- a/deps/npm/html/doc/link.html
+++ b/deps/npm/html/doc/link.html
@@ -58,7 +58,7 @@ installation target into your project&#39;s <code>node_modules</code> folder.</p
<ul><li><a href="../doc/developers.html">developers(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
</div>
-<p id="footer">link &mdash; npm@1.1.59</p>
+<p id="footer">link &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/ls.html b/deps/npm/html/doc/ls.html
new file mode 100644
index 000000000..85a2e761e
--- /dev/null
+++ b/deps/npm/html/doc/ls.html
@@ -0,0 +1,99 @@
+<!doctype html>
+<html>
+ <title>ls</title>
+ <meta http-equiv="content-type" value="text/html;utf-8">
+ <link rel="stylesheet" type="text/css" href="../static/style.css">
+
+ <body>
+ <div id="wrapper">
+<h1><a href="../doc/ls.html">ls</a></h1> <p>List installed packages</p>
+
+<h2 id="SYNOPSIS">SYNOPSIS</h2>
+
+<pre><code>npm list [&lt;pkg&gt; ...]
+npm ls [&lt;pkg&gt; ...]
+npm la [&lt;pkg&gt; ...]
+npm ll [&lt;pkg&gt; ...]</code></pre>
+
+<h2 id="DESCRIPTION">DESCRIPTION</h2>
+
+<p>This command will print to stdout all the versions of packages that are
+installed, as well as their dependencies, in a tree-structure.</p>
+
+<p>Positional arguments are <code>name@version-range</code> identifiers, which will
+limit the results to only the paths to the packages named. Note that
+nested packages will <em>also</em> show the paths to the specified packages.
+For example, running <code>npm ls promzard</code> in npm&#39;s source tree will show:</p>
+
+<pre><code>npm@1.1.61 /path/to/npm
+└─┬ init-package-json@0.0.4
+ └── promzard@0.1.5</code></pre>
+
+<p>It will show print out extraneous, missing, and invalid packages.</p>
+
+<p>When run as <code>ll</code> or <code>la</code>, it shows extended information by default.</p>
+
+<h2 id="CONFIGURATION">CONFIGURATION</h2>
+
+<h3 id="json">json</h3>
+
+<ul><li>Default: false</li><li>Type: Boolean</li></ul>
+
+<p>Show information in JSON format.</p>
+
+<h3 id="long">long</h3>
+
+<ul><li>Default: false</li><li>Type: Boolean</li></ul>
+
+<p>Show extended information.</p>
+
+<h3 id="parseable">parseable</h3>
+
+<ul><li>Default: false</li><li>Type: Boolean</li></ul>
+
+<p>Show parseable output instead of tree view.</p>
+
+<h3 id="global">global</h3>
+
+<ul><li>Default: false</li><li>Type: Boolean</li></ul>
+
+<p>List packages in the global install prefix instead of in the current
+project.</p>
+
+<h2 id="SEE-ALSO">SEE ALSO</h2>
+
+<ul><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/link.html">link(1)</a></li><li><a href="../doc/prune.html">prune(1)</a></li><li><a href="../doc/outdated.html">outdated(1)</a></li><li><a href="../doc/update.html">update(1)</a></li></ul>
+</div>
+<p id="footer">ls &mdash; npm@1.1.61</p>
+<script>
+;(function () {
+var wrapper = document.getElementById("wrapper")
+var els = Array.prototype.slice.call(wrapper.getElementsByTagName("*"), 0)
+ .filter(function (el) {
+ return el.parentNode === wrapper
+ && el.tagName.match(/H[1-6]/)
+ && el.id
+ })
+var l = 2
+ , toc = document.createElement("ul")
+toc.innerHTML = els.map(function (el) {
+ var i = el.tagName.charAt(1)
+ , out = ""
+ while (i > l) {
+ out += "<ul>"
+ l ++
+ }
+ while (i < l) {
+ out += "</ul>"
+ l --
+ }
+ out += "<li><a href='#" + el.id + "'>" +
+ ( el.innerText || el.text || el.innerHTML)
+ + "</a>"
+ return out
+}).join("\n")
+toc.id = "toc"
+document.body.appendChild(toc)
+})()
+</script>
+</body></html>
diff --git a/deps/npm/html/doc/npm.html b/deps/npm/html/doc/npm.html
index ef163aaa6..67c8aaa3f 100644
--- a/deps/npm/html/doc/npm.html
+++ b/deps/npm/html/doc/npm.html
@@ -14,7 +14,7 @@
<h2 id="VERSION">VERSION</h2>
-<p>1.1.59</p>
+<p>1.1.61</p>
<h2 id="DESCRIPTION">DESCRIPTION</h2>
@@ -135,7 +135,7 @@ will no doubt tell you to put the output in a gist or email.</p>
<ul><li><a href="../doc/help.html">help(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/README.html">README</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/index.html">index(1)</a></li><li><a href="../api/npm.html">npm(3)</a></li></ul>
</div>
-<p id="footer">npm &mdash; npm@1.1.59</p>
+<p id="footer">npm &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/outdated.html b/deps/npm/html/doc/outdated.html
index c5573f7d6..4d7dd8408 100644
--- a/deps/npm/html/doc/outdated.html
+++ b/deps/npm/html/doc/outdated.html
@@ -21,7 +21,7 @@ packages are currently outdated.</p>
<ul><li><a href="../doc/update.html">update(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li></ul>
</div>
-<p id="footer">outdated &mdash; npm@1.1.59</p>
+<p id="footer">outdated &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/owner.html b/deps/npm/html/doc/owner.html
index f59482cb5..000b425b7 100644
--- a/deps/npm/html/doc/owner.html
+++ b/deps/npm/html/doc/owner.html
@@ -34,7 +34,7 @@ that is not implemented at this time.</p>
<ul><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/adduser.html">adduser(1)</a></li><li><a href="../doc/disputes.html">disputes(1)</a></li></ul>
</div>
-<p id="footer">owner &mdash; npm@1.1.59</p>
+<p id="footer">owner &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/pack.html b/deps/npm/html/doc/pack.html
index ca2860eb9..4dd7fe53c 100644
--- a/deps/npm/html/doc/pack.html
+++ b/deps/npm/html/doc/pack.html
@@ -29,7 +29,7 @@ overwritten the second time.</p>
<ul><li><a href="../doc/cache.html">cache(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
</div>
-<p id="footer">pack &mdash; npm@1.1.59</p>
+<p id="footer">pack &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/prefix.html b/deps/npm/html/doc/prefix.html
index 1dc79e7c8..f4c0ecd6a 100644
--- a/deps/npm/html/doc/prefix.html
+++ b/deps/npm/html/doc/prefix.html
@@ -20,7 +20,7 @@
<ul><li><a href="../doc/root.html">root(1)</a></li><li><a href="../doc/bin.html">bin(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
</div>
-<p id="footer">prefix &mdash; npm@1.1.59</p>
+<p id="footer">prefix &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/prune.html b/deps/npm/html/doc/prune.html
index 63158e194..fddff0b22 100644
--- a/deps/npm/html/doc/prune.html
+++ b/deps/npm/html/doc/prune.html
@@ -25,7 +25,7 @@ package&#39;s dependencies list.</p>
<ul><li><a href="../doc/rm.html">rm(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/list.html">list(1)</a></li></ul>
</div>
-<p id="footer">prune &mdash; npm@1.1.59</p>
+<p id="footer">prune &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/publish.html b/deps/npm/html/doc/publish.html
index 721ee145f..613b2fb7b 100644
--- a/deps/npm/html/doc/publish.html
+++ b/deps/npm/html/doc/publish.html
@@ -29,7 +29,7 @@ the registry. Overwrites when the &quot;--force&quot; flag is set.</p>
<ul><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/adduser.html">adduser(1)</a></li><li><a href="../doc/owner.html">owner(1)</a></li><li><a href="../doc/deprecate.html">deprecate(1)</a></li><li><a href="../doc/tag.html">tag(1)</a></li></ul>
</div>
-<p id="footer">publish &mdash; npm@1.1.59</p>
+<p id="footer">publish &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/rebuild.html b/deps/npm/html/doc/rebuild.html
index 1ab8db953..6ea0e01f2 100644
--- a/deps/npm/html/doc/rebuild.html
+++ b/deps/npm/html/doc/rebuild.html
@@ -25,7 +25,7 @@ the new binary.</p>
<ul><li><a href="../doc/build.html">build(1)</a></li><li><a href="../doc/install.html">install(1)</a></li></ul>
</div>
-<p id="footer">rebuild &mdash; npm@1.1.59</p>
+<p id="footer">rebuild &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/registry.html b/deps/npm/html/doc/registry.html
index 90f4d212f..0b4cac912 100644
--- a/deps/npm/html/doc/registry.html
+++ b/deps/npm/html/doc/registry.html
@@ -97,7 +97,7 @@ ask for help on the <a href="mailto:npm-@googlegroups.com">npm-@googlegroups.com
<ul><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/developers.html">developers(1)</a></li><li><a href="../doc/disputes.html">disputes(1)</a></li></ul>
</div>
-<p id="footer">registry &mdash; npm@1.1.59</p>
+<p id="footer">registry &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/removing-npm.html b/deps/npm/html/doc/removing-npm.html
index c171c4c47..c4201a700 100644
--- a/deps/npm/html/doc/removing-npm.html
+++ b/deps/npm/html/doc/removing-npm.html
@@ -58,7 +58,7 @@ modules. To track those down, you can do the following:</p>
<ul><li><a href="../doc/README.html">README</a></li><li><a href="../doc/rm.html">rm(1)</a></li><li><a href="../doc/prune.html">prune(1)</a></li></ul>
</div>
-<p id="footer">removing-npm &mdash; npm@1.1.59</p>
+<p id="footer">removing-npm &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/restart.html b/deps/npm/html/doc/restart.html
index 157a4df85..ed509ea34 100644
--- a/deps/npm/html/doc/restart.html
+++ b/deps/npm/html/doc/restart.html
@@ -24,7 +24,7 @@ the &quot;start&quot; script.</p>
<ul><li><a href="../doc/run-script.html">run-script(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/test.html">test(1)</a></li><li><a href="../doc/start.html">start(1)</a></li><li><a href="../doc/stop.html">stop(1)</a></li></ul>
</div>
-<p id="footer">restart &mdash; npm@1.1.59</p>
+<p id="footer">restart &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/root.html b/deps/npm/html/doc/root.html
index f148910f8..627a9c928 100644
--- a/deps/npm/html/doc/root.html
+++ b/deps/npm/html/doc/root.html
@@ -20,7 +20,7 @@
<ul><li><a href="../doc/prefix.html">prefix(1)</a></li><li><a href="../doc/bin.html">bin(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
</div>
-<p id="footer">root &mdash; npm@1.1.59</p>
+<p id="footer">root &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/run-script.html b/deps/npm/html/doc/run-script.html
index 7e72b83a3..f05942e07 100644
--- a/deps/npm/html/doc/run-script.html
+++ b/deps/npm/html/doc/run-script.html
@@ -23,7 +23,7 @@ called directly, as well.</p>
<ul><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/test.html">test(1)</a></li><li><a href="../doc/start.html">start(1)</a></li><li><a href="../doc/restart.html">restart(1)</a></li><li><a href="../doc/stop.html">stop(1)</a></li></ul>
</div>
-<p id="footer">run-script &mdash; npm@1.1.59</p>
+<p id="footer">run-script &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/scripts.html b/deps/npm/html/doc/scripts.html
index 5ae8bc140..896bd939b 100644
--- a/deps/npm/html/doc/scripts.html
+++ b/deps/npm/html/doc/scripts.html
@@ -177,7 +177,7 @@ will sudo the npm command in question.</li></ul>
<ul><li><a href="../doc/run-script.html">run-script(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/developers.html">developers(1)</a></li><li><a href="../doc/install.html">install(1)</a></li></ul>
</div>
-<p id="footer">scripts &mdash; npm@1.1.59</p>
+<p id="footer">scripts &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/search.html b/deps/npm/html/doc/search.html
index 483481307..87d23dd7d 100644
--- a/deps/npm/html/doc/search.html
+++ b/deps/npm/html/doc/search.html
@@ -24,7 +24,7 @@ expression characters must be escaped or quoted in most shells.)</p>
<ul><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/view.html">view(1)</a></li></ul>
</div>
-<p id="footer">search &mdash; npm@1.1.59</p>
+<p id="footer">search &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/semver.html b/deps/npm/html/doc/semver.html
index 655ba643f..e6c277d1b 100644
--- a/deps/npm/html/doc/semver.html
+++ b/deps/npm/html/doc/semver.html
@@ -104,7 +104,7 @@ that satisfies the range, or null if none of them do.</li></ul>
<ul><li><a href="../doc/json.html">json(1)</a></li></ul>
</div>
-<p id="footer">semver &mdash; npm@1.1.59</p>
+<p id="footer">semver &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/shrinkwrap.html b/deps/npm/html/doc/shrinkwrap.html
index 6b6177bef..db8d64fb7 100644
--- a/deps/npm/html/doc/shrinkwrap.html
+++ b/deps/npm/html/doc/shrinkwrap.html
@@ -169,7 +169,7 @@ versions.</p>
<ul><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/list.html">list(1)</a></li></ul>
</div>
-<p id="footer">shrinkwrap &mdash; npm@1.1.59</p>
+<p id="footer">shrinkwrap &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/star.html b/deps/npm/html/doc/star.html
index d17fff7ac..ab6ac0133 100644
--- a/deps/npm/html/doc/star.html
+++ b/deps/npm/html/doc/star.html
@@ -26,7 +26,7 @@ a vaguely positive way to show that you care.</p>
<ul><li><a href="../doc/view.html">view(1)</a></li><li><a href="../doc/whoami.html">whoami(1)</a></li><li><a href="../doc/adduser.html">adduser(1)</a></li></ul>
</div>
-<p id="footer">star &mdash; npm@1.1.59</p>
+<p id="footer">star &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/start.html b/deps/npm/html/doc/start.html
index 9a34e64aa..3b454215d 100644
--- a/deps/npm/html/doc/start.html
+++ b/deps/npm/html/doc/start.html
@@ -20,7 +20,7 @@
<ul><li><a href="../doc/run-script.html">run-script(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/test.html">test(1)</a></li><li><a href="../doc/restart.html">restart(1)</a></li><li><a href="../doc/stop.html">stop(1)</a></li></ul>
</div>
-<p id="footer">start &mdash; npm@1.1.59</p>
+<p id="footer">start &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/stop.html b/deps/npm/html/doc/stop.html
index f3dd8baa3..d50e70f9a 100644
--- a/deps/npm/html/doc/stop.html
+++ b/deps/npm/html/doc/stop.html
@@ -20,7 +20,7 @@
<ul><li><a href="../doc/run-script.html">run-script(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/test.html">test(1)</a></li><li><a href="../doc/start.html">start(1)</a></li><li><a href="../doc/restart.html">restart(1)</a></li></ul>
</div>
-<p id="footer">stop &mdash; npm@1.1.59</p>
+<p id="footer">stop &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/submodule.html b/deps/npm/html/doc/submodule.html
index dff61451d..4f1f55038 100644
--- a/deps/npm/html/doc/submodule.html
+++ b/deps/npm/html/doc/submodule.html
@@ -33,7 +33,7 @@ dependencies into the submodule folder.</p>
<ul><li><a href="../doc/json.html">json(1)</a></li><li>git help submodule</li></ul>
</div>
-<p id="footer">submodule &mdash; npm@1.1.59</p>
+<p id="footer">submodule &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/tag.html b/deps/npm/html/doc/tag.html
index d88b2bbfc..d84582daf 100644
--- a/deps/npm/html/doc/tag.html
+++ b/deps/npm/html/doc/tag.html
@@ -21,7 +21,7 @@
<ul><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
</div>
-<p id="footer">tag &mdash; npm@1.1.59</p>
+<p id="footer">tag &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/test.html b/deps/npm/html/doc/test.html
index 4b5c207c7..2b34c2575 100644
--- a/deps/npm/html/doc/test.html
+++ b/deps/npm/html/doc/test.html
@@ -23,7 +23,7 @@ true.</p>
<ul><li><a href="../doc/run-script.html">run-script(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/start.html">start(1)</a></li><li><a href="../doc/restart.html">restart(1)</a></li><li><a href="../doc/stop.html">stop(1)</a></li></ul>
</div>
-<p id="footer">test &mdash; npm@1.1.59</p>
+<p id="footer">test &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/uninstall.html b/deps/npm/html/doc/uninstall.html
index 2f0ab091b..ec55f9609 100644
--- a/deps/npm/html/doc/uninstall.html
+++ b/deps/npm/html/doc/uninstall.html
@@ -22,7 +22,7 @@ on its behalf.</p>
<ul><li><a href="../doc/prune.html">prune(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
</div>
-<p id="footer">uninstall &mdash; npm@1.1.59</p>
+<p id="footer">uninstall &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/unpublish.html b/deps/npm/html/doc/unpublish.html
index edd3b6410..eaeb8f0f4 100644
--- a/deps/npm/html/doc/unpublish.html
+++ b/deps/npm/html/doc/unpublish.html
@@ -34,7 +34,7 @@ the root package entry is removed from the registry entirely.</p>
<ul><li><a href="../doc/deprecate.html">deprecate(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/adduser.html">adduser(1)</a></li><li><a href="../doc/owner.html">owner(1)</a></li></ul>
</div>
-<p id="footer">unpublish &mdash; npm@1.1.59</p>
+<p id="footer">unpublish &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/update.html b/deps/npm/html/doc/update.html
index 05837760c..b93942c3b 100644
--- a/deps/npm/html/doc/update.html
+++ b/deps/npm/html/doc/update.html
@@ -23,7 +23,7 @@
<ul><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/outdated.html">outdated(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/list.html">list(1)</a></li></ul>
</div>
-<p id="footer">update &mdash; npm@1.1.59</p>
+<p id="footer">update &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/version.html b/deps/npm/html/doc/version.html
index b157cf3ef..611b45ee3 100644
--- a/deps/npm/html/doc/version.html
+++ b/deps/npm/html/doc/version.html
@@ -40,7 +40,7 @@ in your git config for this to work properly.</p>
<ul><li><a href="../doc/init.html">init(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/semver.html">semver(1)</a></li></ul>
</div>
-<p id="footer">version &mdash; npm@1.1.59</p>
+<p id="footer">version &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/view.html b/deps/npm/html/doc/view.html
index 7966e4cee..27681fc50 100644
--- a/deps/npm/html/doc/view.html
+++ b/deps/npm/html/doc/view.html
@@ -88,7 +88,7 @@ the field name.</p>
<ul><li><a href="../doc/search.html">search(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/docs.html">docs(1)</a></li></ul>
</div>
-<p id="footer">view &mdash; npm@1.1.59</p>
+<p id="footer">view &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/doc/whoami.html b/deps/npm/html/doc/whoami.html
index bfcd0d6fa..f88552086 100644
--- a/deps/npm/html/doc/whoami.html
+++ b/deps/npm/html/doc/whoami.html
@@ -20,7 +20,7 @@
<ul><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/adduser.html">adduser(1)</a></li></ul>
</div>
-<p id="footer">whoami &mdash; npm@1.1.59</p>
+<p id="footer">whoami &mdash; npm@1.1.61</p>
<script>
;(function () {
var wrapper = document.getElementById("wrapper")
diff --git a/deps/npm/html/style.css b/deps/npm/html/static/style.css
index e63b74519..e63b74519 100644
--- a/deps/npm/html/style.css
+++ b/deps/npm/html/static/style.css
diff --git a/deps/npm/html/webfonts/23242D_3_0.eot b/deps/npm/html/static/webfonts/23242D_3_0.eot
index a2ce30852..a2ce30852 100644
--- a/deps/npm/html/webfonts/23242D_3_0.eot
+++ b/deps/npm/html/static/webfonts/23242D_3_0.eot
Binary files differ
diff --git a/deps/npm/html/webfonts/23242D_3_0.ttf b/deps/npm/html/static/webfonts/23242D_3_0.ttf
index 788b1fcf9..788b1fcf9 100644
--- a/deps/npm/html/webfonts/23242D_3_0.ttf
+++ b/deps/npm/html/static/webfonts/23242D_3_0.ttf
Binary files differ
diff --git a/deps/npm/html/webfonts/23242D_3_0.woff b/deps/npm/html/static/webfonts/23242D_3_0.woff
index 46540e82a..46540e82a 100644
--- a/deps/npm/html/webfonts/23242D_3_0.woff
+++ b/deps/npm/html/static/webfonts/23242D_3_0.woff
Binary files differ
diff --git a/deps/npm/lib/ls.js b/deps/npm/lib/ls.js
index 3c649f244..96068bfa5 100644
--- a/deps/npm/lib/ls.js
+++ b/deps/npm/lib/ls.js
@@ -217,7 +217,7 @@ function makeArchy_ (data, long, dir, depth, parent, d) {
}
data = unmet + " " + d + " " + data
} else {
- data = d+"@"+ data +" (max depth reached)"
+ data = d+"@"+ data
}
return data
}
@@ -249,6 +249,7 @@ function makeArchy_ (data, long, dir, depth, parent, d) {
if (dir === data.path) out.label += "\n" + dir
out.label += "\n" + getExtras(data, dir)
} else if (dir === data.path) {
+ if (out.label) out.label += " "
out.label += dir
}
diff --git a/deps/npm/lib/npm.js b/deps/npm/lib/npm.js
index 8f42b2784..41f4ddeec 100644
--- a/deps/npm/lib/npm.js
+++ b/deps/npm/lib/npm.js
@@ -323,7 +323,7 @@ function load (npm, cli, cb) {
}
}
- var umask = parseInt(cli.umask, 8)
+ var umask = npm.config.get("umask")
npm.modes = { exec: 0777 & (~umask)
, file: 0666 & (~umask)
, umask: umask }
diff --git a/deps/npm/lib/search.js b/deps/npm/lib/search.js
index 8a7238cb1..3e9bdb15f 100644
--- a/deps/npm/lib/search.js
+++ b/deps/npm/lib/search.js
@@ -181,7 +181,7 @@ function prettify (data, args) {
l._undent = l._undent || []
l._undent[i] = len - longest[i]
}
- l[i] = l[i].replace(/\s+/g, " ")
+ l[i] = ('' + l[i]).replace(/\s+/g, " ")
})
return l
}).sort(function (a, b) {
diff --git a/deps/npm/lib/utils/lifecycle.js b/deps/npm/lib/utils/lifecycle.js
index 2ddf02df0..eae3c3e68 100644
--- a/deps/npm/lib/utils/lifecycle.js
+++ b/deps/npm/lib/utils/lifecycle.js
@@ -252,7 +252,7 @@ function makeEnv (data, prefix, env) {
return
}
var value = npm.config.get(i)
- if (value instanceof Stream) return
+ if (value instanceof Stream || Array.isArray(value)) return
if (!value) value = ""
else if (typeof value !== "string") value = JSON.stringify(value)
diff --git a/deps/npm/man/man1/README.1 b/deps/npm/man/man1/README.1
index 4fec26e57..287bef852 100644
--- a/deps/npm/man/man1/README.1
+++ b/deps/npm/man/man1/README.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM" "1" "August 2012" "" ""
+.TH "NPM" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm\fR \-\- node package manager
diff --git a/deps/npm/man/man1/adduser.1 b/deps/npm/man/man1/adduser.1
index 6e4b76f43..c769c4305 100644
--- a/deps/npm/man/man1/adduser.1
+++ b/deps/npm/man/man1/adduser.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-ADDUSER" "1" "August 2012" "" ""
+.TH "NPM\-ADDUSER" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-adduser\fR \-\- Add a registry user account
diff --git a/deps/npm/man/man1/bin.1 b/deps/npm/man/man1/bin.1
index 012d1ac07..7cde1f89d 100644
--- a/deps/npm/man/man1/bin.1
+++ b/deps/npm/man/man1/bin.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-BIN" "1" "August 2012" "" ""
+.TH "NPM\-BIN" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-bin\fR \-\- Display npm bin folder
diff --git a/deps/npm/man/man1/bugs.1 b/deps/npm/man/man1/bugs.1
index c9b45023c..514dbd0d0 100644
--- a/deps/npm/man/man1/bugs.1
+++ b/deps/npm/man/man1/bugs.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-BUGS" "1" "August 2012" "" ""
+.TH "NPM\-BUGS" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-bugs\fR \-\- Bugs for a package in a web browser maybe
diff --git a/deps/npm/man/man1/build.1 b/deps/npm/man/man1/build.1
index 290804aea..c4237067a 100644
--- a/deps/npm/man/man1/build.1
+++ b/deps/npm/man/man1/build.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-BUILD" "1" "August 2012" "" ""
+.TH "NPM\-BUILD" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-build\fR \-\- Build a package
diff --git a/deps/npm/man/man1/bundle.1 b/deps/npm/man/man1/bundle.1
index 272907754..221783310 100644
--- a/deps/npm/man/man1/bundle.1
+++ b/deps/npm/man/man1/bundle.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-BUNDLE" "1" "August 2012" "" ""
+.TH "NPM\-BUNDLE" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-bundle\fR \-\- REMOVED
diff --git a/deps/npm/man/man1/cache.1 b/deps/npm/man/man1/cache.1
index 5d029f1f7..0bd30d7b0 100644
--- a/deps/npm/man/man1/cache.1
+++ b/deps/npm/man/man1/cache.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-CACHE" "1" "August 2012" "" ""
+.TH "NPM\-CACHE" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-cache\fR \-\- Manipulates packages cache
diff --git a/deps/npm/man/man1/changelog.1 b/deps/npm/man/man1/changelog.1
index 023370757..805729c23 100644
--- a/deps/npm/man/man1/changelog.1
+++ b/deps/npm/man/man1/changelog.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-CHANGELOG" "1" "August 2012" "" ""
+.TH "NPM\-CHANGELOG" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-changelog\fR \-\- Changes
diff --git a/deps/npm/man/man1/coding-style.1 b/deps/npm/man/man1/coding-style.1
index da006c54e..3c26dc7ea 100644
--- a/deps/npm/man/man1/coding-style.1
+++ b/deps/npm/man/man1/coding-style.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-CODING\-STYLE" "1" "August 2012" "" ""
+.TH "NPM\-CODING\-STYLE" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-coding-style\fR \-\- npm\'s "funny" coding style
diff --git a/deps/npm/man/man1/completion.1 b/deps/npm/man/man1/completion.1
index a6ba28f35..933c89991 100644
--- a/deps/npm/man/man1/completion.1
+++ b/deps/npm/man/man1/completion.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-COMPLETION" "1" "August 2012" "" ""
+.TH "NPM\-COMPLETION" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-completion\fR \-\- Tab Completion for npm
diff --git a/deps/npm/man/man1/config.1 b/deps/npm/man/man1/config.1
index 799179b5e..66115afb4 100644
--- a/deps/npm/man/man1/config.1
+++ b/deps/npm/man/man1/config.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-CONFIG" "1" "August 2012" "" ""
+.TH "NPM\-CONFIG" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-config\fR \-\- Manage the npm configuration file
diff --git a/deps/npm/man/man1/dedupe.1 b/deps/npm/man/man1/dedupe.1
index 35b0d1de1..79a9e48a3 100644
--- a/deps/npm/man/man1/dedupe.1
+++ b/deps/npm/man/man1/dedupe.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-DEDUPE" "1" "August 2012" "" ""
+.TH "NPM\-DEDUPE" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-dedupe\fR \-\- Reduce duplication
diff --git a/deps/npm/man/man1/deprecate.1 b/deps/npm/man/man1/deprecate.1
index 0cc3eee2a..0715d59bf 100644
--- a/deps/npm/man/man1/deprecate.1
+++ b/deps/npm/man/man1/deprecate.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-DEPRECATE" "1" "August 2012" "" ""
+.TH "NPM\-DEPRECATE" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-deprecate\fR \-\- Deprecate a version of a package
diff --git a/deps/npm/man/man1/developers.1 b/deps/npm/man/man1/developers.1
index a6ab1dd16..ac0ad9407 100644
--- a/deps/npm/man/man1/developers.1
+++ b/deps/npm/man/man1/developers.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-DEVELOPERS" "1" "August 2012" "" ""
+.TH "NPM\-DEVELOPERS" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-developers\fR \-\- Developer Guide
diff --git a/deps/npm/man/man1/disputes.1 b/deps/npm/man/man1/disputes.1
index a87a90806..f1ea93496 100644
--- a/deps/npm/man/man1/disputes.1
+++ b/deps/npm/man/man1/disputes.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-DISPUTES" "1" "August 2012" "" ""
+.TH "NPM\-DISPUTES" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-disputes\fR \-\- Handling Module Name Disputes
diff --git a/deps/npm/man/man1/docs.1 b/deps/npm/man/man1/docs.1
index 7e7709c2c..068d611cd 100644
--- a/deps/npm/man/man1/docs.1
+++ b/deps/npm/man/man1/docs.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-DOCS" "1" "August 2012" "" ""
+.TH "NPM\-DOCS" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-docs\fR \-\- Docs for a package in a web browser maybe
diff --git a/deps/npm/man/man1/edit.1 b/deps/npm/man/man1/edit.1
index 8e6e25e7b..f3251aeab 100644
--- a/deps/npm/man/man1/edit.1
+++ b/deps/npm/man/man1/edit.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-EDIT" "1" "August 2012" "" ""
+.TH "NPM\-EDIT" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-edit\fR \-\- Edit an installed package
diff --git a/deps/npm/man/man1/explore.1 b/deps/npm/man/man1/explore.1
index 18623b3dd..bb4ea470d 100644
--- a/deps/npm/man/man1/explore.1
+++ b/deps/npm/man/man1/explore.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-EXPLORE" "1" "August 2012" "" ""
+.TH "NPM\-EXPLORE" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-explore\fR \-\- Browse an installed package
diff --git a/deps/npm/man/man1/faq.1 b/deps/npm/man/man1/faq.1
index ee360bf4d..0290a2da5 100644
--- a/deps/npm/man/man1/faq.1
+++ b/deps/npm/man/man1/faq.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-FAQ" "1" "August 2012" "" ""
+.TH "NPM\-FAQ" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-faq\fR \-\- Frequently Asked Questions
@@ -276,7 +276,7 @@ Until node 0\.4\.10, there were problems sending big files over HTTPS\. That
means that publishes go over HTTP by default in those versions of node\.
.
.SH "I forgot my password, and can&#39;t publish\. How do I reset it?"
-Go to \fIhttp://admin\.npmjs\.org/reset\fR\|\.
+Go to \fIhttps://npmjs\.org/forgot\fR\|\.
.
.SH "I get ECONNREFUSED a lot\. What&#39;s up?"
Either the registry is down, or node\'s DNS isn\'t able to reach out\.
@@ -290,6 +290,16 @@ access the internet for some reason\.
If the registry IS down, let me know by emailing or posting an issue\.
We\'ll have someone kick it or something\.
.
+.SH "Why no namespaces?"
+Please see this discussion: \fIhttps://github\.com/isaacs/npm/issues/798\fR
+.
+.P
+tl;dr \- It doesn\'t actually make things better, and can make them worse\.
+.
+.P
+If you want to namespace your own packages, you may: simply use the \fB\-\fR character to separate the names\. npm is a mostly anarchic system\.
+There is not sufficient need to impose namespace rules on everyone\.
+.
.SH "Who does npm?"
\fBnpm view npm author\fR
.
diff --git a/deps/npm/man/man1/folders.1 b/deps/npm/man/man1/folders.1
index 618cf3c5c..8afd974ae 100644
--- a/deps/npm/man/man1/folders.1
+++ b/deps/npm/man/man1/folders.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-FOLDERS" "1" "August 2012" "" ""
+.TH "NPM\-FOLDERS" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-folders\fR \-\- Folder Structures Used by npm
diff --git a/deps/npm/man/man1/help-search.1 b/deps/npm/man/man1/help-search.1
index 9ba4b94cb..4b0056e3d 100644
--- a/deps/npm/man/man1/help-search.1
+++ b/deps/npm/man/man1/help-search.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-HELP\-SEARCH" "1" "August 2012" "" ""
+.TH "NPM\-HELP\-SEARCH" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-help-search\fR \-\- Search npm help documentation
diff --git a/deps/npm/man/man1/help.1 b/deps/npm/man/man1/help.1
index 719af267e..0f55fb62e 100644
--- a/deps/npm/man/man1/help.1
+++ b/deps/npm/man/man1/help.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-HELP" "1" "August 2012" "" ""
+.TH "NPM\-HELP" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-help\fR \-\- Get help on npm
diff --git a/deps/npm/man/man1/index.1 b/deps/npm/man/man1/index.1
index 2f72291f9..76a60b03d 100644
--- a/deps/npm/man/man1/index.1
+++ b/deps/npm/man/man1/index.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-INDEX" "1" "August 2012" "" ""
+.TH "NPM\-INDEX" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-index\fR \-\- Index of all npm documentation
@@ -84,7 +84,7 @@
.SH "npm help link"
Symlink a package folder
.
-.SH "npm help list"
+.SH "npm help ls"
List installed packages
.
.SH "npm help npm"
diff --git a/deps/npm/man/man1/init.1 b/deps/npm/man/man1/init.1
index 77258c9e6..8b3ec7824 100644
--- a/deps/npm/man/man1/init.1
+++ b/deps/npm/man/man1/init.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-INIT" "1" "August 2012" "" ""
+.TH "NPM\-INIT" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-init\fR \-\- Interactively create a package\.json file
diff --git a/deps/npm/man/man1/install.1 b/deps/npm/man/man1/install.1
index 4d74cbf44..9cd30e77a 100644
--- a/deps/npm/man/man1/install.1
+++ b/deps/npm/man/man1/install.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-INSTALL" "1" "August 2012" "" ""
+.TH "NPM\-INSTALL" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-install\fR \-\- Install a package
diff --git a/deps/npm/man/man1/json.1 b/deps/npm/man/man1/json.1
index cd1763c7e..140332da3 100644
--- a/deps/npm/man/man1/json.1
+++ b/deps/npm/man/man1/json.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-JSON" "1" "August 2012" "" ""
+.TH "NPM\-JSON" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-json\fR \-\- Specifics of npm\'s package\.json handling
diff --git a/deps/npm/man/man1/link.1 b/deps/npm/man/man1/link.1
index b93dbd0b7..5ecc9a879 100644
--- a/deps/npm/man/man1/link.1
+++ b/deps/npm/man/man1/link.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-LINK" "1" "August 2012" "" ""
+.TH "NPM\-LINK" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-link\fR \-\- Symlink a package folder
diff --git a/deps/npm/man/man1/ls.1 b/deps/npm/man/man1/ls.1
index b4412567c..04f5b6bce 100644
--- a/deps/npm/man/man1/ls.1
+++ b/deps/npm/man/man1/ls.1
@@ -1,7 +1,7 @@
-.\" Generated with Ronnjs/v0.1
+.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-LS" "1" "November 2011" "" ""
+.TH "NPM\-LS" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-ls\fR \-\- List installed packages
@@ -9,10 +9,10 @@
.SH "SYNOPSIS"
.
.nf
-npm list
-npm ls
-npm la
-npm ll
+npm list [<pkg> \.\.\.]
+npm ls [<pkg> \.\.\.]
+npm la [<pkg> \.\.\.]
+npm ll [<pkg> \.\.\.]
.
.fi
.
@@ -21,17 +21,43 @@ This command will print to stdout all the versions of packages that are
installed, as well as their dependencies, in a tree\-structure\.
.
.P
-It does not take positional arguments, though you may set config flags
-like with any other command, such as \fB\-g\fR to list global packages\.
+Positional arguments are \fBname@version\-range\fR identifiers, which will
+limit the results to only the paths to the packages named\. Note that
+nested packages will \fIalso\fR show the paths to the specified packages\.
+For example, running \fBnpm ls promzard\fR in npm\'s source tree will show:
+.
+.IP "" 4
+.
+.nf
+npm@1.1.61 /path/to/npm
+└─┬ init\-package\-json@0\.0\.4
+ └── promzard@0\.1\.5
+.
+.fi
+.
+.IP "" 0
.
.P
-It will print out extraneous, missing, and invalid packages\.
+It will show print out extraneous, missing, and invalid packages\.
.
.P
When run as \fBll\fR or \fBla\fR, it shows extended information by default\.
.
.SH "CONFIGURATION"
.
+.SS "json"
+.
+.IP "\(bu" 4
+Default: false
+.
+.IP "\(bu" 4
+Type: Boolean
+.
+.IP "" 0
+.
+.P
+Show information in JSON format\.
+.
.SS "long"
.
.IP "\(bu" 4
diff --git a/deps/npm/man/man1/npm.1 b/deps/npm/man/man1/npm.1
index f4b65cece..6e9a40cb9 100644
--- a/deps/npm/man/man1/npm.1
+++ b/deps/npm/man/man1/npm.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM" "1" "August 2012" "" ""
+.TH "NPM" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm\fR \-\- node package manager
@@ -14,7 +14,7 @@ npm <command> [args]
.fi
.
.SH "VERSION"
-1.1.59
+1.1.61
.
.SH "DESCRIPTION"
npm is the package manager for the Node JavaScript platform\. It puts
diff --git a/deps/npm/man/man1/outdated.1 b/deps/npm/man/man1/outdated.1
index fffd7a485..f7d330b60 100644
--- a/deps/npm/man/man1/outdated.1
+++ b/deps/npm/man/man1/outdated.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-OUTDATED" "1" "August 2012" "" ""
+.TH "NPM\-OUTDATED" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-outdated\fR \-\- Check for outdated packages
diff --git a/deps/npm/man/man1/owner.1 b/deps/npm/man/man1/owner.1
index 76d79b40c..8ab9519e6 100644
--- a/deps/npm/man/man1/owner.1
+++ b/deps/npm/man/man1/owner.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-OWNER" "1" "August 2012" "" ""
+.TH "NPM\-OWNER" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-owner\fR \-\- Manage package owners
diff --git a/deps/npm/man/man1/pack.1 b/deps/npm/man/man1/pack.1
index 456c9a295..e82fd0a93 100644
--- a/deps/npm/man/man1/pack.1
+++ b/deps/npm/man/man1/pack.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-PACK" "1" "August 2012" "" ""
+.TH "NPM\-PACK" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-pack\fR \-\- Create a tarball from a package
diff --git a/deps/npm/man/man1/prefix.1 b/deps/npm/man/man1/prefix.1
index 79ec1bce7..76e115f20 100644
--- a/deps/npm/man/man1/prefix.1
+++ b/deps/npm/man/man1/prefix.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-PREFIX" "1" "August 2012" "" ""
+.TH "NPM\-PREFIX" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-prefix\fR \-\- Display prefix
diff --git a/deps/npm/man/man1/prune.1 b/deps/npm/man/man1/prune.1
index 5f10fc77a..cd0c0eb61 100644
--- a/deps/npm/man/man1/prune.1
+++ b/deps/npm/man/man1/prune.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-PRUNE" "1" "August 2012" "" ""
+.TH "NPM\-PRUNE" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-prune\fR \-\- Remove extraneous packages
diff --git a/deps/npm/man/man1/publish.1 b/deps/npm/man/man1/publish.1
index c35bcacae..a37dec978 100644
--- a/deps/npm/man/man1/publish.1
+++ b/deps/npm/man/man1/publish.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-PUBLISH" "1" "August 2012" "" ""
+.TH "NPM\-PUBLISH" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-publish\fR \-\- Publish a package
diff --git a/deps/npm/man/man1/rebuild.1 b/deps/npm/man/man1/rebuild.1
index 481084769..ffa3cfa39 100644
--- a/deps/npm/man/man1/rebuild.1
+++ b/deps/npm/man/man1/rebuild.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-REBUILD" "1" "August 2012" "" ""
+.TH "NPM\-REBUILD" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-rebuild\fR \-\- Rebuild a package
diff --git a/deps/npm/man/man1/registry.1 b/deps/npm/man/man1/registry.1
index 0565e8f2f..b622aab08 100644
--- a/deps/npm/man/man1/registry.1
+++ b/deps/npm/man/man1/registry.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-REGISTRY" "1" "August 2012" "" ""
+.TH "NPM\-REGISTRY" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-registry\fR \-\- The JavaScript Package Registry
diff --git a/deps/npm/man/man1/removing-npm.1 b/deps/npm/man/man1/removing-npm.1
index f65afb32a..3ee511bc8 100644
--- a/deps/npm/man/man1/removing-npm.1
+++ b/deps/npm/man/man1/removing-npm.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-REMOVAL" "1" "August 2012" "" ""
+.TH "NPM\-REMOVAL" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-removal\fR \-\- Cleaning the Slate
diff --git a/deps/npm/man/man1/restart.1 b/deps/npm/man/man1/restart.1
index 527d98eea..10d6f7725 100644
--- a/deps/npm/man/man1/restart.1
+++ b/deps/npm/man/man1/restart.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-RESTART" "1" "August 2012" "" ""
+.TH "NPM\-RESTART" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-restart\fR \-\- Start a package
diff --git a/deps/npm/man/man1/root.1 b/deps/npm/man/man1/root.1
index 2f23daec8..0164dc475 100644
--- a/deps/npm/man/man1/root.1
+++ b/deps/npm/man/man1/root.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-ROOT" "1" "August 2012" "" ""
+.TH "NPM\-ROOT" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-root\fR \-\- Display npm root
diff --git a/deps/npm/man/man1/run-script.1 b/deps/npm/man/man1/run-script.1
index 0c9c7a58d..d95da7cc5 100644
--- a/deps/npm/man/man1/run-script.1
+++ b/deps/npm/man/man1/run-script.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-RUN\-SCRIPT" "1" "August 2012" "" ""
+.TH "NPM\-RUN\-SCRIPT" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-run-script\fR \-\- Run arbitrary package scripts
diff --git a/deps/npm/man/man1/scripts.1 b/deps/npm/man/man1/scripts.1
index 519c6785f..51f4fe78a 100644
--- a/deps/npm/man/man1/scripts.1
+++ b/deps/npm/man/man1/scripts.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-SCRIPTS" "1" "August 2012" "" ""
+.TH "NPM\-SCRIPTS" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-scripts\fR \-\- How npm handles the "scripts" field
diff --git a/deps/npm/man/man1/search.1 b/deps/npm/man/man1/search.1
index 6f12c7559..f06b97e5e 100644
--- a/deps/npm/man/man1/search.1
+++ b/deps/npm/man/man1/search.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-SEARCH" "1" "August 2012" "" ""
+.TH "NPM\-SEARCH" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-search\fR \-\- Search for packages
diff --git a/deps/npm/man/man1/semver.1 b/deps/npm/man/man1/semver.1
index 61d82930a..66178db23 100644
--- a/deps/npm/man/man1/semver.1
+++ b/deps/npm/man/man1/semver.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-SEMVER" "1" "August 2012" "" ""
+.TH "NPM\-SEMVER" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-semver\fR \-\- The semantic versioner for npm
diff --git a/deps/npm/man/man1/shrinkwrap.1 b/deps/npm/man/man1/shrinkwrap.1
index 0180b1754..d99386ff8 100644
--- a/deps/npm/man/man1/shrinkwrap.1
+++ b/deps/npm/man/man1/shrinkwrap.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-SHRINKWRAP" "1" "August 2012" "" ""
+.TH "NPM\-SHRINKWRAP" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-shrinkwrap\fR \-\- Lock down dependency versions
diff --git a/deps/npm/man/man1/star.1 b/deps/npm/man/man1/star.1
index 2d76c505e..ef387e4d8 100644
--- a/deps/npm/man/man1/star.1
+++ b/deps/npm/man/man1/star.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-STAR" "1" "August 2012" "" ""
+.TH "NPM\-STAR" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-star\fR \-\- Mark your favorite packages
diff --git a/deps/npm/man/man1/start.1 b/deps/npm/man/man1/start.1
index d2caf6ea9..17d0c5cbe 100644
--- a/deps/npm/man/man1/start.1
+++ b/deps/npm/man/man1/start.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-START" "1" "August 2012" "" ""
+.TH "NPM\-START" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-start\fR \-\- Start a package
diff --git a/deps/npm/man/man1/stop.1 b/deps/npm/man/man1/stop.1
index 5d8a7c5ba..95692f857 100644
--- a/deps/npm/man/man1/stop.1
+++ b/deps/npm/man/man1/stop.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-STOP" "1" "August 2012" "" ""
+.TH "NPM\-STOP" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-stop\fR \-\- Stop a package
diff --git a/deps/npm/man/man1/submodule.1 b/deps/npm/man/man1/submodule.1
index 39610e73d..1a6d823dc 100644
--- a/deps/npm/man/man1/submodule.1
+++ b/deps/npm/man/man1/submodule.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-SUBMODULE" "1" "August 2012" "" ""
+.TH "NPM\-SUBMODULE" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-submodule\fR \-\- Add a package as a git submodule
diff --git a/deps/npm/man/man1/tag.1 b/deps/npm/man/man1/tag.1
index 5ebc3cea8..0266e3018 100644
--- a/deps/npm/man/man1/tag.1
+++ b/deps/npm/man/man1/tag.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-TAG" "1" "August 2012" "" ""
+.TH "NPM\-TAG" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-tag\fR \-\- Tag a published version
diff --git a/deps/npm/man/man1/test.1 b/deps/npm/man/man1/test.1
index 61cc2c486..43e6a3e40 100644
--- a/deps/npm/man/man1/test.1
+++ b/deps/npm/man/man1/test.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-TEST" "1" "August 2012" "" ""
+.TH "NPM\-TEST" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-test\fR \-\- Test a package
diff --git a/deps/npm/man/man1/uninstall.1 b/deps/npm/man/man1/uninstall.1
index 75397946a..25725cec3 100644
--- a/deps/npm/man/man1/uninstall.1
+++ b/deps/npm/man/man1/uninstall.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-RM" "1" "August 2012" "" ""
+.TH "NPM\-RM" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-rm\fR \-\- Remove a package
diff --git a/deps/npm/man/man1/unpublish.1 b/deps/npm/man/man1/unpublish.1
index d22e7ff74..04085c174 100644
--- a/deps/npm/man/man1/unpublish.1
+++ b/deps/npm/man/man1/unpublish.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-UNPUBLISH" "1" "August 2012" "" ""
+.TH "NPM\-UNPUBLISH" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-unpublish\fR \-\- Remove a package from the registry
diff --git a/deps/npm/man/man1/update.1 b/deps/npm/man/man1/update.1
index df947c1ab..23816c8ff 100644
--- a/deps/npm/man/man1/update.1
+++ b/deps/npm/man/man1/update.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-UPDATE" "1" "August 2012" "" ""
+.TH "NPM\-UPDATE" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-update\fR \-\- Update a package
diff --git a/deps/npm/man/man1/version.1 b/deps/npm/man/man1/version.1
index 1460c3259..4635b7357 100644
--- a/deps/npm/man/man1/version.1
+++ b/deps/npm/man/man1/version.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-VERSION" "1" "August 2012" "" ""
+.TH "NPM\-VERSION" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-version\fR \-\- Bump a package version
diff --git a/deps/npm/man/man1/view.1 b/deps/npm/man/man1/view.1
index 163717536..9ca57d5fc 100644
--- a/deps/npm/man/man1/view.1
+++ b/deps/npm/man/man1/view.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-VIEW" "1" "August 2012" "" ""
+.TH "NPM\-VIEW" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-view\fR \-\- View registry info
diff --git a/deps/npm/man/man1/whoami.1 b/deps/npm/man/man1/whoami.1
index 63dab5f6c..c6a83eeb9 100644
--- a/deps/npm/man/man1/whoami.1
+++ b/deps/npm/man/man1/whoami.1
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-WHOAMI" "1" "August 2012" "" ""
+.TH "NPM\-WHOAMI" "1" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-whoami\fR \-\- Display npm username
diff --git a/deps/npm/man/man3/bin.3 b/deps/npm/man/man3/bin.3
index eac7c2c3e..6f7acba35 100644
--- a/deps/npm/man/man3/bin.3
+++ b/deps/npm/man/man3/bin.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-BIN" "3" "August 2012" "" ""
+.TH "NPM\-BIN" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-bin\fR \-\- Display npm bin folder
diff --git a/deps/npm/man/man3/bugs.3 b/deps/npm/man/man3/bugs.3
index 1dad6a1be..92d83cd5f 100644
--- a/deps/npm/man/man3/bugs.3
+++ b/deps/npm/man/man3/bugs.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-BUGS" "3" "August 2012" "" ""
+.TH "NPM\-BUGS" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-bugs\fR \-\- Bugs for a package in a web browser maybe
diff --git a/deps/npm/man/man3/commands.3 b/deps/npm/man/man3/commands.3
index 584855de2..25c729a43 100644
--- a/deps/npm/man/man3/commands.3
+++ b/deps/npm/man/man3/commands.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-COMMANDS" "3" "August 2012" "" ""
+.TH "NPM\-COMMANDS" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-commands\fR \-\- npm commands
diff --git a/deps/npm/man/man3/config.3 b/deps/npm/man/man3/config.3
index bdbea195c..0275e71f2 100644
--- a/deps/npm/man/man3/config.3
+++ b/deps/npm/man/man3/config.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-CONFIG" "3" "August 2012" "" ""
+.TH "NPM\-CONFIG" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-config\fR \-\- Manage the npm configuration files
diff --git a/deps/npm/man/man3/deprecate.3 b/deps/npm/man/man3/deprecate.3
index f26639f93..5c014a1bf 100644
--- a/deps/npm/man/man3/deprecate.3
+++ b/deps/npm/man/man3/deprecate.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-DEPRECATE" "3" "August 2012" "" ""
+.TH "NPM\-DEPRECATE" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-deprecate\fR \-\- Deprecate a version of a package
diff --git a/deps/npm/man/man3/docs.3 b/deps/npm/man/man3/docs.3
index 75fbaeac5..fc19c235e 100644
--- a/deps/npm/man/man3/docs.3
+++ b/deps/npm/man/man3/docs.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-DOCS" "3" "August 2012" "" ""
+.TH "NPM\-DOCS" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-docs\fR \-\- Docs for a package in a web browser maybe
diff --git a/deps/npm/man/man3/edit.3 b/deps/npm/man/man3/edit.3
index 9d1d0fa5c..893335b63 100644
--- a/deps/npm/man/man3/edit.3
+++ b/deps/npm/man/man3/edit.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-EDIT" "3" "August 2012" "" ""
+.TH "NPM\-EDIT" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-edit\fR \-\- Edit an installed package
diff --git a/deps/npm/man/man3/explore.3 b/deps/npm/man/man3/explore.3
index a220a2702..39c5b6ef9 100644
--- a/deps/npm/man/man3/explore.3
+++ b/deps/npm/man/man3/explore.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-EXPLORE" "3" "August 2012" "" ""
+.TH "NPM\-EXPLORE" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-explore\fR \-\- Browse an installed package
diff --git a/deps/npm/man/man3/help-search.3 b/deps/npm/man/man3/help-search.3
index 068f44acc..b7e556d47 100644
--- a/deps/npm/man/man3/help-search.3
+++ b/deps/npm/man/man3/help-search.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-HELP\-SEARCH" "3" "August 2012" "" ""
+.TH "NPM\-HELP\-SEARCH" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-help-search\fR \-\- Search the help pages
diff --git a/deps/npm/man/man3/init.3 b/deps/npm/man/man3/init.3
index 203c6e744..0c8bf73de 100644
--- a/deps/npm/man/man3/init.3
+++ b/deps/npm/man/man3/init.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "INIT" "3" "August 2012" "" ""
+.TH "INIT" "3" "September 2012" "" ""
.
.SH "NAME"
\fBinit\fR \-\- Interactively create a package\.json file
diff --git a/deps/npm/man/man3/install.3 b/deps/npm/man/man3/install.3
index 9169bc5d9..4ef30d048 100644
--- a/deps/npm/man/man3/install.3
+++ b/deps/npm/man/man3/install.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-INSTALL" "3" "August 2012" "" ""
+.TH "NPM\-INSTALL" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-install\fR \-\- install a package programmatically
diff --git a/deps/npm/man/man3/link.3 b/deps/npm/man/man3/link.3
index 42ada4043..95453461d 100644
--- a/deps/npm/man/man3/link.3
+++ b/deps/npm/man/man3/link.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-LINK" "3" "August 2012" "" ""
+.TH "NPM\-LINK" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-link\fR \-\- Symlink a package folder
diff --git a/deps/npm/man/man3/load.3 b/deps/npm/man/man3/load.3
index 506b67af7..a6f2fdb86 100644
--- a/deps/npm/man/man3/load.3
+++ b/deps/npm/man/man3/load.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-LOAD" "3" "August 2012" "" ""
+.TH "NPM\-LOAD" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-load\fR \-\- Load config settings
diff --git a/deps/npm/man/man3/ls.3 b/deps/npm/man/man3/ls.3
index 8b49137fd..7171b0bd4 100644
--- a/deps/npm/man/man3/ls.3
+++ b/deps/npm/man/man3/ls.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-LS" "3" "August 2012" "" ""
+.TH "NPM\-LS" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-ls\fR \-\- List installed packages
diff --git a/deps/npm/man/man3/npm.3 b/deps/npm/man/man3/npm.3
index 7c8a52870..a4b0daf85 100644
--- a/deps/npm/man/man3/npm.3
+++ b/deps/npm/man/man3/npm.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM" "3" "August 2012" "" ""
+.TH "NPM" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm\fR \-\- node package manager
@@ -21,7 +21,7 @@ npm\.load(configObject, function (er, npm) {
.fi
.
.SH "VERSION"
-1.1.59
+1.1.61
.
.SH "DESCRIPTION"
This is the API documentation for npm\.
diff --git a/deps/npm/man/man3/outdated.3 b/deps/npm/man/man3/outdated.3
index e4893c22a..cba4b8dc9 100644
--- a/deps/npm/man/man3/outdated.3
+++ b/deps/npm/man/man3/outdated.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-OUTDATED" "3" "August 2012" "" ""
+.TH "NPM\-OUTDATED" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-outdated\fR \-\- Check for outdated packages
diff --git a/deps/npm/man/man3/owner.3 b/deps/npm/man/man3/owner.3
index a4d8f420f..32d10941d 100644
--- a/deps/npm/man/man3/owner.3
+++ b/deps/npm/man/man3/owner.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-OWNER" "3" "August 2012" "" ""
+.TH "NPM\-OWNER" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-owner\fR \-\- Manage package owners
diff --git a/deps/npm/man/man3/pack.3 b/deps/npm/man/man3/pack.3
index 326308ee1..04a167bb0 100644
--- a/deps/npm/man/man3/pack.3
+++ b/deps/npm/man/man3/pack.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-PACK" "3" "August 2012" "" ""
+.TH "NPM\-PACK" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-pack\fR \-\- Create a tarball from a package
diff --git a/deps/npm/man/man3/prefix.3 b/deps/npm/man/man3/prefix.3
index 474937e41..d40a1bdd1 100644
--- a/deps/npm/man/man3/prefix.3
+++ b/deps/npm/man/man3/prefix.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-PREFIX" "3" "August 2012" "" ""
+.TH "NPM\-PREFIX" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-prefix\fR \-\- Display prefix
diff --git a/deps/npm/man/man3/prune.3 b/deps/npm/man/man3/prune.3
index bf2cf649c..63130a96f 100644
--- a/deps/npm/man/man3/prune.3
+++ b/deps/npm/man/man3/prune.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-PRUNE" "3" "August 2012" "" ""
+.TH "NPM\-PRUNE" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-prune\fR \-\- Remove extraneous packages
diff --git a/deps/npm/man/man3/publish.3 b/deps/npm/man/man3/publish.3
index 873221a0e..d89f2fa73 100644
--- a/deps/npm/man/man3/publish.3
+++ b/deps/npm/man/man3/publish.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-PUBLISH" "3" "August 2012" "" ""
+.TH "NPM\-PUBLISH" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-publish\fR \-\- Publish a package
diff --git a/deps/npm/man/man3/rebuild.3 b/deps/npm/man/man3/rebuild.3
index 070fd3d44..b963f9716 100644
--- a/deps/npm/man/man3/rebuild.3
+++ b/deps/npm/man/man3/rebuild.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-REBUILD" "3" "August 2012" "" ""
+.TH "NPM\-REBUILD" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-rebuild\fR \-\- Rebuild a package
diff --git a/deps/npm/man/man3/restart.3 b/deps/npm/man/man3/restart.3
index c459c2eee..aa6603365 100644
--- a/deps/npm/man/man3/restart.3
+++ b/deps/npm/man/man3/restart.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-RESTART" "3" "August 2012" "" ""
+.TH "NPM\-RESTART" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-restart\fR \-\- Start a package
diff --git a/deps/npm/man/man3/root.3 b/deps/npm/man/man3/root.3
index 1095a31fa..f3110165c 100644
--- a/deps/npm/man/man3/root.3
+++ b/deps/npm/man/man3/root.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-ROOT" "3" "August 2012" "" ""
+.TH "NPM\-ROOT" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-root\fR \-\- Display npm root
diff --git a/deps/npm/man/man3/run-script.3 b/deps/npm/man/man3/run-script.3
index 0a0c81d89..41fe3021d 100644
--- a/deps/npm/man/man3/run-script.3
+++ b/deps/npm/man/man3/run-script.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-RUN\-SCRIPT" "3" "August 2012" "" ""
+.TH "NPM\-RUN\-SCRIPT" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-run-script\fR \-\- Run arbitrary package scripts
diff --git a/deps/npm/man/man3/search.3 b/deps/npm/man/man3/search.3
index 3cb5b74fc..8d924c8a6 100644
--- a/deps/npm/man/man3/search.3
+++ b/deps/npm/man/man3/search.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-SEARCH" "3" "August 2012" "" ""
+.TH "NPM\-SEARCH" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-search\fR \-\- Search for packages
diff --git a/deps/npm/man/man3/shrinkwrap.3 b/deps/npm/man/man3/shrinkwrap.3
index 9c3de75a9..40fa2b0da 100644
--- a/deps/npm/man/man3/shrinkwrap.3
+++ b/deps/npm/man/man3/shrinkwrap.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-SHRINKWRAP" "3" "August 2012" "" ""
+.TH "NPM\-SHRINKWRAP" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-shrinkwrap\fR \-\- programmatically generate package shrinkwrap file
diff --git a/deps/npm/man/man3/start.3 b/deps/npm/man/man3/start.3
index d3afc9b2d..a52559400 100644
--- a/deps/npm/man/man3/start.3
+++ b/deps/npm/man/man3/start.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-START" "3" "August 2012" "" ""
+.TH "NPM\-START" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-start\fR \-\- Start a package
diff --git a/deps/npm/man/man3/stop.3 b/deps/npm/man/man3/stop.3
index 1109eec8d..78ee56ccc 100644
--- a/deps/npm/man/man3/stop.3
+++ b/deps/npm/man/man3/stop.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-STOP" "3" "August 2012" "" ""
+.TH "NPM\-STOP" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-stop\fR \-\- Stop a package
diff --git a/deps/npm/man/man3/submodule.3 b/deps/npm/man/man3/submodule.3
index 460f2435b..599f0cdb0 100644
--- a/deps/npm/man/man3/submodule.3
+++ b/deps/npm/man/man3/submodule.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-SUBMODULE" "3" "August 2012" "" ""
+.TH "NPM\-SUBMODULE" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-submodule\fR \-\- Add a package as a git submodule
diff --git a/deps/npm/man/man3/tag.3 b/deps/npm/man/man3/tag.3
index 93191e1d4..ca82cae4b 100644
--- a/deps/npm/man/man3/tag.3
+++ b/deps/npm/man/man3/tag.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-TAG" "3" "August 2012" "" ""
+.TH "NPM\-TAG" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-tag\fR \-\- Tag a published version
diff --git a/deps/npm/man/man3/test.3 b/deps/npm/man/man3/test.3
index 1fee32dcc..29bcfe70d 100644
--- a/deps/npm/man/man3/test.3
+++ b/deps/npm/man/man3/test.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-TEST" "3" "August 2012" "" ""
+.TH "NPM\-TEST" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-test\fR \-\- Test a package
diff --git a/deps/npm/man/man3/uninstall.3 b/deps/npm/man/man3/uninstall.3
index 82e5f1f36..8dad52895 100644
--- a/deps/npm/man/man3/uninstall.3
+++ b/deps/npm/man/man3/uninstall.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-UNINSTALL" "3" "August 2012" "" ""
+.TH "NPM\-UNINSTALL" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-uninstall\fR \-\- uninstall a package programmatically
diff --git a/deps/npm/man/man3/unpublish.3 b/deps/npm/man/man3/unpublish.3
index 47ae167a2..3a8ce27ce 100644
--- a/deps/npm/man/man3/unpublish.3
+++ b/deps/npm/man/man3/unpublish.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-UNPUBLISH" "3" "August 2012" "" ""
+.TH "NPM\-UNPUBLISH" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-unpublish\fR \-\- Remove a package from the registry
diff --git a/deps/npm/man/man3/update.3 b/deps/npm/man/man3/update.3
index 0d0666797..7fb273be5 100644
--- a/deps/npm/man/man3/update.3
+++ b/deps/npm/man/man3/update.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-UPDATE" "3" "August 2012" "" ""
+.TH "NPM\-UPDATE" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-update\fR \-\- Update a package
diff --git a/deps/npm/man/man3/version.3 b/deps/npm/man/man3/version.3
index c4242764d..51c4d64b6 100644
--- a/deps/npm/man/man3/version.3
+++ b/deps/npm/man/man3/version.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-VERSION" "3" "August 2012" "" ""
+.TH "NPM\-VERSION" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-version\fR \-\- Bump a package version
diff --git a/deps/npm/man/man3/view.3 b/deps/npm/man/man3/view.3
index eb66113af..48aa614c0 100644
--- a/deps/npm/man/man3/view.3
+++ b/deps/npm/man/man3/view.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-VIEW" "3" "August 2012" "" ""
+.TH "NPM\-VIEW" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-view\fR \-\- View registry info
diff --git a/deps/npm/man/man3/whoami.3 b/deps/npm/man/man3/whoami.3
index 560f94d98..bf92a1dcb 100644
--- a/deps/npm/man/man3/whoami.3
+++ b/deps/npm/man/man3/whoami.3
@@ -1,7 +1,7 @@
.\" Generated with Ronnjs 0.3.8
.\" http://github.com/kapouer/ronnjs/
.
-.TH "NPM\-WHOAMI" "3" "August 2012" "" ""
+.TH "NPM\-WHOAMI" "3" "September 2012" "" ""
.
.SH "NAME"
\fBnpm-whoami\fR \-\- Display npm username
diff --git a/deps/npm/node_modules/fstream-npm/fstream-npm.js b/deps/npm/node_modules/fstream-npm/fstream-npm.js
index 5678347b0..a1929a43b 100644
--- a/deps/npm/node_modules/fstream-npm/fstream-npm.js
+++ b/deps/npm/node_modules/fstream-npm/fstream-npm.js
@@ -136,6 +136,7 @@ Packer.prototype.applyIgnores = function (entry, partial, entryObj) {
// if this entry has already been bundled, and is a symlink,
// and it is the *same* symlink as this one, then exclude it.
if (pp && pp.bundleLinks && this.bundleLinks &&
+ pp.bundleLinks[entry] &&
pp.bundleLinks[entry] === this.bundleLinks[entry]) {
return false
}
diff --git a/deps/npm/node_modules/fstream-npm/package.json b/deps/npm/node_modules/fstream-npm/package.json
index edb192248..993175c0d 100644
--- a/deps/npm/node_modules/fstream-npm/package.json
+++ b/deps/npm/node_modules/fstream-npm/package.json
@@ -6,7 +6,7 @@
},
"name": "fstream-npm",
"description": "fstream class for creating npm packages",
- "version": "0.1.1",
+ "version": "0.1.2",
"repository": {
"type": "git",
"url": "git://github.com/isaacs/fstream-npm.git"
@@ -18,6 +18,6 @@
},
"license": "BSD",
"readme": "# fstream-npm\n\nThis is an fstream DirReader class that will read a directory and filter\nthings according to the semantics of what goes in an npm package.\n\nFor example:\n\n```javascript\n// This will print out all the files that would be included\n// by 'npm publish' or 'npm install' of this directory.\n\nvar FN = require(\"fstream-npm\")\nFN({ path: \"./\" })\n .on(\"child\", function (e) {\n console.error(e.path.substr(e.root.path.length + 1))\n })\n```\n\n",
- "_id": "fstream-npm@0.1.1",
+ "_id": "fstream-npm@0.1.2",
"_from": "fstream-npm@0.1"
}
diff --git a/deps/npm/node_modules/fstream/examples/filter-pipe.js b/deps/npm/node_modules/fstream/examples/filter-pipe.js
new file mode 100644
index 000000000..c6b55b3e0
--- /dev/null
+++ b/deps/npm/node_modules/fstream/examples/filter-pipe.js
@@ -0,0 +1,131 @@
+var fstream = require("../fstream.js")
+var path = require("path")
+
+var r = fstream.Reader({ path: path.dirname(__dirname)
+ , filter: function () {
+ return !this.basename.match(/^\./) &&
+ !this.basename.match(/^node_modules$/)
+ !this.basename.match(/^deep-copy$/)
+ !this.basename.match(/^filter-copy$/)
+ }
+ })
+
+// this writer will only write directories
+var w = fstream.Writer({ path: path.resolve(__dirname, "filter-copy")
+ , type: "Directory"
+ , filter: function () {
+ return this.type === "Directory"
+ }
+ })
+
+var indent = ""
+var escape = {}
+
+r.on("entry", appears)
+r.on("ready", function () {
+ console.error("ready to begin!", r.path)
+})
+
+function appears (entry) {
+ console.error(indent + "a %s appears!", entry.type, entry.basename, typeof entry.basename)
+ if (foggy) {
+ console.error("FOGGY!")
+ var p = entry
+ do {
+ console.error(p.depth, p.path, p._paused)
+ } while (p = p.parent)
+
+ throw new Error("\033[mshould not have entries while foggy")
+ }
+ indent += "\t"
+ entry.on("data", missile(entry))
+ entry.on("end", runaway(entry))
+ entry.on("entry", appears)
+}
+
+var foggy
+function missile (entry) {
+ if (entry.type === "Directory") {
+ var ended = false
+ entry.once("end", function () { ended = true })
+ return function (c) {
+ // throw in some pathological pause()/resume() behavior
+ // just for extra fun.
+ process.nextTick(function () {
+ if (!foggy && !ended) { // && Math.random() < 0.3) {
+ console.error(indent +"%s casts a spell", entry.basename)
+ console.error("\na slowing fog comes over the battlefield...\n\033[32m")
+ entry.pause()
+ entry.once("resume", liftFog)
+ foggy = setTimeout(liftFog, 1000)
+
+ function liftFog (who) {
+ if (!foggy) return
+ if (who) {
+ console.error("%s breaks the spell!", who && who.path)
+ } else {
+ console.error("the spell expires!")
+ }
+ console.error("\033[mthe fog lifts!\n")
+ clearTimeout(foggy)
+ foggy = null
+ if (entry._paused) entry.resume()
+ }
+
+ }
+ })
+ }
+ }
+
+ return function (c) {
+ var e = Math.random() < 0.5
+ console.error(indent + "%s %s for %d damage!",
+ entry.basename,
+ e ? "is struck" : "fires a chunk",
+ c.length)
+ }
+}
+
+function runaway (entry) { return function () {
+ var e = Math.random() < 0.5
+ console.error(indent + "%s %s",
+ entry.basename,
+ e ? "turns to flee" : "is vanquished!")
+ indent = indent.slice(0, -1)
+}}
+
+
+w.on("entry", attacks)
+//w.on("ready", function () { attacks(w) })
+function attacks (entry) {
+ console.error(indent + "%s %s!", entry.basename,
+ entry.type === "Directory" ? "calls for backup" : "attacks")
+ entry.on("entry", attacks)
+}
+
+ended = false
+var i = 1
+r.on("end", function () {
+ if (foggy) clearTimeout(foggy)
+ console.error("\033[mIT'S OVER!!")
+ console.error("A WINNAR IS YOU!")
+
+ console.log("ok " + (i ++) + " A WINNAR IS YOU")
+ ended = true
+ // now go through and verify that everything in there is a dir.
+ var p = path.resolve(__dirname, "filter-copy")
+ var checker = fstream.Reader({ path: p })
+ checker.checker = true
+ checker.on("child", function (e) {
+ var ok = e.type === "Directory"
+ console.log((ok ? "" : "not ") + "ok " + (i ++) +
+ " should be a dir: " +
+ e.path.substr(checker.path.length + 1))
+ })
+})
+
+process.on("exit", function () {
+ console.log((ended ? "" : "not ") + "ok " + (i ++) + " ended")
+})
+
+r.pipe(w)
diff --git a/deps/npm/node_modules/fstream/examples/pipe.js b/deps/npm/node_modules/fstream/examples/pipe.js
new file mode 100644
index 000000000..648ec8493
--- /dev/null
+++ b/deps/npm/node_modules/fstream/examples/pipe.js
@@ -0,0 +1,115 @@
+var fstream = require("../fstream.js")
+var path = require("path")
+
+var r = fstream.Reader({ path: path.dirname(__dirname)
+ , filter: function () {
+ return !this.basename.match(/^\./) &&
+ !this.basename.match(/^node_modules$/)
+ !this.basename.match(/^deep-copy$/)
+ }
+ })
+
+var w = fstream.Writer({ path: path.resolve(__dirname, "deep-copy")
+ , type: "Directory"
+ })
+
+var indent = ""
+var escape = {}
+
+r.on("entry", appears)
+r.on("ready", function () {
+ console.error("ready to begin!", r.path)
+})
+
+function appears (entry) {
+ console.error(indent + "a %s appears!", entry.type, entry.basename, typeof entry.basename, entry)
+ if (foggy) {
+ console.error("FOGGY!")
+ var p = entry
+ do {
+ console.error(p.depth, p.path, p._paused)
+ } while (p = p.parent)
+
+ throw new Error("\033[mshould not have entries while foggy")
+ }
+ indent += "\t"
+ entry.on("data", missile(entry))
+ entry.on("end", runaway(entry))
+ entry.on("entry", appears)
+}
+
+var foggy
+function missile (entry) {
+ if (entry.type === "Directory") {
+ var ended = false
+ entry.once("end", function () { ended = true })
+ return function (c) {
+ // throw in some pathological pause()/resume() behavior
+ // just for extra fun.
+ process.nextTick(function () {
+ if (!foggy && !ended) { // && Math.random() < 0.3) {
+ console.error(indent +"%s casts a spell", entry.basename)
+ console.error("\na slowing fog comes over the battlefield...\n\033[32m")
+ entry.pause()
+ entry.once("resume", liftFog)
+ foggy = setTimeout(liftFog, 10)
+
+ function liftFog (who) {
+ if (!foggy) return
+ if (who) {
+ console.error("%s breaks the spell!", who && who.path)
+ } else {
+ console.error("the spell expires!")
+ }
+ console.error("\033[mthe fog lifts!\n")
+ clearTimeout(foggy)
+ foggy = null
+ if (entry._paused) entry.resume()
+ }
+
+ }
+ })
+ }
+ }
+
+ return function (c) {
+ var e = Math.random() < 0.5
+ console.error(indent + "%s %s for %d damage!",
+ entry.basename,
+ e ? "is struck" : "fires a chunk",
+ c.length)
+ }
+}
+
+function runaway (entry) { return function () {
+ var e = Math.random() < 0.5
+ console.error(indent + "%s %s",
+ entry.basename,
+ e ? "turns to flee" : "is vanquished!")
+ indent = indent.slice(0, -1)
+}}
+
+
+w.on("entry", attacks)
+//w.on("ready", function () { attacks(w) })
+function attacks (entry) {
+ console.error(indent + "%s %s!", entry.basename,
+ entry.type === "Directory" ? "calls for backup" : "attacks")
+ entry.on("entry", attacks)
+}
+
+ended = false
+r.on("end", function () {
+ if (foggy) clearTimeout(foggy)
+ console.error("\033[mIT'S OVER!!")
+ console.error("A WINNAR IS YOU!")
+
+ console.log("ok 1 A WINNAR IS YOU")
+ ended = true
+})
+
+process.on("exit", function () {
+ console.log((ended ? "" : "not ") + "ok 2 ended")
+})
+
+r.pipe(w)
diff --git a/deps/npm/node_modules/fstream/examples/reader.js b/deps/npm/node_modules/fstream/examples/reader.js
new file mode 100644
index 000000000..9aa1a9538
--- /dev/null
+++ b/deps/npm/node_modules/fstream/examples/reader.js
@@ -0,0 +1,54 @@
+var fstream = require("../fstream.js")
+var tap = require("tap")
+var fs = require("fs")
+var path = require("path")
+var children = -1
+var dir = path.dirname(__dirname)
+
+var gotReady = false
+var ended = false
+
+tap.test("reader test", function (t) {
+
+ var r = fstream.Reader({ path: dir
+ , filter: function () {
+ // return this.parent === r
+ return this.parent === r || this === r
+ }
+ })
+
+ r.on("ready", function () {
+ gotReady = true
+ children = fs.readdirSync(dir).length
+ console.error("Setting expected children to "+children)
+ t.equal(r.type, "Directory", "should be a directory")
+ })
+
+ r.on("entry", function (entry) {
+ children --
+ if (!gotReady) {
+ t.fail("children before ready!")
+ }
+ t.equal(entry.dirname, r.path, "basename is parent dir")
+ })
+
+ r.on("error", function (er) {
+ t.fail(er)
+ t.end()
+ process.exit(1)
+ })
+
+ r.on("end", function () {
+ t.equal(children, 0, "should have seen all children")
+ ended = true
+ })
+
+ var closed = false
+ r.on("close", function () {
+ t.ok(ended, "saw end before close")
+ t.notOk(closed, "close should only happen once")
+ closed = true
+ t.end()
+ })
+
+})
diff --git a/deps/npm/node_modules/fstream/examples/symlink-write.js b/deps/npm/node_modules/fstream/examples/symlink-write.js
new file mode 100644
index 000000000..d7816d24d
--- /dev/null
+++ b/deps/npm/node_modules/fstream/examples/symlink-write.js
@@ -0,0 +1,24 @@
+var fstream = require("../fstream.js")
+ , closed = false
+
+fstream
+ .Writer({ path: "path/to/symlink"
+ , linkpath: "./file"
+ , isSymbolicLink: true
+ , mode: "0755" // octal strings supported
+ })
+ .on("close", function () {
+ closed = true
+ var fs = require("fs")
+ var s = fs.lstatSync("path/to/symlink")
+ var isSym = s.isSymbolicLink()
+ console.log((isSym?"":"not ") +"ok 1 should be symlink")
+ var t = fs.readlinkSync("path/to/symlink")
+ var isTarget = t === "./file"
+ console.log((isTarget?"":"not ") +"ok 2 should link to ./file")
+ })
+ .end()
+
+process.on("exit", function () {
+ console.log((closed?"":"not ")+"ok 3 should be closed")
+})
diff --git a/deps/npm/node_modules/fstream/lib/abstract.js b/deps/npm/node_modules/fstream/lib/abstract.js
index 5675d4a1b..11ef0e28f 100644
--- a/deps/npm/node_modules/fstream/lib/abstract.js
+++ b/deps/npm/node_modules/fstream/lib/abstract.js
@@ -54,9 +54,7 @@ Abstract.prototype.warn = function (msg, code) {
}
Abstract.prototype.info = function (msg, code) {
- var me = this
- if (!me.listeners("info")) return
- me.emit("info", msg, code)
+ this.emit("info", msg, code)
}
Abstract.prototype.error = function (msg, code, th) {
diff --git a/deps/npm/node_modules/fstream/lib/dir-reader.js b/deps/npm/node_modules/fstream/lib/dir-reader.js
index 6a418c0bc..dd9883b22 100644
--- a/deps/npm/node_modules/fstream/lib/dir-reader.js
+++ b/deps/npm/node_modules/fstream/lib/dir-reader.js
@@ -135,6 +135,7 @@ DirReader.prototype._read = function () {
if (entry._paused) entry.once("resume", function () {
me.emit("entryStat", entry, props)
})
+ else me.emit("entryStat", entry, props)
})
entry.on("ready", function EMITCHILD () {
diff --git a/deps/npm/node_modules/fstream/package.json b/deps/npm/node_modules/fstream/package.json
index 2be498e09..7091e17e1 100644
--- a/deps/npm/node_modules/fstream/package.json
+++ b/deps/npm/node_modules/fstream/package.json
@@ -6,7 +6,7 @@
},
"name": "fstream",
"description": "Advanced file system stream things",
- "version": "0.1.18",
+ "version": "0.1.19",
"repository": {
"type": "git",
"url": "git://github.com/isaacs/fstream.git"
@@ -28,15 +28,10 @@
"test": "tap examples/*.js"
},
"license": "BSD",
- "_npmUser": {
- "name": "isaacs",
- "email": "i@izs.me"
+ "readme": "Like FS streams, but with stat on them, and supporting directories and\nsymbolic links, as well as normal files. Also, you can use this to set\nthe stats on a file, even if you don't change its contents, or to create\na symlink, etc.\n\nSo, for example, you can \"write\" a directory, and it'll call `mkdir`. You\ncan specify a uid and gid, and it'll call `chown`. You can specify a\n`mtime` and `atime`, and it'll call `utimes`. You can call it a symlink\nand provide a `linkpath` and it'll call `symlink`.\n\nNote that it won't automatically resolve symbolic links. So, if you\ncall `fstream.Reader('/some/symlink')` then you'll get an object\nthat stats and then ends immediately (since it has no data). To follow\nsymbolic links, do this: `fstream.Reader({path:'/some/symlink', follow:\ntrue })`.\n\nThere are various checks to make sure that the bytes emitted are the\nsame as the intended size, if the size is set.\n\n## Examples\n\n```javascript\nfstream\n .Writer({ path: \"path/to/file\"\n , mode: 0755\n , size: 6\n })\n .write(\"hello\\n\")\n .end()\n```\n\nThis will create the directories if they're missing, and then write\n`hello\\n` into the file, chmod it to 0755, and assert that 6 bytes have\nbeen written when it's done.\n\n```javascript\nfstream\n .Writer({ path: \"path/to/file\"\n , mode: 0755\n , size: 6\n , flags: \"a\"\n })\n .write(\"hello\\n\")\n .end()\n```\n\nYou can pass flags in, if you want to append to a file.\n\n```javascript\nfstream\n .Writer({ path: \"path/to/symlink\"\n , linkpath: \"./file\"\n , SymbolicLink: true\n , mode: \"0755\" // octal strings supported\n })\n .end()\n```\n\nIf isSymbolicLink is a function, it'll be called, and if it returns\ntrue, then it'll treat it as a symlink. If it's not a function, then\nany truish value will make a symlink, or you can set `type:\n'SymbolicLink'`, which does the same thing.\n\nNote that the linkpath is relative to the symbolic link location, not\nthe parent dir or cwd.\n\n```javascript\nfstream\n .Reader(\"path/to/dir\")\n .pipe(fstream.Writer(\"path/to/other/dir\"))\n```\n\nThis will do like `cp -Rp path/to/dir path/to/other/dir`. If the other\ndir exists and isn't a directory, then it'll emit an error. It'll also\nset the uid, gid, mode, etc. to be identical. In this way, it's more\nlike `rsync -a` than simply a copy.\n",
+ "_id": "fstream@0.1.19",
+ "dist": {
+ "shasum": "0ff93e775ff9a6b847666e0241604c13093469c4"
},
- "_id": "fstream@0.1.18",
- "optionalDependencies": {},
- "_engineSupported": true,
- "_npmVersion": "1.1.13",
- "_nodeVersion": "v0.7.7-pre",
- "_defaultsLoaded": true,
- "_from": "fstream@~0.1.17"
+ "_from": "../fstream"
}
diff --git a/deps/npm/node_modules/lru-cache/AUTHORS b/deps/npm/node_modules/lru-cache/AUTHORS
index 82f1a6675..016d7fbe1 100644
--- a/deps/npm/node_modules/lru-cache/AUTHORS
+++ b/deps/npm/node_modules/lru-cache/AUTHORS
@@ -5,3 +5,4 @@ Marko Mikulicic <marko.mikulicic@isti.cnr.it>
Trent Mick <trentm@gmail.com>
Kevin O'Hara <kevinohara80@gmail.com>
Marco Rogers <marco.rogers@gmail.com>
+Jesse Dailey <jesse.dailey@gmail.com>
diff --git a/deps/npm/node_modules/lru-cache/lib/lru-cache.js b/deps/npm/node_modules/lru-cache/lib/lru-cache.js
index 27a9a5e93..8b6ed8c2e 100644
--- a/deps/npm/node_modules/lru-cache/lib/lru-cache.js
+++ b/deps/npm/node_modules/lru-cache/lib/lru-cache.js
@@ -172,7 +172,9 @@ function LRUCache (options) {
function lruWalk () {
// lru has been deleted, hop up to the next hit.
- lru = Object.keys(lruList)[0]
+ for (var key in lruList) {
+ return key
+ }
}
function trim () {
diff --git a/deps/npm/node_modules/lru-cache/package.json b/deps/npm/node_modules/lru-cache/package.json
index e2457f720..9428d83fb 100644
--- a/deps/npm/node_modules/lru-cache/package.json
+++ b/deps/npm/node_modules/lru-cache/package.json
@@ -1,7 +1,7 @@
{
"name": "lru-cache",
"description": "A cache object that deletes the least-recently-used items.",
- "version": "2.0.1",
+ "version": "2.0.2",
"author": {
"name": "Isaac Z. Schlueter",
"email": "i@izs.me"
@@ -45,12 +45,13 @@
{
"name": "Marco Rogers",
"email": "marco.rogers@gmail.com"
+ },
+ {
+ "name": "Jesse Dailey",
+ "email": "jesse.dailey@gmail.com"
}
],
"readme": "# lru cache\n\nA cache object that deletes the least-recently-used items.\n\n## Usage:\n\n```javascript\nvar LRU = require(\"lru-cache\")\n , options = { max: 500\n , length: function (n) { return n * 2 }\n , dispose: function (key, n) { n.close() }\n , maxAge: 1000 * 60 * 60 }\n , cache = LRU(options)\n , otherCache = LRU(50) // sets just the max size\n\ncache.set(\"key\", \"value\")\ncache.get(\"key\") // \"value\"\n\ncache.reset() // empty the cache\n```\n\nIf you put more stuff in it, then items will fall out.\n\nIf you try to put an oversized thing in it, then it'll fall out right\naway.\n\n## Options\n\n* `max` The maximum number of items. Not setting this is kind of\n silly, since that's the whole purpose of this lib, but it defaults\n to `Infinity`.\n* `maxAge` Maximum age in ms. Items are not pro-actively pruned out\n as they age, but if you try to get an item that is too old, it'll\n drop it and return undefined instead of giving it to you.\n* `length` Function that is used to calculate the length of stored\n items. If you're storing strings or buffers, then you probably want\n to do something like `function(n){return n.length}`. The default is\n `function(n){return 1}`, which is fine if you want to store `n`\n like-sized things.\n* `dispose` Function that is called on items when they are dropped\n from the cache. This can be handy if you want to close file\n descriptors or do other cleanup tasks when items are no longer\n accessible. Called with `key, value`. It's called *before*\n actually removing the item from the internal cache, so if you want\n to immediately put it back in, you'll have to do that in a\n `nextTick` or `setTimeout` callback or it won't do anything.\n",
- "_id": "lru-cache@2.0.1",
- "dist": {
- "shasum": "8cbbcca2f72b07e18510cb1451073cd4afab0826"
- },
- "_from": "lru-cache@2.0.1"
+ "_id": "lru-cache@2.0.2",
+ "_from": "lru-cache@~2.0.0"
}
diff --git a/deps/npm/node_modules/node-gyp/lib/configure.js b/deps/npm/node_modules/node-gyp/lib/configure.js
index 2e1ac504e..3e165afa3 100644
--- a/deps/npm/node_modules/node-gyp/lib/configure.js
+++ b/deps/npm/node_modules/node-gyp/lib/configure.js
@@ -16,6 +16,7 @@ var fs = require('graceful-fs')
, cp = require('child_process')
, exec = cp.exec
, spawn = cp.spawn
+ , execFile = cp.execFile
, win = process.platform == 'win32'
exports.usage = 'Generates ' + (win ? 'MSVC project files' : 'a Makefile') + ' for the current module'
@@ -86,21 +87,12 @@ function configure (gyp, argv, callback) {
}
function checkPythonVersion () {
- exec(python + ' --version', function (err, stdout, stderr) {
+ execFile(python, ['-c', 'import platform; print platform.python_version();'], function (err, stdout) {
if (err) {
return callback(err)
}
- log.verbose('check python version', '`%s --version` returned: %j', python, stderr)
- var version = stderr.trim().replace(/[^\d\.]+/g, '')
- var numDots = 0
- version.replace(/\./g, function () {
- numDots++
- })
- while (numDots < 2) {
- version += '.0'
- numDots++
- }
- log.verbose('check python version', 'using version %j to check', version)
+ log.verbose('check python version', '`%s -c "import platform; print platform.python_version();"` returned: %j', python, stdout)
+ var version = stdout.trim()
if (semver.gte(version, '2.5.0') && semver.lt(version, '3.0.0')) {
getNodeDir()
} else {
diff --git a/deps/npm/node_modules/node-gyp/package.json b/deps/npm/node_modules/node-gyp/package.json
index ab5194150..4ca7de825 100644
--- a/deps/npm/node_modules/node-gyp/package.json
+++ b/deps/npm/node_modules/node-gyp/package.json
@@ -10,7 +10,7 @@
"bindings",
"gyp"
],
- "version": "0.6.7",
+ "version": "0.6.8",
"installVersion": 9,
"author": {
"name": "Nathan Rajlich",
@@ -45,6 +45,6 @@
"node": ">= 0.6.0"
},
"readme": "node-gyp\n=========\n### Node.js native addon build tool\n\n`node-gyp` is a cross-platform command-line tool written in Node.js for compiling\nnative addon modules for Node.js, which takes away the pain of dealing with the\nvarious differences in build platforms. It is the replacement to the `node-waf`\nprogram which is removed for node `v0.8`. If you have a native addon for node that\nstill has a `wscript` file, then you should definitely add a `binding.gyp` file\nto support the latest versions of node.\n\nMultiple target versions of node are supported (i.e. `0.6`, `0.7`,..., `1.0`,\netc.), regardless of what version of node is actually installed on your system\n(`node-gyp` downloads the necessary development files for the target version).\n\n#### Features:\n\n * Easy to use, consistent interface\n * Same commands to build your module on every platform\n * Supports multiple target versions of Node\n\n\nInstallation\n------------\n\nYou can install with `npm`:\n\n``` bash\n$ npm install -g node-gyp\n```\n\nYou will also need to install:\n\n * On Unix:\n * `python`\n * `make`\n * A proper C/C++ compiler toolchain, like GCC\n * On Windows:\n * [Python][windows-python] ([`v2.7.2`][windows-python-v2.7.2] recommended, `v3.x.x` not yet supported)\n * Microsoft Visual C++ ([Express][msvc] version works well)\n * For 64-bit builds of node and native modules you will _also_ need the [Windows 7 64-bit SDK][win7sdk]\n\nHow to Use\n----------\n\nTo compile your native addon, first go to its root directory:\n\n``` bash\n$ cd my_node_addon\n```\n\nThe next step is to generate the appropriate project build files for the current\nplatform. Use `configure` for that:\n\n``` bash\n$ node-gyp configure\n```\n\n__Note__: The `configure` step looks for the `binding.gyp` file in the current\ndirectory to processs. See below for instructions on creating the `binding.gyp` file.\n\nNow you will have either a `Makefile` (on Unix platforms) or a `vcxproj` file\n(on Windows) in the `build/` directory. Next invoke the `build` command:\n\n``` bash\n$ node-gyp build\n```\n\nNow you have your compiled `.node` bindings file! The compiled bindings end up\nin `build/Debug/` or `build/Release/`, depending on the build mode. At this point\nyou can require the `.node` file with Node and run your tests!\n\n__Note:__ To create a _Debug_ build of the bindings file, pass the `--debug` (or\n`-d`) switch when running the either `configure` or `build` command.\n\n\nThe \"binding.gyp\" file\n----------------------\n\nPreviously when node had `node-waf` you had to write a `wscript` file. The\nreplacement for that is the `binding.gyp` file, which describes the configuration\nto build your module in a JSON-like format. This file gets placed in the root of\nyour package, alongside the `package.json` file.\n\nA barebones `gyp` file appropriate for building a node addon looks like:\n\n``` json\n{\n \"targets\": [\n {\n \"target_name\": \"binding\",\n \"sources\": [ \"src/binding.cc\" ]\n }\n ]\n}\n```\n\nSome additional resources for writing `gyp` files:\n\n * [\"Hello World\" node addon example](https://github.com/joyent/node/tree/master/test/addons/hello-world)\n * [gyp user documentation](http://code.google.com/p/gyp/wiki/GypUserDocumentation)\n * [gyp input format reference](http://code.google.com/p/gyp/wiki/InputFormatReference)\n * [*\"binding.gyp\" files out in the wild* wiki page](https://github.com/TooTallNate/node-gyp/wiki/%22binding.gyp%22-files-out-in-the-wild)\n\n\nCommands\n--------\n\n`node-gyp` responds to the following commands:\n\n| **Command** | **Description**\n|:--------------|:---------------------------------------------------------------\n| `build` | Invokes `make`/`msbuild.exe` and builds the native addon\n| `clean` | Removes any the `build` dir if it exists\n| `configure` | Generates project build files for the current platform\n| `rebuild` | Runs \"clean\", \"configure\" and \"build\" all in a row\n| `install` | Installs node development header files for the given version\n| `list` | Lists the currently installed node development file versions\n| `remove` | Removes the node development header files for the given version\n\n\nLicense\n-------\n\n(The MIT License)\n\nCopyright (c) 2012 Nathan Rajlich &lt;nathan@tootallnate.net&gt;\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\n\n[windows-python]: http://www.python.org/getit/windows\n[windows-python-v2.7.2]: http://www.python.org/download/releases/2.7.2#download\n[msvc]: http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express\n[win7sdk]: http://www.microsoft.com/download/en/details.aspx?displayLang=en&id=8279\n",
- "_id": "node-gyp@0.6.7",
+ "_id": "node-gyp@0.6.8",
"_from": "node-gyp@~0.6.4"
}
diff --git a/deps/npm/node_modules/npm-registry-client/lib/request.js b/deps/npm/node_modules/npm-registry-client/lib/request.js
index 8d90572c6..f506be4f2 100644
--- a/deps/npm/node_modules/npm-registry-client/lib/request.js
+++ b/deps/npm/node_modules/npm-registry-client/lib/request.js
@@ -111,10 +111,16 @@ function regRequest (method, where, what, etag, nofollow, cb_) {
var self = this
operation.attempt(function (currentAttempt) {
- self.log.info("retry", "registry request attempt " + currentAttempt
+ self.log.info("trying", "registry request attempt " + currentAttempt
+ " at " + (new Date()).toLocaleTimeString())
makeRequest.call(self, method, remote, where, what, etag, nofollow, token
, function (er, parsed, raw, response) {
+ if (!er || er.message.match(/^SSL Error/)) {
+ if (er)
+ er.code = 'ESSL'
+ return cb(er, parsed, raw, response)
+ }
+
// Only retry on 408, 5xx or no `response`.
var statusCode = response && response.statusCode
var reauth = statusCode === 401
diff --git a/deps/npm/node_modules/npm-registry-client/package.json b/deps/npm/node_modules/npm-registry-client/package.json
index 0576a2c24..743534eb0 100644
--- a/deps/npm/node_modules/npm-registry-client/package.json
+++ b/deps/npm/node_modules/npm-registry-client/package.json
@@ -6,7 +6,7 @@
},
"name": "npm-registry-client",
"description": "Client for the npm registry",
- "version": "0.2.6",
+ "version": "0.2.7",
"repository": {
"url": "git://github.com/isaacs/npm-registry-client"
},
@@ -34,6 +34,6 @@
},
"license": "BSD",
"readme": "# npm-registry-client\n\nThe code that npm uses to talk to the registry.\n\nIt handles all the caching and HTTP calls.\n\n## Usage\n\n```javascript\nvar RegClient = require('npm-registry-client')\nvar client = new RegClient(config)\n\nclient.get(\"npm\", \"latest\", 1000, function (er, data, raw, res) {\n // error is an error if there was a problem.\n // data is the parsed data object\n // raw is the json string\n // res is the response from couch\n})\n```\n\n# Configuration\n\nThis program is designed to work with\n[npmconf](https://npmjs.org/package/npmconf), but you can also pass in\na plain-jane object with the appropriate configs, and it'll shim it\nfor you. Any configuration thingie that has get/set/del methods will\nalso be accepted.\n\n* `registry` **Required** {String} URL to the registry\n* `cache` **Required** {String} Path to the cache folder\n* `always-auth` {Boolean} Auth even for GET requests.\n* `auth` {String} A base64-encoded `username:password`\n* `email` {String} User's email address\n* `tag` {String} The default tag to use when publishing new packages.\n Default = `\"latest\"`\n* `ca` {String} Cerficate signing authority certificates to trust.\n* `strict-ssl` {Boolean} Whether or not to be strict with SSL\n certificates. Default = `true`\n* `user-agent` {String} User agent header to send. Default =\n `\"node/{process.version}\"`\n* `log` {Object} The logger to use. Defaults to `require(\"npmlog\")` if\n that works, otherwise logs are disabled.\n* `fetch-retries` {Number} Number of times to retry on GET failures.\n Default=2\n* `fetch-retry-factor` {Number} `factor` setting for `node-retry`. Default=10\n* `fetch-retry-mintimeout` {Number} `minTimeout` setting for `node-retry`.\n Default=10000 (10 seconds)\n* `fetch-retry-maxtimeout` {Number} `maxTimeout` setting for `node-retry`.\n Default=60000 (60 seconds)\n* `proxy` {URL} The url to proxy requests through.\n* `https-proxy` {URL} The url to proxy https requests through.\n Defaults to be the same as `proxy` if unset.\n* `_auth` {String} The base64-encoded authorization header.\n* `username` `_password` {String} Username/password to use to generate\n `_auth` if not supplied.\n* `_token` {Object} A token for use with\n [couch-login](https://npmjs.org/package/couch-login)\n\n# client.request(method, where, [what], [etag], [nofollow], cb)\n\n* `method` {String} HTTP method\n* `where` {String} Path to request on the server\n* `what` {Stream | Buffer | String | Object} The request body. Objects\n that are not Buffers or Streams are encoded as JSON.\n* `etag` {String} The cached ETag\n* `nofollow` {Boolean} Prevent following 302/301 responses\n* `cb` {Function}\n * `error` {Error | null}\n * `data` {Object} the parsed data object\n * `raw` {String} the json\n * `res` {Response Object} response from couch\n\nMake a request to the registry. All the other methods are wrappers\naround this. one.\n\n# client.adduser(username, password, email, cb)\n\n* `username` {String}\n* `password` {String}\n* `email` {String}\n* `cb` {Function}\n\nAdd a user account to the registry, or verify the credentials.\n\n# client.get(url, [timeout], [nofollow], [staleOk], cb)\n\n* `url` {String} The url path to fetch\n* `timeout` {Number} Number of seconds old that a cached copy must be\n before a new request will be made.\n* `nofollow` {Boolean} Do not follow 301/302 responses\n* `staleOk` {Boolean} If there's cached data available, then return that\n to the callback quickly, and update the cache the background.\n\nFetches data from the registry via a GET request, saving it in\nthe cache folder with the ETag.\n\n# client.publish(data, tarball, [readme], cb)\n\n* `data` {Object} Package data\n* `tarball` {String | Stream} Filename or stream of the package tarball\n* `readme` {String} Contents of the README markdown file\n* `cb` {Function}\n\nPublish a package to the registry.\n\nNote that this does not create the tarball from a folder. However, it\ncan accept a gzipped tar stream or a filename to a tarball.\n\n# client.star(package, starred, cb)\n\n* `package` {String} Name of the package to star\n* `starred` {Boolean} True to star the package, false to unstar it.\n* `cb` {Function}\n\nStar or unstar a package.\n\nNote that the user does not have to be the package owner to star or\nunstar a package, though other writes do require that the user be the\npackage owner.\n\n# client.tag(project, version, tag, cb)\n\n* `project` {String} Project name\n* `version` {String} Version to tag\n* `tag` {String} Tag name to apply\n* `cb` {Function}\n\nMark a version in the `dist-tags` hash, so that `pkg@tag`\nwill fetch the specified version.\n\n# client.unpublish(name, [ver], cb)\n\n* `name` {String} package name\n* `ver` {String} version to unpublish. Leave blank to unpublish all\n versions.\n* `cb` {Function}\n\nRemove a version of a package (or all versions) from the registry. When\nthe last version us unpublished, the entire document is removed from the\ndatabase.\n\n# client.upload(where, file, [etag], [nofollow], cb)\n\n* `where` {String} URL path to upload to\n* `file` {String | Stream} Either the filename or a readable stream\n* `etag` {String} Cache ETag\n* `nofollow` {Boolean} Do not follow 301/302 responses\n* `cb` {Function}\n\nUpload an attachment. Mostly used by `client.publish()`.\n",
- "_id": "npm-registry-client@0.2.6",
- "_from": "npm-registry-client@~0.2.4"
+ "_id": "npm-registry-client@0.2.7",
+ "_from": "npm-registry-client@~0.2.6"
}
diff --git a/deps/npm/node_modules/npmconf/config-defs.js b/deps/npm/node_modules/npmconf/config-defs.js
index c951b339f..857f4af3d 100644
--- a/deps/npm/node_modules/npmconf/config-defs.js
+++ b/deps/npm/node_modules/npmconf/config-defs.js
@@ -23,11 +23,13 @@ function Octal () {}
function validateOctal (data, k, val) {
// must be either an integer or an octal string.
if (typeof val === "number") {
- data[k] = "0" + val.toString(8)
+ data[k] = val
+ return true
}
+
if (typeof val === "string") {
if (val.charAt(0) !== "0" || isNaN(val)) return false
- data[k] = "0" + parseInt(val, 8).toString(8)
+ data[k] = parseInt(val, 8).toString(8)
}
}
@@ -111,22 +113,64 @@ Object.defineProperty(exports, "defaults", {get: function () {
: "google-chrome"
, ca : // the npm CA certificate.
- "-----BEGIN CERTIFICATE-----\n"+
- "MIIChzCCAfACCQDauvz/KHp8ejANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMC\n"+
- "VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMQwwCgYDVQQKEwNucG0x\n"+
- "IjAgBgNVBAsTGW5wbSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxDjAMBgNVBAMTBW5w\n"+
- "bUNBMRcwFQYJKoZIhvcNAQkBFghpQGl6cy5tZTAeFw0xMTA5MDUwMTQ3MTdaFw0y\n"+
- "MTA5MDIwMTQ3MTdaMIGHMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNV\n"+
- "BAcTB09ha2xhbmQxDDAKBgNVBAoTA25wbTEiMCAGA1UECxMZbnBtIENlcnRpZmlj\n"+
- "YXRlIEF1dGhvcml0eTEOMAwGA1UEAxMFbnBtQ0ExFzAVBgkqhkiG9w0BCQEWCGlA\n"+
- "aXpzLm1lMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLI4tIqPpRW+ACw9GE\n"+
- "OgBlJZwK5f8nnKCLK629Pv5yJpQKs3DENExAyOgDcyaF0HD0zk8zTp+ZsLaNdKOz\n"+
- "Gn2U181KGprGKAXP6DU6ByOJDWmTlY6+Ad1laYT0m64fERSpHw/hjD3D+iX4aMOl\n"+
- "y0HdbT5m1ZGh6SJz3ZqxavhHLQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAC4ySDbC\n"+
- "l7W1WpLmtLGEQ/yuMLUf6Jy/vr+CRp4h+UzL+IQpCv8FfxsYE7dhf/bmWTEupBkv\n"+
- "yNL18lipt2jSvR3v6oAHAReotvdjqhxddpe5Holns6EQd1/xEZ7sB1YhQKJtvUrl\n"+
- "ZNufy1Jf1r0ldEGeA+0ISck7s+xSh9rQD2Op\n"+
- "-----END CERTIFICATE-----\n"
+ [ "-----BEGIN CERTIFICATE-----\n"+
+ "MIIChzCCAfACCQDauvz/KHp8ejANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMC\n"+
+ "VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMQwwCgYDVQQKEwNucG0x\n"+
+ "IjAgBgNVBAsTGW5wbSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxDjAMBgNVBAMTBW5w\n"+
+ "bUNBMRcwFQYJKoZIhvcNAQkBFghpQGl6cy5tZTAeFw0xMTA5MDUwMTQ3MTdaFw0y\n"+
+ "MTA5MDIwMTQ3MTdaMIGHMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNV\n"+
+ "BAcTB09ha2xhbmQxDDAKBgNVBAoTA25wbTEiMCAGA1UECxMZbnBtIENlcnRpZmlj\n"+
+ "YXRlIEF1dGhvcml0eTEOMAwGA1UEAxMFbnBtQ0ExFzAVBgkqhkiG9w0BCQEWCGlA\n"+
+ "aXpzLm1lMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLI4tIqPpRW+ACw9GE\n"+
+ "OgBlJZwK5f8nnKCLK629Pv5yJpQKs3DENExAyOgDcyaF0HD0zk8zTp+ZsLaNdKOz\n"+
+ "Gn2U181KGprGKAXP6DU6ByOJDWmTlY6+Ad1laYT0m64fERSpHw/hjD3D+iX4aMOl\n"+
+ "y0HdbT5m1ZGh6SJz3ZqxavhHLQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAC4ySDbC\n"+
+ "l7W1WpLmtLGEQ/yuMLUf6Jy/vr+CRp4h+UzL+IQpCv8FfxsYE7dhf/bmWTEupBkv\n"+
+ "yNL18lipt2jSvR3v6oAHAReotvdjqhxddpe5Holns6EQd1/xEZ7sB1YhQKJtvUrl\n"+
+ "ZNufy1Jf1r0ldEGeA+0ISck7s+xSh9rQD2Op\n"+
+ "-----END CERTIFICATE-----\n",
+
+ // "GlobalSign Root CA"
+ "-----BEGIN CERTIFICATE-----\n"+
+ "MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx\n"+
+ "GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds\n"+
+ "b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV\n"+
+ "BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD\n"+
+ "VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa\n"+
+ "DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc\n"+
+ "THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb\n"+
+ "Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP\n"+
+ "c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX\n"+
+ "gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\n"+
+ "HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF\n"+
+ "AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj\n"+
+ "Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG\n"+
+ "j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH\n"+
+ "hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC\n"+
+ "X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\n"+
+ "-----END CERTIFICATE-----\n",
+
+ // "GlobalSign Root CA - R2"
+ "-----BEGIN CERTIFICATE-----\n"+
+ "MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv\n"+
+ "YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh\n"+
+ "bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT\n"+
+ "aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln\n"+
+ "bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6\n"+
+ "ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp\n"+
+ "s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN\n"+
+ "S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL\n"+
+ "TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C\n"+
+ "ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E\n"+
+ "FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i\n"+
+ "YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN\n"+
+ "BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp\n"+
+ "9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu\n"+
+ "01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7\n"+
+ "9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7\n"+
+ "TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==\n"+
+ "-----END CERTIFICATE-----\n" ]
+
, cache : process.platform === "win32"
? path.resolve(process.env.APPDATA || home || temp, "npm-cache")
@@ -225,7 +269,7 @@ Object.defineProperty(exports, "defaults", {get: function () {
exports.types =
{ "always-auth" : Boolean
, browser : String
- , ca: [null, String]
+ , ca: [null, String, Array]
, cache : path
, "cache-lock-stale": Number
, "cache-lock-retries": Number
diff --git a/deps/npm/node_modules/npmconf/node_modules/config-chain/index.js b/deps/npm/node_modules/npmconf/node_modules/config-chain/index.js
index 59dabf216..60931bb71 100644..100755
--- a/deps/npm/node_modules/npmconf/node_modules/config-chain/index.js
+++ b/deps/npm/node_modules/npmconf/node_modules/config-chain/index.js
@@ -75,7 +75,7 @@ var env = exports.env = function (prefix, env) {
var obj = {}
var l = prefix.length
for(var k in env) {
- if((i =k.indexOf(prefix)) === 0)
+ if(k.indexOf(prefix) === 0)
obj[k.substring(l)] = env[k]
}
diff --git a/deps/npm/node_modules/npmconf/node_modules/config-chain/package.json b/deps/npm/node_modules/npmconf/node_modules/config-chain/package.json
index 379c3d68c..df49b8da0 100644
--- a/deps/npm/node_modules/npmconf/node_modules/config-chain/package.json
+++ b/deps/npm/node_modules/npmconf/node_modules/config-chain/package.json
@@ -1,6 +1,6 @@
{
"name": "config-chain",
- "version": "1.1.1",
+ "version": "1.1.2",
"description": "HANDLE CONFIGURATION ONCE AND FOR ALL",
"homepage": "http://github.com/dominictarr/config-chain",
"repository": {
@@ -23,6 +23,9 @@
"test": "tap test/"
},
"readme": "#config-chain\n\nUSE THIS MODULE TO LOAD ALL YOUR CONFIGURATIONS\n\n``` js\n\n //npm install config-chain\n\n var cc = require('config-chain')\n , opts = require('optimist').argv //ALWAYS USE OPTIMIST FOR COMMAND LINE OPTIONS.\n , env = opts.env || process.env.YOUR_APP_ENV || 'dev' //SET YOUR ENV LIKE THIS.\n\n // EACH ARG TO CONFIGURATOR IS LOADED INTO CONFIGURATION CHAIN\n // EARLIER ITEMS OVERIDE LATER ITEMS\n // PUTS COMMAND LINE OPTS FIRST, AND DEFAULTS LAST!\n\n //strings are interpereted as filenames.\n //will be loaded synchronously\n\n var conf =\n cc(\n //OVERRIDE SETTINGS WITH COMMAND LINE OPTS\n opts,\n\n //ENV VARS IF PREFIXED WITH 'myApp_'\n\n cc.env('myApp_'), //myApp_foo = 'like this'\n\n //FILE NAMED BY ENV\n path.join(__dirname, 'config.' + env + '.json'),\n\n //IF `env` is PRODUCTION\n env === 'prod'\n ? path.join(__dirname, 'special.json') //load a special file\n : null //NULL IS IGNORED!\n\n //SUBDIR FOR ENV CONFIG\n path.join(__dirname, 'config', env, 'config.json'),\n\n //SEARCH PARENT DIRECTORIES FROM CURRENT DIR FOR FILE\n cc.find('config.json'),\n\n //PUT DEFAULTS LAST\n {\n host: 'localhost'\n port: 8000\n })\n\n var host = conf.get('host')\n\n // or\n\n var host = conf.store.host\n\n```\n\nFINALLY, EASY FLEXIBLE CONFIGURATIONS!\n\n##see also: [proto-list](https://github.com/isaacs/proto-list/)\n\nWHATS THAT YOU SAY?\n\nYOU WANT A \"CLASS\" SO THAT YOU CAN DO CRAYCRAY JQUERY CRAPS?\n\nEXTEND WITH YOUR OWN FUNCTIONALTY!?\n\n## CONFIGCHAIN LIVES TO SERVE ONLY YOU!\n\n```javascript\nvar cc = require('config-chain')\n\n// all the stuff you did before\nvar config = cc({\n some: 'object'\n },\n cc.find('config.json'),\n cc.env('myApp_')\n )\n // CONFIGS AS A SERVICE, aka \"CaaS\", aka EVERY DEVOPS DREAM OMG!\n .addUrl('http://configurator:1234/my-configs')\n // ASYNC FTW!\n .addFile('/path/to/file.json')\n\n // OBJECTS ARE OK TOO, they're SYNC but they still ORDER RIGHT\n // BECAUSE PROMISES ARE USED BUT NO, NOT *THOSE* PROMISES, JUST\n // ACTUAL PROMISES LIKE YOU MAKE TO YOUR MOM, KEPT OUT OF LOVE\n .add({ another: 'object' })\n\n // DIE A THOUSAND DEATHS IF THIS EVER HAPPENS!!\n .on('error', function (er) {\n // IF ONLY THERE WAS SOMETHIGN HARDER THAN THROW\n // MY SORROW COULD BE ADEQUATELY EXPRESSED. /o\\\n throw er\n })\n\n // THROW A PARTY IN YOUR FACE WHEN ITS ALL LOADED!!\n .on('load', function (config) {\n console.awesome('HOLY SHIT!')\n })\n```\n\n# BORING API DOCS\n\n## cc(...args)\n\nMAKE A CHAIN AND ADD ALL THE ARGS.\n\nIf the arg is a STRING, then it shall be a JSON FILENAME.\n\nSYNC I/O!\n\nRETURN THE CHAIN!\n\n## cc.json(...args)\n\nJoin the args INTO A JSON FILENAME!\n\nSYNC I/O!\n\n## cc.find(relativePath)\n\nSEEK the RELATIVE PATH by climbing the TREE OF DIRECTORIES.\n\nRETURN THE FOUND PATH!\n\nSYNC I/O!\n\n## cc.parse(content, file, type)\n\nParse the content string, and guess the type from either the\nspecified type or the filename.\n\nRETURN THE RESULTING OBJECT!\n\nNO I/O!\n\n## cc.env(prefix, env=process.env)\n\nGet all the keys on the provided env object (or process.env) which are\nprefixed by the specified prefix, and put the values on a new object.\n\nRETURN THE RESULTING OBJECT!\n\nNO I/O!\n\n## cc.ConfigChain()\n\nThe ConfigChain class for CRAY CRAY JQUERY STYLE METHOD CHAINING!\n\nOne of these is returned by the main exported function, as well.\n\nIt inherits (prototypically) from\n[ProtoList](https://github.com/isaacs/proto-list/), and also inherits\n(parasitically) from\n[EventEmitter](http://nodejs.org/api/events.html#events_class_events_eventemitter)\n\nIt has all the methods from both, and except where noted, they are\nunchanged.\n\n### LET IT BE KNOWN THAT chain IS AN INSTANCE OF ConfigChain.\n\n## chain.sources\n\nA list of all the places where it got stuff. The keys are the names\npassed to addFile or addUrl etc, and the value is an object with some\ninfo about the data source.\n\n## chain.addFile(filename, type, [name=filename])\n\nFilename is the name of the file. Name is an arbitrary string to be\nused later if you desire. Type is either 'ini' or 'json', and will\ntry to guess intelligently if omitted.\n\nLoaded files can be saved later.\n\n## chain.addUrl(url, type, [name=url])\n\nSame as the filename thing, but with a url.\n\nCan't be saved later.\n\n## chain.addEnv(prefix, env, [name='env'])\n\nAdd all the keys from the env object that start with the prefix.\n\n## chain.addString(data, file, type, [name])\n\nParse the string and add it to the set. (Mainly used internally.)\n\n## chain.add(object, [name])\n\nAdd the object to the set.\n\n## chain.root {Object}\n\nThe root from which all the other config objects in the set descend\nprototypically.\n\nPut your defaults here.\n\n## chain.set(key, value, name)\n\nSet the key to the value on the named config object. If name is\nunset, then set it on the first config object in the set. (That is,\nthe one with the highest priority, which was added first.)\n\n## chain.get(key, [name])\n\nGet the key from the named config object explicitly, or from the\nresolved configs if not specified.\n\n## chain.save(name, type)\n\nWrite the named config object back to its origin.\n\nCurrently only supported for env and file config types.\n\nFor files, encode the data according to the type.\n\n## chain.on('save', function () {})\n\nWhen one or more files are saved, emits `save` event when they're all\nsaved.\n\n## chain.on('load', function (chain) {})\n\nWhen the config chain has loaded all the specified files and urls and\nsuch, the 'load' event fires.\n",
- "_id": "config-chain@1.1.1",
+ "_id": "config-chain@1.1.2",
+ "dist": {
+ "shasum": "7c82ca863fcf5d16ff3c62bd8b79400722d48671"
+ },
"_from": "config-chain@~1.1.1"
}
diff --git a/deps/npm/node_modules/npmconf/npmconf.js b/deps/npm/node_modules/npmconf/npmconf.js
index e32a95819..46ff2b813 100644
--- a/deps/npm/node_modules/npmconf/npmconf.js
+++ b/deps/npm/node_modules/npmconf/npmconf.js
@@ -281,8 +281,8 @@ function parseField (f, k, emptyIsFalse) {
var isPath = -1 !== typeList.indexOf(path)
var isBool = -1 !== typeList.indexOf(Boolean)
var isString = -1 !== typeList.indexOf(String)
- var isNumber = -1 !== typeList.indexOf(Number) ||
- -1 !== typeList.indexOf(Octal)
+ var isOctal = -1 !== typeList.indexOf(Octal)
+ var isNumber = isOctal || (-1 !== typeList.indexOf(Number))
f = (''+f).trim()
@@ -310,7 +310,7 @@ function parseField (f, k, emptyIsFalse) {
}
if (isNumber && !isNaN(f))
- f = +f
+ f = isOctal ? parseInt(f, 8) : +f
return f
}
diff --git a/deps/npm/node_modules/npmconf/package.json b/deps/npm/node_modules/npmconf/package.json
index 849e8f229..ea9ac9929 100644
--- a/deps/npm/node_modules/npmconf/package.json
+++ b/deps/npm/node_modules/npmconf/package.json
@@ -1,6 +1,6 @@
{
"name": "npmconf",
- "version": "0.0.11",
+ "version": "0.0.15",
"description": "The config thing npm uses",
"main": "npmconf.js",
"directories": {
@@ -35,10 +35,7 @@
"url": "http://blog.izs.me"
},
"license": "BSD",
- "optionalDependencies": {
- "nopt": "~2.0.0"
- },
"readme": "# npmconf\n\nThe config thing npm uses\n\nIf you are interested in interacting with the config settings that npm\nuses, then use this module.\n\nHowever, if you are writing a new Node.js program, and want\nconfiguration functionality similar to what npm has, but for your\nown thing, then I'd recommend using [rc](https://github.com/dominictarr/rc),\nwhich is probably what you want.\n\nIf I were to do it all over again, that's what I'd do for npm. But,\nalas, there are many systems depending on many of the particulars of\nnpm's configuration setup, so it's not worth the cost of changing.\n\n## USAGE\n\n```javascript\nvar npmconf = require('npmconf')\n\n// pass in the cli options that you read from the cli\n// or whatever top-level configs you want npm to use for now.\nnpmconf.load({some:'configs'}, function (er, conf) {\n // do stuff with conf\n conf.get('some', 'cli') // 'configs'\n conf.get('username') // 'joebobwhatevers'\n conf.set('foo', 'bar', 'user')\n conf.save('user', function (er) {\n // foo = bar is now saved to ~/.npmrc or wherever\n })\n})\n```\n",
- "_id": "npmconf@0.0.11",
+ "_id": "npmconf@0.0.15",
"_from": "npmconf@0"
}
diff --git a/deps/npm/node_modules/npmconf/test/basic.js b/deps/npm/node_modules/npmconf/test/basic.js
index 9825c8457..5f276f1fa 100644
--- a/deps/npm/node_modules/npmconf/test/basic.js
+++ b/deps/npm/node_modules/npmconf/test/basic.js
@@ -34,7 +34,7 @@ var gcData = { 'package-config:foo': 'boo' }
var biData = {}
-var cli = { foo: 'bar' }
+var cli = { foo: 'bar', umask: 022 }
var expectList =
[ cli,
@@ -67,6 +67,7 @@ test('no builtin', function (t) {
t.same(npmconf.rootConf.list, [])
t.equal(npmconf.rootConf.root, npmconf.defs.defaults)
t.equal(conf.root, npmconf.defs.defaults)
+ t.equal(conf.get('umask'), 022)
t.end()
})
})
diff --git a/deps/npm/node_modules/read-package-json/package.json b/deps/npm/node_modules/read-package-json/package.json
index 8e56b11e3..ea40d7619 100644
--- a/deps/npm/node_modules/read-package-json/package.json
+++ b/deps/npm/node_modules/read-package-json/package.json
@@ -1,6 +1,6 @@
{
"name": "read-package-json",
- "version": "0.1.4",
+ "version": "0.1.5",
"author": {
"name": "Isaac Z. Schlueter",
"email": "i@izs.me",
@@ -31,6 +31,6 @@
"graceful-fs": "~1.1.8"
},
"readme": "# read-package-json\n\nThis is the thing that npm uses to read package.json files. It\nvalidates some stuff, and loads some default things.\n\nIt keeps a cache of the files you've read, so that you don't end\nup reading the same package.json file multiple times.\n\nNote that if you just want to see what's literally in the package.json\nfile, you can usually do `var data = require('some-module/package.json')`.\n\nThis module is basically only needed by npm, but it's handy to see what\nnpm will see when it looks at your package.\n\n## Usage\n\n```javascript\nvar readJson = require('read-package-json')\n\nreadJson('/path/to/package.json', function (er, data) {\n if (er) {\n console.error(\"There was an error reading the file\")\n return\n }\n\n console.error('the package data is', data)\n}\n```\n\n## readJson(file, cb)\n\n* `file` {String} The path to the package.json file\n* `cb` {Function}\n\nReads the JSON file and does the things.\n\n## `package.json` Fields\n\nSee `man 5 package.json` or `npm help json`.\n\n## readJson.log\n\nBy default this is a reference to the `npmlog` module. But if that\nmodule can't be found, then it'll be set to just a dummy thing that does\nnothing.\n\nReplace with your own `{log,warn,error}` object for fun loggy time.\n\n## readJson.extras(file, data, cb)\n\nRun all the extra stuff relative to the file, with the parsed data.\n\nModifies the data as it does stuff. Calls the cb when it's done.\n\n## readJson.extraSet = [fn, fn, ...]\n\nArray of functions that are called by `extras`. Each one receives the\narguments `fn(file, data, cb)` and is expected to call `cb(er, data)`\nwhen done or when an error occurs.\n\nOrder is indeterminate, so each function should be completely\nindependent.\n\nMix and match!\n\n## readJson.cache\n\nThe `lru-cache` object that readJson uses to not read the same file over\nand over again. See\n[lru-cache](https://github.com/isaacs/node-lru-cache) for details.\n\n## Other Relevant Files Besides `package.json`\n\nSome other files have an effect on the resulting data object, in the\nfollowing ways:\n\n### `README?(.*)`\n\nIf there is a `README` or `README.*` file present, then npm will attach\na `readme` field to the data with the contents of this file.\n\nOwing to the fact that roughly 100% of existing node modules have\nMarkdown README files, it will generally be assumed to be Markdown,\nregardless of the extension. Please plan accordingly.\n\n### `server.js`\n\nIf there is a `server.js` file, and there is not already a\n`scripts.start` field, then `scripts.start` will be set to `node\nserver.js`.\n\n### `AUTHORS`\n\nIf there is not already a `contributors` field, then the `contributors`\nfield will be set to the contents of the `AUTHORS` file, split by lines,\nand parsed.\n\n### `bindings.gyp`\n\nIf a bindings.gyp file exists, and there is not already a\n`scripts.install` field, then the `scripts.install` field will be set to\n`node-gyp rebuild`.\n\n### `wscript`\n\nIf a wscript file exists, and there is not already a `scripts.install`\nfield, then the `scripts.install` field will be set to `node-waf clean ;\nnode-waf configure build`.\n\nNote that the `bindings.gyp` file supercedes this, since node-waf has\nbeen deprecated in favor of node-gyp.\n\n### `index.js`\n\nIf the json file does not exist, but there is a `index.js` file\npresent instead, and that file has a package comment, then it will try\nto parse the package comment, and use that as the data instead.\n\nA package comment looks like this:\n\n```javascript\n/**package\n * { \"name\": \"my-bare-module\"\n * , \"version\": \"1.2.3\"\n * , \"description\": \"etc....\" }\n **/\n\n// or...\n\n/**package\n{ \"name\": \"my-bare-module\"\n, \"version\": \"1.2.3\"\n, \"description\": \"etc....\" }\n**/\n```\n\nThe important thing is that it starts with `/**package`, and ends with\n`**/`. If the package.json file exists, then the index.js is not\nparsed.\n\n### `{directories.man}/*.[0-9]`\n\nIf there is not already a `man` field defined as an array of files or a\nsingle file, and\nthere is a `directories.man` field defined, then that directory will\nbe searched for manpages.\n\nAny valid manpages found in that directory will be assigned to the `man`\narray, and installed in the appropriate man directory at package install\ntime, when installed globally on a Unix system.\n\n### `{directories.bin}/*`\n\nIf there is not already a `bin` field defined as a string filename or a\nhash of `<name> : <filename>` pairs, then the `directories.bin`\ndirectory will be searched and all the files within it will be linked as\nexecutables at install time.\n\nWhen installing locally, npm links bins into `node_modules/.bin`, which\nis in the `PATH` environ when npm runs scripts. When\ninstalling globally, they are linked into `{prefix}/bin`, which is\npresumably in the `PATH` environment variable.\n",
- "_id": "read-package-json@0.1.4",
+ "_id": "read-package-json@0.1.5",
"_from": "read-package-json@~0.1.3"
}
diff --git a/deps/npm/node_modules/read-package-json/read-json.js b/deps/npm/node_modules/read-package-json/read-json.js
index 17e8b4320..b8b940ea7 100644
--- a/deps/npm/node_modules/read-package-json/read-json.js
+++ b/deps/npm/node_modules/read-package-json/read-json.js
@@ -300,6 +300,13 @@ function final (file, data, cb) {
unParsePeople(file, data)
parsePeople(file, data)
+ if (data.description &&
+ typeof data.description !== 'string') {
+ warn(file, data,
+ "'description' field should be a string")
+ delete data.description
+ }
+
if (data.readme && !data.description)
readmeDescription(file, data)
diff --git a/deps/npm/package.json b/deps/npm/package.json
index 227a9c89b..67543612c 100644
--- a/deps/npm/package.json
+++ b/deps/npm/package.json
@@ -1,5 +1,5 @@
{
- "version": "1.1.59",
+ "version": "1.1.61",
"name": "npm",
"publishConfig": {
"proprietary-attribs": false
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/AUTHORS b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/AUTHORS
new file mode 100644
index 000000000..26d86593f
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/AUTHORS
@@ -0,0 +1,9 @@
+# contributors sorted by whether or not they're me.
+Isaac Z. Schlueter <i@izs.me>
+Stein Martin Hustad <stein@hustad.com>
+Mikeal Rogers <mikeal.rogers@gmail.com>
+Laurie Harper <laurie@holoweb.net>
+Jann Horn <jann@Jann-PC.fritz.box>
+Elijah Insua <tmpvar@gmail.com>
+Henry Rawas <henryr@schakra.com>
+Justin Makeig <jmpublic@makeig.com>
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/LICENSE b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/LICENSE
new file mode 100644
index 000000000..05a401094
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/LICENSE
@@ -0,0 +1,23 @@
+Copyright 2009, 2010, 2011 Isaac Z. Schlueter.
+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.
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/README.md b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/README.md
new file mode 100644
index 000000000..9c63dc44c
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/README.md
@@ -0,0 +1,213 @@
+# sax js
+
+A sax-style parser for XML and HTML.
+
+Designed with [node](http://nodejs.org/) in mind, but should work fine in
+the browser or other CommonJS implementations.
+
+## What This Is
+
+* A very simple tool to parse through an XML string.
+* A stepping stone to a streaming HTML parser.
+* A handy way to deal with RSS and other mostly-ok-but-kinda-broken XML
+ docs.
+
+## What This Is (probably) Not
+
+* An HTML Parser - That's a fine goal, but this isn't it. It's just
+ XML.
+* A DOM Builder - You can use it to build an object model out of XML,
+ but it doesn't do that out of the box.
+* XSLT - No DOM = no querying.
+* 100% Compliant with (some other SAX implementation) - Most SAX
+ implementations are in Java and do a lot more than this does.
+* An XML Validator - It does a little validation when in strict mode, but
+ not much.
+* A Schema-Aware XSD Thing - Schemas are an exercise in fetishistic
+ masochism.
+* A DTD-aware Thing - Fetching DTDs is a much bigger job.
+
+## Regarding `<!DOCTYPE`s and `<!ENTITY`s
+
+The parser will handle the basic XML entities in text nodes and attribute
+values: `&amp; &lt; &gt; &apos; &quot;`. It's possible to define additional
+entities in XML by putting them in the DTD. This parser doesn't do anything
+with that. If you want to listen to the `ondoctype` event, and then fetch
+the doctypes, and read the entities and add them to `parser.ENTITIES`, then
+be my guest.
+
+Unknown entities will fail in strict mode, and in loose mode, will pass
+through unmolested.
+
+## Usage
+
+ var sax = require("./lib/sax"),
+ strict = true, // set to false for html-mode
+ parser = sax.parser(strict);
+
+ parser.onerror = function (e) {
+ // an error happened.
+ };
+ parser.ontext = function (t) {
+ // got some text. t is the string of text.
+ };
+ parser.onopentag = function (node) {
+ // opened a tag. node has "name" and "attributes"
+ };
+ parser.onattribute = function (attr) {
+ // an attribute. attr has "name" and "value"
+ };
+ parser.onend = function () {
+ // parser stream is done, and ready to have more stuff written to it.
+ };
+
+ parser.write('<xml>Hello, <who name="world">world</who>!</xml>').close();
+
+ // stream usage
+ // takes the same options as the parser
+ var saxStream = require("sax").createStream(strict, options)
+ saxStream.on("error", function (e) {
+ // unhandled errors will throw, since this is a proper node
+ // event emitter.
+ console.error("error!", e)
+ // clear the error
+ this._parser.error = null
+ this._parser.resume()
+ })
+ saxStream.on("opentag", function (node) {
+ // same object as above
+ })
+ // pipe is supported, and it's readable/writable
+ // same chunks coming in also go out.
+ fs.createReadStream("file.xml")
+ .pipe(saxStream)
+ .pipe(fs.createReadStream("file-copy.xml"))
+
+
+
+## Arguments
+
+Pass the following arguments to the parser function. All are optional.
+
+`strict` - Boolean. Whether or not to be a jerk. Default: `false`.
+
+`opt` - Object bag of settings regarding string formatting. All default to `false`.
+
+Settings supported:
+
+* `trim` - Boolean. Whether or not to trim text and comment nodes.
+* `normalize` - Boolean. If true, then turn any whitespace into a single
+ space.
+* `lowercasetags` - Boolean. If true, then lowercase tags in loose mode,
+ rather than uppercasing them.
+* `xmlns` - Boolean. If true, then namespaces are supported.
+
+## Methods
+
+`write` - Write bytes onto the stream. You don't have to do this all at
+once. You can keep writing as much as you want.
+
+`close` - Close the stream. Once closed, no more data may be written until
+it is done processing the buffer, which is signaled by the `end` event.
+
+`resume` - To gracefully handle errors, assign a listener to the `error`
+event. Then, when the error is taken care of, you can call `resume` to
+continue parsing. Otherwise, the parser will not continue while in an error
+state.
+
+## Members
+
+At all times, the parser object will have the following members:
+
+`line`, `column`, `position` - Indications of the position in the XML
+document where the parser currently is looking.
+
+`startTagPosition` - Indicates the position where the current tag starts.
+
+`closed` - Boolean indicating whether or not the parser can be written to.
+If it's `true`, then wait for the `ready` event to write again.
+
+`strict` - Boolean indicating whether or not the parser is a jerk.
+
+`opt` - Any options passed into the constructor.
+
+`tag` - The current tag being dealt with.
+
+And a bunch of other stuff that you probably shouldn't touch.
+
+## Events
+
+All events emit with a single argument. To listen to an event, assign a
+function to `on<eventname>`. Functions get executed in the this-context of
+the parser object. The list of supported events are also in the exported
+`EVENTS` array.
+
+When using the stream interface, assign handlers using the EventEmitter
+`on` function in the normal fashion.
+
+`error` - Indication that something bad happened. The error will be hanging
+out on `parser.error`, and must be deleted before parsing can continue. By
+listening to this event, you can keep an eye on that kind of stuff. Note:
+this happens *much* more in strict mode. Argument: instance of `Error`.
+
+`text` - Text node. Argument: string of text.
+
+`doctype` - The `<!DOCTYPE` declaration. Argument: doctype string.
+
+`processinginstruction` - Stuff like `<?xml foo="blerg" ?>`. Argument:
+object with `name` and `body` members. Attributes are not parsed, as
+processing instructions have implementation dependent semantics.
+
+`sgmldeclaration` - Random SGML declarations. Stuff like `<!ENTITY p>`
+would trigger this kind of event. This is a weird thing to support, so it
+might go away at some point. SAX isn't intended to be used to parse SGML,
+after all.
+
+`opentag` - An opening tag. Argument: object with `name` and `attributes`.
+In non-strict mode, tag names are uppercased, unless the `lowercasetags`
+option is set. If the `xmlns` option is set, then it will contain
+namespace binding information on the `ns` member, and will have a
+`local`, `prefix`, and `uri` member.
+
+`closetag` - A closing tag. In loose mode, tags are auto-closed if their
+parent closes. In strict mode, well-formedness is enforced. Note that
+self-closing tags will have `closeTag` emitted immediately after `openTag`.
+Argument: tag name.
+
+`attribute` - An attribute node. Argument: object with `name` and `value`,
+and also namespace information if the `xmlns` option flag is set.
+
+`comment` - A comment node. Argument: the string of the comment.
+
+`opencdata` - The opening tag of a `<![CDATA[` block.
+
+`cdata` - The text of a `<![CDATA[` block. Since `<![CDATA[` blocks can get
+quite large, this event may fire multiple times for a single block, if it
+is broken up into multiple `write()`s. Argument: the string of random
+character data.
+
+`closecdata` - The closing tag (`]]>`) of a `<![CDATA[` block.
+
+`opennamespace` - If the `xmlns` option is set, then this event will
+signal the start of a new namespace binding.
+
+`closenamespace` - If the `xmlns` option is set, then this event will
+signal the end of a namespace binding.
+
+`end` - Indication that the closed stream has ended.
+
+`ready` - Indication that the stream has reset, and is ready to be written
+to.
+
+`noscript` - In non-strict mode, `<script>` tags trigger a `"script"`
+event, and their contents are not checked for special xml characters.
+If you pass `noscript: true`, then this behavior is suppressed.
+
+## Reporting Problems
+
+It's best to write a failing test if you find an issue. I will always
+accept pull requests with failing tests if they demonstrate intended
+behavior, but it is very hard to figure out what issue you're describing
+without a test. Writing a test is also the best way for you yourself
+to figure out if you really understand the issue you think you have with
+sax-js.
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/big-not-pretty.xml b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/big-not-pretty.xml
new file mode 100644
index 000000000..fb5265dde
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/big-not-pretty.xml
@@ -0,0 +1,8002 @@
+<big>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
+</big>
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/example.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/example.js
new file mode 100644
index 000000000..e7f81e648
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/example.js
@@ -0,0 +1,41 @@
+
+var fs = require("fs"),
+ sys = require("sys"),
+ path = require("path"),
+ xml = fs.cat(path.join(__dirname, "test.xml")),
+ sax = require("../lib/sax"),
+ strict = sax.parser(true),
+ loose = sax.parser(false, {trim:true}),
+ inspector = function (ev) { return function (data) {
+ // sys.error("");
+ // sys.error(ev+": "+sys.inspect(data));
+ // for (var i in data) sys.error(i+ " "+sys.inspect(data[i]));
+ // sys.error(this.line+":"+this.column);
+ }};
+
+xml.addCallback(function (xml) {
+ // strict.write(xml);
+
+ sax.EVENTS.forEach(function (ev) {
+ loose["on"+ev] = inspector(ev);
+ });
+ loose.onend = function () {
+ // sys.error("end");
+ // sys.error(sys.inspect(loose));
+ };
+
+ // do this one char at a time to verify that it works.
+ // (function () {
+ // if (xml) {
+ // loose.write(xml.substr(0,1000));
+ // xml = xml.substr(1000);
+ // process.nextTick(arguments.callee);
+ // } else loose.close();
+ // })();
+
+ for (var i = 0; i < 1000; i ++) {
+ loose.write(xml);
+ loose.close();
+ }
+
+});
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/get-products.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/get-products.js
new file mode 100644
index 000000000..9e8d74aac
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/get-products.js
@@ -0,0 +1,58 @@
+// pull out /GeneralSearchResponse/categories/category/items/product tags
+// the rest we don't care about.
+
+var sax = require("../lib/sax.js")
+var fs = require("fs")
+var path = require("path")
+var xmlFile = path.resolve(__dirname, "shopping.xml")
+var util = require("util")
+var http = require("http")
+
+fs.readFile(xmlFile, function (er, d) {
+ http.createServer(function (req, res) {
+ if (er) throw er
+ var xmlstr = d.toString("utf8")
+
+ var parser = sax.parser(true)
+ var products = []
+ var product = null
+ var currentTag = null
+
+ parser.onclosetag = function (tagName) {
+ if (tagName === "product") {
+ products.push(product)
+ currentTag = product = null
+ return
+ }
+ if (currentTag && currentTag.parent) {
+ var p = currentTag.parent
+ delete currentTag.parent
+ currentTag = p
+ }
+ }
+
+ parser.onopentag = function (tag) {
+ if (tag.name !== "product" && !product) return
+ if (tag.name === "product") {
+ product = tag
+ }
+ tag.parent = currentTag
+ tag.children = []
+ tag.parent && tag.parent.children.push(tag)
+ currentTag = tag
+ }
+
+ parser.ontext = function (text) {
+ if (currentTag) currentTag.children.push(text)
+ }
+
+ parser.onend = function () {
+ var out = util.inspect(products, false, 3, true)
+ res.writeHead(200, {"content-type":"application/json"})
+ res.end("{\"ok\":true}")
+ // res.end(JSON.stringify(products))
+ }
+
+ parser.write(xmlstr).end()
+ }).listen(1337)
+})
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/hello-world.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/hello-world.js
new file mode 100644
index 000000000..cbfa5184e
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/hello-world.js
@@ -0,0 +1,4 @@
+require("http").createServer(function (req, res) {
+ res.writeHead(200, {"content-type":"application/json"})
+ res.end(JSON.stringify({ok: true}))
+}).listen(1337)
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/not-pretty.xml b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/not-pretty.xml
new file mode 100644
index 000000000..9592852d0
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/not-pretty.xml
@@ -0,0 +1,8 @@
+<root>
+ something<else> blerm <slurm
+
+
+ attrib =
+ "blorg" ></else><!-- COMMENT!
+
+--><![CDATA[processing...]]> <selfclosing tag="blr>&quot;"/> a bit down here</root>
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/pretty-print.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/pretty-print.js
new file mode 100644
index 000000000..cd6aca9e1
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/pretty-print.js
@@ -0,0 +1,74 @@
+var sax = require("../lib/sax")
+ , printer = sax.createStream(false, {lowercasetags:true, trim:true})
+ , fs = require("fs")
+
+function entity (str) {
+ return str.replace('"', '&quot;')
+}
+
+printer.tabstop = 2
+printer.level = 0
+printer.indent = function () {
+ print("\n")
+ for (var i = this.level; i > 0; i --) {
+ for (var j = this.tabstop; j > 0; j --) {
+ print(" ")
+ }
+ }
+}
+printer.on("opentag", function (tag) {
+ this.indent()
+ this.level ++
+ print("<"+tag.name)
+ for (var i in tag.attributes) {
+ print(" "+i+"=\""+entity(tag.attributes[i])+"\"")
+ }
+ print(">")
+})
+
+printer.on("text", ontext)
+printer.on("doctype", ontext)
+function ontext (text) {
+ this.indent()
+ print(text)
+}
+
+printer.on("closetag", function (tag) {
+ this.level --
+ this.indent()
+ print("</"+tag+">")
+})
+
+printer.on("cdata", function (data) {
+ this.indent()
+ print("<![CDATA["+data+"]]>")
+})
+
+printer.on("comment", function (comment) {
+ this.indent()
+ print("<!--"+comment+"-->")
+})
+
+printer.on("error", function (error) {
+ console.error(error)
+ throw error
+})
+
+if (!process.argv[2]) {
+ throw new Error("Please provide an xml file to prettify\n"+
+ "TODO: read from stdin or take a file")
+}
+var xmlfile = require("path").join(process.cwd(), process.argv[2])
+var fstr = fs.createReadStream(xmlfile, { encoding: "utf8" })
+
+function print (c) {
+ if (!process.stdout.write(c)) {
+ fstr.pause()
+ }
+}
+
+process.stdout.on("drain", function () {
+ fstr.resume()
+})
+
+fstr.pipe(printer)
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/shopping.xml b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/shopping.xml
new file mode 100644
index 000000000..223c6c665
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/shopping.xml
@@ -0,0 +1,2 @@
+
+<GeneralSearchResponse xmlns="urn:types.partner.api.shopping.com"><serverDetail><apiEnv>sandbox</apiEnv><apiVersion>3.1 r31.Kadu4DC.phase3</apiVersion><buildNumber>5778</buildNumber><buildTimestamp>2011.10.06 15:37:23 PST</buildTimestamp><requestId>p2.a121bc2aaf029435dce6</requestId><timestamp>2011-10-21T18:38:45.982-04:00</timestamp><responseTime>P0Y0M0DT0H0M0.169S</responseTime></serverDetail><exceptions exceptionCount="1"><exception type="warning"><code>1112</code><message>You are currently using the SDC API sandbox environment! No clicks to merchant URLs from this response will be paid. Please change the host of your API requests to 'publisher.api.shopping.com' when you have finished development and testing</message></exception></exceptions><clientTracking height="19" type="logo" width="106"><sourceURL>http://statTest.dealtime.com/pixel/noscript?PV_EvnTyp=APPV&amp;APPV_APITSP=10%2F21%2F11_06%3A38%3A45_PM&amp;APPV_DSPRQSID=p2.a121bc2aaf029435dce6&amp;APPV_IMGURL=http://img.shopping.com/sc/glb/sdc_logo_106x19.gif&amp;APPV_LI_LNKINID=7000610&amp;APPV_LI_SBMKYW=nikon&amp;APPV_MTCTYP=1000&amp;APPV_PRTID=2002&amp;APPV_BrnID=14804</sourceURL><hrefURL>http://www.shopping.com/digital-cameras/products</hrefURL><titleText>Digital Cameras</titleText><altText>Digital Cameras</altText></clientTracking><searchHistory><categorySelection id="3"><name>Electronics</name><categoryURL>http://www.shopping.com/xCH-electronics-nikon~linkin_id-7000610?oq=nikon</categoryURL></categorySelection><categorySelection id="449"><name>Cameras and Photography</name><categoryURL>http://www.shopping.com/xCH-cameras_and_photography-nikon~linkin_id-7000610?oq=nikon</categoryURL></categorySelection><categorySelection id="7185"><name>Digital Cameras</name><categoryURL>http://www.shopping.com/digital-cameras/nikon/products?oq=nikon&amp;linkin_id=7000610</categoryURL></categorySelection><dynamicNavigationHistory><keywordSearch dropped="false" modified="false"><originalKeyword>nikon</originalKeyword><resultKeyword>nikon</resultKeyword></keywordSearch></dynamicNavigationHistory></searchHistory><categories matchedCategoryCount="1" returnedCategoryCount="1"><category id="7185"><name>Digital Cameras</name><categoryURL>http://www.shopping.com/digital-cameras/nikon/products?oq=nikon&amp;linkin_id=7000610</categoryURL><items matchedItemCount="322" pageNumber="1" returnedItemCount="5"><product id="101677489"><name>Nikon D3100 Digital Camera</name><shortDescription>14.2 Megapixel, SLR Camera, 3 in. LCD Screen, With High Definition Video, Weight: 1 lb.</shortDescription><fullDescription>The Nikon D3100 digital SLR camera speaks to the growing ranks of enthusiastic D-SLR users and aspiring photographers by providing an easy-to-use and affordable entrance to the world of Nikon D-SLR’s. The 14.2-megapixel D3100 has powerful features, such as the enhanced Guide Mode that makes it easy to unleash creative potential and capture memories with still images and full HD video. Like having a personal photo tutor at your fingertips, this unique feature provides a simple graphical interface on the camera’s LCD that guides users by suggesting and/or adjusting camera settings to achieve the desired end result images. The D3100 is also the world’s first D-SLR to introduce full time auto focus (AF) in Live View and D-Movie mode to effortlessly achieve the critical focus needed when shooting Full HD 1080p video.</fullDescription><images><image available="true" height="100" width="100"><sourceURL>http://di1.shopping.com/images/pi/93/bc/04/101677489-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di1.shopping.com/images/pi/93/bc/04/101677489-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di1.shopping.com/images/pi/93/bc/04/101677489-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di1.shopping.com/images/pi/93/bc/04/101677489-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="500" width="606"><sourceURL>http://di1.shopping.com/images/pi/93/bc/04/101677489-606x500-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></images><rating><reviewCount>9</reviewCount><rating>4.56</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/pr/sdc_stars_sm_4.5.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/Nikon-D3100/reviews~linkin_id-7000610</reviewURL></rating><minPrice>429.00</minPrice><maxPrice>1360.00</maxPrice><productOffersURL>http://www.shopping.com/Nikon-D3100/prices~linkin_id-7000610</productOffersURL><productSpecsURL>http://www.shopping.com/Nikon-D3100/info~linkin_id-7000610</productSpecsURL><offers matchedOfferCount="64" pageNumber="1" returnedOfferCount="5"><offer featured="false" id="-ZW6BMZqz6fbS-aULwga_g==" smartBuy="false" used="false"><name>Nikon D3100 Digital SLR Camera with 18-55mm NIKKOR VR Lens</name><description>The Nikon D3100 Digital SLR Camera is an affordable compact and lightweight photographic power-house. It features the all-purpose 18-55mm VR lens a high-resolution 14.2 MP CMOS sensor along with a feature set that's comprehensive yet easy to navigate - the intuitive onboard learn-as-you grow guide mode allows the photographer to understand what the 3100 can do quickly and easily. Capture beautiful pictures and amazing Full HD 1080p movies with sound and full-time autofocus. Availabilty: In Stock!</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di102.shopping.com/images/di/2d/5a/57/36424d5a717a366662532d61554c7767615f67-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di102.shopping.com/images/di/2d/5a/57/36424d5a717a366662532d61554c7767615f67-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di102.shopping.com/images/di/2d/5a/57/36424d5a717a366662532d61554c7767615f67-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="350" width="350"><sourceURL>http://di102.shopping.com/images/di/2d/5a/57/36424d5a717a366662532d61554c7767615f67-350x350-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Free Shipping with Any Purchase!</storeNotes><basePrice currency="USD">529.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">799.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=647&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=475674&amp;crawler_id=475674&amp;dealId=-ZW6BMZqz6fbS-aULwga_g%3D%3D&amp;url=http%3A%2F%2Fwww.fumfie.com%2Fproduct%2F343.5%2Fshopping-com%3F&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D3100+Digital+SLR+Camera+with+18-55mm+NIKKOR+VR+Lens&amp;dlprc=529.0&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=1&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=101677489&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=1&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=1&amp;SL=1&amp;FS=1&amp;code=&amp;acode=658&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="475674" trusted="true"><name>FumFie</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/475674.gif</sourceURL></logo><phoneNumber>866 666 9198</phoneNumber><ratingInfo><reviewCount>560</reviewCount><rating>4.27</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_45.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_fumfie~MRD-475674~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>F343C5</sku></offer><offer featured="false" id="md1e9lD8vdOu4FHQfJqKng==" smartBuy="false" used="false"><name>Nikon Nikon D3100 14.2MP Digital SLR Camera with 18-55mm f/3.5-5.6 AF-S DX VR, Cameras</name><description>Nikon D3100 14.2MP Digital SLR Camera with 18-55mm f/3.5-5.6 AF-S DX VR</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di109.shopping.com/images/di/6d/64/31/65396c443876644f7534464851664a714b6e67-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di109.shopping.com/images/di/6d/64/31/65396c443876644f7534464851664a714b6e67-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di109.shopping.com/images/di/6d/64/31/65396c443876644f7534464851664a714b6e67-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="352" width="385"><sourceURL>http://di109.shopping.com/images/di/6d/64/31/65396c443876644f7534464851664a714b6e67-385x352-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">549.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">549.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=779&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=305814&amp;crawler_id=305814&amp;dealId=md1e9lD8vdOu4FHQfJqKng%3D%3D&amp;url=http%3A%2F%2Fwww.electronics-expo.com%2Findex.php%3Fpage%3Ditem%26id%3DNIKD3100%26source%3DSideCar%26scpid%3D8%26scid%3Dscsho318727%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+Nikon+D3100+14.2MP+Digital+SLR+Camera+with+18-55mm+f%2F3.5-5.6+AF-S+DX+VR%2C+Cameras&amp;dlprc=549.0&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=9&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=101677489&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=9&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=771&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="305814" trusted="true"><name>Electronics Expo</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/305814.gif</sourceURL></logo><phoneNumber>1-888-707-EXPO</phoneNumber><ratingInfo><reviewCount>371</reviewCount><rating>3.90</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_4.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_electronics_expo~MRD-305814~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>NIKD3100</sku></offer><offer featured="false" id="yYuaXnDFtCY7rDUjkY2aaw==" smartBuy="false" used="false"><name>Nikon D3100 14.2-Megapixel Digital SLR Camera With 18-55mm Zoom-Nikkor Lens, Black</name><description>Split-second shutter response captures shots other cameras may have missed Helps eliminate the frustration of shutter delay! 14.2-megapixels for enlargements worth framing and hanging. Takes breathtaking 1080p HD movies. ISO sensitivity from 100-1600 for bright or dimly lit settings. 3.0in. color LCD for beautiful, wide-angle framing and viewing. In-camera image editing lets you retouch with no PC. Automatic scene modes include Child, Sports, Night Portrait and more. Accepts SDHC memory cards. Nikon D3100 14.2-Megapixel Digital SLR Camera With 18-55mm Zoom-Nikkor Lens, Black is one of many Digital SLR Cameras available through Office Depot. Made by Nikon.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di109.shopping.com/images/di/79/59/75/61586e4446744359377244556a6b5932616177-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di109.shopping.com/images/di/79/59/75/61586e4446744359377244556a6b5932616177-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="250" width="250"><sourceURL>http://di109.shopping.com/images/di/79/59/75/61586e4446744359377244556a6b5932616177-250x250-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">549.99</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">699.99</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=698&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=467671&amp;crawler_id=467671&amp;dealId=yYuaXnDFtCY7rDUjkY2aaw%3D%3D&amp;url=http%3A%2F%2Flink.mercent.com%2Fredirect.ashx%3Fmr%3AmerchantID%3DOfficeDepot%26mr%3AtrackingCode%3DCEC9669E-6ABC-E011-9F24-0019B9C043EB%26mr%3AtargetUrl%3Dhttp%3A%2F%2Fwww.officedepot.com%2Fa%2Fproducts%2F486292%2FNikon-D3100-142-Megapixel-Digital-SLR%2F%253fcm_mmc%253dMercent-_-Shopping-_-Cameras_and_Camcorders-_-486292&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D3100+14.2-Megapixel+Digital+SLR+Camera+With+18-55mm+Zoom-Nikkor+Lens%2C+Black&amp;dlprc=549.99&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=10&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=101677489&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=10&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=1&amp;SL=1&amp;FS=1&amp;code=&amp;acode=690&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="467671" trusted="true"><name>Office Depot</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/467671.gif</sourceURL></logo><phoneNumber>1-800-GO-DEPOT</phoneNumber><ratingInfo><reviewCount>135</reviewCount><rating>2.37</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_office_depot_4158555~MRD-467671~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>486292</sku></offer><offer featured="false" id="Rl56U7CuiTYsH4MGZ02lxQ==" smartBuy="false" used="false"><name>Nikon® D3100™ 14.2MP Digital SLR with 18-55mm Lens</name><description>The Nikon D3100 DSLR will surprise you with its simplicity and impress you with superb results.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di103.shopping.com/images/di/52/6c/35/36553743756954597348344d475a30326c7851-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di103.shopping.com/images/di/52/6c/35/36553743756954597348344d475a30326c7851-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="220" width="220"><sourceURL>http://di103.shopping.com/images/di/52/6c/35/36553743756954597348344d475a30326c7851-220x220-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">549.99</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.05</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">549.99</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=504&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=332477&amp;crawler_id=332477&amp;dealId=Rl56U7CuiTYsH4MGZ02lxQ%3D%3D&amp;url=http%3A%2F%2Ftracking.searchmarketing.com%2Fgsic.asp%3Faid%3D903483107%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon%C2%AE+D3100%E2%84%A2+14.2MP+Digital+SLR+with+18-55mm+Lens&amp;dlprc=549.99&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=11&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=101677489&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=11&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=496&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="332477" trusted="false"><name>RadioShack</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/332477.gif</sourceURL></logo><ratingInfo><reviewCount>24</reviewCount><rating>2.25</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_radioshack_9689~MRD-332477~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>9614867</sku></offer><offer featured="false" id="huS6xZKDKaKMTMP71eI6DA==" smartBuy="false" used="false"><name>Nikon D3100 SLR w/Nikon 18-55mm VR &amp; 55-200mm VR Lenses</name><description>14.2 Megapixels3" LCDLive ViewHD 1080p Video w/ Sound &amp; Autofocus11-point Autofocus3 Frames per Second ShootingISO 100 to 3200 (Expand to 12800-Hi2)Self Cleaning SensorEXPEED 2, Image Processing EngineScene Recognition System</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di105.shopping.com/images/di/68/75/53/36785a4b444b614b4d544d5037316549364441-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di105.shopping.com/images/di/68/75/53/36785a4b444b614b4d544d5037316549364441-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di105.shopping.com/images/di/68/75/53/36785a4b444b614b4d544d5037316549364441-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="345" width="345"><sourceURL>http://di105.shopping.com/images/di/68/75/53/36785a4b444b614b4d544d5037316549364441-345x345-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">695.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">695.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=371&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=487342&amp;crawler_id=487342&amp;dealId=huS6xZKDKaKMTMP71eI6DA%3D%3D&amp;url=http%3A%2F%2Fwww.rythercamera.com%2Fcatalog%2Fproduct_info.php%3Fcsv%3Dsh%26products_id%3D32983%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D3100+SLR+w%2FNikon+18-55mm+VR+%26+55-200mm+VR+Lenses&amp;dlprc=695.0&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=15&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=101677489&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=15&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=379&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="487342" trusted="false"><name>RytherCamera.com</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/487342.gif</sourceURL></logo><phoneNumber>1-877-644-7593</phoneNumber><ratingInfo><reviewCount>0</reviewCount></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>32983</sku></offer></offers></product><product id="95397883"><name>Nikon COOLPIX S203 Digital Camera</name><shortDescription>10 Megapixel, Ultra-Compact Camera, 2.5 in. LCD Screen, 3x Optical Zoom, With Video Capability, Weight: 0.23 lb.</shortDescription><fullDescription>With 10.34 mega pixel, electronic VR vibration reduction, 5-level brightness adjustment, 3x optical zoom, and TFT LCD, Nikon Coolpix s203 fulfills all the demands of any photographer. The digital camera has an inbuilt memory of 44MB and an external memory slot made for all kinds of SD (Secure Digital) cards.</fullDescription><images><image available="true" height="100" width="100"><sourceURL>http://di1.shopping.com/images/pi/c4/ef/1b/95397883-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di1.shopping.com/images/pi/c4/ef/1b/95397883-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di1.shopping.com/images/pi/c4/ef/1b/95397883-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di1.shopping.com/images/pi/c4/ef/1b/95397883-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="499" width="500"><sourceURL>http://di1.shopping.com/images/pi/c4/ef/1b/95397883-500x499-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image></images><rating><reviewCount>0</reviewCount></rating><minPrice>139.00</minPrice><maxPrice>139.00</maxPrice><productOffersURL>http://www.shopping.com/Nikon-Coolpix-S203/prices~linkin_id-7000610</productOffersURL><productSpecsURL>http://www.shopping.com/Nikon-Coolpix-S203/info~linkin_id-7000610</productSpecsURL><offers matchedOfferCount="1" pageNumber="1" returnedOfferCount="1"><offer featured="false" id="sBd2JnIEPM-A_lBAM1RZgQ==" smartBuy="false" used="false"><name>Nikon Coolpix S203 Digital Camera (Red)</name><description>With 10.34 mega pixel, electronic VR vibration reduction, 5-level brightness adjustment, 3x optical zoom, and TFT LCD, Nikon Coolpix s203 fulfills all the demands of any photographer. The digital camera has an inbuilt memory of 44MB and an external memory slot made for all kinds of SD (Secure Digital) cards.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di108.shopping.com/images/di/73/42/64/324a6e4945504d2d415f6c42414d31525a6751-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di108.shopping.com/images/di/73/42/64/324a6e4945504d2d415f6c42414d31525a6751-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di108.shopping.com/images/di/73/42/64/324a6e4945504d2d415f6c42414d31525a6751-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di108.shopping.com/images/di/73/42/64/324a6e4945504d2d415f6c42414d31525a6751-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="500" width="500"><sourceURL>http://di108.shopping.com/images/di/73/42/64/324a6e4945504d2d415f6c42414d31525a6751-500x500-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Fantastic prices with ease &amp; comfort of Amazon.com!</storeNotes><basePrice currency="USD">139.00</basePrice><shippingCost currency="USD">9.50</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">139.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=566&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=301531&amp;crawler_id=1903313&amp;dealId=sBd2JnIEPM-A_lBAM1RZgQ%3D%3D&amp;url=http%3A%2F%2Fwww.amazon.com%2Fdp%2FB002T964IM%2Fref%3Dasc_df_B002T964IM1751618%3Fsmid%3DA22UHVNXG98FAT%26tag%3Ddealtime-ce-mp01feed-20%26linkCode%3Dasn%26creative%3D395105%26creativeASIN%3DB002T964IM&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+Coolpix+S203+Digital+Camera+%28Red%29&amp;dlprc=139.0&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=63&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=95397883&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=63&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=518&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="301531" trusted="false"><name>Amazon Marketplace</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/301531.gif</sourceURL></logo><ratingInfo><reviewCount>213</reviewCount><rating>2.73</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_amazon_marketplace_9689~MRD-301531~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>B002T964IM</sku></offer></offers></product><product id="106834268"><name>Nikon S3100 Digital Camera</name><shortDescription>14.5 Megapixel, Compact Camera, 2.7 in. LCD Screen, 5x Optical Zoom, With High Definition Video, Weight: 0.23 lb.</shortDescription><fullDescription>This digital camera features a wide-angle optical Zoom-NIKKOR glass lens that allows you to capture anything from landscapes to portraits to action shots. The high-definition movie mode with one-touch recording makes it easy to capture video clips.</fullDescription><images><image available="true" height="100" width="100"><sourceURL>http://di1.shopping.com/images/pi/66/2d/33/106834268-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di1.shopping.com/images/pi/66/2d/33/106834268-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di1.shopping.com/images/pi/66/2d/33/106834268-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di1.shopping.com/images/pi/66/2d/33/106834268-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="387" width="507"><sourceURL>http://di1.shopping.com/images/pi/66/2d/33/106834268-507x387-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image></images><rating><reviewCount>1</reviewCount><rating>2.00</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/pr/sdc_stars_sm_2.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/nikon-s3100/reviews~linkin_id-7000610</reviewURL></rating><minPrice>99.95</minPrice><maxPrice>134.95</maxPrice><productOffersURL>http://www.shopping.com/nikon-s3100/prices~linkin_id-7000610</productOffersURL><productSpecsURL>http://www.shopping.com/nikon-s3100/info~linkin_id-7000610</productSpecsURL><offers matchedOfferCount="67" pageNumber="1" returnedOfferCount="5"><offer featured="false" id="UUyGoqV8r0-xrkn-rnGNbg==" smartBuy="false" used="false"><name>CoolPix S3100 14 Megapixel Compact Digital Camera- Red</name><description>Nikon Coolpix S3100 - Digital camera - compact - 14.0 Mpix - optical zoom: 5 x - supported memory: SD, SDXC, SDHC - red</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di111.shopping.com/images/di/55/55/79/476f71563872302d78726b6e2d726e474e6267-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di111.shopping.com/images/di/55/55/79/476f71563872302d78726b6e2d726e474e6267-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di111.shopping.com/images/di/55/55/79/476f71563872302d78726b6e2d726e474e6267-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di111.shopping.com/images/di/55/55/79/476f71563872302d78726b6e2d726e474e6267-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Get 30 days FREE SHIPPING w/ ShipVantage</storeNotes><basePrice currency="USD">119.95</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.95</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">139.95</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=578&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=485615&amp;crawler_id=485615&amp;dealId=UUyGoqV8r0-xrkn-rnGNbg%3D%3D&amp;url=http%3A%2F%2Fsears.rdr.channelintelligence.com%2Fgo.asp%3FfVhzOGNRAAQIASNiE1NbQBJpFHJ3Yx0CTAICI2BbH1lEFmgKP3QvUVpEREdlfUAUHAQPLVpFTVdtJzxAHUNYW3AhQBM0QhFvEXAbYh8EAAVmDAJeU1oyGG0GcBdhGwUGCAVqYF9SO0xSN1sZdmA7dmMdBQAJB24qX1NbQxI6AjA2ME5dVFULPDsGPFcQTTdaLTA6SR0OFlQvPAwMDxYcYlxIVkcoLTcCDA%3D%3D%26nAID%3D13736960%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=CoolPix+S3100+14+Megapixel+Compact+Digital+Camera-+Red&amp;dlprc=119.95&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=28&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=106834268&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=28&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=1&amp;FS=0&amp;code=&amp;acode=583&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="485615" trusted="true"><name>Sears</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/485615.gif</sourceURL></logo><phoneNumber>1-800-349-4358</phoneNumber><ratingInfo><reviewCount>888</reviewCount><rating>2.85</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_3.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_sears_4189479~MRD-485615~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>00337013000</sku></offer><offer featured="false" id="X87AwXlW1dXoMXk4QQDToQ==" smartBuy="false" used="false"><name>COOLPIX S3100 Pink</name><description>Nikon Coolpix S3100 - Digital camera - compact - 14.0 Mpix - optical zoom: 5 x - supported memory: SD, SDXC, SDHC - pink</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di111.shopping.com/images/di/58/38/37/4177586c573164586f4d586b34515144546f51-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di111.shopping.com/images/di/58/38/37/4177586c573164586f4d586b34515144546f51-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di111.shopping.com/images/di/58/38/37/4177586c573164586f4d586b34515144546f51-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di111.shopping.com/images/di/58/38/37/4177586c573164586f4d586b34515144546f51-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Get 30 days FREE SHIPPING w/ ShipVantage</storeNotes><basePrice currency="USD">119.95</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.95</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">139.95</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=578&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=485615&amp;crawler_id=485615&amp;dealId=X87AwXlW1dXoMXk4QQDToQ%3D%3D&amp;url=http%3A%2F%2Fsears.rdr.channelintelligence.com%2Fgo.asp%3FfVhzOGNRAAQIASNiE1NbQBJpFHJxYx0CTAICI2BbH1lEFmgKP3QvUVpEREdlfUAUHAQPLVpFTVdtJzxAHUNYW3AhQBM0QhFvEXAbYh8EAAVmb2JcUFxDEGsPc3QDEkFZVQ0WFhdRW0MWbgYWDlxzdGMdAVQWRi0xDAwPFhw9TSobb05eWVVYKzsLTFVVQi5RICs3SA8MU1s2MQQKD1wf%26nAID%3D13736960%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=COOLPIX+S3100+Pink&amp;dlprc=119.95&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=31&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=106834268&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=31&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=1&amp;FS=0&amp;code=&amp;acode=583&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="485615" trusted="true"><name>Sears</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/485615.gif</sourceURL></logo><phoneNumber>1-800-349-4358</phoneNumber><ratingInfo><reviewCount>888</reviewCount><rating>2.85</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_3.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_sears_4189479~MRD-485615~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>00337015000</sku></offer><offer featured="false" id="nvFwnpfA4rlA1Dbksdsa0w==" smartBuy="false" used="false"><name>Nikon Coolpix S3100 14.0 MP Digital Camera - Silver</name><description>Nikon Coolpix S3100 14.0 MP Digital Camera - Silver</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di109.shopping.com/images/di/6e/76/46/776e70664134726c413144626b736473613077-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di109.shopping.com/images/di/6e/76/46/776e70664134726c413144626b736473613077-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="270" width="270"><sourceURL>http://di109.shopping.com/images/di/6e/76/46/776e70664134726c413144626b736473613077-270x270-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">109.97</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">109.97</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=803&amp;BEFID=7185&amp;aon=%5E&amp;MerchantID=475774&amp;crawler_id=475774&amp;dealId=nvFwnpfA4rlA1Dbksdsa0w%3D%3D&amp;url=http%3A%2F%2Fwww.thewiz.com%2Fcatalog%2Fproduct.jsp%3FmodelNo%3DS3100SILVER%26gdftrk%3DgdfV2677_a_7c996_a_7c4049_a_7c26262&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+Coolpix+S3100+14.0+MP+Digital+Camera+-+Silver&amp;dlprc=109.97&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=33&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=106834268&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=33&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=797&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="475774" trusted="false"><name>TheWiz.com</name><logo available="false" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/475774.gif</sourceURL></logo><phoneNumber>877-542-6988</phoneNumber><ratingInfo><reviewCount>0</reviewCount></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>26262</sku></offer><offer featured="false" id="5GtaN2NeryKwps-Se2l-4g==" smartBuy="false" used="false"><name>Nikon� COOLPIX� S3100 14MP Digital Camera (Silver)</name><description>The Nikon COOLPIX S3100 is the easy way to share your life and stay connected.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di102.shopping.com/images/di/35/47/74/614e324e6572794b7770732d5365326c2d3467-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di102.shopping.com/images/di/35/47/74/614e324e6572794b7770732d5365326c2d3467-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="220" width="220"><sourceURL>http://di102.shopping.com/images/di/35/47/74/614e324e6572794b7770732d5365326c2d3467-220x220-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">119.99</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.05</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">119.99</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=504&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=332477&amp;crawler_id=332477&amp;dealId=5GtaN2NeryKwps-Se2l-4g%3D%3D&amp;url=http%3A%2F%2Ftracking.searchmarketing.com%2Fgsic.asp%3Faid%3D848064082%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon%C3%AF%C2%BF%C2%BD+COOLPIX%C3%AF%C2%BF%C2%BD+S3100+14MP+Digital+Camera+%28Silver%29&amp;dlprc=119.99&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=37&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=106834268&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=37&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=509&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="332477" trusted="false"><name>RadioShack</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/332477.gif</sourceURL></logo><ratingInfo><reviewCount>24</reviewCount><rating>2.25</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_radioshack_9689~MRD-332477~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>10101095</sku></offer><offer featured="false" id="a43m0RXulX38zCnQjU59jw==" smartBuy="false" used="false"><name>COOLPIX S3100 Yellow</name><description>Nikon Coolpix S3100 - Digital camera - compact - 14.0 Mpix - optical zoom: 5 x - supported memory: SD, SDXC, SDHC - yellow</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di107.shopping.com/images/di/61/34/33/6d305258756c5833387a436e516a5535396a77-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di107.shopping.com/images/di/61/34/33/6d305258756c5833387a436e516a5535396a77-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di107.shopping.com/images/di/61/34/33/6d305258756c5833387a436e516a5535396a77-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di107.shopping.com/images/di/61/34/33/6d305258756c5833387a436e516a5535396a77-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Get 30 days FREE SHIPPING w/ ShipVantage</storeNotes><basePrice currency="USD">119.95</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.95</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">139.95</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=578&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=485615&amp;crawler_id=485615&amp;dealId=a43m0RXulX38zCnQjU59jw%3D%3D&amp;url=http%3A%2F%2Fsears.rdr.channelintelligence.com%2Fgo.asp%3FfVhzOGNRAAQIASNiE1NbQBJpFHJwYx0CTAICI2BbH1lEFmgKP3QvUVpEREdlfUAUHAQPLVpFTVdtJzxAHUNYW3AhQBM0QhFvEXAbYh8EAAVmb2JcUFxDEGoPc3QDEkFZVQ0WFhdRW0MWbgYWDlxzdGMdAVQWRi0xDAwPFhw9TSobb05eWVVYKzsLTFVVQi5RICs3SA8MU1s2MQQKD1wf%26nAID%3D13736960%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=COOLPIX+S3100+Yellow&amp;dlprc=119.95&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=38&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=106834268&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=38&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=1&amp;FS=0&amp;code=&amp;acode=583&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="485615" trusted="true"><name>Sears</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/485615.gif</sourceURL></logo><phoneNumber>1-800-349-4358</phoneNumber><ratingInfo><reviewCount>888</reviewCount><rating>2.85</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_3.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_sears_4189479~MRD-485615~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>00337014000</sku></offer></offers></product><product id="99671132"><name>Nikon D90 Digital Camera</name><shortDescription>12.3 Megapixel, Point and Shoot Camera, 3 in. LCD Screen, With Video Capability, Weight: 1.36 lb.</shortDescription><fullDescription>Untitled Document Nikon D90 SLR Digital Camera With 28-80mm 75-300mm Lens Kit The Nikon D90 SLR Digital Camera, with its 12.3-megapixel DX-format CMOS, 3" High resolution LCD display, Scene Recognition System, Picture Control, Active D-Lighting, and one-button Live View, provides photo enthusiasts with the image quality and performance they need to pursue their own vision while still being intuitive enough for use as an everyday camera.</fullDescription><images><image available="true" height="100" width="100"><sourceURL>http://di1.shopping.com/images/pi/52/fb/d3/99671132-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di1.shopping.com/images/pi/52/fb/d3/99671132-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di1.shopping.com/images/pi/52/fb/d3/99671132-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di1.shopping.com/images/pi/52/fb/d3/99671132-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="255" width="499"><sourceURL>http://di1.shopping.com/images/pi/52/fb/d3/99671132-499x255-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image></images><rating><reviewCount>7</reviewCount><rating>5.00</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/pr/sdc_stars_sm_5.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/Nikon-D90-with-18-270mm-Lens/reviews~linkin_id-7000610</reviewURL></rating><minPrice>689.00</minPrice><maxPrice>2299.00</maxPrice><productOffersURL>http://www.shopping.com/Nikon-D90-with-18-270mm-Lens/prices~linkin_id-7000610</productOffersURL><productSpecsURL>http://www.shopping.com/Nikon-D90-with-18-270mm-Lens/info~linkin_id-7000610</productSpecsURL><offers matchedOfferCount="43" pageNumber="1" returnedOfferCount="5"><offer featured="false" id="GU5JJkpUAxe5HujB7fkwAA==" smartBuy="false" used="false"><name>Nikon® D90 12.3MP Digital SLR Camera (Body Only)</name><description>The Nikon D90 will make you rethink what a digital SLR camera can achieve.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di106.shopping.com/images/di/47/55/35/4a4a6b70554178653548756a4237666b774141-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di106.shopping.com/images/di/47/55/35/4a4a6b70554178653548756a4237666b774141-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="220" width="220"><sourceURL>http://di106.shopping.com/images/di/47/55/35/4a4a6b70554178653548756a4237666b774141-220x220-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">1015.99</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.05</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">1015.99</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=504&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=332477&amp;crawler_id=332477&amp;dealId=GU5JJkpUAxe5HujB7fkwAA%3D%3D&amp;url=http%3A%2F%2Ftracking.searchmarketing.com%2Fgsic.asp%3Faid%3D851830266%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon%C2%AE+D90+12.3MP+Digital+SLR+Camera+%28Body+Only%29&amp;dlprc=1015.99&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=14&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=99671132&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=14&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=496&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="332477" trusted="false"><name>RadioShack</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/332477.gif</sourceURL></logo><ratingInfo><reviewCount>24</reviewCount><rating>2.25</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_radioshack_9689~MRD-332477~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>10148659</sku></offer><offer featured="false" id="XhURuSC-spBbTIDfo4qfzQ==" smartBuy="false" used="false"><name>Nikon D90 SLR Digital Camera (Camera Body)</name><description>The Nikon D90 SLR Digital Camera with its 12.3-megapixel DX-format CCD 3" High resolution LCD display Scene Recognition System Picture Control Active D-Lighting and one-button Live View provides photo enthusiasts with the image quality and performance they need to pursue their own vision while still being intuitive enough for use as an everyday camera. In addition the D90 introduces the D-Movie mode allowing for the first time an interchangeable lens SLR camera that is capable of recording 720p HD movie clips. Availabilty: In Stock</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di109.shopping.com/images/di/58/68/55/527553432d73704262544944666f3471667a51-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di109.shopping.com/images/di/58/68/55/527553432d73704262544944666f3471667a51-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di109.shopping.com/images/di/58/68/55/527553432d73704262544944666f3471667a51-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="350" width="350"><sourceURL>http://di109.shopping.com/images/di/58/68/55/527553432d73704262544944666f3471667a51-350x350-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Free Shipping with Any Purchase!</storeNotes><basePrice currency="USD">689.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">900.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=647&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=475674&amp;crawler_id=475674&amp;dealId=XhURuSC-spBbTIDfo4qfzQ%3D%3D&amp;url=http%3A%2F%2Fwww.fumfie.com%2Fproduct%2F169.5%2Fshopping-com%3F&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+SLR+Digital+Camera+%28Camera+Body%29&amp;dlprc=689.0&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=16&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=99671132&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=16&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=1&amp;SL=1&amp;FS=1&amp;code=&amp;acode=658&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="475674" trusted="true"><name>FumFie</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/475674.gif</sourceURL></logo><phoneNumber>866 666 9198</phoneNumber><ratingInfo><reviewCount>560</reviewCount><rating>4.27</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_45.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_fumfie~MRD-475674~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>F169C5</sku></offer><offer featured="false" id="o0Px_XLWDbrxAYRy3rCmyQ==" smartBuy="false" used="false"><name>Nikon D90 SLR w/Nikon 18-105mm VR &amp; 55-200mm VR Lenses</name><description>12.3 MegapixelDX Format CMOS Sensor3" VGA LCD DisplayLive ViewSelf Cleaning SensorD-Movie ModeHigh Sensitivity (ISO 3200)4.5 fps BurstIn-Camera Image Editing</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di101.shopping.com/images/di/6f/30/50/785f584c5744627278415952793372436d7951-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di101.shopping.com/images/di/6f/30/50/785f584c5744627278415952793372436d7951-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di101.shopping.com/images/di/6f/30/50/785f584c5744627278415952793372436d7951-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di101.shopping.com/images/di/6f/30/50/785f584c5744627278415952793372436d7951-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="500" width="500"><sourceURL>http://di101.shopping.com/images/di/6f/30/50/785f584c5744627278415952793372436d7951-500x500-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">1189.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">1189.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=371&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=487342&amp;crawler_id=487342&amp;dealId=o0Px_XLWDbrxAYRy3rCmyQ%3D%3D&amp;url=http%3A%2F%2Fwww.rythercamera.com%2Fcatalog%2Fproduct_info.php%3Fcsv%3Dsh%26products_id%3D30619%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+SLR+w%2FNikon+18-105mm+VR+%26+55-200mm+VR+Lenses&amp;dlprc=1189.0&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=20&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=99671132&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=20&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=379&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="487342" trusted="false"><name>RytherCamera.com</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/487342.gif</sourceURL></logo><phoneNumber>1-877-644-7593</phoneNumber><ratingInfo><reviewCount>0</reviewCount></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>30619</sku></offer><offer featured="false" id="4HgbWJSJ8ssgIf8B0MXIwA==" smartBuy="false" used="false"><name>Nikon D90 12.3 Megapixel Digital SLR Camera (Body Only)</name><description>Fusing 12.3 megapixel image quality and a cinematic 24fps D-Movie Mode, the Nikon D90 exceeds the demands of passionate photographers. Coupled with Nikon's EXPEED image processing technologies and NIKKOR optics, breathtaking image fidelity is assured. Combined with fast 0.15ms power-up and split-second 65ms shooting lag, dramatic action and decisive moments are captured easily. Effective 4-frequency, ultrasonic sensor cleaning frees image degrading dust particles from the sensor's optical low pass filter.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di110.shopping.com/images/di/34/48/67/62574a534a3873736749663842304d58497741-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di110.shopping.com/images/di/34/48/67/62574a534a3873736749663842304d58497741-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di110.shopping.com/images/di/34/48/67/62574a534a3873736749663842304d58497741-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>FREE FEDEX 2-3 DAY DELIVERY</storeNotes><basePrice currency="USD">899.95</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">899.95</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=269&amp;BEFID=7185&amp;aon=%5E&amp;MerchantID=9296&amp;crawler_id=811558&amp;dealId=4HgbWJSJ8ssgIf8B0MXIwA%3D%3D&amp;url=http%3A%2F%2Fwww.pcnation.com%2Foptics-gallery%2Fdetails.asp%3Faffid%3D305%26item%3D2N145P&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+12.3+Megapixel+Digital+SLR+Camera+%28Body+Only%29&amp;dlprc=899.95&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=21&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=99671132&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=21&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=257&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="9296" trusted="true"><name>PCNation</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/9296.gif</sourceURL></logo><phoneNumber>800-470-7079</phoneNumber><ratingInfo><reviewCount>1622</reviewCount><rating>4.43</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_45.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_pcnation_9689~MRD-9296~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>2N145P</sku></offer><offer featured="false" id="UNDa3uMDZXOnvD_7sTILYg==" smartBuy="false" used="false"><name>Nikon D90 12.3MP Digital SLR Camera (Body Only)</name><description>Fusing 12.3-megapixel image quality inherited from the award-winning D300 with groundbreaking features, the D90's breathtaking, low-noise image quality is further advanced with EXPEED image processing. Split-second shutter response and continuous shooting at up to 4.5 frames-per-second provide the power to capture fast action and precise moments perfectly, while Nikon's exclusive Scene Recognition System contributes to faster 11-area autofocus performance, finer white balance detection and more. The D90 delivers the control passionate photographers demand, utilizing comprehensive exposure functions and the intelligence of 3D Color Matrix Metering II. Stunning results come to life on a 3-inch 920,000-dot color LCD monitor, providing accurate image review, Live View composition and brilliant playback of the D90's cinematic-quality 24-fps HD D-Movie mode.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di102.shopping.com/images/di/55/4e/44/6133754d445a584f6e76445f377354494c5967-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di102.shopping.com/images/di/55/4e/44/6133754d445a584f6e76445f377354494c5967-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di102.shopping.com/images/di/55/4e/44/6133754d445a584f6e76445f377354494c5967-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di102.shopping.com/images/di/55/4e/44/6133754d445a584f6e76445f377354494c5967-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="500" width="500"><sourceURL>http://di102.shopping.com/images/di/55/4e/44/6133754d445a584f6e76445f377354494c5967-500x500-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Fantastic prices with ease &amp; comfort of Amazon.com!</storeNotes><basePrice currency="USD">780.00</basePrice><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">780.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=566&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=301531&amp;crawler_id=1903313&amp;dealId=UNDa3uMDZXOnvD_7sTILYg%3D%3D&amp;url=http%3A%2F%2Fwww.amazon.com%2Fdp%2FB001ET5U92%2Fref%3Dasc_df_B001ET5U921751618%3Fsmid%3DAHF4SYKP09WBH%26tag%3Ddealtime-ce-mp01feed-20%26linkCode%3Dasn%26creative%3D395105%26creativeASIN%3DB001ET5U92&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+12.3MP+Digital+SLR+Camera+%28Body+Only%29&amp;dlprc=780.0&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=29&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=99671132&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=29&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=520&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="301531" trusted="false"><name>Amazon Marketplace</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/301531.gif</sourceURL></logo><ratingInfo><reviewCount>213</reviewCount><rating>2.73</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_amazon_marketplace_9689~MRD-301531~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>B001ET5U92</sku></offer></offers></product><product id="70621646"><name>Nikon D90 Digital Camera with 18-105mm lens</name><shortDescription>12.9 Megapixel, SLR Camera, 3 in. LCD Screen, 5.8x Optical Zoom, With Video Capability, Weight: 2.3 lb.</shortDescription><fullDescription>Its 12.3 megapixel DX-format CMOS image sensor and EXPEED image processing system offer outstanding image quality across a wide ISO light sensitivity range. Live View mode lets you compose and shoot via the high-resolution 3-inch LCD monitor, and an advanced Scene Recognition System and autofocus performance help capture images with astounding accuracy. Movies can be shot in Motion JPEG format using the D-Movie function. The camera’s large image sensor ensures exceptional movie image quality and you can create dramatic effects by shooting with a wide range of interchangeable NIKKOR lenses, from wide-angle to macro to fisheye, or by adjusting the lens aperture and experimenting with depth-of-field. The D90 – designed to fuel your passion for photography.</fullDescription><images><image available="true" height="100" width="100"><sourceURL>http://di1.shopping.com/images/pi/57/6a/4f/70621646-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di1.shopping.com/images/pi/57/6a/4f/70621646-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di1.shopping.com/images/pi/57/6a/4f/70621646-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di1.shopping.com/images/pi/57/6a/4f/70621646-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="489" width="490"><sourceURL>http://di1.shopping.com/images/pi/57/6a/4f/70621646-490x489-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=2&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image></images><rating><reviewCount>32</reviewCount><rating>4.81</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/pr/sdc_stars_sm_5.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/Nikon-D90-with-18-105mm-lens/reviews~linkin_id-7000610</reviewURL></rating><minPrice>849.95</minPrice><maxPrice>1599.95</maxPrice><productOffersURL>http://www.shopping.com/Nikon-D90-with-18-105mm-lens/prices~linkin_id-7000610</productOffersURL><productSpecsURL>http://www.shopping.com/Nikon-D90-with-18-105mm-lens/info~linkin_id-7000610</productSpecsURL><offers matchedOfferCount="25" pageNumber="1" returnedOfferCount="5"><offer featured="false" id="3o5e1VghgJPfhLvT1JFKTA==" smartBuy="false" used="false"><name>Nikon D90 18-105mm VR Lens</name><description>The Nikon D90 SLR Digital Camera with its 12.3-megapixel DX-format CMOS 3" High resolution LCD display Scene Recognition System Picture Control Active D-Lighting and one-button Live View prov</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di111.shopping.com/images/di/33/6f/35/6531566768674a5066684c7654314a464b5441-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di111.shopping.com/images/di/33/6f/35/6531566768674a5066684c7654314a464b5441-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image><image available="true" height="260" width="260"><sourceURL>http://di111.shopping.com/images/di/33/6f/35/6531566768674a5066684c7654314a464b5441-260x260-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=1</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">849.95</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">849.95</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=419&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=9390&amp;crawler_id=1905054&amp;dealId=3o5e1VghgJPfhLvT1JFKTA%3D%3D&amp;url=http%3A%2F%2Fwww.ajrichard.com%2FNikon-D90-18-105mm-VR-Lens%2Fp-292%3Frefid%3DShopping%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+18-105mm+VR+Lens&amp;dlprc=849.95&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=2&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=70621646&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=2&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=425&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="9390" trusted="false"><name>AJRichard</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/9390.gif</sourceURL></logo><phoneNumber>1-888-871-1256</phoneNumber><ratingInfo><reviewCount>3124</reviewCount><rating>4.48</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_45.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_ajrichard~MRD-9390~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>292</sku></offer><offer featured="false" id="_lYWj_jbwfsSkfcwUcDuww==" smartBuy="false" used="false"><name>Nikon D90 SLR w/Nikon 18-105mm VR Lens</name><description>12.3 MegapixelDX Format CMOS Sensor3" VGA LCD DisplayLive ViewSelf Cleaning SensorD-Movie ModeHigh Sensitivity (ISO 3200)4.5 fps BurstIn-Camera Image Editing</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di108.shopping.com/images/di/5f/6c/59/576a5f6a62776673536b666377556344757777-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di108.shopping.com/images/di/5f/6c/59/576a5f6a62776673536b666377556344757777-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di108.shopping.com/images/di/5f/6c/59/576a5f6a62776673536b666377556344757777-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di108.shopping.com/images/di/5f/6c/59/576a5f6a62776673536b666377556344757777-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image><image available="true" height="500" width="500"><sourceURL>http://di108.shopping.com/images/di/5f/6c/59/576a5f6a62776673536b666377556344757777-500x500-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=2</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">909.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">909.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=371&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=487342&amp;crawler_id=487342&amp;dealId=_lYWj_jbwfsSkfcwUcDuww%3D%3D&amp;url=http%3A%2F%2Fwww.rythercamera.com%2Fcatalog%2Fproduct_info.php%3Fcsv%3Dsh%26products_id%3D30971%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+SLR+w%2FNikon+18-105mm+VR+Lens&amp;dlprc=909.0&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=3&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=70621646&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=3&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=1&amp;code=&amp;acode=379&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="487342" trusted="false"><name>RytherCamera.com</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/487342.gif</sourceURL></logo><phoneNumber>1-877-644-7593</phoneNumber><ratingInfo><reviewCount>0</reviewCount></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>30971</sku></offer><offer featured="false" id="1KCclCGuWvty2XKU9skadg==" smartBuy="false" used="false"><name>25448/D90 12.3 Megapixel Digital Camera 18-105mm Zoom Lens w/ 3" Screen - Black</name><description>Nikon D90 - Digital camera - SLR - 12.3 Mpix - Nikon AF-S DX 18-105mm lens - optical zoom: 5.8 x - supported memory: SD, SDHC</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di110.shopping.com/images/di/31/4b/43/636c4347755776747932584b5539736b616467-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di110.shopping.com/images/di/31/4b/43/636c4347755776747932584b5539736b616467-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di110.shopping.com/images/di/31/4b/43/636c4347755776747932584b5539736b616467-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image><image available="true" height="400" width="400"><sourceURL>http://di110.shopping.com/images/di/31/4b/43/636c4347755776747932584b5539736b616467-400x400-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=3</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Get 30 days FREE SHIPPING w/ ShipVantage</storeNotes><basePrice currency="USD">1199.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">8.20</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">1199.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=578&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=485615&amp;crawler_id=485615&amp;dealId=1KCclCGuWvty2XKU9skadg%3D%3D&amp;url=http%3A%2F%2Fsears.rdr.channelintelligence.com%2Fgo.asp%3FfVhzOGNRAAQIASNiE1NbQBRtFXpzYx0CTAICI2BbH1lEFmgKP3QvUVpEREdlfUAUHAQPLVpFTVdtJzxAHUNYW3AhQBM0QhFvEXAbYh8EAAVmb2JcVlhCGGkPc3QDEkFZVQ0WFhdRW0MWbgYWDlxzdGMdAVQWRi0xDAwPFhw9TSobb05eWVVYKzsLTFVVQi5RICs3SA8MU1s2MQQKD1wf%26nAID%3D13736960%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=25448%2FD90+12.3+Megapixel+Digital+Camera+18-105mm+Zoom+Lens+w%2F+3%22+Screen+-+Black&amp;dlprc=1199.0&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=4&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=70621646&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=4&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=586&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="485615" trusted="true"><name>Sears</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/485615.gif</sourceURL></logo><phoneNumber>1-800-349-4358</phoneNumber><ratingInfo><reviewCount>888</reviewCount><rating>2.85</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_3.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_sears_4189479~MRD-485615~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>00353197000</sku></offer><offer featured="false" id="3-VOSfVV5Jo7HlA4kJtanA==" smartBuy="false" used="false"><name>Nikon® D90 12.3MP Digital SLR with 18-105mm Lens</name><description>The Nikon D90 will make you rethink what a digital SLR camera can achieve.</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di101.shopping.com/images/di/33/2d/56/4f53665656354a6f37486c41346b4a74616e41-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di101.shopping.com/images/di/33/2d/56/4f53665656354a6f37486c41346b4a74616e41-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="300" width="300"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image><image available="true" height="220" width="220"><sourceURL>http://di101.shopping.com/images/di/33/2d/56/4f53665656354a6f37486c41346b4a74616e41-220x220-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=4</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><basePrice currency="USD">1350.99</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">6.05</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">1350.99</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=504&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=332477&amp;crawler_id=332477&amp;dealId=3-VOSfVV5Jo7HlA4kJtanA%3D%3D&amp;url=http%3A%2F%2Ftracking.searchmarketing.com%2Fgsic.asp%3Faid%3D982673361%26&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon%C2%AE+D90+12.3MP+Digital+SLR+with+18-105mm+Lens&amp;dlprc=1350.99&amp;crn=&amp;istrsmrc=0&amp;isathrsl=0&amp;AR=5&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=70621646&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=5&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=0&amp;FS=0&amp;code=&amp;acode=496&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="332477" trusted="false"><name>RadioShack</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/332477.gif</sourceURL></logo><ratingInfo><reviewCount>24</reviewCount><rating>2.25</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_25.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_radioshack_9689~MRD-332477~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>11148905</sku></offer><offer featured="false" id="kQnB6rS4AjN5dx5h2_631g==" smartBuy="false" used="false"><name>Nikon D90 Kit 12.3-megapixel Digital SLR with 18-105mm VR Lens</name><description>Photographers, take your passion further!Now is the time for new creativity, and to rethink what a digital SLR camera can achieve. It's time for the D90, a camera with everything you would expect from Nikon's next-generation D-SLRs, and some unexpected surprises, as well. The stunning image quality is inherited from the D300, Nikon's DX-format flagship. The D90 also has Nikon's unmatched ergonomics and high performance, and now takes high-quality movies with beautifully cinematic results. The world of photography has changed, and with the D90 in your hands, it's time to make your own rules.AF-S DX NIKKOR 18-105mm f/3.5-5.6G ED VR LensWide-ratio 5.8x zoom Compact, versatile and ideal for a broad range of shooting situations, ranging from interiors and landscapes to beautiful portraits� a perfect everyday zoom. Nikon VR (Vibration Reduction) image stabilization Vibration Reduction is engineered specifically for each VR NIKKOR lens and enables handheld shooting at up to 3 shutter speeds slower than would</description><categoryId>7185</categoryId><manufacturer>Nikon</manufacturer><imageList><image available="true" height="100" width="100"><sourceURL>http://di110.shopping.com/images/di/6b/51/6e/4236725334416a4e3564783568325f36333167-100x100-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="200" width="200"><sourceURL>http://di110.shopping.com/images/di/6b/51/6e/4236725334416a4e3564783568325f36333167-200x200-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="300" width="300"><sourceURL>http://di110.shopping.com/images/di/6b/51/6e/4236725334416a4e3564783568325f36333167-300x300-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="false" height="400" width="400"><sourceURL>http://img.shopping.com/sc/ds/no_image_100X100.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image><image available="true" height="232" width="300"><sourceURL>http://di110.shopping.com/images/di/6b/51/6e/4236725334416a4e3564783568325f36333167-300x232-0-0.jpg?p=p2.a121bc2aaf029435dce6&amp;a=1&amp;c=1&amp;l=7000610&amp;t=111021183845&amp;r=5</sourceURL></image></imageList><stockStatus>in-stock</stockStatus><storeNotes>Shipping Included!</storeNotes><basePrice currency="USD">1050.00</basePrice><tax checkSite="true"></tax><shippingCost currency="USD">0.00</shippingCost><totalPrice checkSite="true"></totalPrice><originalPrice currency="USD">1199.00</originalPrice><offerURL>http://statTest.dealtime.com/DealFrame/DealFrame.cmp?bm=135&amp;BEFID=7185&amp;aon=%5E1&amp;MerchantID=313162&amp;crawler_id=313162&amp;dealId=kQnB6rS4AjN5dx5h2_631g%3D%3D&amp;url=http%3A%2F%2Fonecall.rdr.channelintelligence.com%2Fgo.asp%3FfVhzOGNRAAQIASNiE1pZSxNoWHFwLx8GTAICa2ZeH1sPXTZLNzRpAh1HR0BxPQEGCBJNMhFHUElsFCFCVkVTTHAcBggEHQ4aHXNpGERGH3RQODsbAgdechJtbBt8fx8JAwhtZFAzJj1oGgIWCxRlNyFOUV9UUGIxBgo0T0IyTSYqJ0RWHw4QPCIBAAQXRGMDICg6TllZVBhh%26nAID%3D13736960&amp;linkin_id=7000610&amp;Issdt=111021183845&amp;searchID=p2.a121bc2aaf029435dce6&amp;DealName=Nikon+D90+Kit+12.3-megapixel+Digital+SLR+with+18-105mm+VR+Lens&amp;dlprc=1050.0&amp;crn=&amp;istrsmrc=1&amp;isathrsl=0&amp;AR=6&amp;NG=20&amp;NDP=200&amp;PN=1&amp;ST=7&amp;DB=sdcprod&amp;MT=phx-pkadudc2&amp;FPT=DSP&amp;NDS=&amp;NMS=&amp;MRS=&amp;PD=70621646&amp;brnId=14804&amp;IsFtr=0&amp;IsSmart=0&amp;DMT=&amp;op=&amp;CM=&amp;DlLng=1&amp;RR=6&amp;cid=&amp;semid1=&amp;semid2=&amp;IsLps=0&amp;CC=0&amp;SL=1&amp;FS=1&amp;code=&amp;acode=143&amp;category=&amp;HasLink=&amp;frameId=&amp;ND=&amp;MN=&amp;PT=&amp;prjID=&amp;GR=&amp;lnkId=&amp;VK=</offerURL><store authorizedReseller="false" id="313162" trusted="true"><name>OneCall</name><logo available="true" height="31" width="88"><sourceURL>http://img.shopping.com/cctool/merch_logos/313162.gif</sourceURL></logo><phoneNumber>1.800.398.0766</phoneNumber><ratingInfo><reviewCount>180</reviewCount><rating>4.44</rating><ratingImage height="18" width="91"><sourceURL>http://img.shopping.com/sc/mr/sdc_checks_45.gif</sourceURL></ratingImage><reviewURL>http://www.shopping.com/xMR-store_onecall_9689~MRD-313162~S-1~linkin_id-7000610</reviewURL></ratingInfo><countryFlag height="11" width="18"><sourceURL>http://img.shopping.com/sc/glb/flag/US.gif</sourceURL><countryCode>US</countryCode></countryFlag></store><sku>92826</sku></offer></offers></product></items><attributes matchedAttributeCount="5" returnedAttributeCount="5"><attribute id="Dynamic_Price_Range"><name>Price range</name><attributeURL>http://www.shopping.com/digital-cameras/nikon/products?oq=nikon&amp;linkin_id=7000610</attributeURL><attributeValues matchedValueCount="2" returnedValueCount="2"><attributeValue id="price_range_24_4012" matchingItemsCount="1"><name>$24 - $4012</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon/products?minPrice=24&amp;maxPrice=4012&amp;linkin_id=7000610</attributeValueURL></attributeValue><attributeValue id="price_range_4012_7999" matchingItemsCount="1"><name>$4012 - $7999</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon/products?minPrice=4012&amp;maxPrice=7999&amp;linkin_id=7000610</attributeValueURL></attributeValue></attributeValues></attribute><attribute id="9688_brand"><name>Brand</name><attributeURL>http://www.shopping.com/digital-cameras/nikon/products~all-9688-brand~MS-1?oq=nikon&amp;linkin_id=7000610</attributeURL><attributeValues matchedValueCount="7" returnedValueCount="5"><attributeValue id="brand_nikon" matchingItemsCount="2261"><name>Nikon</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+brand-nikon/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="9688_brand_crane" matchingItemsCount="17"><name>Crane</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+9688-brand-crane/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="ikelite" matchingItemsCount="2"><name>Ikelite</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+ikelite/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="bower" matchingItemsCount="1"><name>Bower</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+bower/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="brand_fuji" matchingItemsCount="2"><name>FUJIFILM</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+brand-fuji/products~linkin_id-7000610</attributeValueURL></attributeValue></attributeValues></attribute><attribute id="store"><name>Store</name><attributeURL>http://www.shopping.com/digital-cameras/nikon/products~all-store~MS-1?oq=nikon&amp;linkin_id=7000610</attributeURL><attributeValues matchedValueCount="35" returnedValueCount="5"><attributeValue id="store_amazon_marketplace_9689" matchingItemsCount="808"><name>Amazon Marketplace</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+store-amazon-marketplace-9689/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="store_amazon" matchingItemsCount="83"><name>Amazon</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+store-amazon/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="store_adorama" matchingItemsCount="81"><name>Adorama</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+store-adorama/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="store_j_r_music_and_computer_world" matchingItemsCount="78"><name>J&amp;R Music and Computer World</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+store-j-r-music-and-computer-world/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="store_rythercamera_com" matchingItemsCount="78"><name>RytherCamera.com</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+store-rythercamera-com/products~linkin_id-7000610</attributeValueURL></attributeValue></attributeValues></attribute><attribute id="21885_resolution"><name>Resolution</name><attributeURL>http://www.shopping.com/digital-cameras/nikon/products~all-21885-resolution~MS-1?oq=nikon&amp;linkin_id=7000610</attributeURL><attributeValues matchedValueCount="13" returnedValueCount="5"><attributeValue id="under_4_megapixel" matchingItemsCount="3"><name>Under 4 Megapixel</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+under-4-megapixel/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="5_megapixel_digital_cameras" matchingItemsCount="1085"><name>At least 5 Megapixel</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+5-megapixel-digital-cameras/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="6_megapixel_digital_cameras" matchingItemsCount="1080"><name>At least 6 Megapixel</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+6-megapixel-digital-cameras/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="7_megapixel_digital_cameras" matchingItemsCount="1066"><name>At least 7 Megapixel</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+7-megapixel-digital-cameras/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="8_megapixel_digital_cameras" matchingItemsCount="1056"><name>At least 8 Megapixel</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+8-megapixel-digital-cameras/products~linkin_id-7000610</attributeValueURL></attributeValue></attributeValues></attribute><attribute id="32804-features"><name>Features</name><attributeURL>http://www.shopping.com/digital-cameras/nikon/products~all-32804-features~MS-1?oq=nikon&amp;linkin_id=7000610</attributeURL><attributeValues matchedValueCount="12" returnedValueCount="5"><attributeValue id="32804_features_shockproof" matchingItemsCount="7"><name>Shockproof</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+32804-features-shockproof/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="32804_features_waterproof" matchingItemsCount="32"><name>Waterproof</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+32804-features-waterproof/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="32804_features_freezeproof" matchingItemsCount="7"><name>Freezeproof</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+32804-features-freezeproof/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="32804_features_dust_proof" matchingItemsCount="23"><name>Dust proof</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+32804-features-dust-proof/products~linkin_id-7000610</attributeValueURL></attributeValue><attributeValue id="32804_features_image_stabilization" matchingItemsCount="797"><name>Image Stabilization</name><attributeValueURL>http://www.shopping.com/digital-cameras/nikon+32804-features-image-stabilization/products~linkin_id-7000610</attributeValueURL></attributeValue></attributeValues></attribute></attributes><contentType>hybrid</contentType></category></categories><relatedTerms><term>digital camera</term><term>g1</term><term>sony</term><term>camera</term><term>canon</term><term>nikon</term><term>kodak digital camera</term><term>kodak</term><term>sony cybershot</term><term>kodak easyshare digital camera</term><term>nikon coolpix</term><term>olympus</term><term>pink digital camera</term><term>canon powershot</term></relatedTerms></GeneralSearchResponse> \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/strict.dtd b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/strict.dtd
new file mode 100644
index 000000000..b27455943
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/strict.dtd
@@ -0,0 +1,870 @@
+<!--
+ This is HTML 4.01 Strict DTD, which excludes the presentation
+ attributes and elements that W3C expects to phase out as
+ support for style sheets matures. Authors should use the Strict
+ DTD when possible, but may use the Transitional DTD when support
+ for presentation attribute and elements is required.
+
+ HTML 4 includes mechanisms for style sheets, scripting,
+ embedding objects, improved support for right to left and mixed
+ direction text, and enhancements to forms for improved
+ accessibility for people with disabilities.
+
+ Draft: $Date: 1999/12/24 23:37:48 $
+
+ Authors:
+ Dave Raggett <dsr@w3.org>
+ Arnaud Le Hors <lehors@w3.org>
+ Ian Jacobs <ij@w3.org>
+
+ Further information about HTML 4.01 is available at:
+
+ http://www.w3.org/TR/1999/REC-html401-19991224
+
+
+ The HTML 4.01 specification includes additional
+ syntactic constraints that cannot be expressed within
+ the DTDs.
+
+-->
+<!--
+ Typical usage:
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+ <html>
+ <head>
+ ...
+ </head>
+ <body>
+ ...
+ </body>
+ </html>
+
+ The URI used as a system identifier with the public identifier allows
+ the user agent to download the DTD and entity sets as needed.
+
+ The FPI for the Transitional HTML 4.01 DTD is:
+
+ "-//W3C//DTD HTML 4.01 Transitional//EN"
+
+ This version of the transitional DTD is:
+
+ http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd
+
+ If you are writing a document that includes frames, use
+ the following FPI:
+
+ "-//W3C//DTD HTML 4.01 Frameset//EN"
+
+ This version of the frameset DTD is:
+
+ http://www.w3.org/TR/1999/REC-html401-19991224/frameset.dtd
+
+ Use the following (relative) URIs to refer to
+ the DTDs and entity definitions of this specification:
+
+ "strict.dtd"
+ "loose.dtd"
+ "frameset.dtd"
+ "HTMLlat1.ent"
+ "HTMLsymbol.ent"
+ "HTMLspecial.ent"
+
+-->
+
+<!--================== Imported Names ====================================-->
+<!-- Feature Switch for frameset documents -->
+<!ENTITY % HTML.Frameset "IGNORE">
+
+<!ENTITY % ContentType "CDATA"
+ -- media type, as per [RFC2045]
+ -->
+
+<!ENTITY % ContentTypes "CDATA"
+ -- comma-separated list of media types, as per [RFC2045]
+ -->
+
+<!ENTITY % Charset "CDATA"
+ -- a character encoding, as per [RFC2045]
+ -->
+
+<!ENTITY % Charsets "CDATA"
+ -- a space-separated list of character encodings, as per [RFC2045]
+ -->
+
+<!ENTITY % LanguageCode "NAME"
+ -- a language code, as per [RFC1766]
+ -->
+
+<!ENTITY % Character "CDATA"
+ -- a single character from [ISO10646]
+ -->
+
+<!ENTITY % LinkTypes "CDATA"
+ -- space-separated list of link types
+ -->
+
+<!ENTITY % MediaDesc "CDATA"
+ -- single or comma-separated list of media descriptors
+ -->
+
+<!ENTITY % URI "CDATA"
+ -- a Uniform Resource Identifier,
+ see [URI]
+ -->
+
+<!ENTITY % Datetime "CDATA" -- date and time information. ISO date format -->
+
+
+<!ENTITY % Script "CDATA" -- script expression -->
+
+<!ENTITY % StyleSheet "CDATA" -- style sheet data -->
+
+
+
+<!ENTITY % Text "CDATA">
+
+
+<!-- Parameter Entities -->
+
+<!ENTITY % head.misc "SCRIPT|STYLE|META|LINK|OBJECT" -- repeatable head elements -->
+
+<!ENTITY % heading "H1|H2|H3|H4|H5|H6">
+
+<!ENTITY % list "UL | OL">
+
+<!ENTITY % preformatted "PRE">
+
+
+<!--================ Character mnemonic entities =========================-->
+
+<!ENTITY % HTMLlat1 PUBLIC
+ "-//W3C//ENTITIES Latin1//EN//HTML"
+ "HTMLlat1.ent">
+%HTMLlat1;
+
+<!ENTITY % HTMLsymbol PUBLIC
+ "-//W3C//ENTITIES Symbols//EN//HTML"
+ "HTMLsymbol.ent">
+%HTMLsymbol;
+
+<!ENTITY % HTMLspecial PUBLIC
+ "-//W3C//ENTITIES Special//EN//HTML"
+ "HTMLspecial.ent">
+%HTMLspecial;
+<!--=================== Generic Attributes ===============================-->
+
+<!ENTITY % coreattrs
+ "id ID #IMPLIED -- document-wide unique id --
+ class CDATA #IMPLIED -- space-separated list of classes --
+ style %StyleSheet; #IMPLIED -- associated style info --
+ title %Text; #IMPLIED -- advisory title --"
+ >
+
+<!ENTITY % i18n
+ "lang %LanguageCode; #IMPLIED -- language code --
+ dir (ltr|rtl) #IMPLIED -- direction for weak/neutral text --"
+ >
+
+<!ENTITY % events
+ "onclick %Script; #IMPLIED -- a pointer button was clicked --
+ ondblclick %Script; #IMPLIED -- a pointer button was double clicked--
+ onmousedown %Script; #IMPLIED -- a pointer button was pressed down --
+ onmouseup %Script; #IMPLIED -- a pointer button was released --
+ onmouseover %Script; #IMPLIED -- a pointer was moved onto --
+ onmousemove %Script; #IMPLIED -- a pointer was moved within --
+ onmouseout %Script; #IMPLIED -- a pointer was moved away --
+ onkeypress %Script; #IMPLIED -- a key was pressed and released --
+ onkeydown %Script; #IMPLIED -- a key was pressed down --
+ onkeyup %Script; #IMPLIED -- a key was released --"
+ >
+
+<!-- Reserved Feature Switch -->
+<!ENTITY % HTML.Reserved "IGNORE">
+
+<!-- The following attributes are reserved for possible future use -->
+<![ %HTML.Reserved; [
+<!ENTITY % reserved
+ "datasrc %URI; #IMPLIED -- a single or tabular Data Source --
+ datafld CDATA #IMPLIED -- the property or column name --
+ dataformatas (plaintext|html) plaintext -- text or html --"
+ >
+]]>
+
+<!ENTITY % reserved "">
+
+<!ENTITY % attrs "%coreattrs; %i18n; %events;">
+
+
+<!--=================== Text Markup ======================================-->
+
+<!ENTITY % fontstyle
+ "TT | I | B | BIG | SMALL">
+
+<!ENTITY % phrase "EM | STRONG | DFN | CODE |
+ SAMP | KBD | VAR | CITE | ABBR | ACRONYM" >
+
+<!ENTITY % special
+ "A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO">
+
+<!ENTITY % formctrl "INPUT | SELECT | TEXTAREA | LABEL | BUTTON">
+
+<!-- %inline; covers inline or "text-level" elements -->
+<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">
+
+<!ELEMENT (%fontstyle;|%phrase;) - - (%inline;)*>
+<!ATTLIST (%fontstyle;|%phrase;)
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!ELEMENT (SUB|SUP) - - (%inline;)* -- subscript, superscript -->
+<!ATTLIST (SUB|SUP)
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!ELEMENT SPAN - - (%inline;)* -- generic language/style container -->
+<!ATTLIST SPAN
+ %attrs; -- %coreattrs, %i18n, %events --
+ %reserved; -- reserved for possible future use --
+ >
+
+<!ELEMENT BDO - - (%inline;)* -- I18N BiDi over-ride -->
+<!ATTLIST BDO
+ %coreattrs; -- id, class, style, title --
+ lang %LanguageCode; #IMPLIED -- language code --
+ dir (ltr|rtl) #REQUIRED -- directionality --
+ >
+
+
+<!ELEMENT BR - O EMPTY -- forced line break -->
+<!ATTLIST BR
+ %coreattrs; -- id, class, style, title --
+ >
+
+<!--================== HTML content models ===============================-->
+
+<!--
+ HTML has two basic content models:
+
+ %inline; character level elements and text strings
+ %block; block-like elements e.g. paragraphs and lists
+-->
+
+<!ENTITY % block
+ "P | %heading; | %list; | %preformatted; | DL | DIV | NOSCRIPT |
+ BLOCKQUOTE | FORM | HR | TABLE | FIELDSET | ADDRESS">
+
+<!ENTITY % flow "%block; | %inline;">
+
+<!--=================== Document Body ====================================-->
+
+<!ELEMENT BODY O O (%block;|SCRIPT)+ +(INS|DEL) -- document body -->
+<!ATTLIST BODY
+ %attrs; -- %coreattrs, %i18n, %events --
+ onload %Script; #IMPLIED -- the document has been loaded --
+ onunload %Script; #IMPLIED -- the document has been removed --
+ >
+
+<!ELEMENT ADDRESS - - (%inline;)* -- information on author -->
+<!ATTLIST ADDRESS
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!ELEMENT DIV - - (%flow;)* -- generic language/style container -->
+<!ATTLIST DIV
+ %attrs; -- %coreattrs, %i18n, %events --
+ %reserved; -- reserved for possible future use --
+ >
+
+
+<!--================== The Anchor Element ================================-->
+
+<!ENTITY % Shape "(rect|circle|poly|default)">
+<!ENTITY % Coords "CDATA" -- comma-separated list of lengths -->
+
+<!ELEMENT A - - (%inline;)* -(A) -- anchor -->
+<!ATTLIST A
+ %attrs; -- %coreattrs, %i18n, %events --
+ charset %Charset; #IMPLIED -- char encoding of linked resource --
+ type %ContentType; #IMPLIED -- advisory content type --
+ name CDATA #IMPLIED -- named link end --
+ href %URI; #IMPLIED -- URI for linked resource --
+ hreflang %LanguageCode; #IMPLIED -- language code --
+ rel %LinkTypes; #IMPLIED -- forward link types --
+ rev %LinkTypes; #IMPLIED -- reverse link types --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ shape %Shape; rect -- for use with client-side image maps --
+ coords %Coords; #IMPLIED -- for use with client-side image maps --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ >
+
+<!--================== Client-side image maps ============================-->
+
+<!-- These can be placed in the same document or grouped in a
+ separate document although this isn't yet widely supported -->
+
+<!ELEMENT MAP - - ((%block;) | AREA)+ -- client-side image map -->
+<!ATTLIST MAP
+ %attrs; -- %coreattrs, %i18n, %events --
+ name CDATA #REQUIRED -- for reference by usemap --
+ >
+
+<!ELEMENT AREA - O EMPTY -- client-side image map area -->
+<!ATTLIST AREA
+ %attrs; -- %coreattrs, %i18n, %events --
+ shape %Shape; rect -- controls interpretation of coords --
+ coords %Coords; #IMPLIED -- comma-separated list of lengths --
+ href %URI; #IMPLIED -- URI for linked resource --
+ nohref (nohref) #IMPLIED -- this region has no action --
+ alt %Text; #REQUIRED -- short description --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ >
+
+<!--================== The LINK Element ==================================-->
+
+<!--
+ Relationship values can be used in principle:
+
+ a) for document specific toolbars/menus when used
+ with the LINK element in document head e.g.
+ start, contents, previous, next, index, end, help
+ b) to link to a separate style sheet (rel=stylesheet)
+ c) to make a link to a script (rel=script)
+ d) by stylesheets to control how collections of
+ html nodes are rendered into printed documents
+ e) to make a link to a printable version of this document
+ e.g. a postscript or pdf version (rel=alternate media=print)
+-->
+
+<!ELEMENT LINK - O EMPTY -- a media-independent link -->
+<!ATTLIST LINK
+ %attrs; -- %coreattrs, %i18n, %events --
+ charset %Charset; #IMPLIED -- char encoding of linked resource --
+ href %URI; #IMPLIED -- URI for linked resource --
+ hreflang %LanguageCode; #IMPLIED -- language code --
+ type %ContentType; #IMPLIED -- advisory content type --
+ rel %LinkTypes; #IMPLIED -- forward link types --
+ rev %LinkTypes; #IMPLIED -- reverse link types --
+ media %MediaDesc; #IMPLIED -- for rendering on these media --
+ >
+
+<!--=================== Images ===========================================-->
+
+<!-- Length defined in strict DTD for cellpadding/cellspacing -->
+<!ENTITY % Length "CDATA" -- nn for pixels or nn% for percentage length -->
+<!ENTITY % MultiLength "CDATA" -- pixel, percentage, or relative -->
+
+<![ %HTML.Frameset; [
+<!ENTITY % MultiLengths "CDATA" -- comma-separated list of MultiLength -->
+]]>
+
+<!ENTITY % Pixels "CDATA" -- integer representing length in pixels -->
+
+
+<!-- To avoid problems with text-only UAs as well as
+ to make image content understandable and navigable
+ to users of non-visual UAs, you need to provide
+ a description with ALT, and avoid server-side image maps -->
+<!ELEMENT IMG - O EMPTY -- Embedded image -->
+<!ATTLIST IMG
+ %attrs; -- %coreattrs, %i18n, %events --
+ src %URI; #REQUIRED -- URI of image to embed --
+ alt %Text; #REQUIRED -- short description --
+ longdesc %URI; #IMPLIED -- link to long description
+ (complements alt) --
+ name CDATA #IMPLIED -- name of image for scripting --
+ height %Length; #IMPLIED -- override height --
+ width %Length; #IMPLIED -- override width --
+ usemap %URI; #IMPLIED -- use client-side image map --
+ ismap (ismap) #IMPLIED -- use server-side image map --
+ >
+
+<!-- USEMAP points to a MAP element which may be in this document
+ or an external document, although the latter is not widely supported -->
+
+<!--==================== OBJECT ======================================-->
+<!--
+ OBJECT is used to embed objects as part of HTML pages
+ PARAM elements should precede other content. SGML mixed content
+ model technicality precludes specifying this formally ...
+-->
+
+<!ELEMENT OBJECT - - (PARAM | %flow;)*
+ -- generic embedded object -->
+<!ATTLIST OBJECT
+ %attrs; -- %coreattrs, %i18n, %events --
+ declare (declare) #IMPLIED -- declare but don't instantiate flag --
+ classid %URI; #IMPLIED -- identifies an implementation --
+ codebase %URI; #IMPLIED -- base URI for classid, data, archive--
+ data %URI; #IMPLIED -- reference to object's data --
+ type %ContentType; #IMPLIED -- content type for data --
+ codetype %ContentType; #IMPLIED -- content type for code --
+ archive CDATA #IMPLIED -- space-separated list of URIs --
+ standby %Text; #IMPLIED -- message to show while loading --
+ height %Length; #IMPLIED -- override height --
+ width %Length; #IMPLIED -- override width --
+ usemap %URI; #IMPLIED -- use client-side image map --
+ name CDATA #IMPLIED -- submit as part of form --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ %reserved; -- reserved for possible future use --
+ >
+
+<!ELEMENT PARAM - O EMPTY -- named property value -->
+<!ATTLIST PARAM
+ id ID #IMPLIED -- document-wide unique id --
+ name CDATA #REQUIRED -- property name --
+ value CDATA #IMPLIED -- property value --
+ valuetype (DATA|REF|OBJECT) DATA -- How to interpret value --
+ type %ContentType; #IMPLIED -- content type for value
+ when valuetype=ref --
+ >
+
+
+<!--=================== Horizontal Rule ==================================-->
+
+<!ELEMENT HR - O EMPTY -- horizontal rule -->
+<!ATTLIST HR
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!--=================== Paragraphs =======================================-->
+
+<!ELEMENT P - O (%inline;)* -- paragraph -->
+<!ATTLIST P
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!--=================== Headings =========================================-->
+
+<!--
+ There are six levels of headings from H1 (the most important)
+ to H6 (the least important).
+-->
+
+<!ELEMENT (%heading;) - - (%inline;)* -- heading -->
+<!ATTLIST (%heading;)
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!--=================== Preformatted Text ================================-->
+
+<!-- excludes markup for images and changes in font size -->
+<!ENTITY % pre.exclusion "IMG|OBJECT|BIG|SMALL|SUB|SUP">
+
+<!ELEMENT PRE - - (%inline;)* -(%pre.exclusion;) -- preformatted text -->
+<!ATTLIST PRE
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!--===================== Inline Quotes ==================================-->
+
+<!ELEMENT Q - - (%inline;)* -- short inline quotation -->
+<!ATTLIST Q
+ %attrs; -- %coreattrs, %i18n, %events --
+ cite %URI; #IMPLIED -- URI for source document or msg --
+ >
+
+<!--=================== Block-like Quotes ================================-->
+
+<!ELEMENT BLOCKQUOTE - - (%block;|SCRIPT)+ -- long quotation -->
+<!ATTLIST BLOCKQUOTE
+ %attrs; -- %coreattrs, %i18n, %events --
+ cite %URI; #IMPLIED -- URI for source document or msg --
+ >
+
+<!--=================== Inserted/Deleted Text ============================-->
+
+
+<!-- INS/DEL are handled by inclusion on BODY -->
+<!ELEMENT (INS|DEL) - - (%flow;)* -- inserted text, deleted text -->
+<!ATTLIST (INS|DEL)
+ %attrs; -- %coreattrs, %i18n, %events --
+ cite %URI; #IMPLIED -- info on reason for change --
+ datetime %Datetime; #IMPLIED -- date and time of change --
+ >
+
+<!--=================== Lists ============================================-->
+
+<!-- definition lists - DT for term, DD for its definition -->
+
+<!ELEMENT DL - - (DT|DD)+ -- definition list -->
+<!ATTLIST DL
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!ELEMENT DT - O (%inline;)* -- definition term -->
+<!ELEMENT DD - O (%flow;)* -- definition description -->
+<!ATTLIST (DT|DD)
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+
+<!ELEMENT OL - - (LI)+ -- ordered list -->
+<!ATTLIST OL
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!-- Unordered Lists (UL) bullet styles -->
+<!ELEMENT UL - - (LI)+ -- unordered list -->
+<!ATTLIST UL
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+
+
+<!ELEMENT LI - O (%flow;)* -- list item -->
+<!ATTLIST LI
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!--================ Forms ===============================================-->
+<!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM) -- interactive form -->
+<!ATTLIST FORM
+ %attrs; -- %coreattrs, %i18n, %events --
+ action %URI; #REQUIRED -- server-side form handler --
+ method (GET|POST) GET -- HTTP method used to submit the form--
+ enctype %ContentType; "application/x-www-form-urlencoded"
+ accept %ContentTypes; #IMPLIED -- list of MIME types for file upload --
+ name CDATA #IMPLIED -- name of form for scripting --
+ onsubmit %Script; #IMPLIED -- the form was submitted --
+ onreset %Script; #IMPLIED -- the form was reset --
+ accept-charset %Charsets; #IMPLIED -- list of supported charsets --
+ >
+
+<!-- Each label must not contain more than ONE field -->
+<!ELEMENT LABEL - - (%inline;)* -(LABEL) -- form field label text -->
+<!ATTLIST LABEL
+ %attrs; -- %coreattrs, %i18n, %events --
+ for IDREF #IMPLIED -- matches field ID value --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ >
+
+<!ENTITY % InputType
+ "(TEXT | PASSWORD | CHECKBOX |
+ RADIO | SUBMIT | RESET |
+ FILE | HIDDEN | IMAGE | BUTTON)"
+ >
+
+<!-- attribute name required for all but submit and reset -->
+<!ELEMENT INPUT - O EMPTY -- form control -->
+<!ATTLIST INPUT
+ %attrs; -- %coreattrs, %i18n, %events --
+ type %InputType; TEXT -- what kind of widget is needed --
+ name CDATA #IMPLIED -- submit as part of form --
+ value CDATA #IMPLIED -- Specify for radio buttons and checkboxes --
+ checked (checked) #IMPLIED -- for radio buttons and check boxes --
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ readonly (readonly) #IMPLIED -- for text and passwd --
+ size CDATA #IMPLIED -- specific to each type of field --
+ maxlength NUMBER #IMPLIED -- max chars for text fields --
+ src %URI; #IMPLIED -- for fields with images --
+ alt CDATA #IMPLIED -- short description --
+ usemap %URI; #IMPLIED -- use client-side image map --
+ ismap (ismap) #IMPLIED -- use server-side image map --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ onselect %Script; #IMPLIED -- some text was selected --
+ onchange %Script; #IMPLIED -- the element value was changed --
+ accept %ContentTypes; #IMPLIED -- list of MIME types for file upload --
+ %reserved; -- reserved for possible future use --
+ >
+
+<!ELEMENT SELECT - - (OPTGROUP|OPTION)+ -- option selector -->
+<!ATTLIST SELECT
+ %attrs; -- %coreattrs, %i18n, %events --
+ name CDATA #IMPLIED -- field name --
+ size NUMBER #IMPLIED -- rows visible --
+ multiple (multiple) #IMPLIED -- default is single selection --
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ onchange %Script; #IMPLIED -- the element value was changed --
+ %reserved; -- reserved for possible future use --
+ >
+
+<!ELEMENT OPTGROUP - - (OPTION)+ -- option group -->
+<!ATTLIST OPTGROUP
+ %attrs; -- %coreattrs, %i18n, %events --
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ label %Text; #REQUIRED -- for use in hierarchical menus --
+ >
+
+<!ELEMENT OPTION - O (#PCDATA) -- selectable choice -->
+<!ATTLIST OPTION
+ %attrs; -- %coreattrs, %i18n, %events --
+ selected (selected) #IMPLIED
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ label %Text; #IMPLIED -- for use in hierarchical menus --
+ value CDATA #IMPLIED -- defaults to element content --
+ >
+
+<!ELEMENT TEXTAREA - - (#PCDATA) -- multi-line text field -->
+<!ATTLIST TEXTAREA
+ %attrs; -- %coreattrs, %i18n, %events --
+ name CDATA #IMPLIED
+ rows NUMBER #REQUIRED
+ cols NUMBER #REQUIRED
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ readonly (readonly) #IMPLIED
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ onselect %Script; #IMPLIED -- some text was selected --
+ onchange %Script; #IMPLIED -- the element value was changed --
+ %reserved; -- reserved for possible future use --
+ >
+
+<!--
+ #PCDATA is to solve the mixed content problem,
+ per specification only whitespace is allowed there!
+ -->
+<!ELEMENT FIELDSET - - (#PCDATA,LEGEND,(%flow;)*) -- form control group -->
+<!ATTLIST FIELDSET
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!ELEMENT LEGEND - - (%inline;)* -- fieldset legend -->
+
+<!ATTLIST LEGEND
+ %attrs; -- %coreattrs, %i18n, %events --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ >
+
+<!ELEMENT BUTTON - -
+ (%flow;)* -(A|%formctrl;|FORM|FIELDSET)
+ -- push button -->
+<!ATTLIST BUTTON
+ %attrs; -- %coreattrs, %i18n, %events --
+ name CDATA #IMPLIED
+ value CDATA #IMPLIED -- sent to server when submitted --
+ type (button|submit|reset) submit -- for use as form button --
+ disabled (disabled) #IMPLIED -- unavailable in this context --
+ tabindex NUMBER #IMPLIED -- position in tabbing order --
+ accesskey %Character; #IMPLIED -- accessibility key character --
+ onfocus %Script; #IMPLIED -- the element got the focus --
+ onblur %Script; #IMPLIED -- the element lost the focus --
+ %reserved; -- reserved for possible future use --
+ >
+
+<!--======================= Tables =======================================-->
+
+<!-- IETF HTML table standard, see [RFC1942] -->
+
+<!--
+ The BORDER attribute sets the thickness of the frame around the
+ table. The default units are screen pixels.
+
+ The FRAME attribute specifies which parts of the frame around
+ the table should be rendered. The values are not the same as
+ CALS to avoid a name clash with the VALIGN attribute.
+
+ The value "border" is included for backwards compatibility with
+ <TABLE BORDER> which yields frame=border and border=implied
+ For <TABLE BORDER=1> you get border=1 and frame=implied. In this
+ case, it is appropriate to treat this as frame=border for backwards
+ compatibility with deployed browsers.
+-->
+<!ENTITY % TFrame "(void|above|below|hsides|lhs|rhs|vsides|box|border)">
+
+<!--
+ The RULES attribute defines which rules to draw between cells:
+
+ If RULES is absent then assume:
+ "none" if BORDER is absent or BORDER=0 otherwise "all"
+-->
+
+<!ENTITY % TRules "(none | groups | rows | cols | all)">
+
+<!-- horizontal placement of table relative to document -->
+<!ENTITY % TAlign "(left|center|right)">
+
+<!-- horizontal alignment attributes for cell contents -->
+<!ENTITY % cellhalign
+ "align (left|center|right|justify|char) #IMPLIED
+ char %Character; #IMPLIED -- alignment char, e.g. char=':' --
+ charoff %Length; #IMPLIED -- offset for alignment char --"
+ >
+
+<!-- vertical alignment attributes for cell contents -->
+<!ENTITY % cellvalign
+ "valign (top|middle|bottom|baseline) #IMPLIED"
+ >
+
+<!ELEMENT TABLE - -
+ (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)>
+<!ELEMENT CAPTION - - (%inline;)* -- table caption -->
+<!ELEMENT THEAD - O (TR)+ -- table header -->
+<!ELEMENT TFOOT - O (TR)+ -- table footer -->
+<!ELEMENT TBODY O O (TR)+ -- table body -->
+<!ELEMENT COLGROUP - O (COL)* -- table column group -->
+<!ELEMENT COL - O EMPTY -- table column -->
+<!ELEMENT TR - O (TH|TD)+ -- table row -->
+<!ELEMENT (TH|TD) - O (%flow;)* -- table header cell, table data cell-->
+
+<!ATTLIST TABLE -- table element --
+ %attrs; -- %coreattrs, %i18n, %events --
+ summary %Text; #IMPLIED -- purpose/structure for speech output--
+ width %Length; #IMPLIED -- table width --
+ border %Pixels; #IMPLIED -- controls frame width around table --
+ frame %TFrame; #IMPLIED -- which parts of frame to render --
+ rules %TRules; #IMPLIED -- rulings between rows and cols --
+ cellspacing %Length; #IMPLIED -- spacing between cells --
+ cellpadding %Length; #IMPLIED -- spacing within cells --
+ %reserved; -- reserved for possible future use --
+ datapagesize CDATA #IMPLIED -- reserved for possible future use --
+ >
+
+
+<!ATTLIST CAPTION
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!--
+COLGROUP groups a set of COL elements. It allows you to group
+several semantically related columns together.
+-->
+<!ATTLIST COLGROUP
+ %attrs; -- %coreattrs, %i18n, %events --
+ span NUMBER 1 -- default number of columns in group --
+ width %MultiLength; #IMPLIED -- default width for enclosed COLs --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ >
+
+<!--
+ COL elements define the alignment properties for cells in
+ one or more columns.
+
+ The WIDTH attribute specifies the width of the columns, e.g.
+
+ width=64 width in screen pixels
+ width=0.5* relative width of 0.5
+
+ The SPAN attribute causes the attributes of one
+ COL element to apply to more than one column.
+-->
+<!ATTLIST COL -- column groups and properties --
+ %attrs; -- %coreattrs, %i18n, %events --
+ span NUMBER 1 -- COL attributes affect N columns --
+ width %MultiLength; #IMPLIED -- column width specification --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ >
+
+<!--
+ Use THEAD to duplicate headers when breaking table
+ across page boundaries, or for static headers when
+ TBODY sections are rendered in scrolling panel.
+
+ Use TFOOT to duplicate footers when breaking table
+ across page boundaries, or for static footers when
+ TBODY sections are rendered in scrolling panel.
+
+ Use multiple TBODY sections when rules are needed
+ between groups of table rows.
+-->
+<!ATTLIST (THEAD|TBODY|TFOOT) -- table section --
+ %attrs; -- %coreattrs, %i18n, %events --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ >
+
+<!ATTLIST TR -- table row --
+ %attrs; -- %coreattrs, %i18n, %events --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ >
+
+
+<!-- Scope is simpler than headers attribute for common tables -->
+<!ENTITY % Scope "(row|col|rowgroup|colgroup)">
+
+<!-- TH is for headers, TD for data, but for cells acting as both use TD -->
+<!ATTLIST (TH|TD) -- header or data cell --
+ %attrs; -- %coreattrs, %i18n, %events --
+ abbr %Text; #IMPLIED -- abbreviation for header cell --
+ axis CDATA #IMPLIED -- comma-separated list of related headers--
+ headers IDREFS #IMPLIED -- list of id's for header cells --
+ scope %Scope; #IMPLIED -- scope covered by header cells --
+ rowspan NUMBER 1 -- number of rows spanned by cell --
+ colspan NUMBER 1 -- number of cols spanned by cell --
+ %cellhalign; -- horizontal alignment in cells --
+ %cellvalign; -- vertical alignment in cells --
+ >
+
+
+<!--================ Document Head =======================================-->
+<!-- %head.misc; defined earlier on as "SCRIPT|STYLE|META|LINK|OBJECT" -->
+<!ENTITY % head.content "TITLE & BASE?">
+
+<!ELEMENT HEAD O O (%head.content;) +(%head.misc;) -- document head -->
+<!ATTLIST HEAD
+ %i18n; -- lang, dir --
+ profile %URI; #IMPLIED -- named dictionary of meta info --
+ >
+
+<!-- The TITLE element is not considered part of the flow of text.
+ It should be displayed, for example as the page header or
+ window title. Exactly one title is required per document.
+ -->
+<!ELEMENT TITLE - - (#PCDATA) -(%head.misc;) -- document title -->
+<!ATTLIST TITLE %i18n>
+
+
+<!ELEMENT BASE - O EMPTY -- document base URI -->
+<!ATTLIST BASE
+ href %URI; #REQUIRED -- URI that acts as base URI --
+ >
+
+<!ELEMENT META - O EMPTY -- generic metainformation -->
+<!ATTLIST META
+ %i18n; -- lang, dir, for use with content --
+ http-equiv NAME #IMPLIED -- HTTP response header name --
+ name NAME #IMPLIED -- metainformation name --
+ content CDATA #REQUIRED -- associated information --
+ scheme CDATA #IMPLIED -- select form of content --
+ >
+
+<!ELEMENT STYLE - - %StyleSheet -- style info -->
+<!ATTLIST STYLE
+ %i18n; -- lang, dir, for use with title --
+ type %ContentType; #REQUIRED -- content type of style language --
+ media %MediaDesc; #IMPLIED -- designed for use with these media --
+ title %Text; #IMPLIED -- advisory title --
+ >
+
+<!ELEMENT SCRIPT - - %Script; -- script statements -->
+<!ATTLIST SCRIPT
+ charset %Charset; #IMPLIED -- char encoding of linked resource --
+ type %ContentType; #REQUIRED -- content type of script language --
+ src %URI; #IMPLIED -- URI for an external script --
+ defer (defer) #IMPLIED -- UA may defer execution of script --
+ event CDATA #IMPLIED -- reserved for possible future use --
+ for %URI; #IMPLIED -- reserved for possible future use --
+ >
+
+<!ELEMENT NOSCRIPT - - (%block;)+
+ -- alternate content container for non script-based rendering -->
+<!ATTLIST NOSCRIPT
+ %attrs; -- %coreattrs, %i18n, %events --
+ >
+
+<!--================ Document Structure ==================================-->
+<!ENTITY % html.content "HEAD, BODY">
+
+<!ELEMENT HTML O O (%html.content;) -- document root element -->
+<!ATTLIST HTML
+ %i18n; -- lang, dir --
+ >
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/switch-bench.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/switch-bench.js
new file mode 100755
index 000000000..4d3cf1419
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/switch-bench.js
@@ -0,0 +1,45 @@
+#!/usr/local/bin/node-bench
+
+var Promise = require("events").Promise;
+
+var xml = require("posix").cat("test.xml").wait(),
+ path = require("path"),
+ sax = require("../lib/sax"),
+ saxT = require("../lib/sax-trampoline"),
+
+ parser = sax.parser(false, {trim:true}),
+ parserT = saxT.parser(false, {trim:true}),
+
+ sys = require("sys");
+
+
+var count = exports.stepsPerLap = 500,
+ l = xml.length,
+ runs = 0;
+exports.countPerLap = 1000;
+exports.compare = {
+ "switch" : function () {
+ // sys.debug("switch runs: "+runs++);
+ // for (var x = 0; x < l; x += 1000) {
+ // parser.write(xml.substr(x, 1000))
+ // }
+ // for (var i = 0; i < count; i ++) {
+ parser.write(xml);
+ parser.close();
+ // }
+ // done();
+ },
+ trampoline : function () {
+ // sys.debug("trampoline runs: "+runs++);
+ // for (var x = 0; x < l; x += 1000) {
+ // parserT.write(xml.substr(x, 1000))
+ // }
+ // for (var i = 0; i < count; i ++) {
+ parserT.write(xml);
+ parserT.close();
+ // }
+ // done();
+ },
+};
+
+sys.debug("rock and roll..."); \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/test.html b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/test.html
new file mode 100644
index 000000000..61f8f1ab9
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/test.html
@@ -0,0 +1,15 @@
+<!doctype html>
+
+<html lang="en">
+<head>
+ <title>testing the parser</title>
+</head>
+<body>
+
+<p>hello
+
+<script>
+
+</script>
+</body>
+</html>
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/test.xml b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/test.xml
new file mode 100644
index 000000000..801292d7f
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/examples/test.xml
@@ -0,0 +1,1254 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE RootElement [
+ <!ENTITY e SYSTEM "001.ent">
+]>
+<RootElement param="value">
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+ <FirstElement>
+ Some Text
+ </FirstElement>
+ <?some_pi some_attr="some_value"?>
+ <!-- this is a comment -- but this isnt part of the comment -->
+ <!-- this is a comment == and this is a part of the comment -->
+ <!-- this is a comment > and this is also part of the thing -->
+ <!invalid comment>
+ <![CDATA[ this is random stuff. & and < and > are ok in here. ]]>
+ <SecondElement param2="something">
+ Pre-Text &amp; <Inline>Inlined text</Inline> Post-text.
+ &#xF8FF;
+ </SecondElement>
+</RootElement> \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/lib/sax.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/lib/sax.js
new file mode 100644
index 000000000..17fb08e7a
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/lib/sax.js
@@ -0,0 +1,1006 @@
+// wrapper for non-node envs
+;(function (sax) {
+
+sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }
+sax.SAXParser = SAXParser
+sax.SAXStream = SAXStream
+sax.createStream = createStream
+
+// When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.
+// When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),
+// since that's the earliest that a buffer overrun could occur. This way, checks are
+// as rare as required, but as often as necessary to ensure never crossing this bound.
+// Furthermore, buffers are only tested at most once per write(), so passing a very
+// large string into write() might have undesirable effects, but this is manageable by
+// the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme
+// edge case, result in creating at most one complete copy of the string passed in.
+// Set to Infinity to have unlimited buffers.
+sax.MAX_BUFFER_LENGTH = 64 * 1024
+
+var buffers = [
+ "comment", "sgmlDecl", "textNode", "tagName", "doctype",
+ "procInstName", "procInstBody", "entity", "attribName",
+ "attribValue", "cdata", "script"
+]
+
+sax.EVENTS = // for discoverability.
+ [ "text"
+ , "processinginstruction"
+ , "sgmldeclaration"
+ , "doctype"
+ , "comment"
+ , "attribute"
+ , "opentag"
+ , "closetag"
+ , "opencdata"
+ , "cdata"
+ , "closecdata"
+ , "error"
+ , "end"
+ , "ready"
+ , "script"
+ , "opennamespace"
+ , "closenamespace"
+ ]
+
+function SAXParser (strict, opt) {
+ if (!(this instanceof SAXParser)) return new SAXParser(strict, opt)
+
+ var parser = this
+ clearBuffers(parser)
+ parser.q = parser.c = ""
+ parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH
+ parser.opt = opt || {}
+ parser.tagCase = parser.opt.lowercasetags ? "toLowerCase" : "toUpperCase"
+ parser.tags = []
+ parser.closed = parser.closedRoot = parser.sawRoot = false
+ parser.tag = parser.error = null
+ parser.strict = !!strict
+ parser.noscript = !!(strict || parser.opt.noscript)
+ parser.state = S.BEGIN
+ parser.ENTITIES = Object.create(sax.ENTITIES)
+ parser.attribList = []
+
+ // namespaces form a prototype chain.
+ // it always points at the current tag,
+ // which protos to its parent tag.
+ if (parser.opt.xmlns) parser.ns = Object.create(rootNS)
+
+ // mostly just for error reporting
+ parser.position = parser.line = parser.column = 0
+ emit(parser, "onready")
+}
+
+if (!Object.create) Object.create = function (o) {
+ function f () { this.__proto__ = o }
+ f.prototype = o
+ return new f
+}
+
+if (!Object.getPrototypeOf) Object.getPrototypeOf = function (o) {
+ return o.__proto__
+}
+
+if (!Object.keys) Object.keys = function (o) {
+ var a = []
+ for (var i in o) if (o.hasOwnProperty(i)) a.push(i)
+ return a
+}
+
+function checkBufferLength (parser) {
+ var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)
+ , maxActual = 0
+ for (var i = 0, l = buffers.length; i < l; i ++) {
+ var len = parser[buffers[i]].length
+ if (len > maxAllowed) {
+ // Text/cdata nodes can get big, and since they're buffered,
+ // we can get here under normal conditions.
+ // Avoid issues by emitting the text node now,
+ // so at least it won't get any bigger.
+ switch (buffers[i]) {
+ case "textNode":
+ closeText(parser)
+ break
+
+ case "cdata":
+ emitNode(parser, "oncdata", parser.cdata)
+ parser.cdata = ""
+ break
+
+ case "script":
+ emitNode(parser, "onscript", parser.script)
+ parser.script = ""
+ break
+
+ default:
+ error(parser, "Max buffer length exceeded: "+buffers[i])
+ }
+ }
+ maxActual = Math.max(maxActual, len)
+ }
+ // schedule the next check for the earliest possible buffer overrun.
+ parser.bufferCheckPosition = (sax.MAX_BUFFER_LENGTH - maxActual)
+ + parser.position
+}
+
+function clearBuffers (parser) {
+ for (var i = 0, l = buffers.length; i < l; i ++) {
+ parser[buffers[i]] = ""
+ }
+}
+
+SAXParser.prototype =
+ { end: function () { end(this) }
+ , write: write
+ , resume: function () { this.error = null; return this }
+ , close: function () { return this.write(null) }
+ , end: function () { return this.write(null) }
+ }
+
+try {
+ var Stream = require("stream").Stream
+} catch (ex) {
+ var Stream = function () {}
+}
+
+
+var streamWraps = sax.EVENTS.filter(function (ev) {
+ return ev !== "error" && ev !== "end"
+})
+
+function createStream (strict, opt) {
+ return new SAXStream(strict, opt)
+}
+
+function SAXStream (strict, opt) {
+ if (!(this instanceof SAXStream)) return new SAXStream(strict, opt)
+
+ Stream.apply(me)
+
+ this._parser = new SAXParser(strict, opt)
+ this.writable = true
+ this.readable = true
+
+
+ var me = this
+
+ this._parser.onend = function () {
+ me.emit("end")
+ }
+
+ this._parser.onerror = function (er) {
+ me.emit("error", er)
+
+ // if didn't throw, then means error was handled.
+ // go ahead and clear error, so we can write again.
+ me._parser.error = null
+ }
+
+ streamWraps.forEach(function (ev) {
+ Object.defineProperty(me, "on" + ev, {
+ get: function () { return me._parser["on" + ev] },
+ set: function (h) {
+ if (!h) {
+ me.removeAllListeners(ev)
+ return me._parser["on"+ev] = h
+ }
+ me.on(ev, h)
+ },
+ enumerable: true,
+ configurable: false
+ })
+ })
+}
+
+SAXStream.prototype = Object.create(Stream.prototype,
+ { constructor: { value: SAXStream } })
+
+SAXStream.prototype.write = function (data) {
+ this._parser.write(data.toString())
+ this.emit("data", data)
+ return true
+}
+
+SAXStream.prototype.end = function (chunk) {
+ if (chunk && chunk.length) this._parser.write(chunk.toString())
+ this._parser.end()
+ return true
+}
+
+SAXStream.prototype.on = function (ev, handler) {
+ var me = this
+ if (!me._parser["on"+ev] && streamWraps.indexOf(ev) !== -1) {
+ me._parser["on"+ev] = function () {
+ var args = arguments.length === 1 ? [arguments[0]]
+ : Array.apply(null, arguments)
+ args.splice(0, 0, ev)
+ me.emit.apply(me, args)
+ }
+ }
+
+ return Stream.prototype.on.call(me, ev, handler)
+}
+
+
+
+// character classes and tokens
+var whitespace = "\r\n\t "
+ // this really needs to be replaced with character classes.
+ // XML allows all manner of ridiculous numbers and digits.
+ , number = "0124356789"
+ , letter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ // (Letter | "_" | ":")
+ , nameStart = letter+"_:"
+ , nameBody = nameStart+number+"-."
+ , quote = "'\""
+ , entity = number+letter+"#"
+ , attribEnd = whitespace + ">"
+ , CDATA = "[CDATA["
+ , DOCTYPE = "DOCTYPE"
+ , XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace"
+ , XMLNS_NAMESPACE = "http://www.w3.org/2000/xmlns/"
+ , rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }
+
+// turn all the string character sets into character class objects.
+whitespace = charClass(whitespace)
+number = charClass(number)
+letter = charClass(letter)
+nameStart = charClass(nameStart)
+nameBody = charClass(nameBody)
+quote = charClass(quote)
+entity = charClass(entity)
+attribEnd = charClass(attribEnd)
+
+function charClass (str) {
+ return str.split("").reduce(function (s, c) {
+ s[c] = true
+ return s
+ }, {})
+}
+
+function is (charclass, c) {
+ return charclass[c]
+}
+
+function not (charclass, c) {
+ return !charclass[c]
+}
+
+var S = 0
+sax.STATE =
+{ BEGIN : S++
+, TEXT : S++ // general stuff
+, TEXT_ENTITY : S++ // &amp and such.
+, OPEN_WAKA : S++ // <
+, SGML_DECL : S++ // <!BLARG
+, SGML_DECL_QUOTED : S++ // <!BLARG foo "bar
+, DOCTYPE : S++ // <!DOCTYPE
+, DOCTYPE_QUOTED : S++ // <!DOCTYPE "//blah
+, DOCTYPE_DTD : S++ // <!DOCTYPE "//blah" [ ...
+, DOCTYPE_DTD_QUOTED : S++ // <!DOCTYPE "//blah" [ "foo
+, COMMENT_STARTING : S++ // <!-
+, COMMENT : S++ // <!--
+, COMMENT_ENDING : S++ // <!-- blah -
+, COMMENT_ENDED : S++ // <!-- blah --
+, CDATA : S++ // <![CDATA[ something
+, CDATA_ENDING : S++ // ]
+, CDATA_ENDING_2 : S++ // ]]
+, PROC_INST : S++ // <?hi
+, PROC_INST_BODY : S++ // <?hi there
+, PROC_INST_QUOTED : S++ // <?hi "there
+, PROC_INST_ENDING : S++ // <?hi "there" ?
+, OPEN_TAG : S++ // <strong
+, OPEN_TAG_SLASH : S++ // <strong /
+, ATTRIB : S++ // <a
+, ATTRIB_NAME : S++ // <a foo
+, ATTRIB_NAME_SAW_WHITE : S++ // <a foo _
+, ATTRIB_VALUE : S++ // <a foo=
+, ATTRIB_VALUE_QUOTED : S++ // <a foo="bar
+, ATTRIB_VALUE_UNQUOTED : S++ // <a foo=bar
+, ATTRIB_VALUE_ENTITY_Q : S++ // <foo bar="&quot;"
+, ATTRIB_VALUE_ENTITY_U : S++ // <foo bar=&quot;
+, CLOSE_TAG : S++ // </a
+, CLOSE_TAG_SAW_WHITE : S++ // </a >
+, SCRIPT : S++ // <script> ...
+, SCRIPT_ENDING : S++ // <script> ... <
+}
+
+sax.ENTITIES =
+{ "apos" : "'"
+, "quot" : "\""
+, "amp" : "&"
+, "gt" : ">"
+, "lt" : "<"
+}
+
+for (var S in sax.STATE) sax.STATE[sax.STATE[S]] = S
+
+// shorthand
+S = sax.STATE
+
+function emit (parser, event, data) {
+ parser[event] && parser[event](data)
+}
+
+function emitNode (parser, nodeType, data) {
+ if (parser.textNode) closeText(parser)
+ emit(parser, nodeType, data)
+}
+
+function closeText (parser) {
+ parser.textNode = textopts(parser.opt, parser.textNode)
+ if (parser.textNode) emit(parser, "ontext", parser.textNode)
+ parser.textNode = ""
+}
+
+function textopts (opt, text) {
+ if (opt.trim) text = text.trim()
+ if (opt.normalize) text = text.replace(/\s+/g, " ")
+ return text
+}
+
+function error (parser, er) {
+ closeText(parser)
+ er += "\nLine: "+parser.line+
+ "\nColumn: "+parser.column+
+ "\nChar: "+parser.c
+ er = new Error(er)
+ parser.error = er
+ emit(parser, "onerror", er)
+ return parser
+}
+
+function end (parser) {
+ if (parser.state !== S.TEXT) error(parser, "Unexpected end")
+ closeText(parser)
+ parser.c = ""
+ parser.closed = true
+ emit(parser, "onend")
+ SAXParser.call(parser, parser.strict, parser.opt)
+ return parser
+}
+
+function strictFail (parser, message) {
+ if (parser.strict) error(parser, message)
+}
+
+function newTag (parser) {
+ if (!parser.strict) parser.tagName = parser.tagName[parser.tagCase]()
+ var parent = parser.tags[parser.tags.length - 1] || parser
+ , tag = parser.tag = { name : parser.tagName, attributes : {} }
+
+ // will be overridden if tag contails an xmlns="foo" or xmlns:foo="bar"
+ if (parser.opt.xmlns) tag.ns = parent.ns
+ parser.attribList.length = 0
+}
+
+function qname (name) {
+ var i = name.indexOf(":")
+ , qualName = i < 0 ? [ "", name ] : name.split(":")
+ , prefix = qualName[0]
+ , local = qualName[1]
+
+ // <x "xmlns"="http://foo">
+ if (name === "xmlns") {
+ prefix = "xmlns"
+ local = ""
+ }
+
+ return { prefix: prefix, local: local }
+}
+
+function attrib (parser) {
+ if (parser.opt.xmlns) {
+ var qn = qname(parser.attribName)
+ , prefix = qn.prefix
+ , local = qn.local
+
+ if (prefix === "xmlns") {
+ // namespace binding attribute; push the binding into scope
+ if (local === "xml" && parser.attribValue !== XML_NAMESPACE) {
+ strictFail( parser
+ , "xml: prefix must be bound to " + XML_NAMESPACE + "\n"
+ + "Actual: " + parser.attribValue )
+ } else if (local === "xmlns" && parser.attribValue !== XMLNS_NAMESPACE) {
+ strictFail( parser
+ , "xmlns: prefix must be bound to " + XMLNS_NAMESPACE + "\n"
+ + "Actual: " + parser.attribValue )
+ } else {
+ var tag = parser.tag
+ , parent = parser.tags[parser.tags.length - 1] || parser
+ if (tag.ns === parent.ns) {
+ tag.ns = Object.create(parent.ns)
+ }
+ tag.ns[local] = parser.attribValue
+ }
+ }
+
+ // defer onattribute events until all attributes have been seen
+ // so any new bindings can take effect; preserve attribute order
+ // so deferred events can be emitted in document order
+ parser.attribList.push([parser.attribName, parser.attribValue])
+ } else {
+ // in non-xmlns mode, we can emit the event right away
+ parser.tag.attributes[parser.attribName] = parser.attribValue
+ emitNode( parser
+ , "onattribute"
+ , { name: parser.attribName
+ , value: parser.attribValue } )
+ }
+
+ parser.attribName = parser.attribValue = ""
+}
+
+function openTag (parser, selfClosing) {
+ if (parser.opt.xmlns) {
+ // emit namespace binding events
+ var tag = parser.tag
+
+ // add namespace info to tag
+ var qn = qname(parser.tagName)
+ tag.prefix = qn.prefix
+ tag.local = qn.local
+ tag.uri = tag.ns[qn.prefix] || qn.prefix
+
+ if (tag.prefix && !tag.uri) {
+ strictFail(parser, "Unbound namespace prefix: "
+ + JSON.stringify(parser.tagName))
+ }
+
+ var parent = parser.tags[parser.tags.length - 1] || parser
+ if (tag.ns && parent.ns !== tag.ns) {
+ Object.keys(tag.ns).forEach(function (p) {
+ emitNode( parser
+ , "onopennamespace"
+ , { prefix: p , uri: tag.ns[p] } )
+ })
+ }
+
+ // handle deferred onattribute events
+ for (var i = 0, l = parser.attribList.length; i < l; i ++) {
+ var nv = parser.attribList[i]
+ var name = nv[0]
+ , value = nv[1]
+ , qualName = qname(name)
+ , prefix = qualName.prefix
+ , local = qualName.local
+ , uri = tag.ns[prefix] || ""
+ , a = { name: name
+ , value: value
+ , prefix: prefix
+ , local: local
+ , uri: uri
+ }
+
+ // if there's any attributes with an undefined namespace,
+ // then fail on them now.
+ if (prefix && prefix != "xmlns" && !uri) {
+ strictFail(parser, "Unbound namespace prefix: "
+ + JSON.stringify(prefix))
+ a.uri = prefix
+ }
+ parser.tag.attributes[name] = a
+ emitNode(parser, "onattribute", a)
+ }
+ parser.attribList.length = 0
+ }
+
+ // process the tag
+ parser.sawRoot = true
+ parser.tags.push(parser.tag)
+ emitNode(parser, "onopentag", parser.tag)
+ if (!selfClosing) {
+ // special case for <script> in non-strict mode.
+ if (!parser.noscript && parser.tagName.toLowerCase() === "script") {
+ parser.state = S.SCRIPT
+ } else {
+ parser.state = S.TEXT
+ }
+ parser.tag = null
+ parser.tagName = ""
+ }
+ parser.attribName = parser.attribValue = ""
+ parser.attribList.length = 0
+}
+
+function closeTag (parser) {
+ if (!parser.tagName) {
+ strictFail(parser, "Weird empty close tag.")
+ parser.textNode += "</>"
+ parser.state = S.TEXT
+ return
+ }
+ // first make sure that the closing tag actually exists.
+ // <a><b></c></b></a> will close everything, otherwise.
+ var t = parser.tags.length
+ var tagName = parser.tagName
+ if (!parser.strict) tagName = tagName[parser.tagCase]()
+ var closeTo = tagName
+ while (t --) {
+ var close = parser.tags[t]
+ if (close.name !== closeTo) {
+ // fail the first time in strict mode
+ strictFail(parser, "Unexpected close tag")
+ } else break
+ }
+
+ // didn't find it. we already failed for strict, so just abort.
+ if (t < 0) {
+ strictFail(parser, "Unmatched closing tag: "+parser.tagName)
+ parser.textNode += "</" + parser.tagName + ">"
+ parser.state = S.TEXT
+ return
+ }
+ parser.tagName = tagName
+ var s = parser.tags.length
+ while (s --> t) {
+ var tag = parser.tag = parser.tags.pop()
+ parser.tagName = parser.tag.name
+ emitNode(parser, "onclosetag", parser.tagName)
+
+ var x = {}
+ for (var i in tag.ns) x[i] = tag.ns[i]
+
+ var parent = parser.tags[parser.tags.length - 1] || parser
+ if (parser.opt.xmlns && tag.ns !== parent.ns) {
+ // remove namespace bindings introduced by tag
+ Object.keys(tag.ns).forEach(function (p) {
+ var n = tag.ns[p]
+ emitNode(parser, "onclosenamespace", { prefix: p, uri: n })
+ })
+ }
+ }
+ if (t === 0) parser.closedRoot = true
+ parser.tagName = parser.attribValue = parser.attribName = ""
+ parser.attribList.length = 0
+ parser.state = S.TEXT
+}
+
+function parseEntity (parser) {
+ var entity = parser.entity.toLowerCase()
+ , num
+ , numStr = ""
+ if (parser.ENTITIES[entity]) return parser.ENTITIES[entity]
+ if (entity.charAt(0) === "#") {
+ if (entity.charAt(1) === "x") {
+ entity = entity.slice(2)
+ num = parseInt(entity, 16)
+ numStr = num.toString(16)
+ } else {
+ entity = entity.slice(1)
+ num = parseInt(entity, 10)
+ numStr = num.toString(10)
+ }
+ }
+ entity = entity.replace(/^0+/, "")
+ if (numStr.toLowerCase() !== entity) {
+ strictFail(parser, "Invalid character entity")
+ return "&"+parser.entity + ";"
+ }
+ return String.fromCharCode(num)
+}
+
+function write (chunk) {
+ var parser = this
+ if (this.error) throw this.error
+ if (parser.closed) return error(parser,
+ "Cannot write after close. Assign an onready handler.")
+ if (chunk === null) return end(parser)
+ var i = 0, c = ""
+ while (parser.c = c = chunk.charAt(i++)) {
+ parser.position ++
+ if (c === "\n") {
+ parser.line ++
+ parser.column = 0
+ } else parser.column ++
+ switch (parser.state) {
+
+ case S.BEGIN:
+ if (c === "<") parser.state = S.OPEN_WAKA
+ else if (not(whitespace,c)) {
+ // have to process this as a text node.
+ // weird, but happens.
+ strictFail(parser, "Non-whitespace before first tag.")
+ parser.textNode = c
+ parser.state = S.TEXT
+ }
+ continue
+
+ case S.TEXT:
+ if (parser.sawRoot && !parser.closedRoot) {
+ var starti = i-1
+ while (c && c!=="<" && c!=="&") {
+ c = chunk.charAt(i++)
+ if (c) {
+ parser.position ++
+ if (c === "\n") {
+ parser.line ++
+ parser.column = 0
+ } else parser.column ++
+ }
+ }
+ parser.textNode += chunk.substring(starti, i-1)
+ }
+ if (c === "<") parser.state = S.OPEN_WAKA
+ else {
+ if (not(whitespace, c) && (!parser.sawRoot || parser.closedRoot))
+ strictFail("Text data outside of root node.")
+ if (c === "&") parser.state = S.TEXT_ENTITY
+ else parser.textNode += c
+ }
+ continue
+
+ case S.SCRIPT:
+ // only non-strict
+ if (c === "<") {
+ parser.state = S.SCRIPT_ENDING
+ } else parser.script += c
+ continue
+
+ case S.SCRIPT_ENDING:
+ if (c === "/") {
+ emitNode(parser, "onscript", parser.script)
+ parser.state = S.CLOSE_TAG
+ parser.script = ""
+ parser.tagName = ""
+ } else {
+ parser.script += "<" + c
+ parser.state = S.SCRIPT
+ }
+ continue
+
+ case S.OPEN_WAKA:
+ // either a /, ?, !, or text is coming next.
+ if (c === "!") {
+ parser.state = S.SGML_DECL
+ parser.sgmlDecl = ""
+ } else if (is(whitespace, c)) {
+ // wait for it...
+ } else if (is(nameStart,c)) {
+ parser.startTagPosition = parser.position - 1
+ parser.state = S.OPEN_TAG
+ parser.tagName = c
+ } else if (c === "/") {
+ parser.startTagPosition = parser.position - 1
+ parser.state = S.CLOSE_TAG
+ parser.tagName = ""
+ } else if (c === "?") {
+ parser.state = S.PROC_INST
+ parser.procInstName = parser.procInstBody = ""
+ } else {
+ strictFail(parser, "Unencoded <")
+ parser.textNode += "<" + c
+ parser.state = S.TEXT
+ }
+ continue
+
+ case S.SGML_DECL:
+ if ((parser.sgmlDecl+c).toUpperCase() === CDATA) {
+ emitNode(parser, "onopencdata")
+ parser.state = S.CDATA
+ parser.sgmlDecl = ""
+ parser.cdata = ""
+ } else if (parser.sgmlDecl+c === "--") {
+ parser.state = S.COMMENT
+ parser.comment = ""
+ parser.sgmlDecl = ""
+ } else if ((parser.sgmlDecl+c).toUpperCase() === DOCTYPE) {
+ parser.state = S.DOCTYPE
+ if (parser.doctype || parser.sawRoot) strictFail(parser,
+ "Inappropriately located doctype declaration")
+ parser.doctype = ""
+ parser.sgmlDecl = ""
+ } else if (c === ">") {
+ emitNode(parser, "onsgmldeclaration", parser.sgmlDecl)
+ parser.sgmlDecl = ""
+ parser.state = S.TEXT
+ } else if (is(quote, c)) {
+ parser.state = S.SGML_DECL_QUOTED
+ parser.sgmlDecl += c
+ } else parser.sgmlDecl += c
+ continue
+
+ case S.SGML_DECL_QUOTED:
+ if (c === parser.q) {
+ parser.state = S.SGML_DECL
+ parser.q = ""
+ }
+ parser.sgmlDecl += c
+ continue
+
+ case S.DOCTYPE:
+ if (c === ">") {
+ parser.state = S.TEXT
+ emitNode(parser, "ondoctype", parser.doctype)
+ parser.doctype = true // just remember that we saw it.
+ } else {
+ parser.doctype += c
+ if (c === "[") parser.state = S.DOCTYPE_DTD
+ else if (is(quote, c)) {
+ parser.state = S.DOCTYPE_QUOTED
+ parser.q = c
+ }
+ }
+ continue
+
+ case S.DOCTYPE_QUOTED:
+ parser.doctype += c
+ if (c === parser.q) {
+ parser.q = ""
+ parser.state = S.DOCTYPE
+ }
+ continue
+
+ case S.DOCTYPE_DTD:
+ parser.doctype += c
+ if (c === "]") parser.state = S.DOCTYPE
+ else if (is(quote,c)) {
+ parser.state = S.DOCTYPE_DTD_QUOTED
+ parser.q = c
+ }
+ continue
+
+ case S.DOCTYPE_DTD_QUOTED:
+ parser.doctype += c
+ if (c === parser.q) {
+ parser.state = S.DOCTYPE_DTD
+ parser.q = ""
+ }
+ continue
+
+ case S.COMMENT:
+ if (c === "-") parser.state = S.COMMENT_ENDING
+ else parser.comment += c
+ continue
+
+ case S.COMMENT_ENDING:
+ if (c === "-") {
+ parser.state = S.COMMENT_ENDED
+ parser.comment = textopts(parser.opt, parser.comment)
+ if (parser.comment) emitNode(parser, "oncomment", parser.comment)
+ parser.comment = ""
+ } else {
+ parser.comment += "-" + c
+ parser.state = S.COMMENT
+ }
+ continue
+
+ case S.COMMENT_ENDED:
+ if (c !== ">") {
+ strictFail(parser, "Malformed comment")
+ // allow <!-- blah -- bloo --> in non-strict mode,
+ // which is a comment of " blah -- bloo "
+ parser.comment += "--" + c
+ parser.state = S.COMMENT
+ } else parser.state = S.TEXT
+ continue
+
+ case S.CDATA:
+ if (c === "]") parser.state = S.CDATA_ENDING
+ else parser.cdata += c
+ continue
+
+ case S.CDATA_ENDING:
+ if (c === "]") parser.state = S.CDATA_ENDING_2
+ else {
+ parser.cdata += "]" + c
+ parser.state = S.CDATA
+ }
+ continue
+
+ case S.CDATA_ENDING_2:
+ if (c === ">") {
+ if (parser.cdata) emitNode(parser, "oncdata", parser.cdata)
+ emitNode(parser, "onclosecdata")
+ parser.cdata = ""
+ parser.state = S.TEXT
+ } else if (c === "]") {
+ parser.cdata += "]"
+ } else {
+ parser.cdata += "]]" + c
+ parser.state = S.CDATA
+ }
+ continue
+
+ case S.PROC_INST:
+ if (c === "?") parser.state = S.PROC_INST_ENDING
+ else if (is(whitespace, c)) parser.state = S.PROC_INST_BODY
+ else parser.procInstName += c
+ continue
+
+ case S.PROC_INST_BODY:
+ if (!parser.procInstBody && is(whitespace, c)) continue
+ else if (c === "?") parser.state = S.PROC_INST_ENDING
+ else if (is(quote, c)) {
+ parser.state = S.PROC_INST_QUOTED
+ parser.q = c
+ parser.procInstBody += c
+ } else parser.procInstBody += c
+ continue
+
+ case S.PROC_INST_ENDING:
+ if (c === ">") {
+ emitNode(parser, "onprocessinginstruction", {
+ name : parser.procInstName,
+ body : parser.procInstBody
+ })
+ parser.procInstName = parser.procInstBody = ""
+ parser.state = S.TEXT
+ } else {
+ parser.procInstBody += "?" + c
+ parser.state = S.PROC_INST_BODY
+ }
+ continue
+
+ case S.PROC_INST_QUOTED:
+ parser.procInstBody += c
+ if (c === parser.q) {
+ parser.state = S.PROC_INST_BODY
+ parser.q = ""
+ }
+ continue
+
+ case S.OPEN_TAG:
+ if (is(nameBody, c)) parser.tagName += c
+ else {
+ newTag(parser)
+ if (c === ">") openTag(parser)
+ else if (c === "/") parser.state = S.OPEN_TAG_SLASH
+ else {
+ if (not(whitespace, c)) strictFail(
+ parser, "Invalid character in tag name")
+ parser.state = S.ATTRIB
+ }
+ }
+ continue
+
+ case S.OPEN_TAG_SLASH:
+ if (c === ">") {
+ openTag(parser, true)
+ closeTag(parser)
+ } else {
+ strictFail(parser, "Forward-slash in opening tag not followed by >")
+ parser.state = S.ATTRIB
+ }
+ continue
+
+ case S.ATTRIB:
+ // haven't read the attribute name yet.
+ if (is(whitespace, c)) continue
+ else if (c === ">") openTag(parser)
+ else if (c === "/") parser.state = S.OPEN_TAG_SLASH
+ else if (is(nameStart, c)) {
+ parser.attribName = c
+ parser.attribValue = ""
+ parser.state = S.ATTRIB_NAME
+ } else strictFail(parser, "Invalid attribute name")
+ continue
+
+ case S.ATTRIB_NAME:
+ if (c === "=") parser.state = S.ATTRIB_VALUE
+ else if (is(whitespace, c)) parser.state = S.ATTRIB_NAME_SAW_WHITE
+ else if (is(nameBody, c)) parser.attribName += c
+ else strictFail(parser, "Invalid attribute name")
+ continue
+
+ case S.ATTRIB_NAME_SAW_WHITE:
+ if (c === "=") parser.state = S.ATTRIB_VALUE
+ else if (is(whitespace, c)) continue
+ else {
+ strictFail(parser, "Attribute without value")
+ parser.tag.attributes[parser.attribName] = ""
+ parser.attribValue = ""
+ emitNode(parser, "onattribute",
+ { name : parser.attribName, value : "" })
+ parser.attribName = ""
+ if (c === ">") openTag(parser)
+ else if (is(nameStart, c)) {
+ parser.attribName = c
+ parser.state = S.ATTRIB_NAME
+ } else {
+ strictFail(parser, "Invalid attribute name")
+ parser.state = S.ATTRIB
+ }
+ }
+ continue
+
+ case S.ATTRIB_VALUE:
+ if (is(whitespace, c)) continue
+ else if (is(quote, c)) {
+ parser.q = c
+ parser.state = S.ATTRIB_VALUE_QUOTED
+ } else {
+ strictFail(parser, "Unquoted attribute value")
+ parser.state = S.ATTRIB_VALUE_UNQUOTED
+ parser.attribValue = c
+ }
+ continue
+
+ case S.ATTRIB_VALUE_QUOTED:
+ if (c !== parser.q) {
+ if (c === "&") parser.state = S.ATTRIB_VALUE_ENTITY_Q
+ else parser.attribValue += c
+ continue
+ }
+ attrib(parser)
+ parser.q = ""
+ parser.state = S.ATTRIB
+ continue
+
+ case S.ATTRIB_VALUE_UNQUOTED:
+ if (not(attribEnd,c)) {
+ if (c === "&") parser.state = S.ATTRIB_VALUE_ENTITY_U
+ else parser.attribValue += c
+ continue
+ }
+ attrib(parser)
+ if (c === ">") openTag(parser)
+ else parser.state = S.ATTRIB
+ continue
+
+ case S.CLOSE_TAG:
+ if (!parser.tagName) {
+ if (is(whitespace, c)) continue
+ else if (not(nameStart, c)) strictFail(parser,
+ "Invalid tagname in closing tag.")
+ else parser.tagName = c
+ }
+ else if (c === ">") closeTag(parser)
+ else if (is(nameBody, c)) parser.tagName += c
+ else {
+ if (not(whitespace, c)) strictFail(parser,
+ "Invalid tagname in closing tag")
+ parser.state = S.CLOSE_TAG_SAW_WHITE
+ }
+ continue
+
+ case S.CLOSE_TAG_SAW_WHITE:
+ if (is(whitespace, c)) continue
+ if (c === ">") closeTag(parser)
+ else strictFail("Invalid characters in closing tag")
+ continue
+
+ case S.TEXT_ENTITY:
+ case S.ATTRIB_VALUE_ENTITY_Q:
+ case S.ATTRIB_VALUE_ENTITY_U:
+ switch(parser.state) {
+ case S.TEXT_ENTITY:
+ var returnState = S.TEXT, buffer = "textNode"
+ break
+
+ case S.ATTRIB_VALUE_ENTITY_Q:
+ var returnState = S.ATTRIB_VALUE_QUOTED, buffer = "attribValue"
+ break
+
+ case S.ATTRIB_VALUE_ENTITY_U:
+ var returnState = S.ATTRIB_VALUE_UNQUOTED, buffer = "attribValue"
+ break
+ }
+ if (c === ";") {
+ parser[buffer] += parseEntity(parser)
+ parser.entity = ""
+ parser.state = returnState
+ }
+ else if (is(entity, c)) parser.entity += c
+ else {
+ strictFail("Invalid character entity")
+ parser[buffer] += "&" + parser.entity + c
+ parser.entity = ""
+ parser.state = returnState
+ }
+ continue
+
+ default:
+ throw new Error(parser, "Unknown state: " + parser.state)
+ }
+ } // while
+ // cdata blocks can get very big under normal conditions. emit and move on.
+ // if (parser.state === S.CDATA && parser.cdata) {
+ // emitNode(parser, "oncdata", parser.cdata)
+ // parser.cdata = ""
+ // }
+ if (parser.position >= parser.bufferCheckPosition) checkBufferLength(parser)
+ return parser
+}
+
+})(typeof exports === "undefined" ? sax = {} : exports)
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/package.json b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/package.json
new file mode 100644
index 000000000..ca0118b5c
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/package.json
@@ -0,0 +1,75 @@
+{
+ "name": "sax",
+ "description": "An evented streaming XML parser in JavaScript",
+ "author": {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me",
+ "url": "http://blog.izs.me/"
+ },
+ "version": "0.3.5",
+ "main": "lib/sax.js",
+ "license": {
+ "type": "MIT",
+ "url": "https://raw.github.com/isaacs/sax-js/master/LICENSE"
+ },
+ "scripts": {
+ "test": "node test/index.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/isaacs/sax-js.git"
+ },
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "_id": "sax@0.3.5",
+ "contributors": [
+ {
+ "name": "Isaac Z. Schlueter",
+ "email": "i@izs.me"
+ },
+ {
+ "name": "Stein Martin Hustad",
+ "email": "stein@hustad.com"
+ },
+ {
+ "name": "Mikeal Rogers",
+ "email": "mikeal.rogers@gmail.com"
+ },
+ {
+ "name": "Laurie Harper",
+ "email": "laurie@holoweb.net"
+ },
+ {
+ "name": "Jann Horn",
+ "email": "jann@Jann-PC.fritz.box"
+ },
+ {
+ "name": "Elijah Insua",
+ "email": "tmpvar@gmail.com"
+ },
+ {
+ "name": "Henry Rawas",
+ "email": "henryr@schakra.com"
+ },
+ {
+ "name": "Justin Makeig",
+ "email": "jmpublic@makeig.com"
+ }
+ ],
+ "dependencies": {},
+ "devDependencies": {},
+ "optionalDependencies": {},
+ "engines": {
+ "node": "*"
+ },
+ "_engineSupported": true,
+ "_npmVersion": "1.1.4",
+ "_nodeVersion": "v0.7.6-pre",
+ "_defaultsLoaded": true,
+ "dist": {
+ "shasum": "bd2b8a4a7fa694653a13c80f4afbf69f962d3fd0"
+ },
+ "_from": "sax@*"
+}
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/buffer-overrun.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/buffer-overrun.js
new file mode 100644
index 000000000..8d12fac50
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/buffer-overrun.js
@@ -0,0 +1,25 @@
+// set this really low so that I don't have to put 64 MB of xml in here.
+var sax = require("../lib/sax")
+var bl = sax.MAX_BUFFER_LENGTH
+sax.MAX_BUFFER_LENGTH = 5;
+
+require(__dirname).test({
+ expect : [
+ ["error", "Max buffer length exceeded: tagName\nLine: 0\nColumn: 15\nChar: "],
+ ["error", "Max buffer length exceeded: tagName\nLine: 0\nColumn: 30\nChar: "],
+ ["error", "Max buffer length exceeded: tagName\nLine: 0\nColumn: 45\nChar: "],
+ ["opentag", {
+ "name": "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ",
+ "attributes": {}
+ }],
+ ["text", "yo"],
+ ["closetag", "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"]
+ ]
+}).write("<abcdefghijklmn")
+ .write("opqrstuvwxyzABC")
+ .write("DEFGHIJKLMNOPQR")
+ .write("STUVWXYZ>")
+ .write("yo")
+ .write("</abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ>")
+ .close();
+sax.MAX_BUFFER_LENGTH = bl
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/cdata-chunked.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/cdata-chunked.js
new file mode 100644
index 000000000..ccd5ee68d
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/cdata-chunked.js
@@ -0,0 +1,11 @@
+
+require(__dirname).test({
+ expect : [
+ ["opentag", {"name": "R","attributes": {}}],
+ ["opencdata", undefined],
+ ["cdata", " this is character data  "],
+ ["closecdata", undefined],
+ ["closetag", "R"]
+ ]
+}).write("<r><![CDATA[ this is ").write("character data  ").write("]]></r>").close();
+
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/cdata-end-split.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/cdata-end-split.js
new file mode 100644
index 000000000..b41bd00e2
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/cdata-end-split.js
@@ -0,0 +1,15 @@
+
+require(__dirname).test({
+ expect : [
+ ["opentag", {"name": "R","attributes": {}}],
+ ["opencdata", undefined],
+ ["cdata", " this is "],
+ ["closecdata", undefined],
+ ["closetag", "R"]
+ ]
+})
+ .write("<r><![CDATA[ this is ]")
+ .write("]>")
+ .write("</r>")
+ .close();
+
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/cdata-fake-end.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/cdata-fake-end.js
new file mode 100644
index 000000000..07aeac4c2
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/cdata-fake-end.js
@@ -0,0 +1,28 @@
+
+var p = require(__dirname).test({
+ expect : [
+ ["opentag", {"name": "R","attributes": {}}],
+ ["opencdata", undefined],
+ ["cdata", "[[[[[[[[]]]]]]]]"],
+ ["closecdata", undefined],
+ ["closetag", "R"]
+ ]
+})
+var x = "<r><![CDATA[[[[[[[[[]]]]]]]]]]></r>"
+for (var i = 0; i < x.length ; i ++) {
+ p.write(x.charAt(i))
+}
+p.close();
+
+
+var p2 = require(__dirname).test({
+ expect : [
+ ["opentag", {"name": "R","attributes": {}}],
+ ["opencdata", undefined],
+ ["cdata", "[[[[[[[[]]]]]]]]"],
+ ["closecdata", undefined],
+ ["closetag", "R"]
+ ]
+})
+var x = "<r><![CDATA[[[[[[[[[]]]]]]]]]]></r>"
+p2.write(x).close();
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/cdata-multiple.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/cdata-multiple.js
new file mode 100644
index 000000000..dab20150b
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/cdata-multiple.js
@@ -0,0 +1,15 @@
+
+require(__dirname).test({
+ expect : [
+ ["opentag", {"name": "R","attributes": {}}],
+ ["opencdata", undefined],
+ ["cdata", " this is "],
+ ["closecdata", undefined],
+ ["opencdata", undefined],
+ ["cdata", "character data  "],
+ ["closecdata", undefined],
+ ["closetag", "R"]
+ ]
+}).write("<r><![CDATA[ this is ]]>").write("<![CDA").write("T").write("A[")
+ .write("character data  ").write("]]></r>").close();
+
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/cdata.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/cdata.js
new file mode 100644
index 000000000..0f09cce95
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/cdata.js
@@ -0,0 +1,10 @@
+require(__dirname).test({
+ xml : "<r><![CDATA[ this is character data  ]]></r>",
+ expect : [
+ ["opentag", {"name": "R","attributes": {}}],
+ ["opencdata", undefined],
+ ["cdata", " this is character data  "],
+ ["closecdata", undefined],
+ ["closetag", "R"]
+ ]
+});
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/index.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/index.js
new file mode 100644
index 000000000..d4e1ef4f9
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/index.js
@@ -0,0 +1,86 @@
+var globalsBefore = JSON.stringify(Object.keys(global))
+ , util = require("util")
+ , assert = require("assert")
+ , fs = require("fs")
+ , path = require("path")
+ , sax = require("../lib/sax")
+
+exports.sax = sax
+
+// handy way to do simple unit tests
+// if the options contains an xml string, it'll be written and the parser closed.
+// otherwise, it's assumed that the test will write and close.
+exports.test = function test (options) {
+ var xml = options.xml
+ , parser = sax.parser(options.strict, options.opt)
+ , expect = options.expect
+ , e = 0
+ sax.EVENTS.forEach(function (ev) {
+ parser["on" + ev] = function (n) {
+ if (process.env.DEBUG) {
+ console.error({ expect: expect[e]
+ , actual: [ev, n] })
+ }
+ if (e >= expect.length && (ev === "end" || ev === "ready")) return
+ assert.ok( e < expect.length,
+ "expectation #"+e+" "+util.inspect(expect[e])+"\n"+
+ "Unexpected event: "+ev+" "+(n ? util.inspect(n) : ""))
+ var inspected = n instanceof Error ? "\n"+ n.message : util.inspect(n)
+ assert.equal(ev, expect[e][0],
+ "expectation #"+e+"\n"+
+ "Didn't get expected event\n"+
+ "expect: "+expect[e][0] + " " +util.inspect(expect[e][1])+"\n"+
+ "actual: "+ev+" "+inspected+"\n")
+ if (ev === "error") assert.equal(n.message, expect[e][1])
+ else assert.deepEqual(n, expect[e][1],
+ "expectation #"+e+"\n"+
+ "Didn't get expected argument\n"+
+ "expect: "+expect[e][0] + " " +util.inspect(expect[e][1])+"\n"+
+ "actual: "+ev+" "+inspected+"\n")
+ e++
+ if (ev === "error") parser.resume()
+ }
+ })
+ if (xml) parser.write(xml).close()
+ return parser
+}
+
+if (module === require.main) {
+ var running = true
+ , failures = 0
+
+ function fail (file, er) {
+ util.error("Failed: "+file)
+ util.error(er.stack || er.message)
+ failures ++
+ }
+
+ fs.readdir(__dirname, function (error, files) {
+ files = files.filter(function (file) {
+ return (/\.js$/.exec(file) && file !== 'index.js')
+ })
+ var n = files.length
+ , i = 0
+ console.log("0.." + n)
+ files.forEach(function (file) {
+ // run this test.
+ try {
+ require(path.resolve(__dirname, file))
+ var globalsAfter = JSON.stringify(Object.keys(global))
+ if (globalsAfter !== globalsBefore) {
+ var er = new Error("new globals introduced\n"+
+ "expected: "+globalsBefore+"\n"+
+ "actual: "+globalsAfter)
+ globalsBefore = globalsAfter
+ throw er
+ }
+ console.log("ok " + (++i) + " - " + file)
+ } catch (er) {
+ console.log("not ok "+ (++i) + " - " + file)
+ fail(file, er)
+ }
+ })
+ if (!failures) return console.log("#all pass")
+ else return console.error(failures + " failure" + (failures > 1 ? "s" : ""))
+ })
+}
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/issue-23.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/issue-23.js
new file mode 100644
index 000000000..e7991b2a6
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/issue-23.js
@@ -0,0 +1,43 @@
+
+require(__dirname).test
+ ( { xml :
+ "<compileClassesResponse>"+
+ "<result>"+
+ "<bodyCrc>653724009</bodyCrc>"+
+ "<column>-1</column>"+
+ "<id>01pG0000002KoSUIA0</id>"+
+ "<line>-1</line>"+
+ "<name>CalendarController</name>"+
+ "<success>true</success>"+
+ "</result>"+
+ "</compileClassesResponse>"
+
+ , expect :
+ [ [ "opentag", { name: "COMPILECLASSESRESPONSE", attributes: {} } ]
+ , [ "opentag", { name : "RESULT", attributes: {} } ]
+ , [ "opentag", { name: "BODYCRC", attributes: {} } ]
+ , [ "text", "653724009" ]
+ , [ "closetag", "BODYCRC" ]
+ , [ "opentag", { name: "COLUMN", attributes: {} } ]
+ , [ "text", "-1" ]
+ , [ "closetag", "COLUMN" ]
+ , [ "opentag", { name: "ID", attributes: {} } ]
+ , [ "text", "01pG0000002KoSUIA0" ]
+ , [ "closetag", "ID" ]
+ , [ "opentag", {name: "LINE", attributes: {} } ]
+ , [ "text", "-1" ]
+ , [ "closetag", "LINE" ]
+ , [ "opentag", {name: "NAME", attributes: {} } ]
+ , [ "text", "CalendarController" ]
+ , [ "closetag", "NAME" ]
+ , [ "opentag", {name: "SUCCESS", attributes: {} } ]
+ , [ "text", "true" ]
+ , [ "closetag", "SUCCESS" ]
+ , [ "closetag", "RESULT" ]
+ , [ "closetag", "COMPILECLASSESRESPONSE" ]
+ ]
+ , strict : false
+ , opt : {}
+ }
+ )
+
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/issue-30.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/issue-30.js
new file mode 100644
index 000000000..c2cc809ba
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/issue-30.js
@@ -0,0 +1,24 @@
+// https://github.com/isaacs/sax-js/issues/33
+require(__dirname).test
+ ( { xml : "<xml>\n"+
+ "<!-- \n"+
+ " comment with a single dash- in it\n"+
+ "-->\n"+
+ "<data/>\n"+
+ "</xml>"
+
+ , expect :
+ [ [ "opentag", { name: "xml", attributes: {} } ]
+ , [ "text", "\n" ]
+ , [ "comment", " \n comment with a single dash- in it\n" ]
+ , [ "text", "\n" ]
+ , [ "opentag", { name: "data", attributes: {} } ]
+ , [ "closetag", "data" ]
+ , [ "text", "\n" ]
+ , [ "closetag", "xml" ]
+ ]
+ , strict : true
+ , opt : {}
+ }
+ )
+
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/issue-35.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/issue-35.js
new file mode 100644
index 000000000..7c521c5e7
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/issue-35.js
@@ -0,0 +1,15 @@
+// https://github.com/isaacs/sax-js/issues/35
+require(__dirname).test
+ ( { xml : "<xml>&#Xd;&#X0d;\n"+
+ "</xml>"
+
+ , expect :
+ [ [ "opentag", { name: "xml", attributes: {} } ]
+ , [ "text", "\r\r\n" ]
+ , [ "closetag", "xml" ]
+ ]
+ , strict : true
+ , opt : {}
+ }
+ )
+
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/issue-47.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/issue-47.js
new file mode 100644
index 000000000..911c7d030
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/issue-47.js
@@ -0,0 +1,13 @@
+// https://github.com/isaacs/sax-js/issues/47
+require(__dirname).test
+ ( { xml : '<a href="query.svc?x=1&y=2&z=3"/>'
+ , expect : [
+ [ "attribute", { name:'href', value:"query.svc?x=1&y=2&z=3"} ],
+ [ "opentag", { name: "a", attributes: { href:"query.svc?x=1&y=2&z=3"} } ],
+ [ "closetag", "a" ]
+ ]
+ , strict : true
+ , opt : {}
+ }
+ )
+
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/issue-49.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/issue-49.js
new file mode 100644
index 000000000..29643258f
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/issue-49.js
@@ -0,0 +1,31 @@
+// https://github.com/isaacs/sax-js/issues/49
+require(__dirname).test
+ ( { xml : "<xml><script>hello world</script></xml>"
+ , expect :
+ [ [ "opentag", { name: "xml", attributes: {} } ]
+ , [ "opentag", { name: "script", attributes: {} } ]
+ , [ "text", "hello world" ]
+ , [ "closetag", "script" ]
+ , [ "closetag", "xml" ]
+ ]
+ , strict : false
+ , opt : { lowercasetags: true, noscript: true }
+ }
+ )
+
+require(__dirname).test
+ ( { xml : "<xml><script><![CDATA[hello world]]></script></xml>"
+ , expect :
+ [ [ "opentag", { name: "xml", attributes: {} } ]
+ , [ "opentag", { name: "script", attributes: {} } ]
+ , [ "opencdata", undefined ]
+ , [ "cdata", "hello world" ]
+ , [ "closecdata", undefined ]
+ , [ "closetag", "script" ]
+ , [ "closetag", "xml" ]
+ ]
+ , strict : false
+ , opt : { lowercasetags: true, noscript: true }
+ }
+ )
+
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/parser-position.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/parser-position.js
new file mode 100644
index 000000000..e4a68b1e9
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/parser-position.js
@@ -0,0 +1,28 @@
+var sax = require("../lib/sax"),
+ assert = require("assert")
+
+function testPosition(chunks, expectedEvents) {
+ var parser = sax.parser();
+ expectedEvents.forEach(function(expectation) {
+ parser['on' + expectation[0]] = function() {
+ for (var prop in expectation[1]) {
+ assert.equal(parser[prop], expectation[1][prop]);
+ }
+ }
+ });
+ chunks.forEach(function(chunk) {
+ parser.write(chunk);
+ });
+};
+
+testPosition(['<div>abcdefgh</div>'],
+ [ ['opentag', { position: 5, startTagPosition: 1 }]
+ , ['text', { position: 19, startTagPosition: 14 }]
+ , ['closetag', { position: 19, startTagPosition: 14 }]
+ ]);
+
+testPosition(['<div>abcde','fgh</div>'],
+ [ ['opentag', { position: 5, startTagPosition: 1 }]
+ , ['text', { position: 19, startTagPosition: 14 }]
+ , ['closetag', { position: 19, startTagPosition: 14 }]
+ ]);
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/script.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/script.js
new file mode 100644
index 000000000..464c051a1
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/script.js
@@ -0,0 +1,12 @@
+require(__dirname).test({
+ xml : "<html><head><script>if (1 < 0) { console.log('elo there'); }</script></head></html>",
+ expect : [
+ ["opentag", {"name": "HTML","attributes": {}}],
+ ["opentag", {"name": "HEAD","attributes": {}}],
+ ["opentag", {"name": "SCRIPT","attributes": {}}],
+ ["script", "if (1 < 0) { console.log('elo there'); }"],
+ ["closetag", "SCRIPT"],
+ ["closetag", "HEAD"],
+ ["closetag", "HTML"]
+ ]
+});
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/self-closing-child-strict.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/self-closing-child-strict.js
new file mode 100644
index 000000000..ce9c04515
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/self-closing-child-strict.js
@@ -0,0 +1,40 @@
+
+require(__dirname).test({
+ xml :
+ "<root>"+
+ "<child>" +
+ "<haha />" +
+ "</child>" +
+ "<monkey>" +
+ "=(|)" +
+ "</monkey>" +
+ "</root>",
+ expect : [
+ ["opentag", {
+ "name": "root",
+ "attributes": {}
+ }],
+ ["opentag", {
+ "name": "child",
+ "attributes": {}
+ }],
+ ["opentag", {
+ "name": "haha",
+ "attributes": {}
+ }],
+ ["closetag", "haha"],
+ ["closetag", "child"],
+ ["opentag", {
+ "name": "monkey",
+ "attributes": {}
+ }],
+ ["text", "=(|)"],
+ ["closetag", "monkey"],
+ ["closetag", "root"],
+ ["end"],
+ ["ready"]
+ ],
+ strict : true,
+ opt : {}
+});
+
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/self-closing-child.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/self-closing-child.js
new file mode 100644
index 000000000..bc6b52b8d
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/self-closing-child.js
@@ -0,0 +1,40 @@
+
+require(__dirname).test({
+ xml :
+ "<root>"+
+ "<child>" +
+ "<haha />" +
+ "</child>" +
+ "<monkey>" +
+ "=(|)" +
+ "</monkey>" +
+ "</root>",
+ expect : [
+ ["opentag", {
+ "name": "ROOT",
+ "attributes": {}
+ }],
+ ["opentag", {
+ "name": "CHILD",
+ "attributes": {}
+ }],
+ ["opentag", {
+ "name": "HAHA",
+ "attributes": {}
+ }],
+ ["closetag", "HAHA"],
+ ["closetag", "CHILD"],
+ ["opentag", {
+ "name": "MONKEY",
+ "attributes": {}
+ }],
+ ["text", "=(|)"],
+ ["closetag", "MONKEY"],
+ ["closetag", "ROOT"],
+ ["end"],
+ ["ready"]
+ ],
+ strict : false,
+ opt : {}
+});
+
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/self-closing-tag.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/self-closing-tag.js
new file mode 100644
index 000000000..b2c573629
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/self-closing-tag.js
@@ -0,0 +1,25 @@
+
+require(__dirname).test({
+ xml :
+ "<root> "+
+ "<haha /> "+
+ "<haha/> "+
+ "<monkey> "+
+ "=(|) "+
+ "</monkey>"+
+ "</root> ",
+ expect : [
+ ["opentag", {name:"ROOT", attributes:{}}],
+ ["opentag", {name:"HAHA", attributes:{}}],
+ ["closetag", "HAHA"],
+ ["opentag", {name:"HAHA", attributes:{}}],
+ ["closetag", "HAHA"],
+ // ["opentag", {name:"HAHA", attributes:{}}],
+ // ["closetag", "HAHA"],
+ ["opentag", {name:"MONKEY", attributes:{}}],
+ ["text", "=(|)"],
+ ["closetag", "MONKEY"],
+ ["closetag", "ROOT"]
+ ],
+ opt : { trim : true }
+}); \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/stray-ending.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/stray-ending.js
new file mode 100644
index 000000000..6b0aa7f3d
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/stray-ending.js
@@ -0,0 +1,17 @@
+// stray ending tags should just be ignored in non-strict mode.
+// https://github.com/isaacs/sax-js/issues/32
+require(__dirname).test
+ ( { xml :
+ "<a><b></c></b></a>"
+ , expect :
+ [ [ "opentag", { name: "A", attributes: {} } ]
+ , [ "opentag", { name: "B", attributes: {} } ]
+ , [ "text", "</c>" ]
+ , [ "closetag", "B" ]
+ , [ "closetag", "A" ]
+ ]
+ , strict : false
+ , opt : {}
+ }
+ )
+
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/trailing-non-whitespace.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/trailing-non-whitespace.js
new file mode 100644
index 000000000..3e1fb2ed5
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/trailing-non-whitespace.js
@@ -0,0 +1,17 @@
+
+require(__dirname).test({
+ xml : "<span>Welcome,</span> to monkey land",
+ expect : [
+ ["opentag", {
+ "name": "SPAN",
+ "attributes": {}
+ }],
+ ["text", "Welcome,"],
+ ["closetag", "SPAN"],
+ ["text", " to monkey land"],
+ ["end"],
+ ["ready"]
+ ],
+ strict : false,
+ opt : {}
+});
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/unquoted.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/unquoted.js
new file mode 100644
index 000000000..79f1d0b06
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/unquoted.js
@@ -0,0 +1,17 @@
+// unquoted attributes should be ok in non-strict mode
+// https://github.com/isaacs/sax-js/issues/31
+require(__dirname).test
+ ( { xml :
+ "<span class=test hello=world></span>"
+ , expect :
+ [ [ "attribute", { name: "class", value: "test" } ]
+ , [ "attribute", { name: "hello", value: "world" } ]
+ , [ "opentag", { name: "SPAN",
+ attributes: { class: "test", hello: "world" } } ]
+ , [ "closetag", "SPAN" ]
+ ]
+ , strict : false
+ , opt : {}
+ }
+ )
+
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-issue-41.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-issue-41.js
new file mode 100644
index 000000000..596d82b69
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-issue-41.js
@@ -0,0 +1,67 @@
+var t = require(__dirname)
+
+ , xmls = // should be the same both ways.
+ [ "<parent xmlns:a='http://ATTRIBUTE' a:attr='value' />"
+ , "<parent a:attr='value' xmlns:a='http://ATTRIBUTE' />" ]
+
+ , ex1 =
+ [ [ "opennamespace"
+ , { prefix: "a"
+ , uri: "http://ATTRIBUTE"
+ }
+ ]
+ , [ "attribute"
+ , { name: "xmlns:a"
+ , value: "http://ATTRIBUTE"
+ , prefix: "xmlns"
+ , local: "a"
+ , uri: "http://www.w3.org/2000/xmlns/"
+ }
+ ]
+ , [ "attribute"
+ , { name: "a:attr"
+ , local: "attr"
+ , prefix: "a"
+ , uri: "http://ATTRIBUTE"
+ , value: "value"
+ }
+ ]
+ , [ "opentag"
+ , { name: "parent"
+ , uri: ""
+ , prefix: ""
+ , local: "parent"
+ , attributes:
+ { "a:attr":
+ { name: "a:attr"
+ , local: "attr"
+ , prefix: "a"
+ , uri: "http://ATTRIBUTE"
+ , value: "value"
+ }
+ , "xmlns:a":
+ { name: "xmlns:a"
+ , local: "a"
+ , prefix: "xmlns"
+ , uri: "http://www.w3.org/2000/xmlns/"
+ , value: "http://ATTRIBUTE"
+ }
+ }
+ , ns: {"a": "http://ATTRIBUTE"}
+ }
+ ]
+ , ["closetag", "parent"]
+ , ["closenamespace", { prefix: "a", uri: "http://ATTRIBUTE" }]
+ ]
+
+ // swap the order of elements 2 and 1
+ , ex2 = [ex1[0], ex1[2], ex1[1]].concat(ex1.slice(3))
+ , expected = [ex1, ex2]
+
+xmls.forEach(function (x, i) {
+ t.test({ xml: x
+ , expect: expected[i]
+ , strict: true
+ , opt: { xmlns: true }
+ })
+})
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-rebinding.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-rebinding.js
new file mode 100644
index 000000000..f464876be
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-rebinding.js
@@ -0,0 +1,59 @@
+
+require(__dirname).test
+ ( { xml :
+ "<root xmlns:x='x1' xmlns:y='y1' x:a='x1' y:a='y1'>"+
+ "<rebind xmlns:x='x2'>"+
+ "<check x:a='x2' y:a='y1'/>"+
+ "</rebind>"+
+ "<check x:a='x1' y:a='y1'/>"+
+ "</root>"
+
+ , expect :
+ [ [ "opennamespace", { prefix: "x", uri: "x1" } ]
+ , [ "opennamespace", { prefix: "y", uri: "y1" } ]
+ , [ "attribute", { name: "xmlns:x", value: "x1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } ]
+ , [ "attribute", { name: "xmlns:y", value: "y1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "y" } ]
+ , [ "attribute", { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" } ]
+ , [ "attribute", { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } ]
+ , [ "opentag", { name: "root", uri: "", prefix: "", local: "root",
+ attributes: { "xmlns:x": { name: "xmlns:x", value: "x1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" }
+ , "xmlns:y": { name: "xmlns:y", value: "y1", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "y" }
+ , "x:a": { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" }
+ , "y:a": { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } },
+ ns: { x: 'x1', y: 'y1' } } ]
+
+ , [ "opennamespace", { prefix: "x", uri: "x2" } ]
+ , [ "attribute", { name: "xmlns:x", value: "x2", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } ]
+ , [ "opentag", { name: "rebind", uri: "", prefix: "", local: "rebind",
+ attributes: { "xmlns:x": { name: "xmlns:x", value: "x2", uri: "http://www.w3.org/2000/xmlns/", prefix: "xmlns", local: "x" } },
+ ns: { x: 'x2' } } ]
+
+ , [ "attribute", { name: "x:a", value: "x2", uri: "x2", prefix: "x", local: "a" } ]
+ , [ "attribute", { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } ]
+ , [ "opentag", { name: "check", uri: "", prefix: "", local: "check",
+ attributes: { "x:a": { name: "x:a", value: "x2", uri: "x2", prefix: "x", local: "a" }
+ , "y:a": { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } },
+ ns: { x: 'x2' } } ]
+
+ , [ "closetag", "check" ]
+
+ , [ "closetag", "rebind" ]
+ , [ "closenamespace", { prefix: "x", uri: "x2" } ]
+
+ , [ "attribute", { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" } ]
+ , [ "attribute", { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } ]
+ , [ "opentag", { name: "check", uri: "", prefix: "", local: "check",
+ attributes: { "x:a": { name: "x:a", value: "x1", uri: "x1", prefix: "x", local: "a" }
+ , "y:a": { name: "y:a", value: "y1", uri: "y1", prefix: "y", local: "a" } },
+ ns: { x: 'x1', y: 'y1' } } ]
+ , [ "closetag", "check" ]
+
+ , [ "closetag", "root" ]
+ , [ "closenamespace", { prefix: "x", uri: "x1" } ]
+ , [ "closenamespace", { prefix: "y", uri: "y1" } ]
+ ]
+ , strict : true
+ , opt : { xmlns: true }
+ }
+ )
+
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-strict.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-strict.js
new file mode 100644
index 000000000..4ad615b22
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-strict.js
@@ -0,0 +1,71 @@
+
+require(__dirname).test
+ ( { xml :
+ "<root>"+
+ "<plain attr='normal'/>"+
+ "<ns1 xmlns='uri:default'>"+
+ "<plain attr='normal'/>"+
+ "</ns1>"+
+ "<ns2 xmlns:a='uri:nsa'>"+
+ "<plain attr='normal'/>"+
+ "<a:ns a:attr='namespaced'/>"+
+ "</ns2>"+
+ "</root>"
+
+ , expect :
+ [ [ "opentag", { name: "root", prefix: "", local: "root", uri: "",
+ attributes: {}, ns: {} } ]
+
+ , [ "attribute", { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } ]
+ , [ "opentag", { name: "plain", prefix: "", local: "plain", uri: "",
+ attributes: { "attr": { name: "attr", value: "normal", uri: "", prefix: "", local: "attr", uri: "" } },
+ ns: {} } ]
+ , [ "closetag", "plain" ]
+
+ , [ "opennamespace", { prefix: "", uri: "uri:default" } ]
+
+ , [ "attribute", { name: "xmlns", value: "uri:default", prefix: "xmlns", local: "", uri: "http://www.w3.org/2000/xmlns/" } ]
+ , [ "opentag", { name: "ns1", prefix: "", local: "ns1", uri: "uri:default",
+ attributes: { "xmlns": { name: "xmlns", value: "uri:default", prefix: "xmlns", local: "", uri: "http://www.w3.org/2000/xmlns/" } },
+ ns: { "": "uri:default" } } ]
+
+ , [ "attribute", { name: "attr", value: "normal", prefix: "", local: "attr", uri: "uri:default" } ]
+ , [ "opentag", { name: "plain", prefix: "", local: "plain", uri: "uri:default", ns: { '': 'uri:default' },
+ attributes: { "attr": { name: "attr", value: "normal", prefix: "", local: "attr", uri: "uri:default" } } } ]
+ , [ "closetag", "plain" ]
+
+ , [ "closetag", "ns1" ]
+
+ , [ "closenamespace", { prefix: "", uri: "uri:default" } ]
+
+ , [ "opennamespace", { prefix: "a", uri: "uri:nsa" } ]
+
+ , [ "attribute", { name: "xmlns:a", value: "uri:nsa", prefix: "xmlns", local: "a", uri: "http://www.w3.org/2000/xmlns/" } ]
+
+ , [ "opentag", { name: "ns2", prefix: "", local: "ns2", uri: "",
+ attributes: { "xmlns:a": { name: "xmlns:a", value: "uri:nsa", prefix: "xmlns", local: "a", uri: "http://www.w3.org/2000/xmlns/" } },
+ ns: { a: "uri:nsa" } } ]
+
+ , [ "attribute", { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } ]
+ , [ "opentag", { name: "plain", prefix: "", local: "plain", uri: "",
+ attributes: { "attr": { name: "attr", value: "normal", prefix: "", local: "attr", uri: "" } },
+ ns: { a: 'uri:nsa' } } ]
+ , [ "closetag", "plain" ]
+
+ , [ "attribute", { name: "a:attr", value: "namespaced", prefix: "a", local: "attr", uri: "uri:nsa" } ]
+ , [ "opentag", { name: "a:ns", prefix: "a", local: "ns", uri: "uri:nsa",
+ attributes: { "a:attr": { name: "a:attr", value: "namespaced", prefix: "a", local: "attr", uri: "uri:nsa" } },
+ ns: { a: 'uri:nsa' } } ]
+ , [ "closetag", "a:ns" ]
+
+ , [ "closetag", "ns2" ]
+
+ , [ "closenamespace", { prefix: "a", uri: "uri:nsa" } ]
+
+ , [ "closetag", "root" ]
+ ]
+ , strict : true
+ , opt : { xmlns: true }
+ }
+ )
+
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-unbound.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-unbound.js
new file mode 100644
index 000000000..2944b87e8
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-unbound.js
@@ -0,0 +1,15 @@
+
+require(__dirname).test(
+ { strict : true
+ , opt : { xmlns: true }
+ , expect :
+ [ ["error", "Unbound namespace prefix: \"unbound\"\nLine: 0\nColumn: 28\nChar: >"]
+
+ , [ "attribute", { name: "unbound:attr", value: "value", uri: "unbound", prefix: "unbound", local: "attr" } ]
+ , [ "opentag", { name: "root", uri: "", prefix: "", local: "root",
+ attributes: { "unbound:attr": { name: "unbound:attr", value: "value", uri: "unbound", prefix: "unbound", local: "attr" } },
+ ns: {} } ]
+ , [ "closetag", "root" ]
+ ]
+ }
+).write("<root unbound:attr='value'/>")
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js
new file mode 100644
index 000000000..16da771a5
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-xml-default-prefix-attribute.js
@@ -0,0 +1,35 @@
+require(__dirname).test(
+ { xml : "<root xml:lang='en'/>"
+ , expect :
+ [ [ "attribute"
+ , { name: "xml:lang"
+ , local: "lang"
+ , prefix: "xml"
+ , uri: "http://www.w3.org/XML/1998/namespace"
+ , value: "en"
+ }
+ ]
+ , [ "opentag"
+ , { name: "root"
+ , uri: ""
+ , prefix: ""
+ , local: "root"
+ , attributes:
+ { "xml:lang":
+ { name: "xml:lang"
+ , local: "lang"
+ , prefix: "xml"
+ , uri: "http://www.w3.org/XML/1998/namespace"
+ , value: "en"
+ }
+ }
+ , ns: {}
+ }
+ ]
+ , ["closetag", "root"]
+ ]
+ , strict : true
+ , opt : { xmlns: true }
+ }
+)
+
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-xml-default-prefix.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-xml-default-prefix.js
new file mode 100644
index 000000000..9a1ce1b34
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-xml-default-prefix.js
@@ -0,0 +1,20 @@
+require(__dirname).test(
+ { xml : "<xml:root/>"
+ , expect :
+ [
+ [ "opentag"
+ , { name: "xml:root"
+ , uri: "http://www.w3.org/XML/1998/namespace"
+ , prefix: "xml"
+ , local: "root"
+ , attributes: {}
+ , ns: {}
+ }
+ ]
+ , ["closetag", "xml:root"]
+ ]
+ , strict : true
+ , opt : { xmlns: true }
+ }
+)
+
diff --git a/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-xml-default-redefine.js b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-xml-default-redefine.js
new file mode 100644
index 000000000..1eba9c714
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-optional-deps/node_modules/sax/test/xmlns-xml-default-redefine.js
@@ -0,0 +1,40 @@
+require(__dirname).test(
+ { xml : "<xml:root xmlns:xml='ERROR'/>"
+ , expect :
+ [ ["error"
+ , "xml: prefix must be bound to http://www.w3.org/XML/1998/namespace\n"
+ + "Actual: ERROR\n"
+ + "Line: 0\nColumn: 27\nChar: '"
+ ]
+ , [ "attribute"
+ , { name: "xmlns:xml"
+ , local: "xml"
+ , prefix: "xmlns"
+ , uri: "http://www.w3.org/2000/xmlns/"
+ , value: "ERROR"
+ }
+ ]
+ , [ "opentag"
+ , { name: "xml:root"
+ , uri: "http://www.w3.org/XML/1998/namespace"
+ , prefix: "xml"
+ , local: "root"
+ , attributes:
+ { "xmlns:xml":
+ { name: "xmlns:xml"
+ , local: "xml"
+ , prefix: "xmlns"
+ , uri: "http://www.w3.org/2000/xmlns/"
+ , value: "ERROR"
+ }
+ }
+ , ns: {}
+ }
+ ]
+ , ["closetag", "xml:root"]
+ ]
+ , strict : true
+ , opt : { xmlns: true }
+ }
+)
+
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/.travis.yml b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/.travis.yml
new file mode 100644
index 000000000..2d26206d5
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/.travis.yml
@@ -0,0 +1,3 @@
+language: node_js
+node_js:
+ - 0.6
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/LICENSE b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/LICENSE
new file mode 100644
index 000000000..57c8a18ef
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/LICENSE
@@ -0,0 +1,63 @@
+Some pieces from builtins/ taken from node core under this license:
+
+----
+
+Copyright Joyent, Inc. and other Node contributors.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to permit
+persons to whom the Software is furnished to do so, subject to the
+following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+----
+
+buffer_ieee754.js has this license in it:
+
+----
+
+Copyright (c) 2008, Fair Oaks Labs, Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ * Neither the name of Fair Oaks Labs, Inc. nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+Modifications to writeIEEE754 to support negative zeroes made by Brian White
+
+----
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/README.markdown b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/README.markdown
new file mode 100644
index 000000000..80eed8967
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/README.markdown
@@ -0,0 +1,173 @@
+browserify
+==========
+
+Make node-style require() work in the browser with a server-side build step,
+as if by magic!
+
+[![build status](https://secure.travis-ci.org/substack/node-browserify.png)](http://travis-ci.org/substack/node-browserify)
+
+![browserify!](http://substack.net/images/browserify/browserify.png)
+
+example
+=======
+
+Just write an `entry.js` to start with some `require()`s in it:
+
+````javascript
+// use relative requires
+var foo = require('./foo');
+var bar = require('../lib/bar');
+
+// or use modules installed by npm in node_modules/
+var domready = require('domready');
+
+domready(function () {
+ var elem = document.getElementById('result');
+ elem.textContent = foo(100) + bar('baz');
+});
+````
+
+Now just use the `browserify` command to build a bundle starting at `entry.js`:
+
+```
+$ browserify entry.js -o bundle.js
+```
+
+All of the modules that `entry.js` needs are included in the final bundle from a
+recursive walk using [detective](https://github.com/substack/node-detective).
+
+To use the bundle, just toss a `<script src="bundle.js"></script>` into your
+html!
+
+usage
+=====
+
+````
+Usage: browserify [entry files] {OPTIONS}
+
+Options:
+ --outfile, -o Write the browserify bundle to this file.
+ If unspecified, browserify prints to stdout.
+ --require, -r A module name or file to bundle.require()
+ Optionally use a colon separator to set the target.
+ --entry, -e An entry point of your app
+ --exports Export these core objects, comma-separated list
+ with any of: require, process. If unspecified, the
+ export behavior will be inferred.
+
+ --ignore, -i Ignore a file
+ --alias, -a Register an alias with a colon separator: "to:from"
+ Example: --alias 'jquery:jquery-browserify'
+ --cache, -c Turn on caching at $HOME/.config/browserling/cache.json or use
+ a file for caching.
+ [default: true]
+ --debug, -d Switch on debugging mode with //@ sourceURL=...s. [boolean]
+ --plugin, -p Use a plugin.
+ Example: --plugin aliasify
+ --prelude Include the code that defines require() in this bundle.
+ [boolean] [default: true]
+ --watch, -w Watch for changes. The script will stay open and write updates
+ to the output every time any of the bundled files change.
+ This option only works in tandem with -o.
+ --verbose, -v Write out how many bytes were written in -o mode. This is
+ especially useful with --watch.
+ --help, -h Show this message
+
+````
+
+compatability
+=============
+
+Many [npm](http://npmjs.org) modules that don't do IO will just work after being
+browserified. Others take more work.
+
+[coffee script](http://coffeescript.org/) should pretty much just work.
+Just do `browserify entry.coffee` or `require('./foo.coffee')`.
+
+Many node built-in modules have been wrapped to work in the browser.
+All you need to do is `require()` them like in node.
+
+* events
+* path
+* [vm](https://github.com/substack/vm-browserify)
+* [http](https://github.com/substack/http-browserify)
+* [crypto](https://github.com/dominictarr/crypto-browserify)
+* assert
+* url
+* buffer
+* buffer_ieee754
+* util
+* querystring
+* stream
+
+process
+-------
+
+Browserify makes available a faux `process` object to modules with these
+attributes:
+
+* nextTick(fn) - uses [the postMessage trick](http://dbaron.org/log/20100309-faster-timeouts)
+ for a faster `setTimeout(fn, 0)` if it can
+* title - set to 'browser' for browser code, 'node' in regular node code
+* browser - `true`, good for testing if you're in a browser or in node
+
+By default the process object is only available inside of files wrapped by
+browserify. To expose it, use `--exports=process`
+
+__dirname
+---------
+
+The faux directory name, scrubbed of true directory information so as not to
+expose your filesystem organization.
+
+__filename
+----------
+
+The faux file path, scrubbed of true path information so as not to expose your
+filesystem organization.
+
+package.json
+============
+
+In order to resolve main files for projects, the package.json "main" field is
+read.
+
+If a package.json has a "browserify" field, you can override the standard "main"
+behavior with something special just for browsers.
+
+See [dnode's
+package.json](https://github.com/substack/dnode/blob/9e24b97cf2ce931fbf6d7beb3731086b46bca887/package.json#L40)
+for an example of using the "browserify" field.
+
+more
+====
+
+* [browserify recipes](https://github.com/substack/node-browserify/blob/master/doc/recipes.markdown#recipes)
+* [browserify api reference](https://github.com/substack/node-browserify/blob/master/doc/methods.markdown#methods)
+* [browserify cdn](http://browserify.nodejitsu.com/)
+
+install
+=======
+
+With [npm](http://npmjs.org) do:
+
+```
+npm install -g browserify
+```
+
+test
+====
+
+To run the node tests with tap, do:
+
+```
+npm test
+```
+
+To run the [testling](http://testling.com) tests,
+create a [browserling](http://browserling.com) account then:
+
+```
+cd testling
+./test.sh
+```
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/bin/cmd.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/bin/cmd.js
new file mode 100755
index 000000000..9438be503
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/bin/cmd.js
@@ -0,0 +1,162 @@
+#!/usr/bin/env node
+
+var browserify = require('../');
+var fs = require('fs');
+var resolve = require('resolve');
+
+var argv = require('optimist')
+ .usage('Usage: browserify [entry files] {OPTIONS}')
+ .wrap(80)
+ .option('outfile', {
+ alias : 'o',
+ desc : 'Write the browserify bundle to this file.\n'
+ + 'If unspecified, browserify prints to stdout.'
+ ,
+ })
+ .option('require', {
+ alias : 'r',
+ desc : 'A module name or file to bundle.require()\n'
+ + 'Optionally use a colon separator to set the target.'
+ ,
+ })
+ .option('entry', {
+ alias : 'e',
+ desc : 'An entry point of your app'
+ })
+ .option('exports', {
+ desc : 'Export these core objects, comma-separated list\n'
+ + 'with any of: require, process. If unspecified, the\n'
+ + 'export behavior will be inferred.\n'
+ })
+ .option('ignore', {
+ alias : 'i',
+ desc : 'Ignore a file'
+ })
+ .option('alias', {
+ alias : 'a',
+ desc : 'Register an alias with a colon separator: "to:from"\n'
+ + "Example: --alias 'jquery:jquery-browserify'"
+ ,
+ })
+ .option('cache', {
+ alias : 'c',
+ desc : 'Turn on caching at $HOME/.config/browserling/cache.json '
+ + 'or use a file for caching.\n',
+ default : true,
+ })
+ .option('debug', {
+ alias : 'd',
+ desc : 'Switch on debugging mode with //@ sourceURL=...s.',
+ type : 'boolean'
+ })
+ .option('plugin', {
+ alias : 'p',
+ desc : 'Use a plugin.\n'
+ + 'Example: --plugin aliasify'
+ ,
+ })
+ .option('prelude', {
+ default : true,
+ type : 'boolean',
+ desc : 'Include the code that defines require() in this bundle.'
+ })
+ .option('watch', {
+ alias : 'w',
+ desc : 'Watch for changes. The script will stay open and write updates '
+ + 'to the output every time any of the bundled files change.\n'
+ + 'This option only works in tandem with -o.'
+ ,
+ })
+ .option('verbose', {
+ alias : 'v',
+ desc : 'Write out how many bytes were written in -o mode. '
+ + 'This is especially useful with --watch.'
+ ,
+ })
+ .option('help', {
+ alias : 'h',
+ desc : 'Show this message'
+ })
+ .check(function (argv) {
+ if (argv.help) throw ''
+ if (process.argv.length <= 2) throw 'Specify a parameter.'
+ })
+ .argv
+;
+
+var bundle = browserify({
+ watch : argv.watch,
+ cache : argv.cache,
+ debug : argv.debug,
+ exports : argv.exports && argv.exports.split(','),
+});
+
+bundle.on('syntaxError', function (err) {
+ console.error(err && err.stack || String(err));
+ process.exit(1);
+});
+
+if (argv.noprelude || argv.prelude === false) {
+ bundle.files = [];
+ bundle.prepends = [];
+}
+if (argv.ignore) bundle.ignore(argv.ignore);
+
+([].concat(argv.plugin || [])).forEach(function (plugin) {
+ var resolved = resolve.sync(plugin, { basedir : process.cwd() });
+ bundle.use(require(resolved));
+});
+
+([].concat(argv.alias || [])).forEach(function (alias) {
+ if (!alias.match(/:/)) {
+ console.error('aliases require a colon separator');
+ process.exit();
+ }
+ bundle.alias.apply(bundle, alias.split(':'));
+});
+
+([].concat(argv.require || [])).forEach(function (req) {
+ if (req.match(/:/)) {
+ var s = req.split(':');
+ bundle.require(s[0], { target : s[1] });
+ return;
+ }
+
+ if (!/^[.\/]/.test(req)) {
+ try {
+ var res = resolve.sync(req, { basedir : process.cwd() });
+ }
+ catch (e) {
+ return bundle.require(req);
+ }
+ return bundle.require(res, { target : req });
+ }
+ bundle.require(req);
+});
+
+(argv._.concat(argv.entry || [])).forEach(function (entry) {
+ bundle.addEntry(entry);
+});
+
+if (argv.outfile) {
+ function write () {
+ var src = bundle.bundle();
+ fs.writeFile(argv.outfile, src, function () {
+ if (argv.verbose) {
+ console.log(Buffer(src).length + ' bytes written');
+ }
+ });
+ }
+
+ write();
+ if (argv.watch) bundle.on('bundle', write)
+}
+else {
+ var src = bundle.bundle();
+ try { Function(src) }
+ catch (err) {
+ console.error(err.stack);
+ process.exit(1);
+ }
+ console.log(src);
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/__browserify_process.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/__browserify_process.js
new file mode 100644
index 000000000..ccafc0e16
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/__browserify_process.js
@@ -0,0 +1,48 @@
+var process = module.exports = {};
+
+process.nextTick = (function () {
+ var queue = [];
+ var canPost = typeof window !== 'undefined'
+ && window.postMessage && window.addEventListener
+ ;
+
+ if (canPost) {
+ window.addEventListener('message', function (ev) {
+ if (ev.source === window && ev.data === 'browserify-tick') {
+ ev.stopPropagation();
+ if (queue.length > 0) {
+ var fn = queue.shift();
+ fn();
+ }
+ }
+ }, true);
+ }
+
+ return function (fn) {
+ if (canPost) {
+ queue.push(fn);
+ window.postMessage('browserify-tick', '*');
+ }
+ else setTimeout(fn, 0);
+ };
+})();
+
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+
+process.binding = function (name) {
+ if (name === 'evals') return (require)('vm')
+ else throw new Error('No such module. (Possibly not yet loaded)')
+};
+
+(function () {
+ var cwd = '/';
+ var path;
+ process.cwd = function () { return cwd };
+ process.chdir = function (dir) {
+ if (!path) path = require('path');
+ cwd = path.resolve(dir, cwd);
+ };
+})();
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/assert.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/assert.js
new file mode 100644
index 000000000..f93f7216a
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/assert.js
@@ -0,0 +1,303 @@
+// UTILITY
+var util = require('util');
+var Buffer = require("buffer").Buffer;
+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 = module.exports = ok;
+
+// 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);
+ }
+};
+util.inherits(assert.AssertionError, Error);
+
+function replacer(key, value) {
+ if (value === undefined) {
+ return '' + value;
+ }
+ if (typeof value === 'number' && (isNaN(value) || !isFinite(value))) {
+ return value.toString();
+ }
+ if (typeof value === 'function' || value instanceof RegExp) {
+ return value.toString();
+ }
+ return value;
+}
+
+function truncate(s, n) {
+ if (typeof s == 'string') {
+ return s.length < n ? s : s.slice(0, n);
+ } else {
+ return s;
+ }
+}
+
+assert.AssertionError.prototype.toString = function() {
+ if (this.message) {
+ return [this.name + ':', this.message].join(' ');
+ } else {
+ return [
+ this.name + ':',
+ truncate(JSON.stringify(this.actual, replacer), 128),
+ this.operator,
+ truncate(JSON.stringify(this.expected, replacer), 128)
+ ].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);.
+
+function ok(value, message) {
+ if (!!!value) fail(value, true, message, '==', assert.ok);
+}
+assert.ok = 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;
+
+ } else if (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 _deepEqual(a, b);
+ }
+ try {
+ var ka = Object.keys(a),
+ kb = Object.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 expectedException(actual, expected) {
+ if (!actual || !expected) {
+ return false;
+ }
+
+ if (expected instanceof RegExp) {
+ return expected.test(actual);
+ } else if (actual instanceof expected) {
+ return true;
+ } else if (expected.call({}, actual) === true) {
+ return true;
+ }
+
+ return false;
+}
+
+function _throws(shouldThrow, block, expected, message) {
+ var actual;
+
+ if (typeof expected === 'string') {
+ message = expected;
+ expected = null;
+ }
+
+ try {
+ block();
+ } catch (e) {
+ actual = e;
+ }
+
+ message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
+ (message ? ' ' + message : '.');
+
+ if (shouldThrow && !actual) {
+ fail('Missing expected exception' + message);
+ }
+
+ if (!shouldThrow && expectedException(actual, expected)) {
+ fail('Got unwanted exception' + message);
+ }
+
+ if ((shouldThrow && actual && expected &&
+ !expectedException(actual, expected)) || (!shouldThrow && actual)) {
+ throw actual;
+ }
+}
+
+// 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;}};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/buffer.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/buffer.js
new file mode 100644
index 000000000..5c14c5b12
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/buffer.js
@@ -0,0 +1,1130 @@
+function SlowBuffer (size) {
+ this.length = size;
+};
+
+var assert = require('assert');
+
+exports.INSPECT_MAX_BYTES = 50;
+
+
+function toHex(n) {
+ if (n < 16) return '0' + n.toString(16);
+ return n.toString(16);
+}
+
+
+SlowBuffer.prototype.inspect = function() {
+ var out = [],
+ len = this.length;
+ for (var i = 0; i < len; i++) {
+ out[i] = toHex(this[i]);
+ if (i == exports.INSPECT_MAX_BYTES) {
+ out[i + 1] = '...';
+ break;
+ }
+ }
+ return '<SlowBuffer ' + out.join(' ') + '>';
+};
+
+
+SlowBuffer.prototype.hexSlice = function(start, end) {
+ var len = this.length;
+
+ if (!start || start < 0) start = 0;
+ if (!end || end < 0 || end > len) end = len;
+
+ var out = '';
+ for (var i = start; i < end; i++) {
+ out += toHex(this[i]);
+ }
+ return out;
+};
+
+
+SlowBuffer.prototype.toString = function(encoding, start, end) {
+ encoding = String(encoding || 'utf8').toLowerCase();
+ start = +start || 0;
+ if (typeof end == 'undefined') end = this.length;
+
+ // Fastpath empty strings
+ if (+end == start) {
+ return '';
+ }
+
+ switch (encoding) {
+ case 'hex':
+ return this.hexSlice(start, end);
+
+ case 'utf8':
+ case 'utf-8':
+ return this.utf8Slice(start, end);
+
+ case 'ascii':
+ return this.asciiSlice(start, end);
+
+ case 'binary':
+ return this.binarySlice(start, end);
+
+ case 'base64':
+ return this.base64Slice(start, end);
+
+ case 'ucs2':
+ case 'ucs-2':
+ return this.ucs2Slice(start, end);
+
+ default:
+ throw new Error('Unknown encoding');
+ }
+};
+
+
+SlowBuffer.prototype.hexWrite = function(string, offset, length) {
+ offset = +offset || 0;
+ var remaining = this.length - offset;
+ if (!length) {
+ length = remaining;
+ } else {
+ length = +length;
+ if (length > remaining) {
+ length = remaining;
+ }
+ }
+
+ // must be an even number of digits
+ var strLen = string.length;
+ if (strLen % 2) {
+ throw new Error('Invalid hex string');
+ }
+ if (length > strLen / 2) {
+ length = strLen / 2;
+ }
+ for (var i = 0; i < length; i++) {
+ var byte = parseInt(string.substr(i * 2, 2), 16);
+ if (isNaN(byte)) throw new Error('Invalid hex string');
+ this[offset + i] = byte;
+ }
+ SlowBuffer._charsWritten = i * 2;
+ return i;
+};
+
+
+SlowBuffer.prototype.write = function(string, offset, length, encoding) {
+ // Support both (string, offset, length, encoding)
+ // and the legacy (string, encoding, offset, length)
+ if (isFinite(offset)) {
+ if (!isFinite(length)) {
+ encoding = length;
+ length = undefined;
+ }
+ } else { // legacy
+ var swap = encoding;
+ encoding = offset;
+ offset = length;
+ length = swap;
+ }
+
+ offset = +offset || 0;
+ var remaining = this.length - offset;
+ if (!length) {
+ length = remaining;
+ } else {
+ length = +length;
+ if (length > remaining) {
+ length = remaining;
+ }
+ }
+ encoding = String(encoding || 'utf8').toLowerCase();
+
+ switch (encoding) {
+ case 'hex':
+ return this.hexWrite(string, offset, length);
+
+ case 'utf8':
+ case 'utf-8':
+ return this.utf8Write(string, offset, length);
+
+ case 'ascii':
+ return this.asciiWrite(string, offset, length);
+
+ case 'binary':
+ return this.binaryWrite(string, offset, length);
+
+ case 'base64':
+ return this.base64Write(string, offset, length);
+
+ case 'ucs2':
+ case 'ucs-2':
+ return this.ucs2Write(string, offset, length);
+
+ default:
+ throw new Error('Unknown encoding');
+ }
+};
+
+
+// slice(start, end)
+SlowBuffer.prototype.slice = function(start, end) {
+ if (end === undefined) end = this.length;
+
+ if (end > this.length) {
+ throw new Error('oob');
+ }
+ if (start > end) {
+ throw new Error('oob');
+ }
+
+ return new Buffer(this, end - start, +start);
+};
+
+
+function coerce(length) {
+ // Coerce length to a number (possibly NaN), round up
+ // in case it's fractional (e.g. 123.456) then do a
+ // double negate to coerce a NaN to 0. Easy, right?
+ length = ~~Math.ceil(+length);
+ return length < 0 ? 0 : length;
+}
+
+
+// Buffer
+
+function Buffer(subject, encoding, offset) {
+ if (!(this instanceof Buffer)) {
+ return new Buffer(subject, encoding, offset);
+ }
+
+ var type;
+
+ // Are we slicing?
+ if (typeof offset === 'number') {
+ this.length = coerce(encoding);
+ this.parent = subject;
+ this.offset = offset;
+ } else {
+ // Find the length
+ switch (type = typeof subject) {
+ case 'number':
+ this.length = coerce(subject);
+ break;
+
+ case 'string':
+ this.length = Buffer.byteLength(subject, encoding);
+ break;
+
+ case 'object': // Assume object is an array
+ this.length = coerce(subject.length);
+ break;
+
+ default:
+ throw new Error('First argument needs to be a number, ' +
+ 'array or string.');
+ }
+
+ if (this.length > Buffer.poolSize) {
+ // Big buffer, just alloc one.
+ this.parent = new SlowBuffer(this.length);
+ this.offset = 0;
+
+ } else {
+ // Small buffer.
+ if (!pool || pool.length - pool.used < this.length) allocPool();
+ this.parent = pool;
+ this.offset = pool.used;
+ pool.used += this.length;
+ }
+
+ // Treat array-ish objects as a byte array.
+ if (isArrayIsh(subject)) {
+ for (var i = 0; i < this.length; i++) {
+ this.parent[i + this.offset] = subject[i];
+ }
+ } else if (type == 'string') {
+ // We are a string
+ this.length = this.write(subject, 0, encoding);
+ }
+ }
+
+}
+
+function isArrayIsh(subject) {
+ return Array.isArray(subject) || Buffer.isBuffer(subject) ||
+ subject && typeof subject === 'object' &&
+ typeof subject.length === 'number';
+}
+
+exports.SlowBuffer = SlowBuffer;
+exports.Buffer = Buffer;
+
+Buffer.poolSize = 8 * 1024;
+var pool;
+
+function allocPool() {
+ pool = new SlowBuffer(Buffer.poolSize);
+ pool.used = 0;
+}
+
+
+// Static methods
+Buffer.isBuffer = function isBuffer(b) {
+ return b instanceof Buffer || b instanceof SlowBuffer;
+};
+
+
+// Inspect
+Buffer.prototype.inspect = function inspect() {
+ var out = [],
+ len = this.length;
+
+ for (var i = 0; i < len; i++) {
+ out[i] = toHex(this.parent[i + this.offset]);
+ if (i == exports.INSPECT_MAX_BYTES) {
+ out[i + 1] = '...';
+ break;
+ }
+ }
+
+ return '<Buffer ' + out.join(' ') + '>';
+};
+
+
+Buffer.prototype.get = function get(i) {
+ if (i < 0 || i >= this.length) throw new Error('oob');
+ return this.parent[this.offset + i];
+};
+
+
+Buffer.prototype.set = function set(i, v) {
+ if (i < 0 || i >= this.length) throw new Error('oob');
+ return this.parent[this.offset + i] = v;
+};
+
+
+// write(string, offset = 0, length = buffer.length-offset, encoding = 'utf8')
+Buffer.prototype.write = function(string, offset, length, encoding) {
+ // Support both (string, offset, length, encoding)
+ // and the legacy (string, encoding, offset, length)
+ if (isFinite(offset)) {
+ if (!isFinite(length)) {
+ encoding = length;
+ length = undefined;
+ }
+ } else { // legacy
+ var swap = encoding;
+ encoding = offset;
+ offset = length;
+ length = swap;
+ }
+
+ offset = +offset || 0;
+ var remaining = this.length - offset;
+ if (!length) {
+ length = remaining;
+ } else {
+ length = +length;
+ if (length > remaining) {
+ length = remaining;
+ }
+ }
+ encoding = String(encoding || 'utf8').toLowerCase();
+
+ var ret;
+ switch (encoding) {
+ case 'hex':
+ ret = this.parent.hexWrite(string, this.offset + offset, length);
+ break;
+
+ case 'utf8':
+ case 'utf-8':
+ ret = this.parent.utf8Write(string, this.offset + offset, length);
+ break;
+
+ case 'ascii':
+ ret = this.parent.asciiWrite(string, this.offset + offset, length);
+ break;
+
+ case 'binary':
+ ret = this.parent.binaryWrite(string, this.offset + offset, length);
+ break;
+
+ case 'base64':
+ // Warning: maxLength not taken into account in base64Write
+ ret = this.parent.base64Write(string, this.offset + offset, length);
+ break;
+
+ case 'ucs2':
+ case 'ucs-2':
+ ret = this.parent.ucs2Write(string, this.offset + offset, length);
+ break;
+
+ default:
+ throw new Error('Unknown encoding');
+ }
+
+ Buffer._charsWritten = SlowBuffer._charsWritten;
+
+ return ret;
+};
+
+
+// toString(encoding, start=0, end=buffer.length)
+Buffer.prototype.toString = function(encoding, start, end) {
+ encoding = String(encoding || 'utf8').toLowerCase();
+
+ if (typeof start == 'undefined' || start < 0) {
+ start = 0;
+ } else if (start > this.length) {
+ start = this.length;
+ }
+
+ if (typeof end == 'undefined' || end > this.length) {
+ end = this.length;
+ } else if (end < 0) {
+ end = 0;
+ }
+
+ start = start + this.offset;
+ end = end + this.offset;
+
+ switch (encoding) {
+ case 'hex':
+ return this.parent.hexSlice(start, end);
+
+ case 'utf8':
+ case 'utf-8':
+ return this.parent.utf8Slice(start, end);
+
+ case 'ascii':
+ return this.parent.asciiSlice(start, end);
+
+ case 'binary':
+ return this.parent.binarySlice(start, end);
+
+ case 'base64':
+ return this.parent.base64Slice(start, end);
+
+ case 'ucs2':
+ case 'ucs-2':
+ return this.parent.ucs2Slice(start, end);
+
+ default:
+ throw new Error('Unknown encoding');
+ }
+};
+
+
+// byteLength
+Buffer.byteLength = SlowBuffer.byteLength;
+
+
+// fill(value, start=0, end=buffer.length)
+Buffer.prototype.fill = function fill(value, start, end) {
+ value || (value = 0);
+ start || (start = 0);
+ end || (end = this.length);
+
+ if (typeof value === 'string') {
+ value = value.charCodeAt(0);
+ }
+ if (!(typeof value === 'number') || isNaN(value)) {
+ throw new Error('value is not a number');
+ }
+
+ if (end < start) throw new Error('end < start');
+
+ // Fill 0 bytes; we're done
+ if (end === start) return 0;
+ if (this.length == 0) return 0;
+
+ if (start < 0 || start >= this.length) {
+ throw new Error('start out of bounds');
+ }
+
+ if (end < 0 || end > this.length) {
+ throw new Error('end out of bounds');
+ }
+
+ return this.parent.fill(value,
+ start + this.offset,
+ end + this.offset);
+};
+
+
+// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
+Buffer.prototype.copy = function(target, target_start, start, end) {
+ var source = this;
+ start || (start = 0);
+ end || (end = this.length);
+ target_start || (target_start = 0);
+
+ if (end < start) throw new Error('sourceEnd < sourceStart');
+
+ // Copy 0 bytes; we're done
+ if (end === start) return 0;
+ if (target.length == 0 || source.length == 0) return 0;
+
+ if (target_start < 0 || target_start >= target.length) {
+ throw new Error('targetStart out of bounds');
+ }
+
+ if (start < 0 || start >= source.length) {
+ throw new Error('sourceStart out of bounds');
+ }
+
+ if (end < 0 || end > source.length) {
+ throw new Error('sourceEnd out of bounds');
+ }
+
+ // Are we oob?
+ if (end > this.length) {
+ end = this.length;
+ }
+
+ if (target.length - target_start < end - start) {
+ end = target.length - target_start + start;
+ }
+
+ return this.parent.copy(target.parent,
+ target_start + target.offset,
+ start + this.offset,
+ end + this.offset);
+};
+
+
+// slice(start, end)
+Buffer.prototype.slice = function(start, end) {
+ if (end === undefined) end = this.length;
+ if (end > this.length) throw new Error('oob');
+ if (start > end) throw new Error('oob');
+
+ return new Buffer(this.parent, end - start, +start + this.offset);
+};
+
+
+// Legacy methods for backwards compatibility.
+
+Buffer.prototype.utf8Slice = function(start, end) {
+ return this.toString('utf8', start, end);
+};
+
+Buffer.prototype.binarySlice = function(start, end) {
+ return this.toString('binary', start, end);
+};
+
+Buffer.prototype.asciiSlice = function(start, end) {
+ return this.toString('ascii', start, end);
+};
+
+Buffer.prototype.utf8Write = function(string, offset) {
+ return this.write(string, offset, 'utf8');
+};
+
+Buffer.prototype.binaryWrite = function(string, offset) {
+ return this.write(string, offset, 'binary');
+};
+
+Buffer.prototype.asciiWrite = function(string, offset) {
+ return this.write(string, offset, 'ascii');
+};
+
+Buffer.prototype.readUInt8 = function(offset, noAssert) {
+ var buffer = this;
+
+ if (!noAssert) {
+ assert.ok(offset !== undefined && offset !== null,
+ 'missing offset');
+
+ assert.ok(offset < buffer.length,
+ 'Trying to read beyond buffer length');
+ }
+
+ return buffer[offset];
+};
+
+function readUInt16(buffer, offset, isBigEndian, noAssert) {
+ var val = 0;
+
+
+ if (!noAssert) {
+ assert.ok(typeof (isBigEndian) === 'boolean',
+ 'missing or invalid endian');
+
+ assert.ok(offset !== undefined && offset !== null,
+ 'missing offset');
+
+ assert.ok(offset + 1 < buffer.length,
+ 'Trying to read beyond buffer length');
+ }
+
+ if (isBigEndian) {
+ val = buffer[offset] << 8;
+ val |= buffer[offset + 1];
+ } else {
+ val = buffer[offset];
+ val |= buffer[offset + 1] << 8;
+ }
+
+ return val;
+}
+
+Buffer.prototype.readUInt16LE = function(offset, noAssert) {
+ return readUInt16(this, offset, false, noAssert);
+};
+
+Buffer.prototype.readUInt16BE = function(offset, noAssert) {
+ return readUInt16(this, offset, true, noAssert);
+};
+
+function readUInt32(buffer, offset, isBigEndian, noAssert) {
+ var val = 0;
+
+ if (!noAssert) {
+ assert.ok(typeof (isBigEndian) === 'boolean',
+ 'missing or invalid endian');
+
+ assert.ok(offset !== undefined && offset !== null,
+ 'missing offset');
+
+ assert.ok(offset + 3 < buffer.length,
+ 'Trying to read beyond buffer length');
+ }
+
+ if (isBigEndian) {
+ val = buffer[offset + 1] << 16;
+ val |= buffer[offset + 2] << 8;
+ val |= buffer[offset + 3];
+ val = val + (buffer[offset] << 24 >>> 0);
+ } else {
+ val = buffer[offset + 2] << 16;
+ val |= buffer[offset + 1] << 8;
+ val |= buffer[offset];
+ val = val + (buffer[offset + 3] << 24 >>> 0);
+ }
+
+ return val;
+}
+
+Buffer.prototype.readUInt32LE = function(offset, noAssert) {
+ return readUInt32(this, offset, false, noAssert);
+};
+
+Buffer.prototype.readUInt32BE = function(offset, noAssert) {
+ return readUInt32(this, offset, true, noAssert);
+};
+
+
+/*
+ * Signed integer types, yay team! A reminder on how two's complement actually
+ * works. The first bit is the signed bit, i.e. tells us whether or not the
+ * number should be positive or negative. If the two's complement value is
+ * positive, then we're done, as it's equivalent to the unsigned representation.
+ *
+ * Now if the number is positive, you're pretty much done, you can just leverage
+ * the unsigned translations and return those. Unfortunately, negative numbers
+ * aren't quite that straightforward.
+ *
+ * At first glance, one might be inclined to use the traditional formula to
+ * translate binary numbers between the positive and negative values in two's
+ * complement. (Though it doesn't quite work for the most negative value)
+ * Mainly:
+ * - invert all the bits
+ * - add one to the result
+ *
+ * Of course, this doesn't quite work in Javascript. Take for example the value
+ * of -128. This could be represented in 16 bits (big-endian) as 0xff80. But of
+ * course, Javascript will do the following:
+ *
+ * > ~0xff80
+ * -65409
+ *
+ * Whoh there, Javascript, that's not quite right. But wait, according to
+ * Javascript that's perfectly correct. When Javascript ends up seeing the
+ * constant 0xff80, it has no notion that it is actually a signed number. It
+ * assumes that we've input the unsigned value 0xff80. Thus, when it does the
+ * binary negation, it casts it into a signed value, (positive 0xff80). Then
+ * when you perform binary negation on that, it turns it into a negative number.
+ *
+ * Instead, we're going to have to use the following general formula, that works
+ * in a rather Javascript friendly way. I'm glad we don't support this kind of
+ * weird numbering scheme in the kernel.
+ *
+ * (BIT-MAX - (unsigned)val + 1) * -1
+ *
+ * The astute observer, may think that this doesn't make sense for 8-bit numbers
+ * (really it isn't necessary for them). However, when you get 16-bit numbers,
+ * you do. Let's go back to our prior example and see how this will look:
+ *
+ * (0xffff - 0xff80 + 1) * -1
+ * (0x007f + 1) * -1
+ * (0x0080) * -1
+ */
+Buffer.prototype.readInt8 = function(offset, noAssert) {
+ var buffer = this;
+ var neg;
+
+ if (!noAssert) {
+ assert.ok(offset !== undefined && offset !== null,
+ 'missing offset');
+
+ assert.ok(offset < buffer.length,
+ 'Trying to read beyond buffer length');
+ }
+
+ neg = buffer[offset] & 0x80;
+ if (!neg) {
+ return (buffer[offset]);
+ }
+
+ return ((0xff - buffer[offset] + 1) * -1);
+};
+
+function readInt16(buffer, offset, isBigEndian, noAssert) {
+ var neg, val;
+
+ if (!noAssert) {
+ assert.ok(typeof (isBigEndian) === 'boolean',
+ 'missing or invalid endian');
+
+ assert.ok(offset !== undefined && offset !== null,
+ 'missing offset');
+
+ assert.ok(offset + 1 < buffer.length,
+ 'Trying to read beyond buffer length');
+ }
+
+ val = readUInt16(buffer, offset, isBigEndian, noAssert);
+ neg = val & 0x8000;
+ if (!neg) {
+ return val;
+ }
+
+ return (0xffff - val + 1) * -1;
+}
+
+Buffer.prototype.readInt16LE = function(offset, noAssert) {
+ return readInt16(this, offset, false, noAssert);
+};
+
+Buffer.prototype.readInt16BE = function(offset, noAssert) {
+ return readInt16(this, offset, true, noAssert);
+};
+
+function readInt32(buffer, offset, isBigEndian, noAssert) {
+ var neg, val;
+
+ if (!noAssert) {
+ assert.ok(typeof (isBigEndian) === 'boolean',
+ 'missing or invalid endian');
+
+ assert.ok(offset !== undefined && offset !== null,
+ 'missing offset');
+
+ assert.ok(offset + 3 < buffer.length,
+ 'Trying to read beyond buffer length');
+ }
+
+ val = readUInt32(buffer, offset, isBigEndian, noAssert);
+ neg = val & 0x80000000;
+ if (!neg) {
+ return (val);
+ }
+
+ return (0xffffffff - val + 1) * -1;
+}
+
+Buffer.prototype.readInt32LE = function(offset, noAssert) {
+ return readInt32(this, offset, false, noAssert);
+};
+
+Buffer.prototype.readInt32BE = function(offset, noAssert) {
+ return readInt32(this, offset, true, noAssert);
+};
+
+function readFloat(buffer, offset, isBigEndian, noAssert) {
+ if (!noAssert) {
+ assert.ok(typeof (isBigEndian) === 'boolean',
+ 'missing or invalid endian');
+
+ assert.ok(offset + 3 < buffer.length,
+ 'Trying to read beyond buffer length');
+ }
+
+ return require('buffer_ieee754').readIEEE754(buffer, offset, isBigEndian,
+ 23, 4);
+}
+
+Buffer.prototype.readFloatLE = function(offset, noAssert) {
+ return readFloat(this, offset, false, noAssert);
+};
+
+Buffer.prototype.readFloatBE = function(offset, noAssert) {
+ return readFloat(this, offset, true, noAssert);
+};
+
+function readDouble(buffer, offset, isBigEndian, noAssert) {
+ if (!noAssert) {
+ assert.ok(typeof (isBigEndian) === 'boolean',
+ 'missing or invalid endian');
+
+ assert.ok(offset + 7 < buffer.length,
+ 'Trying to read beyond buffer length');
+ }
+
+ return require('buffer_ieee754').readIEEE754(buffer, offset, isBigEndian,
+ 52, 8);
+}
+
+Buffer.prototype.readDoubleLE = function(offset, noAssert) {
+ return readDouble(this, offset, false, noAssert);
+};
+
+Buffer.prototype.readDoubleBE = function(offset, noAssert) {
+ return readDouble(this, offset, true, noAssert);
+};
+
+
+/*
+ * We have to make sure that the value is a valid integer. This means that it is
+ * non-negative. It has no fractional component and that it does not exceed the
+ * maximum allowed value.
+ *
+ * value The number to check for validity
+ *
+ * max The maximum value
+ */
+function verifuint(value, max) {
+ assert.ok(typeof (value) == 'number',
+ 'cannot write a non-number as a number');
+
+ assert.ok(value >= 0,
+ 'specified a negative value for writing an unsigned value');
+
+ assert.ok(value <= max, 'value is larger than maximum value for type');
+
+ assert.ok(Math.floor(value) === value, 'value has a fractional component');
+}
+
+Buffer.prototype.writeUInt8 = function(value, offset, noAssert) {
+ var buffer = this;
+
+ if (!noAssert) {
+ assert.ok(value !== undefined && value !== null,
+ 'missing value');
+
+ assert.ok(offset !== undefined && offset !== null,
+ 'missing offset');
+
+ assert.ok(offset < buffer.length,
+ 'trying to write beyond buffer length');
+
+ verifuint(value, 0xff);
+ }
+
+ buffer[offset] = value;
+};
+
+function writeUInt16(buffer, value, offset, isBigEndian, noAssert) {
+ if (!noAssert) {
+ assert.ok(value !== undefined && value !== null,
+ 'missing value');
+
+ assert.ok(typeof (isBigEndian) === 'boolean',
+ 'missing or invalid endian');
+
+ assert.ok(offset !== undefined && offset !== null,
+ 'missing offset');
+
+ assert.ok(offset + 1 < buffer.length,
+ 'trying to write beyond buffer length');
+
+ verifuint(value, 0xffff);
+ }
+
+ if (isBigEndian) {
+ buffer[offset] = (value & 0xff00) >>> 8;
+ buffer[offset + 1] = value & 0x00ff;
+ } else {
+ buffer[offset + 1] = (value & 0xff00) >>> 8;
+ buffer[offset] = value & 0x00ff;
+ }
+}
+
+Buffer.prototype.writeUInt16LE = function(value, offset, noAssert) {
+ writeUInt16(this, value, offset, false, noAssert);
+};
+
+Buffer.prototype.writeUInt16BE = function(value, offset, noAssert) {
+ writeUInt16(this, value, offset, true, noAssert);
+};
+
+function writeUInt32(buffer, value, offset, isBigEndian, noAssert) {
+ if (!noAssert) {
+ assert.ok(value !== undefined && value !== null,
+ 'missing value');
+
+ assert.ok(typeof (isBigEndian) === 'boolean',
+ 'missing or invalid endian');
+
+ assert.ok(offset !== undefined && offset !== null,
+ 'missing offset');
+
+ assert.ok(offset + 3 < buffer.length,
+ 'trying to write beyond buffer length');
+
+ verifuint(value, 0xffffffff);
+ }
+
+ if (isBigEndian) {
+ buffer[offset] = (value >>> 24) & 0xff;
+ buffer[offset + 1] = (value >>> 16) & 0xff;
+ buffer[offset + 2] = (value >>> 8) & 0xff;
+ buffer[offset + 3] = value & 0xff;
+ } else {
+ buffer[offset + 3] = (value >>> 24) & 0xff;
+ buffer[offset + 2] = (value >>> 16) & 0xff;
+ buffer[offset + 1] = (value >>> 8) & 0xff;
+ buffer[offset] = value & 0xff;
+ }
+}
+
+Buffer.prototype.writeUInt32LE = function(value, offset, noAssert) {
+ writeUInt32(this, value, offset, false, noAssert);
+};
+
+Buffer.prototype.writeUInt32BE = function(value, offset, noAssert) {
+ writeUInt32(this, value, offset, true, noAssert);
+};
+
+
+/*
+ * We now move onto our friends in the signed number category. Unlike unsigned
+ * numbers, we're going to have to worry a bit more about how we put values into
+ * arrays. Since we are only worrying about signed 32-bit values, we're in
+ * slightly better shape. Unfortunately, we really can't do our favorite binary
+ * & in this system. It really seems to do the wrong thing. For example:
+ *
+ * > -32 & 0xff
+ * 224
+ *
+ * What's happening above is really: 0xe0 & 0xff = 0xe0. However, the results of
+ * this aren't treated as a signed number. Ultimately a bad thing.
+ *
+ * What we're going to want to do is basically create the unsigned equivalent of
+ * our representation and pass that off to the wuint* functions. To do that
+ * we're going to do the following:
+ *
+ * - if the value is positive
+ * we can pass it directly off to the equivalent wuint
+ * - if the value is negative
+ * we do the following computation:
+ * mb + val + 1, where
+ * mb is the maximum unsigned value in that byte size
+ * val is the Javascript negative integer
+ *
+ *
+ * As a concrete value, take -128. In signed 16 bits this would be 0xff80. If
+ * you do out the computations:
+ *
+ * 0xffff - 128 + 1
+ * 0xffff - 127
+ * 0xff80
+ *
+ * You can then encode this value as the signed version. This is really rather
+ * hacky, but it should work and get the job done which is our goal here.
+ */
+
+/*
+ * A series of checks to make sure we actually have a signed 32-bit number
+ */
+function verifsint(value, max, min) {
+ assert.ok(typeof (value) == 'number',
+ 'cannot write a non-number as a number');
+
+ assert.ok(value <= max, 'value larger than maximum allowed value');
+
+ assert.ok(value >= min, 'value smaller than minimum allowed value');
+
+ assert.ok(Math.floor(value) === value, 'value has a fractional component');
+}
+
+function verifIEEE754(value, max, min) {
+ assert.ok(typeof (value) == 'number',
+ 'cannot write a non-number as a number');
+
+ assert.ok(value <= max, 'value larger than maximum allowed value');
+
+ assert.ok(value >= min, 'value smaller than minimum allowed value');
+}
+
+Buffer.prototype.writeInt8 = function(value, offset, noAssert) {
+ var buffer = this;
+
+ if (!noAssert) {
+ assert.ok(value !== undefined && value !== null,
+ 'missing value');
+
+ assert.ok(offset !== undefined && offset !== null,
+ 'missing offset');
+
+ assert.ok(offset < buffer.length,
+ 'Trying to write beyond buffer length');
+
+ verifsint(value, 0x7f, -0x80);
+ }
+
+ if (value >= 0) {
+ buffer.writeUInt8(value, offset, noAssert);
+ } else {
+ buffer.writeUInt8(0xff + value + 1, offset, noAssert);
+ }
+};
+
+function writeInt16(buffer, value, offset, isBigEndian, noAssert) {
+ if (!noAssert) {
+ assert.ok(value !== undefined && value !== null,
+ 'missing value');
+
+ assert.ok(typeof (isBigEndian) === 'boolean',
+ 'missing or invalid endian');
+
+ assert.ok(offset !== undefined && offset !== null,
+ 'missing offset');
+
+ assert.ok(offset + 1 < buffer.length,
+ 'Trying to write beyond buffer length');
+
+ verifsint(value, 0x7fff, -0x8000);
+ }
+
+ if (value >= 0) {
+ writeUInt16(buffer, value, offset, isBigEndian, noAssert);
+ } else {
+ writeUInt16(buffer, 0xffff + value + 1, offset, isBigEndian, noAssert);
+ }
+}
+
+Buffer.prototype.writeInt16LE = function(value, offset, noAssert) {
+ writeInt16(this, value, offset, false, noAssert);
+};
+
+Buffer.prototype.writeInt16BE = function(value, offset, noAssert) {
+ writeInt16(this, value, offset, true, noAssert);
+};
+
+function writeInt32(buffer, value, offset, isBigEndian, noAssert) {
+ if (!noAssert) {
+ assert.ok(value !== undefined && value !== null,
+ 'missing value');
+
+ assert.ok(typeof (isBigEndian) === 'boolean',
+ 'missing or invalid endian');
+
+ assert.ok(offset !== undefined && offset !== null,
+ 'missing offset');
+
+ assert.ok(offset + 3 < buffer.length,
+ 'Trying to write beyond buffer length');
+
+ verifsint(value, 0x7fffffff, -0x80000000);
+ }
+
+ if (value >= 0) {
+ writeUInt32(buffer, value, offset, isBigEndian, noAssert);
+ } else {
+ writeUInt32(buffer, 0xffffffff + value + 1, offset, isBigEndian, noAssert);
+ }
+}
+
+Buffer.prototype.writeInt32LE = function(value, offset, noAssert) {
+ writeInt32(this, value, offset, false, noAssert);
+};
+
+Buffer.prototype.writeInt32BE = function(value, offset, noAssert) {
+ writeInt32(this, value, offset, true, noAssert);
+};
+
+function writeFloat(buffer, value, offset, isBigEndian, noAssert) {
+ if (!noAssert) {
+ assert.ok(value !== undefined && value !== null,
+ 'missing value');
+
+ assert.ok(typeof (isBigEndian) === 'boolean',
+ 'missing or invalid endian');
+
+ assert.ok(offset !== undefined && offset !== null,
+ 'missing offset');
+
+ assert.ok(offset + 3 < buffer.length,
+ 'Trying to write beyond buffer length');
+
+ verifIEEE754(value, 3.4028234663852886e+38, -3.4028234663852886e+38);
+ }
+
+ require('buffer_ieee754').writeIEEE754(buffer, value, offset, isBigEndian,
+ 23, 4);
+}
+
+Buffer.prototype.writeFloatLE = function(value, offset, noAssert) {
+ writeFloat(this, value, offset, false, noAssert);
+};
+
+Buffer.prototype.writeFloatBE = function(value, offset, noAssert) {
+ writeFloat(this, value, offset, true, noAssert);
+};
+
+function writeDouble(buffer, value, offset, isBigEndian, noAssert) {
+ if (!noAssert) {
+ assert.ok(value !== undefined && value !== null,
+ 'missing value');
+
+ assert.ok(typeof (isBigEndian) === 'boolean',
+ 'missing or invalid endian');
+
+ assert.ok(offset !== undefined && offset !== null,
+ 'missing offset');
+
+ assert.ok(offset + 7 < buffer.length,
+ 'Trying to write beyond buffer length');
+
+ verifIEEE754(value, 1.7976931348623157E+308, -1.7976931348623157E+308);
+ }
+
+ require('buffer_ieee754').writeIEEE754(buffer, value, offset, isBigEndian,
+ 52, 8);
+}
+
+Buffer.prototype.writeDoubleLE = function(value, offset, noAssert) {
+ writeDouble(this, value, offset, false, noAssert);
+};
+
+Buffer.prototype.writeDoubleBE = function(value, offset, noAssert) {
+ writeDouble(this, value, offset, true, noAssert);
+};
+
+SlowBuffer.prototype.readUInt8 = Buffer.prototype.readUInt8;
+SlowBuffer.prototype.readUInt16LE = Buffer.prototype.readUInt16LE;
+SlowBuffer.prototype.readUInt16BE = Buffer.prototype.readUInt16BE;
+SlowBuffer.prototype.readUInt32LE = Buffer.prototype.readUInt32LE;
+SlowBuffer.prototype.readUInt32BE = Buffer.prototype.readUInt32BE;
+SlowBuffer.prototype.readInt8 = Buffer.prototype.readInt8;
+SlowBuffer.prototype.readInt16LE = Buffer.prototype.readInt16LE;
+SlowBuffer.prototype.readInt16BE = Buffer.prototype.readInt16BE;
+SlowBuffer.prototype.readInt32LE = Buffer.prototype.readInt32LE;
+SlowBuffer.prototype.readInt32BE = Buffer.prototype.readInt32BE;
+SlowBuffer.prototype.readFloatLE = Buffer.prototype.readFloatLE;
+SlowBuffer.prototype.readFloatBE = Buffer.prototype.readFloatBE;
+SlowBuffer.prototype.readDoubleLE = Buffer.prototype.readDoubleLE;
+SlowBuffer.prototype.readDoubleBE = Buffer.prototype.readDoubleBE;
+SlowBuffer.prototype.writeUInt8 = Buffer.prototype.writeUInt8;
+SlowBuffer.prototype.writeUInt16LE = Buffer.prototype.writeUInt16LE;
+SlowBuffer.prototype.writeUInt16BE = Buffer.prototype.writeUInt16BE;
+SlowBuffer.prototype.writeUInt32LE = Buffer.prototype.writeUInt32LE;
+SlowBuffer.prototype.writeUInt32BE = Buffer.prototype.writeUInt32BE;
+SlowBuffer.prototype.writeInt8 = Buffer.prototype.writeInt8;
+SlowBuffer.prototype.writeInt16LE = Buffer.prototype.writeInt16LE;
+SlowBuffer.prototype.writeInt16BE = Buffer.prototype.writeInt16BE;
+SlowBuffer.prototype.writeInt32LE = Buffer.prototype.writeInt32LE;
+SlowBuffer.prototype.writeInt32BE = Buffer.prototype.writeInt32BE;
+SlowBuffer.prototype.writeFloatLE = Buffer.prototype.writeFloatLE;
+SlowBuffer.prototype.writeFloatBE = Buffer.prototype.writeFloatBE;
+SlowBuffer.prototype.writeDoubleLE = Buffer.prototype.writeDoubleLE;
+SlowBuffer.prototype.writeDoubleBE = Buffer.prototype.writeDoubleBE;
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/buffer_ieee754.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/buffer_ieee754.js
new file mode 100644
index 000000000..fb295c0ab
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/buffer_ieee754.js
@@ -0,0 +1,84 @@
+exports.readIEEE754 = function(buffer, offset, isBE, mLen, nBytes) {
+ var e, m,
+ eLen = nBytes * 8 - mLen - 1,
+ eMax = (1 << eLen) - 1,
+ eBias = eMax >> 1,
+ nBits = -7,
+ i = isBE ? 0 : (nBytes - 1),
+ d = isBE ? 1 : -1,
+ s = buffer[offset + i];
+
+ i += d;
+
+ e = s & ((1 << (-nBits)) - 1);
+ s >>= (-nBits);
+ nBits += eLen;
+ for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8);
+
+ m = e & ((1 << (-nBits)) - 1);
+ e >>= (-nBits);
+ nBits += mLen;
+ for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8);
+
+ if (e === 0) {
+ e = 1 - eBias;
+ } else if (e === eMax) {
+ return m ? NaN : ((s ? -1 : 1) * Infinity);
+ } else {
+ m = m + Math.pow(2, mLen);
+ e = e - eBias;
+ }
+ return (s ? -1 : 1) * m * Math.pow(2, e - mLen);
+};
+
+exports.writeIEEE754 = function(buffer, value, offset, isBE, mLen, nBytes) {
+ var e, m, c,
+ eLen = nBytes * 8 - mLen - 1,
+ eMax = (1 << eLen) - 1,
+ eBias = eMax >> 1,
+ rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0),
+ i = isBE ? (nBytes - 1) : 0,
+ d = isBE ? -1 : 1,
+ s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
+
+ value = Math.abs(value);
+
+ if (isNaN(value) || value === Infinity) {
+ m = isNaN(value) ? 1 : 0;
+ e = eMax;
+ } else {
+ e = Math.floor(Math.log(value) / Math.LN2);
+ if (value * (c = Math.pow(2, -e)) < 1) {
+ e--;
+ c *= 2;
+ }
+ if (e + eBias >= 1) {
+ value += rt / c;
+ } else {
+ value += rt * Math.pow(2, 1 - eBias);
+ }
+ if (value * c >= 2) {
+ e++;
+ c /= 2;
+ }
+
+ if (e + eBias >= eMax) {
+ m = 0;
+ e = eMax;
+ } else if (e + eBias >= 1) {
+ m = (value * c - 1) * Math.pow(2, mLen);
+ e = e + eBias;
+ } else {
+ m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
+ e = 0;
+ }
+ }
+
+ for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8);
+
+ e = (e << mLen) | m;
+ eLen += mLen;
+ for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8);
+
+ buffer[offset + i - d] |= s * 128;
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/events.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/events.js
new file mode 100644
index 000000000..bc9440a80
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/events.js
@@ -0,0 +1,171 @@
+if (!process.EventEmitter) process.EventEmitter = function () {};
+
+var EventEmitter = exports.EventEmitter = process.EventEmitter;
+var isArray = typeof Array.isArray === 'function'
+ ? Array.isArray
+ : function (xs) {
+ return Object.prototype.toString.call(xs) === '[object Array]'
+ }
+;
+
+// By default EventEmitters will print a warning if more than
+// 10 listeners are added to it. This is a useful default which
+// helps finding memory leaks.
+//
+// Obviously not all Emitters should be limited to 10. This function allows
+// that to be increased. Set to zero for unlimited.
+var defaultMaxListeners = 10;
+EventEmitter.prototype.setMaxListeners = function(n) {
+ if (!this._events) this._events = {};
+ this._events.maxListeners = n;
+};
+
+
+EventEmitter.prototype.emit = function(type) {
+ // If there is no 'error' event listener then throw.
+ if (type === 'error') {
+ if (!this._events || !this._events.error ||
+ (isArray(this._events.error) && !this._events.error.length))
+ {
+ if (arguments[1] instanceof Error) {
+ throw arguments[1]; // Unhandled 'error' event
+ } else {
+ throw new Error("Uncaught, unspecified 'error' event.");
+ }
+ return false;
+ }
+ }
+
+ if (!this._events) return false;
+ var handler = this._events[type];
+ if (!handler) return false;
+
+ if (typeof handler == 'function') {
+ switch (arguments.length) {
+ // fast cases
+ case 1:
+ handler.call(this);
+ break;
+ case 2:
+ handler.call(this, arguments[1]);
+ break;
+ case 3:
+ handler.call(this, arguments[1], arguments[2]);
+ break;
+ // slower
+ default:
+ var args = Array.prototype.slice.call(arguments, 1);
+ handler.apply(this, args);
+ }
+ return true;
+
+ } else if (isArray(handler)) {
+ var args = Array.prototype.slice.call(arguments, 1);
+
+ var listeners = handler.slice();
+ for (var i = 0, l = listeners.length; i < l; i++) {
+ listeners[i].apply(this, args);
+ }
+ return true;
+
+ } else {
+ return false;
+ }
+};
+
+// EventEmitter is defined in src/node_events.cc
+// EventEmitter.prototype.emit() is also defined there.
+EventEmitter.prototype.addListener = function(type, listener) {
+ if ('function' !== typeof listener) {
+ throw new Error('addListener only takes instances of Function');
+ }
+
+ if (!this._events) this._events = {};
+
+ // To avoid recursion in the case that type == "newListeners"! Before
+ // adding it to the listeners, first emit "newListeners".
+ this.emit('newListener', type, listener);
+
+ if (!this._events[type]) {
+ // Optimize the case of one listener. Don't need the extra array object.
+ this._events[type] = listener;
+ } else if (isArray(this._events[type])) {
+
+ // Check for listener leak
+ if (!this._events[type].warned) {
+ var m;
+ if (this._events.maxListeners !== undefined) {
+ m = this._events.maxListeners;
+ } else {
+ m = defaultMaxListeners;
+ }
+
+ if (m && m > 0 && this._events[type].length > m) {
+ this._events[type].warned = true;
+ console.error('(node) warning: possible EventEmitter memory ' +
+ 'leak detected. %d listeners added. ' +
+ 'Use emitter.setMaxListeners() to increase limit.',
+ this._events[type].length);
+ console.trace();
+ }
+ }
+
+ // If we've already got an array, just append.
+ this._events[type].push(listener);
+ } else {
+ // Adding the second element, need to change to array.
+ this._events[type] = [this._events[type], listener];
+ }
+
+ return this;
+};
+
+EventEmitter.prototype.on = EventEmitter.prototype.addListener;
+
+EventEmitter.prototype.once = function(type, listener) {
+ var self = this;
+ self.on(type, function g() {
+ self.removeListener(type, g);
+ listener.apply(this, arguments);
+ });
+
+ return this;
+};
+
+EventEmitter.prototype.removeListener = function(type, listener) {
+ if ('function' !== typeof listener) {
+ throw new Error('removeListener only takes instances of Function');
+ }
+
+ // does not use listeners(), so no side effect of creating _events[type]
+ if (!this._events || !this._events[type]) return this;
+
+ var list = this._events[type];
+
+ if (isArray(list)) {
+ var i = list.indexOf(listener);
+ if (i < 0) return this;
+ list.splice(i, 1);
+ if (list.length == 0)
+ delete this._events[type];
+ } else if (this._events[type] === listener) {
+ delete this._events[type];
+ }
+
+ return this;
+};
+
+EventEmitter.prototype.removeAllListeners = function(type) {
+ // does not use listeners(), so no side effect of creating _events[type]
+ if (type && this._events && this._events[type]) this._events[type] = null;
+ return this;
+};
+
+EventEmitter.prototype.listeners = function(type) {
+ if (!this._events) this._events = {};
+ if (!this._events[type]) this._events[type] = [];
+ if (!isArray(this._events[type])) {
+ this._events[type] = [this._events[type]];
+ }
+ return this._events[type];
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/fs.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/fs.js
new file mode 100644
index 000000000..5c9c0443b
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/fs.js
@@ -0,0 +1 @@
+// nothing to see here... no file methods for the browser
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/https.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/https.js
new file mode 100644
index 000000000..4c6ac07d2
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/https.js
@@ -0,0 +1 @@
+module.exports = require('http');
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/net.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/net.js
new file mode 100644
index 000000000..65b3dba38
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/net.js
@@ -0,0 +1 @@
+// todo
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/path.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/path.js
new file mode 100644
index 000000000..839011fdd
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/path.js
@@ -0,0 +1,134 @@
+function filter (xs, fn) {
+ var res = [];
+ for (var i = 0; i < xs.length; i++) {
+ if (fn(xs[i], i, xs)) res.push(xs[i]);
+ }
+ return res;
+}
+
+// resolves . and .. elements in a path array with directory names there
+// must be no slashes, empty elements, or device names (c:\) in the array
+// (so also no leading and trailing slashes - it does not distinguish
+// relative and absolute paths)
+function normalizeArray(parts, allowAboveRoot) {
+ // if the path tries to go above the root, `up` ends up > 0
+ var up = 0;
+ for (var i = parts.length; i >= 0; i--) {
+ var last = parts[i];
+ if (last == '.') {
+ parts.splice(i, 1);
+ } else if (last === '..') {
+ parts.splice(i, 1);
+ up++;
+ } else if (up) {
+ parts.splice(i, 1);
+ up--;
+ }
+ }
+
+ // if the path is allowed to go above the root, restore leading ..s
+ if (allowAboveRoot) {
+ for (; up--; up) {
+ parts.unshift('..');
+ }
+ }
+
+ return parts;
+}
+
+// Regex to split a filename into [*, dir, basename, ext]
+// posix version
+var splitPathRe = /^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/;
+
+// path.resolve([from ...], to)
+// posix version
+exports.resolve = function() {
+var resolvedPath = '',
+ resolvedAbsolute = false;
+
+for (var i = arguments.length; i >= -1 && !resolvedAbsolute; i--) {
+ var path = (i >= 0)
+ ? arguments[i]
+ : process.cwd();
+
+ // Skip empty and invalid entries
+ if (typeof path !== 'string' || !path) {
+ continue;
+ }
+
+ resolvedPath = path + '/' + resolvedPath;
+ resolvedAbsolute = path.charAt(0) === '/';
+}
+
+// At this point the path should be resolved to a full absolute path, but
+// handle relative paths to be safe (might happen when process.cwd() fails)
+
+// Normalize the path
+resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
+ return !!p;
+ }), !resolvedAbsolute).join('/');
+
+ return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
+};
+
+// path.normalize(path)
+// posix version
+exports.normalize = function(path) {
+var isAbsolute = path.charAt(0) === '/',
+ trailingSlash = path.slice(-1) === '/';
+
+// Normalize the path
+path = normalizeArray(filter(path.split('/'), function(p) {
+ return !!p;
+ }), !isAbsolute).join('/');
+
+ if (!path && !isAbsolute) {
+ path = '.';
+ }
+ if (path && trailingSlash) {
+ path += '/';
+ }
+
+ return (isAbsolute ? '/' : '') + path;
+};
+
+
+// posix version
+exports.join = function() {
+ var paths = Array.prototype.slice.call(arguments, 0);
+ return exports.normalize(filter(paths, function(p, index) {
+ return p && typeof p === 'string';
+ }).join('/'));
+};
+
+
+exports.dirname = function(path) {
+ var dir = splitPathRe.exec(path)[1] || '';
+ var isWindows = false;
+ if (!dir) {
+ // No dirname
+ return '.';
+ } else if (dir.length === 1 ||
+ (isWindows && dir.length <= 3 && dir.charAt(1) === ':')) {
+ // It is just a slash or a drive letter with a slash
+ return dir;
+ } else {
+ // It is a full dirname, strip trailing slash
+ return dir.substring(0, dir.length - 1);
+ }
+};
+
+
+exports.basename = function(path, ext) {
+ var f = splitPathRe.exec(path)[2] || '';
+ // TODO: make this comparison case-insensitive on windows?
+ if (ext && f.substr(-1 * ext.length) === ext) {
+ f = f.substr(0, f.length - ext.length);
+ }
+ return f;
+};
+
+
+exports.extname = function(path) {
+ return splitPathRe.exec(path)[3] || '';
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/querystring.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/querystring.js
new file mode 100644
index 000000000..069ff0b83
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/querystring.js
@@ -0,0 +1,250 @@
+var isArray = typeof Array.isArray === 'function'
+ ? Array.isArray
+ : function (xs) {
+ return Object.prototype.toString.call(xs) === '[object Array]'
+ };
+
+var objectKeys = Object.keys || function objectKeys(object) {
+ if (object !== Object(object)) throw new TypeError('Invalid object');
+ var keys = [];
+ for (var key in object) if (object.hasOwnProperty(key)) keys[keys.length] = key;
+ return keys;
+}
+
+
+/*!
+ * querystring
+ * Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
+ * MIT Licensed
+ */
+
+/**
+ * Library version.
+ */
+
+exports.version = '0.3.1';
+
+/**
+ * Object#toString() ref for stringify().
+ */
+
+var toString = Object.prototype.toString;
+
+/**
+ * Cache non-integer test regexp.
+ */
+
+var notint = /[^0-9]/;
+
+/**
+ * Parse the given query `str`, returning an object.
+ *
+ * @param {String} str
+ * @return {Object}
+ * @api public
+ */
+
+exports.parse = function(str){
+ if (null == str || '' == str) return {};
+
+ 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;
+ }
+
+ 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)
+ , parent = ret;
+
+ // ?foo
+ if ('' == key) key = pair, val = '';
+
+ // nested
+ if (~key.indexOf(']')) {
+ var parts = key.split('[')
+ , len = parts.length
+ , last = len - 1;
+
+ function parse(parts, parent, key) {
+ var part = parts.shift();
+
+ // end
+ if (!part) {
+ if (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 {
+ obj = parent[key] = parent[key] || [];
+ if (']' == part) {
+ if (isArray(obj)) {
+ if ('' != val) obj.push(val);
+ } else if ('object' == typeof obj) {
+ obj[objectKeys(obj).length] = val;
+ } else {
+ obj = parent[key] = [parent[key], val];
+ }
+ // prop
+ } else if (~part.indexOf(']')) {
+ part = part.substr(0, part.length - 1);
+ if(notint.test(part) && isArray(obj)) obj = promote(parent, key);
+ parse(parts, obj, part);
+ // key
+ } else {
+ if(notint.test(part) && isArray(obj)) obj = promote(parent, key);
+ parse(parts, obj, part);
+ }
+ }
+ }
+
+ parse(parts, parent, 'base');
+ // optimize
+ } else {
+ if (notint.test(key) && 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 ret;
+ }, {base: {}}).base;
+};
+
+/**
+ * Turn the given `obj` into a query string
+ *
+ * @param {Object} obj
+ * @return {String}
+ * @api public
+ */
+
+var stringify = exports.stringify = function(obj, prefix) {
+ if (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;
+ }
+};
+
+/**
+ * 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 + '[]'));
+ }
+ return ret.join('&');
+}
+
+/**
+ * Stringify the given `obj`.
+ *
+ * @param {Object} obj
+ * @param {String} prefix
+ * @return {String}
+ * @api private
+ */
+
+function stringifyObject(obj, prefix) {
+ var ret = []
+ , keys = objectKeys(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 (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;
+ }
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/stream.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/stream.js
new file mode 100644
index 000000000..4feb41045
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/stream.js
@@ -0,0 +1,119 @@
+var events = require('events');
+var util = require('util');
+
+function Stream() {
+ events.EventEmitter.call(this);
+}
+util.inherits(Stream, events.EventEmitter);
+module.exports = Stream;
+// Backwards-compat with node 0.4.x
+Stream.Stream = Stream;
+
+Stream.prototype.pipe = function(dest, options) {
+ var source = this;
+
+ function ondata(chunk) {
+ if (dest.writable) {
+ if (false === dest.write(chunk) && source.pause) {
+ source.pause();
+ }
+ }
+ }
+
+ source.on('data', ondata);
+
+ function ondrain() {
+ if (source.readable && source.resume) {
+ source.resume();
+ }
+ }
+
+ dest.on('drain', ondrain);
+
+ // If the 'end' option is not supplied, dest.end() will be called when
+ // source gets the 'end' or 'close' events. Only dest.end() once, and
+ // only when all sources have ended.
+ if (!dest._isStdio && (!options || options.end !== false)) {
+ dest._pipeCount = dest._pipeCount || 0;
+ dest._pipeCount++;
+
+ source.on('end', onend);
+ source.on('close', onclose);
+ }
+
+ var didOnEnd = false;
+ function onend() {
+ if (didOnEnd) return;
+ didOnEnd = true;
+
+ dest._pipeCount--;
+
+ // remove the listeners
+ cleanup();
+
+ if (dest._pipeCount > 0) {
+ // waiting for other incoming streams to end.
+ return;
+ }
+
+ dest.end();
+ }
+
+
+ function onclose() {
+ if (didOnEnd) return;
+ didOnEnd = true;
+
+ dest._pipeCount--;
+
+ // remove the listeners
+ cleanup();
+
+ if (dest._pipeCount > 0) {
+ // waiting for other incoming streams to end.
+ return;
+ }
+
+ dest.destroy();
+ }
+
+ // don't leave dangling pipes when there are errors.
+ function onerror(er) {
+ cleanup();
+ if (this.listeners('error').length === 0) {
+ throw er; // Unhandled stream error in pipe.
+ }
+ }
+
+ source.on('error', onerror);
+ dest.on('error', onerror);
+
+ // remove all the event listeners that were added.
+ function cleanup() {
+ source.removeListener('data', ondata);
+ dest.removeListener('drain', ondrain);
+
+ source.removeListener('end', onend);
+ source.removeListener('close', onclose);
+
+ source.removeListener('error', onerror);
+ dest.removeListener('error', onerror);
+
+ source.removeListener('end', cleanup);
+ source.removeListener('close', cleanup);
+
+ dest.removeListener('end', cleanup);
+ dest.removeListener('close', cleanup);
+ }
+
+ source.on('end', cleanup);
+ source.on('close', cleanup);
+
+ dest.on('end', cleanup);
+ dest.on('close', cleanup);
+
+ dest.emit('pipe', source);
+
+ // Allow for unix-like usage: A.pipe(B).pipe(C)
+ return dest;
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/sys.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/sys.js
new file mode 100644
index 000000000..262f93b78
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/sys.js
@@ -0,0 +1 @@
+module.exports = require('util');
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/tls.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/tls.js
new file mode 100644
index 000000000..65b3dba38
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/tls.js
@@ -0,0 +1 @@
+// todo
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/tty.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/tty.js
new file mode 100644
index 000000000..a674e0f7a
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/tty.js
@@ -0,0 +1,2 @@
+exports.isatty = function () {};
+exports.setRawMode = function () {};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/url.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/url.js
new file mode 100644
index 000000000..d623925eb
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/url.js
@@ -0,0 +1,604 @@
+var punycode = { encode : function (s) { return s } };
+
+exports.parse = urlParse;
+exports.resolve = urlResolve;
+exports.resolveObject = urlResolveObject;
+exports.format = urlFormat;
+
+function arrayIndexOf(array, subject) {
+ for (var i = 0, j = array.length; i < j; i++) {
+ if(array[i] == subject) return i;
+ }
+ return -1;
+}
+
+var objectKeys = Object.keys || function objectKeys(object) {
+ if (object !== Object(object)) throw new TypeError('Invalid object');
+ var keys = [];
+ for (var key in object) if (object.hasOwnProperty(key)) keys[keys.length] = key;
+ return keys;
+}
+
+// Reference: RFC 3986, RFC 1808, RFC 2396
+
+// define these here so at least they only have to be
+// compiled once on the first module load.
+var protocolPattern = /^([a-z0-9.+-]+:)/i,
+ portPattern = /:[0-9]+$/,
+ // RFC 2396: characters reserved for delimiting URLs.
+ delims = ['<', '>', '"', '`', ' ', '\r', '\n', '\t'],
+ // RFC 2396: characters not allowed for various reasons.
+ unwise = ['{', '}', '|', '\\', '^', '~', '[', ']', '`'].concat(delims),
+ // Allowed by RFCs, but cause of XSS attacks. Always escape these.
+ autoEscape = ['\''],
+ // Characters that are never ever allowed in a hostname.
+ // Note that any invalid chars are also handled, but these
+ // are the ones that are *expected* to be seen, so we fast-path
+ // them.
+ nonHostChars = ['%', '/', '?', ';', '#']
+ .concat(unwise).concat(autoEscape),
+ nonAuthChars = ['/', '@', '?', '#'].concat(delims),
+ hostnameMaxLen = 255,
+ hostnamePartPattern = /^[a-zA-Z0-9][a-z0-9A-Z_-]{0,62}$/,
+ hostnamePartStart = /^([a-zA-Z0-9][a-z0-9A-Z_-]{0,62})(.*)$/,
+ // protocols that can allow "unsafe" and "unwise" chars.
+ unsafeProtocol = {
+ 'javascript': true,
+ 'javascript:': true
+ },
+ // protocols that never have a hostname.
+ hostlessProtocol = {
+ 'javascript': true,
+ 'javascript:': true
+ },
+ // protocols that always have a path component.
+ pathedProtocol = {
+ 'http': true,
+ 'https': true,
+ 'ftp': true,
+ 'gopher': true,
+ 'file': true,
+ 'http:': true,
+ 'ftp:': true,
+ 'gopher:': true,
+ 'file:': true
+ },
+ // protocols that always contain a // bit.
+ slashedProtocol = {
+ 'http': true,
+ 'https': true,
+ 'ftp': true,
+ 'gopher': true,
+ 'file': true,
+ 'http:': true,
+ 'https:': true,
+ 'ftp:': true,
+ 'gopher:': true,
+ 'file:': true
+ },
+ querystring = require('querystring');
+
+function urlParse(url, parseQueryString, slashesDenoteHost) {
+ if (url && typeof(url) === 'object' && url.href) return url;
+
+ if (typeof url !== 'string') {
+ throw new TypeError("Parameter 'url' must be a string, not " + typeof url);
+ }
+
+ var out = {},
+ rest = url;
+
+ // cut off any delimiters.
+ // This is to support parse stuff like "<http://foo.com>"
+ for (var i = 0, l = rest.length; i < l; i++) {
+ if (arrayIndexOf(delims, rest.charAt(i)) === -1) break;
+ }
+ if (i !== 0) rest = rest.substr(i);
+
+
+ var proto = protocolPattern.exec(rest);
+ if (proto) {
+ proto = proto[0];
+ var lowerProto = proto.toLowerCase();
+ out.protocol = lowerProto;
+ rest = rest.substr(proto.length);
+ }
+
+ // figure out if it's got a host
+ // user@server is *always* interpreted as a hostname, and url
+ // resolution will treat //foo/bar as host=foo,path=bar because that's
+ // how the browser resolves relative URLs.
+ if (slashesDenoteHost || proto || rest.match(/^\/\/[^@\/]+@[^@\/]+/)) {
+ var slashes = rest.substr(0, 2) === '//';
+ if (slashes && !(proto && hostlessProtocol[proto])) {
+ rest = rest.substr(2);
+ out.slashes = true;
+ }
+ }
+
+ if (!hostlessProtocol[proto] &&
+ (slashes || (proto && !slashedProtocol[proto]))) {
+ // there's a hostname.
+ // the first instance of /, ?, ;, or # ends the host.
+ // don't enforce full RFC correctness, just be unstupid about it.
+
+ // If there is an @ in the hostname, then non-host chars *are* allowed
+ // to the left of the first @ sign, unless some non-auth character
+ // comes *before* the @-sign.
+ // URLs are obnoxious.
+ var atSign = arrayIndexOf(rest, '@');
+ if (atSign !== -1) {
+ // there *may be* an auth
+ var hasAuth = true;
+ for (var i = 0, l = nonAuthChars.length; i < l; i++) {
+ var index = arrayIndexOf(rest, nonAuthChars[i]);
+ if (index !== -1 && index < atSign) {
+ // not a valid auth. Something like http://foo.com/bar@baz/
+ hasAuth = false;
+ break;
+ }
+ }
+ if (hasAuth) {
+ // pluck off the auth portion.
+ out.auth = rest.substr(0, atSign);
+ rest = rest.substr(atSign + 1);
+ }
+ }
+
+ var firstNonHost = -1;
+ for (var i = 0, l = nonHostChars.length; i < l; i++) {
+ var index = arrayIndexOf(rest, nonHostChars[i]);
+ if (index !== -1 &&
+ (firstNonHost < 0 || index < firstNonHost)) firstNonHost = index;
+ }
+
+ if (firstNonHost !== -1) {
+ out.host = rest.substr(0, firstNonHost);
+ rest = rest.substr(firstNonHost);
+ } else {
+ out.host = rest;
+ rest = '';
+ }
+
+ // pull out port.
+ var p = parseHost(out.host);
+ var keys = objectKeys(p);
+ for (var i = 0, l = keys.length; i < l; i++) {
+ var key = keys[i];
+ out[key] = p[key];
+ }
+
+ // we've indicated that there is a hostname,
+ // so even if it's empty, it has to be present.
+ out.hostname = out.hostname || '';
+
+ // validate a little.
+ if (out.hostname.length > hostnameMaxLen) {
+ out.hostname = '';
+ } else {
+ var hostparts = out.hostname.split(/\./);
+ for (var i = 0, l = hostparts.length; i < l; i++) {
+ var part = hostparts[i];
+ if (!part) continue;
+ if (!part.match(hostnamePartPattern)) {
+ var newpart = '';
+ for (var j = 0, k = part.length; j < k; j++) {
+ if (part.charCodeAt(j) > 127) {
+ // we replace non-ASCII char with a temporary placeholder
+ // we need this to make sure size of hostname is not
+ // broken by replacing non-ASCII by nothing
+ newpart += 'x';
+ } else {
+ newpart += part[j];
+ }
+ }
+ // we test again with ASCII char only
+ if (!newpart.match(hostnamePartPattern)) {
+ var validParts = hostparts.slice(0, i);
+ var notHost = hostparts.slice(i + 1);
+ var bit = part.match(hostnamePartStart);
+ if (bit) {
+ validParts.push(bit[1]);
+ notHost.unshift(bit[2]);
+ }
+ if (notHost.length) {
+ rest = '/' + notHost.join('.') + rest;
+ }
+ out.hostname = validParts.join('.');
+ break;
+ }
+ }
+ }
+ }
+
+ // hostnames are always lower case.
+ out.hostname = out.hostname.toLowerCase();
+
+ // IDNA Support: Returns a puny coded representation of "domain".
+ // It only converts the part of the domain name that
+ // has non ASCII characters. I.e. it dosent matter if
+ // you call it with a domain that already is in ASCII.
+ var domainArray = out.hostname.split('.');
+ var newOut = [];
+ for (var i = 0; i < domainArray.length; ++i) {
+ var s = domainArray[i];
+ newOut.push(s.match(/[^A-Za-z0-9_-]/) ?
+ 'xn--' + punycode.encode(s) : s);
+ }
+ out.hostname = newOut.join('.');
+
+ out.host = (out.hostname || '') +
+ ((out.port) ? ':' + out.port : '');
+ out.href += out.host;
+ }
+
+ // now rest is set to the post-host stuff.
+ // chop off any delim chars.
+ if (!unsafeProtocol[lowerProto]) {
+
+ // First, make 100% sure that any "autoEscape" chars get
+ // escaped, even if encodeURIComponent doesn't think they
+ // need to be.
+ for (var i = 0, l = autoEscape.length; i < l; i++) {
+ var ae = autoEscape[i];
+ var esc = encodeURIComponent(ae);
+ if (esc === ae) {
+ esc = escape(ae);
+ }
+ rest = rest.split(ae).join(esc);
+ }
+
+ // Now make sure that delims never appear in a url.
+ var chop = rest.length;
+ for (var i = 0, l = delims.length; i < l; i++) {
+ var c = arrayIndexOf(rest, delims[i]);
+ if (c !== -1) {
+ chop = Math.min(c, chop);
+ }
+ }
+ rest = rest.substr(0, chop);
+ }
+
+
+ // chop off from the tail first.
+ var hash = arrayIndexOf(rest, '#');
+ if (hash !== -1) {
+ // got a fragment string.
+ out.hash = rest.substr(hash);
+ rest = rest.slice(0, hash);
+ }
+ var qm = arrayIndexOf(rest, '?');
+ if (qm !== -1) {
+ out.search = rest.substr(qm);
+ out.query = rest.substr(qm + 1);
+ if (parseQueryString) {
+ out.query = querystring.parse(out.query);
+ }
+ rest = rest.slice(0, qm);
+ } else if (parseQueryString) {
+ // no query string, but parseQueryString still requested
+ out.search = '';
+ out.query = {};
+ }
+ if (rest) out.pathname = rest;
+ if (slashedProtocol[proto] &&
+ out.hostname && !out.pathname) {
+ out.pathname = '/';
+ }
+
+ //to support http.request
+ if (out.pathname || out.search) {
+ out.path = (out.pathname ? out.pathname : '') +
+ (out.search ? out.search : '');
+ }
+
+ // finally, reconstruct the href based on what has been validated.
+ out.href = urlFormat(out);
+ return out;
+}
+
+// format a parsed object into a url string
+function urlFormat(obj) {
+ // ensure it's an object, and not a string url.
+ // If it's an obj, this is a no-op.
+ // this way, you can call url_format() on strings
+ // to clean up potentially wonky urls.
+ if (typeof(obj) === 'string') obj = urlParse(obj);
+
+ var auth = obj.auth || '';
+ if (auth) {
+ auth = auth.split('@').join('%40');
+ for (var i = 0, l = nonAuthChars.length; i < l; i++) {
+ var nAC = nonAuthChars[i];
+ auth = auth.split(nAC).join(encodeURIComponent(nAC));
+ }
+ auth += '@';
+ }
+
+ var protocol = obj.protocol || '',
+ host = (obj.host !== undefined) ? auth + obj.host :
+ obj.hostname !== undefined ? (
+ auth + obj.hostname +
+ (obj.port ? ':' + obj.port : '')
+ ) :
+ false,
+ pathname = obj.pathname || '',
+ query = obj.query &&
+ ((typeof obj.query === 'object' &&
+ objectKeys(obj.query).length) ?
+ querystring.stringify(obj.query) :
+ '') || '',
+ search = obj.search || (query && ('?' + query)) || '',
+ hash = obj.hash || '';
+
+ if (protocol && protocol.substr(-1) !== ':') protocol += ':';
+
+ // only the slashedProtocols get the //. Not mailto:, xmpp:, etc.
+ // unless they had them to begin with.
+ if (obj.slashes ||
+ (!protocol || slashedProtocol[protocol]) && host !== false) {
+ host = '//' + (host || '');
+ if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;
+ } else if (!host) {
+ host = '';
+ }
+
+ if (hash && hash.charAt(0) !== '#') hash = '#' + hash;
+ if (search && search.charAt(0) !== '?') search = '?' + search;
+
+ return protocol + host + pathname + search + hash;
+}
+
+function urlResolve(source, relative) {
+ return urlFormat(urlResolveObject(source, relative));
+}
+
+function urlResolveObject(source, relative) {
+ if (!source) return relative;
+
+ source = urlParse(urlFormat(source), false, true);
+ relative = urlParse(urlFormat(relative), false, true);
+
+ // hash is always overridden, no matter what.
+ source.hash = relative.hash;
+
+ if (relative.href === '') {
+ source.href = urlFormat(source);
+ return source;
+ }
+
+ // hrefs like //foo/bar always cut to the protocol.
+ if (relative.slashes && !relative.protocol) {
+ relative.protocol = source.protocol;
+ //urlParse appends trailing / to urls like http://www.example.com
+ if (slashedProtocol[relative.protocol] &&
+ relative.hostname && !relative.pathname) {
+ relative.path = relative.pathname = '/';
+ }
+ relative.href = urlFormat(relative);
+ return relative;
+ }
+
+ if (relative.protocol && relative.protocol !== source.protocol) {
+ // if it's a known url protocol, then changing
+ // the protocol does weird things
+ // first, if it's not file:, then we MUST have a host,
+ // and if there was a path
+ // to begin with, then we MUST have a path.
+ // if it is file:, then the host is dropped,
+ // because that's known to be hostless.
+ // anything else is assumed to be absolute.
+ if (!slashedProtocol[relative.protocol]) {
+ relative.href = urlFormat(relative);
+ return relative;
+ }
+ source.protocol = relative.protocol;
+ if (!relative.host && !hostlessProtocol[relative.protocol]) {
+ var relPath = (relative.pathname || '').split('/');
+ while (relPath.length && !(relative.host = relPath.shift()));
+ if (!relative.host) relative.host = '';
+ if (!relative.hostname) relative.hostname = '';
+ if (relPath[0] !== '') relPath.unshift('');
+ if (relPath.length < 2) relPath.unshift('');
+ relative.pathname = relPath.join('/');
+ }
+ source.pathname = relative.pathname;
+ source.search = relative.search;
+ source.query = relative.query;
+ source.host = relative.host || '';
+ source.auth = relative.auth;
+ source.hostname = relative.hostname || relative.host;
+ source.port = relative.port;
+ //to support http.request
+ if (source.pathname !== undefined || source.search !== undefined) {
+ source.path = (source.pathname ? source.pathname : '') +
+ (source.search ? source.search : '');
+ }
+ source.slashes = source.slashes || relative.slashes;
+ source.href = urlFormat(source);
+ return source;
+ }
+
+ var isSourceAbs = (source.pathname && source.pathname.charAt(0) === '/'),
+ isRelAbs = (
+ relative.host !== undefined ||
+ relative.pathname && relative.pathname.charAt(0) === '/'
+ ),
+ mustEndAbs = (isRelAbs || isSourceAbs ||
+ (source.host && relative.pathname)),
+ removeAllDots = mustEndAbs,
+ srcPath = source.pathname && source.pathname.split('/') || [],
+ relPath = relative.pathname && relative.pathname.split('/') || [],
+ psychotic = source.protocol &&
+ !slashedProtocol[source.protocol];
+
+ // if the url is a non-slashed url, then relative
+ // links like ../.. should be able
+ // to crawl up to the hostname, as well. This is strange.
+ // source.protocol has already been set by now.
+ // Later on, put the first path part into the host field.
+ if (psychotic) {
+
+ delete source.hostname;
+ delete source.port;
+ if (source.host) {
+ if (srcPath[0] === '') srcPath[0] = source.host;
+ else srcPath.unshift(source.host);
+ }
+ delete source.host;
+ if (relative.protocol) {
+ delete relative.hostname;
+ delete relative.port;
+ if (relative.host) {
+ if (relPath[0] === '') relPath[0] = relative.host;
+ else relPath.unshift(relative.host);
+ }
+ delete relative.host;
+ }
+ mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');
+ }
+
+ if (isRelAbs) {
+ // it's absolute.
+ source.host = (relative.host || relative.host === '') ?
+ relative.host : source.host;
+ source.hostname = (relative.hostname || relative.hostname === '') ?
+ relative.hostname : source.hostname;
+ source.search = relative.search;
+ source.query = relative.query;
+ srcPath = relPath;
+ // fall through to the dot-handling below.
+ } else if (relPath.length) {
+ // it's relative
+ // throw away the existing file, and take the new path instead.
+ if (!srcPath) srcPath = [];
+ srcPath.pop();
+ srcPath = srcPath.concat(relPath);
+ source.search = relative.search;
+ source.query = relative.query;
+ } else if ('search' in relative) {
+ // just pull out the search.
+ // like href='?foo'.
+ // Put this after the other two cases because it simplifies the booleans
+ if (psychotic) {
+ source.hostname = source.host = srcPath.shift();
+ //occationaly the auth can get stuck only in host
+ //this especialy happens in cases like
+ //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
+ var authInHost = source.host && arrayIndexOf(source.host, '@') > 0 ?
+ source.host.split('@') : false;
+ if (authInHost) {
+ source.auth = authInHost.shift();
+ source.host = source.hostname = authInHost.shift();
+ }
+ }
+ source.search = relative.search;
+ source.query = relative.query;
+ //to support http.request
+ if (source.pathname !== undefined || source.search !== undefined) {
+ source.path = (source.pathname ? source.pathname : '') +
+ (source.search ? source.search : '');
+ }
+ source.href = urlFormat(source);
+ return source;
+ }
+ if (!srcPath.length) {
+ // no path at all. easy.
+ // we've already handled the other stuff above.
+ delete source.pathname;
+ //to support http.request
+ if (!source.search) {
+ source.path = '/' + source.search;
+ } else {
+ delete source.path;
+ }
+ source.href = urlFormat(source);
+ return source;
+ }
+ // if a url ENDs in . or .., then it must get a trailing slash.
+ // however, if it ends in anything else non-slashy,
+ // then it must NOT get a trailing slash.
+ var last = srcPath.slice(-1)[0];
+ var hasTrailingSlash = (
+ (source.host || relative.host) && (last === '.' || last === '..') ||
+ last === '');
+
+ // strip single dots, resolve double dots to parent dir
+ // if the path tries to go above the root, `up` ends up > 0
+ var up = 0;
+ for (var i = srcPath.length; i >= 0; i--) {
+ last = srcPath[i];
+ if (last == '.') {
+ srcPath.splice(i, 1);
+ } else if (last === '..') {
+ srcPath.splice(i, 1);
+ up++;
+ } else if (up) {
+ srcPath.splice(i, 1);
+ up--;
+ }
+ }
+
+ // if the path is allowed to go above the root, restore leading ..s
+ if (!mustEndAbs && !removeAllDots) {
+ for (; up--; up) {
+ srcPath.unshift('..');
+ }
+ }
+
+ if (mustEndAbs && srcPath[0] !== '' &&
+ (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {
+ srcPath.unshift('');
+ }
+
+ if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {
+ srcPath.push('');
+ }
+
+ var isAbsolute = srcPath[0] === '' ||
+ (srcPath[0] && srcPath[0].charAt(0) === '/');
+
+ // put the host back
+ if (psychotic) {
+ source.hostname = source.host = isAbsolute ? '' :
+ srcPath.length ? srcPath.shift() : '';
+ //occationaly the auth can get stuck only in host
+ //this especialy happens in cases like
+ //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
+ var authInHost = source.host && arrayIndexOf(source.host, '@') > 0 ?
+ source.host.split('@') : false;
+ if (authInHost) {
+ source.auth = authInHost.shift();
+ source.host = source.hostname = authInHost.shift();
+ }
+ }
+
+ mustEndAbs = mustEndAbs || (source.host && srcPath.length);
+
+ if (mustEndAbs && !isAbsolute) {
+ srcPath.unshift('');
+ }
+
+ source.pathname = srcPath.join('/');
+ //to support request.http
+ if (source.pathname !== undefined || source.search !== undefined) {
+ source.path = (source.pathname ? source.pathname : '') +
+ (source.search ? source.search : '');
+ }
+ source.auth = relative.auth || source.auth;
+ source.slashes = source.slashes || relative.slashes;
+ source.href = urlFormat(source);
+ return source;
+}
+
+function parseHost(host) {
+ var out = {};
+ var port = portPattern.exec(host);
+ if (port) {
+ port = port[0];
+ out.port = port.substr(1);
+ host = host.substr(0, host.length - port.length);
+ }
+ if (host) out.hostname = host;
+ return out;
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/util.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/util.js
new file mode 100644
index 000000000..e7bdad405
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/builtins/util.js
@@ -0,0 +1,312 @@
+var events = require('events');
+
+exports.print = function () {};
+exports.puts = function () {};
+exports.debug = function() {};
+
+exports.inspect = function(obj, showHidden, depth, colors) {
+ var seen = [];
+
+ var stylize = function(str, styleType) {
+ // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
+ var styles =
+ { 'bold' : [1, 22],
+ 'italic' : [3, 23],
+ 'underline' : [4, 24],
+ 'inverse' : [7, 27],
+ 'white' : [37, 39],
+ 'grey' : [90, 39],
+ 'black' : [30, 39],
+ 'blue' : [34, 39],
+ 'cyan' : [36, 39],
+ 'green' : [32, 39],
+ 'magenta' : [35, 39],
+ 'red' : [31, 39],
+ 'yellow' : [33, 39] };
+
+ var style =
+ { 'special': 'cyan',
+ 'number': 'blue',
+ 'boolean': 'yellow',
+ 'undefined': 'grey',
+ 'null': 'bold',
+ 'string': 'green',
+ 'date': 'magenta',
+ // "name": intentionally not styling
+ 'regexp': 'red' }[styleType];
+
+ if (style) {
+ return '\033[' + styles[style][0] + 'm' + str +
+ '\033[' + styles[style][1] + 'm';
+ } else {
+ return str;
+ }
+ };
+ if (! colors) {
+ stylize = function(str, styleType) { 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 = Object_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 = keys.map(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 (visible_keys.indexOf(key) < 0) {
+ name = '[' + key + ']';
+ }
+ if (!str) {
+ if (seen.indexOf(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 = str.split('\n').map(function(line) {
+ return ' ' + line;
+ }).join('\n').substr(2);
+ } else {
+ str = '\n' + str.split('\n').map(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 = output.reduce(function(prev, cur) {
+ numLinesEst++;
+ if (cur.indexOf('\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 ar instanceof Array ||
+ Array.isArray(ar) ||
+ (ar && ar !== Object.prototype && isArray(ar.__proto__));
+}
+
+
+function isRegExp(re) {
+ return re instanceof RegExp ||
+ (typeof re === 'object' && Object.prototype.toString.call(re) === '[object RegExp]');
+}
+
+
+function isDate(d) {
+ if (d instanceof Date) return true;
+ if (typeof d !== 'object') return false;
+ var properties = Date.prototype && Object_getOwnPropertyNames(Date.prototype);
+ var proto = d.__proto__ && Object_getOwnPropertyNames(d.__proto__);
+ return JSON.stringify(proto) === JSON.stringify(properties);
+}
+
+function pad(n) {
+ return n < 10 ? '0' + n.toString(10) : n.toString(10);
+}
+
+var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
+ 'Oct', 'Nov', 'Dec'];
+
+// 26 Feb 16:19:34
+function timestamp() {
+ var d = new Date();
+ var time = [pad(d.getHours()),
+ pad(d.getMinutes()),
+ pad(d.getSeconds())].join(':');
+ return [d.getDate(), months[d.getMonth()], time].join(' ');
+}
+
+exports.log = function (msg) {};
+
+exports.pump = null;
+
+var Object_keys = Object.keys || function (obj) {
+ var res = [];
+ for (var key in obj) res.push(key);
+ return res;
+};
+
+var Object_getOwnPropertyNames = Object.getOwnPropertyNames || function (obj) {
+ var res = [];
+ for (var key in obj) {
+ if (Object.hasOwnProperty.call(obj, key)) res.push(key);
+ }
+ return res;
+};
+
+var Object_create = Object.create || function (prototype, properties) {
+ // from es5-shim
+ var object;
+ if (prototype === null) {
+ object = { '__proto__' : null };
+ }
+ else {
+ if (typeof prototype !== 'object') {
+ throw new TypeError(
+ 'typeof prototype[' + (typeof prototype) + '] != \'object\''
+ );
+ }
+ var Type = function () {};
+ Type.prototype = prototype;
+ object = new Type();
+ object.__proto__ = prototype;
+ }
+ if (typeof properties !== 'undefined' && Object.defineProperties) {
+ Object.defineProperties(object, properties);
+ }
+ return object;
+};
+
+exports.inherits = function(ctor, superCtor) {
+ ctor.super_ = superCtor;
+ ctor.prototype = Object_create(superCtor.prototype, {
+ constructor: {
+ value: ctor,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/doc/methods.markdown b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/doc/methods.markdown
new file mode 100644
index 000000000..d5423e34a
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/doc/methods.markdown
@@ -0,0 +1,177 @@
+methods
+=======
+
+This section documents the browserify api.
+
+````javascript
+var browserify = require('browserify');
+````
+
+var b = browserify(opts={})
+---------------------------
+
+Return a new bundle object.
+
+`opts` may also contain these fields:
+
+* watch - set watches on files, see below
+* cache - turn on caching for AST traversals, see below
+* debug - turn on source mapping for debugging with `//@ sourceURL=...`
+in browsers that support it
+* exports - an array of the core items to export to the namespace. Available
+items: 'require', 'process'
+
+If `opts` is a string, it is interpreted as a file to call `.addEntry()` with.
+
+### watch :: Boolean or Object
+
+Set watches on files and automatically rebundle when a file changes.
+
+This option defaults to false. If `opts.watch` is set to true, default watch
+arguments are assumed or you can pass in an object to pass along as the second
+parameter to `fs.watchFile()`.
+
+### cache :: Boolean or String
+
+If `cache` is a boolean, turn on caching at
+`$HOME/.config/browserify/cache.json`.
+
+If `cache` is a string, turn on caching at the filename specified by `cache`.
+
+### bundle events
+
+`b` bundles will also emit events.
+
+#### 'syntaxError', err
+
+This event gets emitted when there is a syntax error somewhere in the build
+process. If you don't listen for this event, the error will be printed to
+stderr.
+
+#### 'bundle'
+
+In watch mode, this event is emitted when a new bundle has been generated.
+
+b.bundle()
+----------
+
+Return the bundled source as a string.
+
+By default, `require` is not exported to the environment if there are entry
+files in the bundle but you can override that with `opts.exports`.
+
+`process` is only exported to the environment when `opts.exports` contains the
+string `'process'`.
+
+b.require(file)
+---------------
+
+Require a file or files for inclusion in the bundle.
+
+If `file` is an array, require each element in it.
+
+If `file` is a non-array object, map an alias to a package name.
+For instance to be able to map `require('jquery')` to the jquery-browserify
+package, you can do:
+
+````javascript
+b.require({ jquery : 'jquery-browserify' })
+````
+
+and the same thing in middleware-form:
+
+````javascript
+browserify({ require : { jquery : 'jquery-browserify' } })
+````
+
+To mix alias objects with regular requires you could do:
+
+````javascript
+browserify({ require : [ 'seq', { jquery : 'jquery-browserify' }, 'traverse' ])
+````
+
+In practice you won't need to `b.require()` very many files since all the
+`require()`s are read from each file that you require and automatically
+included.
+
+b.ignore(file)
+--------------
+
+Omit a file or files from being included by the AST walk to hunt down
+`require()` statements.
+
+b.addEntry(file)
+----------------
+
+Append a file to the end of the bundle and execute it without having to
+`require()` it.
+
+Specifying an entry point will let you `require()` other modules without having
+to load the entry point in a `<script>` tag yourself.
+
+If entry is an Array, concatenate these files together and append to the end of
+the bundle.
+
+b.filter(fn)
+------------
+
+Transform the source using the filter function `fn(src)`. The return value of
+`fn` should be the new source.
+
+b.register(ext, fn)
+-------------------
+
+Register a handler to wrap extensions.
+
+Wrap every file matching the extension `ext` with the function `fn`.
+
+For every `file` included into the bundle `fn` gets called for matching file
+types as `fn.call(b, body, file)` for the bundle instance `b` and the file
+content string `body`. `fn` should return the new wrapped contents.
+
+If `ext` is unspecified, execute the wrapper for every file.
+
+If `ext` is 'post', execute the wrapper on the entire bundle.
+
+If `ext` is 'pre', call the wrapper function with the bundle object before the
+source is generated.
+
+If `ext` is an object, pull the extension from `ext.extension` and the wrapper
+function `fn` from `ext.wrapper`. This makes it easy to write plugins like
+[fileify](https://github.com/substack/node-fileify).
+
+Coffee script support is just implemented internally as a `.register()`
+extension:
+
+````javascript
+b.register('.coffee', function (body) {
+ return coffee.compile(body);
+});
+````
+
+b.use(fn)
+---------
+
+Use a middleware plugin, `fn`. `fn` is called with the instance object `b`.
+
+b.prepend(content)
+------------------
+
+Prepend unwrapped content to the beginning of the bundle.
+
+b.append(content)
+-----------------
+
+Append unwrapped content to the end of the bundle.
+
+b.alias(to, from)
+-----------------
+
+Alias a package name from another package name.
+
+b.modified
+----------
+
+Contains a Date object with the time the bundle was last modified. This field is
+useful in conjunction with the `watch` field described in the `browserify()` to
+generate unique `<script>` `src` values to force script reloading.
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/doc/recipes.markdown b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/doc/recipes.markdown
new file mode 100644
index 000000000..b7da722b1
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/doc/recipes.markdown
@@ -0,0 +1,62 @@
+recipes
+=======
+
+Here are some recipe-style examples for getting started.
+
+use an npm module in the browser
+================================
+
+First install a module:
+
+```
+npm install traverse
+```
+
+Then write an `entry.js`:
+
+````javascript
+var traverse = require('traverse');
+var obj = traverse({ a : 3, b : [ 4, 5 ] }).map(function (x) {
+ if (typeof x === 'number') this.update(x * 100)
+});
+console.dir(obj);
+````
+
+now bundle it!
+
+```
+$ browserify entry.js -o bundle.js
+```
+
+then put it in your html
+
+``` html
+<script src="bundle.js"></script>
+```
+
+and the entry.js will just run and `require('traverse')` will just work™.
+
+convert a node module into a browser require-able standalone file
+-----------------------------------------------------------------
+
+Install the `traverse` package into `./node_modules`:
+
+```
+npm install traverse
+```
+
+Bundle everything up with browserify:
+
+```
+$ npm install -g browserify
+$ browserify -r traverse -o bundle.js
+```
+
+Look at the files! There is a new one: `bundle.js`. Now go into HTML land:
+
+``` html
+<script src="bundle.js"></script>
+<script>
+ var traverse = require('traverse');
+</script>
+```
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/browserify.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/browserify.js
new file mode 100644
index 000000000..fd495dac2
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/browserify.js
@@ -0,0 +1,368 @@
+var require = function (file, cwd) {
+ var resolved = require.resolve(file, cwd || '/');
+ var mod = require.modules[resolved];
+ if (!mod) throw new Error(
+ 'Failed to resolve module ' + file + ', tried ' + resolved
+ );
+ var res = mod._cached ? mod._cached : mod();
+ return res;
+}
+
+require.paths = [];
+require.modules = {};
+require.extensions = [".js",".coffee"];
+
+require._core = {
+ 'assert': true,
+ 'events': true,
+ 'fs': true,
+ 'path': true,
+ 'vm': true
+};
+
+require.resolve = (function () {
+ return function (x, cwd) {
+ if (!cwd) cwd = '/';
+
+ if (require._core[x]) return x;
+ var path = require.modules.path();
+ cwd = path.resolve('/', cwd);
+ var y = cwd || '/';
+
+ if (x.match(/^(?:\.\.?\/|\/)/)) {
+ var m = loadAsFileSync(path.resolve(y, x))
+ || loadAsDirectorySync(path.resolve(y, x));
+ if (m) return m;
+ }
+
+ var n = loadNodeModulesSync(x, y);
+ if (n) return n;
+
+ throw new Error("Cannot find module '" + x + "'");
+
+ function loadAsFileSync (x) {
+ if (require.modules[x]) {
+ return x;
+ }
+
+ for (var i = 0; i < require.extensions.length; i++) {
+ var ext = require.extensions[i];
+ if (require.modules[x + ext]) return x + ext;
+ }
+ }
+
+ function loadAsDirectorySync (x) {
+ x = x.replace(/\/+$/, '');
+ var pkgfile = x + '/package.json';
+ if (require.modules[pkgfile]) {
+ var pkg = require.modules[pkgfile]();
+ var b = pkg.browserify;
+ if (typeof b === 'object' && b.main) {
+ var m = loadAsFileSync(path.resolve(x, b.main));
+ if (m) return m;
+ }
+ else if (typeof b === 'string') {
+ var m = loadAsFileSync(path.resolve(x, b));
+ if (m) return m;
+ }
+ else if (pkg.main) {
+ var m = loadAsFileSync(path.resolve(x, pkg.main));
+ if (m) return m;
+ }
+ }
+
+ return loadAsFileSync(x + '/index');
+ }
+
+ function loadNodeModulesSync (x, start) {
+ var dirs = nodeModulesPathsSync(start);
+ for (var i = 0; i < dirs.length; i++) {
+ var dir = dirs[i];
+ var m = loadAsFileSync(dir + '/' + x);
+ if (m) return m;
+ var n = loadAsDirectorySync(dir + '/' + x);
+ if (n) return n;
+ }
+
+ var m = loadAsFileSync(x);
+ if (m) return m;
+ }
+
+ function nodeModulesPathsSync (start) {
+ var parts;
+ if (start === '/') parts = [ '' ];
+ else parts = path.normalize(start).split('/');
+
+ var dirs = [];
+ for (var i = parts.length - 1; i >= 0; i--) {
+ if (parts[i] === 'node_modules') continue;
+ var dir = parts.slice(0, i + 1).join('/') + '/node_modules';
+ dirs.push(dir);
+ }
+
+ return dirs;
+ }
+ };
+})();
+
+require.alias = function (from, to) {
+ var path = require.modules.path();
+ var res = null;
+ try {
+ res = require.resolve(from + '/package.json', '/');
+ }
+ catch (err) {
+ res = require.resolve(from, '/');
+ }
+ var basedir = path.dirname(res);
+
+ var keys = (Object.keys || function (obj) {
+ var res = [];
+ for (var key in obj) res.push(key)
+ return res;
+ })(require.modules);
+
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ if (key.slice(0, basedir.length + 1) === basedir + '/') {
+ var f = key.slice(basedir.length);
+ require.modules[to + f] = require.modules[basedir + f];
+ }
+ else if (key === basedir) {
+ require.modules[to] = require.modules[basedir];
+ }
+ }
+};
+
+require.define = function (filename, fn) {
+ var dirname = require._core[filename]
+ ? ''
+ : require.modules.path().dirname(filename)
+ ;
+
+ var require_ = function (file) {
+ return require(file, dirname)
+ };
+ require_.resolve = function (name) {
+ return require.resolve(name, dirname);
+ };
+ require_.modules = require.modules;
+ require_.define = require.define;
+ var module_ = { exports : {} };
+
+ require.modules[filename] = function () {
+ require.modules[filename]._cached = module_.exports;
+ fn.call(
+ module_.exports,
+ require_,
+ module_,
+ module_.exports,
+ dirname,
+ filename
+ );
+ require.modules[filename]._cached = module_.exports;
+ return module_.exports;
+ };
+};
+
+if (typeof process === 'undefined') process = {};
+
+if (!process.nextTick) process.nextTick = (function () {
+ var queue = [];
+ var canPost = typeof window !== 'undefined'
+ && window.postMessage && window.addEventListener
+ ;
+
+ if (canPost) {
+ window.addEventListener('message', function (ev) {
+ if (ev.source === window && ev.data === 'browserify-tick') {
+ ev.stopPropagation();
+ if (queue.length > 0) {
+ var fn = queue.shift();
+ fn();
+ }
+ }
+ }, true);
+ }
+
+ return function (fn) {
+ if (canPost) {
+ queue.push(fn);
+ window.postMessage('browserify-tick', '*');
+ }
+ else setTimeout(fn, 0);
+ };
+})();
+
+if (!process.title) process.title = 'browser';
+
+if (!process.binding) process.binding = function (name) {
+ if (name === 'evals') return require('vm')
+ else throw new Error('No such module')
+};
+
+if (!process.cwd) process.cwd = function () { return '.' };
+
+require.define("path", function (require, module, exports, __dirname, __filename) {
+function filter (xs, fn) {
+ var res = [];
+ for (var i = 0; i < xs.length; i++) {
+ if (fn(xs[i], i, xs)) res.push(xs[i]);
+ }
+ return res;
+}
+
+// resolves . and .. elements in a path array with directory names there
+// must be no slashes, empty elements, or device names (c:\) in the array
+// (so also no leading and trailing slashes - it does not distinguish
+// relative and absolute paths)
+function normalizeArray(parts, allowAboveRoot) {
+ // if the path tries to go above the root, `up` ends up > 0
+ var up = 0;
+ for (var i = parts.length; i >= 0; i--) {
+ var last = parts[i];
+ if (last == '.') {
+ parts.splice(i, 1);
+ } else if (last === '..') {
+ parts.splice(i, 1);
+ up++;
+ } else if (up) {
+ parts.splice(i, 1);
+ up--;
+ }
+ }
+
+ // if the path is allowed to go above the root, restore leading ..s
+ if (allowAboveRoot) {
+ for (; up--; up) {
+ parts.unshift('..');
+ }
+ }
+
+ return parts;
+}
+
+// Regex to split a filename into [*, dir, basename, ext]
+// posix version
+var splitPathRe = /^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/;
+
+// path.resolve([from ...], to)
+// posix version
+exports.resolve = function() {
+var resolvedPath = '',
+ resolvedAbsolute = false;
+
+for (var i = arguments.length; i >= -1 && !resolvedAbsolute; i--) {
+ var path = (i >= 0)
+ ? arguments[i]
+ : process.cwd();
+
+ // Skip empty and invalid entries
+ if (typeof path !== 'string' || !path) {
+ continue;
+ }
+
+ resolvedPath = path + '/' + resolvedPath;
+ resolvedAbsolute = path.charAt(0) === '/';
+}
+
+// At this point the path should be resolved to a full absolute path, but
+// handle relative paths to be safe (might happen when process.cwd() fails)
+
+// Normalize the path
+resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
+ return !!p;
+ }), !resolvedAbsolute).join('/');
+
+ return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
+};
+
+// path.normalize(path)
+// posix version
+exports.normalize = function(path) {
+var isAbsolute = path.charAt(0) === '/',
+ trailingSlash = path.slice(-1) === '/';
+
+// Normalize the path
+path = normalizeArray(filter(path.split('/'), function(p) {
+ return !!p;
+ }), !isAbsolute).join('/');
+
+ if (!path && !isAbsolute) {
+ path = '.';
+ }
+ if (path && trailingSlash) {
+ path += '/';
+ }
+
+ return (isAbsolute ? '/' : '') + path;
+};
+
+
+// posix version
+exports.join = function() {
+ var paths = Array.prototype.slice.call(arguments, 0);
+ return exports.normalize(filter(paths, function(p, index) {
+ return p && typeof p === 'string';
+ }).join('/'));
+};
+
+
+exports.dirname = function(path) {
+ var dir = splitPathRe.exec(path)[1] || '';
+ var isWindows = false;
+ if (!dir) {
+ // No dirname
+ return '.';
+ } else if (dir.length === 1 ||
+ (isWindows && dir.length <= 3 && dir.charAt(1) === ':')) {
+ // It is just a slash or a drive letter with a slash
+ return dir;
+ } else {
+ // It is a full dirname, strip trailing slash
+ return dir.substring(0, dir.length - 1);
+ }
+};
+
+
+exports.basename = function(path, ext) {
+ var f = splitPathRe.exec(path)[2] || '';
+ // TODO: make this comparison case-insensitive on windows?
+ if (ext && f.substr(-1 * ext.length) === ext) {
+ f = f.substr(0, f.length - ext.length);
+ }
+ return f;
+};
+
+
+exports.extname = function(path) {
+ return splitPathRe.exec(path)[3] || '';
+};
+
+});
+
+require.define("/foo.js", function (require, module, exports, __dirname, __filename) {
+var bar = require('./bar');
+
+module.exports = function (x) {
+ return x * bar.coeff(x) + (x * 3 - 2)
+};
+
+});
+
+require.define("/bar.js", function (require, module, exports, __dirname, __filename) {
+exports.coeff = function (x) {
+ return Math.log(x) / Math.log(2) + 1;
+};
+
+});
+
+require.define("/entry.js", function (require, module, exports, __dirname, __filename) {
+ var foo = require('./foo');
+
+window.onload = function () {
+ document.getElementById('result').innerHTML = foo(100);
+};
+
+});
+require("/entry.js");
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/build.sh b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/build.sh
new file mode 100755
index 000000000..17c69ac4c
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/build.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+browserify js/entry.js -v -o browserify.js
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/index.html b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/index.html
new file mode 100644
index 000000000..243ac26d6
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/index.html
@@ -0,0 +1,9 @@
+<html>
+<head>
+ <script type="text/javascript" src="/browserify.js"></script>
+</head>
+<body>
+ foo =
+ <span style='font-family: monospace' id="result"></span>
+</body>
+</html>
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/js/bar.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/js/bar.js
new file mode 100644
index 000000000..7d6fd9ca2
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/js/bar.js
@@ -0,0 +1,3 @@
+exports.coeff = function (x) {
+ return Math.log(x) / Math.log(2) + 1;
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/js/entry.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/js/entry.js
new file mode 100644
index 000000000..adf3b4ba1
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/js/entry.js
@@ -0,0 +1,5 @@
+var foo = require('./foo');
+
+window.onload = function () {
+ document.getElementById('result').innerHTML = foo(100);
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/js/foo.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/js/foo.js
new file mode 100644
index 000000000..ca0bc13ef
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/js/foo.js
@@ -0,0 +1,5 @@
+var bar = require('./bar');
+
+module.exports = function (x) {
+ return x * bar.coeff(x) + (x * 3 - 2)
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/server.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/server.js
new file mode 100755
index 000000000..eea51eeeb
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-build/server.js
@@ -0,0 +1,9 @@
+#!/usr/bin/env node
+
+var connect = require('connect');
+var server = connect.createServer();
+
+server.use(connect.static(__dirname));
+server.listen(8080);
+console.log('Listening on :8080');
+console.log('Make sure to run ./build.sh to generate browserify.js');
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-middleware/index.html b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-middleware/index.html
new file mode 100644
index 000000000..243ac26d6
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-middleware/index.html
@@ -0,0 +1,9 @@
+<html>
+<head>
+ <script type="text/javascript" src="/browserify.js"></script>
+</head>
+<body>
+ foo =
+ <span style='font-family: monospace' id="result"></span>
+</body>
+</html>
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-middleware/js/bar.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-middleware/js/bar.js
new file mode 100644
index 000000000..7d6fd9ca2
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-middleware/js/bar.js
@@ -0,0 +1,3 @@
+exports.coeff = function (x) {
+ return Math.log(x) / Math.log(2) + 1;
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-middleware/js/entry.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-middleware/js/entry.js
new file mode 100644
index 000000000..adf3b4ba1
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-middleware/js/entry.js
@@ -0,0 +1,5 @@
+var foo = require('./foo');
+
+window.onload = function () {
+ document.getElementById('result').innerHTML = foo(100);
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-middleware/js/foo.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-middleware/js/foo.js
new file mode 100644
index 000000000..ca0bc13ef
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-middleware/js/foo.js
@@ -0,0 +1,5 @@
+var bar = require('./bar');
+
+module.exports = function (x) {
+ return x * bar.coeff(x) + (x * 3 - 2)
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-middleware/server.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-middleware/server.js
new file mode 100644
index 000000000..eb2b84b89
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/simple-middleware/server.js
@@ -0,0 +1,11 @@
+var connect = require('connect');
+var server = connect.createServer();
+server.use(connect.static(__dirname));
+
+var browserify = require('browserify');
+var bundle = browserify(__dirname + '/js/entry.js');
+server.use(bundle);
+
+var port = parseInt(process.argv[2] || 8080, 10);
+server.listen(port);
+console.log('Listening on :' + port);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/using-http/bundle.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/using-http/bundle.js
new file mode 100644
index 000000000..08b05bf6d
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/using-http/bundle.js
@@ -0,0 +1,813 @@
+var require = function (file, cwd) {
+ var resolved = require.resolve(file, cwd || '/');
+ var mod = require.modules[resolved];
+ if (!mod) throw new Error(
+ 'Failed to resolve module ' + file + ', tried ' + resolved
+ );
+ var res = mod._cached ? mod._cached : mod();
+ return res;
+}
+
+require.paths = [];
+require.modules = {};
+require.extensions = [".js",".coffee"];
+
+require._core = {
+ 'assert': true,
+ 'events': true,
+ 'fs': true,
+ 'path': true,
+ 'vm': true
+};
+
+require.resolve = (function () {
+ return function (x, cwd) {
+ if (!cwd) cwd = '/';
+
+ if (require._core[x]) return x;
+ var path = require.modules.path();
+ cwd = path.resolve('/', cwd);
+ var y = cwd || '/';
+
+ if (x.match(/^(?:\.\.?\/|\/)/)) {
+ var m = loadAsFileSync(path.resolve(y, x))
+ || loadAsDirectorySync(path.resolve(y, x));
+ if (m) return m;
+ }
+
+ var n = loadNodeModulesSync(x, y);
+ if (n) return n;
+
+ throw new Error("Cannot find module '" + x + "'");
+
+ function loadAsFileSync (x) {
+ if (require.modules[x]) {
+ return x;
+ }
+
+ for (var i = 0; i < require.extensions.length; i++) {
+ var ext = require.extensions[i];
+ if (require.modules[x + ext]) return x + ext;
+ }
+ }
+
+ function loadAsDirectorySync (x) {
+ x = x.replace(/\/+$/, '');
+ var pkgfile = x + '/package.json';
+ if (require.modules[pkgfile]) {
+ var pkg = require.modules[pkgfile]();
+ var b = pkg.browserify;
+ if (typeof b === 'object' && b.main) {
+ var m = loadAsFileSync(path.resolve(x, b.main));
+ if (m) return m;
+ }
+ else if (typeof b === 'string') {
+ var m = loadAsFileSync(path.resolve(x, b));
+ if (m) return m;
+ }
+ else if (pkg.main) {
+ var m = loadAsFileSync(path.resolve(x, pkg.main));
+ if (m) return m;
+ }
+ }
+
+ return loadAsFileSync(x + '/index');
+ }
+
+ function loadNodeModulesSync (x, start) {
+ var dirs = nodeModulesPathsSync(start);
+ for (var i = 0; i < dirs.length; i++) {
+ var dir = dirs[i];
+ var m = loadAsFileSync(dir + '/' + x);
+ if (m) return m;
+ var n = loadAsDirectorySync(dir + '/' + x);
+ if (n) return n;
+ }
+
+ var m = loadAsFileSync(x);
+ if (m) return m;
+ }
+
+ function nodeModulesPathsSync (start) {
+ var parts;
+ if (start === '/') parts = [ '' ];
+ else parts = path.normalize(start).split('/');
+
+ var dirs = [];
+ for (var i = parts.length - 1; i >= 0; i--) {
+ if (parts[i] === 'node_modules') continue;
+ var dir = parts.slice(0, i + 1).join('/') + '/node_modules';
+ dirs.push(dir);
+ }
+
+ return dirs;
+ }
+ };
+})();
+
+require.alias = function (from, to) {
+ var path = require.modules.path();
+ var res = null;
+ try {
+ res = require.resolve(from + '/package.json', '/');
+ }
+ catch (err) {
+ res = require.resolve(from, '/');
+ }
+ var basedir = path.dirname(res);
+
+ var keys = (Object.keys || function (obj) {
+ var res = [];
+ for (var key in obj) res.push(key)
+ return res;
+ })(require.modules);
+
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ if (key.slice(0, basedir.length + 1) === basedir + '/') {
+ var f = key.slice(basedir.length);
+ require.modules[to + f] = require.modules[basedir + f];
+ }
+ else if (key === basedir) {
+ require.modules[to] = require.modules[basedir];
+ }
+ }
+};
+
+require.define = function (filename, fn) {
+ var dirname = require._core[filename]
+ ? ''
+ : require.modules.path().dirname(filename)
+ ;
+
+ var require_ = function (file) {
+ return require(file, dirname)
+ };
+ require_.resolve = function (name) {
+ return require.resolve(name, dirname);
+ };
+ require_.modules = require.modules;
+ require_.define = require.define;
+ var module_ = { exports : {} };
+
+ require.modules[filename] = function () {
+ require.modules[filename]._cached = module_.exports;
+ fn.call(
+ module_.exports,
+ require_,
+ module_,
+ module_.exports,
+ dirname,
+ filename
+ );
+ require.modules[filename]._cached = module_.exports;
+ return module_.exports;
+ };
+};
+
+if (typeof process === 'undefined') process = {};
+
+if (!process.nextTick) process.nextTick = (function () {
+ var queue = [];
+ var canPost = typeof window !== 'undefined'
+ && window.postMessage && window.addEventListener
+ ;
+
+ if (canPost) {
+ window.addEventListener('message', function (ev) {
+ if (ev.source === window && ev.data === 'browserify-tick') {
+ ev.stopPropagation();
+ if (queue.length > 0) {
+ var fn = queue.shift();
+ fn();
+ }
+ }
+ }, true);
+ }
+
+ return function (fn) {
+ if (canPost) {
+ queue.push(fn);
+ window.postMessage('browserify-tick', '*');
+ }
+ else setTimeout(fn, 0);
+ };
+})();
+
+if (!process.title) process.title = 'browser';
+
+if (!process.binding) process.binding = function (name) {
+ if (name === 'evals') return require('vm')
+ else throw new Error('No such module')
+};
+
+if (!process.cwd) process.cwd = function () { return '.' };
+
+require.define("path", function (require, module, exports, __dirname, __filename) {
+function filter (xs, fn) {
+ var res = [];
+ for (var i = 0; i < xs.length; i++) {
+ if (fn(xs[i], i, xs)) res.push(xs[i]);
+ }
+ return res;
+}
+
+// resolves . and .. elements in a path array with directory names there
+// must be no slashes, empty elements, or device names (c:\) in the array
+// (so also no leading and trailing slashes - it does not distinguish
+// relative and absolute paths)
+function normalizeArray(parts, allowAboveRoot) {
+ // if the path tries to go above the root, `up` ends up > 0
+ var up = 0;
+ for (var i = parts.length; i >= 0; i--) {
+ var last = parts[i];
+ if (last == '.') {
+ parts.splice(i, 1);
+ } else if (last === '..') {
+ parts.splice(i, 1);
+ up++;
+ } else if (up) {
+ parts.splice(i, 1);
+ up--;
+ }
+ }
+
+ // if the path is allowed to go above the root, restore leading ..s
+ if (allowAboveRoot) {
+ for (; up--; up) {
+ parts.unshift('..');
+ }
+ }
+
+ return parts;
+}
+
+// Regex to split a filename into [*, dir, basename, ext]
+// posix version
+var splitPathRe = /^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/;
+
+// path.resolve([from ...], to)
+// posix version
+exports.resolve = function() {
+var resolvedPath = '',
+ resolvedAbsolute = false;
+
+for (var i = arguments.length; i >= -1 && !resolvedAbsolute; i--) {
+ var path = (i >= 0)
+ ? arguments[i]
+ : process.cwd();
+
+ // Skip empty and invalid entries
+ if (typeof path !== 'string' || !path) {
+ continue;
+ }
+
+ resolvedPath = path + '/' + resolvedPath;
+ resolvedAbsolute = path.charAt(0) === '/';
+}
+
+// At this point the path should be resolved to a full absolute path, but
+// handle relative paths to be safe (might happen when process.cwd() fails)
+
+// Normalize the path
+resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
+ return !!p;
+ }), !resolvedAbsolute).join('/');
+
+ return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
+};
+
+// path.normalize(path)
+// posix version
+exports.normalize = function(path) {
+var isAbsolute = path.charAt(0) === '/',
+ trailingSlash = path.slice(-1) === '/';
+
+// Normalize the path
+path = normalizeArray(filter(path.split('/'), function(p) {
+ return !!p;
+ }), !isAbsolute).join('/');
+
+ if (!path && !isAbsolute) {
+ path = '.';
+ }
+ if (path && trailingSlash) {
+ path += '/';
+ }
+
+ return (isAbsolute ? '/' : '') + path;
+};
+
+
+// posix version
+exports.join = function() {
+ var paths = Array.prototype.slice.call(arguments, 0);
+ return exports.normalize(filter(paths, function(p, index) {
+ return p && typeof p === 'string';
+ }).join('/'));
+};
+
+
+exports.dirname = function(path) {
+ var dir = splitPathRe.exec(path)[1] || '';
+ var isWindows = false;
+ if (!dir) {
+ // No dirname
+ return '.';
+ } else if (dir.length === 1 ||
+ (isWindows && dir.length <= 3 && dir.charAt(1) === ':')) {
+ // It is just a slash or a drive letter with a slash
+ return dir;
+ } else {
+ // It is a full dirname, strip trailing slash
+ return dir.substring(0, dir.length - 1);
+ }
+};
+
+
+exports.basename = function(path, ext) {
+ var f = splitPathRe.exec(path)[2] || '';
+ // TODO: make this comparison case-insensitive on windows?
+ if (ext && f.substr(-1 * ext.length) === ext) {
+ f = f.substr(0, f.length - ext.length);
+ }
+ return f;
+};
+
+
+exports.extname = function(path) {
+ return splitPathRe.exec(path)[3] || '';
+};
+
+});
+
+require.define("http", function (require, module, exports, __dirname, __filename) {
+module.exports = require("http-browserify")
+});
+
+require.define("/node_modules/http-browserify/package.json", function (require, module, exports, __dirname, __filename) {
+module.exports = {"main":"index.js","browserify":"index.js"}
+});
+
+require.define("/node_modules/http-browserify/index.js", function (require, module, exports, __dirname, __filename) {
+var http = module.exports;
+var EventEmitter = require('events').EventEmitter;
+var Request = require('./lib/request');
+
+http.request = function (params, cb) {
+ if (!params) params = {};
+ if (!params.host) params.host = window.location.host.split(':')[0];
+ if (!params.port) params.port = window.location.port;
+
+ var req = new Request(new xhrHttp, params);
+ if (cb) req.on('response', cb);
+ return req;
+};
+
+http.get = function (params, cb) {
+ params.method = 'GET';
+ var req = http.request(params, cb);
+ req.end();
+ return req;
+};
+
+var xhrHttp = (function () {
+ if (typeof window === 'undefined') {
+ throw new Error('no window object present');
+ }
+ else if (window.XMLHttpRequest) {
+ return window.XMLHttpRequest;
+ }
+ else if (window.ActiveXObject) {
+ var axs = [
+ 'Msxml2.XMLHTTP.6.0',
+ 'Msxml2.XMLHTTP.3.0',
+ 'Microsoft.XMLHTTP'
+ ];
+ for (var i = 0; i < axs.length; i++) {
+ try {
+ var ax = new(window.ActiveXObject)(axs[i]);
+ return function () {
+ if (ax) {
+ var ax_ = ax;
+ ax = null;
+ return ax_;
+ }
+ else {
+ return new(window.ActiveXObject)(axs[i]);
+ }
+ };
+ }
+ catch (e) {}
+ }
+ throw new Error('ajax not supported in this browser')
+ }
+ else {
+ throw new Error('ajax not supported in this browser');
+ }
+})();
+
+});
+
+require.define("events", function (require, module, exports, __dirname, __filename) {
+if (!process.EventEmitter) process.EventEmitter = function () {};
+
+var EventEmitter = exports.EventEmitter = process.EventEmitter;
+var isArray = typeof Array.isArray === 'function'
+ ? Array.isArray
+ : function (xs) {
+ return Object.toString.call(xs) === '[object Array]'
+ }
+;
+
+// By default EventEmitters will print a warning if more than
+// 10 listeners are added to it. This is a useful default which
+// helps finding memory leaks.
+//
+// Obviously not all Emitters should be limited to 10. This function allows
+// that to be increased. Set to zero for unlimited.
+var defaultMaxListeners = 10;
+EventEmitter.prototype.setMaxListeners = function(n) {
+ if (!this._events) this._events = {};
+ this._events.maxListeners = n;
+};
+
+
+EventEmitter.prototype.emit = function(type) {
+ // If there is no 'error' event listener then throw.
+ if (type === 'error') {
+ if (!this._events || !this._events.error ||
+ (isArray(this._events.error) && !this._events.error.length))
+ {
+ if (arguments[1] instanceof Error) {
+ throw arguments[1]; // Unhandled 'error' event
+ } else {
+ throw new Error("Uncaught, unspecified 'error' event.");
+ }
+ return false;
+ }
+ }
+
+ if (!this._events) return false;
+ var handler = this._events[type];
+ if (!handler) return false;
+
+ if (typeof handler == 'function') {
+ switch (arguments.length) {
+ // fast cases
+ case 1:
+ handler.call(this);
+ break;
+ case 2:
+ handler.call(this, arguments[1]);
+ break;
+ case 3:
+ handler.call(this, arguments[1], arguments[2]);
+ break;
+ // slower
+ default:
+ var args = Array.prototype.slice.call(arguments, 1);
+ handler.apply(this, args);
+ }
+ return true;
+
+ } else if (isArray(handler)) {
+ var args = Array.prototype.slice.call(arguments, 1);
+
+ var listeners = handler.slice();
+ for (var i = 0, l = listeners.length; i < l; i++) {
+ listeners[i].apply(this, args);
+ }
+ return true;
+
+ } else {
+ return false;
+ }
+};
+
+// EventEmitter is defined in src/node_events.cc
+// EventEmitter.prototype.emit() is also defined there.
+EventEmitter.prototype.addListener = function(type, listener) {
+ if ('function' !== typeof listener) {
+ throw new Error('addListener only takes instances of Function');
+ }
+
+ if (!this._events) this._events = {};
+
+ // To avoid recursion in the case that type == "newListeners"! Before
+ // adding it to the listeners, first emit "newListeners".
+ this.emit('newListener', type, listener);
+
+ if (!this._events[type]) {
+ // Optimize the case of one listener. Don't need the extra array object.
+ this._events[type] = listener;
+ } else if (isArray(this._events[type])) {
+
+ // Check for listener leak
+ if (!this._events[type].warned) {
+ var m;
+ if (this._events.maxListeners !== undefined) {
+ m = this._events.maxListeners;
+ } else {
+ m = defaultMaxListeners;
+ }
+
+ if (m && m > 0 && this._events[type].length > m) {
+ this._events[type].warned = true;
+ console.error('(node) warning: possible EventEmitter memory ' +
+ 'leak detected. %d listeners added. ' +
+ 'Use emitter.setMaxListeners() to increase limit.',
+ this._events[type].length);
+ console.trace();
+ }
+ }
+
+ // If we've already got an array, just append.
+ this._events[type].push(listener);
+ } else {
+ // Adding the second element, need to change to array.
+ this._events[type] = [this._events[type], listener];
+ }
+
+ return this;
+};
+
+EventEmitter.prototype.on = EventEmitter.prototype.addListener;
+
+EventEmitter.prototype.once = function(type, listener) {
+ var self = this;
+ self.on(type, function g() {
+ self.removeListener(type, g);
+ listener.apply(this, arguments);
+ });
+
+ return this;
+};
+
+EventEmitter.prototype.removeListener = function(type, listener) {
+ if ('function' !== typeof listener) {
+ throw new Error('removeListener only takes instances of Function');
+ }
+
+ // does not use listeners(), so no side effect of creating _events[type]
+ if (!this._events || !this._events[type]) return this;
+
+ var list = this._events[type];
+
+ if (isArray(list)) {
+ var i = list.indexOf(listener);
+ if (i < 0) return this;
+ list.splice(i, 1);
+ if (list.length == 0)
+ delete this._events[type];
+ } else if (this._events[type] === listener) {
+ delete this._events[type];
+ }
+
+ return this;
+};
+
+EventEmitter.prototype.removeAllListeners = function(type) {
+ // does not use listeners(), so no side effect of creating _events[type]
+ if (type && this._events && this._events[type]) this._events[type] = null;
+ return this;
+};
+
+EventEmitter.prototype.listeners = function(type) {
+ if (!this._events) this._events = {};
+ if (!this._events[type]) this._events[type] = [];
+ if (!isArray(this._events[type])) {
+ this._events[type] = [this._events[type]];
+ }
+ return this._events[type];
+};
+
+});
+
+require.define("/node_modules/http-browserify/lib/request.js", function (require, module, exports, __dirname, __filename) {
+var EventEmitter = require('events').EventEmitter;
+var Response = require('./response');
+
+var Request = module.exports = function (xhr, params) {
+ var self = this;
+ self.xhr = xhr;
+ self.body = '';
+
+ var uri = params.host + ':' + params.port + (params.path || '/');
+
+ xhr.open(
+ params.method || 'GET',
+ (params.scheme || 'http') + '://' + uri,
+ true
+ );
+
+ if (params.headers) {
+ Object.keys(params.headers).forEach(function (key) {
+ if (!self.isSafeRequestHeader(key)) return;
+ var value = params.headers[key];
+ if (Array.isArray(value)) {
+ value.forEach(function (v) {
+ xhr.setRequestHeader(key, v);
+ });
+ }
+ else xhr.setRequestHeader(key, value)
+ });
+ }
+
+ var res = new Response;
+ res.on('ready', function () {
+ self.emit('response', res);
+ });
+
+ xhr.onreadystatechange = function () {
+ res.handle(xhr);
+ };
+};
+
+Request.prototype = new EventEmitter;
+
+Request.prototype.setHeader = function (key, value) {
+ if ((Array.isArray && Array.isArray(value))
+ || value instanceof Array) {
+ for (var i = 0; i < value.length; i++) {
+ this.xhr.setRequestHeader(key, value[i]);
+ }
+ }
+ else {
+ this.xhr.setRequestHeader(key, value);
+ }
+};
+
+Request.prototype.write = function (s) {
+ this.body += s;
+};
+
+Request.prototype.end = function (s) {
+ if (s !== undefined) this.write(s);
+ this.xhr.send(this.body);
+};
+
+// Taken from http://dxr.mozilla.org/mozilla/mozilla-central/content/base/src/nsXMLHttpRequest.cpp.html
+Request.unsafeHeaders = [
+ "accept-charset",
+ "accept-encoding",
+ "access-control-request-headers",
+ "access-control-request-method",
+ "connection",
+ "content-length",
+ "cookie",
+ "cookie2",
+ "content-transfer-encoding",
+ "date",
+ "expect",
+ "host",
+ "keep-alive",
+ "origin",
+ "referer",
+ "te",
+ "trailer",
+ "transfer-encoding",
+ "upgrade",
+ "user-agent",
+ "via"
+];
+
+Request.prototype.isSafeRequestHeader = function (headerName) {
+ if (!headerName) return false;
+ return (Request.unsafeHeaders.indexOf(headerName.toLowerCase()) === -1)
+};
+
+});
+
+require.define("/node_modules/http-browserify/lib/response.js", function (require, module, exports, __dirname, __filename) {
+var EventEmitter = require('events').EventEmitter;
+
+var Response = module.exports = function (res) {
+ this.offset = 0;
+};
+
+Response.prototype = new EventEmitter;
+
+var capable = {
+ streaming : true,
+ status2 : true
+};
+
+function parseHeaders (res) {
+ var lines = res.getAllResponseHeaders().split(/\r?\n/);
+ var headers = {};
+ for (var i = 0; i < lines.length; i++) {
+ var line = lines[i];
+ if (line === '') continue;
+
+ var m = line.match(/^([^:]+):\s*(.*)/);
+ if (m) {
+ var key = m[1].toLowerCase(), value = m[2];
+
+ if (headers[key] !== undefined) {
+ if ((Array.isArray && Array.isArray(headers[key]))
+ || headers[key] instanceof Array) {
+ headers[key].push(value);
+ }
+ else {
+ headers[key] = [ headers[key], value ];
+ }
+ }
+ else {
+ headers[key] = value;
+ }
+ }
+ else {
+ headers[line] = true;
+ }
+ }
+ return headers;
+}
+
+Response.prototype.getHeader = function (key) {
+ return this.headers[key.toLowerCase()];
+};
+
+Response.prototype.handle = function (res) {
+ if (res.readyState === 2 && capable.status2) {
+ try {
+ this.statusCode = res.status;
+ this.headers = parseHeaders(res);
+ }
+ catch (err) {
+ capable.status2 = false;
+ }
+
+ if (capable.status2) {
+ this.emit('ready');
+ }
+ }
+ else if (capable.streaming && res.readyState === 3) {
+ try {
+ if (!this.statusCode) {
+ this.statusCode = res.status;
+ this.headers = parseHeaders(res);
+ this.emit('ready');
+ }
+ }
+ catch (err) {}
+
+ try {
+ this.write(res);
+ }
+ catch (err) {
+ capable.streaming = false;
+ }
+ }
+ else if (res.readyState === 4) {
+ if (!this.statusCode) {
+ this.statusCode = res.status;
+ this.emit('ready');
+ }
+ this.write(res);
+
+ if (res.error) {
+ this.emit('error', res.responseText);
+ }
+ else this.emit('end');
+ }
+};
+
+Response.prototype.write = function (res) {
+ if (res.responseText.length > this.offset) {
+ this.emit('data', res.responseText.slice(this.offset));
+ this.offset = res.responseText.length;
+ }
+};
+
+});
+
+require.define("/entry.js", function (require, module, exports, __dirname, __filename) {
+ var http = require('http');
+
+$(function () {
+ var opts = {
+ host : window.location.hostname,
+ port : window.location.port,
+ path : '/count'
+ };
+
+ http.get(opts, function (res) {
+ res.on('data', function (buf) {
+ $('<div>')
+ .text(buf)
+ .appendTo($('#count'))
+ ;
+ });
+
+ res.on('end', function () {
+ $('<div>')
+ .text('__END__')
+ .appendTo($('#count'))
+ ;
+ });
+ });
+});
+
+});
+require("/entry.js");
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/using-http/entry.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/using-http/entry.js
new file mode 100644
index 000000000..4bd307916
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/using-http/entry.js
@@ -0,0 +1,25 @@
+var http = require('http');
+
+$(function () {
+ var opts = {
+ host : window.location.hostname,
+ port : window.location.port,
+ path : '/count'
+ };
+
+ http.get(opts, function (res) {
+ res.on('data', function (buf) {
+ $('<div>')
+ .text(buf)
+ .appendTo($('#count'))
+ ;
+ });
+
+ res.on('end', function () {
+ $('<div>')
+ .text('__END__')
+ .appendTo($('#count'))
+ ;
+ });
+ });
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/using-http/index.html b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/using-http/index.html
new file mode 100644
index 000000000..9b55736bc
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/using-http/index.html
@@ -0,0 +1,9 @@
+<html>
+ <head>
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="/bundle.js"></script>
+ </head>
+ <body>
+ <div id="count"></div>
+ </body>
+</html>
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/using-http/server.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/using-http/server.js
new file mode 100755
index 000000000..727910655
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/example/using-http/server.js
@@ -0,0 +1,28 @@
+#!/usr/bin/env node
+var http = require('http');
+var ecstatic = require('ecstatic')(__dirname);
+
+var server = http.createServer(function (req, res) {
+ if (req.url === '/count') {
+ res.setHeader('content-type', 'multipart/octet-stream');
+
+ var n = 10;
+ var iv = setInterval(function () {
+ res.write(n + '\r\n');
+
+ if (--n === 0) {
+ clearInterval(iv);
+ res.end();
+ }
+ }, 250);
+ }
+ else ecstatic(req, res)
+});
+
+server.listen(8001);
+console.log([
+ 'Listening on :8001',
+ '',
+ 'To compile the build, do:',
+ ' browserify entry.js -o bundle.js'
+].join('\n'));
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/index.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/index.js
new file mode 100644
index 000000000..f53211b94
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/index.js
@@ -0,0 +1,255 @@
+var wrap = require('./lib/wrap');
+var fs = require('fs');
+var path = require('path');
+var coffee = require('coffee-script');
+var EventEmitter = require('events').EventEmitter;
+var exists = fs.exists || path.exists;
+
+function idFromPath (path) {
+ return path.replace(/\\/g, '/');
+}
+
+function isAbsolute (pathOrId) {
+ return path.normalize(pathOrId) === path.normalize(path.resolve(pathOrId));
+}
+
+function needsNodeModulesPrepended (id) {
+ return !/^[.\/]/.test(id) && !isAbsolute(id);
+}
+
+var exports = module.exports = function (entryFile, opts) {
+ if (!opts) opts = {};
+
+ if (Array.isArray(entryFile)) {
+ if (Array.isArray(opts.entry)) {
+ opts.entry.unshift.apply(opts.entry, entryFile);
+ }
+ else if (opts.entry) {
+ opts.entry = entryFile.concat(opts.entry);
+ }
+ else {
+ opts.entry = entryFile;
+ }
+ }
+ else if (typeof entryFile === 'object') {
+ opts = entryFile;
+ }
+ else if (typeof entryFile === 'string') {
+ if (Array.isArray(opts.entry)) {
+ opts.entry.unshift(entryFile);
+ }
+ else if (opts.entry) {
+ opts.entry = [ opts.entry, entryFile ];
+ }
+ else {
+ opts.entry = entryFile;
+ }
+ }
+
+ var watches = {};
+ var opts_ = {
+ cache : opts.cache,
+ debug : opts.debug,
+ exports : opts.exports,
+ };
+ var w = wrap(opts_)
+ .register('.coffee', function (body) {
+ return coffee.compile(body)
+ })
+ ;
+
+ if (opts.watch) {
+ w.register(function (body, file) {
+ // if already being watched
+ if (watches[file]) return body;
+
+ var watcher = function (event, filename) {
+ exists(file, function (ex) {
+ if (!ex) {
+ // deleted
+ if (w.files[file]) {
+ delete w.files[file];
+ }
+ else if (w.entries[file] !== undefined) {
+ w.appends.splice(w.entries[file], 1);
+ }
+
+ _cache = null;
+ }
+ else if (event === 'change') {
+ // modified
+ try {
+ w.reload(file);
+ _cache = null;
+ self.emit('bundle');
+ }
+ catch (e) {
+ self.emit('syntaxError', e);
+ if (self.listeners('syntaxError').length === 0) {
+ console.error(e && e.stack || e);
+ }
+ }
+ }
+ else if (event === 'rename') {
+ // todo
+ }
+ });
+ };
+
+ watches[file] = true;
+ process.nextTick(function () {
+ if (w.files[file] && w.files[file].synthetic) return;
+
+ if (typeof opts.watch === 'object') {
+ watches[file] = fs.watch(file, opts.watch, watcher);
+ }
+ else {
+ watches[file] = fs.watch(file, watcher);
+ }
+ });
+
+ return body;
+ })
+ }
+
+ if (opts.filter) {
+ w.register('post', function (body) {
+ return opts.filter(body);
+ });
+ }
+
+ w.ignore(opts.ignore || []);
+
+ if (opts.require) {
+ if (Array.isArray(opts.require)) {
+ opts.require.forEach(function (r) {
+ r = idFromPath(r);
+
+ var params = {};
+ if (needsNodeModulesPrepended(r)) {
+ params.target = '/node_modules/' + r + '/index.js';
+ }
+ w.require(r, params);
+ });
+ }
+ else if (typeof opts.require === 'object') {
+ Object.keys(opts.require).forEach(function (key) {
+ opts.require[key] = idFromPath(opts.require[key]);
+
+ var params = {};
+ if (needsNodeModulesPrepended(opts.require[key])) {
+ params.target = '/node_modules/'
+ + opts.require[key] + '/index.js'
+ ;
+ }
+ w.require(opts.require[key], params);
+ w.alias(key, opts.require[key]);
+ });
+ }
+ else {
+ opts.require = idFromPath(opts.require);
+
+ var params = {};
+ if (needsNodeModulesPrepended(opts.require)) {
+ params.target = '/node_modules/'
+ + opts.require + '/index.js'
+ ;
+ }
+ w.require(opts.require, params);
+ }
+ }
+
+ if (opts.entry) {
+ if (Array.isArray(opts.entry)) {
+ opts.entry.forEach(function (e) {
+ w.addEntry(e);
+ });
+ }
+ else {
+ w.addEntry(opts.entry);
+ }
+ }
+
+ var _cache = null;
+ var listening = false;
+ var self = function (req, res, next) {
+ if (!listening && req.connection && req.connection.server) {
+ req.connection.server.on('close', function () {
+ self.end();
+ });
+ }
+ listening = true;
+
+ if (req.url.split('?')[0] === (opts.mount || '/browserify.js')) {
+ if (!_cache) self.bundle();
+ res.statusCode = 200;
+ res.setHeader('last-modified', self.modified.toString());
+ res.setHeader('content-type', 'text/javascript');
+ res.end(_cache);
+ }
+ else next()
+ };
+
+ Object.keys(w).forEach(function (key) {
+ Object.defineProperty(self, key, {
+ set : function (value) { w[key] = value },
+ get : function () { return w[key] }
+ });
+ });
+
+ Object.keys(Object.getPrototypeOf(w)).forEach(function (key) {
+ self[key] = function () {
+ var s = w[key].apply(self, arguments)
+ if (s === self) { _cache = null }
+ return s;
+ };
+ });
+
+ Object.keys(EventEmitter.prototype).forEach(function (key) {
+ self[key] = w[key].bind(w);
+ });
+
+ var firstBundle = true;
+ self.modified = new Date;
+
+ var ok = true;
+ self.on('bundle', function () {
+ ok = true;
+ });
+
+ self.on('syntaxError', function (err) {
+ ok = false;
+ if (self.listeners('syntaxError').length <= 1) {
+ console.error(err && err.stack || err);
+ }
+ });
+
+ var lastOk = null;
+ self.bundle = function () {
+ if (!ok && _cache) return _cache;
+ if (!ok && lastOk) return lastOk;
+
+ var src = w.bundle.apply(w, arguments);
+
+ if (!firstBundle) {
+ self.modified = new Date;
+ }
+ firstBundle = false;
+
+ _cache = src;
+ if (ok) lastOk = src;
+ return src;
+ };
+
+ self.end = function () {
+ Object.keys(watches).forEach(function (file) {
+ watches[file].close();
+ });
+ };
+
+ return self;
+};
+
+exports.bundle = function (opts) {
+ return exports(opts).bundle();
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/lib/wrap.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/lib/wrap.js
new file mode 100644
index 000000000..80b887468
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/lib/wrap.js
@@ -0,0 +1,527 @@
+var fs = require('fs');
+var path = require('path');
+var util = require('util');
+var EventEmitter = require('events').EventEmitter;
+
+var detective = require('detective');
+var deputy = require('deputy');
+var resolve = require('resolve');
+
+var wrappers = require('./wrappers');
+var commondir = require('commondir');
+var nub = require('nub');
+
+module.exports = function (opts) {
+ return new Wrap(opts);
+};
+function idFromPath (path) {
+ return path.replace(/\\/g, '/');
+}
+
+function Wrap (opts) {
+ var home = process.env.HOME || process.env.USERPROFILE;
+ if (opts.cache === undefined && home !== undefined) {
+ opts.cache = true;
+ }
+
+ if (opts.cache) {
+ if (typeof opts.cache === 'boolean') {
+ var file = home + '/.config/browserify/cache.json';
+ this.detective = deputy(file);
+ }
+ else {
+ this.detective = deputy(opts.cache);
+ }
+ }
+ else {
+ this.detective = detective;
+ }
+
+ this.exports = opts.exports;
+
+ this.files = {};
+ this.filters = [];
+ this.postFilters = [];
+ this.preFilters = [];
+ this.aliases = {};
+ this._checkedPackages = {};
+
+ this.ignoring = {};
+ this.extensions = [ '.js' ];
+
+ this.prepends = [ wrappers.prelude, wrappers.process ];
+ this.appends = []
+ this.entries = {};
+ this.debug = opts.debug;
+
+ this.require('path');
+ this.require('__browserify_process');
+}
+
+util.inherits(Wrap, EventEmitter);
+
+Wrap.prototype.prepend = function (src) {
+ this.prepends.unshift(src);
+ return this;
+};
+
+Wrap.prototype.append = function (src) {
+ this.appends.push(src);
+ return this;
+};
+
+Wrap.prototype.ignore = function (files) {
+ if (!files) files = [];
+ if (!Array.isArray(files)) files = [ files ];
+
+ this.ignoring = files.reduce(function (acc,x) {
+ acc[x] = true;
+ return acc;
+ }, this.ignoring);
+
+ return this;
+};
+
+Wrap.prototype.use = function (fn) {
+ fn(this, this);
+ return this;
+};
+
+Wrap.prototype.register = function (ext, fn) {
+ if (typeof ext === 'object') {
+ fn = ext.wrapper;
+ ext = ext.extension;
+ }
+
+ if (ext === 'post') {
+ this.postFilters.push(fn);
+ }
+ else if (ext === 'pre') {
+ this.preFilters.push(fn);
+ }
+ else if (fn) {
+ this.extensions.push(ext);
+ this.filters.push(function (body, file) {
+ if (file.slice(-ext.length) === ext) {
+ return fn.call(this, body, file);
+ }
+ else return body;
+ });
+ }
+ else {
+ this.filters.push(ext);
+ }
+ return this;
+};
+
+Wrap.prototype.reload = function (file) {
+ var self = this;
+ if (self.files[file]) {
+ var f = self.files[file];
+ f.body = undefined;
+ delete self.files[file];
+
+ self.require(file, f);
+ }
+ else if (self.entries[file]) {
+ var e = self.entries[file];
+ e.body = undefined;
+ delete self.entries[file];
+
+ self.addEntry(file, e);
+ }
+
+ return self;
+};
+
+Wrap.prototype.readFile = function (file) {
+ var self = this;
+
+ var body = fs.readFileSync(file, 'utf8').replace(/^#![^\n]*\n/, '');
+
+ self.filters.forEach(function (fn) {
+ body = fn.call(self, body, file);
+ });
+
+ return body;
+};
+
+Wrap.prototype.alias = function (to, from) {
+ this.aliases[to] = from;
+ return this;
+};
+
+Wrap.prototype.addEntry = function (file_, opts) {
+ var self = this;
+ if (!opts) opts = {};
+ var file = path.resolve(opts.dirname || process.cwd(), file_);
+
+ var body = opts.body || self.readFile(file);
+ var entry = this.entries[file] = { body : body };
+ if (opts.target) entry.target = opts.target;
+
+ try {
+ var required = self.detective.find(body);
+ }
+ catch (err) {
+ process.nextTick(function () {
+ err.message = 'Error while loading entry file '
+ + JSON.stringify(file)
+ + ': ' + err.message
+ ;
+ self.emit('syntaxError', err);
+ });
+ return self;
+ }
+
+ if (required.expressions.length) {
+ console.error('Expressions in require() statements:');
+ required.expressions.forEach(function (ex) {
+ console.error(' require(' + ex + ')');
+ });
+ }
+
+ var dirname = path.dirname(file);
+
+ required.strings.forEach(function (req) {
+ var params = {
+ dirname : dirname,
+ fromFile : file,
+ };
+ if (opts.target && /^[.\/]/.test(req)) {
+ params.target = path.resolve(path.dirname(opts.target), req);
+ }
+ self.require(req, params);
+ });
+
+ return this;
+};
+
+Wrap.prototype.bundle = function () {
+ var self = this;
+
+ for (var i = 0; i < self.prepends.length; i++) {
+ var p = self.prepends[i];
+ if (p === wrappers.prelude) {
+ self.prepends[i] = p.replace(/\$extensions/, function () {
+ return JSON.stringify(self.extensions);
+ });
+ break;
+ }
+ }
+
+ this.preFilters.forEach((function (fn) {
+ fn.call(this, this);
+ }).bind(this));
+
+ var basedir = (function () {
+ var required = Object.keys(self.files)
+ .filter(function (x) { return !self.files[x].target })
+ ;
+ var entries = Object.keys(self.entries)
+ .filter(function (x) { return !self.entries[x].target })
+ ;
+ var files = required.concat(entries)
+ .map(function (x) { return path.dirname(x) })
+ ;
+ if (files.length === 0) return '';
+
+ var dir = commondir(files) + '/';
+ return path.normalize(dir.replace(/\/node_modules\/$/, '/'));
+ })();
+
+ var removeLeading = function (s) {
+ if (s.slice(0, basedir.length) === basedir) {
+ return s.slice(basedir.length - 1);
+ }
+ };
+
+ var src = []
+ .concat(this.prepends)
+ .concat(Object.keys(self.files).map(function (file) {
+ var s = self.files[file];
+ var target = s.target || removeLeading(file);
+
+ if (self.ignoring[target]) return '';
+
+ return self.wrap(idFromPath(target), s.body)
+ }))
+ .concat(Object.keys(self.aliases).map(function (to) {
+ var from = self.aliases[to];
+ if (!to.match(/^(\.\.?)?\//)) {
+ to = '/node_modules/' + to;
+ }
+
+ return wrappers.alias
+ .replace(/\$from/, function () {
+ return JSON.stringify(from);
+ })
+ .replace(/\$to/, function () {
+ return JSON.stringify(to);
+ })
+ ;
+ }))
+ .concat(Object.keys(self.entries).map(function (file) {
+ var s = self.entries[file];
+ var target = s.target || removeLeading(file);
+ return self.wrapEntry(idFromPath(target), s.body);
+ }))
+ .concat(this.appends)
+ .join('\n')
+ ;
+
+ if (!self.exports) {
+ self.exports = Object.keys(self.entries).length ? [] : [ 'require' ];
+ }
+ if (self.exports === true) self.exports = [ 'require', 'process' ];
+ if (!Array.isArray(self.exports)) self.exports = [ self.exports ];
+
+ if (self.exports.indexOf('process') >= 0
+ && self.exports.indexOf('require') >= 0) {
+ src += 'var process = require("__browserify_process");\n'
+ }
+ else if (self.exports.indexOf('require') >= 0) {
+ // nop
+ }
+ else if (self.exports.indexOf('process') >= 0) {
+ src = 'var process = (function(){'
+ + src
+ + ';return require("__browserify_process")'
+ + '})();\n'
+ ;
+ }
+ else {
+ src = '(function(){' + src + '})();\n'
+ }
+
+ this.postFilters.forEach((function (fn) {
+ src = fn.call(this, src);
+ }).bind(this));
+
+ return src;
+};
+
+Wrap.prototype.wrap = function (target, body) {
+ var self = this;
+ return (self.debug ? wrappers.body_debug : wrappers.body)
+ .replace(/\$__filename/g, function () {
+ return JSON.stringify(target);
+ })
+ .replace(/\$body/, function () {
+ return self.debug
+ ? JSON.stringify(body + '\n//@ sourceURL=' + target)
+ : body
+ ;
+ })
+ ;
+};
+
+Wrap.prototype.wrapEntry = function (target, body) {
+ var self = this;
+ return (self.debug ? wrappers.entry_debug : wrappers.entry)
+ .replace(/\$__filename/g, function () {
+ return JSON.stringify(target)
+ })
+ .replace(/\$body/, function () {
+ return self.debug
+ ? JSON.stringify(body + '\n//@ sourceURL=' + target)
+ : body
+ ;
+ })
+ ;
+};
+
+Wrap.prototype.include = function (file, target, body, root) {
+ var synthetic = !file;
+ if (!file) file = Math.floor(Math.random() * Math.pow(2,32)).toString(16);
+
+ this.files[file] = {
+ body : body,
+ target : target,
+ synthetic : synthetic,
+ root : root
+ };
+ return this;
+};
+
+Wrap.prototype.require = function (mfile, opts) {
+ var self = this;
+ if (!opts) opts = {};
+ if (!opts.dirname) opts.dirname = process.cwd();
+
+ if (typeof mfile === 'object') {
+ throw new Error('require maps no longer supported');
+ }
+
+ if (self.has(mfile)) return self;
+ if (opts.target && self.has(opts.target)) return self;
+
+ if (self.ignoring[mfile]) return self;
+ if (self.aliases[mfile]) return self;
+
+ function moduleError (msg) {
+ return new Error(msg + ': ' + JSON.stringify(mfile)
+ + ' from directory ' + JSON.stringify(opts.dirname)
+ + (opts.fromFile ? ' while processing file ' + opts.fromFile : '')
+ );
+ }
+
+ var pkg = {};
+ if (mfile === '__browserify_process' || resolve.isCore(mfile)) {
+ opts.file = path.resolve(__dirname, '../builtins/' + mfile + '.js');
+ opts.target = opts.target || mfile;
+
+ if (!path.existsSync(opts.file)) {
+ try {
+ require.resolve(mfile + '-browserify');
+ opts.body = 'module.exports = require('
+ + JSON.stringify(mfile + '-browserify')
+ + ')';
+ }
+ catch (err) {
+ throw moduleError('No wrapper for core module');
+ }
+ }
+ }
+ else if (self.has(mfile)) {
+ // package has already been included in some fashion, no need to resolve
+ return self;
+ }
+ else if (opts.body) {
+ opts.file = mfile;
+ }
+ else if (!opts.file) {
+ try {
+ var normPath
+ = path.normalize(path.resolve(mfile)) === path.normalize(mfile)
+ ? path.normalize(mfile) : mfile
+ ;
+ opts.file = self.resolver(normPath, opts.dirname);
+ }
+ catch (err) {
+ throw moduleError('Cannot find module');
+ }
+ }
+
+ if (self.has(opts.file)) return self;
+
+ var dirname = path.dirname(opts.file);
+ var pkgfile = path.join(dirname, 'package.json');
+
+ if (!mfile.match(/^(\.\.?)?\//)) {
+ try {
+ pkgfile = resolve.sync(path.join(mfile, 'package.json'), {
+ basedir : dirname
+ });
+ }
+ catch (err) {}
+ }
+
+ if (pkgfile && !self._checkedPackages[pkgfile]) {
+ self._checkedPackages[pkgfile] = true;
+ if (path.existsSync(pkgfile)) {
+ var pkgBody = fs.readFileSync(pkgfile, 'utf8');
+ try {
+ var npmpkg = JSON.parse(pkgBody);
+ if (npmpkg.main !== undefined) {
+ pkg.main = npmpkg.main;
+ }
+ if (npmpkg.browserify !== undefined) {
+ pkg.browserify = npmpkg.browserify;
+ }
+ }
+ catch (err) {
+ // ignore broken package.jsons just like node
+ }
+
+ self.files[pkgfile] = {
+ body : 'module.exports = ' + JSON.stringify(pkg),
+ };
+ }
+ }
+
+ var body = opts.body || self.readFile(opts.file);
+ var entry = self.files[opts.file] = {
+ body : body,
+ target : opts.target
+ };
+
+ try {
+ var required = self.detective.find(body);
+ }
+ catch (err) {
+ process.nextTick(function () {
+ self.emit('syntaxError', err);
+ });
+ return self;
+ }
+
+ if (pkg.browserify && pkg.browserify.require) {
+ required.strings = required.strings.concat(
+ pkg.browserify.require
+ );
+ }
+
+ if (required.expressions.length) {
+ console.error('Expressions in require() statements:');
+ required.expressions.forEach(function (ex) {
+ console.error(' require(' + ex + ')');
+ });
+ }
+
+ nub(required.strings).forEach(function (req) {
+ var params = {
+ dirname : dirname,
+ fromFile : opts.file,
+ };
+ if (opts.target && /^[.\/]/.test(req)) {
+ // not a real directory on the filesystem; just using the path
+ // module to get rid of the filename.
+ var targetDir = path.dirname(opts.target);
+ // not a real filename; just using the path module to deal with
+ // relative paths.
+ var reqFilename = path.resolve(targetDir, req);
+ // get rid of drive letter on Windows; replace it with '/'
+ var reqFilenameWithoutDriveLetter = /^[A-Z]:\\/.test(reqFilename) ?
+ '/' + reqFilename.substring(3) : reqFilename;
+
+ params.target = idFromPath(reqFilenameWithoutDriveLetter);
+ }
+ self.require(req, params);
+ });
+
+ return self;
+};
+
+function isPrefixOf (x, y) {
+ return y.slice(0, x.length) === x;
+}
+
+Wrap.prototype.has = function (file) {
+ var self = this;
+ if (self.files[file]) return true;
+
+ var res = Object.keys(self.files).some(function (key) {
+ return self.files[key].target === file;
+ });
+ return res;
+};
+
+Wrap.prototype.resolver = function (file, basedir) {
+ return resolve.sync(file, {
+ basedir : basedir,
+ extensions : this.extensions,
+ packageFilter : function (pkg) {
+ var b = pkg.browserify;
+ if (b) {
+ if (typeof b === 'string') {
+ pkg.main = b;
+ }
+ else if (typeof b === 'object' && b.main) {
+ pkg.main = b.main;
+ }
+ }
+ return pkg
+ }
+ });
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/lib/wrappers.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/lib/wrappers.js
new file mode 100644
index 000000000..b14e7d8a0
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/lib/wrappers.js
@@ -0,0 +1,10 @@
+var fs = require('fs');
+
+module.exports = fs.readdirSync(__dirname + '/../wrappers')
+ .filter(function (file) { return file.match(/\.js$/) })
+ .reduce(function (acc, file) {
+ var name = file.replace(/\.js$/, '');
+ acc[name] = fs.readFileSync(__dirname + '/../wrappers/' + file, 'utf8');
+ return acc;
+ }, {})
+;
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/.npmignore b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/.npmignore
new file mode 100644
index 000000000..21e430d2e
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/.npmignore
@@ -0,0 +1,11 @@
+*.coffee
+*.html
+.DS_Store
+.git*
+Cakefile
+documentation/
+examples/
+extras/coffee-script.js
+raw/
+src/
+test/
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/CNAME b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/CNAME
new file mode 100644
index 000000000..faadabe5f
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/CNAME
@@ -0,0 +1 @@
+coffeescript.org \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/LICENSE b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/LICENSE
new file mode 100644
index 000000000..dbe6b4e3b
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/LICENSE
@@ -0,0 +1,22 @@
+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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/README b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/README
new file mode 100644
index 000000000..69ee6f43c
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/README
@@ -0,0 +1,51 @@
+
+ {
+ } } {
+ { { } }
+ } }{ {
+ { }{ } } _____ __ __
+ ( }{ }{ { ) / ____| / _|/ _|
+ .- { { } { }} -. | | ___ | |_| |_ ___ ___
+ ( ( } { } { } } ) | | / _ \| _| _/ _ \/ _ \
+ |`-..________ ..-'| | |___| (_) | | | || __/ __/
+ | | \_____\___/|_| |_| \___|\___|
+ | ;--.
+ | (__ \ _____ _ _
+ | | ) ) / ____| (_) | |
+ | |/ / | (___ ___ _ __ _ _ __ | |_
+ | ( / \___ \ / __| '__| | '_ \| __|
+ | |/ ____) | (__| | | | |_) | |_
+ | | |_____/ \___|_| |_| .__/ \__|
+ `-.._________..-' | |
+ |_|
+
+
+ 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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/Rakefile b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/Rakefile
new file mode 100644
index 000000000..dfb85dabc
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/Rakefile
@@ -0,0 +1,78 @@
+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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/bin/cake b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/bin/cake
new file mode 100755
index 000000000..5965f4ee5
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/bin/cake
@@ -0,0 +1,7 @@
+#!/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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/bin/coffee b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/bin/coffee
new file mode 100755
index 000000000..3d1d71c8c
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/bin/coffee
@@ -0,0 +1,7 @@
+#!/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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/extras/jsl.conf b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/extras/jsl.conf
new file mode 100644
index 000000000..1190da529
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/extras/jsl.conf
@@ -0,0 +1,44 @@
+# 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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/browser.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/browser.js
new file mode 100644
index 000000000..825cbf312
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/browser.js
@@ -0,0 +1,92 @@
+// Generated by CoffeeScript 1.3.3
+(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 = new (window.ActiveXObject || XMLHttpRequest)('Microsoft.XMLHTTP');
+ 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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/cake.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/cake.js
new file mode 100644
index 000000000..1523418f1
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/cake.js
@@ -0,0 +1,111 @@
+// Generated by CoffeeScript 1.3.3
+(function() {
+ var CoffeeScript, cakefileDirectory, 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');
+
+ 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 (path.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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/coffee-script.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/coffee-script.js
new file mode 100644
index 000000000..c43fa497e
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/coffee-script.js
@@ -0,0 +1,167 @@
+// Generated by CoffeeScript 1.3.3
+(function() {
+ var Lexer, RESERVED, compile, fs, lexer, parser, path, 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');
+
+ if (require.extensions) {
+ require.extensions['.coffee'] = function(module, filename) {
+ var content;
+ content = compile(fs.readFileSync(filename, 'utf8'), {
+ filename: filename
+ });
+ return module._compile(content, filename);
+ };
+ } else if (require.registerExtension) {
+ require.registerExtension('.coffee', function(content) {
+ return compile(content);
+ });
+ }
+
+ exports.VERSION = '1.3.3';
+
+ 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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/command.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/command.js
new file mode 100644
index 000000000..e02da9fe6
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/command.js
@@ -0,0 +1,500 @@
+// Generated by CoffeeScript 1.3.3
+(function() {
+ var BANNER, CoffeeScript, EventEmitter, SWITCHES, compileJoin, compileOptions, compilePath, compileScript, compileStdio, exec, 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;
+
+ 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 path.exists(jsPath, function(exists) {
+ if (exists) {
+ 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 path.exists(jsDir, function(exists) {
+ if (exists) {
+ 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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/grammar.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/grammar.js
new file mode 100644
index 000000000..56621388d
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/grammar.js
@@ -0,0 +1,606 @@
+// Generated by CoffeeScript 1.3.3
+(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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/helpers.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/helpers.js
new file mode 100644
index 000000000..b0a997b8d
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/helpers.js
@@ -0,0 +1,77 @@
+// Generated by CoffeeScript 1.3.3
+(function() {
+ var extend, flatten;
+
+ 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];
+ };
+
+}).call(this);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/index.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/index.js
new file mode 100644
index 000000000..d344c41a2
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/index.js
@@ -0,0 +1,11 @@
+// Generated by CoffeeScript 1.3.3
+(function() {
+ var key, val, _ref;
+
+ _ref = require('./coffee-script');
+ for (key in _ref) {
+ val = _ref[key];
+ exports[key] = val;
+ }
+
+}).call(this);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/lexer.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/lexer.js
new file mode 100644
index 000000000..f80a44337
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/lexer.js
@@ -0,0 +1,788 @@
+// Generated by CoffeeScript 1.3.3
+(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));
+ 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, prev, size;
+ if (!(match = MULTI_DENT.exec(this.chunk))) {
+ return 0;
+ }
+ indent = match[0];
+ this.line += count(indent, '\n');
+ this.seenFor = false;
+ prev = last(this.tokens, 1);
+ 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', 'let', '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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/nodes.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/nodes.js
new file mode 100644
index 000000000..799b68eb4
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/nodes.js
@@ -0,0 +1,2986 @@
+// Generated by CoffeeScript 1.3.3
+(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, 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;
+
+ 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), t = typeof result;\n" + idt + "return t == \"object\" || t == \"function\" ? result || child : 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, propName, propNames, props, _i, _j, _len, _len1, _ref2;
+ props = this.properties;
+ propNames = [];
+ _ref2 = this.properties;
+ for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
+ prop = _ref2[_i];
+ if (prop.isComplex()) {
+ prop = prop.variable;
+ }
+ if (prop != null) {
+ propName = prop.unwrapAll().value.toString();
+ if (__indexOf.call(propNames, propName) >= 0) {
+ throw SyntaxError("multiple object literal properties named \"" + propName + "\"");
+ }
+ propNames.push(propName);
+ }
+ }
+ if (!props.length) {
+ return (this.front ? '({})' : '{}');
+ }
+ if (this.generated) {
+ for (_j = 0, _len1 = props.length; _j < _len1; _j++) {
+ node = props[_j];
+ 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 _k, _len2, _results;
+ _results = [];
+ for (i = _k = 0, _len2 = props.length; _k < _len2; i = ++_k) {
+ 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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/optparse.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/optparse.js
new file mode 100644
index 000000000..d7fda40a3
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/optparse.js
@@ -0,0 +1,138 @@
+// Generated by CoffeeScript 1.3.3
+(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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/parser.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/parser.js
new file mode 100755
index 000000000..f0499038e
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/parser.js
@@ -0,0 +1,683 @@
+/* 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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/repl.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/repl.js
new file mode 100644
index 000000000..b4a4765d3
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/repl.js
@@ -0,0 +1,261 @@
+// Generated by CoffeeScript 1.3.3
+(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;
+
+ 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, completions, key, match, obj, possibilities, prefix, val;
+ if (match = text.match(ACCESSOR)) {
+ all = match[0], obj = match[1], prefix = match[2];
+ try {
+ val = Script.runInThisContext(obj);
+ } catch (error) {
+ return;
+ }
+ val = Object(val);
+ possibilities = Object.getOwnPropertyNames(val);
+ for (key in val) {
+ if (~possibilities.indexOf(val)) {
+ possibilities.push(key);
+ }
+ }
+ completions = getCompletions(prefix, possibilities);
+ return [completions, prefix];
+ }
+ };
+
+ completeVariable = function(text) {
+ var completions, free, keywords, possibilities, r, vars, _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;
+ })();
+ possibilities = vars.concat(keywords);
+ completions = getCompletions(free, possibilities);
+ 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 (el.indexOf(prefix) === 0) {
+ _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) {
+ 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) {
+ backlog = '';
+ repl.output.write('\n');
+ repl.setPrompt(REPL_PROMPT);
+ return repl.prompt();
+ } 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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/rewriter.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/rewriter.js
new file mode 100644
index 000000000..d26133ca7
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/rewriter.js
@@ -0,0 +1,349 @@
+// Generated by CoffeeScript 1.3.3
+(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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/scope.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/scope.js
new file mode 100644
index 000000000..3efc4ede6
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/lib/coffee-script/scope.js
@@ -0,0 +1,146 @@
+// Generated by CoffeeScript 1.3.3
+(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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/package.json b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/package.json
new file mode 100644
index 000000000..0d90cc629
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/coffee-script/package.json
@@ -0,0 +1,47 @@
+{
+ "name": "coffee-script",
+ "description": "Unfancy JavaScript",
+ "keywords": [
+ "javascript",
+ "language",
+ "coffeescript",
+ "compiler"
+ ],
+ "author": {
+ "name": "Jeremy Ashkenas"
+ },
+ "version": "1.3.3",
+ "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"
+ },
+ "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.3.3",
+ "dist": {
+ "shasum": "fdb03098caee97f22944d655e32204a58522fa9f"
+ },
+ "_from": "coffee-script@1.x.x"
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/README.markdown b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/README.markdown
new file mode 100644
index 000000000..1326dc183
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/README.markdown
@@ -0,0 +1,45 @@
+commondir
+=========
+
+Compute the closest common parent directory among an array of directories.
+
+example
+=======
+
+dir
+---
+
+ > var commondir = require('commondir');
+ > commondir([ '/x/y/z', '/x/y', '/x/y/w/q' ])
+ '/x/y'
+
+base
+----
+
+ > var commondir = require('commondir')
+ > commondir('/foo/bar', [ '../baz', '../../foo/quux', './bizzy' ])
+ '/foo'
+
+methods
+=======
+
+var commondir = require('commondir');
+
+commondir(absolutePaths)
+------------------------
+
+Compute the closest common parent directory for an array `absolutePaths`.
+
+commondir(basedir, relativePaths)
+---------------------------------
+
+Compute the closest common parent directory for an array `relativePaths` which
+will be resolved for each `dir` in `relativePaths` according to:
+`path.resolve(basedir, dir)`.
+
+installation
+============
+
+Using [npm](http://npmjs.org), just do:
+
+ npm install commondir
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/example/base.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/example/base.js
new file mode 100644
index 000000000..715e280c3
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/example/base.js
@@ -0,0 +1,3 @@
+var commondir = require('commondir');
+var dir = commondir('/foo/bar', [ '../baz', '../../foo/quux', './bizzy' ])
+console.log(dir);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/example/dir.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/example/dir.js
new file mode 100644
index 000000000..0a5e9cca8
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/example/dir.js
@@ -0,0 +1,3 @@
+var commondir = require('commondir');
+var dir = commondir([ '/x/y/z', '/x/y', '/x/y/w/q' ])
+console.log(dir);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/index.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/index.js
new file mode 100644
index 000000000..fa77d0452
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/index.js
@@ -0,0 +1,29 @@
+var path = require('path');
+
+module.exports = function (basedir, relfiles) {
+ if (relfiles) {
+ var files = relfiles.map(function (r) {
+ return path.resolve(basedir, r);
+ });
+ }
+ else {
+ var files = basedir;
+ }
+
+ var res = files.slice(1).reduce(function (ps, file) {
+ if (!file.match(/^([A-Za-z]:)?\/|\\/)) {
+ throw new Error('relative path without a basedir');
+ }
+
+ var xs = file.split(/\/+|\\+/);
+ for (
+ var i = 0;
+ ps[i] === xs[i] && i < Math.min(ps.length, xs.length);
+ i++
+ );
+ return ps.slice(0, i);
+ }, files[0].split(/\/+|\\+/));
+
+ // Windows correctly handles paths with forward-slashes
+ return res.length > 1 ? res.join('/') : '/'
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/package.json b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/package.json
new file mode 100644
index 000000000..682e62c4b
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/package.json
@@ -0,0 +1,45 @@
+{
+ "name": "commondir",
+ "version": "0.0.1",
+ "description": "Compute the closest common parent for file paths",
+ "main": "index.js",
+ "directories": {
+ "lib": ".",
+ "example": "example",
+ "test": "test"
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "expresso": "0.7.x"
+ },
+ "scripts": {
+ "test": "expresso"
+ },
+ "repository": {
+ "type": "git",
+ "url": "http://github.com/substack/node-commondir.git"
+ },
+ "keywords": [
+ "common",
+ "path",
+ "directory",
+ "file",
+ "parent",
+ "root"
+ ],
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "license": "MIT/X11",
+ "engine": {
+ "node": ">=0.4"
+ },
+ "readme": "commondir\n=========\n\nCompute the closest common parent directory among an array of directories.\n\nexample\n=======\n\ndir\n---\n\n > var commondir = require('commondir');\n > commondir([ '/x/y/z', '/x/y', '/x/y/w/q' ])\n '/x/y'\n\nbase\n----\n\n > var commondir = require('commondir')\n > commondir('/foo/bar', [ '../baz', '../../foo/quux', './bizzy' ])\n '/foo'\n\nmethods\n=======\n\nvar commondir = require('commondir');\n\ncommondir(absolutePaths)\n------------------------\n\nCompute the closest common parent directory for an array `absolutePaths`.\n\ncommondir(basedir, relativePaths)\n---------------------------------\n\nCompute the closest common parent directory for an array `relativePaths` which\nwill be resolved for each `dir` in `relativePaths` according to:\n`path.resolve(basedir, dir)`.\n\ninstallation\n============\n\nUsing [npm](http://npmjs.org), just do:\n\n npm install commondir\n",
+ "_id": "commondir@0.0.1",
+ "dist": {
+ "shasum": "ad76caa7f50e586c1208777ff38d774a52de90d0"
+ },
+ "_from": "commondir@~0.0.1"
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/test/dirs.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/test/dirs.js
new file mode 100644
index 000000000..946026d1f
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/commondir/test/dirs.js
@@ -0,0 +1,66 @@
+var assert = require('assert');
+var commondir = require('../');
+
+exports.common = function () {
+ assert.equal(
+ commondir([ '/foo', '//foo/bar', '/foo//bar/baz' ]),
+ '/foo'
+ );
+
+ assert.equal(
+ commondir([ '/a/b/c', '/a/b', '/a/b/c/d/e' ]),
+ '/a/b'
+ );
+
+ assert.equal(
+ commondir([ '/x/y/z/w', '/xy/z', '/x/y/z' ]),
+ '/'
+ );
+
+ assert.equal(
+ commondir([ 'X:\\foo', 'X:\\\\foo\\bar', 'X://foo/bar/baz' ]),
+ 'X:/foo'
+ );
+
+ assert.equal(
+ commondir([ 'X:\\a\\b\\c', 'X:\\a\\b', 'X:\\a\\b\\c\\d\\e' ]),
+ 'X:/a/b'
+ );
+
+ assert.equal(
+ commondir([ 'X:\\x\\y\\z\\w', '\\\\xy\\z', '\\x\\y\\z' ]),
+ '/'
+ );
+
+ assert.throws(function () {
+ assert.equal(
+ commondir([ '/x/y/z/w', 'qrs', '/x/y/z' ]),
+ '/'
+ );
+ });
+};
+
+exports.base = function () {
+ assert.equal(
+ commondir('/foo/bar', [ 'baz', './quux', '../bar/bazzy' ]),
+ '/foo/bar'
+ );
+
+ assert.equal(
+ commondir('/a/b', [ 'c', '../b/.', '../../a/b/e' ]),
+ '/a/b'
+ );
+
+ assert.equal(
+ commondir('/a/b/c', [ '..', '../d', '../../a/z/e' ]),
+ '/a'
+ );
+
+ assert.equal(
+ commondir('/foo/bar', [ 'baz', '.\\quux', '..\\bar\\bazzy' ]),
+ '/foo/bar'
+ );
+
+ // Tests including X:\ basedirs must wait until path.resolve supports
+ // Windows-style paths, starting in Node.js v0.5.X
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/example/bundle.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/example/bundle.js
new file mode 100644
index 000000000..02698cc77
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/example/bundle.js
@@ -0,0 +1,637 @@
+var require = function (file, cwd) {
+ var resolved = require.resolve(file, cwd || '/');
+ var mod = require.modules[resolved];
+ if (!mod) throw new Error(
+ 'Failed to resolve module ' + file + ', tried ' + resolved
+ );
+ var res = mod._cached ? mod._cached : mod();
+ return res;
+}
+
+require.paths = [];
+require.modules = {};
+require.extensions = [".js",".coffee"];
+
+require._core = {
+ 'assert': true,
+ 'events': true,
+ 'fs': true,
+ 'path': true,
+ 'vm': true
+};
+
+require.resolve = (function () {
+ return function (x, cwd) {
+ if (!cwd) cwd = '/';
+
+ if (require._core[x]) return x;
+ var path = require.modules.path();
+ cwd = path.resolve('/', cwd);
+ var y = cwd || '/';
+
+ if (x.match(/^(?:\.\.?\/|\/)/)) {
+ var m = loadAsFileSync(path.resolve(y, x))
+ || loadAsDirectorySync(path.resolve(y, x));
+ if (m) return m;
+ }
+
+ var n = loadNodeModulesSync(x, y);
+ if (n) return n;
+
+ throw new Error("Cannot find module '" + x + "'");
+
+ function loadAsFileSync (x) {
+ if (require.modules[x]) {
+ return x;
+ }
+
+ for (var i = 0; i < require.extensions.length; i++) {
+ var ext = require.extensions[i];
+ if (require.modules[x + ext]) return x + ext;
+ }
+ }
+
+ function loadAsDirectorySync (x) {
+ x = x.replace(/\/+$/, '');
+ var pkgfile = x + '/package.json';
+ if (require.modules[pkgfile]) {
+ var pkg = require.modules[pkgfile]();
+ var b = pkg.browserify;
+ if (typeof b === 'object' && b.main) {
+ var m = loadAsFileSync(path.resolve(x, b.main));
+ if (m) return m;
+ }
+ else if (typeof b === 'string') {
+ var m = loadAsFileSync(path.resolve(x, b));
+ if (m) return m;
+ }
+ else if (pkg.main) {
+ var m = loadAsFileSync(path.resolve(x, pkg.main));
+ if (m) return m;
+ }
+ }
+
+ return loadAsFileSync(x + '/index');
+ }
+
+ function loadNodeModulesSync (x, start) {
+ var dirs = nodeModulesPathsSync(start);
+ for (var i = 0; i < dirs.length; i++) {
+ var dir = dirs[i];
+ var m = loadAsFileSync(dir + '/' + x);
+ if (m) return m;
+ var n = loadAsDirectorySync(dir + '/' + x);
+ if (n) return n;
+ }
+
+ var m = loadAsFileSync(x);
+ if (m) return m;
+ }
+
+ function nodeModulesPathsSync (start) {
+ var parts;
+ if (start === '/') parts = [ '' ];
+ else parts = path.normalize(start).split('/');
+
+ var dirs = [];
+ for (var i = parts.length - 1; i >= 0; i--) {
+ if (parts[i] === 'node_modules') continue;
+ var dir = parts.slice(0, i + 1).join('/') + '/node_modules';
+ dirs.push(dir);
+ }
+
+ return dirs;
+ }
+ };
+})();
+
+require.alias = function (from, to) {
+ var path = require.modules.path();
+ var res = null;
+ try {
+ res = require.resolve(from + '/package.json', '/');
+ }
+ catch (err) {
+ res = require.resolve(from, '/');
+ }
+ var basedir = path.dirname(res);
+
+ var keys = (Object.keys || function (obj) {
+ var res = [];
+ for (var key in obj) res.push(key)
+ return res;
+ })(require.modules);
+
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ if (key.slice(0, basedir.length + 1) === basedir + '/') {
+ var f = key.slice(basedir.length);
+ require.modules[to + f] = require.modules[basedir + f];
+ }
+ else if (key === basedir) {
+ require.modules[to] = require.modules[basedir];
+ }
+ }
+};
+
+require.define = function (filename, fn) {
+ var dirname = require._core[filename]
+ ? ''
+ : require.modules.path().dirname(filename)
+ ;
+
+ var require_ = function (file) {
+ return require(file, dirname)
+ };
+ require_.resolve = function (name) {
+ return require.resolve(name, dirname);
+ };
+ require_.modules = require.modules;
+ require_.define = require.define;
+ var module_ = { exports : {} };
+
+ require.modules[filename] = function () {
+ require.modules[filename]._cached = module_.exports;
+ fn.call(
+ module_.exports,
+ require_,
+ module_,
+ module_.exports,
+ dirname,
+ filename
+ );
+ require.modules[filename]._cached = module_.exports;
+ return module_.exports;
+ };
+};
+
+if (typeof process === 'undefined') process = {};
+
+if (!process.nextTick) process.nextTick = (function () {
+ var queue = [];
+ var canPost = typeof window !== 'undefined'
+ && window.postMessage && window.addEventListener
+ ;
+
+ if (canPost) {
+ window.addEventListener('message', function (ev) {
+ if (ev.source === window && ev.data === 'browserify-tick') {
+ ev.stopPropagation();
+ if (queue.length > 0) {
+ var fn = queue.shift();
+ fn();
+ }
+ }
+ }, true);
+ }
+
+ return function (fn) {
+ if (canPost) {
+ queue.push(fn);
+ window.postMessage('browserify-tick', '*');
+ }
+ else setTimeout(fn, 0);
+ };
+})();
+
+if (!process.title) process.title = 'browser';
+
+if (!process.binding) process.binding = function (name) {
+ if (name === 'evals') return require('vm')
+ else throw new Error('No such module')
+};
+
+if (!process.cwd) process.cwd = function () { return '.' };
+
+if (!process.env) process.env = {};
+if (!process.argv) process.argv = [];
+
+require.define("path", function (require, module, exports, __dirname, __filename) {
+function filter (xs, fn) {
+ var res = [];
+ for (var i = 0; i < xs.length; i++) {
+ if (fn(xs[i], i, xs)) res.push(xs[i]);
+ }
+ return res;
+}
+
+// resolves . and .. elements in a path array with directory names there
+// must be no slashes, empty elements, or device names (c:\) in the array
+// (so also no leading and trailing slashes - it does not distinguish
+// relative and absolute paths)
+function normalizeArray(parts, allowAboveRoot) {
+ // if the path tries to go above the root, `up` ends up > 0
+ var up = 0;
+ for (var i = parts.length; i >= 0; i--) {
+ var last = parts[i];
+ if (last == '.') {
+ parts.splice(i, 1);
+ } else if (last === '..') {
+ parts.splice(i, 1);
+ up++;
+ } else if (up) {
+ parts.splice(i, 1);
+ up--;
+ }
+ }
+
+ // if the path is allowed to go above the root, restore leading ..s
+ if (allowAboveRoot) {
+ for (; up--; up) {
+ parts.unshift('..');
+ }
+ }
+
+ return parts;
+}
+
+// Regex to split a filename into [*, dir, basename, ext]
+// posix version
+var splitPathRe = /^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/;
+
+// path.resolve([from ...], to)
+// posix version
+exports.resolve = function() {
+var resolvedPath = '',
+ resolvedAbsolute = false;
+
+for (var i = arguments.length; i >= -1 && !resolvedAbsolute; i--) {
+ var path = (i >= 0)
+ ? arguments[i]
+ : process.cwd();
+
+ // Skip empty and invalid entries
+ if (typeof path !== 'string' || !path) {
+ continue;
+ }
+
+ resolvedPath = path + '/' + resolvedPath;
+ resolvedAbsolute = path.charAt(0) === '/';
+}
+
+// At this point the path should be resolved to a full absolute path, but
+// handle relative paths to be safe (might happen when process.cwd() fails)
+
+// Normalize the path
+resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
+ return !!p;
+ }), !resolvedAbsolute).join('/');
+
+ return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
+};
+
+// path.normalize(path)
+// posix version
+exports.normalize = function(path) {
+var isAbsolute = path.charAt(0) === '/',
+ trailingSlash = path.slice(-1) === '/';
+
+// Normalize the path
+path = normalizeArray(filter(path.split('/'), function(p) {
+ return !!p;
+ }), !isAbsolute).join('/');
+
+ if (!path && !isAbsolute) {
+ path = '.';
+ }
+ if (path && trailingSlash) {
+ path += '/';
+ }
+
+ return (isAbsolute ? '/' : '') + path;
+};
+
+
+// posix version
+exports.join = function() {
+ var paths = Array.prototype.slice.call(arguments, 0);
+ return exports.normalize(filter(paths, function(p, index) {
+ return p && typeof p === 'string';
+ }).join('/'));
+};
+
+
+exports.dirname = function(path) {
+ var dir = splitPathRe.exec(path)[1] || '';
+ var isWindows = false;
+ if (!dir) {
+ // No dirname
+ return '.';
+ } else if (dir.length === 1 ||
+ (isWindows && dir.length <= 3 && dir.charAt(1) === ':')) {
+ // It is just a slash or a drive letter with a slash
+ return dir;
+ } else {
+ // It is a full dirname, strip trailing slash
+ return dir.substring(0, dir.length - 1);
+ }
+};
+
+
+exports.basename = function(path, ext) {
+ var f = splitPathRe.exec(path)[2] || '';
+ // TODO: make this comparison case-insensitive on windows?
+ if (ext && f.substr(-1 * ext.length) === ext) {
+ f = f.substr(0, f.length - ext.length);
+ }
+ return f;
+};
+
+
+exports.extname = function(path) {
+ return splitPathRe.exec(path)[3] || '';
+};
+
+});
+
+require.define("crypto", function (require, module, exports, __dirname, __filename) {
+module.exports = require("crypto-browserify")
+});
+
+require.define("/node_modules/crypto-browserify/package.json", function (require, module, exports, __dirname, __filename) {
+module.exports = {}
+});
+
+require.define("/node_modules/crypto-browserify/index.js", function (require, module, exports, __dirname, __filename) {
+var sha = require('./sha')
+
+var algorithms = {
+ sha1: {
+ hex: sha.hex_sha1,
+ binary: sha.b64_sha1,
+ ascii: sha.str_sha1
+ }
+}
+
+function error () {
+ var m = [].slice.call(arguments).join(' ')
+ throw new Error([
+ m,
+ 'we accept pull requests',
+ 'http://github.com/dominictarr/crypto-browserify'
+ ].join('\n'))
+}
+
+exports.createHash = function (alg) {
+ alg = alg || 'sha1'
+ if(!algorithms[alg])
+ error('algorithm:', alg, 'is not yet supported')
+ var s = ''
+ _alg = algorithms[alg]
+ return {
+ update: function (data) {
+ s += data
+ return this
+ },
+ digest: function (enc) {
+ enc = enc || 'binary'
+ var fn
+ if(!(fn = _alg[enc]))
+ error('encoding:', enc , 'is not yet supported for algorithm', alg)
+ var r = fn(s)
+ s = null //not meant to use the hash after you've called digest.
+ return r
+ }
+ }
+}
+// the least I can do is make error messages for the rest of the node.js/crypto api.
+;['createCredentials'
+, 'createHmac'
+, 'createCypher'
+, 'createCypheriv'
+, 'createDecipher'
+, 'createDecipheriv'
+, 'createSign'
+, 'createVerify'
+, 'createDeffieHellman',
+, 'pbkdf2',
+, 'randomBytes' ].forEach(function (name) {
+ exports[name] = function () {
+ error('sorry,', name, 'is not implemented yet')
+ }
+})
+
+});
+
+require.define("/node_modules/crypto-browserify/sha.js", function (require, module, exports, __dirname, __filename) {
+/*
+ * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
+ * in FIPS PUB 180-1
+ * Version 2.1a Copyright Paul Johnston 2000 - 2002.
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ * Distributed under the BSD License
+ * See http://pajhome.org.uk/crypt/md5 for details.
+ */
+
+exports.hex_sha1 = hex_sha1;
+exports.b64_sha1 = b64_sha1;
+exports.str_sha1 = str_sha1;
+exports.hex_hmac_sha1 = hex_hmac_sha1;
+exports.b64_hmac_sha1 = b64_hmac_sha1;
+exports.str_hmac_sha1 = str_hmac_sha1;
+
+/*
+ * Configurable variables. You may need to tweak these to be compatible with
+ * the server-side, but the defaults work in most cases.
+ */
+var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
+var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */
+var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
+
+/*
+ * These are the functions you'll usually want to call
+ * They take string arguments and return either hex or base-64 encoded strings
+ */
+function hex_sha1(s){return binb2hex(core_sha1(str2binb(s),s.length * chrsz));}
+function b64_sha1(s){return binb2b64(core_sha1(str2binb(s),s.length * chrsz));}
+function str_sha1(s){return binb2str(core_sha1(str2binb(s),s.length * chrsz));}
+function hex_hmac_sha1(key, data){ return binb2hex(core_hmac_sha1(key, data));}
+function b64_hmac_sha1(key, data){ return binb2b64(core_hmac_sha1(key, data));}
+function str_hmac_sha1(key, data){ return binb2str(core_hmac_sha1(key, data));}
+
+/*
+ * Perform a simple self-test to see if the VM is working
+ */
+function sha1_vm_test()
+{
+ return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";
+}
+
+/*
+ * Calculate the SHA-1 of an array of big-endian words, and a bit length
+ */
+function core_sha1(x, len)
+{
+ /* append padding */
+ x[len >> 5] |= 0x80 << (24 - len % 32);
+ x[((len + 64 >> 9) << 4) + 15] = len;
+
+ var w = Array(80);
+ var a = 1732584193;
+ var b = -271733879;
+ var c = -1732584194;
+ var d = 271733878;
+ var e = -1009589776;
+
+ for(var i = 0; i < x.length; i += 16)
+ {
+ var olda = a;
+ var oldb = b;
+ var oldc = c;
+ var oldd = d;
+ var olde = e;
+
+ for(var j = 0; j < 80; j++)
+ {
+ if(j < 16) w[j] = x[i + j];
+ else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
+ var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)),
+ safe_add(safe_add(e, w[j]), sha1_kt(j)));
+ e = d;
+ d = c;
+ c = rol(b, 30);
+ b = a;
+ a = t;
+ }
+
+ a = safe_add(a, olda);
+ b = safe_add(b, oldb);
+ c = safe_add(c, oldc);
+ d = safe_add(d, oldd);
+ e = safe_add(e, olde);
+ }
+ return Array(a, b, c, d, e);
+
+}
+
+/*
+ * Perform the appropriate triplet combination function for the current
+ * iteration
+ */
+function sha1_ft(t, b, c, d)
+{
+ if(t < 20) return (b & c) | ((~b) & d);
+ if(t < 40) return b ^ c ^ d;
+ if(t < 60) return (b & c) | (b & d) | (c & d);
+ return b ^ c ^ d;
+}
+
+/*
+ * Determine the appropriate additive constant for the current iteration
+ */
+function sha1_kt(t)
+{
+ return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
+ (t < 60) ? -1894007588 : -899497514;
+}
+
+/*
+ * Calculate the HMAC-SHA1 of a key and some data
+ */
+function core_hmac_sha1(key, data)
+{
+ var bkey = str2binb(key);
+ if(bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz);
+
+ var ipad = Array(16), opad = Array(16);
+ for(var i = 0; i < 16; i++)
+ {
+ ipad[i] = bkey[i] ^ 0x36363636;
+ opad[i] = bkey[i] ^ 0x5C5C5C5C;
+ }
+
+ var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz);
+ return core_sha1(opad.concat(hash), 512 + 160);
+}
+
+/*
+ * Add integers, wrapping at 2^32. This uses 16-bit operations internally
+ * to work around bugs in some JS interpreters.
+ */
+function safe_add(x, y)
+{
+ var lsw = (x & 0xFFFF) + (y & 0xFFFF);
+ var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+ return (msw << 16) | (lsw & 0xFFFF);
+}
+
+/*
+ * Bitwise rotate a 32-bit number to the left.
+ */
+function rol(num, cnt)
+{
+ return (num << cnt) | (num >>> (32 - cnt));
+}
+
+/*
+ * Convert an 8-bit or 16-bit string to an array of big-endian words
+ * In 8-bit function, characters >255 have their hi-byte silently ignored.
+ */
+function str2binb(str)
+{
+ var bin = Array();
+ var mask = (1 << chrsz) - 1;
+ for(var i = 0; i < str.length * chrsz; i += chrsz)
+ bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - i%32);
+ return bin;
+}
+
+/*
+ * Convert an array of big-endian words to a string
+ */
+function binb2str(bin)
+{
+ var str = "";
+ var mask = (1 << chrsz) - 1;
+ for(var i = 0; i < bin.length * 32; i += chrsz)
+ str += String.fromCharCode((bin[i>>5] >>> (32 - chrsz - i%32)) & mask);
+ return str;
+}
+
+/*
+ * Convert an array of big-endian words to a hex string.
+ */
+function binb2hex(binarray)
+{
+ var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
+ var str = "";
+ for(var i = 0; i < binarray.length * 4; i++)
+ {
+ str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
+ hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF);
+ }
+ return str;
+}
+
+/*
+ * Convert an array of big-endian words to a base-64 string
+ */
+function binb2b64(binarray)
+{
+ var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+ var str = "";
+ for(var i = 0; i < binarray.length * 4; i += 3)
+ {
+ var triplet = (((binarray[i >> 2] >> 8 * (3 - i %4)) & 0xFF) << 16)
+ | (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 )
+ | ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF);
+ for(var j = 0; j < 4; j++)
+ {
+ if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
+ else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
+ }
+ }
+ return str;
+}
+
+
+});
+
+require.define("/test.js", function (require, module, exports, __dirname, __filename) {
+ var crypto = require('crypto')
+var abc = crypto.createHash('sha1').update('abc').digest('hex')
+console.log(abc)
+//require('hello').inlineCall().call2()
+
+});
+require("/test.js");
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/example/index.html b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/example/index.html
new file mode 100644
index 000000000..9d55c6d73
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/example/index.html
@@ -0,0 +1,12 @@
+<!doctype html>
+<html>
+<script src=bundle.js></script>
+<body>
+ <pre>
+ require('crypto').createHash('sha1').update('abc').digest('hex') == '<span id=ans></span>'
+ </pre>
+</body>
+<script>
+ document.getElementById('ans').innerHTML = require('crypto').createHash('sha1').update('abc').digest('hex')
+</script>
+</html>
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/example/test.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/example/test.js
new file mode 100644
index 000000000..f1b0e4a9f
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/example/test.js
@@ -0,0 +1,4 @@
+var crypto = require('crypto')
+var abc = crypto.createHash('sha1').update('abc').digest('hex')
+console.log(abc)
+//require('hello').inlineCall().call2()
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/index.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/index.js
new file mode 100644
index 000000000..c1a77ad34
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/index.js
@@ -0,0 +1,68 @@
+var sha = require('./sha')
+var rng = require('./rng')
+
+var algorithms = {
+ sha1: {
+ hex: sha.hex_sha1,
+ binary: sha.b64_sha1,
+ ascii: sha.str_sha1
+ }
+}
+
+function error () {
+ var m = [].slice.call(arguments).join(' ')
+ throw new Error([
+ m,
+ 'we accept pull requests',
+ 'http://github.com/dominictarr/crypto-browserify'
+ ].join('\n'))
+}
+
+exports.createHash = function (alg) {
+ alg = alg || 'sha1'
+ if(!algorithms[alg])
+ error('algorithm:', alg, 'is not yet supported')
+ var s = ''
+ _alg = algorithms[alg]
+ return {
+ update: function (data) {
+ s += data
+ return this
+ },
+ digest: function (enc) {
+ enc = enc || 'binary'
+ var fn
+ if(!(fn = _alg[enc]))
+ error('encoding:', enc , 'is not yet supported for algorithm', alg)
+ var r = fn(s)
+ s = null //not meant to use the hash after you've called digest.
+ return r
+ }
+ }
+}
+
+exports.randomBytes = function(size, callback) {
+ if (callback && callback.call) {
+ try {
+ callback.call(this, undefined, rng(size));
+ } catch (err) { callback(err); }
+ } else {
+ return rng(size);
+ }
+}
+
+// the least I can do is make error messages for the rest of the node.js/crypto api.
+;['createCredentials'
+, 'createHmac'
+, 'createCypher'
+, 'createCypheriv'
+, 'createDecipher'
+, 'createDecipheriv'
+, 'createSign'
+, 'createVerify'
+, 'createDeffieHellman'
+, 'pbkdf2'].forEach(function (name) {
+ exports[name] = function () {
+ error('sorry,', name, 'is not implemented yet')
+ }
+})
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/package.json b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/package.json
new file mode 100644
index 000000000..19938b60f
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/package.json
@@ -0,0 +1,28 @@
+{
+ "author": {
+ "name": "Dominic Tarr",
+ "email": "dominic.tarr@gmail.com",
+ "url": "dominictarr.com"
+ },
+ "name": "crypto-browserify",
+ "description": "partial implementation of crypto for the browser",
+ "version": "0.1.0",
+ "homepage": "https://github.com/dominictarr/crypto-browserify",
+ "repository": {
+ "url": ""
+ },
+ "scripts": {
+ "test": "node test/simple.js"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "dependencies": {},
+ "devDependencies": {},
+ "optionalDependencies": {},
+ "_id": "crypto-browserify@0.1.0",
+ "dist": {
+ "shasum": "62d7228ac44163a95b42e2bdf92494a42993a6a4"
+ },
+ "_from": "crypto-browserify@~0"
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/readme.markdown b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/readme.markdown
new file mode 100644
index 000000000..2234c531f
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/readme.markdown
@@ -0,0 +1,14 @@
+# crypto-browserify
+
+A (partial) port of `crypto` to the browser.
+
+Basically, I found some crypto implemented in JS lieing on the internet somewhere
+and wrapped it in the part of the `crypto` api that I am currently using.
+
+In a way that will be compatible with [browserify](https://github.com/substack/node-browserify/).
+
+I will extend this if I need more features, or if anyone else wants to extend this,
+I will add you as a maintainer.
+
+Provided that you agree that it should replicate the [node.js/crypto](http://nodejs.org/api/crypto.html) api exactly, of course.
+
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/rng.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/rng.js
new file mode 100644
index 000000000..2160788a1
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/rng.js
@@ -0,0 +1,37 @@
+// Original code adapted from Robert Kieffer.
+// details at https://github.com/broofa/node-uuid
+(function() {
+ var _global = this;
+
+ var mathRNG, whatwgRNG;
+
+ // NOTE: Math.random() does not guarantee "cryptographic quality"
+ mathRNG = function(size) {
+ var bytes = new Array(size);
+ var r;
+
+ for (var i = 0, r; i < size; i++) {
+ if ((i & 0x03) == 0) r = Math.random() * 0x100000000;
+ bytes[i] = r >>> ((i & 0x03) << 3) & 0xff;
+ }
+
+ return bytes;
+ }
+
+ // currently only available in webkit-based browsers.
+ if (_global.crypto && crypto.getRandomValues) {
+ var _rnds = new Uint32Array(4);
+ whatwgRNG = function(size) {
+ var bytes = new Array(size);
+ crypto.getRandomValues(_rnds);
+
+ for (var c = 0 ; c < size; c++) {
+ bytes[c] = _rnds[c >> 2] >>> ((c & 0x03) * 8) & 0xff;
+ }
+ return bytes;
+ }
+ }
+
+ module.exports = whatwgRNG || mathRNG;
+
+}()) \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/sha.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/sha.js
new file mode 100644
index 000000000..4f9cc3e97
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/sha.js
@@ -0,0 +1,210 @@
+/*
+ * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
+ * in FIPS PUB 180-1
+ * Version 2.1a Copyright Paul Johnston 2000 - 2002.
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ * Distributed under the BSD License
+ * See http://pajhome.org.uk/crypt/md5 for details.
+ */
+
+exports.hex_sha1 = hex_sha1;
+exports.b64_sha1 = b64_sha1;
+exports.str_sha1 = str_sha1;
+exports.hex_hmac_sha1 = hex_hmac_sha1;
+exports.b64_hmac_sha1 = b64_hmac_sha1;
+exports.str_hmac_sha1 = str_hmac_sha1;
+
+/*
+ * Configurable variables. You may need to tweak these to be compatible with
+ * the server-side, but the defaults work in most cases.
+ */
+var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
+var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */
+var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
+
+/*
+ * These are the functions you'll usually want to call
+ * They take string arguments and return either hex or base-64 encoded strings
+ */
+function hex_sha1(s){return binb2hex(core_sha1(str2binb(s),s.length * chrsz));}
+function b64_sha1(s){return binb2b64(core_sha1(str2binb(s),s.length * chrsz));}
+function str_sha1(s){return binb2str(core_sha1(str2binb(s),s.length * chrsz));}
+function hex_hmac_sha1(key, data){ return binb2hex(core_hmac_sha1(key, data));}
+function b64_hmac_sha1(key, data){ return binb2b64(core_hmac_sha1(key, data));}
+function str_hmac_sha1(key, data){ return binb2str(core_hmac_sha1(key, data));}
+
+/*
+ * Perform a simple self-test to see if the VM is working
+ */
+function sha1_vm_test()
+{
+ return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";
+}
+
+/*
+ * Calculate the SHA-1 of an array of big-endian words, and a bit length
+ */
+function core_sha1(x, len)
+{
+ /* append padding */
+ x[len >> 5] |= 0x80 << (24 - len % 32);
+ x[((len + 64 >> 9) << 4) + 15] = len;
+
+ var w = Array(80);
+ var a = 1732584193;
+ var b = -271733879;
+ var c = -1732584194;
+ var d = 271733878;
+ var e = -1009589776;
+
+ for(var i = 0; i < x.length; i += 16)
+ {
+ var olda = a;
+ var oldb = b;
+ var oldc = c;
+ var oldd = d;
+ var olde = e;
+
+ for(var j = 0; j < 80; j++)
+ {
+ if(j < 16) w[j] = x[i + j];
+ else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1);
+ var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)),
+ safe_add(safe_add(e, w[j]), sha1_kt(j)));
+ e = d;
+ d = c;
+ c = rol(b, 30);
+ b = a;
+ a = t;
+ }
+
+ a = safe_add(a, olda);
+ b = safe_add(b, oldb);
+ c = safe_add(c, oldc);
+ d = safe_add(d, oldd);
+ e = safe_add(e, olde);
+ }
+ return Array(a, b, c, d, e);
+
+}
+
+/*
+ * Perform the appropriate triplet combination function for the current
+ * iteration
+ */
+function sha1_ft(t, b, c, d)
+{
+ if(t < 20) return (b & c) | ((~b) & d);
+ if(t < 40) return b ^ c ^ d;
+ if(t < 60) return (b & c) | (b & d) | (c & d);
+ return b ^ c ^ d;
+}
+
+/*
+ * Determine the appropriate additive constant for the current iteration
+ */
+function sha1_kt(t)
+{
+ return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
+ (t < 60) ? -1894007588 : -899497514;
+}
+
+/*
+ * Calculate the HMAC-SHA1 of a key and some data
+ */
+function core_hmac_sha1(key, data)
+{
+ var bkey = str2binb(key);
+ if(bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz);
+
+ var ipad = Array(16), opad = Array(16);
+ for(var i = 0; i < 16; i++)
+ {
+ ipad[i] = bkey[i] ^ 0x36363636;
+ opad[i] = bkey[i] ^ 0x5C5C5C5C;
+ }
+
+ var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz);
+ return core_sha1(opad.concat(hash), 512 + 160);
+}
+
+/*
+ * Add integers, wrapping at 2^32. This uses 16-bit operations internally
+ * to work around bugs in some JS interpreters.
+ */
+function safe_add(x, y)
+{
+ var lsw = (x & 0xFFFF) + (y & 0xFFFF);
+ var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+ return (msw << 16) | (lsw & 0xFFFF);
+}
+
+/*
+ * Bitwise rotate a 32-bit number to the left.
+ */
+function rol(num, cnt)
+{
+ return (num << cnt) | (num >>> (32 - cnt));
+}
+
+/*
+ * Convert an 8-bit or 16-bit string to an array of big-endian words
+ * In 8-bit function, characters >255 have their hi-byte silently ignored.
+ */
+function str2binb(str)
+{
+ var bin = Array();
+ var mask = (1 << chrsz) - 1;
+ for(var i = 0; i < str.length * chrsz; i += chrsz)
+ bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - i%32);
+ return bin;
+}
+
+/*
+ * Convert an array of big-endian words to a string
+ */
+function binb2str(bin)
+{
+ var str = "";
+ var mask = (1 << chrsz) - 1;
+ for(var i = 0; i < bin.length * 32; i += chrsz)
+ str += String.fromCharCode((bin[i>>5] >>> (32 - chrsz - i%32)) & mask);
+ return str;
+}
+
+/*
+ * Convert an array of big-endian words to a hex string.
+ */
+function binb2hex(binarray)
+{
+ var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
+ var str = "";
+ for(var i = 0; i < binarray.length * 4; i++)
+ {
+ str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
+ hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF);
+ }
+ return str;
+}
+
+/*
+ * Convert an array of big-endian words to a base-64 string
+ */
+function binb2b64(binarray)
+{
+ var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+ var str = "";
+ for(var i = 0; i < binarray.length * 4; i += 3)
+ {
+ var triplet = (((binarray[i >> 2] >> 8 * (3 - i %4)) & 0xFF) << 16)
+ | (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 )
+ | ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF);
+ for(var j = 0; j < 4; j++)
+ {
+ if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
+ else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
+ }
+ }
+ return str;
+}
+
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/test/simple.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/test/simple.js
new file mode 100644
index 000000000..2b0b994c9
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/crypto-browserify/test/simple.js
@@ -0,0 +1,25 @@
+var crypto = require('crypto')
+var cryptoB = require('../')
+var assert = require('assert')
+
+
+function assertSame (fn) {
+ fn(crypto, function (err, expected) {
+ fn(cryptoB, function (err, actual) {
+ assert.equal(actual, expected)
+ })
+ })
+}
+
+assertSame(function (crypto, cb) {
+ cb(null, crypto.createHash('sha1').update('hello', 'utf-8').digest('hex'))
+})
+
+assert.equal(cryptoB.randomBytes(10).length, 10)
+
+cryptoB.randomBytes(10, function(ex, bytes) {
+ assert.ifError(ex)
+ bytes.forEach(function(bite) {
+ assert.equal(typeof bite, 'number')
+ });
+}) \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/.travis.yml b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/.travis.yml
new file mode 100644
index 000000000..f1d0f13c8
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+ - 0.4
+ - 0.6
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/README.markdown b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/README.markdown
new file mode 100644
index 000000000..72ca69f85
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/README.markdown
@@ -0,0 +1,55 @@
+deputy
+======
+
+This module is a caching layer around
+[node-detective](http://github.com/substack/node-detective).
+
+[![build status](https://secure.travis-ci.org/substack/node-deputy.png)](http://travis-ci.org/substack/node-deputy)
+
+example
+=======
+
+cache.js
+--------
+
+``` js
+var deputy = require('deputy');
+var detective = deputy(process.env.HOME + '/.config/deputy.json');
+
+var deps = detective.find('require("a"); require("b")');
+console.dir(deps);
+```
+
+output:
+
+```
+$ node cache.js
+{ strings: [ 'a', 'b' ], expressions: [] }
+$ cat ~/.config/deputy.json
+{"55952d490bd28e3e256f0b036ced834d":{"strings":["a","b"],"expressions":[]}}
+```
+
+methods
+=======
+
+``` js
+var deputy = require('deputy')
+```
+
+var detective = deputy(cacheFile)
+---------------------------------
+
+Return a new [detective](http://github.com/substack/node-detective)
+object using `cacheFile` for caching.
+
+install
+=======
+
+With [npm](http://npmjs.org) do:
+
+ npm install deputy
+
+license
+=======
+
+MIT/X11
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/example/cache.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/example/cache.js
new file mode 100644
index 000000000..8016b04b4
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/example/cache.js
@@ -0,0 +1,5 @@
+var deputy = require('deputy');
+var detective = deputy(process.env.HOME + '/.config/deputy.json');
+
+var deps = detective.find('require("a"); require("b")');
+console.dir(deps);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/index.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/index.js
new file mode 100644
index 000000000..5dd71bb77
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/index.js
@@ -0,0 +1,45 @@
+var fs = require('fs');
+var path = require('path');
+var crypto = require('crypto');
+
+var mkdirp = require('mkdirp');
+var detective = require('detective');
+
+module.exports = function (cacheFile) {
+ mkdirp.sync(path.dirname(cacheFile), 0700);
+
+ var cache = {};
+ if (path.existsSync(cacheFile)) {
+ var body = fs.readFileSync(cacheFile);
+ try {
+ cache = JSON.parse(body);
+ }
+ catch (err) {}
+ }
+
+ function save (h, res) {
+ cache[h] = res;
+ fs.writeFileSync(cacheFile, JSON.stringify(cache));
+ }
+
+ function hash (src) {
+ return new crypto.Hash('md5').update(src).digest('hex');
+ }
+
+ var deputy = function (src) {
+ return deputy.find(src).strings;
+ };
+
+ deputy.find = function (src) {
+ var h = hash(src);
+ var c = cache[h];
+ if (c) return c;
+ else {
+ c = detective.find(src);
+ save(h, c);
+ return c;
+ }
+ };
+
+ return deputy;
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/.gitignore.orig b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/.gitignore.orig
new file mode 100644
index 000000000..9303c347e
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/.gitignore.orig
@@ -0,0 +1,2 @@
+node_modules/
+npm-debug.log \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/.gitignore.rej b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/.gitignore.rej
new file mode 100644
index 000000000..69244ff87
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/.gitignore.rej
@@ -0,0 +1,5 @@
+--- /dev/null
++++ .gitignore
+@@ -0,0 +1,2 @@
++node_modules/
++npm-debug.log \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/.npmignore b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/.npmignore
new file mode 100644
index 000000000..9303c347e
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/.npmignore
@@ -0,0 +1,2 @@
+node_modules/
+npm-debug.log \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/.travis.yml b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/.travis.yml
new file mode 100644
index 000000000..f1d0f13c8
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+ - 0.4
+ - 0.6
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/LICENSE b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/LICENSE
new file mode 100644
index 000000000..432d1aeb0
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/LICENSE
@@ -0,0 +1,21 @@
+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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/README.markdown b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/README.markdown
new file mode 100644
index 000000000..40de04f71
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/README.markdown
@@ -0,0 +1,61 @@
+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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/examples/pow.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/examples/pow.js
new file mode 100644
index 000000000..e6924212e
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/examples/pow.js
@@ -0,0 +1,6 @@
+var mkdirp = require('mkdirp');
+
+mkdirp('/tmp/foo/bar/baz', function (err) {
+ if (err) console.error(err)
+ else console.log('pow!')
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/examples/pow.js.orig b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/examples/pow.js.orig
new file mode 100644
index 000000000..774146221
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/examples/pow.js.orig
@@ -0,0 +1,6 @@
+var mkdirp = require('mkdirp');
+
+mkdirp('/tmp/foo/bar/baz', 0755, function (err) {
+ if (err) console.error(err)
+ else console.log('pow!')
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/examples/pow.js.rej b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/examples/pow.js.rej
new file mode 100644
index 000000000..81e7f4311
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/examples/pow.js.rej
@@ -0,0 +1,19 @@
+--- 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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/index.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/index.js
new file mode 100644
index 000000000..874b31095
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/index.js
@@ -0,0 +1,94 @@
+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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/package.json b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/package.json
new file mode 100644
index 000000000..68dca958f
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/package.json
@@ -0,0 +1,32 @@
+{
+ "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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/chmod.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/chmod.js
new file mode 100644
index 000000000..520dcb8e9
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/chmod.js
@@ -0,0 +1,38 @@
+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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/clobber.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/clobber.js
new file mode 100644
index 000000000..0eb709987
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/clobber.js
@@ -0,0 +1,37 @@
+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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/mkdirp.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/mkdirp.js
new file mode 100644
index 000000000..b07cd70c1
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/mkdirp.js
@@ -0,0 +1,28 @@
+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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/perm.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/perm.js
new file mode 100644
index 000000000..23a7abbd2
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/perm.js
@@ -0,0 +1,32 @@
+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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/perm_sync.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/perm_sync.js
new file mode 100644
index 000000000..f685f6090
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/perm_sync.js
@@ -0,0 +1,39 @@
+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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/race.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/race.js
new file mode 100644
index 000000000..96a044763
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/race.js
@@ -0,0 +1,41 @@
+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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/rel.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/rel.js
new file mode 100644
index 000000000..79858243a
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/rel.js
@@ -0,0 +1,32 @@
+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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/return.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/return.js
new file mode 100644
index 000000000..bce68e561
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/return.js
@@ -0,0 +1,25 @@
+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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/return_sync.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/return_sync.js
new file mode 100644
index 000000000..7c222d355
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/return_sync.js
@@ -0,0 +1,24 @@
+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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/root.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/root.js
new file mode 100644
index 000000000..97ad7a2f3
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/root.js
@@ -0,0 +1,18 @@
+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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/sync.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/sync.js
new file mode 100644
index 000000000..7530cada8
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/sync.js
@@ -0,0 +1,32 @@
+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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/umask.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/umask.js
new file mode 100644
index 000000000..64ccafe22
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/umask.js
@@ -0,0 +1,28 @@
+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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/umask_sync.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/umask_sync.js
new file mode 100644
index 000000000..35bd5cbbf
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/umask_sync.js
@@ -0,0 +1,32 @@
+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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/package.json b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/package.json
new file mode 100644
index 000000000..af7b9998d
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/package.json
@@ -0,0 +1,45 @@
+{
+ "name": "deputy",
+ "description": "caching layer for detective",
+ "version": "0.0.2",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/substack/node-deputy.git"
+ },
+ "main": "index.js",
+ "keywords": [
+ "detective",
+ "require",
+ "cache"
+ ],
+ "directories": {
+ "lib": ".",
+ "example": "example",
+ "test": "test"
+ },
+ "scripts": {
+ "test": "tap test/*.js"
+ },
+ "dependencies": {
+ "mkdirp": "~0.3.3",
+ "detective": "~0.1.1"
+ },
+ "devDependencies": {
+ "tap": "0.0.x"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ },
+ "license": "MIT",
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "readme": "deputy\n======\n\nThis module is a caching layer around\n[node-detective](http://github.com/substack/node-detective).\n\n[![build status](https://secure.travis-ci.org/substack/node-deputy.png)](http://travis-ci.org/substack/node-deputy)\n\nexample\n=======\n\ncache.js\n--------\n\n``` js\nvar deputy = require('deputy');\nvar detective = deputy(process.env.HOME + '/.config/deputy.json');\n\nvar deps = detective.find('require(\"a\"); require(\"b\")');\nconsole.dir(deps);\n```\n\noutput:\n\n```\n$ node cache.js \n{ strings: [ 'a', 'b' ], expressions: [] }\n$ cat ~/.config/deputy.json \n{\"55952d490bd28e3e256f0b036ced834d\":{\"strings\":[\"a\",\"b\"],\"expressions\":[]}}\n```\n\nmethods\n=======\n\n``` js\nvar deputy = require('deputy')\n```\n\nvar detective = deputy(cacheFile)\n---------------------------------\n\nReturn a new [detective](http://github.com/substack/node-detective)\nobject using `cacheFile` for caching.\n\ninstall\n=======\n\nWith [npm](http://npmjs.org) do:\n\n npm install deputy\n\nlicense\n=======\n\nMIT/X11\n",
+ "_id": "deputy@0.0.2",
+ "dist": {
+ "shasum": "608a253be073b7e9cec9ec2ea2d6eca542f8fa84"
+ },
+ "_from": "deputy@~0.0.0"
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/test/cache.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/test/cache.js
new file mode 100644
index 000000000..436fe7c83
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/deputy/test/cache.js
@@ -0,0 +1,58 @@
+var test = require('tap').test;
+var deputy = require('../');
+var fs = require('fs');
+var crypto = require('crypto');
+
+test('cache with new file', function (t) {
+ t.plan(4);
+
+ var ps = []; for (var i = 0; i < 10; i++) {
+ ps.push(Math.floor(Math.random() * (1<<30)).toString(16));
+ }
+ var file = '/tmp/' + ps.join('/') + '.json';
+ var detective = deputy(file);
+
+ var src = [
+ [
+ 'require("a"); require("b")',
+ { strings : ['a','b'], expressions : [] }
+ ],
+ [
+ 'require("x"); require(x+1)',
+ { strings : [ 'x' ], expressions : [ 'x+1' ] }
+ ]
+ ];
+
+ t.deepEqual(detective.find(src[0][0]), src[0][1]);
+ setTimeout(firstFile, 100);
+
+ function compareSources (ix, cb) {
+ fs.readFile(file, function (err, body) {
+ t.deepEqual(
+ src.slice(0,ix).reduce(function (acc,s) {
+ acc[hash(s[0])] = s[1];
+ return acc;
+ }, {}),
+ JSON.parse(body)
+ );
+ cb();
+ });
+ }
+
+ function firstFile () {
+ compareSources(1, function () {
+ t.deepEqual(detective.find(src[1][0]), src[1][1]);
+ setTimeout(secondFile, 100);
+ });
+ }
+
+ function secondFile () {
+ compareSources(2, function () {
+ t.end();
+ });
+ }
+
+ function hash (src) {
+ return new crypto.Hash('md5').update(src).digest('hex');
+ }
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/.travis.yml b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/.travis.yml
new file mode 100644
index 000000000..f1d0f13c8
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+ - 0.4
+ - 0.6
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/README.markdown b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/README.markdown
new file mode 100644
index 000000000..90ffa1ac2
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/README.markdown
@@ -0,0 +1,64 @@
+detective
+=========
+
+Find all calls to require() no matter how crazily nested using a proper walk of
+the AST.
+
+example
+=======
+
+strings
+-------
+
+strings_src.js:
+
+````javascript
+var a = require('a');
+var b = require('b');
+var c = require('c');
+````
+
+strings.js:
+
+````javascript
+var detective = require('detective');
+var fs = require('fs');
+
+var src = fs.readFileSync(__dirname + '/strings_src.js');
+var requires = detective(src);
+console.dir(requires);
+````
+
+output:
+
+ $ node examples/strings.js
+ [ 'a', 'b', 'c' ]
+
+methods
+=======
+
+var detective = require('detective');
+
+detective(src, opts)
+--------------------
+
+Give some source body `src`, return an array of all the require()s with string
+arguments.
+
+The options parameter `opts` is passed along to `detective.find()`.
+
+detective.find(src, opts)
+-------------------------
+
+Give some source body `src`, return an object with "strings" and "expressions"
+arrays for each of the require() calls.
+
+The "expressions" array will contain the stringified expressions.
+
+Optionally you can specify a different function besides `"require"` to analyze
+with `opts.word`.
+
+installation
+============
+
+ npm install detective
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/example/strings.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/example/strings.js
new file mode 100644
index 000000000..c176e7ffa
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/example/strings.js
@@ -0,0 +1,6 @@
+var detective = require('detective');
+var fs = require('fs');
+
+var src = fs.readFileSync(__dirname + '/strings_src.js');
+var requires = detective(src);
+console.dir(requires);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/example/strings_src.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/example/strings_src.js
new file mode 100644
index 000000000..88d083276
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/example/strings_src.js
@@ -0,0 +1,3 @@
+var a = require('a');
+var b = require('b');
+var c = require('c');
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/index.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/index.js
new file mode 100644
index 000000000..8df935836
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/index.js
@@ -0,0 +1,56 @@
+var uglify = require('uglify-js');
+
+var traverse = function (node, cb, parent, grandparent) {
+ // Call cb on all good AST nodes.
+ if (Array.isArray(node) && node[0]
+ && typeof node[0] === 'object' && node[0].name) {
+ cb({ name : node[0].name, value : node.slice(1) , grandparent: grandparent});
+ }
+
+ // Traverse down the tree on arrays and objects.
+ if (Array.isArray(node)
+ || Object.prototype.toString.call(node) === "[object Object]") {
+ for (var key in node) traverse(node[key], cb, node, parent);
+ }
+};
+
+var walk = function (src, cb) {
+ var ast = uglify.parser.parse(src.toString(), false, true);
+ traverse(ast, cb);
+};
+
+var deparse = function (ast) {
+ return uglify.uglify.gen_code(ast);
+};
+
+var exports = module.exports = function (src, opts) {
+ return exports.find(src, opts).strings;
+};
+
+exports.find = function (src, opts) {
+ if (!opts) opts = {};
+ var word = opts.word === undefined ? 'require' : opts.word;
+
+ var modules = { strings : [], expressions : [] };
+
+ if (src.toString().indexOf(word) == -1) return modules;
+
+ walk(src, function (node) {
+ var gp = node.grandparent;
+ var isRequire = Array.isArray(gp)
+ && gp[0]
+ && (gp[0] === 'call' || gp[0].name === 'call')
+ && gp[1][0] === 'name'
+ && gp[1][1] === word
+ ;
+ if(isRequire) {
+ if(node.name === 'string') {
+ modules.strings.push(node.value[0]);
+ } else {
+ modules.expressions.push(deparse(gp[2][0]));
+ }
+ }
+ });
+
+ return modules;
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/.npmignore b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/.npmignore
new file mode 100644
index 000000000..d97eaa09b
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/.npmignore
@@ -0,0 +1,4 @@
+.DS_Store
+.tmp*~
+*.local.*
+.pinf-* \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/README.html b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/README.html
new file mode 100644
index 000000000..5f37ac0f0
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/README.html
@@ -0,0 +1,981 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+lang="en" xml:lang="en">
+<head>
+<title>UglifyJS &ndash; a JavaScript parser/compressor/beautifier</title>
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
+<meta name="generator" content="Org-mode"/>
+<meta name="generated" content="2011-12-09 14:59:08 EET"/>
+<meta name="author" content="Mihai Bazon"/>
+<meta name="description" content="a JavaScript parser/compressor/beautifier in JavaScript"/>
+<meta name="keywords" content="javascript, js, parser, compiler, compressor, mangle, minify, minifier"/>
+<style type="text/css">
+ <!--/*--><![CDATA[/*><!--*/
+ html { font-family: Times, serif; font-size: 12pt; }
+ .title { text-align: center; }
+ .todo { color: red; }
+ .done { color: green; }
+ .tag { background-color: #add8e6; font-weight:normal }
+ .target { }
+ .timestamp { color: #bebebe; }
+ .timestamp-kwd { color: #5f9ea0; }
+ .right {margin-left:auto; margin-right:0px; text-align:right;}
+ .left {margin-left:0px; margin-right:auto; text-align:left;}
+ .center {margin-left:auto; margin-right:auto; text-align:center;}
+ p.verse { margin-left: 3% }
+ pre {
+ border: 1pt solid #AEBDCC;
+ background-color: #F3F5F7;
+ padding: 5pt;
+ font-family: courier, monospace;
+ font-size: 90%;
+ overflow:auto;
+ }
+ table { border-collapse: collapse; }
+ td, th { vertical-align: top; }
+ th.right { text-align:center; }
+ th.left { text-align:center; }
+ th.center { text-align:center; }
+ td.right { text-align:right; }
+ td.left { text-align:left; }
+ td.center { text-align:center; }
+ dt { font-weight: bold; }
+ div.figure { padding: 0.5em; }
+ div.figure p { text-align: center; }
+ div.inlinetask {
+ padding:10px;
+ border:2px solid gray;
+ margin:10px;
+ background: #ffffcc;
+ }
+ textarea { overflow-x: auto; }
+ .linenr { font-size:smaller }
+ .code-highlighted {background-color:#ffff00;}
+ .org-info-js_info-navigation { border-style:none; }
+ #org-info-js_console-label { font-size:10px; font-weight:bold;
+ white-space:nowrap; }
+ .org-info-js_search-highlight {background-color:#ffff00; color:#000000;
+ font-weight:bold; }
+ /*]]>*/-->
+</style>
+<link rel="stylesheet" type="text/css" href="docstyle.css" />
+<script type="text/javascript">
+<!--/*--><![CDATA[/*><!--*/
+ function CodeHighlightOn(elem, id)
+ {
+ var target = document.getElementById(id);
+ if(null != target) {
+ elem.cacheClassElem = elem.className;
+ elem.cacheClassTarget = target.className;
+ target.className = "code-highlighted";
+ elem.className = "code-highlighted";
+ }
+ }
+ function CodeHighlightOff(elem, id)
+ {
+ var target = document.getElementById(id);
+ if(elem.cacheClassElem)
+ elem.className = elem.cacheClassElem;
+ if(elem.cacheClassTarget)
+ target.className = elem.cacheClassTarget;
+ }
+/*]]>*///-->
+</script>
+
+</head>
+<body>
+
+<div id="preamble">
+
+</div>
+
+<div id="content">
+<h1 class="title">UglifyJS &ndash; a JavaScript parser/compressor/beautifier</h1>
+
+
+<div id="table-of-contents">
+<h2>Table of Contents</h2>
+<div id="text-table-of-contents">
+<ul>
+<li><a href="#sec-1">1 UglifyJS &mdash; a JavaScript parser/compressor/beautifier </a>
+<ul>
+<li><a href="#sec-1-1">1.1 Unsafe transformations </a>
+<ul>
+<li><a href="#sec-1-1-1">1.1.1 Calls involving the global Array constructor </a></li>
+<li><a href="#sec-1-1-2">1.1.2 <code>obj.toString()</code> ==&gt; <code>obj+“”</code> </a></li>
+</ul>
+</li>
+<li><a href="#sec-1-2">1.2 Install (NPM) </a></li>
+<li><a href="#sec-1-3">1.3 Install latest code from GitHub </a></li>
+<li><a href="#sec-1-4">1.4 Usage </a>
+<ul>
+<li><a href="#sec-1-4-1">1.4.1 API </a></li>
+<li><a href="#sec-1-4-2">1.4.2 Beautifier shortcoming &ndash; no more comments </a></li>
+<li><a href="#sec-1-4-3">1.4.3 Use as a code pre-processor </a></li>
+</ul>
+</li>
+<li><a href="#sec-1-5">1.5 Compression &ndash; how good is it? </a></li>
+<li><a href="#sec-1-6">1.6 Bugs? </a></li>
+<li><a href="#sec-1-7">1.7 Links </a></li>
+<li><a href="#sec-1-8">1.8 License </a></li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+
+<div id="outline-container-1" class="outline-2">
+<h2 id="sec-1"><span class="section-number-2">1</span> UglifyJS &mdash; a JavaScript parser/compressor/beautifier </h2>
+<div class="outline-text-2" id="text-1">
+
+
+<p>
+This package implements a general-purpose JavaScript
+parser/compressor/beautifier toolkit. It is developed on <a href="http://nodejs.org/">NodeJS</a>, but it
+should work on any JavaScript platform supporting the CommonJS module system
+(and if your platform of choice doesn't support CommonJS, you can easily
+implement it, or discard the <code>exports.*</code> lines from UglifyJS sources).
+</p>
+<p>
+The tokenizer/parser generates an abstract syntax tree from JS code. You
+can then traverse the AST to learn more about the code, or do various
+manipulations on it. This part is implemented in <a href="../lib/parse-js.js">parse-js.js</a> and it's a
+port to JavaScript of the excellent <a href="http://marijn.haverbeke.nl/parse-js/">parse-js</a> Common Lisp library from <a href="http://marijn.haverbeke.nl/">Marijn Haverbeke</a>.
+</p>
+<p>
+( See <a href="http://github.com/mishoo/cl-uglify-js">cl-uglify-js</a> if you're looking for the Common Lisp version of
+UglifyJS. )
+</p>
+<p>
+The second part of this package, implemented in <a href="../lib/process.js">process.js</a>, inspects and
+manipulates the AST generated by the parser to provide the following:
+</p>
+<ul>
+<li>ability to re-generate JavaScript code from the AST. Optionally
+ indented&mdash;you can use this if you want to “beautify” a program that has
+ been compressed, so that you can inspect the source. But you can also run
+ our code generator to print out an AST without any whitespace, so you
+ achieve compression as well.
+
+</li>
+<li>shorten variable names (usually to single characters). Our mangler will
+ analyze the code and generate proper variable names, depending on scope
+ and usage, and is smart enough to deal with globals defined elsewhere, or
+ with <code>eval()</code> calls or <code>with{}</code> statements. In short, if <code>eval()</code> or
+ <code>with{}</code> are used in some scope, then all variables in that scope and any
+ variables in the parent scopes will remain unmangled, and any references
+ to such variables remain unmangled as well.
+
+</li>
+<li>various small optimizations that may lead to faster code but certainly
+ lead to smaller code. Where possible, we do the following:
+
+<ul>
+<li>foo["bar"] ==&gt; foo.bar
+
+</li>
+<li>remove block brackets <code>{}</code>
+
+</li>
+<li>join consecutive var declarations:
+ var a = 10; var b = 20; ==&gt; var a=10,b=20;
+
+</li>
+<li>resolve simple constant expressions: 1 +2 * 3 ==&gt; 7. We only do the
+ replacement if the result occupies less bytes; for example 1/3 would
+ translate to 0.333333333333, so in this case we don't replace it.
+
+</li>
+<li>consecutive statements in blocks are merged into a sequence; in many
+ cases, this leaves blocks with a single statement, so then we can remove
+ the block brackets.
+
+</li>
+<li>various optimizations for IF statements:
+
+<ul>
+<li>if (foo) bar(); else baz(); ==&gt; foo?bar():baz();
+</li>
+<li>if (!foo) bar(); else baz(); ==&gt; foo?baz():bar();
+</li>
+<li>if (foo) bar(); ==&gt; foo&amp;&amp;bar();
+</li>
+<li>if (!foo) bar(); ==&gt; foo||bar();
+</li>
+<li>if (foo) return bar(); else return baz(); ==&gt; return foo?bar():baz();
+</li>
+<li>if (foo) return bar(); else something(); ==&gt; {if(foo)return bar();something()}
+
+</li>
+</ul>
+
+</li>
+<li>remove some unreachable code and warn about it (code that follows a
+ <code>return</code>, <code>throw</code>, <code>break</code> or <code>continue</code> statement, except
+ function/variable declarations).
+
+</li>
+<li>act a limited version of a pre-processor (c.f. the pre-processor of
+ C/C++) to allow you to safely replace selected global symbols with
+ specified values. When combined with the optimisations above this can
+ make UglifyJS operate slightly more like a compilation process, in
+ that when certain symbols are replaced by constant values, entire code
+ blocks may be optimised away as unreachable.
+</li>
+</ul>
+
+</li>
+</ul>
+
+
+
+</div>
+
+<div id="outline-container-1-1" class="outline-3">
+<h3 id="sec-1-1"><span class="section-number-3">1.1</span> <span class="target">Unsafe transformations</span> </h3>
+<div class="outline-text-3" id="text-1-1">
+
+
+<p>
+The following transformations can in theory break code, although they're
+probably safe in most practical cases. To enable them you need to pass the
+<code>--unsafe</code> flag.
+</p>
+
+</div>
+
+<div id="outline-container-1-1-1" class="outline-4">
+<h4 id="sec-1-1-1"><span class="section-number-4">1.1.1</span> Calls involving the global Array constructor </h4>
+<div class="outline-text-4" id="text-1-1-1">
+
+
+<p>
+The following transformations occur:
+</p>
+
+
+
+<pre class="src src-js"><span class="org-keyword">new</span> <span class="org-type">Array</span>(1, 2, 3, 4) =&gt; [1,2,3,4]
+Array(a, b, c) =&gt; [a,b,c]
+<span class="org-keyword">new</span> <span class="org-type">Array</span>(5) =&gt; Array(5)
+<span class="org-keyword">new</span> <span class="org-type">Array</span>(a) =&gt; Array(a)
+</pre>
+
+
+<p>
+These are all safe if the Array name isn't redefined. JavaScript does allow
+one to globally redefine Array (and pretty much everything, in fact) but I
+personally don't see why would anyone do that.
+</p>
+<p>
+UglifyJS does handle the case where Array is redefined locally, or even
+globally but with a <code>function</code> or <code>var</code> declaration. Therefore, in the
+following cases UglifyJS <b>doesn't touch</b> calls or instantiations of Array:
+</p>
+
+
+
+<pre class="src src-js"><span class="org-comment-delimiter">// </span><span class="org-comment">case 1. globally declared variable</span>
+ <span class="org-keyword">var</span> <span class="org-variable-name">Array</span>;
+ <span class="org-keyword">new</span> <span class="org-type">Array</span>(1, 2, 3);
+ Array(a, b);
+
+ <span class="org-comment-delimiter">// </span><span class="org-comment">or (can be declared later)</span>
+ <span class="org-keyword">new</span> <span class="org-type">Array</span>(1, 2, 3);
+ <span class="org-keyword">var</span> <span class="org-variable-name">Array</span>;
+
+ <span class="org-comment-delimiter">// </span><span class="org-comment">or (can be a function)</span>
+ <span class="org-keyword">new</span> <span class="org-type">Array</span>(1, 2, 3);
+ <span class="org-keyword">function</span> <span class="org-function-name">Array</span>() { ... }
+
+<span class="org-comment-delimiter">// </span><span class="org-comment">case 2. declared in a function</span>
+ (<span class="org-keyword">function</span>(){
+ a = <span class="org-keyword">new</span> <span class="org-type">Array</span>(1, 2, 3);
+ b = Array(5, 6);
+ <span class="org-keyword">var</span> <span class="org-variable-name">Array</span>;
+ })();
+
+ <span class="org-comment-delimiter">// </span><span class="org-comment">or</span>
+ (<span class="org-keyword">function</span>(<span class="org-variable-name">Array</span>){
+ <span class="org-keyword">return</span> Array(5, 6, 7);
+ })();
+
+ <span class="org-comment-delimiter">// </span><span class="org-comment">or</span>
+ (<span class="org-keyword">function</span>(){
+ <span class="org-keyword">return</span> <span class="org-keyword">new</span> <span class="org-type">Array</span>(1, 2, 3, 4);
+ <span class="org-keyword">function</span> <span class="org-function-name">Array</span>() { ... }
+ })();
+
+ <span class="org-comment-delimiter">// </span><span class="org-comment">etc.</span>
+</pre>
+
+
+</div>
+
+</div>
+
+<div id="outline-container-1-1-2" class="outline-4">
+<h4 id="sec-1-1-2"><span class="section-number-4">1.1.2</span> <code>obj.toString()</code> ==&gt; <code>obj+“”</code> </h4>
+<div class="outline-text-4" id="text-1-1-2">
+
+
+</div>
+</div>
+
+</div>
+
+<div id="outline-container-1-2" class="outline-3">
+<h3 id="sec-1-2"><span class="section-number-3">1.2</span> Install (NPM) </h3>
+<div class="outline-text-3" id="text-1-2">
+
+
+<p>
+UglifyJS is now available through NPM &mdash; <code>npm install uglify-js</code> should do
+the job.
+</p>
+</div>
+
+</div>
+
+<div id="outline-container-1-3" class="outline-3">
+<h3 id="sec-1-3"><span class="section-number-3">1.3</span> Install latest code from GitHub </h3>
+<div class="outline-text-3" id="text-1-3">
+
+
+
+
+
+<pre class="src src-sh"><span class="org-comment-delimiter">## </span><span class="org-comment">clone the repository</span>
+mkdir -p /where/you/wanna/put/it
+<span class="org-builtin">cd</span> /where/you/wanna/put/it
+git clone git://github.com/mishoo/UglifyJS.git
+
+<span class="org-comment-delimiter">## </span><span class="org-comment">make the module available to Node</span>
+mkdir -p ~/.node_libraries/
+<span class="org-builtin">cd</span> ~/.node_libraries/
+ln -s /where/you/wanna/put/it/UglifyJS/uglify-js.js
+
+<span class="org-comment-delimiter">## </span><span class="org-comment">and if you want the CLI script too:</span>
+mkdir -p ~/bin
+<span class="org-builtin">cd</span> ~/bin
+ln -s /where/you/wanna/put/it/UglifyJS/bin/uglifyjs
+ <span class="org-comment-delimiter"># </span><span class="org-comment">(then add ~/bin to your $PATH if it's not there already)</span>
+</pre>
+
+
+</div>
+
+</div>
+
+<div id="outline-container-1-4" class="outline-3">
+<h3 id="sec-1-4"><span class="section-number-3">1.4</span> Usage </h3>
+<div class="outline-text-3" id="text-1-4">
+
+
+<p>
+There is a command-line tool that exposes the functionality of this library
+for your shell-scripting needs:
+</p>
+
+
+
+<pre class="src src-sh">uglifyjs [ options... ] [ filename ]
+</pre>
+
+
+<p>
+<code>filename</code> should be the last argument and should name the file from which
+to read the JavaScript code. If you don't specify it, it will read code
+from STDIN.
+</p>
+<p>
+Supported options:
+</p>
+<ul>
+<li><code>-b</code> or <code>--beautify</code> &mdash; output indented code; when passed, additional
+ options control the beautifier:
+
+<ul>
+<li><code>-i N</code> or <code>--indent N</code> &mdash; indentation level (number of spaces)
+
+</li>
+<li><code>-q</code> or <code>--quote-keys</code> &mdash; quote keys in literal objects (by default,
+ only keys that cannot be identifier names will be quotes).
+
+</li>
+</ul>
+
+</li>
+<li><code>--ascii</code> &mdash; pass this argument to encode non-ASCII characters as
+ <code>\uXXXX</code> sequences. By default UglifyJS won't bother to do it and will
+ output Unicode characters instead. (the output is always encoded in UTF8,
+ but if you pass this option you'll only get ASCII).
+
+</li>
+<li><code>-nm</code> or <code>--no-mangle</code> &mdash; don't mangle names.
+
+</li>
+<li><code>-nmf</code> or <code>--no-mangle-functions</code> &ndash; in case you want to mangle variable
+ names, but not touch function names.
+
+</li>
+<li><code>-ns</code> or <code>--no-squeeze</code> &mdash; don't call <code>ast_squeeze()</code> (which does various
+ optimizations that result in smaller, less readable code).
+
+</li>
+<li><code>-mt</code> or <code>--mangle-toplevel</code> &mdash; mangle names in the toplevel scope too
+ (by default we don't do this).
+
+</li>
+<li><code>--no-seqs</code> &mdash; when <code>ast_squeeze()</code> is called (thus, unless you pass
+ <code>--no-squeeze</code>) it will reduce consecutive statements in blocks into a
+ sequence. For example, "a = 10; b = 20; foo();" will be written as
+ "a=10,b=20,foo();". In various occasions, this allows us to discard the
+ block brackets (since the block becomes a single statement). This is ON
+ by default because it seems safe and saves a few hundred bytes on some
+ libs that I tested it on, but pass <code>--no-seqs</code> to disable it.
+
+</li>
+<li><code>--no-dead-code</code> &mdash; by default, UglifyJS will remove code that is
+ obviously unreachable (code that follows a <code>return</code>, <code>throw</code>, <code>break</code> or
+ <code>continue</code> statement and is not a function/variable declaration). Pass
+ this option to disable this optimization.
+
+</li>
+<li><code>-nc</code> or <code>--no-copyright</code> &mdash; by default, <code>uglifyjs</code> will keep the initial
+ comment tokens in the generated code (assumed to be copyright information
+ etc.). If you pass this it will discard it.
+
+</li>
+<li><code>-o filename</code> or <code>--output filename</code> &mdash; put the result in <code>filename</code>. If
+ this isn't given, the result goes to standard output (or see next one).
+
+</li>
+<li><code>--overwrite</code> &mdash; if the code is read from a file (not from STDIN) and you
+ pass <code>--overwrite</code> then the output will be written in the same file.
+
+</li>
+<li><code>--ast</code> &mdash; pass this if you want to get the Abstract Syntax Tree instead
+ of JavaScript as output. Useful for debugging or learning more about the
+ internals.
+
+</li>
+<li><code>-v</code> or <code>--verbose</code> &mdash; output some notes on STDERR (for now just how long
+ each operation takes).
+
+</li>
+<li><code>-d SYMBOL[=VALUE]</code> or <code>--define SYMBOL[=VALUE]</code> &mdash; will replace
+ all instances of the specified symbol where used as an identifier
+ (except where symbol has properly declared by a var declaration or
+ use as function parameter or similar) with the specified value. This
+ argument may be specified multiple times to define multiple
+ symbols - if no value is specified the symbol will be replaced with
+ the value <code>true</code>, or you can specify a numeric value (such as
+ <code>1024</code>), a quoted string value (such as ="object"= or
+ ='https://github.com'<code>), or the name of another symbol or keyword (such as =null</code> or <code>document</code>).
+ This allows you, for example, to assign meaningful names to key
+ constant values but discard the symbolic names in the uglified
+ version for brevity/efficiency, or when used wth care, allows
+ UglifyJS to operate as a form of <b>conditional compilation</b>
+ whereby defining appropriate values may, by dint of the constant
+ folding and dead code removal features above, remove entire
+ superfluous code blocks (e.g. completely remove instrumentation or
+ trace code for production use).
+ Where string values are being defined, the handling of quotes are
+ likely to be subject to the specifics of your command shell
+ environment, so you may need to experiment with quoting styles
+ depending on your platform, or you may find the option
+ <code>--define-from-module</code> more suitable for use.
+
+</li>
+<li><code>-define-from-module SOMEMODULE</code> &mdash; will load the named module (as
+ per the NodeJS <code>require()</code> function) and iterate all the exported
+ properties of the module defining them as symbol names to be defined
+ (as if by the <code>--define</code> option) per the name of each property
+ (i.e. without the module name prefix) and given the value of the
+ property. This is a much easier way to handle and document groups of
+ symbols to be defined rather than a large number of <code>--define</code>
+ options.
+
+</li>
+<li><code>--unsafe</code> &mdash; enable other additional optimizations that are known to be
+ unsafe in some contrived situations, but could still be generally useful.
+ For now only these:
+
+<ul>
+<li>foo.toString() ==&gt; foo+""
+</li>
+<li>new Array(x,&hellip;) ==&gt; [x,&hellip;]
+</li>
+<li>new Array(x) ==&gt; Array(x)
+
+</li>
+</ul>
+
+</li>
+<li><code>--max-line-len</code> (default 32K characters) &mdash; add a newline after around
+ 32K characters. I've seen both FF and Chrome croak when all the code was
+ on a single line of around 670K. Pass &ndash;max-line-len 0 to disable this
+ safety feature.
+
+</li>
+<li><code>--reserved-names</code> &mdash; some libraries rely on certain names to be used, as
+ pointed out in issue #92 and #81, so this option allow you to exclude such
+ names from the mangler. For example, to keep names <code>require</code> and <code>$super</code>
+ intact you'd specify &ndash;reserved-names "require,$super".
+
+</li>
+<li><code>--inline-script</code> &ndash; when you want to include the output literally in an
+ HTML <code>&lt;script&gt;</code> tag you can use this option to prevent <code>&lt;/script</code> from
+ showing up in the output.
+
+</li>
+<li><code>--lift-vars</code> &ndash; when you pass this, UglifyJS will apply the following
+ transformations (see the notes in API, <code>ast_lift_variables</code>):
+
+<ul>
+<li>put all <code>var</code> declarations at the start of the scope
+</li>
+<li>make sure a variable is declared only once
+</li>
+<li>discard unused function arguments
+</li>
+<li>discard unused inner (named) functions
+</li>
+<li>finally, try to merge assignments into that one <code>var</code> declaration, if
+ possible.
+</li>
+</ul>
+
+</li>
+</ul>
+
+
+
+</div>
+
+<div id="outline-container-1-4-1" class="outline-4">
+<h4 id="sec-1-4-1"><span class="section-number-4">1.4.1</span> API </h4>
+<div class="outline-text-4" id="text-1-4-1">
+
+
+<p>
+To use the library from JavaScript, you'd do the following (example for
+NodeJS):
+</p>
+
+
+
+<pre class="src src-js"><span class="org-keyword">var</span> <span class="org-variable-name">jsp</span> = require(<span class="org-string">"uglify-js"</span>).parser;
+<span class="org-keyword">var</span> <span class="org-variable-name">pro</span> = require(<span class="org-string">"uglify-js"</span>).uglify;
+
+<span class="org-keyword">var</span> <span class="org-variable-name">orig_code</span> = <span class="org-string">"... JS code here"</span>;
+<span class="org-keyword">var</span> <span class="org-variable-name">ast</span> = jsp.parse(orig_code); <span class="org-comment-delimiter">// </span><span class="org-comment">parse code and get the initial AST</span>
+ast = pro.ast_mangle(ast); <span class="org-comment-delimiter">// </span><span class="org-comment">get a new AST with mangled names</span>
+ast = pro.ast_squeeze(ast); <span class="org-comment-delimiter">// </span><span class="org-comment">get an AST with compression optimizations</span>
+<span class="org-keyword">var</span> <span class="org-variable-name">final_code</span> = pro.gen_code(ast); <span class="org-comment-delimiter">// </span><span class="org-comment">compressed code here</span>
+</pre>
+
+
+<p>
+The above performs the full compression that is possible right now. As you
+can see, there are a sequence of steps which you can apply. For example if
+you want compressed output but for some reason you don't want to mangle
+variable names, you would simply skip the line that calls
+<code>pro.ast_mangle(ast)</code>.
+</p>
+<p>
+Some of these functions take optional arguments. Here's a description:
+</p>
+<ul>
+<li><code>jsp.parse(code, strict_semicolons)</code> &ndash; parses JS code and returns an AST.
+ <code>strict_semicolons</code> is optional and defaults to <code>false</code>. If you pass
+ <code>true</code> then the parser will throw an error when it expects a semicolon and
+ it doesn't find it. For most JS code you don't want that, but it's useful
+ if you want to strictly sanitize your code.
+
+</li>
+<li><code>pro.ast_lift_variables(ast)</code> &ndash; merge and move <code>var</code> declarations to the
+ scop of the scope; discard unused function arguments or variables; discard
+ unused (named) inner functions. It also tries to merge assignments
+ following the <code>var</code> declaration into it.
+
+<p>
+ If your code is very hand-optimized concerning <code>var</code> declarations, this
+ lifting variable declarations might actually increase size. For me it
+ helps out. On jQuery it adds 865 bytes (243 after gzip). YMMV. Also
+ note that (since it's not enabled by default) this operation isn't yet
+ heavily tested (please report if you find issues!).
+</p>
+<p>
+ Note that although it might increase the image size (on jQuery it gains
+ 865 bytes, 243 after gzip) it's technically more correct: in certain
+ situations, dead code removal might drop variable declarations, which
+ would not happen if the variables are lifted in advance.
+</p>
+<p>
+ Here's an example of what it does:
+</p></li>
+</ul>
+
+
+
+
+
+<pre class="src src-js"><span class="org-keyword">function</span> <span class="org-function-name">f</span>(<span class="org-variable-name">a</span>, <span class="org-variable-name">b</span>, <span class="org-variable-name">c</span>, <span class="org-variable-name">d</span>, <span class="org-variable-name">e</span>) {
+ <span class="org-keyword">var</span> <span class="org-variable-name">q</span>;
+ <span class="org-keyword">var</span> <span class="org-variable-name">w</span>;
+ w = 10;
+ q = 20;
+ <span class="org-keyword">for</span> (<span class="org-keyword">var</span> <span class="org-variable-name">i</span> = 1; i &lt; 10; ++i) {
+ <span class="org-keyword">var</span> <span class="org-variable-name">boo</span> = foo(a);
+ }
+ <span class="org-keyword">for</span> (<span class="org-keyword">var</span> <span class="org-variable-name">i</span> = 0; i &lt; 1; ++i) {
+ <span class="org-keyword">var</span> <span class="org-variable-name">boo</span> = bar(c);
+ }
+ <span class="org-keyword">function</span> <span class="org-function-name">foo</span>(){ ... }
+ <span class="org-keyword">function</span> <span class="org-function-name">bar</span>(){ ... }
+ <span class="org-keyword">function</span> <span class="org-function-name">baz</span>(){ ... }
+}
+
+<span class="org-comment-delimiter">// </span><span class="org-comment">transforms into ==&gt;</span>
+
+<span class="org-keyword">function</span> <span class="org-function-name">f</span>(<span class="org-variable-name">a</span>, <span class="org-variable-name">b</span>, <span class="org-variable-name">c</span>) {
+ <span class="org-keyword">var</span> <span class="org-variable-name">i</span>, <span class="org-variable-name">boo</span>, <span class="org-variable-name">w</span> = 10, <span class="org-variable-name">q</span> = 20;
+ <span class="org-keyword">for</span> (i = 1; i &lt; 10; ++i) {
+ boo = foo(a);
+ }
+ <span class="org-keyword">for</span> (i = 0; i &lt; 1; ++i) {
+ boo = bar(c);
+ }
+ <span class="org-keyword">function</span> <span class="org-function-name">foo</span>() { ... }
+ <span class="org-keyword">function</span> <span class="org-function-name">bar</span>() { ... }
+}
+</pre>
+
+
+<ul>
+<li><code>pro.ast_mangle(ast, options)</code> &ndash; generates a new AST containing mangled
+ (compressed) variable and function names. It supports the following
+ options:
+
+<ul>
+<li><code>toplevel</code> &ndash; mangle toplevel names (by default we don't touch them).
+</li>
+<li><code>except</code> &ndash; an array of names to exclude from compression.
+</li>
+<li><code>defines</code> &ndash; an object with properties named after symbols to
+ replace (see the <code>--define</code> option for the script) and the values
+ representing the AST replacement value.
+
+</li>
+</ul>
+
+</li>
+<li><code>pro.ast_squeeze(ast, options)</code> &ndash; employs further optimizations designed
+ to reduce the size of the code that <code>gen_code</code> would generate from the
+ AST. Returns a new AST. <code>options</code> can be a hash; the supported options
+ are:
+
+<ul>
+<li><code>make_seqs</code> (default true) which will cause consecutive statements in a
+ block to be merged using the "sequence" (comma) operator
+
+</li>
+<li><code>dead_code</code> (default true) which will remove unreachable code.
+
+</li>
+</ul>
+
+</li>
+<li><code>pro.gen_code(ast, options)</code> &ndash; generates JS code from the AST. By
+ default it's minified, but using the <code>options</code> argument you can get nicely
+ formatted output. <code>options</code> is, well, optional :-) and if you pass it it
+ must be an object and supports the following properties (below you can see
+ the default values):
+
+<ul>
+<li><code>beautify: false</code> &ndash; pass <code>true</code> if you want indented output
+</li>
+<li><code>indent_start: 0</code> (only applies when <code>beautify</code> is <code>true</code>) &ndash; initial
+ indentation in spaces
+</li>
+<li><code>indent_level: 4</code> (only applies when <code>beautify</code> is <code>true</code>) --
+ indentation level, in spaces (pass an even number)
+</li>
+<li><code>quote_keys: false</code> &ndash; if you pass <code>true</code> it will quote all keys in
+ literal objects
+</li>
+<li><code>space_colon: false</code> (only applies when <code>beautify</code> is <code>true</code>) &ndash; wether
+ to put a space before the colon in object literals
+</li>
+<li><code>ascii_only: false</code> &ndash; pass <code>true</code> if you want to encode non-ASCII
+ characters as <code>\uXXXX</code>.
+</li>
+<li><code>inline_script: false</code> &ndash; pass <code>true</code> to escape occurrences of
+ <code>&lt;/script</code> in strings
+</li>
+</ul>
+
+</li>
+</ul>
+
+
+</div>
+
+</div>
+
+<div id="outline-container-1-4-2" class="outline-4">
+<h4 id="sec-1-4-2"><span class="section-number-4">1.4.2</span> Beautifier shortcoming &ndash; no more comments </h4>
+<div class="outline-text-4" id="text-1-4-2">
+
+
+<p>
+The beautifier can be used as a general purpose indentation tool. It's
+useful when you want to make a minified file readable. One limitation,
+though, is that it discards all comments, so you don't really want to use it
+to reformat your code, unless you don't have, or don't care about, comments.
+</p>
+<p>
+In fact it's not the beautifier who discards comments &mdash; they are dumped at
+the parsing stage, when we build the initial AST. Comments don't really
+make sense in the AST, and while we could add nodes for them, it would be
+inconvenient because we'd have to add special rules to ignore them at all
+the processing stages.
+</p>
+</div>
+
+</div>
+
+<div id="outline-container-1-4-3" class="outline-4">
+<h4 id="sec-1-4-3"><span class="section-number-4">1.4.3</span> Use as a code pre-processor </h4>
+<div class="outline-text-4" id="text-1-4-3">
+
+
+<p>
+The <code>--define</code> option can be used, particularly when combined with the
+constant folding logic, as a form of pre-processor to enable or remove
+particular constructions, such as might be used for instrumenting
+development code, or to produce variations aimed at a specific
+platform.
+</p>
+<p>
+The code below illustrates the way this can be done, and how the
+symbol replacement is performed.
+</p>
+
+
+
+<pre class="src src-js">CLAUSE1: <span class="org-keyword">if</span> (<span class="org-keyword">typeof</span> DEVMODE === <span class="org-string">'undefined'</span>) {
+ DEVMODE = <span class="org-constant">true</span>;
+}
+
+<span class="org-function-name">CLAUSE2</span>: <span class="org-keyword">function</span> init() {
+ <span class="org-keyword">if</span> (DEVMODE) {
+ console.log(<span class="org-string">"init() called"</span>);
+ }
+ ....
+ DEVMODE &amp;amp;&amp;amp; console.log(<span class="org-string">"init() complete"</span>);
+}
+
+<span class="org-function-name">CLAUSE3</span>: <span class="org-keyword">function</span> reportDeviceStatus(<span class="org-variable-name">device</span>) {
+ <span class="org-keyword">var</span> <span class="org-variable-name">DEVMODE</span> = device.mode, <span class="org-variable-name">DEVNAME</span> = device.name;
+ <span class="org-keyword">if</span> (DEVMODE === <span class="org-string">'open'</span>) {
+ ....
+ }
+}
+</pre>
+
+
+<p>
+When the above code is normally executed, the undeclared global
+variable <code>DEVMODE</code> will be assigned the value <b>true</b> (see <code>CLAUSE1</code>)
+and so the <code>init()</code> function (<code>CLAUSE2</code>) will write messages to the
+console log when executed, but in <code>CLAUSE3</code> a locally declared
+variable will mask access to the <code>DEVMODE</code> global symbol.
+</p>
+<p>
+If the above code is processed by UglifyJS with an argument of
+<code>--define DEVMODE=false</code> then UglifyJS will replace <code>DEVMODE</code> with the
+boolean constant value <b>false</b> within <code>CLAUSE1</code> and <code>CLAUSE2</code>, but it
+will leave <code>CLAUSE3</code> as it stands because there <code>DEVMODE</code> resolves to
+a validly declared variable.
+</p>
+<p>
+And more so, the constant-folding features of UglifyJS will recognise
+that the <code>if</code> condition of <code>CLAUSE1</code> is thus always false, and so will
+remove the test and body of <code>CLAUSE1</code> altogether (including the
+otherwise slightly problematical statement <code>false = true;</code> which it
+will have formed by replacing <code>DEVMODE</code> in the body). Similarly,
+within <code>CLAUSE2</code> both calls to <code>console.log()</code> will be removed
+altogether.
+</p>
+<p>
+In this way you can mimic, to a limited degree, the functionality of
+the C/C++ pre-processor to enable or completely remove blocks
+depending on how certain symbols are defined - perhaps using UglifyJS
+to generate different versions of source aimed at different
+environments
+</p>
+<p>
+It is recommmended (but not made mandatory) that symbols designed for
+this purpose are given names consisting of <code>UPPER_CASE_LETTERS</code> to
+distinguish them from other (normal) symbols and avoid the sort of
+clash that <code>CLAUSE3</code> above illustrates.
+</p>
+</div>
+</div>
+
+</div>
+
+<div id="outline-container-1-5" class="outline-3">
+<h3 id="sec-1-5"><span class="section-number-3">1.5</span> Compression &ndash; how good is it? </h3>
+<div class="outline-text-3" id="text-1-5">
+
+
+<p>
+Here are updated statistics. (I also updated my Google Closure and YUI
+installations).
+</p>
+<p>
+We're still a lot better than YUI in terms of compression, though slightly
+slower. We're still a lot faster than Closure, and compression after gzip
+is comparable.
+</p>
+<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
+<caption></caption>
+<colgroup><col class="left" /><col class="left" /><col class="right" /><col class="left" /><col class="right" /><col class="left" /><col class="right" />
+</colgroup>
+<thead>
+<tr><th scope="col" class="left">File</th><th scope="col" class="left">UglifyJS</th><th scope="col" class="right">UglifyJS+gzip</th><th scope="col" class="left">Closure</th><th scope="col" class="right">Closure+gzip</th><th scope="col" class="left">YUI</th><th scope="col" class="right">YUI+gzip</th></tr>
+</thead>
+<tbody>
+<tr><td class="left">jquery-1.6.2.js</td><td class="left">91001 (0:01.59)</td><td class="right">31896</td><td class="left">90678 (0:07.40)</td><td class="right">31979</td><td class="left">101527 (0:01.82)</td><td class="right">34646</td></tr>
+<tr><td class="left">paper.js</td><td class="left">142023 (0:01.65)</td><td class="right">43334</td><td class="left">134301 (0:07.42)</td><td class="right">42495</td><td class="left">173383 (0:01.58)</td><td class="right">48785</td></tr>
+<tr><td class="left">prototype.js</td><td class="left">88544 (0:01.09)</td><td class="right">26680</td><td class="left">86955 (0:06.97)</td><td class="right">26326</td><td class="left">92130 (0:00.79)</td><td class="right">28624</td></tr>
+<tr><td class="left">thelib-full.js (DynarchLIB)</td><td class="left">251939 (0:02.55)</td><td class="right">72535</td><td class="left">249911 (0:09.05)</td><td class="right">72696</td><td class="left">258869 (0:01.94)</td><td class="right">76584</td></tr>
+</tbody>
+</table>
+
+
+</div>
+
+</div>
+
+<div id="outline-container-1-6" class="outline-3">
+<h3 id="sec-1-6"><span class="section-number-3">1.6</span> Bugs? </h3>
+<div class="outline-text-3" id="text-1-6">
+
+
+<p>
+Unfortunately, for the time being there is no automated test suite. But I
+ran the compressor manually on non-trivial code, and then I tested that the
+generated code works as expected. A few hundred times.
+</p>
+<p>
+DynarchLIB was started in times when there was no good JS minifier.
+Therefore I was quite religious about trying to write short code manually,
+and as such DL contains a lot of syntactic hacks<sup><a class="footref" name="fnr.1" href="#fn.1">1</a></sup> such as “foo == bar ? a
+= 10 : b = 20”, though the more readable version would clearly be to use
+“if/else”.
+</p>
+<p>
+Since the parser/compressor runs fine on DL and jQuery, I'm quite confident
+that it's solid enough for production use. If you can identify any bugs,
+I'd love to hear about them (<a href="http://groups.google.com/group/uglifyjs">use the Google Group</a> or email me directly).
+</p>
+</div>
+
+</div>
+
+<div id="outline-container-1-7" class="outline-3">
+<h3 id="sec-1-7"><span class="section-number-3">1.7</span> Links </h3>
+<div class="outline-text-3" id="text-1-7">
+
+
+<ul>
+<li>Twitter: <a href="http://twitter.com/UglifyJS">@UglifyJS</a>
+</li>
+<li>Project at GitHub: <a href="http://github.com/mishoo/UglifyJS">http://github.com/mishoo/UglifyJS</a>
+</li>
+<li>Google Group: <a href="http://groups.google.com/group/uglifyjs">http://groups.google.com/group/uglifyjs</a>
+</li>
+<li>Common Lisp JS parser: <a href="http://marijn.haverbeke.nl/parse-js/">http://marijn.haverbeke.nl/parse-js/</a>
+</li>
+<li>JS-to-Lisp compiler: <a href="http://github.com/marijnh/js">http://github.com/marijnh/js</a>
+</li>
+<li>Common Lisp JS uglifier: <a href="http://github.com/mishoo/cl-uglify-js">http://github.com/mishoo/cl-uglify-js</a>
+</li>
+</ul>
+
+
+</div>
+
+</div>
+
+<div id="outline-container-1-8" class="outline-3">
+<h3 id="sec-1-8"><span class="section-number-3">1.8</span> License </h3>
+<div class="outline-text-3" id="text-1-8">
+
+
+<p>
+UglifyJS is released under the BSD license:
+</p>
+
+
+
+<pre class="example">Copyright 2010 (c) Mihai Bazon &lt;mihai.bazon@gmail.com&gt;
+Based on parse-js (http://marijn.haverbeke.nl/parse-js/).
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ * Redistributions of source code must retain the above
+ copyright notice, this list of conditions and the following
+ disclaimer.
+
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials
+ provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+</pre>
+
+
+<div id="footnotes">
+<h2 class="footnotes">Footnotes: </h2>
+<div id="text-footnotes">
+<p class="footnote"><sup><a class="footnum" name="fn.1" href="#fnr.1">1</a></sup> I even reported a few bugs and suggested some fixes in the original
+ <a href="http://marijn.haverbeke.nl/parse-js/">parse-js</a> library, and Marijn pushed fixes literally in minutes.
+</p></div>
+</div>
+</div>
+
+</div>
+</div>
+</div>
+
+<div id="postamble">
+<p class="date">Date: 2011-12-09 14:59:08 EET</p>
+<p class="author">Author: Mihai Bazon</p>
+<p class="creator">Org version 7.7 with Emacs version 23</p>
+<a href="http://validator.w3.org/check?uri=referer">Validate XHTML 1.0</a>
+
+</div>
+</body>
+</html>
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/README.org b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/README.org
new file mode 100644
index 000000000..d36b6b26f
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/README.org
@@ -0,0 +1,578 @@
+#+TITLE: UglifyJS -- a JavaScript parser/compressor/beautifier
+#+KEYWORDS: javascript, js, parser, compiler, compressor, mangle, minify, minifier
+#+DESCRIPTION: a JavaScript parser/compressor/beautifier in JavaScript
+#+STYLE: <link rel="stylesheet" type="text/css" href="docstyle.css" />
+#+AUTHOR: Mihai Bazon
+#+EMAIL: mihai.bazon@gmail.com
+
+* UglifyJS --- a JavaScript parser/compressor/beautifier
+
+This package implements a general-purpose JavaScript
+parser/compressor/beautifier toolkit. It is developed on [[http://nodejs.org/][NodeJS]], but it
+should work on any JavaScript platform supporting the CommonJS module system
+(and if your platform of choice doesn't support CommonJS, you can easily
+implement it, or discard the =exports.*= lines from UglifyJS sources).
+
+The tokenizer/parser generates an abstract syntax tree from JS code. You
+can then traverse the AST to learn more about the code, or do various
+manipulations on it. This part is implemented in [[../lib/parse-js.js][parse-js.js]] and it's a
+port to JavaScript of the excellent [[http://marijn.haverbeke.nl/parse-js/][parse-js]] Common Lisp library from [[http://marijn.haverbeke.nl/][Marijn
+Haverbeke]].
+
+( See [[http://github.com/mishoo/cl-uglify-js][cl-uglify-js]] if you're looking for the Common Lisp version of
+UglifyJS. )
+
+The second part of this package, implemented in [[../lib/process.js][process.js]], inspects and
+manipulates the AST generated by the parser to provide the following:
+
+- ability to re-generate JavaScript code from the AST. Optionally
+ indented---you can use this if you want to “beautify” a program that has
+ been compressed, so that you can inspect the source. But you can also run
+ our code generator to print out an AST without any whitespace, so you
+ achieve compression as well.
+
+- shorten variable names (usually to single characters). Our mangler will
+ analyze the code and generate proper variable names, depending on scope
+ and usage, and is smart enough to deal with globals defined elsewhere, or
+ with =eval()= calls or =with{}= statements. In short, if =eval()= or
+ =with{}= are used in some scope, then all variables in that scope and any
+ variables in the parent scopes will remain unmangled, and any references
+ to such variables remain unmangled as well.
+
+- various small optimizations that may lead to faster code but certainly
+ lead to smaller code. Where possible, we do the following:
+
+ - foo["bar"] ==> foo.bar
+
+ - remove block brackets ={}=
+
+ - join consecutive var declarations:
+ var a = 10; var b = 20; ==> var a=10,b=20;
+
+ - resolve simple constant expressions: 1 +2 * 3 ==> 7. We only do the
+ replacement if the result occupies less bytes; for example 1/3 would
+ translate to 0.333333333333, so in this case we don't replace it.
+
+ - consecutive statements in blocks are merged into a sequence; in many
+ cases, this leaves blocks with a single statement, so then we can remove
+ the block brackets.
+
+ - various optimizations for IF statements:
+
+ - if (foo) bar(); else baz(); ==> foo?bar():baz();
+ - if (!foo) bar(); else baz(); ==> foo?baz():bar();
+ - if (foo) bar(); ==> foo&&bar();
+ - if (!foo) bar(); ==> foo||bar();
+ - if (foo) return bar(); else return baz(); ==> return foo?bar():baz();
+ - if (foo) return bar(); else something(); ==> {if(foo)return bar();something()}
+
+ - remove some unreachable code and warn about it (code that follows a
+ =return=, =throw=, =break= or =continue= statement, except
+ function/variable declarations).
+
+ - act a limited version of a pre-processor (c.f. the pre-processor of
+ C/C++) to allow you to safely replace selected global symbols with
+ specified values. When combined with the optimisations above this can
+ make UglifyJS operate slightly more like a compilation process, in
+ that when certain symbols are replaced by constant values, entire code
+ blocks may be optimised away as unreachable.
+
+** <<Unsafe transformations>>
+
+The following transformations can in theory break code, although they're
+probably safe in most practical cases. To enable them you need to pass the
+=--unsafe= flag.
+
+*** Calls involving the global Array constructor
+
+The following transformations occur:
+
+#+BEGIN_SRC js
+new Array(1, 2, 3, 4) => [1,2,3,4]
+Array(a, b, c) => [a,b,c]
+new Array(5) => Array(5)
+new Array(a) => Array(a)
+#+END_SRC
+
+These are all safe if the Array name isn't redefined. JavaScript does allow
+one to globally redefine Array (and pretty much everything, in fact) but I
+personally don't see why would anyone do that.
+
+UglifyJS does handle the case where Array is redefined locally, or even
+globally but with a =function= or =var= declaration. Therefore, in the
+following cases UglifyJS *doesn't touch* calls or instantiations of Array:
+
+#+BEGIN_SRC js
+// case 1. globally declared variable
+ var Array;
+ new Array(1, 2, 3);
+ Array(a, b);
+
+ // or (can be declared later)
+ new Array(1, 2, 3);
+ var Array;
+
+ // or (can be a function)
+ new Array(1, 2, 3);
+ function Array() { ... }
+
+// case 2. declared in a function
+ (function(){
+ a = new Array(1, 2, 3);
+ b = Array(5, 6);
+ var Array;
+ })();
+
+ // or
+ (function(Array){
+ return Array(5, 6, 7);
+ })();
+
+ // or
+ (function(){
+ return new Array(1, 2, 3, 4);
+ function Array() { ... }
+ })();
+
+ // etc.
+#+END_SRC
+
+*** =obj.toString()= ==> =obj+“”=
+
+** Install (NPM)
+
+UglifyJS is now available through NPM --- =npm install uglify-js= should do
+the job.
+
+** Install latest code from GitHub
+
+#+BEGIN_SRC sh
+## clone the repository
+mkdir -p /where/you/wanna/put/it
+cd /where/you/wanna/put/it
+git clone git://github.com/mishoo/UglifyJS.git
+
+## make the module available to Node
+mkdir -p ~/.node_libraries/
+cd ~/.node_libraries/
+ln -s /where/you/wanna/put/it/UglifyJS/uglify-js.js
+
+## and if you want the CLI script too:
+mkdir -p ~/bin
+cd ~/bin
+ln -s /where/you/wanna/put/it/UglifyJS/bin/uglifyjs
+ # (then add ~/bin to your $PATH if it's not there already)
+#+END_SRC
+
+** Usage
+
+There is a command-line tool that exposes the functionality of this library
+for your shell-scripting needs:
+
+#+BEGIN_SRC sh
+uglifyjs [ options... ] [ filename ]
+#+END_SRC
+
+=filename= should be the last argument and should name the file from which
+to read the JavaScript code. If you don't specify it, it will read code
+from STDIN.
+
+Supported options:
+
+- =-b= or =--beautify= --- output indented code; when passed, additional
+ options control the beautifier:
+
+ - =-i N= or =--indent N= --- indentation level (number of spaces)
+
+ - =-q= or =--quote-keys= --- quote keys in literal objects (by default,
+ only keys that cannot be identifier names will be quotes).
+
+- =-c= or =----consolidate-primitive-values= --- consolidates null, Boolean,
+ and String values. Known as aliasing in the Closure Compiler. Worsens the
+ data compression ratio of gzip.
+
+- =--ascii= --- pass this argument to encode non-ASCII characters as
+ =\uXXXX= sequences. By default UglifyJS won't bother to do it and will
+ output Unicode characters instead. (the output is always encoded in UTF8,
+ but if you pass this option you'll only get ASCII).
+
+- =-nm= or =--no-mangle= --- don't mangle names.
+
+- =-nmf= or =--no-mangle-functions= -- in case you want to mangle variable
+ names, but not touch function names.
+
+- =-ns= or =--no-squeeze= --- don't call =ast_squeeze()= (which does various
+ optimizations that result in smaller, less readable code).
+
+- =-mt= or =--mangle-toplevel= --- mangle names in the toplevel scope too
+ (by default we don't do this).
+
+- =--no-seqs= --- when =ast_squeeze()= is called (thus, unless you pass
+ =--no-squeeze=) it will reduce consecutive statements in blocks into a
+ sequence. For example, "a = 10; b = 20; foo();" will be written as
+ "a=10,b=20,foo();". In various occasions, this allows us to discard the
+ block brackets (since the block becomes a single statement). This is ON
+ by default because it seems safe and saves a few hundred bytes on some
+ libs that I tested it on, but pass =--no-seqs= to disable it.
+
+- =--no-dead-code= --- by default, UglifyJS will remove code that is
+ obviously unreachable (code that follows a =return=, =throw=, =break= or
+ =continue= statement and is not a function/variable declaration). Pass
+ this option to disable this optimization.
+
+- =-nc= or =--no-copyright= --- by default, =uglifyjs= will keep the initial
+ comment tokens in the generated code (assumed to be copyright information
+ etc.). If you pass this it will discard it.
+
+- =-o filename= or =--output filename= --- put the result in =filename=. If
+ this isn't given, the result goes to standard output (or see next one).
+
+- =--overwrite= --- if the code is read from a file (not from STDIN) and you
+ pass =--overwrite= then the output will be written in the same file.
+
+- =--ast= --- pass this if you want to get the Abstract Syntax Tree instead
+ of JavaScript as output. Useful for debugging or learning more about the
+ internals.
+
+- =-v= or =--verbose= --- output some notes on STDERR (for now just how long
+ each operation takes).
+
+- =-d SYMBOL[=VALUE]= or =--define SYMBOL[=VALUE]= --- will replace
+ all instances of the specified symbol where used as an identifier
+ (except where symbol has properly declared by a var declaration or
+ use as function parameter or similar) with the specified value. This
+ argument may be specified multiple times to define multiple
+ symbols - if no value is specified the symbol will be replaced with
+ the value =true=, or you can specify a numeric value (such as
+ =1024=), a quoted string value (such as ="object"= or
+ ='https://github.com'=), or the name of another symbol or keyword
+ (such as =null= or =document=).
+ This allows you, for example, to assign meaningful names to key
+ constant values but discard the symbolic names in the uglified
+ version for brevity/efficiency, or when used wth care, allows
+ UglifyJS to operate as a form of *conditional compilation*
+ whereby defining appropriate values may, by dint of the constant
+ folding and dead code removal features above, remove entire
+ superfluous code blocks (e.g. completely remove instrumentation or
+ trace code for production use).
+ Where string values are being defined, the handling of quotes are
+ likely to be subject to the specifics of your command shell
+ environment, so you may need to experiment with quoting styles
+ depending on your platform, or you may find the option
+ =--define-from-module= more suitable for use.
+
+- =-define-from-module SOMEMODULE= --- will load the named module (as
+ per the NodeJS =require()= function) and iterate all the exported
+ properties of the module defining them as symbol names to be defined
+ (as if by the =--define= option) per the name of each property
+ (i.e. without the module name prefix) and given the value of the
+ property. This is a much easier way to handle and document groups of
+ symbols to be defined rather than a large number of =--define=
+ options.
+
+- =--unsafe= --- enable other additional optimizations that are known to be
+ unsafe in some contrived situations, but could still be generally useful.
+ For now only these:
+
+ - foo.toString() ==> foo+""
+ - new Array(x,...) ==> [x,...]
+ - new Array(x) ==> Array(x)
+
+- =--max-line-len= (default 32K characters) --- add a newline after around
+ 32K characters. I've seen both FF and Chrome croak when all the code was
+ on a single line of around 670K. Pass --max-line-len 0 to disable this
+ safety feature.
+
+- =--reserved-names= --- some libraries rely on certain names to be used, as
+ pointed out in issue #92 and #81, so this option allow you to exclude such
+ names from the mangler. For example, to keep names =require= and =$super=
+ intact you'd specify --reserved-names "require,$super".
+
+- =--inline-script= -- when you want to include the output literally in an
+ HTML =<script>= tag you can use this option to prevent =</script= from
+ showing up in the output.
+
+- =--lift-vars= -- when you pass this, UglifyJS will apply the following
+ transformations (see the notes in API, =ast_lift_variables=):
+
+ - put all =var= declarations at the start of the scope
+ - make sure a variable is declared only once
+ - discard unused function arguments
+ - discard unused inner (named) functions
+ - finally, try to merge assignments into that one =var= declaration, if
+ possible.
+
+*** API
+
+To use the library from JavaScript, you'd do the following (example for
+NodeJS):
+
+#+BEGIN_SRC js
+var jsp = require("uglify-js").parser;
+var pro = require("uglify-js").uglify;
+
+var orig_code = "... JS code here";
+var ast = jsp.parse(orig_code); // parse code and get the initial AST
+ast = pro.ast_mangle(ast); // get a new AST with mangled names
+ast = pro.ast_squeeze(ast); // get an AST with compression optimizations
+var final_code = pro.gen_code(ast); // compressed code here
+#+END_SRC
+
+The above performs the full compression that is possible right now. As you
+can see, there are a sequence of steps which you can apply. For example if
+you want compressed output but for some reason you don't want to mangle
+variable names, you would simply skip the line that calls
+=pro.ast_mangle(ast)=.
+
+Some of these functions take optional arguments. Here's a description:
+
+- =jsp.parse(code, strict_semicolons)= -- parses JS code and returns an AST.
+ =strict_semicolons= is optional and defaults to =false=. If you pass
+ =true= then the parser will throw an error when it expects a semicolon and
+ it doesn't find it. For most JS code you don't want that, but it's useful
+ if you want to strictly sanitize your code.
+
+- =pro.ast_lift_variables(ast)= -- merge and move =var= declarations to the
+ scop of the scope; discard unused function arguments or variables; discard
+ unused (named) inner functions. It also tries to merge assignments
+ following the =var= declaration into it.
+
+ If your code is very hand-optimized concerning =var= declarations, this
+ lifting variable declarations might actually increase size. For me it
+ helps out. On jQuery it adds 865 bytes (243 after gzip). YMMV. Also
+ note that (since it's not enabled by default) this operation isn't yet
+ heavily tested (please report if you find issues!).
+
+ Note that although it might increase the image size (on jQuery it gains
+ 865 bytes, 243 after gzip) it's technically more correct: in certain
+ situations, dead code removal might drop variable declarations, which
+ would not happen if the variables are lifted in advance.
+
+ Here's an example of what it does:
+
+#+BEGIN_SRC js
+function f(a, b, c, d, e) {
+ var q;
+ var w;
+ w = 10;
+ q = 20;
+ for (var i = 1; i < 10; ++i) {
+ var boo = foo(a);
+ }
+ for (var i = 0; i < 1; ++i) {
+ var boo = bar(c);
+ }
+ function foo(){ ... }
+ function bar(){ ... }
+ function baz(){ ... }
+}
+
+// transforms into ==>
+
+function f(a, b, c) {
+ var i, boo, w = 10, q = 20;
+ for (i = 1; i < 10; ++i) {
+ boo = foo(a);
+ }
+ for (i = 0; i < 1; ++i) {
+ boo = bar(c);
+ }
+ function foo() { ... }
+ function bar() { ... }
+}
+#+END_SRC
+
+- =pro.ast_mangle(ast, options)= -- generates a new AST containing mangled
+ (compressed) variable and function names. It supports the following
+ options:
+
+ - =toplevel= -- mangle toplevel names (by default we don't touch them).
+ - =except= -- an array of names to exclude from compression.
+ - =defines= -- an object with properties named after symbols to
+ replace (see the =--define= option for the script) and the values
+ representing the AST replacement value.
+
+- =pro.ast_squeeze(ast, options)= -- employs further optimizations designed
+ to reduce the size of the code that =gen_code= would generate from the
+ AST. Returns a new AST. =options= can be a hash; the supported options
+ are:
+
+ - =make_seqs= (default true) which will cause consecutive statements in a
+ block to be merged using the "sequence" (comma) operator
+
+ - =dead_code= (default true) which will remove unreachable code.
+
+- =pro.gen_code(ast, options)= -- generates JS code from the AST. By
+ default it's minified, but using the =options= argument you can get nicely
+ formatted output. =options= is, well, optional :-) and if you pass it it
+ must be an object and supports the following properties (below you can see
+ the default values):
+
+ - =beautify: false= -- pass =true= if you want indented output
+ - =indent_start: 0= (only applies when =beautify= is =true=) -- initial
+ indentation in spaces
+ - =indent_level: 4= (only applies when =beautify= is =true=) --
+ indentation level, in spaces (pass an even number)
+ - =quote_keys: false= -- if you pass =true= it will quote all keys in
+ literal objects
+ - =space_colon: false= (only applies when =beautify= is =true=) -- wether
+ to put a space before the colon in object literals
+ - =ascii_only: false= -- pass =true= if you want to encode non-ASCII
+ characters as =\uXXXX=.
+ - =inline_script: false= -- pass =true= to escape occurrences of
+ =</script= in strings
+
+*** Beautifier shortcoming -- no more comments
+
+The beautifier can be used as a general purpose indentation tool. It's
+useful when you want to make a minified file readable. One limitation,
+though, is that it discards all comments, so you don't really want to use it
+to reformat your code, unless you don't have, or don't care about, comments.
+
+In fact it's not the beautifier who discards comments --- they are dumped at
+the parsing stage, when we build the initial AST. Comments don't really
+make sense in the AST, and while we could add nodes for them, it would be
+inconvenient because we'd have to add special rules to ignore them at all
+the processing stages.
+
+*** Use as a code pre-processor
+
+The =--define= option can be used, particularly when combined with the
+constant folding logic, as a form of pre-processor to enable or remove
+particular constructions, such as might be used for instrumenting
+development code, or to produce variations aimed at a specific
+platform.
+
+The code below illustrates the way this can be done, and how the
+symbol replacement is performed.
+
+#+BEGIN_SRC js
+CLAUSE1: if (typeof DEVMODE === 'undefined') {
+ DEVMODE = true;
+}
+
+CLAUSE2: function init() {
+ if (DEVMODE) {
+ console.log("init() called");
+ }
+ ....
+ DEVMODE &amp;&amp; console.log("init() complete");
+}
+
+CLAUSE3: function reportDeviceStatus(device) {
+ var DEVMODE = device.mode, DEVNAME = device.name;
+ if (DEVMODE === 'open') {
+ ....
+ }
+}
+#+END_SRC
+
+When the above code is normally executed, the undeclared global
+variable =DEVMODE= will be assigned the value *true* (see =CLAUSE1=)
+and so the =init()= function (=CLAUSE2=) will write messages to the
+console log when executed, but in =CLAUSE3= a locally declared
+variable will mask access to the =DEVMODE= global symbol.
+
+If the above code is processed by UglifyJS with an argument of
+=--define DEVMODE=false= then UglifyJS will replace =DEVMODE= with the
+boolean constant value *false* within =CLAUSE1= and =CLAUSE2=, but it
+will leave =CLAUSE3= as it stands because there =DEVMODE= resolves to
+a validly declared variable.
+
+And more so, the constant-folding features of UglifyJS will recognise
+that the =if= condition of =CLAUSE1= is thus always false, and so will
+remove the test and body of =CLAUSE1= altogether (including the
+otherwise slightly problematical statement =false = true;= which it
+will have formed by replacing =DEVMODE= in the body). Similarly,
+within =CLAUSE2= both calls to =console.log()= will be removed
+altogether.
+
+In this way you can mimic, to a limited degree, the functionality of
+the C/C++ pre-processor to enable or completely remove blocks
+depending on how certain symbols are defined - perhaps using UglifyJS
+to generate different versions of source aimed at different
+environments
+
+It is recommmended (but not made mandatory) that symbols designed for
+this purpose are given names consisting of =UPPER_CASE_LETTERS= to
+distinguish them from other (normal) symbols and avoid the sort of
+clash that =CLAUSE3= above illustrates.
+
+** Compression -- how good is it?
+
+Here are updated statistics. (I also updated my Google Closure and YUI
+installations).
+
+We're still a lot better than YUI in terms of compression, though slightly
+slower. We're still a lot faster than Closure, and compression after gzip
+is comparable.
+
+| File | UglifyJS | UglifyJS+gzip | Closure | Closure+gzip | YUI | YUI+gzip |
+|-----------------------------+------------------+---------------+------------------+--------------+------------------+----------|
+| jquery-1.6.2.js | 91001 (0:01.59) | 31896 | 90678 (0:07.40) | 31979 | 101527 (0:01.82) | 34646 |
+| paper.js | 142023 (0:01.65) | 43334 | 134301 (0:07.42) | 42495 | 173383 (0:01.58) | 48785 |
+| prototype.js | 88544 (0:01.09) | 26680 | 86955 (0:06.97) | 26326 | 92130 (0:00.79) | 28624 |
+| thelib-full.js (DynarchLIB) | 251939 (0:02.55) | 72535 | 249911 (0:09.05) | 72696 | 258869 (0:01.94) | 76584 |
+
+** Bugs?
+
+Unfortunately, for the time being there is no automated test suite. But I
+ran the compressor manually on non-trivial code, and then I tested that the
+generated code works as expected. A few hundred times.
+
+DynarchLIB was started in times when there was no good JS minifier.
+Therefore I was quite religious about trying to write short code manually,
+and as such DL contains a lot of syntactic hacks[1] such as “foo == bar ? a
+= 10 : b = 20”, though the more readable version would clearly be to use
+“if/else”.
+
+Since the parser/compressor runs fine on DL and jQuery, I'm quite confident
+that it's solid enough for production use. If you can identify any bugs,
+I'd love to hear about them ([[http://groups.google.com/group/uglifyjs][use the Google Group]] or email me directly).
+
+[1] I even reported a few bugs and suggested some fixes in the original
+ [[http://marijn.haverbeke.nl/parse-js/][parse-js]] library, and Marijn pushed fixes literally in minutes.
+
+** Links
+
+- Twitter: [[http://twitter.com/UglifyJS][@UglifyJS]]
+- Project at GitHub: [[http://github.com/mishoo/UglifyJS][http://github.com/mishoo/UglifyJS]]
+- Google Group: [[http://groups.google.com/group/uglifyjs][http://groups.google.com/group/uglifyjs]]
+- Common Lisp JS parser: [[http://marijn.haverbeke.nl/parse-js/][http://marijn.haverbeke.nl/parse-js/]]
+- JS-to-Lisp compiler: [[http://github.com/marijnh/js][http://github.com/marijnh/js]]
+- Common Lisp JS uglifier: [[http://github.com/mishoo/cl-uglify-js][http://github.com/mishoo/cl-uglify-js]]
+
+** License
+
+UglifyJS is released under the BSD license:
+
+#+BEGIN_EXAMPLE
+Copyright 2010 (c) Mihai Bazon <mihai.bazon@gmail.com>
+Based on parse-js (http://marijn.haverbeke.nl/parse-js/).
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+ * Redistributions of source code must retain the above
+ copyright notice, this list of conditions and the following
+ disclaimer.
+
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials
+ provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+#+END_EXAMPLE
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/bin/uglifyjs b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/bin/uglifyjs
new file mode 100755
index 000000000..df5201daa
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/bin/uglifyjs
@@ -0,0 +1,332 @@
+#!/usr/bin/env node
+// -*- js -*-
+
+global.sys = require(/^v0\.[012]/.test(process.version) ? "sys" : "util");
+var fs = require("fs");
+var uglify = require("uglify-js"), // symlink ~/.node_libraries/uglify-js.js to ../uglify-js.js
+ consolidator = uglify.consolidator,
+ jsp = uglify.parser,
+ pro = uglify.uglify;
+
+var options = {
+ ast: false,
+ consolidate: false,
+ mangle: true,
+ mangle_toplevel: false,
+ no_mangle_functions: false,
+ squeeze: true,
+ make_seqs: true,
+ dead_code: true,
+ verbose: false,
+ show_copyright: true,
+ out_same_file: false,
+ max_line_length: 32 * 1024,
+ unsafe: false,
+ reserved_names: null,
+ defines: { },
+ lift_vars: false,
+ codegen_options: {
+ ascii_only: false,
+ beautify: false,
+ indent_level: 4,
+ indent_start: 0,
+ quote_keys: false,
+ space_colon: false,
+ inline_script: false
+ },
+ make: false,
+ output: true // stdout
+};
+
+var args = jsp.slice(process.argv, 2);
+var filename;
+
+out: while (args.length > 0) {
+ var v = args.shift();
+ switch (v) {
+ case "-b":
+ case "--beautify":
+ options.codegen_options.beautify = true;
+ break;
+ case "-c":
+ case "--consolidate-primitive-values":
+ options.consolidate = true;
+ break;
+ case "-i":
+ case "--indent":
+ options.codegen_options.indent_level = args.shift();
+ break;
+ case "-q":
+ case "--quote-keys":
+ options.codegen_options.quote_keys = true;
+ break;
+ case "-mt":
+ case "--mangle-toplevel":
+ options.mangle_toplevel = true;
+ break;
+ case "-nmf":
+ case "--no-mangle-functions":
+ options.no_mangle_functions = true;
+ break;
+ case "--no-mangle":
+ case "-nm":
+ options.mangle = false;
+ break;
+ case "--no-squeeze":
+ case "-ns":
+ options.squeeze = false;
+ break;
+ case "--no-seqs":
+ options.make_seqs = false;
+ break;
+ case "--no-dead-code":
+ options.dead_code = false;
+ break;
+ case "--no-copyright":
+ case "-nc":
+ options.show_copyright = false;
+ break;
+ case "-o":
+ case "--output":
+ options.output = args.shift();
+ break;
+ case "--overwrite":
+ options.out_same_file = true;
+ break;
+ case "-v":
+ case "--verbose":
+ options.verbose = true;
+ break;
+ case "--ast":
+ options.ast = true;
+ break;
+ case "--unsafe":
+ options.unsafe = true;
+ break;
+ case "--max-line-len":
+ options.max_line_length = parseInt(args.shift(), 10);
+ break;
+ case "--reserved-names":
+ options.reserved_names = args.shift().split(",");
+ break;
+ case "--lift-vars":
+ options.lift_vars = true;
+ break;
+ case "-d":
+ case "--define":
+ var defarg = args.shift();
+ try {
+ var defsym = function(sym) {
+ // KEYWORDS_ATOM doesn't include NaN or Infinity - should we check
+ // for them too ?? We don't check reserved words and the like as the
+ // define values are only substituted AFTER parsing
+ if (jsp.KEYWORDS_ATOM.hasOwnProperty(sym)) {
+ throw "Don't define values for inbuilt constant '"+sym+"'";
+ }
+ return sym;
+ },
+ defval = function(v) {
+ if (v.match(/^"(.*)"$/) || v.match(/^'(.*)'$/)) {
+ return [ "string", RegExp.$1 ];
+ }
+ else if (!isNaN(parseFloat(v))) {
+ return [ "num", parseFloat(v) ];
+ }
+ else if (v.match(/^[a-z\$_][a-z\$_0-9]*$/i)) {
+ return [ "name", v ];
+ }
+ else if (!v.match(/"/)) {
+ return [ "string", v ];
+ }
+ else if (!v.match(/'/)) {
+ return [ "string", v ];
+ }
+ throw "Can't understand the specified value: "+v;
+ };
+ if (defarg.match(/^([a-z_\$][a-z_\$0-9]*)(=(.*))?$/i)) {
+ var sym = defsym(RegExp.$1),
+ val = RegExp.$2 ? defval(RegExp.$2.substr(1)) : [ 'name', 'true' ];
+ options.defines[sym] = val;
+ }
+ else {
+ throw "The --define option expects SYMBOL[=value]";
+ }
+ } catch(ex) {
+ sys.print("ERROR: In option --define "+defarg+"\n"+ex+"\n");
+ process.exit(1);
+ }
+ break;
+ case "--define-from-module":
+ var defmodarg = args.shift(),
+ defmodule = require(defmodarg),
+ sym,
+ val;
+ for (sym in defmodule) {
+ if (defmodule.hasOwnProperty(sym)) {
+ options.defines[sym] = function(val) {
+ if (typeof val == "string")
+ return [ "string", val ];
+ if (typeof val == "number")
+ return [ "num", val ];
+ if (val === true)
+ return [ 'name', 'true' ];
+ if (val === false)
+ return [ 'name', 'false' ];
+ if (val === null)
+ return [ 'name', 'null' ];
+ if (val === undefined)
+ return [ 'name', 'undefined' ];
+ sys.print("ERROR: In option --define-from-module "+defmodarg+"\n");
+ sys.print("ERROR: Unknown object type for: "+sym+"="+val+"\n");
+ process.exit(1);
+ return null;
+ }(defmodule[sym]);
+ }
+ }
+ break;
+ case "--ascii":
+ options.codegen_options.ascii_only = true;
+ break;
+ case "--make":
+ options.make = true;
+ break;
+ case "--inline-script":
+ options.codegen_options.inline_script = true;
+ break;
+ default:
+ filename = v;
+ break out;
+ }
+}
+
+if (options.verbose) {
+ pro.set_logger(function(msg){
+ sys.debug(msg);
+ });
+}
+
+jsp.set_logger(function(msg){
+ sys.debug(msg);
+});
+
+if (options.make) {
+ options.out_same_file = false; // doesn't make sense in this case
+ var makefile = JSON.parse(fs.readFileSync(filename || "Makefile.uglify.js").toString());
+ output(makefile.files.map(function(file){
+ var code = fs.readFileSync(file.name);
+ if (file.module) {
+ code = "!function(exports, global){global = this;\n" + code + "\n;this." + file.module + " = exports;}({})";
+ }
+ else if (file.hide) {
+ code = "(function(){" + code + "}());";
+ }
+ return squeeze_it(code);
+ }).join("\n"));
+}
+else if (filename) {
+ fs.readFile(filename, "utf8", function(err, text){
+ if (err) throw err;
+ output(squeeze_it(text));
+ });
+}
+else {
+ var stdin = process.openStdin();
+ stdin.setEncoding("utf8");
+ var text = "";
+ stdin.on("data", function(chunk){
+ text += chunk;
+ });
+ stdin.on("end", function() {
+ output(squeeze_it(text));
+ });
+}
+
+function output(text) {
+ var out;
+ if (options.out_same_file && filename)
+ options.output = filename;
+ if (options.output === true) {
+ out = process.stdout;
+ } else {
+ out = fs.createWriteStream(options.output, {
+ flags: "w",
+ encoding: "utf8",
+ mode: 0644
+ });
+ }
+ out.write(text.replace(/;*$/, ";"));
+ if (options.output !== true) {
+ out.end();
+ }
+};
+
+// --------- main ends here.
+
+function show_copyright(comments) {
+ var ret = "";
+ for (var i = 0; i < comments.length; ++i) {
+ var c = comments[i];
+ if (c.type == "comment1") {
+ ret += "//" + c.value + "\n";
+ } else {
+ ret += "/*" + c.value + "*/";
+ }
+ }
+ return ret;
+};
+
+function squeeze_it(code) {
+ var result = "";
+ if (options.show_copyright) {
+ var tok = jsp.tokenizer(code), c;
+ c = tok();
+ result += show_copyright(c.comments_before);
+ }
+ try {
+ var ast = time_it("parse", function(){ return jsp.parse(code); });
+ if (options.consolidate) ast = time_it("consolidate", function(){
+ return consolidator.ast_consolidate(ast);
+ });
+ if (options.lift_vars) {
+ ast = time_it("lift", function(){ return pro.ast_lift_variables(ast); });
+ }
+ if (options.mangle) ast = time_it("mangle", function(){
+ return pro.ast_mangle(ast, {
+ toplevel : options.mangle_toplevel,
+ defines : options.defines,
+ except : options.reserved_names,
+ no_functions : options.no_mangle_functions
+ });
+ });
+ if (options.squeeze) ast = time_it("squeeze", function(){
+ ast = pro.ast_squeeze(ast, {
+ make_seqs : options.make_seqs,
+ dead_code : options.dead_code,
+ keep_comps : !options.unsafe
+ });
+ if (options.unsafe)
+ ast = pro.ast_squeeze_more(ast);
+ return ast;
+ });
+ if (options.ast)
+ return sys.inspect(ast, null, null);
+ result += time_it("generate", function(){ return pro.gen_code(ast, options.codegen_options) });
+ if (!options.codegen_options.beautify && options.max_line_length) {
+ result = time_it("split", function(){ return pro.split_lines(result, options.max_line_length) });
+ }
+ return result;
+ } catch(ex) {
+ sys.debug(ex.stack);
+ sys.debug(sys.inspect(ex));
+ sys.debug(JSON.stringify(ex));
+ process.exit(1);
+ }
+};
+
+function time_it(name, cont) {
+ if (!options.verbose)
+ return cont();
+ var t1 = new Date().getTime();
+ try { return cont(); }
+ finally { sys.debug("// " + name + ": " + ((new Date().getTime() - t1) / 1000).toFixed(3) + " sec."); }
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/docstyle.css b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/docstyle.css
new file mode 100644
index 000000000..412481fe6
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/docstyle.css
@@ -0,0 +1,75 @@
+html { font-family: "Lucida Grande","Trebuchet MS",sans-serif; font-size: 12pt; }
+body { max-width: 60em; }
+.title { text-align: center; }
+.todo { color: red; }
+.done { color: green; }
+.tag { background-color:lightblue; font-weight:normal }
+.target { }
+.timestamp { color: grey }
+.timestamp-kwd { color: CadetBlue }
+p.verse { margin-left: 3% }
+pre {
+ border: 1pt solid #AEBDCC;
+ background-color: #F3F5F7;
+ padding: 5pt;
+ font-family: monospace;
+ font-size: 90%;
+ overflow:auto;
+}
+pre.src {
+ background-color: #eee; color: #112; border: 1px solid #000;
+}
+table { border-collapse: collapse; }
+td, th { vertical-align: top; }
+dt { font-weight: bold; }
+div.figure { padding: 0.5em; }
+div.figure p { text-align: center; }
+.linenr { font-size:smaller }
+.code-highlighted {background-color:#ffff00;}
+.org-info-js_info-navigation { border-style:none; }
+#org-info-js_console-label { font-size:10px; font-weight:bold;
+ white-space:nowrap; }
+.org-info-js_search-highlight {background-color:#ffff00; color:#000000;
+ font-weight:bold; }
+
+sup {
+ vertical-align: baseline;
+ position: relative;
+ top: -0.5em;
+ font-size: 80%;
+}
+
+sup a:link, sup a:visited {
+ text-decoration: none;
+ color: #c00;
+}
+
+sup a:before { content: "["; color: #999; }
+sup a:after { content: "]"; color: #999; }
+
+h1.title { border-bottom: 4px solid #000; padding-bottom: 5px; margin-bottom: 2em; }
+
+#postamble {
+ color: #777;
+ font-size: 90%;
+ padding-top: 1em; padding-bottom: 1em; border-top: 1px solid #999;
+ margin-top: 2em;
+ padding-left: 2em;
+ padding-right: 2em;
+ text-align: right;
+}
+
+#postamble p { margin: 0; }
+
+#footnotes { border-top: 1px solid #000; }
+
+h1 { font-size: 200% }
+h2 { font-size: 175% }
+h3 { font-size: 150% }
+h4 { font-size: 125% }
+
+h1, h2, h3, h4 { font-family: "Bookman",Georgia,"Times New Roman",serif; font-weight: normal; }
+
+@media print {
+ html { font-size: 11pt; }
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/lib/consolidator.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/lib/consolidator.js
new file mode 100644
index 000000000..d39674d2e
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/lib/consolidator.js
@@ -0,0 +1,2599 @@
+/**
+ * @preserve Copyright 2012 Robert Gust-Bardon <http://robert.gust-bardon.org/>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/**
+ * @fileoverview Enhances <a href="https://github.com/mishoo/UglifyJS/"
+ * >UglifyJS</a> with consolidation of null, Boolean, and String values.
+ * <p>Also known as aliasing, this feature has been deprecated in <a href=
+ * "http://closure-compiler.googlecode.com/">the Closure Compiler</a> since its
+ * initial release, where it is unavailable from the <abbr title=
+ * "command line interface">CLI</a>. The Closure Compiler allows one to log and
+ * influence this process. In contrast, this implementation does not introduce
+ * any variable declarations in global code and derives String values from
+ * identifier names used as property accessors.</p>
+ * <p>Consolidating literals may worsen the data compression ratio when an <a
+ * href="http://tools.ietf.org/html/rfc2616#section-3.5">encoding
+ * transformation</a> is applied. For instance, <a href=
+ * "http://code.jquery.com/jquery-1.7.1.js">jQuery 1.7.1</a> takes 248235 bytes.
+ * Building it with <a href="https://github.com/mishoo/UglifyJS/tarball/v1.2.5">
+ * UglifyJS v1.2.5</a> results in 93647 bytes (37.73% of the original) which are
+ * then compressed to 33154 bytes (13.36% of the original) using <a href=
+ * "http://linux.die.net/man/1/gzip">gzip(1)</a>. Building it with the same
+ * version of UglifyJS 1.2.5 patched with the implementation of consolidation
+ * results in 80784 bytes (a decrease of 12863 bytes, i.e. 13.74%, in comparison
+ * to the aforementioned 93647 bytes) which are then compressed to 34013 bytes
+ * (an increase of 859 bytes, i.e. 2.59%, in comparison to the aforementioned
+ * 33154 bytes).</p>
+ * <p>Written in <a href="http://es5.github.com/#x4.2.2">the strict variant</a>
+ * of <a href="http://es5.github.com/">ECMA-262 5.1 Edition</a>. Encoded in <a
+ * href="http://tools.ietf.org/html/rfc3629">UTF-8</a>. Follows <a href=
+ * "http://google-styleguide.googlecode.com/svn-history/r76/trunk/javascriptguide.xml"
+ * >Revision 2.28 of the Google JavaScript Style Guide</a> (except for the
+ * discouraged use of the {@code function} tag and the {@code namespace} tag).
+ * 100% typed for the <a href=
+ * "http://closure-compiler.googlecode.com/files/compiler-20120123.tar.gz"
+ * >Closure Compiler Version 1741</a>.</p>
+ * <p>Should you find this software useful, please consider <a href=
+ * "https://paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=JZLW72X8FD4WG"
+ * >a donation</a>.</p>
+ * @author follow.me@RGustBardon (Robert Gust-Bardon)
+ * @supported Tested with:
+ * <ul>
+ * <li><a href="http://nodejs.org/dist/v0.6.10/">Node v0.6.10</a>,</li>
+ * <li><a href="https://github.com/mishoo/UglifyJS/tarball/v1.2.5">UglifyJS
+ * v1.2.5</a>.</li>
+ * </ul>
+ */
+
+/*global console:false, exports:true, module:false, require:false */
+/*jshint sub:true */
+/**
+ * Consolidates null, Boolean, and String values found inside an <abbr title=
+ * "abstract syntax tree">AST</abbr>.
+ * @param {!TSyntacticCodeUnit} oAbstractSyntaxTree An array-like object
+ * representing an <abbr title="abstract syntax tree">AST</abbr>.
+ * @return {!TSyntacticCodeUnit} An array-like object representing an <abbr
+ * title="abstract syntax tree">AST</abbr> with its null, Boolean, and
+ * String values consolidated.
+ */
+// TODO(user) Consolidation of mathematical values found in numeric literals.
+// TODO(user) Unconsolidation.
+// TODO(user) Consolidation of ECMA-262 6th Edition programs.
+// TODO(user) Rewrite in ECMA-262 6th Edition.
+exports['ast_consolidate'] = function(oAbstractSyntaxTree) {
+ 'use strict';
+ /*jshint bitwise:true, curly:true, eqeqeq:true, forin:true, immed:true,
+ latedef:true, newcap:true, noarge:true, noempty:true, nonew:true,
+ onevar:true, plusplus:true, regexp:true, undef:true, strict:true,
+ sub:false, trailing:true */
+
+ var _,
+ /**
+ * A record consisting of data about one or more source elements.
+ * @constructor
+ * @nosideeffects
+ */
+ TSourceElementsData = function() {
+ /**
+ * The category of the elements.
+ * @type {number}
+ * @see ESourceElementCategories
+ */
+ this.nCategory = ESourceElementCategories.N_OTHER;
+ /**
+ * The number of occurrences (within the elements) of each primitive
+ * value that could be consolidated.
+ * @type {!Array.<!Object.<string, number>>}
+ */
+ this.aCount = [];
+ this.aCount[EPrimaryExpressionCategories.N_IDENTIFIER_NAMES] = {};
+ this.aCount[EPrimaryExpressionCategories.N_STRING_LITERALS] = {};
+ this.aCount[EPrimaryExpressionCategories.N_NULL_AND_BOOLEAN_LITERALS] =
+ {};
+ /**
+ * Identifier names found within the elements.
+ * @type {!Array.<string>}
+ */
+ this.aIdentifiers = [];
+ /**
+ * Prefixed representation Strings of each primitive value that could be
+ * consolidated within the elements.
+ * @type {!Array.<string>}
+ */
+ this.aPrimitiveValues = [];
+ },
+ /**
+ * A record consisting of data about a primitive value that could be
+ * consolidated.
+ * @constructor
+ * @nosideeffects
+ */
+ TPrimitiveValue = function() {
+ /**
+ * The difference in the number of terminal symbols between the original
+ * source text and the one with the primitive value consolidated. If the
+ * difference is positive, the primitive value is considered worthwhile.
+ * @type {number}
+ */
+ this.nSaving = 0;
+ /**
+ * An identifier name of the variable that will be declared and assigned
+ * the primitive value if the primitive value is consolidated.
+ * @type {string}
+ */
+ this.sName = '';
+ },
+ /**
+ * A record consisting of data on what to consolidate within the range of
+ * source elements that is currently being considered.
+ * @constructor
+ * @nosideeffects
+ */
+ TSolution = function() {
+ /**
+ * An object whose keys are prefixed representation Strings of each
+ * primitive value that could be consolidated within the elements and
+ * whose values are corresponding data about those primitive values.
+ * @type {!Object.<string, {nSaving: number, sName: string}>}
+ * @see TPrimitiveValue
+ */
+ this.oPrimitiveValues = {};
+ /**
+ * The difference in the number of terminal symbols between the original
+ * source text and the one with all the worthwhile primitive values
+ * consolidated.
+ * @type {number}
+ * @see TPrimitiveValue#nSaving
+ */
+ this.nSavings = 0;
+ },
+ /**
+ * The processor of <abbr title="abstract syntax tree">AST</abbr>s found
+ * in UglifyJS.
+ * @namespace
+ * @type {!TProcessor}
+ */
+ oProcessor = (/** @type {!TProcessor} */ require('./process')),
+ /**
+ * A record consisting of a number of constants that represent the
+ * difference in the number of terminal symbols between a source text with
+ * a modified syntactic code unit and the original one.
+ * @namespace
+ * @type {!Object.<string, number>}
+ */
+ oWeights = {
+ /**
+ * The difference in the number of punctuators required by the bracket
+ * notation and the dot notation.
+ * <p><code>'[]'.length - '.'.length</code></p>
+ * @const
+ * @type {number}
+ */
+ N_PROPERTY_ACCESSOR: 1,
+ /**
+ * The number of punctuators required by a variable declaration with an
+ * initialiser.
+ * <p><code>':'.length + ';'.length</code></p>
+ * @const
+ * @type {number}
+ */
+ N_VARIABLE_DECLARATION: 2,
+ /**
+ * The number of terminal symbols required to introduce a variable
+ * statement (excluding its variable declaration list).
+ * <p><code>'var '.length</code></p>
+ * @const
+ * @type {number}
+ */
+ N_VARIABLE_STATEMENT_AFFIXATION: 4,
+ /**
+ * The number of terminal symbols needed to enclose source elements
+ * within a function call with no argument values to a function with an
+ * empty parameter list.
+ * <p><code>'(function(){}());'.length</code></p>
+ * @const
+ * @type {number}
+ */
+ N_CLOSURE: 17
+ },
+ /**
+ * Categories of primary expressions from which primitive values that
+ * could be consolidated are derivable.
+ * @namespace
+ * @enum {number}
+ */
+ EPrimaryExpressionCategories = {
+ /**
+ * Identifier names used as property accessors.
+ * @type {number}
+ */
+ N_IDENTIFIER_NAMES: 0,
+ /**
+ * String literals.
+ * @type {number}
+ */
+ N_STRING_LITERALS: 1,
+ /**
+ * Null and Boolean literals.
+ * @type {number}
+ */
+ N_NULL_AND_BOOLEAN_LITERALS: 2
+ },
+ /**
+ * Prefixes of primitive values that could be consolidated.
+ * The String values of the prefixes must have same number of characters.
+ * The prefixes must not be used in any properties defined in any version
+ * of <a href=
+ * "http://www.ecma-international.org/publications/standards/Ecma-262.htm"
+ * >ECMA-262</a>.
+ * @namespace
+ * @enum {string}
+ */
+ EValuePrefixes = {
+ /**
+ * Identifies String values.
+ * @type {string}
+ */
+ S_STRING: '#S',
+ /**
+ * Identifies null and Boolean values.
+ * @type {string}
+ */
+ S_SYMBOLIC: '#O'
+ },
+ /**
+ * Categories of source elements in terms of their appropriateness of
+ * having their primitive values consolidated.
+ * @namespace
+ * @enum {number}
+ */
+ ESourceElementCategories = {
+ /**
+ * Identifies a source element that includes the <a href=
+ * "http://es5.github.com/#x12.10">{@code with}</a> statement.
+ * @type {number}
+ */
+ N_WITH: 0,
+ /**
+ * Identifies a source element that includes the <a href=
+ * "http://es5.github.com/#x15.1.2.1">{@code eval}</a> identifier name.
+ * @type {number}
+ */
+ N_EVAL: 1,
+ /**
+ * Identifies a source element that must be excluded from the process
+ * unless its whole scope is examined.
+ * @type {number}
+ */
+ N_EXCLUDABLE: 2,
+ /**
+ * Identifies source elements not posing any problems.
+ * @type {number}
+ */
+ N_OTHER: 3
+ },
+ /**
+ * The list of literals (other than the String ones) whose primitive
+ * values can be consolidated.
+ * @const
+ * @type {!Array.<string>}
+ */
+ A_OTHER_SUBSTITUTABLE_LITERALS = [
+ 'null', // The null literal.
+ 'false', // The Boolean literal {@code false}.
+ 'true' // The Boolean literal {@code true}.
+ ];
+
+ (/**
+ * Consolidates all worthwhile primitive values in a syntactic code unit.
+ * @param {!TSyntacticCodeUnit} oSyntacticCodeUnit An array-like object
+ * representing the branch of the abstract syntax tree representing the
+ * syntactic code unit along with its scope.
+ * @see TPrimitiveValue#nSaving
+ */
+ function fExamineSyntacticCodeUnit(oSyntacticCodeUnit) {
+ var _,
+ /**
+ * Indicates whether the syntactic code unit represents global code.
+ * @type {boolean}
+ */
+ bIsGlobal = 'toplevel' === oSyntacticCodeUnit[0],
+ /**
+ * Indicates whether the whole scope is being examined.
+ * @type {boolean}
+ */
+ bIsWhollyExaminable = !bIsGlobal,
+ /**
+ * An array-like object representing source elements that constitute a
+ * syntactic code unit.
+ * @type {!TSyntacticCodeUnit}
+ */
+ oSourceElements,
+ /**
+ * A record consisting of data about the source element that is
+ * currently being examined.
+ * @type {!TSourceElementsData}
+ */
+ oSourceElementData,
+ /**
+ * The scope of the syntactic code unit.
+ * @type {!TScope}
+ */
+ oScope,
+ /**
+ * An instance of an object that allows the traversal of an <abbr
+ * title="abstract syntax tree">AST</abbr>.
+ * @type {!TWalker}
+ */
+ oWalker,
+ /**
+ * An object encompassing collections of functions used during the
+ * traversal of an <abbr title="abstract syntax tree">AST</abbr>.
+ * @namespace
+ * @type {!Object.<string, !Object.<string, function(...[*])>>}
+ */
+ oWalkers = {
+ /**
+ * A collection of functions used during the surveyance of source
+ * elements.
+ * @namespace
+ * @type {!Object.<string, function(...[*])>}
+ */
+ oSurveySourceElement: {
+ /**#nocode+*/ // JsDoc Toolkit 2.4.0 hides some of the keys.
+ /**
+ * Classifies the source element as excludable if it does not
+ * contain a {@code with} statement or the {@code eval} identifier
+ * name. Adds the identifier of the function and its formal
+ * parameters to the list of identifier names found.
+ * @param {string} sIdentifier The identifier of the function.
+ * @param {!Array.<string>} aFormalParameterList Formal parameters.
+ * @param {!TSyntacticCodeUnit} oFunctionBody Function code.
+ */
+ 'defun': function(
+ sIdentifier,
+ aFormalParameterList,
+ oFunctionBody) {
+ fClassifyAsExcludable();
+ fAddIdentifier(sIdentifier);
+ aFormalParameterList.forEach(fAddIdentifier);
+ },
+ /**
+ * Increments the count of the number of occurrences of the String
+ * value that is equivalent to the sequence of terminal symbols
+ * that constitute the encountered identifier name.
+ * @param {!TSyntacticCodeUnit} oExpression The nonterminal
+ * MemberExpression.
+ * @param {string} sIdentifierName The identifier name used as the
+ * property accessor.
+ * @return {!Array} The encountered branch of an <abbr title=
+ * "abstract syntax tree">AST</abbr> with its nonterminal
+ * MemberExpression traversed.
+ */
+ 'dot': function(oExpression, sIdentifierName) {
+ fCountPrimaryExpression(
+ EPrimaryExpressionCategories.N_IDENTIFIER_NAMES,
+ EValuePrefixes.S_STRING + sIdentifierName);
+ return ['dot', oWalker.walk(oExpression), sIdentifierName];
+ },
+ /**
+ * Adds the optional identifier of the function and its formal
+ * parameters to the list of identifier names found.
+ * @param {?string} sIdentifier The optional identifier of the
+ * function.
+ * @param {!Array.<string>} aFormalParameterList Formal parameters.
+ * @param {!TSyntacticCodeUnit} oFunctionBody Function code.
+ */
+ 'function': function(
+ sIdentifier,
+ aFormalParameterList,
+ oFunctionBody) {
+ if ('string' === typeof sIdentifier) {
+ fAddIdentifier(sIdentifier);
+ }
+ aFormalParameterList.forEach(fAddIdentifier);
+ },
+ /**
+ * Either increments the count of the number of occurrences of the
+ * encountered null or Boolean value or classifies a source element
+ * as containing the {@code eval} identifier name.
+ * @param {string} sIdentifier The identifier encountered.
+ */
+ 'name': function(sIdentifier) {
+ if (-1 !== A_OTHER_SUBSTITUTABLE_LITERALS.indexOf(sIdentifier)) {
+ fCountPrimaryExpression(
+ EPrimaryExpressionCategories.N_NULL_AND_BOOLEAN_LITERALS,
+ EValuePrefixes.S_SYMBOLIC + sIdentifier);
+ } else {
+ if ('eval' === sIdentifier) {
+ oSourceElementData.nCategory =
+ ESourceElementCategories.N_EVAL;
+ }
+ fAddIdentifier(sIdentifier);
+ }
+ },
+ /**
+ * Classifies the source element as excludable if it does not
+ * contain a {@code with} statement or the {@code eval} identifier
+ * name.
+ * @param {TSyntacticCodeUnit} oExpression The expression whose
+ * value is to be returned.
+ */
+ 'return': function(oExpression) {
+ fClassifyAsExcludable();
+ },
+ /**
+ * Increments the count of the number of occurrences of the
+ * encountered String value.
+ * @param {string} sStringValue The String value of the string
+ * literal encountered.
+ */
+ 'string': function(sStringValue) {
+ if (sStringValue.length > 0) {
+ fCountPrimaryExpression(
+ EPrimaryExpressionCategories.N_STRING_LITERALS,
+ EValuePrefixes.S_STRING + sStringValue);
+ }
+ },
+ /**
+ * Adds the identifier reserved for an exception to the list of
+ * identifier names found.
+ * @param {!TSyntacticCodeUnit} oTry A block of code in which an
+ * exception can occur.
+ * @param {Array} aCatch The identifier reserved for an exception
+ * and a block of code to handle the exception.
+ * @param {TSyntacticCodeUnit} oFinally An optional block of code
+ * to be evaluated regardless of whether an exception occurs.
+ */
+ 'try': function(oTry, aCatch, oFinally) {
+ if (Array.isArray(aCatch)) {
+ fAddIdentifier(aCatch[0]);
+ }
+ },
+ /**
+ * Classifies the source element as excludable if it does not
+ * contain a {@code with} statement or the {@code eval} identifier
+ * name. Adds the identifier of each declared variable to the list
+ * of identifier names found.
+ * @param {!Array.<!Array>} aVariableDeclarationList Variable
+ * declarations.
+ */
+ 'var': function(aVariableDeclarationList) {
+ fClassifyAsExcludable();
+ aVariableDeclarationList.forEach(fAddVariable);
+ },
+ /**
+ * Classifies a source element as containing the {@code with}
+ * statement.
+ * @param {!TSyntacticCodeUnit} oExpression An expression whose
+ * value is to be converted to a value of type Object and
+ * become the binding object of a new object environment
+ * record of a new lexical environment in which the statement
+ * is to be executed.
+ * @param {!TSyntacticCodeUnit} oStatement The statement to be
+ * executed in the augmented lexical environment.
+ * @return {!Array} An empty array to stop the traversal.
+ */
+ 'with': function(oExpression, oStatement) {
+ oSourceElementData.nCategory = ESourceElementCategories.N_WITH;
+ return [];
+ }
+ /**#nocode-*/ // JsDoc Toolkit 2.4.0 hides some of the keys.
+ },
+ /**
+ * A collection of functions used while looking for nested functions.
+ * @namespace
+ * @type {!Object.<string, function(...[*])>}
+ */
+ oExamineFunctions: {
+ /**#nocode+*/ // JsDoc Toolkit 2.4.0 hides some of the keys.
+ /**
+ * Orders an examination of a nested function declaration.
+ * @this {!TSyntacticCodeUnit} An array-like object representing
+ * the branch of an <abbr title="abstract syntax tree"
+ * >AST</abbr> representing the syntactic code unit along with
+ * its scope.
+ * @return {!Array} An empty array to stop the traversal.
+ */
+ 'defun': function() {
+ fExamineSyntacticCodeUnit(this);
+ return [];
+ },
+ /**
+ * Orders an examination of a nested function expression.
+ * @this {!TSyntacticCodeUnit} An array-like object representing
+ * the branch of an <abbr title="abstract syntax tree"
+ * >AST</abbr> representing the syntactic code unit along with
+ * its scope.
+ * @return {!Array} An empty array to stop the traversal.
+ */
+ 'function': function() {
+ fExamineSyntacticCodeUnit(this);
+ return [];
+ }
+ /**#nocode-*/ // JsDoc Toolkit 2.4.0 hides some of the keys.
+ }
+ },
+ /**
+ * Records containing data about source elements.
+ * @type {Array.<TSourceElementsData>}
+ */
+ aSourceElementsData = [],
+ /**
+ * The index (in the source text order) of the source element
+ * immediately following a <a href="http://es5.github.com/#x14.1"
+ * >Directive Prologue</a>.
+ * @type {number}
+ */
+ nAfterDirectivePrologue = 0,
+ /**
+ * The index (in the source text order) of the source element that is
+ * currently being considered.
+ * @type {number}
+ */
+ nPosition,
+ /**
+ * The index (in the source text order) of the source element that is
+ * the last element of the range of source elements that is currently
+ * being considered.
+ * @type {(undefined|number)}
+ */
+ nTo,
+ /**
+ * Initiates the traversal of a source element.
+ * @param {!TWalker} oWalker An instance of an object that allows the
+ * traversal of an abstract syntax tree.
+ * @param {!TSyntacticCodeUnit} oSourceElement A source element from
+ * which the traversal should commence.
+ * @return {function(): !TSyntacticCodeUnit} A function that is able to
+ * initiate the traversal from a given source element.
+ */
+ cContext = function(oWalker, oSourceElement) {
+ /**
+ * @return {!TSyntacticCodeUnit} A function that is able to
+ * initiate the traversal from a given source element.
+ */
+ var fLambda = function() {
+ return oWalker.walk(oSourceElement);
+ };
+
+ return fLambda;
+ },
+ /**
+ * Classifies the source element as excludable if it does not
+ * contain a {@code with} statement or the {@code eval} identifier
+ * name.
+ */
+ fClassifyAsExcludable = function() {
+ if (oSourceElementData.nCategory ===
+ ESourceElementCategories.N_OTHER) {
+ oSourceElementData.nCategory =
+ ESourceElementCategories.N_EXCLUDABLE;
+ }
+ },
+ /**
+ * Adds an identifier to the list of identifier names found.
+ * @param {string} sIdentifier The identifier to be added.
+ */
+ fAddIdentifier = function(sIdentifier) {
+ if (-1 === oSourceElementData.aIdentifiers.indexOf(sIdentifier)) {
+ oSourceElementData.aIdentifiers.push(sIdentifier);
+ }
+ },
+ /**
+ * Adds the identifier of a variable to the list of identifier names
+ * found.
+ * @param {!Array} aVariableDeclaration A variable declaration.
+ */
+ fAddVariable = function(aVariableDeclaration) {
+ fAddIdentifier(/** @type {string} */ aVariableDeclaration[0]);
+ },
+ /**
+ * Increments the count of the number of occurrences of the prefixed
+ * String representation attributed to the primary expression.
+ * @param {number} nCategory The category of the primary expression.
+ * @param {string} sName The prefixed String representation attributed
+ * to the primary expression.
+ */
+ fCountPrimaryExpression = function(nCategory, sName) {
+ if (!oSourceElementData.aCount[nCategory].hasOwnProperty(sName)) {
+ oSourceElementData.aCount[nCategory][sName] = 0;
+ if (-1 === oSourceElementData.aPrimitiveValues.indexOf(sName)) {
+ oSourceElementData.aPrimitiveValues.push(sName);
+ }
+ }
+ oSourceElementData.aCount[nCategory][sName] += 1;
+ },
+ /**
+ * Consolidates all worthwhile primitive values in a range of source
+ * elements.
+ * @param {number} nFrom The index (in the source text order) of the
+ * source element that is the first element of the range.
+ * @param {number} nTo The index (in the source text order) of the
+ * source element that is the last element of the range.
+ * @param {boolean} bEnclose Indicates whether the range should be
+ * enclosed within a function call with no argument values to a
+ * function with an empty parameter list if any primitive values
+ * are consolidated.
+ * @see TPrimitiveValue#nSaving
+ */
+ fExamineSourceElements = function(nFrom, nTo, bEnclose) {
+ var _,
+ /**
+ * The index of the last mangled name.
+ * @type {number}
+ */
+ nIndex = oScope.cname,
+ /**
+ * The index of the source element that is currently being
+ * considered.
+ * @type {number}
+ */
+ nPosition,
+ /**
+ * A collection of functions used during the consolidation of
+ * primitive values and identifier names used as property
+ * accessors.
+ * @namespace
+ * @type {!Object.<string, function(...[*])>}
+ */
+ oWalkersTransformers = {
+ /**
+ * If the String value that is equivalent to the sequence of
+ * terminal symbols that constitute the encountered identifier
+ * name is worthwhile, a syntactic conversion from the dot
+ * notation to the bracket notation ensues with that sequence
+ * being substituted by an identifier name to which the value
+ * is assigned.
+ * Applies to property accessors that use the dot notation.
+ * @param {!TSyntacticCodeUnit} oExpression The nonterminal
+ * MemberExpression.
+ * @param {string} sIdentifierName The identifier name used as
+ * the property accessor.
+ * @return {!Array} A syntactic code unit that is equivalent to
+ * the one encountered.
+ * @see TPrimitiveValue#nSaving
+ */
+ 'dot': function(oExpression, sIdentifierName) {
+ /**
+ * The prefixed String value that is equivalent to the
+ * sequence of terminal symbols that constitute the
+ * encountered identifier name.
+ * @type {string}
+ */
+ var sPrefixed = EValuePrefixes.S_STRING + sIdentifierName;
+
+ return oSolutionBest.oPrimitiveValues.hasOwnProperty(
+ sPrefixed) &&
+ oSolutionBest.oPrimitiveValues[sPrefixed].nSaving > 0 ?
+ ['sub',
+ oWalker.walk(oExpression),
+ ['name',
+ oSolutionBest.oPrimitiveValues[sPrefixed].sName]] :
+ ['dot', oWalker.walk(oExpression), sIdentifierName];
+ },
+ /**
+ * If the encountered identifier is a null or Boolean literal
+ * and its value is worthwhile, the identifier is substituted
+ * by an identifier name to which that value is assigned.
+ * Applies to identifier names.
+ * @param {string} sIdentifier The identifier encountered.
+ * @return {!Array} A syntactic code unit that is equivalent to
+ * the one encountered.
+ * @see TPrimitiveValue#nSaving
+ */
+ 'name': function(sIdentifier) {
+ /**
+ * The prefixed representation String of the identifier.
+ * @type {string}
+ */
+ var sPrefixed = EValuePrefixes.S_SYMBOLIC + sIdentifier;
+
+ return [
+ 'name',
+ oSolutionBest.oPrimitiveValues.hasOwnProperty(sPrefixed) &&
+ oSolutionBest.oPrimitiveValues[sPrefixed].nSaving > 0 ?
+ oSolutionBest.oPrimitiveValues[sPrefixed].sName :
+ sIdentifier
+ ];
+ },
+ /**
+ * If the encountered String value is worthwhile, it is
+ * substituted by an identifier name to which that value is
+ * assigned.
+ * Applies to String values.
+ * @param {string} sStringValue The String value of the string
+ * literal encountered.
+ * @return {!Array} A syntactic code unit that is equivalent to
+ * the one encountered.
+ * @see TPrimitiveValue#nSaving
+ */
+ 'string': function(sStringValue) {
+ /**
+ * The prefixed representation String of the primitive value
+ * of the literal.
+ * @type {string}
+ */
+ var sPrefixed =
+ EValuePrefixes.S_STRING + sStringValue;
+
+ return oSolutionBest.oPrimitiveValues.hasOwnProperty(
+ sPrefixed) &&
+ oSolutionBest.oPrimitiveValues[sPrefixed].nSaving > 0 ?
+ ['name',
+ oSolutionBest.oPrimitiveValues[sPrefixed].sName] :
+ ['string', sStringValue];
+ }
+ },
+ /**
+ * Such data on what to consolidate within the range of source
+ * elements that is currently being considered that lead to the
+ * greatest known reduction of the number of the terminal symbols
+ * in comparison to the original source text.
+ * @type {!TSolution}
+ */
+ oSolutionBest = new TSolution(),
+ /**
+ * Data representing an ongoing attempt to find a better
+ * reduction of the number of the terminal symbols in comparison
+ * to the original source text than the best one that is
+ * currently known.
+ * @type {!TSolution}
+ * @see oSolutionBest
+ */
+ oSolutionCandidate = new TSolution(),
+ /**
+ * A record consisting of data about the range of source elements
+ * that is currently being examined.
+ * @type {!TSourceElementsData}
+ */
+ oSourceElementsData = new TSourceElementsData(),
+ /**
+ * Variable declarations for each primitive value that is to be
+ * consolidated within the elements.
+ * @type {!Array.<!Array>}
+ */
+ aVariableDeclarations = [],
+ /**
+ * Augments a list with a prefixed representation String.
+ * @param {!Array.<string>} aList A list that is to be augmented.
+ * @return {function(string)} A function that augments a list
+ * with a prefixed representation String.
+ */
+ cAugmentList = function(aList) {
+ /**
+ * @param {string} sPrefixed Prefixed representation String of
+ * a primitive value that could be consolidated within the
+ * elements.
+ */
+ var fLambda = function(sPrefixed) {
+ if (-1 === aList.indexOf(sPrefixed)) {
+ aList.push(sPrefixed);
+ }
+ };
+
+ return fLambda;
+ },
+ /**
+ * Adds the number of occurrences of a primitive value of a given
+ * category that could be consolidated in the source element with
+ * a given index to the count of occurrences of that primitive
+ * value within the range of source elements that is currently
+ * being considered.
+ * @param {number} nPosition The index (in the source text order)
+ * of a source element.
+ * @param {number} nCategory The category of the primary
+ * expression from which the primitive value is derived.
+ * @return {function(string)} A function that performs the
+ * addition.
+ * @see cAddOccurrencesInCategory
+ */
+ cAddOccurrences = function(nPosition, nCategory) {
+ /**
+ * @param {string} sPrefixed The prefixed representation String
+ * of a primitive value.
+ */
+ var fLambda = function(sPrefixed) {
+ if (!oSourceElementsData.aCount[nCategory].hasOwnProperty(
+ sPrefixed)) {
+ oSourceElementsData.aCount[nCategory][sPrefixed] = 0;
+ }
+ oSourceElementsData.aCount[nCategory][sPrefixed] +=
+ aSourceElementsData[nPosition].aCount[nCategory][
+ sPrefixed];
+ };
+
+ return fLambda;
+ },
+ /**
+ * Adds the number of occurrences of each primitive value of a
+ * given category that could be consolidated in the source
+ * element with a given index to the count of occurrences of that
+ * primitive values within the range of source elements that is
+ * currently being considered.
+ * @param {number} nPosition The index (in the source text order)
+ * of a source element.
+ * @return {function(number)} A function that performs the
+ * addition.
+ * @see fAddOccurrences
+ */
+ cAddOccurrencesInCategory = function(nPosition) {
+ /**
+ * @param {number} nCategory The category of the primary
+ * expression from which the primitive value is derived.
+ */
+ var fLambda = function(nCategory) {
+ Object.keys(
+ aSourceElementsData[nPosition].aCount[nCategory]
+ ).forEach(cAddOccurrences(nPosition, nCategory));
+ };
+
+ return fLambda;
+ },
+ /**
+ * Adds the number of occurrences of each primitive value that
+ * could be consolidated in the source element with a given index
+ * to the count of occurrences of that primitive values within
+ * the range of source elements that is currently being
+ * considered.
+ * @param {number} nPosition The index (in the source text order)
+ * of a source element.
+ */
+ fAddOccurrences = function(nPosition) {
+ Object.keys(aSourceElementsData[nPosition].aCount).forEach(
+ cAddOccurrencesInCategory(nPosition));
+ },
+ /**
+ * Creates a variable declaration for a primitive value if that
+ * primitive value is to be consolidated within the elements.
+ * @param {string} sPrefixed Prefixed representation String of a
+ * primitive value that could be consolidated within the
+ * elements.
+ * @see aVariableDeclarations
+ */
+ cAugmentVariableDeclarations = function(sPrefixed) {
+ if (oSolutionBest.oPrimitiveValues[sPrefixed].nSaving > 0) {
+ aVariableDeclarations.push([
+ oSolutionBest.oPrimitiveValues[sPrefixed].sName,
+ [0 === sPrefixed.indexOf(EValuePrefixes.S_SYMBOLIC) ?
+ 'name' : 'string',
+ sPrefixed.substring(EValuePrefixes.S_SYMBOLIC.length)]
+ ]);
+ }
+ },
+ /**
+ * Sorts primitive values with regard to the difference in the
+ * number of terminal symbols between the original source text
+ * and the one with those primitive values consolidated.
+ * @param {string} sPrefixed0 The prefixed representation String
+ * of the first of the two primitive values that are being
+ * compared.
+ * @param {string} sPrefixed1 The prefixed representation String
+ * of the second of the two primitive values that are being
+ * compared.
+ * @return {number}
+ * <dl>
+ * <dt>-1</dt>
+ * <dd>if the first primitive value must be placed before
+ * the other one,</dd>
+ * <dt>0</dt>
+ * <dd>if the first primitive value may be placed before
+ * the other one,</dd>
+ * <dt>1</dt>
+ * <dd>if the first primitive value must not be placed
+ * before the other one.</dd>
+ * </dl>
+ * @see TSolution.oPrimitiveValues
+ */
+ cSortPrimitiveValues = function(sPrefixed0, sPrefixed1) {
+ /**
+ * The difference between:
+ * <ol>
+ * <li>the difference in the number of terminal symbols
+ * between the original source text and the one with the
+ * first primitive value consolidated, and</li>
+ * <li>the difference in the number of terminal symbols
+ * between the original source text and the one with the
+ * second primitive value consolidated.</li>
+ * </ol>
+ * @type {number}
+ */
+ var nDifference =
+ oSolutionCandidate.oPrimitiveValues[sPrefixed0].nSaving -
+ oSolutionCandidate.oPrimitiveValues[sPrefixed1].nSaving;
+
+ return nDifference > 0 ? -1 : nDifference < 0 ? 1 : 0;
+ },
+ /**
+ * Assigns an identifier name to a primitive value and calculates
+ * whether instances of that primitive value are worth
+ * consolidating.
+ * @param {string} sPrefixed The prefixed representation String
+ * of a primitive value that is being evaluated.
+ */
+ fEvaluatePrimitiveValue = function(sPrefixed) {
+ var _,
+ /**
+ * The index of the last mangled name.
+ * @type {number}
+ */
+ nIndex,
+ /**
+ * The representation String of the primitive value that is
+ * being evaluated.
+ * @type {string}
+ */
+ sName =
+ sPrefixed.substring(EValuePrefixes.S_SYMBOLIC.length),
+ /**
+ * The number of source characters taken up by the
+ * representation String of the primitive value that is
+ * being evaluated.
+ * @type {number}
+ */
+ nLengthOriginal = sName.length,
+ /**
+ * The number of source characters taken up by the
+ * identifier name that could substitute the primitive
+ * value that is being evaluated.
+ * substituted.
+ * @type {number}
+ */
+ nLengthSubstitution,
+ /**
+ * The number of source characters taken up by by the
+ * representation String of the primitive value that is
+ * being evaluated when it is represented by a string
+ * literal.
+ * @type {number}
+ */
+ nLengthString = oProcessor.make_string(sName).length;
+
+ oSolutionCandidate.oPrimitiveValues[sPrefixed] =
+ new TPrimitiveValue();
+ do { // Find an identifier unused in this or any nested scope.
+ nIndex = oScope.cname;
+ oSolutionCandidate.oPrimitiveValues[sPrefixed].sName =
+ oScope.next_mangled();
+ } while (-1 !== oSourceElementsData.aIdentifiers.indexOf(
+ oSolutionCandidate.oPrimitiveValues[sPrefixed].sName));
+ nLengthSubstitution = oSolutionCandidate.oPrimitiveValues[
+ sPrefixed].sName.length;
+ if (0 === sPrefixed.indexOf(EValuePrefixes.S_SYMBOLIC)) {
+ // foo:null, or foo:null;
+ oSolutionCandidate.oPrimitiveValues[sPrefixed].nSaving -=
+ nLengthSubstitution + nLengthOriginal +
+ oWeights.N_VARIABLE_DECLARATION;
+ // null vs foo
+ oSolutionCandidate.oPrimitiveValues[sPrefixed].nSaving +=
+ oSourceElementsData.aCount[
+ EPrimaryExpressionCategories.
+ N_NULL_AND_BOOLEAN_LITERALS][sPrefixed] *
+ (nLengthOriginal - nLengthSubstitution);
+ } else {
+ // foo:'fromCharCode';
+ oSolutionCandidate.oPrimitiveValues[sPrefixed].nSaving -=
+ nLengthSubstitution + nLengthString +
+ oWeights.N_VARIABLE_DECLARATION;
+ // .fromCharCode vs [foo]
+ if (oSourceElementsData.aCount[
+ EPrimaryExpressionCategories.N_IDENTIFIER_NAMES
+ ].hasOwnProperty(sPrefixed)) {
+ oSolutionCandidate.oPrimitiveValues[sPrefixed].nSaving +=
+ oSourceElementsData.aCount[
+ EPrimaryExpressionCategories.N_IDENTIFIER_NAMES
+ ][sPrefixed] *
+ (nLengthOriginal - nLengthSubstitution -
+ oWeights.N_PROPERTY_ACCESSOR);
+ }
+ // 'fromCharCode' vs foo
+ if (oSourceElementsData.aCount[
+ EPrimaryExpressionCategories.N_STRING_LITERALS
+ ].hasOwnProperty(sPrefixed)) {
+ oSolutionCandidate.oPrimitiveValues[sPrefixed].nSaving +=
+ oSourceElementsData.aCount[
+ EPrimaryExpressionCategories.N_STRING_LITERALS
+ ][sPrefixed] *
+ (nLengthString - nLengthSubstitution);
+ }
+ }
+ if (oSolutionCandidate.oPrimitiveValues[sPrefixed].nSaving >
+ 0) {
+ oSolutionCandidate.nSavings +=
+ oSolutionCandidate.oPrimitiveValues[sPrefixed].nSaving;
+ } else {
+ oScope.cname = nIndex; // Free the identifier name.
+ }
+ },
+ /**
+ * Adds a variable declaration to an existing variable statement.
+ * @param {!Array} aVariableDeclaration A variable declaration
+ * with an initialiser.
+ */
+ cAddVariableDeclaration = function(aVariableDeclaration) {
+ (/** @type {!Array} */ oSourceElements[nFrom][1]).unshift(
+ aVariableDeclaration);
+ };
+
+ if (nFrom > nTo) {
+ return;
+ }
+ // If the range is a closure, reuse the closure.
+ if (nFrom === nTo &&
+ 'stat' === oSourceElements[nFrom][0] &&
+ 'call' === oSourceElements[nFrom][1][0] &&
+ 'function' === oSourceElements[nFrom][1][1][0]) {
+ fExamineSyntacticCodeUnit(oSourceElements[nFrom][1][1]);
+ return;
+ }
+ // Create a list of all derived primitive values within the range.
+ for (nPosition = nFrom; nPosition <= nTo; nPosition += 1) {
+ aSourceElementsData[nPosition].aPrimitiveValues.forEach(
+ cAugmentList(oSourceElementsData.aPrimitiveValues));
+ }
+ if (0 === oSourceElementsData.aPrimitiveValues.length) {
+ return;
+ }
+ for (nPosition = nFrom; nPosition <= nTo; nPosition += 1) {
+ // Add the number of occurrences to the total count.
+ fAddOccurrences(nPosition);
+ // Add identifiers of this or any nested scope to the list.
+ aSourceElementsData[nPosition].aIdentifiers.forEach(
+ cAugmentList(oSourceElementsData.aIdentifiers));
+ }
+ // Distribute identifier names among derived primitive values.
+ do { // If there was any progress, find a better distribution.
+ oSolutionBest = oSolutionCandidate;
+ if (Object.keys(oSolutionCandidate.oPrimitiveValues).length > 0) {
+ // Sort primitive values descending by their worthwhileness.
+ oSourceElementsData.aPrimitiveValues.sort(cSortPrimitiveValues);
+ }
+ oSolutionCandidate = new TSolution();
+ oSourceElementsData.aPrimitiveValues.forEach(
+ fEvaluatePrimitiveValue);
+ oScope.cname = nIndex;
+ } while (oSolutionCandidate.nSavings > oSolutionBest.nSavings);
+ // Take the necessity of adding a variable statement into account.
+ if ('var' !== oSourceElements[nFrom][0]) {
+ oSolutionBest.nSavings -= oWeights.N_VARIABLE_STATEMENT_AFFIXATION;
+ }
+ if (bEnclose) {
+ // Take the necessity of forming a closure into account.
+ oSolutionBest.nSavings -= oWeights.N_CLOSURE;
+ }
+ if (oSolutionBest.nSavings > 0) {
+ // Create variable declarations suitable for UglifyJS.
+ Object.keys(oSolutionBest.oPrimitiveValues).forEach(
+ cAugmentVariableDeclarations);
+ // Rewrite expressions that contain worthwhile primitive values.
+ for (nPosition = nFrom; nPosition <= nTo; nPosition += 1) {
+ oWalker = oProcessor.ast_walker();
+ oSourceElements[nPosition] =
+ oWalker.with_walkers(
+ oWalkersTransformers,
+ cContext(oWalker, oSourceElements[nPosition]));
+ }
+ if ('var' === oSourceElements[nFrom][0]) { // Reuse the statement.
+ (/** @type {!Array.<!Array>} */ aVariableDeclarations.reverse(
+ )).forEach(cAddVariableDeclaration);
+ } else { // Add a variable statement.
+ Array.prototype.splice.call(
+ oSourceElements,
+ nFrom,
+ 0,
+ ['var', aVariableDeclarations]);
+ nTo += 1;
+ }
+ if (bEnclose) {
+ // Add a closure.
+ Array.prototype.splice.call(
+ oSourceElements,
+ nFrom,
+ 0,
+ ['stat', ['call', ['function', null, [], []], []]]);
+ // Copy source elements into the closure.
+ for (nPosition = nTo + 1; nPosition > nFrom; nPosition -= 1) {
+ Array.prototype.unshift.call(
+ oSourceElements[nFrom][1][1][3],
+ oSourceElements[nPosition]);
+ }
+ // Remove source elements outside the closure.
+ Array.prototype.splice.call(
+ oSourceElements,
+ nFrom + 1,
+ nTo - nFrom + 1);
+ }
+ }
+ if (bEnclose) {
+ // Restore the availability of identifier names.
+ oScope.cname = nIndex;
+ }
+ };
+
+ oSourceElements = (/** @type {!TSyntacticCodeUnit} */
+ oSyntacticCodeUnit[bIsGlobal ? 1 : 3]);
+ if (0 === oSourceElements.length) {
+ return;
+ }
+ oScope = bIsGlobal ? oSyntacticCodeUnit.scope : oSourceElements.scope;
+ // Skip a Directive Prologue.
+ while (nAfterDirectivePrologue < oSourceElements.length &&
+ 'stat' === oSourceElements[nAfterDirectivePrologue][0] &&
+ 'string' === oSourceElements[nAfterDirectivePrologue][1][0]) {
+ nAfterDirectivePrologue += 1;
+ aSourceElementsData.push(null);
+ }
+ if (oSourceElements.length === nAfterDirectivePrologue) {
+ return;
+ }
+ for (nPosition = nAfterDirectivePrologue;
+ nPosition < oSourceElements.length;
+ nPosition += 1) {
+ oSourceElementData = new TSourceElementsData();
+ oWalker = oProcessor.ast_walker();
+ // Classify a source element.
+ // Find its derived primitive values and count their occurrences.
+ // Find all identifiers used (including nested scopes).
+ oWalker.with_walkers(
+ oWalkers.oSurveySourceElement,
+ cContext(oWalker, oSourceElements[nPosition]));
+ // Establish whether the scope is still wholly examinable.
+ bIsWhollyExaminable = bIsWhollyExaminable &&
+ ESourceElementCategories.N_WITH !== oSourceElementData.nCategory &&
+ ESourceElementCategories.N_EVAL !== oSourceElementData.nCategory;
+ aSourceElementsData.push(oSourceElementData);
+ }
+ if (bIsWhollyExaminable) { // Examine the whole scope.
+ fExamineSourceElements(
+ nAfterDirectivePrologue,
+ oSourceElements.length - 1,
+ false);
+ } else { // Examine unexcluded ranges of source elements.
+ for (nPosition = oSourceElements.length - 1;
+ nPosition >= nAfterDirectivePrologue;
+ nPosition -= 1) {
+ oSourceElementData = (/** @type {!TSourceElementsData} */
+ aSourceElementsData[nPosition]);
+ if (ESourceElementCategories.N_OTHER ===
+ oSourceElementData.nCategory) {
+ if ('undefined' === typeof nTo) {
+ nTo = nPosition; // Indicate the end of a range.
+ }
+ // Examine the range if it immediately follows a Directive Prologue.
+ if (nPosition === nAfterDirectivePrologue) {
+ fExamineSourceElements(nPosition, nTo, true);
+ }
+ } else {
+ if ('undefined' !== typeof nTo) {
+ // Examine the range that immediately follows this source element.
+ fExamineSourceElements(nPosition + 1, nTo, true);
+ nTo = void 0; // Obliterate the range.
+ }
+ // Examine nested functions.
+ oWalker = oProcessor.ast_walker();
+ oWalker.with_walkers(
+ oWalkers.oExamineFunctions,
+ cContext(oWalker, oSourceElements[nPosition]));
+ }
+ }
+ }
+ }(oAbstractSyntaxTree = oProcessor.ast_add_scope(oAbstractSyntaxTree)));
+ return oAbstractSyntaxTree;
+};
+/*jshint sub:false */
+
+
+if (require.main === module) {
+ (function() {
+ 'use strict';
+ /*jshint bitwise:true, curly:true, eqeqeq:true, forin:true, immed:true,
+ latedef:true, newcap:true, noarge:true, noempty:true, nonew:true,
+ onevar:true, plusplus:true, regexp:true, undef:true, strict:true,
+ sub:false, trailing:true */
+
+ var _,
+ /**
+ * NodeJS module for unit testing.
+ * @namespace
+ * @type {!TAssert}
+ * @see http://nodejs.org/docs/v0.6.10/api/all.html#assert
+ */
+ oAssert = (/** @type {!TAssert} */ require('assert')),
+ /**
+ * The parser of ECMA-262 found in UglifyJS.
+ * @namespace
+ * @type {!TParser}
+ */
+ oParser = (/** @type {!TParser} */ require('./parse-js')),
+ /**
+ * The processor of <abbr title="abstract syntax tree">AST</abbr>s
+ * found in UglifyJS.
+ * @namespace
+ * @type {!TProcessor}
+ */
+ oProcessor = (/** @type {!TProcessor} */ require('./process')),
+ /**
+ * An instance of an object that allows the traversal of an <abbr
+ * title="abstract syntax tree">AST</abbr>.
+ * @type {!TWalker}
+ */
+ oWalker,
+ /**
+ * A collection of functions for the removal of the scope information
+ * during the traversal of an <abbr title="abstract syntax tree"
+ * >AST</abbr>.
+ * @namespace
+ * @type {!Object.<string, function(...[*])>}
+ */
+ oWalkersPurifiers = {
+ /**#nocode+*/ // JsDoc Toolkit 2.4.0 hides some of the keys.
+ /**
+ * Deletes the scope information from the branch of the abstract
+ * syntax tree representing the encountered function declaration.
+ * @param {string} sIdentifier The identifier of the function.
+ * @param {!Array.<string>} aFormalParameterList Formal parameters.
+ * @param {!TSyntacticCodeUnit} oFunctionBody Function code.
+ */
+ 'defun': function(
+ sIdentifier,
+ aFormalParameterList,
+ oFunctionBody) {
+ delete oFunctionBody.scope;
+ },
+ /**
+ * Deletes the scope information from the branch of the abstract
+ * syntax tree representing the encountered function expression.
+ * @param {?string} sIdentifier The optional identifier of the
+ * function.
+ * @param {!Array.<string>} aFormalParameterList Formal parameters.
+ * @param {!TSyntacticCodeUnit} oFunctionBody Function code.
+ */
+ 'function': function(
+ sIdentifier,
+ aFormalParameterList,
+ oFunctionBody) {
+ delete oFunctionBody.scope;
+ }
+ /**#nocode-*/ // JsDoc Toolkit 2.4.0 hides some of the keys.
+ },
+ /**
+ * Initiates the traversal of a source element.
+ * @param {!TWalker} oWalker An instance of an object that allows the
+ * traversal of an abstract syntax tree.
+ * @param {!TSyntacticCodeUnit} oSourceElement A source element from
+ * which the traversal should commence.
+ * @return {function(): !TSyntacticCodeUnit} A function that is able to
+ * initiate the traversal from a given source element.
+ */
+ cContext = function(oWalker, oSourceElement) {
+ /**
+ * @return {!TSyntacticCodeUnit} A function that is able to
+ * initiate the traversal from a given source element.
+ */
+ var fLambda = function() {
+ return oWalker.walk(oSourceElement);
+ };
+
+ return fLambda;
+ },
+ /**
+ * A record consisting of configuration for the code generation phase.
+ * @type {!Object}
+ */
+ oCodeGenerationOptions = {
+ beautify: true
+ },
+ /**
+ * Tests whether consolidation of an ECMAScript program yields expected
+ * results.
+ * @param {{
+ * sTitle: string,
+ * sInput: string,
+ * sOutput: string
+ * }} oUnitTest A record consisting of data about a unit test: its
+ * name, an ECMAScript program, and, if consolidation is to take
+ * place, the resulting ECMAScript program.
+ */
+ cAssert = function(oUnitTest) {
+ var _,
+ /**
+ * An array-like object representing the <abbr title=
+ * "abstract syntax tree">AST</abbr> obtained after consolidation.
+ * @type {!TSyntacticCodeUnit}
+ */
+ oSyntacticCodeUnitActual =
+ exports.ast_consolidate(oParser.parse(oUnitTest.sInput)),
+ /**
+ * An array-like object representing the expected <abbr title=
+ * "abstract syntax tree">AST</abbr>.
+ * @type {!TSyntacticCodeUnit}
+ */
+ oSyntacticCodeUnitExpected = oParser.parse(
+ oUnitTest.hasOwnProperty('sOutput') ?
+ oUnitTest.sOutput : oUnitTest.sInput);
+
+ delete oSyntacticCodeUnitActual.scope;
+ oWalker = oProcessor.ast_walker();
+ oWalker.with_walkers(
+ oWalkersPurifiers,
+ cContext(oWalker, oSyntacticCodeUnitActual));
+ try {
+ oAssert.deepEqual(
+ oSyntacticCodeUnitActual,
+ oSyntacticCodeUnitExpected);
+ } catch (oException) {
+ console.error(
+ '########## A unit test has failed.\n' +
+ oUnitTest.sTitle + '\n' +
+ '##### actual code (' +
+ oProcessor.gen_code(oSyntacticCodeUnitActual).length +
+ ' bytes)\n' +
+ oProcessor.gen_code(
+ oSyntacticCodeUnitActual,
+ oCodeGenerationOptions) + '\n' +
+ '##### expected code (' +
+ oProcessor.gen_code(oSyntacticCodeUnitExpected).length +
+ ' bytes)\n' +
+ oProcessor.gen_code(
+ oSyntacticCodeUnitExpected,
+ oCodeGenerationOptions));
+ }
+ };
+
+ [
+ // 7.6.1 Reserved Words.
+ {
+ sTitle:
+ 'Omission of keywords while choosing an identifier name.',
+ sInput:
+ '(function() {' +
+ ' var a, b, c, d, e, f, g, h, i, j, k, l, m,' +
+ ' n, o, p, q, r, s, t, u, v, w, x, y, z,' +
+ ' A, B, C, D, E, F, G, H, I, J, K, L, M,' +
+ ' N, O, P, Q, R, S, T, U, V, W, X, Y, Z,' +
+ ' $, _,' +
+ ' aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am,' +
+ ' an, ao, ap, aq, ar, as, at, au, av, aw, ax, ay, az,' +
+ ' aA, aB, aC, aD, aE, aF, aG, aH, aI, aJ, aK, aL, aM,' +
+ ' aN, aO, aP, aQ, aR, aS, aT, aU, aV, aW, aX, aY, aZ,' +
+ ' a$, a_,' +
+ ' ba, bb, bc, bd, be, bf, bg, bh, bi, bj, bk, bl, bm,' +
+ ' bn, bo, bp, bq, br, bs, bt, bu, bv, bw, bx, by, bz,' +
+ ' bA, bB, bC, bD, bE, bF, bG, bH, bI, bJ, bK, bL, bM,' +
+ ' bN, bO, bP, bQ, bR, bS, bT, bU, bV, bW, bX, bY, bZ,' +
+ ' b$, b_,' +
+ ' ca, cb, cc, cd, ce, cf, cg, ch, ci, cj, ck, cl, cm,' +
+ ' cn, co, cp, cq, cr, cs, ct, cu, cv, cw, cx, cy, cz,' +
+ ' cA, cB, cC, cD, cE, cF, cG, cH, cI, cJ, cK, cL, cM,' +
+ ' cN, cO, cP, cQ, cR, cS, cT, cU, cV, cW, cX, cY, cZ,' +
+ ' c$, c_,' +
+ ' da, db, dc, dd, de, df, dg, dh, di, dj, dk, dl, dm,' +
+ ' dn, dq, dr, ds, dt, du, dv, dw, dx, dy, dz,' +
+ ' dA, dB, dC, dD, dE, dF, dG, dH, dI, dJ, dK, dL, dM,' +
+ ' dN, dO, dP, dQ, dR, dS, dT, dU, dV, dW, dX, dY, dZ,' +
+ ' d$, d_;' +
+ ' void ["abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",' +
+ ' "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"];' +
+ '}());',
+ sOutput:
+ '(function() {' +
+ ' var dp =' +
+ ' "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",' +
+ ' a, b, c, d, e, f, g, h, i, j, k, l, m,' +
+ ' n, o, p, q, r, s, t, u, v, w, x, y, z,' +
+ ' A, B, C, D, E, F, G, H, I, J, K, L, M,' +
+ ' N, O, P, Q, R, S, T, U, V, W, X, Y, Z,' +
+ ' $, _,' +
+ ' aa, ab, ac, ad, ae, af, ag, ah, ai, aj, ak, al, am,' +
+ ' an, ao, ap, aq, ar, as, at, au, av, aw, ax, ay, az,' +
+ ' aA, aB, aC, aD, aE, aF, aG, aH, aI, aJ, aK, aL, aM,' +
+ ' aN, aO, aP, aQ, aR, aS, aT, aU, aV, aW, aX, aY, aZ,' +
+ ' a$, a_,' +
+ ' ba, bb, bc, bd, be, bf, bg, bh, bi, bj, bk, bl, bm,' +
+ ' bn, bo, bp, bq, br, bs, bt, bu, bv, bw, bx, by, bz,' +
+ ' bA, bB, bC, bD, bE, bF, bG, bH, bI, bJ, bK, bL, bM,' +
+ ' bN, bO, bP, bQ, bR, bS, bT, bU, bV, bW, bX, bY, bZ,' +
+ ' b$, b_,' +
+ ' ca, cb, cc, cd, ce, cf, cg, ch, ci, cj, ck, cl, cm,' +
+ ' cn, co, cp, cq, cr, cs, ct, cu, cv, cw, cx, cy, cz,' +
+ ' cA, cB, cC, cD, cE, cF, cG, cH, cI, cJ, cK, cL, cM,' +
+ ' cN, cO, cP, cQ, cR, cS, cT, cU, cV, cW, cX, cY, cZ,' +
+ ' c$, c_,' +
+ ' da, db, dc, dd, de, df, dg, dh, di, dj, dk, dl, dm,' +
+ ' dn, dq, dr, ds, dt, du, dv, dw, dx, dy, dz,' +
+ ' dA, dB, dC, dD, dE, dF, dG, dH, dI, dJ, dK, dL, dM,' +
+ ' dN, dO, dP, dQ, dR, dS, dT, dU, dV, dW, dX, dY, dZ,' +
+ ' d$, d_;' +
+ ' void [dp, dp];' +
+ '}());'
+ },
+ // 7.8.1 Null Literals.
+ {
+ sTitle:
+ 'Evaluation with regard to the null value.',
+ sInput:
+ '/*jshint evil:true */' +
+ '(function() {' +
+ ' var foo;' +
+ ' void [null, null, null];' +
+ '}());' +
+ 'eval("");' +
+ '(function() {' +
+ ' var foo;' +
+ ' void [null, null];' +
+ '}());',
+ sOutput:
+ '/*jshint evil:true */' +
+ '(function() {' +
+ ' var a = null, foo;' +
+ ' void [a, a, a];' +
+ '}());' +
+ 'eval("");' +
+ '(function() {' +
+ ' var foo;' +
+ ' void [null, null];' +
+ '}());'
+ },
+ // 7.8.2 Boolean Literals.
+ {
+ sTitle:
+ 'Evaluation with regard to the false value.',
+ sInput:
+ '/*jshint evil:true */' +
+ '(function() {' +
+ ' var foo;' +
+ ' void [false, false, false];' +
+ '}());' +
+ 'eval("");' +
+ '(function() {' +
+ ' var foo;' +
+ ' void [false, false];' +
+ '}());',
+ sOutput:
+ '/*jshint evil:true */' +
+ '(function() {' +
+ ' var a = false, foo;' +
+ ' void [a, a, a];' +
+ '}());' +
+ 'eval("");' +
+ '(function() {' +
+ ' var foo;' +
+ ' void [false, false];' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Evaluation with regard to the true value.',
+ sInput:
+ '/*jshint evil:true */' +
+ '(function() {' +
+ ' var foo;' +
+ ' void [true, true, true];' +
+ '}());' +
+ 'eval("");' +
+ '(function() {' +
+ ' var foo;' +
+ ' void [true, true];' +
+ '}());',
+ sOutput:
+ '/*jshint evil:true */' +
+ '(function() {' +
+ ' var a = true, foo;' +
+ ' void [a, a, a];' +
+ '}());' +
+ 'eval("");' +
+ '(function() {' +
+ ' var foo;' +
+ ' void [true, true];' +
+ '}());'
+ },
+ // 7.8.4 String Literals.
+ {
+ sTitle:
+ 'Evaluation with regard to the String value of a string literal.',
+ sInput:
+ '(function() {' +
+ ' var foo;' +
+ ' void ["abcd", "abcd", "abc", "abc"];' +
+ '}());',
+ sOutput:
+ '(function() {' +
+ ' var a = "abcd", foo;' +
+ ' void [a, a, "abc", "abc"];' +
+ '}());'
+ },
+ // 7.8.5 Regular Expression Literals.
+ {
+ sTitle:
+ 'Preservation of the pattern of a regular expression literal.',
+ sInput:
+ 'void [/abcdefghijklmnopqrstuvwxyz/, /abcdefghijklmnopqrstuvwxyz/];'
+ },
+ {
+ sTitle:
+ 'Preservation of the flags of a regular expression literal.',
+ sInput:
+ 'void [/(?:)/gim, /(?:)/gim, /(?:)/gim, /(?:)/gim, /(?:)/gim,' +
+ ' /(?:)/gim, /(?:)/gim, /(?:)/gim, /(?:)/gim, /(?:)/gim,' +
+ ' /(?:)/gim, /(?:)/gim, /(?:)/gim, /(?:)/gim, /(?:)/gim];'
+ },
+ // 10.2 Lexical Environments.
+ {
+ sTitle:
+ 'Preservation of identifier names in the same scope.',
+ sInput:
+ '/*jshint shadow:true */' +
+ 'var a;' +
+ 'function b(i) {' +
+ '}' +
+ 'for (var c; 0 === Math.random(););' +
+ 'for (var d in {});' +
+ 'void ["abcdefghijklmnopqrstuvwxyz"];' +
+ 'void [b(a), b(c), b(d)];' +
+ 'void [typeof e];' +
+ 'i: for (; 0 === Math.random();) {' +
+ ' if (42 === (new Date()).getMinutes()) {' +
+ ' continue i;' +
+ ' } else {' +
+ ' break i;' +
+ ' }' +
+ '}' +
+ 'try {' +
+ '} catch (f) {' +
+ '} finally {' +
+ '}' +
+ '(function g(h) {' +
+ '}());' +
+ 'void [{' +
+ ' i: 42,' +
+ ' "j": 42,' +
+ ' \'k\': 42' +
+ '}];' +
+ 'void ["abcdefghijklmnopqrstuvwxyz"];',
+ sOutput:
+ '/*jshint shadow:true */' +
+ 'var a;' +
+ 'function b(i) {' +
+ '}' +
+ 'for (var c; 0 === Math.random(););' +
+ 'for (var d in {});' +
+ '(function() {' +
+ ' var i = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [i];' +
+ ' void [b(a), b(c), b(d)];' +
+ ' void [typeof e];' +
+ ' i: for (; 0 === Math.random();) {' +
+ ' if (42 === (new Date()).getMinutes()) {' +
+ ' continue i;' +
+ ' } else {' +
+ ' break i;' +
+ ' }' +
+ ' }' +
+ ' try {' +
+ ' } catch (f) {' +
+ ' } finally {' +
+ ' }' +
+ ' (function g(h) {' +
+ ' }());' +
+ ' void [{' +
+ ' i: 42,' +
+ ' "j": 42,' +
+ ' \'k\': 42' +
+ ' }];' +
+ ' void [i];' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Preservation of identifier names in nested function code.',
+ sInput:
+ '(function() {' +
+ ' void ["abcdefghijklmnopqrstuvwxyz"];' +
+ ' (function() {' +
+ ' var a;' +
+ ' for (var b; 0 === Math.random(););' +
+ ' for (var c in {});' +
+ ' void [typeof d];' +
+ ' h: for (; 0 === Math.random();) {' +
+ ' if (42 === (new Date()).getMinutes()) {' +
+ ' continue h;' +
+ ' } else {' +
+ ' break h;' +
+ ' }' +
+ ' }' +
+ ' try {' +
+ ' } catch (e) {' +
+ ' } finally {' +
+ ' }' +
+ ' (function f(g) {' +
+ ' }());' +
+ ' void [{' +
+ ' h: 42,' +
+ ' "i": 42,' +
+ ' \'j\': 42' +
+ ' }];' +
+ ' }());' +
+ ' void ["abcdefghijklmnopqrstuvwxyz"];' +
+ '}());',
+ sOutput:
+ '(function() {' +
+ ' var h = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [h];' +
+ ' (function() {' +
+ ' var a;' +
+ ' for (var b; 0 === Math.random(););' +
+ ' for (var c in {});' +
+ ' void [typeof d];' +
+ ' h: for (; 0 === Math.random();) {' +
+ ' if (42 === (new Date()).getMinutes()) {' +
+ ' continue h;' +
+ ' } else {' +
+ ' break h;' +
+ ' }' +
+ ' }' +
+ ' try {' +
+ ' } catch (e) {' +
+ ' } finally {' +
+ ' }' +
+ ' (function f(g) {' +
+ ' }());' +
+ ' void [{' +
+ ' h: 42,' +
+ ' "i": 42,' +
+ ' \'j\': 42' +
+ ' }];' +
+ ' }());' +
+ ' void [h];' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Consolidation of a closure with other source elements.',
+ sInput:
+ '(function(foo) {' +
+ '}("abcdefghijklmnopqrstuvwxyz"));' +
+ 'void ["abcdefghijklmnopqrstuvwxyz"];',
+ sOutput:
+ '(function() {' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' (function(foo) {' +
+ ' })(a);' +
+ ' void [a];' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Consolidation of function code instead of a sole closure.',
+ sInput:
+ '(function(foo, bar) {' +
+ ' void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];' +
+ '}("abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz"));',
+ sOutput:
+ '(function(foo, bar) {' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [a, a];' +
+ '}("abcdefghijklmnopqrstuvwxyz", "abcdefghijklmnopqrstuvwxyz"));'
+ },
+ // 11.1.5 Object Initialiser.
+ {
+ sTitle:
+ 'Preservation of property names of an object initialiser.',
+ sInput:
+ 'var foo = {' +
+ ' abcdefghijklmnopqrstuvwxyz: 42,' +
+ ' "zyxwvutsrqponmlkjihgfedcba": 42,' +
+ ' \'mlkjihgfedcbanopqrstuvwxyz\': 42' +
+ '};' +
+ 'void [' +
+ ' foo.abcdefghijklmnopqrstuvwxyz,' +
+ ' "zyxwvutsrqponmlkjihgfedcba",' +
+ ' \'mlkjihgfedcbanopqrstuvwxyz\'' +
+ '];'
+ },
+ {
+ sTitle:
+ 'Evaluation with regard to String values derived from identifier ' +
+ 'names used as property accessors.',
+ sInput:
+ '(function() {' +
+ ' var foo;' +
+ ' void [' +
+ ' Math.abcdefghij,' +
+ ' Math.abcdefghij,' +
+ ' Math.abcdefghi,' +
+ ' Math.abcdefghi' +
+ ' ];' +
+ '}());',
+ sOutput:
+ '(function() {' +
+ ' var a = "abcdefghij", foo;' +
+ ' void [' +
+ ' Math[a],' +
+ ' Math[a],' +
+ ' Math.abcdefghi,' +
+ ' Math.abcdefghi' +
+ ' ];' +
+ '}());'
+ },
+ // 11.2.1 Property Accessors.
+ {
+ sTitle:
+ 'Preservation of identifiers in the nonterminal MemberExpression.',
+ sInput:
+ 'void [' +
+ ' Math.E,' +
+ ' Math.LN10,' +
+ ' Math.LN2,' +
+ ' Math.LOG2E,' +
+ ' Math.LOG10E,' +
+ ' Math.PI,' +
+ ' Math.SQRT1_2,' +
+ ' Math.SQRT2,' +
+ ' Math.abs,' +
+ ' Math.acos' +
+ '];'
+ },
+ // 12.2 Variable Statement.
+ {
+ sTitle:
+ 'Preservation of the identifier of a variable that is being ' +
+ 'declared in a variable statement.',
+ sInput:
+ '(function() {' +
+ ' var abcdefghijklmnopqrstuvwxyz;' +
+ ' void [abcdefghijklmnopqrstuvwxyz];' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Exclusion of a variable statement in global code.',
+ sInput:
+ 'void ["abcdefghijklmnopqrstuvwxyz"];' +
+ 'var foo = "abcdefghijklmnopqrstuvwxyz",' +
+ ' bar = "abcdefghijklmnopqrstuvwxyz";' +
+ 'void ["abcdefghijklmnopqrstuvwxyz"];'
+ },
+ {
+ sTitle:
+ 'Exclusion of a variable statement in function code that ' +
+ 'contains a with statement.',
+ sInput:
+ '(function() {' +
+ ' with ({});' +
+ ' void ["abcdefghijklmnopqrstuvwxyz"];' +
+ ' var foo;' +
+ ' void ["abcdefghijklmnopqrstuvwxyz"];' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Exclusion of a variable statement in function code that ' +
+ 'contains a direct call to the eval function.',
+ sInput:
+ '/*jshint evil:true */' +
+ 'void [' +
+ ' function() {' +
+ ' eval("");' +
+ ' void ["abcdefghijklmnopqrstuvwxyz"];' +
+ ' var foo;' +
+ ' void ["abcdefghijklmnopqrstuvwxyz"];' +
+ ' }' +
+ '];'
+ },
+ {
+ sTitle:
+ 'Consolidation within a variable statement in global code.',
+ sInput:
+ 'var foo = function() {' +
+ ' void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];' +
+ '};',
+ sOutput:
+ 'var foo = function() {' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [a, a];' +
+ '};'
+ },
+ {
+ sTitle:
+ 'Consolidation within a variable statement excluded in function ' +
+ 'code due to the presence of a with statement.',
+ sInput:
+ '(function() {' +
+ ' with ({});' +
+ ' var foo = function() {' +
+ ' void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];' +
+ ' };' +
+ '}());',
+ sOutput:
+ '(function() {' +
+ ' with ({});' +
+ ' var foo = function() {' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [a, a];' +
+ ' };' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Consolidation within a variable statement excluded in function ' +
+ 'code due to the presence of a direct call to the eval function.',
+ sInput:
+ '/*jshint evil:true */' +
+ '(function() {' +
+ ' eval("");' +
+ ' var foo = function() {' +
+ ' void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];' +
+ ' };' +
+ '}());',
+ sOutput:
+ '/*jshint evil:true */' +
+ '(function() {' +
+ ' eval("");' +
+ ' var foo = function() {' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [a, a];' +
+ ' };' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Inclusion of a variable statement in function code that ' +
+ 'contains no with statement and no direct call to the eval ' +
+ 'function.',
+ sInput:
+ '(function() {' +
+ ' void ["abcdefghijklmnopqrstuvwxyz"];' +
+ ' var foo;' +
+ ' void ["abcdefghijklmnopqrstuvwxyz"];' +
+ '}());',
+ sOutput:
+ '(function() {' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [a];' +
+ ' var foo;' +
+ ' void [a];' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Ignorance with regard to a variable statement in global code.',
+ sInput:
+ 'var foo = "abcdefghijklmnopqrstuvwxyz";' +
+ 'void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];',
+ sOutput:
+ 'var foo = "abcdefghijklmnopqrstuvwxyz";' +
+ '(function() {' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [a, a];' +
+ '}());'
+ },
+ // 12.4 Expression Statement.
+ {
+ sTitle:
+ 'Preservation of identifiers in an expression statement.',
+ sInput:
+ 'void [typeof abcdefghijklmnopqrstuvwxyz,' +
+ ' typeof abcdefghijklmnopqrstuvwxyz];'
+ },
+ // 12.6.3 The {@code for} Statement.
+ {
+ sTitle:
+ 'Preservation of identifiers in the variable declaration list of ' +
+ 'a for statement.',
+ sInput:
+ 'for (var abcdefghijklmnopqrstuvwxyz; 0 === Math.random(););' +
+ 'for (var abcdefghijklmnopqrstuvwxyz; 0 === Math.random(););'
+ },
+ // 12.6.4 The {@code for-in} Statement.
+ {
+ sTitle:
+ 'Preservation of identifiers in the variable declaration list of ' +
+ 'a for-in statement.',
+ sInput:
+ 'for (var abcdefghijklmnopqrstuvwxyz in {});' +
+ 'for (var abcdefghijklmnopqrstuvwxyz in {});'
+ },
+ // 12.7 The {@code continue} Statement.
+ {
+ sTitle:
+ 'Preservation of the identifier in a continue statement.',
+ sInput:
+ 'abcdefghijklmnopqrstuvwxyz: for (; 0 === Math.random();) {' +
+ ' continue abcdefghijklmnopqrstuvwxyz;' +
+ '}' +
+ 'abcdefghijklmnopqrstuvwxyz: for (; 0 === Math.random();) {' +
+ ' continue abcdefghijklmnopqrstuvwxyz;' +
+ '}'
+ },
+ // 12.8 The {@code break} Statement.
+ {
+ sTitle:
+ 'Preservation of the identifier in a break statement.',
+ sInput:
+ 'abcdefghijklmnopqrstuvwxyz: for (; 0 === Math.random();) {' +
+ ' break abcdefghijklmnopqrstuvwxyz;' +
+ '}' +
+ 'abcdefghijklmnopqrstuvwxyz: for (; 0 === Math.random();) {' +
+ ' break abcdefghijklmnopqrstuvwxyz;' +
+ '}'
+ },
+ // 12.9 The {@code return} Statement.
+ {
+ sTitle:
+ 'Exclusion of a return statement in function code that contains ' +
+ 'a with statement.',
+ sInput:
+ '(function() {' +
+ ' with ({});' +
+ ' void ["abcdefghijklmnopqrstuvwxyz"];' +
+ ' if (0 === Math.random()) {' +
+ ' return;' +
+ ' } else {' +
+ ' }' +
+ ' void ["abcdefghijklmnopqrstuvwxyz"];' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Exclusion of a return statement in function code that contains ' +
+ 'a direct call to the eval function.',
+ sInput:
+ '/*jshint evil:true */' +
+ '(function() {' +
+ ' eval("");' +
+ ' void ["abcdefghijklmnopqrstuvwxyz"];' +
+ ' if (0 === Math.random()) {' +
+ ' return;' +
+ ' } else {' +
+ ' }' +
+ ' void ["abcdefghijklmnopqrstuvwxyz"];' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Consolidation within a return statement excluded in function ' +
+ 'code due to the presence of a with statement.',
+ sInput:
+ '(function() {' +
+ ' with ({});' +
+ ' return function() {' +
+ ' void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];' +
+ ' };' +
+ '}());',
+ sOutput:
+ '(function() {' +
+ ' with ({});' +
+ ' return function() {' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [a, a];' +
+ ' };' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Consolidation within a return statement excluded in function ' +
+ 'code due to the presence of a direct call to the eval function.',
+ sInput:
+ '/*jshint evil:true */' +
+ '(function() {' +
+ ' eval("");' +
+ ' return function() {' +
+ ' void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];' +
+ ' };' +
+ '}());',
+ sOutput:
+ '/*jshint evil:true */' +
+ '(function() {' +
+ ' eval("");' +
+ ' return function() {' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [a, a];' +
+ ' };' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Inclusion of a return statement in function code that contains ' +
+ 'no with statement and no direct call to the eval function.',
+ sInput:
+ '(function() {' +
+ ' void ["abcdefghijklmnopqrstuvwxyz"];' +
+ ' if (0 === Math.random()) {' +
+ ' return;' +
+ ' } else {' +
+ ' }' +
+ ' void ["abcdefghijklmnopqrstuvwxyz"];' +
+ '}());',
+ sOutput:
+ '(function() {' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [a];' +
+ ' if (0 === Math.random()) {' +
+ ' return;' +
+ ' } else {' +
+ ' }' +
+ ' void [a];' +
+ '}());'
+ },
+ // 12.10 The {@code with} Statement.
+ {
+ sTitle:
+ 'Preservation of the statement in a with statement.',
+ sInput:
+ 'with ({}) {' +
+ ' void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];' +
+ '}'
+ },
+ {
+ sTitle:
+ 'Exclusion of a with statement in the same syntactic code unit.',
+ sInput:
+ 'void ["abcdefghijklmnopqrstuvwxyz"];' +
+ 'with ({' +
+ ' foo: "abcdefghijklmnopqrstuvwxyz",' +
+ ' bar: "abcdefghijklmnopqrstuvwxyz"' +
+ '}) {' +
+ ' void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];' +
+ '}' +
+ 'void ["abcdefghijklmnopqrstuvwxyz"];'
+ },
+ {
+ sTitle:
+ 'Exclusion of a with statement in nested function code.',
+ sInput:
+ 'void ["abcdefghijklmnopqrstuvwxyz"];' +
+ '(function() {' +
+ ' with ({' +
+ ' foo: "abcdefghijklmnopqrstuvwxyz",' +
+ ' bar: "abcdefghijklmnopqrstuvwxyz"' +
+ ' }) {' +
+ ' void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];' +
+ ' }' +
+ '}());' +
+ 'void ["abcdefghijklmnopqrstuvwxyz"];'
+ },
+ // 12.12 Labelled Statements.
+ {
+ sTitle:
+ 'Preservation of the label of a labelled statement.',
+ sInput:
+ 'abcdefghijklmnopqrstuvwxyz: for (; 0 === Math.random(););' +
+ 'abcdefghijklmnopqrstuvwxyz: for (; 0 === Math.random(););'
+ },
+ // 12.14 The {@code try} Statement.
+ {
+ sTitle:
+ 'Preservation of the identifier in the catch clause of a try' +
+ 'statement.',
+ sInput:
+ 'try {' +
+ '} catch (abcdefghijklmnopqrstuvwxyz) {' +
+ '} finally {' +
+ '}' +
+ 'try {' +
+ '} catch (abcdefghijklmnopqrstuvwxyz) {' +
+ '} finally {' +
+ '}'
+ },
+ // 13 Function Definition.
+ {
+ sTitle:
+ 'Preservation of the identifier of a function declaration.',
+ sInput:
+ 'function abcdefghijklmnopqrstuvwxyz() {' +
+ '}' +
+ 'void [abcdefghijklmnopqrstuvwxyz];'
+ },
+ {
+ sTitle:
+ 'Preservation of the identifier of a function expression.',
+ sInput:
+ 'void [' +
+ ' function abcdefghijklmnopqrstuvwxyz() {' +
+ ' },' +
+ ' function abcdefghijklmnopqrstuvwxyz() {' +
+ ' }' +
+ '];'
+ },
+ {
+ sTitle:
+ 'Preservation of a formal parameter of a function declaration.',
+ sInput:
+ 'function foo(abcdefghijklmnopqrstuvwxyz) {' +
+ '}' +
+ 'function bar(abcdefghijklmnopqrstuvwxyz) {' +
+ '}'
+ },
+ {
+ sTitle:
+ 'Preservation of a formal parameter in a function expression.',
+ sInput:
+ 'void [' +
+ ' function(abcdefghijklmnopqrstuvwxyz) {' +
+ ' },' +
+ ' function(abcdefghijklmnopqrstuvwxyz) {' +
+ ' }' +
+ '];'
+ },
+ {
+ sTitle:
+ 'Exclusion of a function declaration.',
+ sInput:
+ 'void ["abcdefghijklmnopqrstuvwxyz"];' +
+ 'function foo() {' +
+ '}' +
+ 'void ["abcdefghijklmnopqrstuvwxyz"];'
+ },
+ {
+ sTitle:
+ 'Consolidation within a function declaration.',
+ sInput:
+ 'function foo() {' +
+ ' void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];' +
+ '}',
+ sOutput:
+ 'function foo() {' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [a, a];' +
+ '}'
+ },
+ // 14 Program.
+ {
+ sTitle:
+ 'Preservation of a program without source elements.',
+ sInput:
+ ''
+ },
+ // 14.1 Directive Prologues and the Use Strict Directive.
+ {
+ sTitle:
+ 'Preservation of a Directive Prologue in global code.',
+ sInput:
+ '"abcdefghijklmnopqrstuvwxyz";' +
+ '\'zyxwvutsrqponmlkjihgfedcba\';'
+ },
+ {
+ sTitle:
+ 'Preservation of a Directive Prologue in a function declaration.',
+ sInput:
+ 'function foo() {' +
+ ' "abcdefghijklmnopqrstuvwxyz";' +
+ ' \'zyxwvutsrqponmlkjihgfedcba\';' +
+ '}'
+ },
+ {
+ sTitle:
+ 'Preservation of a Directive Prologue in a function expression.',
+ sInput:
+ 'void [' +
+ ' function() {' +
+ ' "abcdefghijklmnopqrstuvwxyz";' +
+ ' \'zyxwvutsrqponmlkjihgfedcba\';' +
+ ' }' +
+ '];'
+ },
+ {
+ sTitle:
+ 'Ignorance with regard to a Directive Prologue in global code.',
+ sInput:
+ '"abcdefghijklmnopqrstuvwxyz";' +
+ 'void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];',
+ sOutput:
+ '"abcdefghijklmnopqrstuvwxyz";' +
+ '(function() {' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [a, a];' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Ignorance with regard to a Directive Prologue in a function' +
+ 'declaration.',
+ sInput:
+ 'function foo() {' +
+ ' "abcdefghijklmnopqrstuvwxyz";' +
+ ' void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];' +
+ '}',
+ sOutput:
+ 'function foo() {' +
+ ' "abcdefghijklmnopqrstuvwxyz";' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [a, a];' +
+ '}'
+ },
+ {
+ sTitle:
+ 'Ignorance with regard to a Directive Prologue in a function' +
+ 'expression.',
+ sInput:
+ '(function() {' +
+ ' "abcdefghijklmnopqrstuvwxyz";' +
+ ' void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];' +
+ '}());',
+ sOutput:
+ '(function() {' +
+ ' "abcdefghijklmnopqrstuvwxyz";' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [a, a];' +
+ '}());'
+ },
+ // 15.1 The Global Object.
+ {
+ sTitle:
+ 'Preservation of a property of the global object.',
+ sInput:
+ 'void [undefined, undefined, undefined, undefined, undefined];'
+ },
+ // 15.1.2.1.1 Direct Call to Eval.
+ {
+ sTitle:
+ 'Exclusion of a direct call to the eval function in the same ' +
+ 'syntactic code unit.',
+ sInput:
+ '/*jshint evil:true */' +
+ 'void ["abcdefghijklmnopqrstuvwxyz"];' +
+ 'eval("");' +
+ 'void ["abcdefghijklmnopqrstuvwxyz"];'
+ },
+ {
+ sTitle:
+ 'Exclusion of a direct call to the eval function in nested ' +
+ 'function code.',
+ sInput:
+ '/*jshint evil:true */' +
+ 'void ["abcdefghijklmnopqrstuvwxyz"];' +
+ '(function() {' +
+ ' eval("");' +
+ '}());' +
+ 'void ["abcdefghijklmnopqrstuvwxyz"];'
+ },
+ {
+ sTitle:
+ 'Consolidation within a direct call to the eval function.',
+ sInput:
+ '/*jshint evil:true */' +
+ 'eval(function() {' +
+ ' void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];' +
+ '}());',
+ sOutput:
+ '/*jshint evil:true */' +
+ 'eval(function() {' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [a, a];' +
+ '}());'
+ },
+ // Consolidation proper.
+ {
+ sTitle:
+ 'No consolidation if it does not result in a reduction of the ' +
+ 'number of source characters.',
+ sInput:
+ '(function() {' +
+ ' var foo;' +
+ ' void ["ab", "ab", "abc", "abc"];' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Identification of a range of source elements at the beginning ' +
+ 'of global code.',
+ sInput:
+ '/*jshint evil:true */' +
+ '"abcdefghijklmnopqrstuvwxyz";' +
+ 'void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];' +
+ 'eval("");',
+ sOutput:
+ '/*jshint evil:true */' +
+ '"abcdefghijklmnopqrstuvwxyz";' +
+ '(function() {' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [a, a];' +
+ '}());' +
+ 'eval("");'
+ },
+ {
+ sTitle:
+ 'Identification of a range of source elements in the middle of ' +
+ 'global code.',
+ sInput:
+ '/*jshint evil:true */' +
+ '"abcdefghijklmnopqrstuvwxyz";' +
+ 'eval("");' +
+ 'void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];' +
+ 'eval("");',
+ sOutput:
+ '/*jshint evil:true */' +
+ '"abcdefghijklmnopqrstuvwxyz";' +
+ 'eval("");' +
+ '(function() {' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [a, a];' +
+ '}());' +
+ 'eval("");'
+ },
+ {
+ sTitle:
+ 'Identification of a range of source elements at the end of ' +
+ 'global code.',
+ sInput:
+ '/*jshint evil:true */' +
+ '"abcdefghijklmnopqrstuvwxyz";' +
+ 'eval("");' +
+ 'void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];',
+ sOutput:
+ '/*jshint evil:true */' +
+ '"abcdefghijklmnopqrstuvwxyz";' +
+ 'eval("");' +
+ '(function() {' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [a, a];' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Identification of a range of source elements at the beginning ' +
+ 'of function code.',
+ sInput:
+ '/*jshint evil:true */' +
+ '(function() {' +
+ ' "abcdefghijklmnopqrstuvwxyz";' +
+ ' void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];' +
+ ' eval("");' +
+ '}());',
+ sOutput:
+ '/*jshint evil:true */' +
+ '(function() {' +
+ ' "abcdefghijklmnopqrstuvwxyz";' +
+ ' (function() {' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [a, a];' +
+ ' }());' +
+ ' eval("");' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Identification of a range of source elements in the middle of ' +
+ 'function code.',
+ sInput:
+ '/*jshint evil:true */' +
+ '(function() {' +
+ ' "abcdefghijklmnopqrstuvwxyz";' +
+ ' eval("");' +
+ ' void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];' +
+ ' eval("");' +
+ '}());',
+ sOutput:
+ '/*jshint evil:true */' +
+ '(function() {' +
+ ' "abcdefghijklmnopqrstuvwxyz";' +
+ ' eval("");' +
+ ' (function() {' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [a, a];' +
+ ' }());' +
+ ' eval("");' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Identification of a range of source elements at the end of ' +
+ 'function code.',
+ sInput:
+ '/*jshint evil:true */' +
+ '(function() {' +
+ ' "abcdefghijklmnopqrstuvwxyz";' +
+ ' eval("");' +
+ ' void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];' +
+ '}());',
+ sOutput:
+ '/*jshint evil:true */' +
+ '(function() {' +
+ ' "abcdefghijklmnopqrstuvwxyz";' +
+ ' eval("");' +
+ ' (function() {' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [a, a];' +
+ ' }());' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Evaluation with regard to String values of String literals and ' +
+ 'String values derived from identifier names used as property' +
+ 'accessors.',
+ sInput:
+ '(function() {' +
+ ' var foo;' +
+ ' void ["abcdefg", Math.abcdefg, "abcdef", Math.abcdef];' +
+ '}());',
+ sOutput:
+ '(function() {' +
+ ' var a = "abcdefg", foo;' +
+ ' void [a, Math[a], "abcdef", Math.abcdef];' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Evaluation with regard to the necessity of adding a variable ' +
+ 'statement.',
+ sInput:
+ '/*jshint evil:true */' +
+ '(function() {' +
+ ' void ["abcdefgh", "abcdefgh"];' +
+ '}());' +
+ 'eval("");' +
+ '(function() {' +
+ ' void ["abcdefg", "abcdefg"];' +
+ '}());' +
+ 'eval("");' +
+ '(function() {' +
+ ' var foo;' +
+ ' void ["abcd", "abcd"];' +
+ '}());',
+ sOutput:
+ '/*jshint evil:true */' +
+ '(function() {' +
+ ' var a = "abcdefgh";' +
+ ' void [a, a];' +
+ '}());' +
+ 'eval("");' +
+ '(function() {' +
+ ' void ["abcdefg", "abcdefg"];' +
+ '}());' +
+ 'eval("");' +
+ '(function() {' +
+ ' var a = "abcd", foo;' +
+ ' void [a, a];' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Evaluation with regard to the necessity of enclosing source ' +
+ 'elements.',
+ sInput:
+ '/*jshint evil:true */' +
+ 'void ["abcdefghijklmnopqrstuvwxy", "abcdefghijklmnopqrstuvwxy"];' +
+ 'eval("");' +
+ 'void ["abcdefghijklmnopqrstuvwx", "abcdefghijklmnopqrstuvwx"];' +
+ 'eval("");' +
+ '(function() {' +
+ ' void ["abcdefgh", "abcdefgh"];' +
+ '}());' +
+ '(function() {' +
+ ' void ["abcdefghijklmnopqrstuvwxy",' +
+ ' "abcdefghijklmnopqrstuvwxy"];' +
+ ' eval("");' +
+ ' void ["abcdefghijklmnopqrstuvwx",' +
+ ' "abcdefghijklmnopqrstuvwx"];' +
+ ' eval("");' +
+ ' (function() {' +
+ ' void ["abcdefgh", "abcdefgh"];' +
+ ' }());' +
+ '}());',
+ sOutput:
+ '/*jshint evil:true */' +
+ '(function() {' +
+ ' var a = "abcdefghijklmnopqrstuvwxy";' +
+ ' void [a, a];' +
+ '}());' +
+ 'eval("");' +
+ 'void ["abcdefghijklmnopqrstuvwx", "abcdefghijklmnopqrstuvwx"];' +
+ 'eval("");' +
+ '(function() {' +
+ ' var a = "abcdefgh";' +
+ ' void [a, a];' +
+ '}());' +
+ '(function() {' +
+ ' (function() {' +
+ ' var a = "abcdefghijklmnopqrstuvwxy";' +
+ ' void [a, a];' +
+ ' }());' +
+ ' eval("");' +
+ ' void ["abcdefghijklmnopqrstuvwx", "abcdefghijklmnopqrstuvwx"];' +
+ ' eval("");' +
+ ' (function() {' +
+ ' var a = "abcdefgh";' +
+ ' void [a, a];' +
+ ' }());' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Employment of a closure while consolidating in global code.',
+ sInput:
+ 'void ["abcdefghijklmnopqrstuvwxyz",' +
+ ' "abcdefghijklmnopqrstuvwxyz"];',
+ sOutput:
+ '(function() {' +
+ ' var a = "abcdefghijklmnopqrstuvwxyz";' +
+ ' void [a, a];' +
+ '}());'
+ },
+ {
+ sTitle:
+ 'Assignment of a shorter identifier to a value whose ' +
+ 'consolidation results in a greater reduction of the number of ' +
+ 'source characters.',
+ sInput:
+ '(function() {' +
+ ' var b, c, d, e, f, g, h, i, j, k, l, m,' +
+ ' n, o, p, q, r, s, t, u, v, w, x, y, z,' +
+ ' A, B, C, D, E, F, G, H, I, J, K, L, M,' +
+ ' N, O, P, Q, R, S, T, U, V, W, X, Y, Z,' +
+ ' $, _;' +
+ ' void ["abcde", "abcde", "edcba", "edcba", "edcba"];' +
+ '}());',
+ sOutput:
+ '(function() {' +
+ ' var a = "edcba",' +
+ ' b, c, d, e, f, g, h, i, j, k, l, m,' +
+ ' n, o, p, q, r, s, t, u, v, w, x, y, z,' +
+ ' A, B, C, D, E, F, G, H, I, J, K, L, M,' +
+ ' N, O, P, Q, R, S, T, U, V, W, X, Y, Z,' +
+ ' $, _;' +
+ ' void ["abcde", "abcde", a, a, a];' +
+ '}());'
+ }
+ ].forEach(cAssert);
+ }());
+}
+
+/* Local Variables: */
+/* mode: js */
+/* coding: utf-8 */
+/* indent-tabs-mode: nil */
+/* tab-width: 2 */
+/* End: */
+/* vim: set ft=javascript fenc=utf-8 et ts=2 sts=2 sw=2: */
+/* :mode=javascript:noTabs=true:tabSize=2:indentSize=2:deepIndent=true: */
+
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/lib/object-ast.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/lib/object-ast.js
new file mode 100644
index 000000000..afdb69fbd
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/lib/object-ast.js
@@ -0,0 +1,75 @@
+var jsp = require("./parse-js"),
+ pro = require("./process");
+
+var BY_TYPE = {};
+
+function HOP(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+};
+
+function AST_Node(parent) {
+ this.parent = parent;
+};
+
+AST_Node.prototype.init = function(){};
+
+function DEFINE_NODE_CLASS(type, props, methods) {
+ var base = methods && methods.BASE || AST_Node;
+ if (!base) base = AST_Node;
+ function D(parent, data) {
+ base.apply(this, arguments);
+ if (props) props.forEach(function(name, i){
+ this["_" + name] = data[i];
+ });
+ this.init();
+ };
+ var P = D.prototype = new AST_Node;
+ P.node_type = function(){ return type };
+ if (props) props.forEach(function(name){
+ var propname = "_" + name;
+ P["set_" + name] = function(val) {
+ this[propname] = val;
+ return this;
+ };
+ P["get_" + name] = function() {
+ return this[propname];
+ };
+ });
+ if (type != null) BY_TYPE[type] = D;
+ if (methods) for (var i in methods) if (HOP(methods, i)) {
+ P[i] = methods[i];
+ }
+ return D;
+};
+
+var AST_String_Node = DEFINE_NODE_CLASS("string", ["value"]);
+var AST_Number_Node = DEFINE_NODE_CLASS("num", ["value"]);
+var AST_Name_Node = DEFINE_NODE_CLASS("name", ["value"]);
+
+var AST_Statlist_Node = DEFINE_NODE_CLASS(null, ["body"]);
+var AST_Root_Node = DEFINE_NODE_CLASS("toplevel", null, { BASE: AST_Statlist_Node });
+var AST_Block_Node = DEFINE_NODE_CLASS("block", null, { BASE: AST_Statlist_Node });
+var AST_Splice_Node = DEFINE_NODE_CLASS("splice", null, { BASE: AST_Statlist_Node });
+
+var AST_Var_Node = DEFINE_NODE_CLASS("var", ["definitions"]);
+var AST_Const_Node = DEFINE_NODE_CLASS("const", ["definitions"]);
+
+var AST_Try_Node = DEFINE_NODE_CLASS("try", ["body", "catch", "finally"]);
+var AST_Throw_Node = DEFINE_NODE_CLASS("throw", ["exception"]);
+
+var AST_New_Node = DEFINE_NODE_CLASS("new", ["constructor", "arguments"]);
+
+var AST_Switch_Node = DEFINE_NODE_CLASS("switch", ["expression", "branches"]);
+var AST_Switch_Branch_Node = DEFINE_NODE_CLASS(null, ["expression", "body"]);
+
+var AST_Break_Node = DEFINE_NODE_CLASS("break", ["label"]);
+var AST_Continue_Node = DEFINE_NODE_CLASS("continue", ["label"]);
+var AST_Assign_Node = DEFINE_NODE_CLASS("assign", ["operator", "lvalue", "rvalue"]);
+var AST_Dot_Node = DEFINE_NODE_CLASS("dot", ["expression", "name"]);
+var AST_Call_Node = DEFINE_NODE_CLASS("call", ["function", "arguments"]);
+
+var AST_Lambda_Node = DEFINE_NODE_CLASS(null, ["name", "arguments", "body"])
+var AST_Function_Node = DEFINE_NODE_CLASS("function", null, AST_Lambda_Node);
+var AST_Defun_Node = DEFINE_NODE_CLASS("defun", null, AST_Lambda_Node);
+
+var AST_If_Node = DEFINE_NODE_CLASS("if", ["condition", "then", "else"]);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/lib/parse-js.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/lib/parse-js.js
new file mode 100644
index 000000000..dccd62380
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/lib/parse-js.js
@@ -0,0 +1,1346 @@
+/***********************************************************************
+
+ A JavaScript tokenizer / parser / beautifier / compressor.
+
+ This version is suitable for Node.js. With minimal changes (the
+ exports stuff) it should work on any JS platform.
+
+ This file contains the tokenizer/parser. It is a port to JavaScript
+ of parse-js [1], a JavaScript parser library written in Common Lisp
+ by Marijn Haverbeke. Thank you Marijn!
+
+ [1] http://marijn.haverbeke.nl/parse-js/
+
+ Exported functions:
+
+ - tokenizer(code) -- returns a function. Call the returned
+ function to fetch the next token.
+
+ - parse(code) -- returns an AST of the given JavaScript code.
+
+ -------------------------------- (C) ---------------------------------
+
+ Author: Mihai Bazon
+ <mihai.bazon@gmail.com>
+ http://mihai.bazon.net/blog
+
+ Distributed under the BSD license:
+
+ Copyright 2010 (c) Mihai Bazon <mihai.bazon@gmail.com>
+ Based on parse-js (http://marijn.haverbeke.nl/parse-js/).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ * Redistributions of source code must retain the above
+ copyright notice, this list of conditions and the following
+ disclaimer.
+
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials
+ provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ ***********************************************************************/
+
+/* -----[ Tokenizer (constants) ]----- */
+
+var KEYWORDS = array_to_hash([
+ "break",
+ "case",
+ "catch",
+ "const",
+ "continue",
+ "debugger",
+ "default",
+ "delete",
+ "do",
+ "else",
+ "finally",
+ "for",
+ "function",
+ "if",
+ "in",
+ "instanceof",
+ "new",
+ "return",
+ "switch",
+ "throw",
+ "try",
+ "typeof",
+ "var",
+ "void",
+ "while",
+ "with"
+]);
+
+var RESERVED_WORDS = array_to_hash([
+ "abstract",
+ "boolean",
+ "byte",
+ "char",
+ "class",
+ "double",
+ "enum",
+ "export",
+ "extends",
+ "final",
+ "float",
+ "goto",
+ "implements",
+ "import",
+ "int",
+ "interface",
+ "long",
+ "native",
+ "package",
+ "private",
+ "protected",
+ "public",
+ "short",
+ "static",
+ "super",
+ "synchronized",
+ "throws",
+ "transient",
+ "volatile"
+]);
+
+var KEYWORDS_BEFORE_EXPRESSION = array_to_hash([
+ "return",
+ "new",
+ "delete",
+ "throw",
+ "else",
+ "case"
+]);
+
+var KEYWORDS_ATOM = array_to_hash([
+ "false",
+ "null",
+ "true",
+ "undefined"
+]);
+
+var OPERATOR_CHARS = array_to_hash(characters("+-*&%=<>!?|~^"));
+
+var RE_HEX_NUMBER = /^0x[0-9a-f]+$/i;
+var RE_OCT_NUMBER = /^0[0-7]+$/;
+var RE_DEC_NUMBER = /^\d*\.?\d*(?:e[+-]?\d*(?:\d\.?|\.?\d)\d*)?$/i;
+
+var OPERATORS = array_to_hash([
+ "in",
+ "instanceof",
+ "typeof",
+ "new",
+ "void",
+ "delete",
+ "++",
+ "--",
+ "+",
+ "-",
+ "!",
+ "~",
+ "&",
+ "|",
+ "^",
+ "*",
+ "/",
+ "%",
+ ">>",
+ "<<",
+ ">>>",
+ "<",
+ ">",
+ "<=",
+ ">=",
+ "==",
+ "===",
+ "!=",
+ "!==",
+ "?",
+ "=",
+ "+=",
+ "-=",
+ "/=",
+ "*=",
+ "%=",
+ ">>=",
+ "<<=",
+ ">>>=",
+ "|=",
+ "^=",
+ "&=",
+ "&&",
+ "||"
+]);
+
+var WHITESPACE_CHARS = array_to_hash(characters(" \u00a0\n\r\t\f\u000b\u200b\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000"));
+
+var PUNC_BEFORE_EXPRESSION = array_to_hash(characters("[{(,.;:"));
+
+var PUNC_CHARS = array_to_hash(characters("[]{}(),;:"));
+
+var REGEXP_MODIFIERS = array_to_hash(characters("gmsiy"));
+
+/* -----[ Tokenizer ]----- */
+
+// regexps adapted from http://xregexp.com/plugins/#unicode
+var UNICODE = {
+ letter: new RegExp("[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0523\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0621-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971\\u0972\\u097B-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D28\\u0D2A-\\u0D39\\u0D3D\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC\\u0EDD\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8B\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10D0-\\u10FA\\u10FC\\u1100-\\u1159\\u115F-\\u11A2\\u11A8-\\u11F9\\u1200-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u1676\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19A9\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u2094\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2C6F\\u2C71-\\u2C7D\\u2C80-\\u2CE4\\u2D00-\\u2D25\\u2D30-\\u2D65\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31B7\\u31F0-\\u31FF\\u3400\\u4DB5\\u4E00\\u9FC3\\uA000-\\uA48C\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA65F\\uA662-\\uA66E\\uA67F-\\uA697\\uA717-\\uA71F\\uA722-\\uA788\\uA78B\\uA78C\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA90A-\\uA925\\uA930-\\uA946\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAC00\\uD7A3\\uF900-\\uFA2D\\uFA30-\\uFA6A\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]"),
+ non_spacing_mark: new RegExp("[\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065E\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0900-\\u0902\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F90-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1DC0-\\u1DE6\\u1DFD-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F\\uA67C\\uA67D\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE26]"),
+ space_combining_mark: new RegExp("[\\u0903\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u0982\\u0983\\u09BE-\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u19B0-\\u19C0\\u19C8\\u19C9\\u1A19-\\u1A1B\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF2\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BD-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC]"),
+ connector_punctuation: new RegExp("[\\u005F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F]")
+};
+
+function is_letter(ch) {
+ return UNICODE.letter.test(ch);
+};
+
+function is_digit(ch) {
+ ch = ch.charCodeAt(0);
+ return ch >= 48 && ch <= 57; //XXX: find out if "UnicodeDigit" means something else than 0..9
+};
+
+function is_alphanumeric_char(ch) {
+ return is_digit(ch) || is_letter(ch);
+};
+
+function is_unicode_combining_mark(ch) {
+ return UNICODE.non_spacing_mark.test(ch) || UNICODE.space_combining_mark.test(ch);
+};
+
+function is_unicode_connector_punctuation(ch) {
+ return UNICODE.connector_punctuation.test(ch);
+};
+
+function is_identifier_start(ch) {
+ return ch == "$" || ch == "_" || is_letter(ch);
+};
+
+function is_identifier_char(ch) {
+ return is_identifier_start(ch)
+ || is_unicode_combining_mark(ch)
+ || is_digit(ch)
+ || is_unicode_connector_punctuation(ch)
+ || ch == "\u200c" // zero-width non-joiner <ZWNJ>
+ || ch == "\u200d" // zero-width joiner <ZWJ> (in my ECMA-262 PDF, this is also 200c)
+ ;
+};
+
+function parse_js_number(num) {
+ if (RE_HEX_NUMBER.test(num)) {
+ return parseInt(num.substr(2), 16);
+ } else if (RE_OCT_NUMBER.test(num)) {
+ return parseInt(num.substr(1), 8);
+ } else if (RE_DEC_NUMBER.test(num)) {
+ return parseFloat(num);
+ }
+};
+
+function JS_Parse_Error(message, line, col, pos) {
+ this.message = message;
+ this.line = line + 1;
+ this.col = col + 1;
+ this.pos = pos + 1;
+ this.stack = new Error().stack;
+};
+
+JS_Parse_Error.prototype.toString = function() {
+ return this.message + " (line: " + this.line + ", col: " + this.col + ", pos: " + this.pos + ")" + "\n\n" + this.stack;
+};
+
+function js_error(message, line, col, pos) {
+ throw new JS_Parse_Error(message, line, col, pos);
+};
+
+function is_token(token, type, val) {
+ return token.type == type && (val == null || token.value == val);
+};
+
+var EX_EOF = {};
+
+function tokenizer($TEXT) {
+
+ var S = {
+ text : $TEXT.replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/^\uFEFF/, ''),
+ pos : 0,
+ tokpos : 0,
+ line : 0,
+ tokline : 0,
+ col : 0,
+ tokcol : 0,
+ newline_before : false,
+ regex_allowed : false,
+ comments_before : []
+ };
+
+ function peek() { return S.text.charAt(S.pos); };
+
+ function next(signal_eof, in_string) {
+ var ch = S.text.charAt(S.pos++);
+ if (signal_eof && !ch)
+ throw EX_EOF;
+ if (ch == "\n") {
+ S.newline_before = S.newline_before || !in_string;
+ ++S.line;
+ S.col = 0;
+ } else {
+ ++S.col;
+ }
+ return ch;
+ };
+
+ function eof() {
+ return !S.peek();
+ };
+
+ function find(what, signal_eof) {
+ var pos = S.text.indexOf(what, S.pos);
+ if (signal_eof && pos == -1) throw EX_EOF;
+ return pos;
+ };
+
+ function start_token() {
+ S.tokline = S.line;
+ S.tokcol = S.col;
+ S.tokpos = S.pos;
+ };
+
+ function token(type, value, is_comment) {
+ S.regex_allowed = ((type == "operator" && !HOP(UNARY_POSTFIX, value)) ||
+ (type == "keyword" && HOP(KEYWORDS_BEFORE_EXPRESSION, value)) ||
+ (type == "punc" && HOP(PUNC_BEFORE_EXPRESSION, value)));
+ var ret = {
+ type : type,
+ value : value,
+ line : S.tokline,
+ col : S.tokcol,
+ pos : S.tokpos,
+ endpos : S.pos,
+ nlb : S.newline_before
+ };
+ if (!is_comment) {
+ ret.comments_before = S.comments_before;
+ S.comments_before = [];
+ }
+ S.newline_before = false;
+ return ret;
+ };
+
+ function skip_whitespace() {
+ while (HOP(WHITESPACE_CHARS, peek()))
+ next();
+ };
+
+ function read_while(pred) {
+ var ret = "", ch = peek(), i = 0;
+ while (ch && pred(ch, i++)) {
+ ret += next();
+ ch = peek();
+ }
+ return ret;
+ };
+
+ function parse_error(err) {
+ js_error(err, S.tokline, S.tokcol, S.tokpos);
+ };
+
+ function read_num(prefix) {
+ var has_e = false, after_e = false, has_x = false, has_dot = prefix == ".";
+ var num = read_while(function(ch, i){
+ if (ch == "x" || ch == "X") {
+ if (has_x) return false;
+ return has_x = true;
+ }
+ if (!has_x && (ch == "E" || ch == "e")) {
+ if (has_e) return false;
+ return has_e = after_e = true;
+ }
+ if (ch == "-") {
+ if (after_e || (i == 0 && !prefix)) return true;
+ return false;
+ }
+ if (ch == "+") return after_e;
+ after_e = false;
+ if (ch == ".") {
+ if (!has_dot && !has_x)
+ return has_dot = true;
+ return false;
+ }
+ return is_alphanumeric_char(ch);
+ });
+ if (prefix)
+ num = prefix + num;
+ var valid = parse_js_number(num);
+ if (!isNaN(valid)) {
+ return token("num", valid);
+ } else {
+ parse_error("Invalid syntax: " + num);
+ }
+ };
+
+ function read_escaped_char(in_string) {
+ var ch = next(true, in_string);
+ switch (ch) {
+ case "n" : return "\n";
+ case "r" : return "\r";
+ case "t" : return "\t";
+ case "b" : return "\b";
+ case "v" : return "\u000b";
+ case "f" : return "\f";
+ case "0" : return "\0";
+ case "x" : return String.fromCharCode(hex_bytes(2));
+ case "u" : return String.fromCharCode(hex_bytes(4));
+ case "\n": return "";
+ default : return ch;
+ }
+ };
+
+ function hex_bytes(n) {
+ var num = 0;
+ for (; n > 0; --n) {
+ var digit = parseInt(next(true), 16);
+ if (isNaN(digit))
+ parse_error("Invalid hex-character pattern in string");
+ num = (num << 4) | digit;
+ }
+ return num;
+ };
+
+ function read_string() {
+ return with_eof_error("Unterminated string constant", function(){
+ var quote = next(), ret = "";
+ for (;;) {
+ var ch = next(true);
+ if (ch == "\\") {
+ // read OctalEscapeSequence (XXX: deprecated if "strict mode")
+ // https://github.com/mishoo/UglifyJS/issues/178
+ var octal_len = 0, first = null;
+ ch = read_while(function(ch){
+ if (ch >= "0" && ch <= "7") {
+ if (!first) {
+ first = ch;
+ return ++octal_len;
+ }
+ else if (first <= "3" && octal_len <= 2) return ++octal_len;
+ else if (first >= "4" && octal_len <= 1) return ++octal_len;
+ }
+ return false;
+ });
+ if (octal_len > 0) ch = String.fromCharCode(parseInt(ch, 8));
+ else ch = read_escaped_char(true);
+ }
+ else if (ch == quote) break;
+ ret += ch;
+ }
+ return token("string", ret);
+ });
+ };
+
+ function read_line_comment() {
+ next();
+ var i = find("\n"), ret;
+ if (i == -1) {
+ ret = S.text.substr(S.pos);
+ S.pos = S.text.length;
+ } else {
+ ret = S.text.substring(S.pos, i);
+ S.pos = i;
+ }
+ return token("comment1", ret, true);
+ };
+
+ function read_multiline_comment() {
+ next();
+ return with_eof_error("Unterminated multiline comment", function(){
+ var i = find("*/", true),
+ text = S.text.substring(S.pos, i);
+ S.pos = i + 2;
+ S.line += text.split("\n").length - 1;
+ S.newline_before = text.indexOf("\n") >= 0;
+
+ // https://github.com/mishoo/UglifyJS/issues/#issue/100
+ if (/^@cc_on/i.test(text)) {
+ warn("WARNING: at line " + S.line);
+ warn("*** Found \"conditional comment\": " + text);
+ warn("*** UglifyJS DISCARDS ALL COMMENTS. This means your code might no longer work properly in Internet Explorer.");
+ }
+
+ return token("comment2", text, true);
+ });
+ };
+
+ function read_name() {
+ var backslash = false, name = "", ch, escaped = false, hex;
+ while ((ch = peek()) != null) {
+ if (!backslash) {
+ if (ch == "\\") escaped = backslash = true, next();
+ else if (is_identifier_char(ch)) name += next();
+ else break;
+ }
+ else {
+ if (ch != "u") parse_error("Expecting UnicodeEscapeSequence -- uXXXX");
+ ch = read_escaped_char();
+ if (!is_identifier_char(ch)) parse_error("Unicode char: " + ch.charCodeAt(0) + " is not valid in identifier");
+ name += ch;
+ backslash = false;
+ }
+ }
+ if (HOP(KEYWORDS, name) && escaped) {
+ hex = name.charCodeAt(0).toString(16).toUpperCase();
+ name = "\\u" + "0000".substr(hex.length) + hex + name.slice(1);
+ }
+ return name;
+ };
+
+ function read_regexp(regexp) {
+ return with_eof_error("Unterminated regular expression", function(){
+ var prev_backslash = false, ch, in_class = false;
+ while ((ch = next(true))) if (prev_backslash) {
+ regexp += "\\" + ch;
+ prev_backslash = false;
+ } else if (ch == "[") {
+ in_class = true;
+ regexp += ch;
+ } else if (ch == "]" && in_class) {
+ in_class = false;
+ regexp += ch;
+ } else if (ch == "/" && !in_class) {
+ break;
+ } else if (ch == "\\") {
+ prev_backslash = true;
+ } else {
+ regexp += ch;
+ }
+ var mods = read_name();
+ return token("regexp", [ regexp, mods ]);
+ });
+ };
+
+ function read_operator(prefix) {
+ function grow(op) {
+ if (!peek()) return op;
+ var bigger = op + peek();
+ if (HOP(OPERATORS, bigger)) {
+ next();
+ return grow(bigger);
+ } else {
+ return op;
+ }
+ };
+ return token("operator", grow(prefix || next()));
+ };
+
+ function handle_slash() {
+ next();
+ var regex_allowed = S.regex_allowed;
+ switch (peek()) {
+ case "/":
+ S.comments_before.push(read_line_comment());
+ S.regex_allowed = regex_allowed;
+ return next_token();
+ case "*":
+ S.comments_before.push(read_multiline_comment());
+ S.regex_allowed = regex_allowed;
+ return next_token();
+ }
+ return S.regex_allowed ? read_regexp("") : read_operator("/");
+ };
+
+ function handle_dot() {
+ next();
+ return is_digit(peek())
+ ? read_num(".")
+ : token("punc", ".");
+ };
+
+ function read_word() {
+ var word = read_name();
+ return !HOP(KEYWORDS, word)
+ ? token("name", word)
+ : HOP(OPERATORS, word)
+ ? token("operator", word)
+ : HOP(KEYWORDS_ATOM, word)
+ ? token("atom", word)
+ : token("keyword", word);
+ };
+
+ function with_eof_error(eof_error, cont) {
+ try {
+ return cont();
+ } catch(ex) {
+ if (ex === EX_EOF) parse_error(eof_error);
+ else throw ex;
+ }
+ };
+
+ function next_token(force_regexp) {
+ if (force_regexp != null)
+ return read_regexp(force_regexp);
+ skip_whitespace();
+ start_token();
+ var ch = peek();
+ if (!ch) return token("eof");
+ if (is_digit(ch)) return read_num();
+ if (ch == '"' || ch == "'") return read_string();
+ if (HOP(PUNC_CHARS, ch)) return token("punc", next());
+ if (ch == ".") return handle_dot();
+ if (ch == "/") return handle_slash();
+ if (HOP(OPERATOR_CHARS, ch)) return read_operator();
+ if (ch == "\\" || is_identifier_start(ch)) return read_word();
+ parse_error("Unexpected character '" + ch + "'");
+ };
+
+ next_token.context = function(nc) {
+ if (nc) S = nc;
+ return S;
+ };
+
+ return next_token;
+
+};
+
+/* -----[ Parser (constants) ]----- */
+
+var UNARY_PREFIX = array_to_hash([
+ "typeof",
+ "void",
+ "delete",
+ "--",
+ "++",
+ "!",
+ "~",
+ "-",
+ "+"
+]);
+
+var UNARY_POSTFIX = array_to_hash([ "--", "++" ]);
+
+var ASSIGNMENT = (function(a, ret, i){
+ while (i < a.length) {
+ ret[a[i]] = a[i].substr(0, a[i].length - 1);
+ i++;
+ }
+ return ret;
+})(
+ ["+=", "-=", "/=", "*=", "%=", ">>=", "<<=", ">>>=", "|=", "^=", "&="],
+ { "=": true },
+ 0
+);
+
+var PRECEDENCE = (function(a, ret){
+ for (var i = 0, n = 1; i < a.length; ++i, ++n) {
+ var b = a[i];
+ for (var j = 0; j < b.length; ++j) {
+ ret[b[j]] = n;
+ }
+ }
+ return ret;
+})(
+ [
+ ["||"],
+ ["&&"],
+ ["|"],
+ ["^"],
+ ["&"],
+ ["==", "===", "!=", "!=="],
+ ["<", ">", "<=", ">=", "in", "instanceof"],
+ [">>", "<<", ">>>"],
+ ["+", "-"],
+ ["*", "/", "%"]
+ ],
+ {}
+);
+
+var STATEMENTS_WITH_LABELS = array_to_hash([ "for", "do", "while", "switch" ]);
+
+var ATOMIC_START_TOKEN = array_to_hash([ "atom", "num", "string", "regexp", "name" ]);
+
+/* -----[ Parser ]----- */
+
+function NodeWithToken(str, start, end) {
+ this.name = str;
+ this.start = start;
+ this.end = end;
+};
+
+NodeWithToken.prototype.toString = function() { return this.name; };
+
+function parse($TEXT, exigent_mode, embed_tokens) {
+
+ var S = {
+ input : typeof $TEXT == "string" ? tokenizer($TEXT, true) : $TEXT,
+ token : null,
+ prev : null,
+ peeked : null,
+ in_function : 0,
+ in_loop : 0,
+ labels : []
+ };
+
+ S.token = next();
+
+ function is(type, value) {
+ return is_token(S.token, type, value);
+ };
+
+ function peek() { return S.peeked || (S.peeked = S.input()); };
+
+ function next() {
+ S.prev = S.token;
+ if (S.peeked) {
+ S.token = S.peeked;
+ S.peeked = null;
+ } else {
+ S.token = S.input();
+ }
+ return S.token;
+ };
+
+ function prev() {
+ return S.prev;
+ };
+
+ function croak(msg, line, col, pos) {
+ var ctx = S.input.context();
+ js_error(msg,
+ line != null ? line : ctx.tokline,
+ col != null ? col : ctx.tokcol,
+ pos != null ? pos : ctx.tokpos);
+ };
+
+ function token_error(token, msg) {
+ croak(msg, token.line, token.col);
+ };
+
+ function unexpected(token) {
+ if (token == null)
+ token = S.token;
+ token_error(token, "Unexpected token: " + token.type + " (" + token.value + ")");
+ };
+
+ function expect_token(type, val) {
+ if (is(type, val)) {
+ return next();
+ }
+ token_error(S.token, "Unexpected token " + S.token.type + ", expected " + type);
+ };
+
+ function expect(punc) { return expect_token("punc", punc); };
+
+ function can_insert_semicolon() {
+ return !exigent_mode && (
+ S.token.nlb || is("eof") || is("punc", "}")
+ );
+ };
+
+ function semicolon() {
+ if (is("punc", ";")) next();
+ else if (!can_insert_semicolon()) unexpected();
+ };
+
+ function as() {
+ return slice(arguments);
+ };
+
+ function parenthesised() {
+ expect("(");
+ var ex = expression();
+ expect(")");
+ return ex;
+ };
+
+ function add_tokens(str, start, end) {
+ return str instanceof NodeWithToken ? str : new NodeWithToken(str, start, end);
+ };
+
+ function maybe_embed_tokens(parser) {
+ if (embed_tokens) return function() {
+ var start = S.token;
+ var ast = parser.apply(this, arguments);
+ ast[0] = add_tokens(ast[0], start, prev());
+ return ast;
+ };
+ else return parser;
+ };
+
+ var statement = maybe_embed_tokens(function() {
+ if (is("operator", "/") || is("operator", "/=")) {
+ S.peeked = null;
+ S.token = S.input(S.token.value.substr(1)); // force regexp
+ }
+ switch (S.token.type) {
+ case "num":
+ case "string":
+ case "regexp":
+ case "operator":
+ case "atom":
+ return simple_statement();
+
+ case "name":
+ return is_token(peek(), "punc", ":")
+ ? labeled_statement(prog1(S.token.value, next, next))
+ : simple_statement();
+
+ case "punc":
+ switch (S.token.value) {
+ case "{":
+ return as("block", block_());
+ case "[":
+ case "(":
+ return simple_statement();
+ case ";":
+ next();
+ return as("block");
+ default:
+ unexpected();
+ }
+
+ case "keyword":
+ switch (prog1(S.token.value, next)) {
+ case "break":
+ return break_cont("break");
+
+ case "continue":
+ return break_cont("continue");
+
+ case "debugger":
+ semicolon();
+ return as("debugger");
+
+ case "do":
+ return (function(body){
+ expect_token("keyword", "while");
+ return as("do", prog1(parenthesised, semicolon), body);
+ })(in_loop(statement));
+
+ case "for":
+ return for_();
+
+ case "function":
+ return function_(true);
+
+ case "if":
+ return if_();
+
+ case "return":
+ if (S.in_function == 0)
+ croak("'return' outside of function");
+ return as("return",
+ is("punc", ";")
+ ? (next(), null)
+ : can_insert_semicolon()
+ ? null
+ : prog1(expression, semicolon));
+
+ case "switch":
+ return as("switch", parenthesised(), switch_block_());
+
+ case "throw":
+ if (S.token.nlb)
+ croak("Illegal newline after 'throw'");
+ return as("throw", prog1(expression, semicolon));
+
+ case "try":
+ return try_();
+
+ case "var":
+ return prog1(var_, semicolon);
+
+ case "const":
+ return prog1(const_, semicolon);
+
+ case "while":
+ return as("while", parenthesised(), in_loop(statement));
+
+ case "with":
+ return as("with", parenthesised(), statement());
+
+ default:
+ unexpected();
+ }
+ }
+ });
+
+ function labeled_statement(label) {
+ S.labels.push(label);
+ var start = S.token, stat = statement();
+ if (exigent_mode && !HOP(STATEMENTS_WITH_LABELS, stat[0]))
+ unexpected(start);
+ S.labels.pop();
+ return as("label", label, stat);
+ };
+
+ function simple_statement() {
+ return as("stat", prog1(expression, semicolon));
+ };
+
+ function break_cont(type) {
+ var name;
+ if (!can_insert_semicolon()) {
+ name = is("name") ? S.token.value : null;
+ }
+ if (name != null) {
+ next();
+ if (!member(name, S.labels))
+ croak("Label " + name + " without matching loop or statement");
+ }
+ else if (S.in_loop == 0)
+ croak(type + " not inside a loop or switch");
+ semicolon();
+ return as(type, name);
+ };
+
+ function for_() {
+ expect("(");
+ var init = null;
+ if (!is("punc", ";")) {
+ init = is("keyword", "var")
+ ? (next(), var_(true))
+ : expression(true, true);
+ if (is("operator", "in")) {
+ if (init[0] == "var" && init[1].length > 1)
+ croak("Only one variable declaration allowed in for..in loop");
+ return for_in(init);
+ }
+ }
+ return regular_for(init);
+ };
+
+ function regular_for(init) {
+ expect(";");
+ var test = is("punc", ";") ? null : expression();
+ expect(";");
+ var step = is("punc", ")") ? null : expression();
+ expect(")");
+ return as("for", init, test, step, in_loop(statement));
+ };
+
+ function for_in(init) {
+ var lhs = init[0] == "var" ? as("name", init[1][0]) : init;
+ next();
+ var obj = expression();
+ expect(")");
+ return as("for-in", init, lhs, obj, in_loop(statement));
+ };
+
+ var function_ = function(in_statement) {
+ var name = is("name") ? prog1(S.token.value, next) : null;
+ if (in_statement && !name)
+ unexpected();
+ expect("(");
+ return as(in_statement ? "defun" : "function",
+ name,
+ // arguments
+ (function(first, a){
+ while (!is("punc", ")")) {
+ if (first) first = false; else expect(",");
+ if (!is("name")) unexpected();
+ a.push(S.token.value);
+ next();
+ }
+ next();
+ return a;
+ })(true, []),
+ // body
+ (function(){
+ ++S.in_function;
+ var loop = S.in_loop;
+ S.in_loop = 0;
+ var a = block_();
+ --S.in_function;
+ S.in_loop = loop;
+ return a;
+ })());
+ };
+
+ function if_() {
+ var cond = parenthesised(), body = statement(), belse;
+ if (is("keyword", "else")) {
+ next();
+ belse = statement();
+ }
+ return as("if", cond, body, belse);
+ };
+
+ function block_() {
+ expect("{");
+ var a = [];
+ while (!is("punc", "}")) {
+ if (is("eof")) unexpected();
+ a.push(statement());
+ }
+ next();
+ return a;
+ };
+
+ var switch_block_ = curry(in_loop, function(){
+ expect("{");
+ var a = [], cur = null;
+ while (!is("punc", "}")) {
+ if (is("eof")) unexpected();
+ if (is("keyword", "case")) {
+ next();
+ cur = [];
+ a.push([ expression(), cur ]);
+ expect(":");
+ }
+ else if (is("keyword", "default")) {
+ next();
+ expect(":");
+ cur = [];
+ a.push([ null, cur ]);
+ }
+ else {
+ if (!cur) unexpected();
+ cur.push(statement());
+ }
+ }
+ next();
+ return a;
+ });
+
+ function try_() {
+ var body = block_(), bcatch, bfinally;
+ if (is("keyword", "catch")) {
+ next();
+ expect("(");
+ if (!is("name"))
+ croak("Name expected");
+ var name = S.token.value;
+ next();
+ expect(")");
+ bcatch = [ name, block_() ];
+ }
+ if (is("keyword", "finally")) {
+ next();
+ bfinally = block_();
+ }
+ if (!bcatch && !bfinally)
+ croak("Missing catch/finally blocks");
+ return as("try", body, bcatch, bfinally);
+ };
+
+ function vardefs(no_in) {
+ var a = [];
+ for (;;) {
+ if (!is("name"))
+ unexpected();
+ var name = S.token.value;
+ next();
+ if (is("operator", "=")) {
+ next();
+ a.push([ name, expression(false, no_in) ]);
+ } else {
+ a.push([ name ]);
+ }
+ if (!is("punc", ","))
+ break;
+ next();
+ }
+ return a;
+ };
+
+ function var_(no_in) {
+ return as("var", vardefs(no_in));
+ };
+
+ function const_() {
+ return as("const", vardefs());
+ };
+
+ function new_() {
+ var newexp = expr_atom(false), args;
+ if (is("punc", "(")) {
+ next();
+ args = expr_list(")");
+ } else {
+ args = [];
+ }
+ return subscripts(as("new", newexp, args), true);
+ };
+
+ var expr_atom = maybe_embed_tokens(function(allow_calls) {
+ if (is("operator", "new")) {
+ next();
+ return new_();
+ }
+ if (is("punc")) {
+ switch (S.token.value) {
+ case "(":
+ next();
+ return subscripts(prog1(expression, curry(expect, ")")), allow_calls);
+ case "[":
+ next();
+ return subscripts(array_(), allow_calls);
+ case "{":
+ next();
+ return subscripts(object_(), allow_calls);
+ }
+ unexpected();
+ }
+ if (is("keyword", "function")) {
+ next();
+ return subscripts(function_(false), allow_calls);
+ }
+ if (HOP(ATOMIC_START_TOKEN, S.token.type)) {
+ var atom = S.token.type == "regexp"
+ ? as("regexp", S.token.value[0], S.token.value[1])
+ : as(S.token.type, S.token.value);
+ return subscripts(prog1(atom, next), allow_calls);
+ }
+ unexpected();
+ });
+
+ function expr_list(closing, allow_trailing_comma, allow_empty) {
+ var first = true, a = [];
+ while (!is("punc", closing)) {
+ if (first) first = false; else expect(",");
+ if (allow_trailing_comma && is("punc", closing)) break;
+ if (is("punc", ",") && allow_empty) {
+ a.push([ "atom", "undefined" ]);
+ } else {
+ a.push(expression(false));
+ }
+ }
+ next();
+ return a;
+ };
+
+ function array_() {
+ return as("array", expr_list("]", !exigent_mode, true));
+ };
+
+ function object_() {
+ var first = true, a = [];
+ while (!is("punc", "}")) {
+ if (first) first = false; else expect(",");
+ if (!exigent_mode && is("punc", "}"))
+ // allow trailing comma
+ break;
+ var type = S.token.type;
+ var name = as_property_name();
+ if (type == "name" && (name == "get" || name == "set") && !is("punc", ":")) {
+ a.push([ as_name(), function_(false), name ]);
+ } else {
+ expect(":");
+ a.push([ name, expression(false) ]);
+ }
+ }
+ next();
+ return as("object", a);
+ };
+
+ function as_property_name() {
+ switch (S.token.type) {
+ case "num":
+ case "string":
+ return prog1(S.token.value, next);
+ }
+ return as_name();
+ };
+
+ function as_name() {
+ switch (S.token.type) {
+ case "name":
+ case "operator":
+ case "keyword":
+ case "atom":
+ return prog1(S.token.value, next);
+ default:
+ unexpected();
+ }
+ };
+
+ function subscripts(expr, allow_calls) {
+ if (is("punc", ".")) {
+ next();
+ return subscripts(as("dot", expr, as_name()), allow_calls);
+ }
+ if (is("punc", "[")) {
+ next();
+ return subscripts(as("sub", expr, prog1(expression, curry(expect, "]"))), allow_calls);
+ }
+ if (allow_calls && is("punc", "(")) {
+ next();
+ return subscripts(as("call", expr, expr_list(")")), true);
+ }
+ return expr;
+ };
+
+ function maybe_unary(allow_calls) {
+ if (is("operator") && HOP(UNARY_PREFIX, S.token.value)) {
+ return make_unary("unary-prefix",
+ prog1(S.token.value, next),
+ maybe_unary(allow_calls));
+ }
+ var val = expr_atom(allow_calls);
+ while (is("operator") && HOP(UNARY_POSTFIX, S.token.value) && !S.token.nlb) {
+ val = make_unary("unary-postfix", S.token.value, val);
+ next();
+ }
+ return val;
+ };
+
+ function make_unary(tag, op, expr) {
+ if ((op == "++" || op == "--") && !is_assignable(expr))
+ croak("Invalid use of " + op + " operator");
+ return as(tag, op, expr);
+ };
+
+ function expr_op(left, min_prec, no_in) {
+ var op = is("operator") ? S.token.value : null;
+ if (op && op == "in" && no_in) op = null;
+ var prec = op != null ? PRECEDENCE[op] : null;
+ if (prec != null && prec > min_prec) {
+ next();
+ var right = expr_op(maybe_unary(true), prec, no_in);
+ return expr_op(as("binary", op, left, right), min_prec, no_in);
+ }
+ return left;
+ };
+
+ function expr_ops(no_in) {
+ return expr_op(maybe_unary(true), 0, no_in);
+ };
+
+ function maybe_conditional(no_in) {
+ var expr = expr_ops(no_in);
+ if (is("operator", "?")) {
+ next();
+ var yes = expression(false);
+ expect(":");
+ return as("conditional", expr, yes, expression(false, no_in));
+ }
+ return expr;
+ };
+
+ function is_assignable(expr) {
+ if (!exigent_mode) return true;
+ switch (expr[0]+"") {
+ case "dot":
+ case "sub":
+ case "new":
+ case "call":
+ return true;
+ case "name":
+ return expr[1] != "this";
+ }
+ };
+
+ function maybe_assign(no_in) {
+ var left = maybe_conditional(no_in), val = S.token.value;
+ if (is("operator") && HOP(ASSIGNMENT, val)) {
+ if (is_assignable(left)) {
+ next();
+ return as("assign", ASSIGNMENT[val], left, maybe_assign(no_in));
+ }
+ croak("Invalid assignment");
+ }
+ return left;
+ };
+
+ var expression = maybe_embed_tokens(function(commas, no_in) {
+ if (arguments.length == 0)
+ commas = true;
+ var expr = maybe_assign(no_in);
+ if (commas && is("punc", ",")) {
+ next();
+ return as("seq", expr, expression(true, no_in));
+ }
+ return expr;
+ });
+
+ function in_loop(cont) {
+ try {
+ ++S.in_loop;
+ return cont();
+ } finally {
+ --S.in_loop;
+ }
+ };
+
+ return as("toplevel", (function(a){
+ while (!is("eof"))
+ a.push(statement());
+ return a;
+ })([]));
+
+};
+
+/* -----[ Utilities ]----- */
+
+function curry(f) {
+ var args = slice(arguments, 1);
+ return function() { return f.apply(this, args.concat(slice(arguments))); };
+};
+
+function prog1(ret) {
+ if (ret instanceof Function)
+ ret = ret();
+ for (var i = 1, n = arguments.length; --n > 0; ++i)
+ arguments[i]();
+ return ret;
+};
+
+function array_to_hash(a) {
+ var ret = {};
+ for (var i = 0; i < a.length; ++i)
+ ret[a[i]] = true;
+ return ret;
+};
+
+function slice(a, start) {
+ return Array.prototype.slice.call(a, start || 0);
+};
+
+function characters(str) {
+ return str.split("");
+};
+
+function member(name, array) {
+ for (var i = array.length; --i >= 0;)
+ if (array[i] == name)
+ return true;
+ return false;
+};
+
+function HOP(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+};
+
+var warn = function() {};
+
+/* -----[ Exports ]----- */
+
+exports.tokenizer = tokenizer;
+exports.parse = parse;
+exports.slice = slice;
+exports.curry = curry;
+exports.member = member;
+exports.array_to_hash = array_to_hash;
+exports.PRECEDENCE = PRECEDENCE;
+exports.KEYWORDS_ATOM = KEYWORDS_ATOM;
+exports.RESERVED_WORDS = RESERVED_WORDS;
+exports.KEYWORDS = KEYWORDS;
+exports.ATOMIC_START_TOKEN = ATOMIC_START_TOKEN;
+exports.OPERATORS = OPERATORS;
+exports.is_alphanumeric_char = is_alphanumeric_char;
+exports.set_logger = function(logger) {
+ warn = logger;
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/lib/process.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/lib/process.js
new file mode 100644
index 000000000..da5553c71
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/lib/process.js
@@ -0,0 +1,2011 @@
+/***********************************************************************
+
+ A JavaScript tokenizer / parser / beautifier / compressor.
+
+ This version is suitable for Node.js. With minimal changes (the
+ exports stuff) it should work on any JS platform.
+
+ This file implements some AST processors. They work on data built
+ by parse-js.
+
+ Exported functions:
+
+ - ast_mangle(ast, options) -- mangles the variable/function names
+ in the AST. Returns an AST.
+
+ - ast_squeeze(ast) -- employs various optimizations to make the
+ final generated code even smaller. Returns an AST.
+
+ - gen_code(ast, options) -- generates JS code from the AST. Pass
+ true (or an object, see the code for some options) as second
+ argument to get "pretty" (indented) code.
+
+ -------------------------------- (C) ---------------------------------
+
+ Author: Mihai Bazon
+ <mihai.bazon@gmail.com>
+ http://mihai.bazon.net/blog
+
+ Distributed under the BSD license:
+
+ Copyright 2010 (c) Mihai Bazon <mihai.bazon@gmail.com>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ * Redistributions of source code must retain the above
+ copyright notice, this list of conditions and the following
+ disclaimer.
+
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials
+ provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+ THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ ***********************************************************************/
+
+var jsp = require("./parse-js"),
+ slice = jsp.slice,
+ member = jsp.member,
+ PRECEDENCE = jsp.PRECEDENCE,
+ OPERATORS = jsp.OPERATORS;
+
+/* -----[ helper for AST traversal ]----- */
+
+function ast_walker() {
+ function _vardefs(defs) {
+ return [ this[0], MAP(defs, function(def){
+ var a = [ def[0] ];
+ if (def.length > 1)
+ a[1] = walk(def[1]);
+ return a;
+ }) ];
+ };
+ function _block(statements) {
+ var out = [ this[0] ];
+ if (statements != null)
+ out.push(MAP(statements, walk));
+ return out;
+ };
+ var walkers = {
+ "string": function(str) {
+ return [ this[0], str ];
+ },
+ "num": function(num) {
+ return [ this[0], num ];
+ },
+ "name": function(name) {
+ return [ this[0], name ];
+ },
+ "toplevel": function(statements) {
+ return [ this[0], MAP(statements, walk) ];
+ },
+ "block": _block,
+ "splice": _block,
+ "var": _vardefs,
+ "const": _vardefs,
+ "try": function(t, c, f) {
+ return [
+ this[0],
+ MAP(t, walk),
+ c != null ? [ c[0], MAP(c[1], walk) ] : null,
+ f != null ? MAP(f, walk) : null
+ ];
+ },
+ "throw": function(expr) {
+ return [ this[0], walk(expr) ];
+ },
+ "new": function(ctor, args) {
+ return [ this[0], walk(ctor), MAP(args, walk) ];
+ },
+ "switch": function(expr, body) {
+ return [ this[0], walk(expr), MAP(body, function(branch){
+ return [ branch[0] ? walk(branch[0]) : null,
+ MAP(branch[1], walk) ];
+ }) ];
+ },
+ "break": function(label) {
+ return [ this[0], label ];
+ },
+ "continue": function(label) {
+ return [ this[0], label ];
+ },
+ "conditional": function(cond, t, e) {
+ return [ this[0], walk(cond), walk(t), walk(e) ];
+ },
+ "assign": function(op, lvalue, rvalue) {
+ return [ this[0], op, walk(lvalue), walk(rvalue) ];
+ },
+ "dot": function(expr) {
+ return [ this[0], walk(expr) ].concat(slice(arguments, 1));
+ },
+ "call": function(expr, args) {
+ return [ this[0], walk(expr), MAP(args, walk) ];
+ },
+ "function": function(name, args, body) {
+ return [ this[0], name, args.slice(), MAP(body, walk) ];
+ },
+ "debugger": function() {
+ return [ this[0] ];
+ },
+ "defun": function(name, args, body) {
+ return [ this[0], name, args.slice(), MAP(body, walk) ];
+ },
+ "if": function(conditional, t, e) {
+ return [ this[0], walk(conditional), walk(t), walk(e) ];
+ },
+ "for": function(init, cond, step, block) {
+ return [ this[0], walk(init), walk(cond), walk(step), walk(block) ];
+ },
+ "for-in": function(vvar, key, hash, block) {
+ return [ this[0], walk(vvar), walk(key), walk(hash), walk(block) ];
+ },
+ "while": function(cond, block) {
+ return [ this[0], walk(cond), walk(block) ];
+ },
+ "do": function(cond, block) {
+ return [ this[0], walk(cond), walk(block) ];
+ },
+ "return": function(expr) {
+ return [ this[0], walk(expr) ];
+ },
+ "binary": function(op, left, right) {
+ return [ this[0], op, walk(left), walk(right) ];
+ },
+ "unary-prefix": function(op, expr) {
+ return [ this[0], op, walk(expr) ];
+ },
+ "unary-postfix": function(op, expr) {
+ return [ this[0], op, walk(expr) ];
+ },
+ "sub": function(expr, subscript) {
+ return [ this[0], walk(expr), walk(subscript) ];
+ },
+ "object": function(props) {
+ return [ this[0], MAP(props, function(p){
+ return p.length == 2
+ ? [ p[0], walk(p[1]) ]
+ : [ p[0], walk(p[1]), p[2] ]; // get/set-ter
+ }) ];
+ },
+ "regexp": function(rx, mods) {
+ return [ this[0], rx, mods ];
+ },
+ "array": function(elements) {
+ return [ this[0], MAP(elements, walk) ];
+ },
+ "stat": function(stat) {
+ return [ this[0], walk(stat) ];
+ },
+ "seq": function() {
+ return [ this[0] ].concat(MAP(slice(arguments), walk));
+ },
+ "label": function(name, block) {
+ return [ this[0], name, walk(block) ];
+ },
+ "with": function(expr, block) {
+ return [ this[0], walk(expr), walk(block) ];
+ },
+ "atom": function(name) {
+ return [ this[0], name ];
+ }
+ };
+
+ var user = {};
+ var stack = [];
+ function walk(ast) {
+ if (ast == null)
+ return null;
+ try {
+ stack.push(ast);
+ var type = ast[0];
+ var gen = user[type];
+ if (gen) {
+ var ret = gen.apply(ast, ast.slice(1));
+ if (ret != null)
+ return ret;
+ }
+ gen = walkers[type];
+ return gen.apply(ast, ast.slice(1));
+ } finally {
+ stack.pop();
+ }
+ };
+
+ function dive(ast) {
+ if (ast == null)
+ return null;
+ try {
+ stack.push(ast);
+ return walkers[ast[0]].apply(ast, ast.slice(1));
+ } finally {
+ stack.pop();
+ }
+ };
+
+ function with_walkers(walkers, cont){
+ var save = {}, i;
+ for (i in walkers) if (HOP(walkers, i)) {
+ save[i] = user[i];
+ user[i] = walkers[i];
+ }
+ var ret = cont();
+ for (i in save) if (HOP(save, i)) {
+ if (!save[i]) delete user[i];
+ else user[i] = save[i];
+ }
+ return ret;
+ };
+
+ return {
+ walk: walk,
+ dive: dive,
+ with_walkers: with_walkers,
+ parent: function() {
+ return stack[stack.length - 2]; // last one is current node
+ },
+ stack: function() {
+ return stack;
+ }
+ };
+};
+
+/* -----[ Scope and mangling ]----- */
+
+function Scope(parent) {
+ this.names = {}; // names defined in this scope
+ this.mangled = {}; // mangled names (orig.name => mangled)
+ this.rev_mangled = {}; // reverse lookup (mangled => orig.name)
+ this.cname = -1; // current mangled name
+ this.refs = {}; // names referenced from this scope
+ this.uses_with = false; // will become TRUE if with() is detected in this or any subscopes
+ this.uses_eval = false; // will become TRUE if eval() is detected in this or any subscopes
+ this.parent = parent; // parent scope
+ this.children = []; // sub-scopes
+ if (parent) {
+ this.level = parent.level + 1;
+ parent.children.push(this);
+ } else {
+ this.level = 0;
+ }
+};
+
+var base54 = (function(){
+ var DIGITS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_0123456789";
+ return function(num) {
+ var ret = "", base = 54;
+ do {
+ ret += DIGITS.charAt(num % base);
+ num = Math.floor(num / base);
+ base = 64;
+ } while (num > 0);
+ return ret;
+ };
+})();
+
+Scope.prototype = {
+ has: function(name) {
+ for (var s = this; s; s = s.parent)
+ if (HOP(s.names, name))
+ return s;
+ },
+ has_mangled: function(mname) {
+ for (var s = this; s; s = s.parent)
+ if (HOP(s.rev_mangled, mname))
+ return s;
+ },
+ toJSON: function() {
+ return {
+ names: this.names,
+ uses_eval: this.uses_eval,
+ uses_with: this.uses_with
+ };
+ },
+
+ next_mangled: function() {
+ // we must be careful that the new mangled name:
+ //
+ // 1. doesn't shadow a mangled name from a parent
+ // scope, unless we don't reference the original
+ // name from this scope OR from any sub-scopes!
+ // This will get slow.
+ //
+ // 2. doesn't shadow an original name from a parent
+ // scope, in the event that the name is not mangled
+ // in the parent scope and we reference that name
+ // here OR IN ANY SUBSCOPES!
+ //
+ // 3. doesn't shadow a name that is referenced but not
+ // defined (possibly global defined elsewhere).
+ for (;;) {
+ var m = base54(++this.cname), prior;
+
+ // case 1.
+ prior = this.has_mangled(m);
+ if (prior && this.refs[prior.rev_mangled[m]] === prior)
+ continue;
+
+ // case 2.
+ prior = this.has(m);
+ if (prior && prior !== this && this.refs[m] === prior && !prior.has_mangled(m))
+ continue;
+
+ // case 3.
+ if (HOP(this.refs, m) && this.refs[m] == null)
+ continue;
+
+ // I got "do" once. :-/
+ if (!is_identifier(m))
+ continue;
+
+ return m;
+ }
+ },
+ set_mangle: function(name, m) {
+ this.rev_mangled[m] = name;
+ return this.mangled[name] = m;
+ },
+ get_mangled: function(name, newMangle) {
+ if (this.uses_eval || this.uses_with) return name; // no mangle if eval or with is in use
+ var s = this.has(name);
+ if (!s) return name; // not in visible scope, no mangle
+ if (HOP(s.mangled, name)) return s.mangled[name]; // already mangled in this scope
+ if (!newMangle) return name; // not found and no mangling requested
+ return s.set_mangle(name, s.next_mangled());
+ },
+ references: function(name) {
+ return name && !this.parent || this.uses_with || this.uses_eval || this.refs[name];
+ },
+ define: function(name, type) {
+ if (name != null) {
+ if (type == "var" || !HOP(this.names, name))
+ this.names[name] = type || "var";
+ return name;
+ }
+ }
+};
+
+function ast_add_scope(ast) {
+
+ var current_scope = null;
+ var w = ast_walker(), walk = w.walk;
+ var having_eval = [];
+
+ function with_new_scope(cont) {
+ current_scope = new Scope(current_scope);
+ current_scope.labels = new Scope();
+ var ret = current_scope.body = cont();
+ ret.scope = current_scope;
+ current_scope = current_scope.parent;
+ return ret;
+ };
+
+ function define(name, type) {
+ return current_scope.define(name, type);
+ };
+
+ function reference(name) {
+ current_scope.refs[name] = true;
+ };
+
+ function _lambda(name, args, body) {
+ var is_defun = this[0] == "defun";
+ return [ this[0], is_defun ? define(name, "defun") : name, args, with_new_scope(function(){
+ if (!is_defun) define(name, "lambda");
+ MAP(args, function(name){ define(name, "arg") });
+ return MAP(body, walk);
+ })];
+ };
+
+ function _vardefs(type) {
+ return function(defs) {
+ MAP(defs, function(d){
+ define(d[0], type);
+ if (d[1]) reference(d[0]);
+ });
+ };
+ };
+
+ function _breacont(label) {
+ if (label)
+ current_scope.labels.refs[label] = true;
+ };
+
+ return with_new_scope(function(){
+ // process AST
+ var ret = w.with_walkers({
+ "function": _lambda,
+ "defun": _lambda,
+ "label": function(name, stat) { current_scope.labels.define(name) },
+ "break": _breacont,
+ "continue": _breacont,
+ "with": function(expr, block) {
+ for (var s = current_scope; s; s = s.parent)
+ s.uses_with = true;
+ },
+ "var": _vardefs("var"),
+ "const": _vardefs("const"),
+ "try": function(t, c, f) {
+ if (c != null) return [
+ this[0],
+ MAP(t, walk),
+ [ define(c[0], "catch"), MAP(c[1], walk) ],
+ f != null ? MAP(f, walk) : null
+ ];
+ },
+ "name": function(name) {
+ if (name == "eval")
+ having_eval.push(current_scope);
+ reference(name);
+ }
+ }, function(){
+ return walk(ast);
+ });
+
+ // the reason why we need an additional pass here is
+ // that names can be used prior to their definition.
+
+ // scopes where eval was detected and their parents
+ // are marked with uses_eval, unless they define the
+ // "eval" name.
+ MAP(having_eval, function(scope){
+ if (!scope.has("eval")) while (scope) {
+ scope.uses_eval = true;
+ scope = scope.parent;
+ }
+ });
+
+ // for referenced names it might be useful to know
+ // their origin scope. current_scope here is the
+ // toplevel one.
+ function fixrefs(scope, i) {
+ // do children first; order shouldn't matter
+ for (i = scope.children.length; --i >= 0;)
+ fixrefs(scope.children[i]);
+ for (i in scope.refs) if (HOP(scope.refs, i)) {
+ // find origin scope and propagate the reference to origin
+ for (var origin = scope.has(i), s = scope; s; s = s.parent) {
+ s.refs[i] = origin;
+ if (s === origin) break;
+ }
+ }
+ };
+ fixrefs(current_scope);
+
+ return ret;
+ });
+
+};
+
+/* -----[ mangle names ]----- */
+
+function ast_mangle(ast, options) {
+ var w = ast_walker(), walk = w.walk, scope;
+ options = options || {};
+
+ function get_mangled(name, newMangle) {
+ if (!options.toplevel && !scope.parent) return name; // don't mangle toplevel
+ if (options.except && member(name, options.except))
+ return name;
+ return scope.get_mangled(name, newMangle);
+ };
+
+ function get_define(name) {
+ if (options.defines) {
+ // we always lookup a defined symbol for the current scope FIRST, so declared
+ // vars trump a DEFINE symbol, but if no such var is found, then match a DEFINE value
+ if (!scope.has(name)) {
+ if (HOP(options.defines, name)) {
+ return options.defines[name];
+ }
+ }
+ return null;
+ }
+ };
+
+ function _lambda(name, args, body) {
+ if (!options.no_functions) {
+ var is_defun = this[0] == "defun", extra;
+ if (name) {
+ if (is_defun) name = get_mangled(name);
+ else if (body.scope.references(name)) {
+ extra = {};
+ if (!(scope.uses_eval || scope.uses_with))
+ name = extra[name] = scope.next_mangled();
+ else
+ extra[name] = name;
+ }
+ else name = null;
+ }
+ }
+ body = with_scope(body.scope, function(){
+ args = MAP(args, function(name){ return get_mangled(name) });
+ return MAP(body, walk);
+ }, extra);
+ return [ this[0], name, args, body ];
+ };
+
+ function with_scope(s, cont, extra) {
+ var _scope = scope;
+ scope = s;
+ if (extra) for (var i in extra) if (HOP(extra, i)) {
+ s.set_mangle(i, extra[i]);
+ }
+ for (var i in s.names) if (HOP(s.names, i)) {
+ get_mangled(i, true);
+ }
+ var ret = cont();
+ ret.scope = s;
+ scope = _scope;
+ return ret;
+ };
+
+ function _vardefs(defs) {
+ return [ this[0], MAP(defs, function(d){
+ return [ get_mangled(d[0]), walk(d[1]) ];
+ }) ];
+ };
+
+ function _breacont(label) {
+ if (label) return [ this[0], scope.labels.get_mangled(label) ];
+ };
+
+ return w.with_walkers({
+ "function": _lambda,
+ "defun": function() {
+ // move function declarations to the top when
+ // they are not in some block.
+ var ast = _lambda.apply(this, arguments);
+ switch (w.parent()[0]) {
+ case "toplevel":
+ case "function":
+ case "defun":
+ return MAP.at_top(ast);
+ }
+ return ast;
+ },
+ "label": function(label, stat) {
+ if (scope.labels.refs[label]) return [
+ this[0],
+ scope.labels.get_mangled(label, true),
+ walk(stat)
+ ];
+ return walk(stat);
+ },
+ "break": _breacont,
+ "continue": _breacont,
+ "var": _vardefs,
+ "const": _vardefs,
+ "name": function(name) {
+ return get_define(name) || [ this[0], get_mangled(name) ];
+ },
+ "try": function(t, c, f) {
+ return [ this[0],
+ MAP(t, walk),
+ c != null ? [ get_mangled(c[0]), MAP(c[1], walk) ] : null,
+ f != null ? MAP(f, walk) : null ];
+ },
+ "toplevel": function(body) {
+ var self = this;
+ return with_scope(self.scope, function(){
+ return [ self[0], MAP(body, walk) ];
+ });
+ }
+ }, function() {
+ return walk(ast_add_scope(ast));
+ });
+};
+
+/* -----[
+ - compress foo["bar"] into foo.bar,
+ - remove block brackets {} where possible
+ - join consecutive var declarations
+ - various optimizations for IFs:
+ - if (cond) foo(); else bar(); ==> cond?foo():bar();
+ - if (cond) foo(); ==> cond&&foo();
+ - if (foo) return bar(); else return baz(); ==> return foo?bar():baz(); // also for throw
+ - if (foo) return bar(); else something(); ==> {if(foo)return bar();something()}
+ ]----- */
+
+var warn = function(){};
+
+function best_of(ast1, ast2) {
+ return gen_code(ast1).length > gen_code(ast2[0] == "stat" ? ast2[1] : ast2).length ? ast2 : ast1;
+};
+
+function last_stat(b) {
+ if (b[0] == "block" && b[1] && b[1].length > 0)
+ return b[1][b[1].length - 1];
+ return b;
+}
+
+function aborts(t) {
+ if (t) switch (last_stat(t)[0]) {
+ case "return":
+ case "break":
+ case "continue":
+ case "throw":
+ return true;
+ }
+};
+
+function boolean_expr(expr) {
+ return ( (expr[0] == "unary-prefix"
+ && member(expr[1], [ "!", "delete" ])) ||
+
+ (expr[0] == "binary"
+ && member(expr[1], [ "in", "instanceof", "==", "!=", "===", "!==", "<", "<=", ">=", ">" ])) ||
+
+ (expr[0] == "binary"
+ && member(expr[1], [ "&&", "||" ])
+ && boolean_expr(expr[2])
+ && boolean_expr(expr[3])) ||
+
+ (expr[0] == "conditional"
+ && boolean_expr(expr[2])
+ && boolean_expr(expr[3])) ||
+
+ (expr[0] == "assign"
+ && expr[1] === true
+ && boolean_expr(expr[3])) ||
+
+ (expr[0] == "seq"
+ && boolean_expr(expr[expr.length - 1]))
+ );
+};
+
+function empty(b) {
+ return !b || (b[0] == "block" && (!b[1] || b[1].length == 0));
+};
+
+function is_string(node) {
+ return (node[0] == "string" ||
+ node[0] == "unary-prefix" && node[1] == "typeof" ||
+ node[0] == "binary" && node[1] == "+" &&
+ (is_string(node[2]) || is_string(node[3])));
+};
+
+var when_constant = (function(){
+
+ var $NOT_CONSTANT = {};
+
+ // this can only evaluate constant expressions. If it finds anything
+ // not constant, it throws $NOT_CONSTANT.
+ function evaluate(expr) {
+ switch (expr[0]) {
+ case "string":
+ case "num":
+ return expr[1];
+ case "name":
+ case "atom":
+ switch (expr[1]) {
+ case "true": return true;
+ case "false": return false;
+ case "null": return null;
+ }
+ break;
+ case "unary-prefix":
+ switch (expr[1]) {
+ case "!": return !evaluate(expr[2]);
+ case "typeof": return typeof evaluate(expr[2]);
+ case "~": return ~evaluate(expr[2]);
+ case "-": return -evaluate(expr[2]);
+ case "+": return +evaluate(expr[2]);
+ }
+ break;
+ case "binary":
+ var left = expr[2], right = expr[3];
+ switch (expr[1]) {
+ case "&&" : return evaluate(left) && evaluate(right);
+ case "||" : return evaluate(left) || evaluate(right);
+ case "|" : return evaluate(left) | evaluate(right);
+ case "&" : return evaluate(left) & evaluate(right);
+ case "^" : return evaluate(left) ^ evaluate(right);
+ case "+" : return evaluate(left) + evaluate(right);
+ case "*" : return evaluate(left) * evaluate(right);
+ case "/" : return evaluate(left) / evaluate(right);
+ case "%" : return evaluate(left) % evaluate(right);
+ case "-" : return evaluate(left) - evaluate(right);
+ case "<<" : return evaluate(left) << evaluate(right);
+ case ">>" : return evaluate(left) >> evaluate(right);
+ case ">>>" : return evaluate(left) >>> evaluate(right);
+ case "==" : return evaluate(left) == evaluate(right);
+ case "===" : return evaluate(left) === evaluate(right);
+ case "!=" : return evaluate(left) != evaluate(right);
+ case "!==" : return evaluate(left) !== evaluate(right);
+ case "<" : return evaluate(left) < evaluate(right);
+ case "<=" : return evaluate(left) <= evaluate(right);
+ case ">" : return evaluate(left) > evaluate(right);
+ case ">=" : return evaluate(left) >= evaluate(right);
+ case "in" : return evaluate(left) in evaluate(right);
+ case "instanceof" : return evaluate(left) instanceof evaluate(right);
+ }
+ }
+ throw $NOT_CONSTANT;
+ };
+
+ return function(expr, yes, no) {
+ try {
+ var val = evaluate(expr), ast;
+ switch (typeof val) {
+ case "string": ast = [ "string", val ]; break;
+ case "number": ast = [ "num", val ]; break;
+ case "boolean": ast = [ "name", String(val) ]; break;
+ default:
+ if (val === null) { ast = [ "atom", "null" ]; break; }
+ throw new Error("Can't handle constant of type: " + (typeof val));
+ }
+ return yes.call(expr, ast, val);
+ } catch(ex) {
+ if (ex === $NOT_CONSTANT) {
+ if (expr[0] == "binary"
+ && (expr[1] == "===" || expr[1] == "!==")
+ && ((is_string(expr[2]) && is_string(expr[3]))
+ || (boolean_expr(expr[2]) && boolean_expr(expr[3])))) {
+ expr[1] = expr[1].substr(0, 2);
+ }
+ else if (no && expr[0] == "binary"
+ && (expr[1] == "||" || expr[1] == "&&")) {
+ // the whole expression is not constant but the lval may be...
+ try {
+ var lval = evaluate(expr[2]);
+ expr = ((expr[1] == "&&" && (lval ? expr[3] : lval)) ||
+ (expr[1] == "||" && (lval ? lval : expr[3])) ||
+ expr);
+ } catch(ex2) {
+ // IGNORE... lval is not constant
+ }
+ }
+ return no ? no.call(expr, expr) : null;
+ }
+ else throw ex;
+ }
+ };
+
+})();
+
+function warn_unreachable(ast) {
+ if (!empty(ast))
+ warn("Dropping unreachable code: " + gen_code(ast, true));
+};
+
+function prepare_ifs(ast) {
+ var w = ast_walker(), walk = w.walk;
+ // In this first pass, we rewrite ifs which abort with no else with an
+ // if-else. For example:
+ //
+ // if (x) {
+ // blah();
+ // return y;
+ // }
+ // foobar();
+ //
+ // is rewritten into:
+ //
+ // if (x) {
+ // blah();
+ // return y;
+ // } else {
+ // foobar();
+ // }
+ function redo_if(statements) {
+ statements = MAP(statements, walk);
+
+ for (var i = 0; i < statements.length; ++i) {
+ var fi = statements[i];
+ if (fi[0] != "if") continue;
+
+ if (fi[3] && walk(fi[3])) continue;
+
+ var t = walk(fi[2]);
+ if (!aborts(t)) continue;
+
+ var conditional = walk(fi[1]);
+
+ var e_body = redo_if(statements.slice(i + 1));
+ var e = e_body.length == 1 ? e_body[0] : [ "block", e_body ];
+
+ return statements.slice(0, i).concat([ [
+ fi[0], // "if"
+ conditional, // conditional
+ t, // then
+ e // else
+ ] ]);
+ }
+
+ return statements;
+ };
+
+ function redo_if_lambda(name, args, body) {
+ body = redo_if(body);
+ return [ this[0], name, args, body ];
+ };
+
+ function redo_if_block(statements) {
+ return [ this[0], statements != null ? redo_if(statements) : null ];
+ };
+
+ return w.with_walkers({
+ "defun": redo_if_lambda,
+ "function": redo_if_lambda,
+ "block": redo_if_block,
+ "splice": redo_if_block,
+ "toplevel": function(statements) {
+ return [ this[0], redo_if(statements) ];
+ },
+ "try": function(t, c, f) {
+ return [
+ this[0],
+ redo_if(t),
+ c != null ? [ c[0], redo_if(c[1]) ] : null,
+ f != null ? redo_if(f) : null
+ ];
+ }
+ }, function() {
+ return walk(ast);
+ });
+};
+
+function for_side_effects(ast, handler) {
+ var w = ast_walker(), walk = w.walk;
+ var $stop = {}, $restart = {};
+ function stop() { throw $stop };
+ function restart() { throw $restart };
+ function found(){ return handler.call(this, this, w, stop, restart) };
+ function unary(op) {
+ if (op == "++" || op == "--")
+ return found.apply(this, arguments);
+ };
+ return w.with_walkers({
+ "try": found,
+ "throw": found,
+ "return": found,
+ "new": found,
+ "switch": found,
+ "break": found,
+ "continue": found,
+ "assign": found,
+ "call": found,
+ "if": found,
+ "for": found,
+ "for-in": found,
+ "while": found,
+ "do": found,
+ "return": found,
+ "unary-prefix": unary,
+ "unary-postfix": unary,
+ "defun": found
+ }, function(){
+ while (true) try {
+ walk(ast);
+ break;
+ } catch(ex) {
+ if (ex === $stop) break;
+ if (ex === $restart) continue;
+ throw ex;
+ }
+ });
+};
+
+function ast_lift_variables(ast) {
+ var w = ast_walker(), walk = w.walk, scope;
+ function do_body(body, env) {
+ var _scope = scope;
+ scope = env;
+ body = MAP(body, walk);
+ var hash = {}, names = MAP(env.names, function(type, name){
+ if (type != "var") return MAP.skip;
+ if (!env.references(name)) return MAP.skip;
+ hash[name] = true;
+ return [ name ];
+ });
+ if (names.length > 0) {
+ // looking for assignments to any of these variables.
+ // we can save considerable space by moving the definitions
+ // in the var declaration.
+ for_side_effects([ "block", body ], function(ast, walker, stop, restart) {
+ if (ast[0] == "assign"
+ && ast[1] === true
+ && ast[2][0] == "name"
+ && HOP(hash, ast[2][1])) {
+ // insert the definition into the var declaration
+ for (var i = names.length; --i >= 0;) {
+ if (names[i][0] == ast[2][1]) {
+ if (names[i][1]) // this name already defined, we must stop
+ stop();
+ names[i][1] = ast[3]; // definition
+ names.push(names.splice(i, 1)[0]);
+ break;
+ }
+ }
+ // remove this assignment from the AST.
+ var p = walker.parent();
+ if (p[0] == "seq") {
+ var a = p[2];
+ a.unshift(0, p.length);
+ p.splice.apply(p, a);
+ }
+ else if (p[0] == "stat") {
+ p.splice(0, p.length, "block"); // empty statement
+ }
+ else {
+ stop();
+ }
+ restart();
+ }
+ stop();
+ });
+ body.unshift([ "var", names ]);
+ }
+ scope = _scope;
+ return body;
+ };
+ function _vardefs(defs) {
+ var ret = null;
+ for (var i = defs.length; --i >= 0;) {
+ var d = defs[i];
+ if (!d[1]) continue;
+ d = [ "assign", true, [ "name", d[0] ], d[1] ];
+ if (ret == null) ret = d;
+ else ret = [ "seq", d, ret ];
+ }
+ if (ret == null) {
+ if (w.parent()[0] == "for-in")
+ return [ "name", defs[0][0] ];
+ return MAP.skip;
+ }
+ return [ "stat", ret ];
+ };
+ function _toplevel(body) {
+ return [ this[0], do_body(body, this.scope) ];
+ };
+ return w.with_walkers({
+ "function": function(name, args, body){
+ for (var i = args.length; --i >= 0 && !body.scope.references(args[i]);)
+ args.pop();
+ if (!body.scope.references(name)) name = null;
+ return [ this[0], name, args, do_body(body, body.scope) ];
+ },
+ "defun": function(name, args, body){
+ if (!scope.references(name)) return MAP.skip;
+ for (var i = args.length; --i >= 0 && !body.scope.references(args[i]);)
+ args.pop();
+ return [ this[0], name, args, do_body(body, body.scope) ];
+ },
+ "var": _vardefs,
+ "toplevel": _toplevel
+ }, function(){
+ return walk(ast_add_scope(ast));
+ });
+};
+
+function ast_squeeze(ast, options) {
+ options = defaults(options, {
+ make_seqs : true,
+ dead_code : true,
+ no_warnings : false,
+ keep_comps : true
+ });
+
+ var w = ast_walker(), walk = w.walk;
+
+ function negate(c) {
+ var not_c = [ "unary-prefix", "!", c ];
+ switch (c[0]) {
+ case "unary-prefix":
+ return c[1] == "!" && boolean_expr(c[2]) ? c[2] : not_c;
+ case "seq":
+ c = slice(c);
+ c[c.length - 1] = negate(c[c.length - 1]);
+ return c;
+ case "conditional":
+ return best_of(not_c, [ "conditional", c[1], negate(c[2]), negate(c[3]) ]);
+ case "binary":
+ var op = c[1], left = c[2], right = c[3];
+ if (!options.keep_comps) switch (op) {
+ case "<=" : return [ "binary", ">", left, right ];
+ case "<" : return [ "binary", ">=", left, right ];
+ case ">=" : return [ "binary", "<", left, right ];
+ case ">" : return [ "binary", "<=", left, right ];
+ }
+ switch (op) {
+ case "==" : return [ "binary", "!=", left, right ];
+ case "!=" : return [ "binary", "==", left, right ];
+ case "===" : return [ "binary", "!==", left, right ];
+ case "!==" : return [ "binary", "===", left, right ];
+ case "&&" : return best_of(not_c, [ "binary", "||", negate(left), negate(right) ]);
+ case "||" : return best_of(not_c, [ "binary", "&&", negate(left), negate(right) ]);
+ }
+ break;
+ }
+ return not_c;
+ };
+
+ function make_conditional(c, t, e) {
+ var make_real_conditional = function() {
+ if (c[0] == "unary-prefix" && c[1] == "!") {
+ return e ? [ "conditional", c[2], e, t ] : [ "binary", "||", c[2], t ];
+ } else {
+ return e ? best_of(
+ [ "conditional", c, t, e ],
+ [ "conditional", negate(c), e, t ]
+ ) : [ "binary", "&&", c, t ];
+ }
+ };
+ // shortcut the conditional if the expression has a constant value
+ return when_constant(c, function(ast, val){
+ warn_unreachable(val ? e : t);
+ return (val ? t : e);
+ }, make_real_conditional);
+ };
+
+ function rmblock(block) {
+ if (block != null && block[0] == "block" && block[1]) {
+ if (block[1].length == 1)
+ block = block[1][0];
+ else if (block[1].length == 0)
+ block = [ "block" ];
+ }
+ return block;
+ };
+
+ function _lambda(name, args, body) {
+ return [ this[0], name, args, tighten(body, "lambda") ];
+ };
+
+ // this function does a few things:
+ // 1. discard useless blocks
+ // 2. join consecutive var declarations
+ // 3. remove obviously dead code
+ // 4. transform consecutive statements using the comma operator
+ // 5. if block_type == "lambda" and it detects constructs like if(foo) return ... - rewrite like if (!foo) { ... }
+ function tighten(statements, block_type) {
+ statements = MAP(statements, walk);
+
+ statements = statements.reduce(function(a, stat){
+ if (stat[0] == "block") {
+ if (stat[1]) {
+ a.push.apply(a, stat[1]);
+ }
+ } else {
+ a.push(stat);
+ }
+ return a;
+ }, []);
+
+ statements = (function(a, prev){
+ statements.forEach(function(cur){
+ if (prev && ((cur[0] == "var" && prev[0] == "var") ||
+ (cur[0] == "const" && prev[0] == "const"))) {
+ prev[1] = prev[1].concat(cur[1]);
+ } else {
+ a.push(cur);
+ prev = cur;
+ }
+ });
+ return a;
+ })([]);
+
+ if (options.dead_code) statements = (function(a, has_quit){
+ statements.forEach(function(st){
+ if (has_quit) {
+ if (st[0] == "function" || st[0] == "defun") {
+ a.push(st);
+ }
+ else if (st[0] == "var" || st[0] == "const") {
+ if (!options.no_warnings)
+ warn("Variables declared in unreachable code");
+ st[1] = MAP(st[1], function(def){
+ if (def[1] && !options.no_warnings)
+ warn_unreachable([ "assign", true, [ "name", def[0] ], def[1] ]);
+ return [ def[0] ];
+ });
+ a.push(st);
+ }
+ else if (!options.no_warnings)
+ warn_unreachable(st);
+ }
+ else {
+ a.push(st);
+ if (member(st[0], [ "return", "throw", "break", "continue" ]))
+ has_quit = true;
+ }
+ });
+ return a;
+ })([]);
+
+ if (options.make_seqs) statements = (function(a, prev) {
+ statements.forEach(function(cur){
+ if (prev && prev[0] == "stat" && cur[0] == "stat") {
+ prev[1] = [ "seq", prev[1], cur[1] ];
+ } else {
+ a.push(cur);
+ prev = cur;
+ }
+ });
+ if (a.length >= 2
+ && a[a.length-2][0] == "stat"
+ && (a[a.length-1][0] == "return" || a[a.length-1][0] == "throw")
+ && a[a.length-1][1])
+ {
+ a.splice(a.length - 2, 2,
+ [ a[a.length-1][0],
+ [ "seq", a[a.length-2][1], a[a.length-1][1] ]]);
+ }
+ return a;
+ })([]);
+
+ // this increases jQuery by 1K. Probably not such a good idea after all..
+ // part of this is done in prepare_ifs anyway.
+ // if (block_type == "lambda") statements = (function(i, a, stat){
+ // while (i < statements.length) {
+ // stat = statements[i++];
+ // if (stat[0] == "if" && !stat[3]) {
+ // if (stat[2][0] == "return" && stat[2][1] == null) {
+ // a.push(make_if(negate(stat[1]), [ "block", statements.slice(i) ]));
+ // break;
+ // }
+ // var last = last_stat(stat[2]);
+ // if (last[0] == "return" && last[1] == null) {
+ // a.push(make_if(stat[1], [ "block", stat[2][1].slice(0, -1) ], [ "block", statements.slice(i) ]));
+ // break;
+ // }
+ // }
+ // a.push(stat);
+ // }
+ // return a;
+ // })(0, []);
+
+ return statements;
+ };
+
+ function make_if(c, t, e) {
+ return when_constant(c, function(ast, val){
+ if (val) {
+ t = walk(t);
+ warn_unreachable(e);
+ return t || [ "block" ];
+ } else {
+ e = walk(e);
+ warn_unreachable(t);
+ return e || [ "block" ];
+ }
+ }, function() {
+ return make_real_if(c, t, e);
+ });
+ };
+
+ function abort_else(c, t, e) {
+ var ret = [ [ "if", negate(c), e ] ];
+ if (t[0] == "block") {
+ if (t[1]) ret = ret.concat(t[1]);
+ } else {
+ ret.push(t);
+ }
+ return walk([ "block", ret ]);
+ };
+
+ function make_real_if(c, t, e) {
+ c = walk(c);
+ t = walk(t);
+ e = walk(e);
+
+ if (empty(t)) {
+ c = negate(c);
+ t = e;
+ e = null;
+ } else if (empty(e)) {
+ e = null;
+ } else {
+ // if we have both else and then, maybe it makes sense to switch them?
+ (function(){
+ var a = gen_code(c);
+ var n = negate(c);
+ var b = gen_code(n);
+ if (b.length < a.length) {
+ var tmp = t;
+ t = e;
+ e = tmp;
+ c = n;
+ }
+ })();
+ }
+ if (empty(e) && empty(t))
+ return [ "stat", c ];
+ var ret = [ "if", c, t, e ];
+ if (t[0] == "if" && empty(t[3]) && empty(e)) {
+ ret = best_of(ret, walk([ "if", [ "binary", "&&", c, t[1] ], t[2] ]));
+ }
+ else if (t[0] == "stat") {
+ if (e) {
+ if (e[0] == "stat")
+ ret = best_of(ret, [ "stat", make_conditional(c, t[1], e[1]) ]);
+ else if (aborts(e))
+ ret = abort_else(c, t, e);
+ }
+ else {
+ ret = best_of(ret, [ "stat", make_conditional(c, t[1]) ]);
+ }
+ }
+ else if (e && t[0] == e[0] && (t[0] == "return" || t[0] == "throw") && t[1] && e[1]) {
+ ret = best_of(ret, [ t[0], make_conditional(c, t[1], e[1] ) ]);
+ }
+ else if (e && aborts(t)) {
+ ret = [ [ "if", c, t ] ];
+ if (e[0] == "block") {
+ if (e[1]) ret = ret.concat(e[1]);
+ }
+ else {
+ ret.push(e);
+ }
+ ret = walk([ "block", ret ]);
+ }
+ else if (t && aborts(e)) {
+ ret = abort_else(c, t, e);
+ }
+ return ret;
+ };
+
+ function _do_while(cond, body) {
+ return when_constant(cond, function(cond, val){
+ if (!val) {
+ warn_unreachable(body);
+ return [ "block" ];
+ } else {
+ return [ "for", null, null, null, walk(body) ];
+ }
+ });
+ };
+
+ return w.with_walkers({
+ "sub": function(expr, subscript) {
+ if (subscript[0] == "string") {
+ var name = subscript[1];
+ if (is_identifier(name))
+ return [ "dot", walk(expr), name ];
+ else if (/^[1-9][0-9]*$/.test(name) || name === "0")
+ return [ "sub", walk(expr), [ "num", parseInt(name, 10) ] ];
+ }
+ },
+ "if": make_if,
+ "toplevel": function(body) {
+ return [ "toplevel", tighten(body) ];
+ },
+ "switch": function(expr, body) {
+ var last = body.length - 1;
+ return [ "switch", walk(expr), MAP(body, function(branch, i){
+ var block = tighten(branch[1]);
+ if (i == last && block.length > 0) {
+ var node = block[block.length - 1];
+ if (node[0] == "break" && !node[1])
+ block.pop();
+ }
+ return [ branch[0] ? walk(branch[0]) : null, block ];
+ }) ];
+ },
+ "function": _lambda,
+ "defun": _lambda,
+ "block": function(body) {
+ if (body) return rmblock([ "block", tighten(body) ]);
+ },
+ "binary": function(op, left, right) {
+ return when_constant([ "binary", op, walk(left), walk(right) ], function yes(c){
+ return best_of(walk(c), this);
+ }, function no() {
+ return function(){
+ if(op != "==" && op != "!=") return;
+ var l = walk(left), r = walk(right);
+ if(l && l[0] == "unary-prefix" && l[1] == "!" && l[2][0] == "num")
+ left = ['num', +!l[2][1]];
+ else if (r && r[0] == "unary-prefix" && r[1] == "!" && r[2][0] == "num")
+ right = ['num', +!r[2][1]];
+ return ["binary", op, left, right];
+ }() || this;
+ });
+ },
+ "conditional": function(c, t, e) {
+ return make_conditional(walk(c), walk(t), walk(e));
+ },
+ "try": function(t, c, f) {
+ return [
+ "try",
+ tighten(t),
+ c != null ? [ c[0], tighten(c[1]) ] : null,
+ f != null ? tighten(f) : null
+ ];
+ },
+ "unary-prefix": function(op, expr) {
+ expr = walk(expr);
+ var ret = [ "unary-prefix", op, expr ];
+ if (op == "!")
+ ret = best_of(ret, negate(expr));
+ return when_constant(ret, function(ast, val){
+ return walk(ast); // it's either true or false, so minifies to !0 or !1
+ }, function() { return ret });
+ },
+ "name": function(name) {
+ switch (name) {
+ case "true": return [ "unary-prefix", "!", [ "num", 0 ]];
+ case "false": return [ "unary-prefix", "!", [ "num", 1 ]];
+ }
+ },
+ "while": _do_while,
+ "assign": function(op, lvalue, rvalue) {
+ lvalue = walk(lvalue);
+ rvalue = walk(rvalue);
+ var okOps = [ '+', '-', '/', '*', '%', '>>', '<<', '>>>', '|', '^', '&' ];
+ if (op === true && lvalue[0] === "name" && rvalue[0] === "binary" &&
+ ~okOps.indexOf(rvalue[1]) && rvalue[2][0] === "name" &&
+ rvalue[2][1] === lvalue[1]) {
+ return [ this[0], rvalue[1], lvalue, rvalue[3] ]
+ }
+ return [ this[0], op, lvalue, rvalue ];
+ }
+ }, function() {
+ for (var i = 0; i < 2; ++i) {
+ ast = prepare_ifs(ast);
+ ast = walk(ast);
+ }
+ return ast;
+ });
+};
+
+/* -----[ re-generate code from the AST ]----- */
+
+var DOT_CALL_NO_PARENS = jsp.array_to_hash([
+ "name",
+ "array",
+ "object",
+ "string",
+ "dot",
+ "sub",
+ "call",
+ "regexp",
+ "defun"
+]);
+
+function make_string(str, ascii_only) {
+ var dq = 0, sq = 0;
+ str = str.replace(/[\\\b\f\n\r\t\x22\x27\u2028\u2029\0]/g, function(s){
+ switch (s) {
+ case "\\": return "\\\\";
+ case "\b": return "\\b";
+ case "\f": return "\\f";
+ case "\n": return "\\n";
+ case "\r": return "\\r";
+ case "\u2028": return "\\u2028";
+ case "\u2029": return "\\u2029";
+ case '"': ++dq; return '"';
+ case "'": ++sq; return "'";
+ case "\0": return "\\0";
+ }
+ return s;
+ });
+ if (ascii_only) str = to_ascii(str);
+ if (dq > sq) return "'" + str.replace(/\x27/g, "\\'") + "'";
+ else return '"' + str.replace(/\x22/g, '\\"') + '"';
+};
+
+function to_ascii(str) {
+ return str.replace(/[\u0080-\uffff]/g, function(ch) {
+ var code = ch.charCodeAt(0).toString(16);
+ while (code.length < 4) code = "0" + code;
+ return "\\u" + code;
+ });
+};
+
+var SPLICE_NEEDS_BRACKETS = jsp.array_to_hash([ "if", "while", "do", "for", "for-in", "with" ]);
+
+function gen_code(ast, options) {
+ options = defaults(options, {
+ indent_start : 0,
+ indent_level : 4,
+ quote_keys : false,
+ space_colon : false,
+ beautify : false,
+ ascii_only : false,
+ inline_script: false
+ });
+ var beautify = !!options.beautify;
+ var indentation = 0,
+ newline = beautify ? "\n" : "",
+ space = beautify ? " " : "";
+
+ function encode_string(str) {
+ var ret = make_string(str, options.ascii_only);
+ if (options.inline_script)
+ ret = ret.replace(/<\x2fscript([>\/\t\n\f\r ])/gi, "<\\/script$1");
+ return ret;
+ };
+
+ function make_name(name) {
+ name = name.toString();
+ if (options.ascii_only)
+ name = to_ascii(name);
+ return name;
+ };
+
+ function indent(line) {
+ if (line == null)
+ line = "";
+ if (beautify)
+ line = repeat_string(" ", options.indent_start + indentation * options.indent_level) + line;
+ return line;
+ };
+
+ function with_indent(cont, incr) {
+ if (incr == null) incr = 1;
+ indentation += incr;
+ try { return cont.apply(null, slice(arguments, 1)); }
+ finally { indentation -= incr; }
+ };
+
+ function add_spaces(a) {
+ if (beautify)
+ return a.join(" ");
+ var b = [];
+ for (var i = 0; i < a.length; ++i) {
+ var next = a[i + 1];
+ b.push(a[i]);
+ if (next &&
+ ((/[a-z0-9_\x24]$/i.test(a[i].toString()) && /^[a-z0-9_\x24]/i.test(next.toString())) ||
+ (/[\+\-]$/.test(a[i].toString()) && /^[\+\-]/.test(next.toString())))) {
+ b.push(" ");
+ }
+ }
+ return b.join("");
+ };
+
+ function add_commas(a) {
+ return a.join("," + space);
+ };
+
+ function parenthesize(expr) {
+ var gen = make(expr);
+ for (var i = 1; i < arguments.length; ++i) {
+ var el = arguments[i];
+ if ((el instanceof Function && el(expr)) || expr[0] == el)
+ return "(" + gen + ")";
+ }
+ return gen;
+ };
+
+ function best_of(a) {
+ if (a.length == 1) {
+ return a[0];
+ }
+ if (a.length == 2) {
+ var b = a[1];
+ a = a[0];
+ return a.length <= b.length ? a : b;
+ }
+ return best_of([ a[0], best_of(a.slice(1)) ]);
+ };
+
+ function needs_parens(expr) {
+ if (expr[0] == "function" || expr[0] == "object") {
+ // dot/call on a literal function requires the
+ // function literal itself to be parenthesized
+ // only if it's the first "thing" in a
+ // statement. This means that the parent is
+ // "stat", but it could also be a "seq" and
+ // we're the first in this "seq" and the
+ // parent is "stat", and so on. Messy stuff,
+ // but it worths the trouble.
+ var a = slice(w.stack()), self = a.pop(), p = a.pop();
+ while (p) {
+ if (p[0] == "stat") return true;
+ if (((p[0] == "seq" || p[0] == "call" || p[0] == "dot" || p[0] == "sub" || p[0] == "conditional") && p[1] === self) ||
+ ((p[0] == "binary" || p[0] == "assign" || p[0] == "unary-postfix") && p[2] === self)) {
+ self = p;
+ p = a.pop();
+ } else {
+ return false;
+ }
+ }
+ }
+ return !HOP(DOT_CALL_NO_PARENS, expr[0]);
+ };
+
+ function make_num(num) {
+ var str = num.toString(10), a = [ str.replace(/^0\./, ".") ], m;
+ if (Math.floor(num) === num) {
+ if (num >= 0) {
+ a.push("0x" + num.toString(16).toLowerCase(), // probably pointless
+ "0" + num.toString(8)); // same.
+ } else {
+ a.push("-0x" + (-num).toString(16).toLowerCase(), // probably pointless
+ "-0" + (-num).toString(8)); // same.
+ }
+ if ((m = /^(.*?)(0+)$/.exec(num))) {
+ a.push(m[1] + "e" + m[2].length);
+ }
+ } else if ((m = /^0?\.(0+)(.*)$/.exec(num))) {
+ a.push(m[2] + "e-" + (m[1].length + m[2].length),
+ str.substr(str.indexOf(".")));
+ }
+ return best_of(a);
+ };
+
+ var w = ast_walker();
+ var make = w.walk;
+ return w.with_walkers({
+ "string": encode_string,
+ "num": make_num,
+ "name": make_name,
+ "debugger": function(){ return "debugger" },
+ "toplevel": function(statements) {
+ return make_block_statements(statements)
+ .join(newline + newline);
+ },
+ "splice": function(statements) {
+ var parent = w.parent();
+ if (HOP(SPLICE_NEEDS_BRACKETS, parent)) {
+ // we need block brackets in this case
+ return make_block.apply(this, arguments);
+ } else {
+ return MAP(make_block_statements(statements, true),
+ function(line, i) {
+ // the first line is already indented
+ return i > 0 ? indent(line) : line;
+ }).join(newline);
+ }
+ },
+ "block": make_block,
+ "var": function(defs) {
+ return "var " + add_commas(MAP(defs, make_1vardef)) + ";";
+ },
+ "const": function(defs) {
+ return "const " + add_commas(MAP(defs, make_1vardef)) + ";";
+ },
+ "try": function(tr, ca, fi) {
+ var out = [ "try", make_block(tr) ];
+ if (ca) out.push("catch", "(" + ca[0] + ")", make_block(ca[1]));
+ if (fi) out.push("finally", make_block(fi));
+ return add_spaces(out);
+ },
+ "throw": function(expr) {
+ return add_spaces([ "throw", make(expr) ]) + ";";
+ },
+ "new": function(ctor, args) {
+ args = args.length > 0 ? "(" + add_commas(MAP(args, function(expr){
+ return parenthesize(expr, "seq");
+ })) + ")" : "";
+ return add_spaces([ "new", parenthesize(ctor, "seq", "binary", "conditional", "assign", function(expr){
+ var w = ast_walker(), has_call = {};
+ try {
+ w.with_walkers({
+ "call": function() { throw has_call },
+ "function": function() { return this }
+ }, function(){
+ w.walk(expr);
+ });
+ } catch(ex) {
+ if (ex === has_call)
+ return true;
+ throw ex;
+ }
+ }) + args ]);
+ },
+ "switch": function(expr, body) {
+ return add_spaces([ "switch", "(" + make(expr) + ")", make_switch_block(body) ]);
+ },
+ "break": function(label) {
+ var out = "break";
+ if (label != null)
+ out += " " + make_name(label);
+ return out + ";";
+ },
+ "continue": function(label) {
+ var out = "continue";
+ if (label != null)
+ out += " " + make_name(label);
+ return out + ";";
+ },
+ "conditional": function(co, th, el) {
+ return add_spaces([ parenthesize(co, "assign", "seq", "conditional"), "?",
+ parenthesize(th, "seq"), ":",
+ parenthesize(el, "seq") ]);
+ },
+ "assign": function(op, lvalue, rvalue) {
+ if (op && op !== true) op += "=";
+ else op = "=";
+ return add_spaces([ make(lvalue), op, parenthesize(rvalue, "seq") ]);
+ },
+ "dot": function(expr) {
+ var out = make(expr), i = 1;
+ if (expr[0] == "num") {
+ if (!/\./.test(expr[1]))
+ out += ".";
+ } else if (expr[0] != "function" && needs_parens(expr))
+ out = "(" + out + ")";
+ while (i < arguments.length)
+ out += "." + make_name(arguments[i++]);
+ return out;
+ },
+ "call": function(func, args) {
+ var f = make(func);
+ if (f.charAt(0) != "(" && needs_parens(func))
+ f = "(" + f + ")";
+ return f + "(" + add_commas(MAP(args, function(expr){
+ return parenthesize(expr, "seq");
+ })) + ")";
+ },
+ "function": make_function,
+ "defun": make_function,
+ "if": function(co, th, el) {
+ var out = [ "if", "(" + make(co) + ")", el ? make_then(th) : make(th) ];
+ if (el) {
+ out.push("else", make(el));
+ }
+ return add_spaces(out);
+ },
+ "for": function(init, cond, step, block) {
+ var out = [ "for" ];
+ init = (init != null ? make(init) : "").replace(/;*\s*$/, ";" + space);
+ cond = (cond != null ? make(cond) : "").replace(/;*\s*$/, ";" + space);
+ step = (step != null ? make(step) : "").replace(/;*\s*$/, "");
+ var args = init + cond + step;
+ if (args == "; ; ") args = ";;";
+ out.push("(" + args + ")", make(block));
+ return add_spaces(out);
+ },
+ "for-in": function(vvar, key, hash, block) {
+ return add_spaces([ "for", "(" +
+ (vvar ? make(vvar).replace(/;+$/, "") : make(key)),
+ "in",
+ make(hash) + ")", make(block) ]);
+ },
+ "while": function(condition, block) {
+ return add_spaces([ "while", "(" + make(condition) + ")", make(block) ]);
+ },
+ "do": function(condition, block) {
+ return add_spaces([ "do", make(block), "while", "(" + make(condition) + ")" ]) + ";";
+ },
+ "return": function(expr) {
+ var out = [ "return" ];
+ if (expr != null) out.push(make(expr));
+ return add_spaces(out) + ";";
+ },
+ "binary": function(operator, lvalue, rvalue) {
+ var left = make(lvalue), right = make(rvalue);
+ // XXX: I'm pretty sure other cases will bite here.
+ // we need to be smarter.
+ // adding parens all the time is the safest bet.
+ if (member(lvalue[0], [ "assign", "conditional", "seq" ]) ||
+ lvalue[0] == "binary" && PRECEDENCE[operator] > PRECEDENCE[lvalue[1]] ||
+ lvalue[0] == "function" && needs_parens(this)) {
+ left = "(" + left + ")";
+ }
+ if (member(rvalue[0], [ "assign", "conditional", "seq" ]) ||
+ rvalue[0] == "binary" && PRECEDENCE[operator] >= PRECEDENCE[rvalue[1]] &&
+ !(rvalue[1] == operator && member(operator, [ "&&", "||", "*" ]))) {
+ right = "(" + right + ")";
+ }
+ else if (!beautify && options.inline_script && (operator == "<" || operator == "<<")
+ && rvalue[0] == "regexp" && /^script/i.test(rvalue[1])) {
+ right = " " + right;
+ }
+ return add_spaces([ left, operator, right ]);
+ },
+ "unary-prefix": function(operator, expr) {
+ var val = make(expr);
+ if (!(expr[0] == "num" || (expr[0] == "unary-prefix" && !HOP(OPERATORS, operator + expr[1])) || !needs_parens(expr)))
+ val = "(" + val + ")";
+ return operator + (jsp.is_alphanumeric_char(operator.charAt(0)) ? " " : "") + val;
+ },
+ "unary-postfix": function(operator, expr) {
+ var val = make(expr);
+ if (!(expr[0] == "num" || (expr[0] == "unary-postfix" && !HOP(OPERATORS, operator + expr[1])) || !needs_parens(expr)))
+ val = "(" + val + ")";
+ return val + operator;
+ },
+ "sub": function(expr, subscript) {
+ var hash = make(expr);
+ if (needs_parens(expr))
+ hash = "(" + hash + ")";
+ return hash + "[" + make(subscript) + "]";
+ },
+ "object": function(props) {
+ var obj_needs_parens = needs_parens(this);
+ if (props.length == 0)
+ return obj_needs_parens ? "({})" : "{}";
+ var out = "{" + newline + with_indent(function(){
+ return MAP(props, function(p){
+ if (p.length == 3) {
+ // getter/setter. The name is in p[0], the arg.list in p[1][2], the
+ // body in p[1][3] and type ("get" / "set") in p[2].
+ return indent(make_function(p[0], p[1][2], p[1][3], p[2], true));
+ }
+ var key = p[0], val = parenthesize(p[1], "seq");
+ if (options.quote_keys) {
+ key = encode_string(key);
+ } else if ((typeof key == "number" || !beautify && +key + "" == key)
+ && parseFloat(key) >= 0) {
+ key = make_num(+key);
+ } else if (!is_identifier(key)) {
+ key = encode_string(key);
+ }
+ return indent(add_spaces(beautify && options.space_colon
+ ? [ key, ":", val ]
+ : [ key + ":", val ]));
+ }).join("," + newline);
+ }) + newline + indent("}");
+ return obj_needs_parens ? "(" + out + ")" : out;
+ },
+ "regexp": function(rx, mods) {
+ return "/" + rx + "/" + mods;
+ },
+ "array": function(elements) {
+ if (elements.length == 0) return "[]";
+ return add_spaces([ "[", add_commas(MAP(elements, function(el, i){
+ if (!beautify && el[0] == "atom" && el[1] == "undefined") return i === elements.length - 1 ? "," : "";
+ return parenthesize(el, "seq");
+ })), "]" ]);
+ },
+ "stat": function(stmt) {
+ return make(stmt).replace(/;*\s*$/, ";");
+ },
+ "seq": function() {
+ return add_commas(MAP(slice(arguments), make));
+ },
+ "label": function(name, block) {
+ return add_spaces([ make_name(name), ":", make(block) ]);
+ },
+ "with": function(expr, block) {
+ return add_spaces([ "with", "(" + make(expr) + ")", make(block) ]);
+ },
+ "atom": function(name) {
+ return make_name(name);
+ }
+ }, function(){ return make(ast) });
+
+ // The squeezer replaces "block"-s that contain only a single
+ // statement with the statement itself; technically, the AST
+ // is correct, but this can create problems when we output an
+ // IF having an ELSE clause where the THEN clause ends in an
+ // IF *without* an ELSE block (then the outer ELSE would refer
+ // to the inner IF). This function checks for this case and
+ // adds the block brackets if needed.
+ function make_then(th) {
+ if (th == null) return ";";
+ if (th[0] == "do") {
+ // https://github.com/mishoo/UglifyJS/issues/#issue/57
+ // IE croaks with "syntax error" on code like this:
+ // if (foo) do ... while(cond); else ...
+ // we need block brackets around do/while
+ return make_block([ th ]);
+ }
+ var b = th;
+ while (true) {
+ var type = b[0];
+ if (type == "if") {
+ if (!b[3])
+ // no else, we must add the block
+ return make([ "block", [ th ]]);
+ b = b[3];
+ }
+ else if (type == "while" || type == "do") b = b[2];
+ else if (type == "for" || type == "for-in") b = b[4];
+ else break;
+ }
+ return make(th);
+ };
+
+ function make_function(name, args, body, keyword, no_parens) {
+ var out = keyword || "function";
+ if (name) {
+ out += " " + make_name(name);
+ }
+ out += "(" + add_commas(MAP(args, make_name)) + ")";
+ out = add_spaces([ out, make_block(body) ]);
+ return (!no_parens && needs_parens(this)) ? "(" + out + ")" : out;
+ };
+
+ function must_has_semicolon(node) {
+ switch (node[0]) {
+ case "with":
+ case "while":
+ return empty(node[2]); // `with' or `while' with empty body?
+ case "for":
+ case "for-in":
+ return empty(node[4]); // `for' with empty body?
+ case "if":
+ if (empty(node[2]) && !node[3]) return true; // `if' with empty `then' and no `else'
+ if (node[3]) {
+ if (empty(node[3])) return true; // `else' present but empty
+ return must_has_semicolon(node[3]); // dive into the `else' branch
+ }
+ return must_has_semicolon(node[2]); // dive into the `then' branch
+ }
+ };
+
+ function make_block_statements(statements, noindent) {
+ for (var a = [], last = statements.length - 1, i = 0; i <= last; ++i) {
+ var stat = statements[i];
+ var code = make(stat);
+ if (code != ";") {
+ if (!beautify && i == last && !must_has_semicolon(stat)) {
+ code = code.replace(/;+\s*$/, "");
+ }
+ a.push(code);
+ }
+ }
+ return noindent ? a : MAP(a, indent);
+ };
+
+ function make_switch_block(body) {
+ var n = body.length;
+ if (n == 0) return "{}";
+ return "{" + newline + MAP(body, function(branch, i){
+ var has_body = branch[1].length > 0, code = with_indent(function(){
+ return indent(branch[0]
+ ? add_spaces([ "case", make(branch[0]) + ":" ])
+ : "default:");
+ }, 0.5) + (has_body ? newline + with_indent(function(){
+ return make_block_statements(branch[1]).join(newline);
+ }) : "");
+ if (!beautify && has_body && i < n - 1)
+ code += ";";
+ return code;
+ }).join(newline) + newline + indent("}");
+ };
+
+ function make_block(statements) {
+ if (!statements) return ";";
+ if (statements.length == 0) return "{}";
+ return "{" + newline + with_indent(function(){
+ return make_block_statements(statements).join(newline);
+ }) + newline + indent("}");
+ };
+
+ function make_1vardef(def) {
+ var name = def[0], val = def[1];
+ if (val != null)
+ name = add_spaces([ make_name(name), "=", parenthesize(val, "seq") ]);
+ return name;
+ };
+
+};
+
+function split_lines(code, max_line_length) {
+ var splits = [ 0 ];
+ jsp.parse(function(){
+ var next_token = jsp.tokenizer(code);
+ var last_split = 0;
+ var prev_token;
+ function current_length(tok) {
+ return tok.pos - last_split;
+ };
+ function split_here(tok) {
+ last_split = tok.pos;
+ splits.push(last_split);
+ };
+ function custom(){
+ var tok = next_token.apply(this, arguments);
+ out: {
+ if (prev_token) {
+ if (prev_token.type == "keyword") break out;
+ }
+ if (current_length(tok) > max_line_length) {
+ switch (tok.type) {
+ case "keyword":
+ case "atom":
+ case "name":
+ case "punc":
+ split_here(tok);
+ break out;
+ }
+ }
+ }
+ prev_token = tok;
+ return tok;
+ };
+ custom.context = function() {
+ return next_token.context.apply(this, arguments);
+ };
+ return custom;
+ }());
+ return splits.map(function(pos, i){
+ return code.substring(pos, splits[i + 1] || code.length);
+ }).join("\n");
+};
+
+/* -----[ Utilities ]----- */
+
+function repeat_string(str, i) {
+ if (i <= 0) return "";
+ if (i == 1) return str;
+ var d = repeat_string(str, i >> 1);
+ d += d;
+ if (i & 1) d += str;
+ return d;
+};
+
+function defaults(args, defs) {
+ var ret = {};
+ if (args === true)
+ args = {};
+ for (var i in defs) if (HOP(defs, i)) {
+ ret[i] = (args && HOP(args, i)) ? args[i] : defs[i];
+ }
+ return ret;
+};
+
+function is_identifier(name) {
+ return /^[a-z_$][a-z0-9_$]*$/i.test(name)
+ && name != "this"
+ && !HOP(jsp.KEYWORDS_ATOM, name)
+ && !HOP(jsp.RESERVED_WORDS, name)
+ && !HOP(jsp.KEYWORDS, name);
+};
+
+function HOP(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+};
+
+// some utilities
+
+var MAP;
+
+(function(){
+ MAP = function(a, f, o) {
+ var ret = [], top = [], i;
+ function doit() {
+ var val = f.call(o, a[i], i);
+ if (val instanceof AtTop) {
+ val = val.v;
+ if (val instanceof Splice) {
+ top.push.apply(top, val.v);
+ } else {
+ top.push(val);
+ }
+ }
+ else if (val != skip) {
+ if (val instanceof Splice) {
+ ret.push.apply(ret, val.v);
+ } else {
+ ret.push(val);
+ }
+ }
+ };
+ if (a instanceof Array) for (i = 0; i < a.length; ++i) doit();
+ else for (i in a) if (HOP(a, i)) doit();
+ return top.concat(ret);
+ };
+ MAP.at_top = function(val) { return new AtTop(val) };
+ MAP.splice = function(val) { return new Splice(val) };
+ var skip = MAP.skip = {};
+ function AtTop(val) { this.v = val };
+ function Splice(val) { this.v = val };
+})();
+
+/* -----[ Exports ]----- */
+
+exports.ast_walker = ast_walker;
+exports.ast_mangle = ast_mangle;
+exports.ast_squeeze = ast_squeeze;
+exports.ast_lift_variables = ast_lift_variables;
+exports.gen_code = gen_code;
+exports.ast_add_scope = ast_add_scope;
+exports.set_logger = function(logger) { warn = logger };
+exports.make_string = make_string;
+exports.split_lines = split_lines;
+exports.MAP = MAP;
+
+// keep this last!
+exports.ast_squeeze_more = require("./squeeze-more").ast_squeeze_more;
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/lib/squeeze-more.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/lib/squeeze-more.js
new file mode 100644
index 000000000..0908db3ee
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/lib/squeeze-more.js
@@ -0,0 +1,73 @@
+var jsp = require("./parse-js"),
+ pro = require("./process"),
+ slice = jsp.slice,
+ member = jsp.member,
+ curry = jsp.curry,
+ MAP = pro.MAP,
+ PRECEDENCE = jsp.PRECEDENCE,
+ OPERATORS = jsp.OPERATORS;
+
+function ast_squeeze_more(ast) {
+ var w = pro.ast_walker(), walk = w.walk, scope;
+ function with_scope(s, cont) {
+ var save = scope, ret;
+ scope = s;
+ ret = cont();
+ scope = save;
+ return ret;
+ };
+ function _lambda(name, args, body) {
+ return [ this[0], name, args, with_scope(body.scope, curry(MAP, body, walk)) ];
+ };
+ return w.with_walkers({
+ "toplevel": function(body) {
+ return [ this[0], with_scope(this.scope, curry(MAP, body, walk)) ];
+ },
+ "function": _lambda,
+ "defun": _lambda,
+ "new": function(ctor, args) {
+ if (ctor[0] == "name") {
+ if (ctor[1] == "Array" && !scope.has("Array")) {
+ if (args.length != 1) {
+ return [ "array", args ];
+ } else {
+ return walk([ "call", [ "name", "Array" ], args ]);
+ }
+ } else if (ctor[1] == "Object" && !scope.has("Object")) {
+ if (!args.length) {
+ return [ "object", [] ];
+ } else {
+ return walk([ "call", [ "name", "Object" ], args ]);
+ }
+ } else if ((ctor[1] == "RegExp" || ctor[1] == "Function" || ctor[1] == "Error") && !scope.has(ctor[1])) {
+ return walk([ "call", [ "name", ctor[1] ], args]);
+ }
+ }
+ },
+ "call": function(expr, args) {
+ if (expr[0] == "dot" && expr[1][0] == "string" && args.length == 1
+ && (args[0][1] > 0 && expr[2] == "substring" || expr[2] == "substr")) {
+ return [ "call", [ "dot", expr[1], "slice"], args];
+ }
+ if (expr[0] == "dot" && expr[2] == "toString" && args.length == 0) {
+ // foo.toString() ==> foo+""
+ return [ "binary", "+", expr[1], [ "string", "" ]];
+ }
+ if (expr[0] == "name") {
+ if (expr[1] == "Array" && args.length != 1 && !scope.has("Array")) {
+ return [ "array", args ];
+ }
+ if (expr[1] == "Object" && !args.length && !scope.has("Object")) {
+ return [ "object", [] ];
+ }
+ if (expr[1] == "String" && !scope.has("String")) {
+ return [ "binary", "+", args[0], [ "string", "" ]];
+ }
+ }
+ }
+ }, function() {
+ return walk(pro.ast_add_scope(ast));
+ });
+};
+
+exports.ast_squeeze_more = ast_squeeze_more;
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/package.json b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/package.json
new file mode 100644
index 000000000..cdbca1e7a
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/package.json
@@ -0,0 +1,24 @@
+{
+ "name": "uglify-js",
+ "description": "JavaScript parser and compressor/beautifier toolkit",
+ "author": {
+ "name": "Mihai Bazon",
+ "email": "mihai.bazon@gmail.com",
+ "url": "http://mihai.bazon.net/blog"
+ },
+ "version": "1.2.6",
+ "main": "./uglify-js.js",
+ "bin": {
+ "uglifyjs": "./bin/uglifyjs"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git@github.com:mishoo/UglifyJS.git"
+ },
+ "readme": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\"\nlang=\"en\" xml:lang=\"en\">\n<head>\n<title>UglifyJS &ndash; a JavaScript parser/compressor/beautifier</title>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"/>\n<meta name=\"generator\" content=\"Org-mode\"/>\n<meta name=\"generated\" content=\"2011-12-09 14:59:08 EET\"/>\n<meta name=\"author\" content=\"Mihai Bazon\"/>\n<meta name=\"description\" content=\"a JavaScript parser/compressor/beautifier in JavaScript\"/>\n<meta name=\"keywords\" content=\"javascript, js, parser, compiler, compressor, mangle, minify, minifier\"/>\n<style type=\"text/css\">\n <!--/*--><![CDATA[/*><!--*/\n html { font-family: Times, serif; font-size: 12pt; }\n .title { text-align: center; }\n .todo { color: red; }\n .done { color: green; }\n .tag { background-color: #add8e6; font-weight:normal }\n .target { }\n .timestamp { color: #bebebe; }\n .timestamp-kwd { color: #5f9ea0; }\n .right {margin-left:auto; margin-right:0px; text-align:right;}\n .left {margin-left:0px; margin-right:auto; text-align:left;}\n .center {margin-left:auto; margin-right:auto; text-align:center;}\n p.verse { margin-left: 3% }\n pre {\n\tborder: 1pt solid #AEBDCC;\n\tbackground-color: #F3F5F7;\n\tpadding: 5pt;\n\tfont-family: courier, monospace;\n font-size: 90%;\n overflow:auto;\n }\n table { border-collapse: collapse; }\n td, th { vertical-align: top; }\n th.right { text-align:center; }\n th.left { text-align:center; }\n th.center { text-align:center; }\n td.right { text-align:right; }\n td.left { text-align:left; }\n td.center { text-align:center; }\n dt { font-weight: bold; }\n div.figure { padding: 0.5em; }\n div.figure p { text-align: center; }\n div.inlinetask {\n padding:10px;\n border:2px solid gray;\n margin:10px;\n background: #ffffcc;\n }\n textarea { overflow-x: auto; }\n .linenr { font-size:smaller }\n .code-highlighted {background-color:#ffff00;}\n .org-info-js_info-navigation { border-style:none; }\n #org-info-js_console-label { font-size:10px; font-weight:bold;\n white-space:nowrap; }\n .org-info-js_search-highlight {background-color:#ffff00; color:#000000;\n font-weight:bold; }\n /*]]>*/-->\n</style>\n<link rel=\"stylesheet\" type=\"text/css\" href=\"docstyle.css\" />\n<script type=\"text/javascript\">\n<!--/*--><![CDATA[/*><!--*/\n function CodeHighlightOn(elem, id)\n {\n var target = document.getElementById(id);\n if(null != target) {\n elem.cacheClassElem = elem.className;\n elem.cacheClassTarget = target.className;\n target.className = \"code-highlighted\";\n elem.className = \"code-highlighted\";\n }\n }\n function CodeHighlightOff(elem, id)\n {\n var target = document.getElementById(id);\n if(elem.cacheClassElem)\n elem.className = elem.cacheClassElem;\n if(elem.cacheClassTarget)\n target.className = elem.cacheClassTarget;\n }\n/*]]>*///-->\n</script>\n\n</head>\n<body>\n\n<div id=\"preamble\">\n\n</div>\n\n<div id=\"content\">\n<h1 class=\"title\">UglifyJS &ndash; a JavaScript parser/compressor/beautifier</h1>\n\n\n<div id=\"table-of-contents\">\n<h2>Table of Contents</h2>\n<div id=\"text-table-of-contents\">\n<ul>\n<li><a href=\"#sec-1\">1 UglifyJS &mdash; a JavaScript parser/compressor/beautifier </a>\n<ul>\n<li><a href=\"#sec-1-1\">1.1 Unsafe transformations </a>\n<ul>\n<li><a href=\"#sec-1-1-1\">1.1.1 Calls involving the global Array constructor </a></li>\n<li><a href=\"#sec-1-1-2\">1.1.2 <code>obj.toString()</code> ==&gt; <code>obj+“”</code> </a></li>\n</ul>\n</li>\n<li><a href=\"#sec-1-2\">1.2 Install (NPM) </a></li>\n<li><a href=\"#sec-1-3\">1.3 Install latest code from GitHub </a></li>\n<li><a href=\"#sec-1-4\">1.4 Usage </a>\n<ul>\n<li><a href=\"#sec-1-4-1\">1.4.1 API </a></li>\n<li><a href=\"#sec-1-4-2\">1.4.2 Beautifier shortcoming &ndash; no more comments </a></li>\n<li><a href=\"#sec-1-4-3\">1.4.3 Use as a code pre-processor </a></li>\n</ul>\n</li>\n<li><a href=\"#sec-1-5\">1.5 Compression &ndash; how good is it? </a></li>\n<li><a href=\"#sec-1-6\">1.6 Bugs? </a></li>\n<li><a href=\"#sec-1-7\">1.7 Links </a></li>\n<li><a href=\"#sec-1-8\">1.8 License </a></li>\n</ul>\n</li>\n</ul>\n</div>\n</div>\n\n<div id=\"outline-container-1\" class=\"outline-2\">\n<h2 id=\"sec-1\"><span class=\"section-number-2\">1</span> UglifyJS &mdash; a JavaScript parser/compressor/beautifier </h2>\n<div class=\"outline-text-2\" id=\"text-1\">\n\n\n<p>\nThis package implements a general-purpose JavaScript\nparser/compressor/beautifier toolkit. It is developed on <a href=\"http://nodejs.org/\">NodeJS</a>, but it\nshould work on any JavaScript platform supporting the CommonJS module system\n(and if your platform of choice doesn't support CommonJS, you can easily\nimplement it, or discard the <code>exports.*</code> lines from UglifyJS sources).\n</p>\n<p>\nThe tokenizer/parser generates an abstract syntax tree from JS code. You\ncan then traverse the AST to learn more about the code, or do various\nmanipulations on it. This part is implemented in <a href=\"../lib/parse-js.js\">parse-js.js</a> and it's a\nport to JavaScript of the excellent <a href=\"http://marijn.haverbeke.nl/parse-js/\">parse-js</a> Common Lisp library from <a href=\"http://marijn.haverbeke.nl/\">Marijn Haverbeke</a>.\n</p>\n<p>\n( See <a href=\"http://github.com/mishoo/cl-uglify-js\">cl-uglify-js</a> if you're looking for the Common Lisp version of\nUglifyJS. )\n</p>\n<p>\nThe second part of this package, implemented in <a href=\"../lib/process.js\">process.js</a>, inspects and\nmanipulates the AST generated by the parser to provide the following:\n</p>\n<ul>\n<li>ability to re-generate JavaScript code from the AST. Optionally\n indented&mdash;you can use this if you want to “beautify” a program that has\n been compressed, so that you can inspect the source. But you can also run\n our code generator to print out an AST without any whitespace, so you\n achieve compression as well.\n\n</li>\n<li>shorten variable names (usually to single characters). Our mangler will\n analyze the code and generate proper variable names, depending on scope\n and usage, and is smart enough to deal with globals defined elsewhere, or\n with <code>eval()</code> calls or <code>with{}</code> statements. In short, if <code>eval()</code> or\n <code>with{}</code> are used in some scope, then all variables in that scope and any\n variables in the parent scopes will remain unmangled, and any references\n to such variables remain unmangled as well.\n\n</li>\n<li>various small optimizations that may lead to faster code but certainly\n lead to smaller code. Where possible, we do the following:\n\n<ul>\n<li>foo[\"bar\"] ==&gt; foo.bar\n\n</li>\n<li>remove block brackets <code>{}</code>\n\n</li>\n<li>join consecutive var declarations:\n var a = 10; var b = 20; ==&gt; var a=10,b=20;\n\n</li>\n<li>resolve simple constant expressions: 1 +2 * 3 ==&gt; 7. We only do the\n replacement if the result occupies less bytes; for example 1/3 would\n translate to 0.333333333333, so in this case we don't replace it.\n\n</li>\n<li>consecutive statements in blocks are merged into a sequence; in many\n cases, this leaves blocks with a single statement, so then we can remove\n the block brackets.\n\n</li>\n<li>various optimizations for IF statements:\n\n<ul>\n<li>if (foo) bar(); else baz(); ==&gt; foo?bar():baz();\n</li>\n<li>if (!foo) bar(); else baz(); ==&gt; foo?baz():bar();\n</li>\n<li>if (foo) bar(); ==&gt; foo&amp;&amp;bar();\n</li>\n<li>if (!foo) bar(); ==&gt; foo||bar();\n</li>\n<li>if (foo) return bar(); else return baz(); ==&gt; return foo?bar():baz();\n</li>\n<li>if (foo) return bar(); else something(); ==&gt; {if(foo)return bar();something()}\n\n</li>\n</ul>\n\n</li>\n<li>remove some unreachable code and warn about it (code that follows a\n <code>return</code>, <code>throw</code>, <code>break</code> or <code>continue</code> statement, except\n function/variable declarations).\n\n</li>\n<li>act a limited version of a pre-processor (c.f. the pre-processor of\n C/C++) to allow you to safely replace selected global symbols with\n specified values. When combined with the optimisations above this can\n make UglifyJS operate slightly more like a compilation process, in\n that when certain symbols are replaced by constant values, entire code\n blocks may be optimised away as unreachable.\n</li>\n</ul>\n\n</li>\n</ul>\n\n\n\n</div>\n\n<div id=\"outline-container-1-1\" class=\"outline-3\">\n<h3 id=\"sec-1-1\"><span class=\"section-number-3\">1.1</span> <span class=\"target\">Unsafe transformations</span> </h3>\n<div class=\"outline-text-3\" id=\"text-1-1\">\n\n\n<p>\nThe following transformations can in theory break code, although they're\nprobably safe in most practical cases. To enable them you need to pass the\n<code>--unsafe</code> flag.\n</p>\n\n</div>\n\n<div id=\"outline-container-1-1-1\" class=\"outline-4\">\n<h4 id=\"sec-1-1-1\"><span class=\"section-number-4\">1.1.1</span> Calls involving the global Array constructor </h4>\n<div class=\"outline-text-4\" id=\"text-1-1-1\">\n\n\n<p>\nThe following transformations occur:\n</p>\n\n\n\n<pre class=\"src src-js\"><span class=\"org-keyword\">new</span> <span class=\"org-type\">Array</span>(1, 2, 3, 4) =&gt; [1,2,3,4]\nArray(a, b, c) =&gt; [a,b,c]\n<span class=\"org-keyword\">new</span> <span class=\"org-type\">Array</span>(5) =&gt; Array(5)\n<span class=\"org-keyword\">new</span> <span class=\"org-type\">Array</span>(a) =&gt; Array(a)\n</pre>\n\n\n<p>\nThese are all safe if the Array name isn't redefined. JavaScript does allow\none to globally redefine Array (and pretty much everything, in fact) but I\npersonally don't see why would anyone do that.\n</p>\n<p>\nUglifyJS does handle the case where Array is redefined locally, or even\nglobally but with a <code>function</code> or <code>var</code> declaration. Therefore, in the\nfollowing cases UglifyJS <b>doesn't touch</b> calls or instantiations of Array:\n</p>\n\n\n\n<pre class=\"src src-js\"><span class=\"org-comment-delimiter\">// </span><span class=\"org-comment\">case 1. globally declared variable</span>\n <span class=\"org-keyword\">var</span> <span class=\"org-variable-name\">Array</span>;\n <span class=\"org-keyword\">new</span> <span class=\"org-type\">Array</span>(1, 2, 3);\n Array(a, b);\n\n <span class=\"org-comment-delimiter\">// </span><span class=\"org-comment\">or (can be declared later)</span>\n <span class=\"org-keyword\">new</span> <span class=\"org-type\">Array</span>(1, 2, 3);\n <span class=\"org-keyword\">var</span> <span class=\"org-variable-name\">Array</span>;\n\n <span class=\"org-comment-delimiter\">// </span><span class=\"org-comment\">or (can be a function)</span>\n <span class=\"org-keyword\">new</span> <span class=\"org-type\">Array</span>(1, 2, 3);\n <span class=\"org-keyword\">function</span> <span class=\"org-function-name\">Array</span>() { ... }\n\n<span class=\"org-comment-delimiter\">// </span><span class=\"org-comment\">case 2. declared in a function</span>\n (<span class=\"org-keyword\">function</span>(){\n a = <span class=\"org-keyword\">new</span> <span class=\"org-type\">Array</span>(1, 2, 3);\n b = Array(5, 6);\n <span class=\"org-keyword\">var</span> <span class=\"org-variable-name\">Array</span>;\n })();\n\n <span class=\"org-comment-delimiter\">// </span><span class=\"org-comment\">or</span>\n (<span class=\"org-keyword\">function</span>(<span class=\"org-variable-name\">Array</span>){\n <span class=\"org-keyword\">return</span> Array(5, 6, 7);\n })();\n\n <span class=\"org-comment-delimiter\">// </span><span class=\"org-comment\">or</span>\n (<span class=\"org-keyword\">function</span>(){\n <span class=\"org-keyword\">return</span> <span class=\"org-keyword\">new</span> <span class=\"org-type\">Array</span>(1, 2, 3, 4);\n <span class=\"org-keyword\">function</span> <span class=\"org-function-name\">Array</span>() { ... }\n })();\n\n <span class=\"org-comment-delimiter\">// </span><span class=\"org-comment\">etc.</span>\n</pre>\n\n\n</div>\n\n</div>\n\n<div id=\"outline-container-1-1-2\" class=\"outline-4\">\n<h4 id=\"sec-1-1-2\"><span class=\"section-number-4\">1.1.2</span> <code>obj.toString()</code> ==&gt; <code>obj+“”</code> </h4>\n<div class=\"outline-text-4\" id=\"text-1-1-2\">\n\n\n</div>\n</div>\n\n</div>\n\n<div id=\"outline-container-1-2\" class=\"outline-3\">\n<h3 id=\"sec-1-2\"><span class=\"section-number-3\">1.2</span> Install (NPM) </h3>\n<div class=\"outline-text-3\" id=\"text-1-2\">\n\n\n<p>\nUglifyJS is now available through NPM &mdash; <code>npm install uglify-js</code> should do\nthe job.\n</p>\n</div>\n\n</div>\n\n<div id=\"outline-container-1-3\" class=\"outline-3\">\n<h3 id=\"sec-1-3\"><span class=\"section-number-3\">1.3</span> Install latest code from GitHub </h3>\n<div class=\"outline-text-3\" id=\"text-1-3\">\n\n\n\n\n\n<pre class=\"src src-sh\"><span class=\"org-comment-delimiter\">## </span><span class=\"org-comment\">clone the repository</span>\nmkdir -p /where/you/wanna/put/it\n<span class=\"org-builtin\">cd</span> /where/you/wanna/put/it\ngit clone git://github.com/mishoo/UglifyJS.git\n\n<span class=\"org-comment-delimiter\">## </span><span class=\"org-comment\">make the module available to Node</span>\nmkdir -p ~/.node_libraries/\n<span class=\"org-builtin\">cd</span> ~/.node_libraries/\nln -s /where/you/wanna/put/it/UglifyJS/uglify-js.js\n\n<span class=\"org-comment-delimiter\">## </span><span class=\"org-comment\">and if you want the CLI script too:</span>\nmkdir -p ~/bin\n<span class=\"org-builtin\">cd</span> ~/bin\nln -s /where/you/wanna/put/it/UglifyJS/bin/uglifyjs\n <span class=\"org-comment-delimiter\"># </span><span class=\"org-comment\">(then add ~/bin to your $PATH if it's not there already)</span>\n</pre>\n\n\n</div>\n\n</div>\n\n<div id=\"outline-container-1-4\" class=\"outline-3\">\n<h3 id=\"sec-1-4\"><span class=\"section-number-3\">1.4</span> Usage </h3>\n<div class=\"outline-text-3\" id=\"text-1-4\">\n\n\n<p>\nThere is a command-line tool that exposes the functionality of this library\nfor your shell-scripting needs:\n</p>\n\n\n\n<pre class=\"src src-sh\">uglifyjs [ options... ] [ filename ]\n</pre>\n\n\n<p>\n<code>filename</code> should be the last argument and should name the file from which\nto read the JavaScript code. If you don't specify it, it will read code\nfrom STDIN.\n</p>\n<p>\nSupported options:\n</p>\n<ul>\n<li><code>-b</code> or <code>--beautify</code> &mdash; output indented code; when passed, additional\n options control the beautifier:\n\n<ul>\n<li><code>-i N</code> or <code>--indent N</code> &mdash; indentation level (number of spaces)\n\n</li>\n<li><code>-q</code> or <code>--quote-keys</code> &mdash; quote keys in literal objects (by default,\n only keys that cannot be identifier names will be quotes).\n\n</li>\n</ul>\n\n</li>\n<li><code>--ascii</code> &mdash; pass this argument to encode non-ASCII characters as\n <code>\\uXXXX</code> sequences. By default UglifyJS won't bother to do it and will\n output Unicode characters instead. (the output is always encoded in UTF8,\n but if you pass this option you'll only get ASCII).\n\n</li>\n<li><code>-nm</code> or <code>--no-mangle</code> &mdash; don't mangle names.\n\n</li>\n<li><code>-nmf</code> or <code>--no-mangle-functions</code> &ndash; in case you want to mangle variable\n names, but not touch function names.\n\n</li>\n<li><code>-ns</code> or <code>--no-squeeze</code> &mdash; don't call <code>ast_squeeze()</code> (which does various\n optimizations that result in smaller, less readable code).\n\n</li>\n<li><code>-mt</code> or <code>--mangle-toplevel</code> &mdash; mangle names in the toplevel scope too\n (by default we don't do this).\n\n</li>\n<li><code>--no-seqs</code> &mdash; when <code>ast_squeeze()</code> is called (thus, unless you pass\n <code>--no-squeeze</code>) it will reduce consecutive statements in blocks into a\n sequence. For example, \"a = 10; b = 20; foo();\" will be written as\n \"a=10,b=20,foo();\". In various occasions, this allows us to discard the\n block brackets (since the block becomes a single statement). This is ON\n by default because it seems safe and saves a few hundred bytes on some\n libs that I tested it on, but pass <code>--no-seqs</code> to disable it.\n\n</li>\n<li><code>--no-dead-code</code> &mdash; by default, UglifyJS will remove code that is\n obviously unreachable (code that follows a <code>return</code>, <code>throw</code>, <code>break</code> or\n <code>continue</code> statement and is not a function/variable declaration). Pass\n this option to disable this optimization.\n\n</li>\n<li><code>-nc</code> or <code>--no-copyright</code> &mdash; by default, <code>uglifyjs</code> will keep the initial\n comment tokens in the generated code (assumed to be copyright information\n etc.). If you pass this it will discard it.\n\n</li>\n<li><code>-o filename</code> or <code>--output filename</code> &mdash; put the result in <code>filename</code>. If\n this isn't given, the result goes to standard output (or see next one).\n\n</li>\n<li><code>--overwrite</code> &mdash; if the code is read from a file (not from STDIN) and you\n pass <code>--overwrite</code> then the output will be written in the same file.\n\n</li>\n<li><code>--ast</code> &mdash; pass this if you want to get the Abstract Syntax Tree instead\n of JavaScript as output. Useful for debugging or learning more about the\n internals.\n\n</li>\n<li><code>-v</code> or <code>--verbose</code> &mdash; output some notes on STDERR (for now just how long\n each operation takes).\n\n</li>\n<li><code>-d SYMBOL[=VALUE]</code> or <code>--define SYMBOL[=VALUE]</code> &mdash; will replace\n all instances of the specified symbol where used as an identifier\n (except where symbol has properly declared by a var declaration or\n use as function parameter or similar) with the specified value. This\n argument may be specified multiple times to define multiple\n symbols - if no value is specified the symbol will be replaced with\n the value <code>true</code>, or you can specify a numeric value (such as\n <code>1024</code>), a quoted string value (such as =\"object\"= or\n ='https://github.com'<code>), or the name of another symbol or keyword (such as =null</code> or <code>document</code>).\n This allows you, for example, to assign meaningful names to key\n constant values but discard the symbolic names in the uglified\n version for brevity/efficiency, or when used wth care, allows\n UglifyJS to operate as a form of <b>conditional compilation</b>\n whereby defining appropriate values may, by dint of the constant\n folding and dead code removal features above, remove entire\n superfluous code blocks (e.g. completely remove instrumentation or\n trace code for production use).\n Where string values are being defined, the handling of quotes are\n likely to be subject to the specifics of your command shell\n environment, so you may need to experiment with quoting styles\n depending on your platform, or you may find the option\n <code>--define-from-module</code> more suitable for use.\n\n</li>\n<li><code>-define-from-module SOMEMODULE</code> &mdash; will load the named module (as\n per the NodeJS <code>require()</code> function) and iterate all the exported\n properties of the module defining them as symbol names to be defined\n (as if by the <code>--define</code> option) per the name of each property\n (i.e. without the module name prefix) and given the value of the\n property. This is a much easier way to handle and document groups of\n symbols to be defined rather than a large number of <code>--define</code>\n options.\n\n</li>\n<li><code>--unsafe</code> &mdash; enable other additional optimizations that are known to be\n unsafe in some contrived situations, but could still be generally useful.\n For now only these:\n\n<ul>\n<li>foo.toString() ==&gt; foo+\"\"\n</li>\n<li>new Array(x,&hellip;) ==&gt; [x,&hellip;]\n</li>\n<li>new Array(x) ==&gt; Array(x)\n\n</li>\n</ul>\n\n</li>\n<li><code>--max-line-len</code> (default 32K characters) &mdash; add a newline after around\n 32K characters. I've seen both FF and Chrome croak when all the code was\n on a single line of around 670K. Pass &ndash;max-line-len 0 to disable this\n safety feature.\n\n</li>\n<li><code>--reserved-names</code> &mdash; some libraries rely on certain names to be used, as\n pointed out in issue #92 and #81, so this option allow you to exclude such\n names from the mangler. For example, to keep names <code>require</code> and <code>$super</code>\n intact you'd specify &ndash;reserved-names \"require,$super\".\n\n</li>\n<li><code>--inline-script</code> &ndash; when you want to include the output literally in an\n HTML <code>&lt;script&gt;</code> tag you can use this option to prevent <code>&lt;/script</code> from\n showing up in the output.\n\n</li>\n<li><code>--lift-vars</code> &ndash; when you pass this, UglifyJS will apply the following\n transformations (see the notes in API, <code>ast_lift_variables</code>):\n\n<ul>\n<li>put all <code>var</code> declarations at the start of the scope\n</li>\n<li>make sure a variable is declared only once\n</li>\n<li>discard unused function arguments\n</li>\n<li>discard unused inner (named) functions\n</li>\n<li>finally, try to merge assignments into that one <code>var</code> declaration, if\n possible.\n</li>\n</ul>\n\n</li>\n</ul>\n\n\n\n</div>\n\n<div id=\"outline-container-1-4-1\" class=\"outline-4\">\n<h4 id=\"sec-1-4-1\"><span class=\"section-number-4\">1.4.1</span> API </h4>\n<div class=\"outline-text-4\" id=\"text-1-4-1\">\n\n\n<p>\nTo use the library from JavaScript, you'd do the following (example for\nNodeJS):\n</p>\n\n\n\n<pre class=\"src src-js\"><span class=\"org-keyword\">var</span> <span class=\"org-variable-name\">jsp</span> = require(<span class=\"org-string\">\"uglify-js\"</span>).parser;\n<span class=\"org-keyword\">var</span> <span class=\"org-variable-name\">pro</span> = require(<span class=\"org-string\">\"uglify-js\"</span>).uglify;\n\n<span class=\"org-keyword\">var</span> <span class=\"org-variable-name\">orig_code</span> = <span class=\"org-string\">\"... JS code here\"</span>;\n<span class=\"org-keyword\">var</span> <span class=\"org-variable-name\">ast</span> = jsp.parse(orig_code); <span class=\"org-comment-delimiter\">// </span><span class=\"org-comment\">parse code and get the initial AST</span>\nast = pro.ast_mangle(ast); <span class=\"org-comment-delimiter\">// </span><span class=\"org-comment\">get a new AST with mangled names</span>\nast = pro.ast_squeeze(ast); <span class=\"org-comment-delimiter\">// </span><span class=\"org-comment\">get an AST with compression optimizations</span>\n<span class=\"org-keyword\">var</span> <span class=\"org-variable-name\">final_code</span> = pro.gen_code(ast); <span class=\"org-comment-delimiter\">// </span><span class=\"org-comment\">compressed code here</span>\n</pre>\n\n\n<p>\nThe above performs the full compression that is possible right now. As you\ncan see, there are a sequence of steps which you can apply. For example if\nyou want compressed output but for some reason you don't want to mangle\nvariable names, you would simply skip the line that calls\n<code>pro.ast_mangle(ast)</code>.\n</p>\n<p>\nSome of these functions take optional arguments. Here's a description:\n</p>\n<ul>\n<li><code>jsp.parse(code, strict_semicolons)</code> &ndash; parses JS code and returns an AST.\n <code>strict_semicolons</code> is optional and defaults to <code>false</code>. If you pass\n <code>true</code> then the parser will throw an error when it expects a semicolon and\n it doesn't find it. For most JS code you don't want that, but it's useful\n if you want to strictly sanitize your code.\n\n</li>\n<li><code>pro.ast_lift_variables(ast)</code> &ndash; merge and move <code>var</code> declarations to the\n scop of the scope; discard unused function arguments or variables; discard\n unused (named) inner functions. It also tries to merge assignments\n following the <code>var</code> declaration into it.\n\n<p>\n If your code is very hand-optimized concerning <code>var</code> declarations, this\n lifting variable declarations might actually increase size. For me it\n helps out. On jQuery it adds 865 bytes (243 after gzip). YMMV. Also\n note that (since it's not enabled by default) this operation isn't yet\n heavily tested (please report if you find issues!).\n</p>\n<p>\n Note that although it might increase the image size (on jQuery it gains\n 865 bytes, 243 after gzip) it's technically more correct: in certain\n situations, dead code removal might drop variable declarations, which\n would not happen if the variables are lifted in advance.\n</p>\n<p>\n Here's an example of what it does:\n</p></li>\n</ul>\n\n\n\n\n\n<pre class=\"src src-js\"><span class=\"org-keyword\">function</span> <span class=\"org-function-name\">f</span>(<span class=\"org-variable-name\">a</span>, <span class=\"org-variable-name\">b</span>, <span class=\"org-variable-name\">c</span>, <span class=\"org-variable-name\">d</span>, <span class=\"org-variable-name\">e</span>) {\n <span class=\"org-keyword\">var</span> <span class=\"org-variable-name\">q</span>;\n <span class=\"org-keyword\">var</span> <span class=\"org-variable-name\">w</span>;\n w = 10;\n q = 20;\n <span class=\"org-keyword\">for</span> (<span class=\"org-keyword\">var</span> <span class=\"org-variable-name\">i</span> = 1; i &lt; 10; ++i) {\n <span class=\"org-keyword\">var</span> <span class=\"org-variable-name\">boo</span> = foo(a);\n }\n <span class=\"org-keyword\">for</span> (<span class=\"org-keyword\">var</span> <span class=\"org-variable-name\">i</span> = 0; i &lt; 1; ++i) {\n <span class=\"org-keyword\">var</span> <span class=\"org-variable-name\">boo</span> = bar(c);\n }\n <span class=\"org-keyword\">function</span> <span class=\"org-function-name\">foo</span>(){ ... }\n <span class=\"org-keyword\">function</span> <span class=\"org-function-name\">bar</span>(){ ... }\n <span class=\"org-keyword\">function</span> <span class=\"org-function-name\">baz</span>(){ ... }\n}\n\n<span class=\"org-comment-delimiter\">// </span><span class=\"org-comment\">transforms into ==&gt;</span>\n\n<span class=\"org-keyword\">function</span> <span class=\"org-function-name\">f</span>(<span class=\"org-variable-name\">a</span>, <span class=\"org-variable-name\">b</span>, <span class=\"org-variable-name\">c</span>) {\n <span class=\"org-keyword\">var</span> <span class=\"org-variable-name\">i</span>, <span class=\"org-variable-name\">boo</span>, <span class=\"org-variable-name\">w</span> = 10, <span class=\"org-variable-name\">q</span> = 20;\n <span class=\"org-keyword\">for</span> (i = 1; i &lt; 10; ++i) {\n boo = foo(a);\n }\n <span class=\"org-keyword\">for</span> (i = 0; i &lt; 1; ++i) {\n boo = bar(c);\n }\n <span class=\"org-keyword\">function</span> <span class=\"org-function-name\">foo</span>() { ... }\n <span class=\"org-keyword\">function</span> <span class=\"org-function-name\">bar</span>() { ... }\n}\n</pre>\n\n\n<ul>\n<li><code>pro.ast_mangle(ast, options)</code> &ndash; generates a new AST containing mangled\n (compressed) variable and function names. It supports the following\n options:\n\n<ul>\n<li><code>toplevel</code> &ndash; mangle toplevel names (by default we don't touch them).\n</li>\n<li><code>except</code> &ndash; an array of names to exclude from compression.\n</li>\n<li><code>defines</code> &ndash; an object with properties named after symbols to\n replace (see the <code>--define</code> option for the script) and the values\n representing the AST replacement value.\n\n</li>\n</ul>\n\n</li>\n<li><code>pro.ast_squeeze(ast, options)</code> &ndash; employs further optimizations designed\n to reduce the size of the code that <code>gen_code</code> would generate from the\n AST. Returns a new AST. <code>options</code> can be a hash; the supported options\n are:\n\n<ul>\n<li><code>make_seqs</code> (default true) which will cause consecutive statements in a\n block to be merged using the \"sequence\" (comma) operator\n\n</li>\n<li><code>dead_code</code> (default true) which will remove unreachable code.\n\n</li>\n</ul>\n\n</li>\n<li><code>pro.gen_code(ast, options)</code> &ndash; generates JS code from the AST. By\n default it's minified, but using the <code>options</code> argument you can get nicely\n formatted output. <code>options</code> is, well, optional :-) and if you pass it it\n must be an object and supports the following properties (below you can see\n the default values):\n\n<ul>\n<li><code>beautify: false</code> &ndash; pass <code>true</code> if you want indented output\n</li>\n<li><code>indent_start: 0</code> (only applies when <code>beautify</code> is <code>true</code>) &ndash; initial\n indentation in spaces\n</li>\n<li><code>indent_level: 4</code> (only applies when <code>beautify</code> is <code>true</code>) --\n indentation level, in spaces (pass an even number)\n</li>\n<li><code>quote_keys: false</code> &ndash; if you pass <code>true</code> it will quote all keys in\n literal objects\n</li>\n<li><code>space_colon: false</code> (only applies when <code>beautify</code> is <code>true</code>) &ndash; wether\n to put a space before the colon in object literals\n</li>\n<li><code>ascii_only: false</code> &ndash; pass <code>true</code> if you want to encode non-ASCII\n characters as <code>\\uXXXX</code>.\n</li>\n<li><code>inline_script: false</code> &ndash; pass <code>true</code> to escape occurrences of\n <code>&lt;/script</code> in strings\n</li>\n</ul>\n\n</li>\n</ul>\n\n\n</div>\n\n</div>\n\n<div id=\"outline-container-1-4-2\" class=\"outline-4\">\n<h4 id=\"sec-1-4-2\"><span class=\"section-number-4\">1.4.2</span> Beautifier shortcoming &ndash; no more comments </h4>\n<div class=\"outline-text-4\" id=\"text-1-4-2\">\n\n\n<p>\nThe beautifier can be used as a general purpose indentation tool. It's\nuseful when you want to make a minified file readable. One limitation,\nthough, is that it discards all comments, so you don't really want to use it\nto reformat your code, unless you don't have, or don't care about, comments.\n</p>\n<p>\nIn fact it's not the beautifier who discards comments &mdash; they are dumped at\nthe parsing stage, when we build the initial AST. Comments don't really\nmake sense in the AST, and while we could add nodes for them, it would be\ninconvenient because we'd have to add special rules to ignore them at all\nthe processing stages.\n</p>\n</div>\n\n</div>\n\n<div id=\"outline-container-1-4-3\" class=\"outline-4\">\n<h4 id=\"sec-1-4-3\"><span class=\"section-number-4\">1.4.3</span> Use as a code pre-processor </h4>\n<div class=\"outline-text-4\" id=\"text-1-4-3\">\n\n\n<p>\nThe <code>--define</code> option can be used, particularly when combined with the\nconstant folding logic, as a form of pre-processor to enable or remove\nparticular constructions, such as might be used for instrumenting\ndevelopment code, or to produce variations aimed at a specific\nplatform.\n</p>\n<p>\nThe code below illustrates the way this can be done, and how the\nsymbol replacement is performed.\n</p>\n\n\n\n<pre class=\"src src-js\">CLAUSE1: <span class=\"org-keyword\">if</span> (<span class=\"org-keyword\">typeof</span> DEVMODE === <span class=\"org-string\">'undefined'</span>) {\n DEVMODE = <span class=\"org-constant\">true</span>;\n}\n\n<span class=\"org-function-name\">CLAUSE2</span>: <span class=\"org-keyword\">function</span> init() {\n <span class=\"org-keyword\">if</span> (DEVMODE) {\n console.log(<span class=\"org-string\">\"init() called\"</span>);\n }\n ....\n DEVMODE &amp;amp;&amp;amp; console.log(<span class=\"org-string\">\"init() complete\"</span>);\n}\n\n<span class=\"org-function-name\">CLAUSE3</span>: <span class=\"org-keyword\">function</span> reportDeviceStatus(<span class=\"org-variable-name\">device</span>) {\n <span class=\"org-keyword\">var</span> <span class=\"org-variable-name\">DEVMODE</span> = device.mode, <span class=\"org-variable-name\">DEVNAME</span> = device.name;\n <span class=\"org-keyword\">if</span> (DEVMODE === <span class=\"org-string\">'open'</span>) {\n ....\n }\n}\n</pre>\n\n\n<p>\nWhen the above code is normally executed, the undeclared global\nvariable <code>DEVMODE</code> will be assigned the value <b>true</b> (see <code>CLAUSE1</code>)\nand so the <code>init()</code> function (<code>CLAUSE2</code>) will write messages to the\nconsole log when executed, but in <code>CLAUSE3</code> a locally declared\nvariable will mask access to the <code>DEVMODE</code> global symbol.\n</p>\n<p>\nIf the above code is processed by UglifyJS with an argument of\n<code>--define DEVMODE=false</code> then UglifyJS will replace <code>DEVMODE</code> with the\nboolean constant value <b>false</b> within <code>CLAUSE1</code> and <code>CLAUSE2</code>, but it\nwill leave <code>CLAUSE3</code> as it stands because there <code>DEVMODE</code> resolves to\na validly declared variable.\n</p>\n<p>\nAnd more so, the constant-folding features of UglifyJS will recognise\nthat the <code>if</code> condition of <code>CLAUSE1</code> is thus always false, and so will\nremove the test and body of <code>CLAUSE1</code> altogether (including the\notherwise slightly problematical statement <code>false = true;</code> which it\nwill have formed by replacing <code>DEVMODE</code> in the body). Similarly,\nwithin <code>CLAUSE2</code> both calls to <code>console.log()</code> will be removed\naltogether.\n</p>\n<p>\nIn this way you can mimic, to a limited degree, the functionality of\nthe C/C++ pre-processor to enable or completely remove blocks\ndepending on how certain symbols are defined - perhaps using UglifyJS\nto generate different versions of source aimed at different\nenvironments\n</p>\n<p>\nIt is recommmended (but not made mandatory) that symbols designed for\nthis purpose are given names consisting of <code>UPPER_CASE_LETTERS</code> to\ndistinguish them from other (normal) symbols and avoid the sort of\nclash that <code>CLAUSE3</code> above illustrates.\n</p>\n</div>\n</div>\n\n</div>\n\n<div id=\"outline-container-1-5\" class=\"outline-3\">\n<h3 id=\"sec-1-5\"><span class=\"section-number-3\">1.5</span> Compression &ndash; how good is it? </h3>\n<div class=\"outline-text-3\" id=\"text-1-5\">\n\n\n<p>\nHere are updated statistics. (I also updated my Google Closure and YUI\ninstallations).\n</p>\n<p>\nWe're still a lot better than YUI in terms of compression, though slightly\nslower. We're still a lot faster than Closure, and compression after gzip\nis comparable.\n</p>\n<table border=\"2\" cellspacing=\"0\" cellpadding=\"6\" rules=\"groups\" frame=\"hsides\">\n<caption></caption>\n<colgroup><col class=\"left\" /><col class=\"left\" /><col class=\"right\" /><col class=\"left\" /><col class=\"right\" /><col class=\"left\" /><col class=\"right\" />\n</colgroup>\n<thead>\n<tr><th scope=\"col\" class=\"left\">File</th><th scope=\"col\" class=\"left\">UglifyJS</th><th scope=\"col\" class=\"right\">UglifyJS+gzip</th><th scope=\"col\" class=\"left\">Closure</th><th scope=\"col\" class=\"right\">Closure+gzip</th><th scope=\"col\" class=\"left\">YUI</th><th scope=\"col\" class=\"right\">YUI+gzip</th></tr>\n</thead>\n<tbody>\n<tr><td class=\"left\">jquery-1.6.2.js</td><td class=\"left\">91001 (0:01.59)</td><td class=\"right\">31896</td><td class=\"left\">90678 (0:07.40)</td><td class=\"right\">31979</td><td class=\"left\">101527 (0:01.82)</td><td class=\"right\">34646</td></tr>\n<tr><td class=\"left\">paper.js</td><td class=\"left\">142023 (0:01.65)</td><td class=\"right\">43334</td><td class=\"left\">134301 (0:07.42)</td><td class=\"right\">42495</td><td class=\"left\">173383 (0:01.58)</td><td class=\"right\">48785</td></tr>\n<tr><td class=\"left\">prototype.js</td><td class=\"left\">88544 (0:01.09)</td><td class=\"right\">26680</td><td class=\"left\">86955 (0:06.97)</td><td class=\"right\">26326</td><td class=\"left\">92130 (0:00.79)</td><td class=\"right\">28624</td></tr>\n<tr><td class=\"left\">thelib-full.js (DynarchLIB)</td><td class=\"left\">251939 (0:02.55)</td><td class=\"right\">72535</td><td class=\"left\">249911 (0:09.05)</td><td class=\"right\">72696</td><td class=\"left\">258869 (0:01.94)</td><td class=\"right\">76584</td></tr>\n</tbody>\n</table>\n\n\n</div>\n\n</div>\n\n<div id=\"outline-container-1-6\" class=\"outline-3\">\n<h3 id=\"sec-1-6\"><span class=\"section-number-3\">1.6</span> Bugs? </h3>\n<div class=\"outline-text-3\" id=\"text-1-6\">\n\n\n<p>\nUnfortunately, for the time being there is no automated test suite. But I\nran the compressor manually on non-trivial code, and then I tested that the\ngenerated code works as expected. A few hundred times.\n</p>\n<p>\nDynarchLIB was started in times when there was no good JS minifier.\nTherefore I was quite religious about trying to write short code manually,\nand as such DL contains a lot of syntactic hacks<sup><a class=\"footref\" name=\"fnr.1\" href=\"#fn.1\">1</a></sup> such as “foo == bar ? a\n= 10 : b = 20”, though the more readable version would clearly be to use\n“if/else”.\n</p>\n<p>\nSince the parser/compressor runs fine on DL and jQuery, I'm quite confident\nthat it's solid enough for production use. If you can identify any bugs,\nI'd love to hear about them (<a href=\"http://groups.google.com/group/uglifyjs\">use the Google Group</a> or email me directly).\n</p>\n</div>\n\n</div>\n\n<div id=\"outline-container-1-7\" class=\"outline-3\">\n<h3 id=\"sec-1-7\"><span class=\"section-number-3\">1.7</span> Links </h3>\n<div class=\"outline-text-3\" id=\"text-1-7\">\n\n\n<ul>\n<li>Twitter: <a href=\"http://twitter.com/UglifyJS\">@UglifyJS</a>\n</li>\n<li>Project at GitHub: <a href=\"http://github.com/mishoo/UglifyJS\">http://github.com/mishoo/UglifyJS</a>\n</li>\n<li>Google Group: <a href=\"http://groups.google.com/group/uglifyjs\">http://groups.google.com/group/uglifyjs</a>\n</li>\n<li>Common Lisp JS parser: <a href=\"http://marijn.haverbeke.nl/parse-js/\">http://marijn.haverbeke.nl/parse-js/</a>\n</li>\n<li>JS-to-Lisp compiler: <a href=\"http://github.com/marijnh/js\">http://github.com/marijnh/js</a>\n</li>\n<li>Common Lisp JS uglifier: <a href=\"http://github.com/mishoo/cl-uglify-js\">http://github.com/mishoo/cl-uglify-js</a>\n</li>\n</ul>\n\n\n</div>\n\n</div>\n\n<div id=\"outline-container-1-8\" class=\"outline-3\">\n<h3 id=\"sec-1-8\"><span class=\"section-number-3\">1.8</span> License </h3>\n<div class=\"outline-text-3\" id=\"text-1-8\">\n\n\n<p>\nUglifyJS is released under the BSD license:\n</p>\n\n\n\n<pre class=\"example\">Copyright 2010 (c) Mihai Bazon &lt;mihai.bazon@gmail.com&gt;\nBased on parse-js (http://marijn.haverbeke.nl/parse-js/).\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n * Redistributions of source code must retain the above\n copyright notice, this list of conditions and the following\n disclaimer.\n\n * Redistributions in binary form must reproduce the above\n copyright notice, this list of conditions and the following\n disclaimer in the documentation and/or other materials\n provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\nOR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\nPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR\nTORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF\nTHE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGE.\n</pre>\n\n\n<div id=\"footnotes\">\n<h2 class=\"footnotes\">Footnotes: </h2>\n<div id=\"text-footnotes\">\n<p class=\"footnote\"><sup><a class=\"footnum\" name=\"fn.1\" href=\"#fnr.1\">1</a></sup> I even reported a few bugs and suggested some fixes in the original\n <a href=\"http://marijn.haverbeke.nl/parse-js/\">parse-js</a> library, and Marijn pushed fixes literally in minutes.\n</p></div>\n</div>\n</div>\n\n</div>\n</div>\n</div>\n\n<div id=\"postamble\">\n<p class=\"date\">Date: 2011-12-09 14:59:08 EET</p>\n<p class=\"author\">Author: Mihai Bazon</p>\n<p class=\"creator\">Org version 7.7 with Emacs version 23</p>\n<a href=\"http://validator.w3.org/check?uri=referer\">Validate XHTML 1.0</a>\n\n</div>\n</body>\n</html>\n",
+ "_id": "uglify-js@1.2.6",
+ "dist": {
+ "shasum": "cc7a1c548f2cef34d487fe7181bbe9a9536d9613"
+ },
+ "_from": "uglify-js@~1.2.5"
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/package.json~ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/package.json~
new file mode 100644
index 000000000..e4cb23d51
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/package.json~
@@ -0,0 +1,24 @@
+{
+ "name" : "uglify-js",
+
+ "description" : "JavaScript parser and compressor/beautifier toolkit",
+
+ "author" : {
+ "name" : "Mihai Bazon",
+ "email" : "mihai.bazon@gmail.com",
+ "url" : "http://mihai.bazon.net/blog"
+ },
+
+ "version" : "1.2.3",
+
+ "main" : "./uglify-js.js",
+
+ "bin" : {
+ "uglifyjs" : "./bin/uglifyjs"
+ },
+
+ "repository": {
+ "type": "git",
+ "url": "git@github.com:mishoo/UglifyJS.git"
+ }
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/beautify.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/beautify.js
new file mode 100755
index 000000000..f19369e3a
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/beautify.js
@@ -0,0 +1,28 @@
+#! /usr/bin/env node
+
+global.sys = require("sys");
+var fs = require("fs");
+
+var jsp = require("../lib/parse-js");
+var pro = require("../lib/process");
+
+var filename = process.argv[2];
+fs.readFile(filename, "utf8", function(err, text){
+ try {
+ var ast = time_it("parse", function(){ return jsp.parse(text); });
+ ast = time_it("mangle", function(){ return pro.ast_mangle(ast); });
+ ast = time_it("squeeze", function(){ return pro.ast_squeeze(ast); });
+ var gen = time_it("generate", function(){ return pro.gen_code(ast, false); });
+ sys.puts(gen);
+ } catch(ex) {
+ sys.debug(ex.stack);
+ sys.debug(sys.inspect(ex));
+ sys.debug(JSON.stringify(ex));
+ }
+});
+
+function time_it(name, cont) {
+ var t1 = new Date().getTime();
+ try { return cont(); }
+ finally { sys.debug("// " + name + ": " + ((new Date().getTime() - t1) / 1000).toFixed(3) + " sec."); }
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/testparser.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/testparser.js
new file mode 100755
index 000000000..02c19a9c9
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/testparser.js
@@ -0,0 +1,403 @@
+#! /usr/bin/env node
+
+var parseJS = require("../lib/parse-js");
+var sys = require("sys");
+
+// write debug in a very straightforward manner
+var debug = function(){
+ sys.log(Array.prototype.slice.call(arguments).join(', '));
+};
+
+ParserTestSuite(function(i, input, desc){
+ try {
+ parseJS.parse(input);
+ debug("ok " + i + ": " + desc);
+ } catch(e){
+ debug("FAIL " + i + " " + desc + " (" + e + ")");
+ }
+});
+
+function ParserTestSuite(callback){
+ var inps = [
+ ["var abc;", "Regular variable statement w/o assignment"],
+ ["var abc = 5;", "Regular variable statement with assignment"],
+ ["/* */;", "Multiline comment"],
+ ['/** **/;', 'Double star multiline comment'],
+ ["var f = function(){;};", "Function expression in var assignment"],
+ ['hi; // moo\n;', 'single line comment'],
+ ['var varwithfunction;', 'Dont match keywords as substrings'], // difference between `var withsomevar` and `"str"` (local search and lits)
+ ['a + b;', 'addition'],
+ ["'a';", 'single string literal'],
+ ["'a\\n';", 'single string literal with escaped return'],
+ ['"a";', 'double string literal'],
+ ['"a\\n";', 'double string literal with escaped return'],
+ ['"var";', 'string is a keyword'],
+ ['"variable";', 'string starts with a keyword'],
+ ['"somevariable";', 'string contains a keyword'],
+ ['"somevar";', 'string ends with a keyword'],
+ ['500;', 'int literal'],
+ ['500.;', 'float literal w/o decimals'],
+ ['500.432;', 'float literal with decimals'],
+ ['.432432;', 'float literal w/o int'],
+ ['(a,b,c);', 'parens and comma'],
+ ['[1,2,abc];', 'array literal'],
+ ['var o = {a:1};', 'object literal unquoted key'],
+ ['var o = {"b":2};', 'object literal quoted key'], // opening curly may not be at the start of a statement...
+ ['var o = {c:c};', 'object literal keyname is identifier'],
+ ['var o = {a:1,"b":2,c:c};', 'object literal combinations'],
+ ['var x;\nvar y;', 'two lines'],
+ ['var x;\nfunction n(){; }', 'function def'],
+ ['var x;\nfunction n(abc){; }', 'function def with arg'],
+ ['var x;\nfunction n(abc, def){ ;}', 'function def with args'],
+ ['function n(){ "hello"; }', 'function def with body'],
+ ['/a/;', 'regex literal'],
+ ['/a/b;', 'regex literal with flag'],
+ ['/a/ / /b/;', 'regex div regex'],
+ ['a/b/c;', 'triple division looks like regex'],
+ ['+function(){/regex/;};', 'regex at start of function body'],
+ // http://code.google.com/p/es-lab/source/browse/trunk/tests/parser/parsertests.js?r=86
+ // http://code.google.com/p/es-lab/source/browse/trunk/tests/parser/parsertests.js?r=430
+
+ // first tests for the lexer, should also parse as program (when you append a semi)
+
+ // comments
+ ['//foo!@#^&$1234\nbar;', 'single line comment'],
+ ['/* abcd!@#@$* { } && null*/;', 'single line multi line comment'],
+ ['/*foo\nbar*/;','multi line comment'],
+ ['/*x*x*/;','multi line comment with *'],
+ ['/**/;','empty comment'],
+ // identifiers
+ ["x;",'1 identifier'],
+ ["_x;",'2 identifier'],
+ ["xyz;",'3 identifier'],
+ ["$x;",'4 identifier'],
+ ["x$;",'5 identifier'],
+ ["_;",'6 identifier'],
+ ["x5;",'7 identifier'],
+ ["x_y;",'8 identifier'],
+ ["x+5;",'9 identifier'],
+ ["xyz123;",'10 identifier'],
+ ["x1y1z1;",'11 identifier'],
+ ["foo\\u00D8bar;",'12 identifier unicode escape'],
+ //["foo�bar;",'13 identifier unicode embedded (might fail)'],
+ // numbers
+ ["5;", '1 number'],
+ ["5.5;", '2 number'],
+ ["0;", '3 number'],
+ ["0.0;", '4 number'],
+ ["0.001;", '5 number'],
+ ["1.e2;", '6 number'],
+ ["1.e-2;", '7 number'],
+ ["1.E2;", '8 number'],
+ ["1.E-2;", '9 number'],
+ [".5;", '10 number'],
+ [".5e3;", '11 number'],
+ [".5e-3;", '12 number'],
+ ["0.5e3;", '13 number'],
+ ["55;", '14 number'],
+ ["123;", '15 number'],
+ ["55.55;", '16 number'],
+ ["55.55e10;", '17 number'],
+ ["123.456;", '18 number'],
+ ["1+e;", '20 number'],
+ ["0x01;", '22 number'],
+ ["0XCAFE;", '23 number'],
+ ["0x12345678;", '24 number'],
+ ["0x1234ABCD;", '25 number'],
+ ["0x0001;", '26 number'],
+ // strings
+ ["\"foo\";", '1 string'],
+ ["\'foo\';", '2 string'],
+ ["\"x\";", '3 string'],
+ ["\'\';", '4 string'],
+ ["\"foo\\tbar\";", '5 string'],
+ ["\"!@#$%^&*()_+{}[]\";", '6 string'],
+ ["\"/*test*/\";", '7 string'],
+ ["\"//test\";", '8 string'],
+ ["\"\\\\\";", '9 string'],
+ ["\"\\u0001\";", '10 string'],
+ ["\"\\uFEFF\";", '11 string'],
+ ["\"\\u10002\";", '12 string'],
+ ["\"\\x55\";", '13 string'],
+ ["\"\\x55a\";", '14 string'],
+ ["\"a\\\\nb\";", '15 string'],
+ ['";"', '16 string: semi in a string'],
+ ['"a\\\nb";', '17 string: line terminator escape'],
+ // literals
+ ["null;", "null"],
+ ["true;", "true"],
+ ["false;", "false"],
+ // regex
+ ["/a/;", "1 regex"],
+ ["/abc/;", "2 regex"],
+ ["/abc[a-z]*def/g;", "3 regex"],
+ ["/\\b/;", "4 regex"],
+ ["/[a-zA-Z]/;", "5 regex"],
+
+ // program tests (for as far as they havent been covered above)
+
+ // regexp
+ ["/foo(.*)/g;", "another regexp"],
+ // arrays
+ ["[];", "1 array"],
+ ["[ ];", "2 array"],
+ ["[1];", "3 array"],
+ ["[1,2];", "4 array"],
+ ["[1,2,,];", "5 array"],
+ ["[1,2,3];", "6 array"],
+ ["[1,2,3,,,];", "7 array"],
+ // objects
+ ["{};", "1 object"],
+ ["({x:5});", "2 object"],
+ ["({x:5,y:6});", "3 object"],
+ ["({x:5,});", "4 object"],
+ ["({if:5});", "5 object"],
+ ["({ get x() {42;} });", "6 object"],
+ ["({ set y(a) {1;} });", "7 object"],
+ // member expression
+ ["o.m;", "1 member expression"],
+ ["o['m'];", "2 member expression"],
+ ["o['n']['m'];", "3 member expression"],
+ ["o.n.m;", "4 member expression"],
+ ["o.if;", "5 member expression"],
+ // call and invoke expressions
+ ["f();", "1 call/invoke expression"],
+ ["f(x);", "2 call/invoke expression"],
+ ["f(x,y);", "3 call/invoke expression"],
+ ["o.m();", "4 call/invoke expression"],
+ ["o['m'];", "5 call/invoke expression"],
+ ["o.m(x);", "6 call/invoke expression"],
+ ["o['m'](x);", "7 call/invoke expression"],
+ ["o.m(x,y);", "8 call/invoke expression"],
+ ["o['m'](x,y);", "9 call/invoke expression"],
+ ["f(x)(y);", "10 call/invoke expression"],
+ ["f().x;", "11 call/invoke expression"],
+
+ // eval
+ ["eval('x');", "1 eval"],
+ ["(eval)('x');", "2 eval"],
+ ["(1,eval)('x');", "3 eval"],
+ ["eval(x,y);", "4 eval"],
+ // new expression
+ ["new f();", "1 new expression"],
+ ["new o;", "2 new expression"],
+ ["new o.m;", "3 new expression"],
+ ["new o.m(x);", "4 new expression"],
+ ["new o.m(x,y);", "5 new expression"],
+ // prefix/postfix
+ ["++x;", "1 pre/postfix"],
+ ["x++;", "2 pre/postfix"],
+ ["--x;", "3 pre/postfix"],
+ ["x--;", "4 pre/postfix"],
+ ["x ++;", "5 pre/postfix"],
+ ["x /* comment */ ++;", "6 pre/postfix"],
+ ["++ /* comment */ x;", "7 pre/postfix"],
+ // unary operators
+ ["delete x;", "1 unary operator"],
+ ["void x;", "2 unary operator"],
+ ["+ x;", "3 unary operator"],
+ ["-x;", "4 unary operator"],
+ ["~x;", "5 unary operator"],
+ ["!x;", "6 unary operator"],
+ // meh
+ ["new Date++;", "new date ++"],
+ ["+x++;", " + x ++"],
+ // expression expressions
+ ["1 * 2;", "1 expression expressions"],
+ ["1 / 2;", "2 expression expressions"],
+ ["1 % 2;", "3 expression expressions"],
+ ["1 + 2;", "4 expression expressions"],
+ ["1 - 2;", "5 expression expressions"],
+ ["1 << 2;", "6 expression expressions"],
+ ["1 >>> 2;", "7 expression expressions"],
+ ["1 >> 2;", "8 expression expressions"],
+ ["1 * 2 + 3;", "9 expression expressions"],
+ ["(1+2)*3;", "10 expression expressions"],
+ ["1*(2+3);", "11 expression expressions"],
+ ["x<y;", "12 expression expressions"],
+ ["x>y;", "13 expression expressions"],
+ ["x<=y;", "14 expression expressions"],
+ ["x>=y;", "15 expression expressions"],
+ ["x instanceof y;", "16 expression expressions"],
+ ["x in y;", "17 expression expressions"],
+ ["x&y;", "18 expression expressions"],
+ ["x^y;", "19 expression expressions"],
+ ["x|y;", "20 expression expressions"],
+ ["x+y<z;", "21 expression expressions"],
+ ["x<y+z;", "22 expression expressions"],
+ ["x+y+z;", "23 expression expressions"],
+ ["x+y<z;", "24 expression expressions"],
+ ["x<y+z;", "25 expression expressions"],
+ ["x&y|z;", "26 expression expressions"],
+ ["x&&y;", "27 expression expressions"],
+ ["x||y;", "28 expression expressions"],
+ ["x&&y||z;", "29 expression expressions"],
+ ["x||y&&z;", "30 expression expressions"],
+ ["x<y?z:w;", "31 expression expressions"],
+ // assignment
+ ["x >>>= y;", "1 assignment"],
+ ["x <<= y;", "2 assignment"],
+ ["x = y;", "3 assignment"],
+ ["x += y;", "4 assignment"],
+ ["x /= y;", "5 assignment"],
+ // comma
+ ["x, y;", "comma"],
+ // block
+ ["{};", "1 block"],
+ ["{x;};", "2 block"],
+ ["{x;y;};", "3 block"],
+ // vars
+ ["var x;", "1 var"],
+ ["var x,y;", "2 var"],
+ ["var x=1,y=2;", "3 var"],
+ ["var x,y=2;", "4 var"],
+ // empty
+ [";", "1 empty"],
+ ["\n;", "2 empty"],
+ // expression statement
+ ["x;", "1 expression statement"],
+ ["5;", "2 expression statement"],
+ ["1+2;", "3 expression statement"],
+ // if
+ ["if (c) x; else y;", "1 if statement"],
+ ["if (c) x;", "2 if statement"],
+ ["if (c) {} else {};", "3 if statement"],
+ ["if (c1) if (c2) s1; else s2;", "4 if statement"],
+ // while
+ ["do s; while (e);", "1 while statement"],
+ ["do { s; } while (e);", "2 while statement"],
+ ["while (e) s;", "3 while statement"],
+ ["while (e) { s; };", "4 while statement"],
+ // for
+ ["for (;;) ;", "1 for statement"],
+ ["for (;c;x++) x;", "2 for statement"],
+ ["for (i;i<len;++i){};", "3 for statement"],
+ ["for (var i=0;i<len;++i) {};", "4 for statement"],
+ ["for (var i=0,j=0;;){};", "5 for statement"],
+ //["for (x in b; c; u) {};", "6 for statement"],
+ ["for ((x in b); c; u) {};", "7 for statement"],
+ ["for (x in a);", "8 for statement"],
+ ["for (var x in a){};", "9 for statement"],
+ ["for (var x=5 in a) {};", "10 for statement"],
+ ["for (var x = a in b in c) {};", "11 for statement"],
+ ["for (var x=function(){a+b;}; a<b; ++i) some;", "11 for statement, testing for parsingForHeader reset with the function"],
+ ["for (var x=function(){for (x=0; x<15; ++x) alert(foo); }; a<b; ++i) some;", "11 for statement, testing for parsingForHeader reset with the function"],
+ // flow statements
+ ["while(1){ continue; }", "1 flow statement"],
+ ["label: while(1){ continue label; }", "2 flow statement"],
+ ["while(1){ break; }", "3 flow statement"],
+ ["somewhere: while(1){ break somewhere; }", "4 flow statement"],
+ ["while(1){ continue /* comment */ ; }", "5 flow statement"],
+ ["while(1){ continue \n; }", "6 flow statement"],
+ ["(function(){ return; })()", "7 flow statement"],
+ ["(function(){ return 0; })()", "8 flow statement"],
+ ["(function(){ return 0 + \n 1; })()", "9 flow statement"],
+ // with
+ ["with (e) s;", "with statement"],
+ // switch
+ ["switch (e) { case x: s; };", "1 switch statement"],
+ ["switch (e) { case x: s1;s2; default: s3; case y: s4; };", "2 switch statement"],
+ ["switch (e) { default: s1; case x: s2; case y: s3; };", "3 switch statement"],
+ ["switch (e) { default: s; };", "4 switch statement"],
+ ["switch (e) { case x: s1; case y: s2; };", "5 switch statement"],
+ // labels
+ ["foo : x;", " flow statement"],
+ // throw
+ ["throw x;", "1 throw statement"],
+ ["throw x\n;", "2 throw statement"],
+ // try catch finally
+ ["try { s1; } catch (e) { s2; };", "1 trycatchfinally statement"],
+ ["try { s1; } finally { s2; };", "2 trycatchfinally statement"],
+ ["try { s1; } catch (e) { s2; } finally { s3; };", "3 trycatchfinally statement"],
+ // debugger
+ ["debugger;", "debuger statement"],
+ // function decl
+ ["function f(x) { e; return x; };", "1 function declaration"],
+ ["function f() { x; y; };", "2 function declaration"],
+ ["function f(x,y) { var z; return x; };", "3 function declaration"],
+ // function exp
+ ["(function f(x) { return x; });", "1 function expression"],
+ ["(function empty() {;});", "2 function expression"],
+ ["(function empty() {;});", "3 function expression"],
+ ["(function (x) {; });", "4 function expression"],
+ // program
+ ["var x; function f(){;}; null;", "1 program"],
+ [";;", "2 program"],
+ ["{ x; y; z; }", "3 program"],
+ ["function f(){ function g(){;}};", "4 program"],
+ ["x;\n/*foo*/\n ;", "5 program"],
+
+ // asi
+ ["foo: while(1){ continue \n foo; }", "1 asi"],
+ ["foo: while(1){ break \n foo; }", "2 asi"],
+ ["(function(){ return\nfoo; })()", "3 asi"],
+ ["var x; { 1 \n 2 } 3", "4 asi"],
+ ["ab /* hi */\ncd", "5 asi"],
+ ["ab/*\n*/cd", "6 asi (multi line multilinecomment counts as eol)"],
+ ["foo: while(1){ continue /* wtf \n busta */ foo; }", "7 asi illegal with multi line comment"],
+ ["function f() { s }", "8 asi"],
+ ["function f() { return }", "9 asi"],
+
+ // use strict
+ // XXX: some of these should actually fail?
+ // no support for "use strict" yet...
+ ['"use strict"; \'bla\'\n; foo;', "1 directive"],
+ ['(function() { "use strict"; \'bla\';\n foo; });', "2 directive"],
+ ['"use\\n strict";', "3 directive"],
+ ['foo; "use strict";', "4 directive"],
+
+ // tests from http://es5conform.codeplex.com/
+
+ ['"use strict"; var o = { eval: 42};', "8.7.2-3-1-s: the use of eval as property name is allowed"],
+ ['({foo:0,foo:1});', 'Duplicate property name allowed in not strict mode'],
+ ['function foo(a,a){}', 'Duplicate parameter name allowed in not strict mode'],
+ ['(function foo(eval){})', 'Eval allowed as parameter name in non strict mode'],
+ ['(function foo(arguments){})', 'Arguments allowed as parameter name in non strict mode'],
+
+ // empty programs
+
+ ['', '1 Empty program'],
+ ['// test', '2 Empty program'],
+ ['//test\n', '3 Empty program'],
+ ['\n// test', '4 Empty program'],
+ ['\n// test\n', '5 Empty program'],
+ ['/* */', '6 Empty program'],
+ ['/*\ns,fd\n*/', '7 Empty program'],
+ ['/*\ns,fd\n*/\n', '8 Empty program'],
+ [' ', '9 Empty program'],
+ [' /*\nsmeh*/ \n ', '10 Empty program'],
+
+ // trailing whitespace
+
+ ['a ', '1 Trailing whitespace'],
+ ['a /* something */', '2 Trailing whitespace'],
+ ['a\n // hah', '3 Trailing whitespace'],
+ ['/abc/de//f', '4 Trailing whitespace'],
+ ['/abc/de/*f*/\n ', '5 Trailing whitespace'],
+
+ // things the parser tripped over at one point or the other (prevents regression bugs)
+ ['for (x;function(){ a\nb };z) x;', 'for header with function body forcing ASI'],
+ ['c=function(){return;return};', 'resetting noAsi after literal'],
+ ['d\nd()', 'asi exception causing token overflow'],
+ ['for(;;){x=function(){}}', 'function expression in a for header'],
+ ['for(var k;;){}', 'parser failing due to ASI accepting the incorrect "for" rule'],
+ ['({get foo(){ }})', 'getter with empty function body'],
+ ['\nreturnr', 'eol causes return statement to ignore local search requirement'],
+ [' / /', '1 whitespace before regex causes regex to fail?'],
+ ['/ // / /', '2 whitespace before regex causes regex to fail?'],
+ ['/ / / / /', '3 whitespace before regex causes regex to fail?'],
+
+ ['\n\t// Used for trimming whitespace\n\ttrimLeft = /^\\s+/;\n\ttrimRight = /\\s+$/;\t\n','turned out this didnt crash (the test below did), but whatever.'],
+ ['/[\\/]/;', 'escaped forward slash inside class group (would choke on fwd slash)'],
+ ['/[/]/;', 'also broke but is valid in es5 (not es3)'],
+ ['({get:5});','get property name thats not a getter'],
+ ['({set:5});','set property name thats not a setter'],
+ ['l !== "px" && (d.style(h, c, (k || 1) + l), j = (k || 1) / f.cur() * j, d.style(h, c, j + l)), i[1] && (k = (i[1] === "-=" ? -1 : 1) * k + j), f.custom(j, k, l)', 'this choked regex/div at some point'],
+ ['(/\'/g, \'\\\\\\\'\') + "\'";', 'the sequence of escaped characters confused the tokenizer'],
+ ['if (true) /=a/.test("a");', 'regexp starting with "=" in not obvious context (not implied by preceding token)']
+ ];
+
+ for (var i=0; i<inps.length; ++i) {
+ callback(i, inps[i][0], inps[i][1]);
+ };
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/array1.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/array1.js
new file mode 100644
index 000000000..7b09176af
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/array1.js
@@ -0,0 +1 @@
+[],Array(1),[1,2,3]
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/array2.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/array2.js
new file mode 100644
index 000000000..05eba1907
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/array2.js
@@ -0,0 +1 @@
+(function(){var a=function(){};return new a(1,2,3,4)})()
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/array3.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/array3.js
new file mode 100644
index 000000000..82f4f4db2
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/array3.js
@@ -0,0 +1 @@
+(function(){function a(){}return new a(1,2,3,4)})()
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/array4.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/array4.js
new file mode 100644
index 000000000..4b7b0f187
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/array4.js
@@ -0,0 +1 @@
+(function(){function a(){}(function(){return new a(1,2,3)})()})()
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/assignment.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/assignment.js
new file mode 100644
index 000000000..ab626d3b3
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/assignment.js
@@ -0,0 +1 @@
+a=1,b=a,c=1,d=b,e=d,longname=2;if(longname+1){x=3;if(x)var z=7}z=1,y=1,x=1,g+=1,h=g,++i,j=i,i++,j=i+17 \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/concatstring.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/concatstring.js
new file mode 100644
index 000000000..3a4ee10b3
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/concatstring.js
@@ -0,0 +1 @@
+var a=a+"a"+"b"+1+c,b=a+"c"+"ds"+123+c,c=a+"c"+123+d+"ds"+c \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/const.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/const.js
new file mode 100644
index 000000000..cef74d7c8
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/const.js
@@ -0,0 +1 @@
+var a=13,b=1/3 \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/empty-blocks.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/empty-blocks.js
new file mode 100644
index 000000000..c5836bd31
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/empty-blocks.js
@@ -0,0 +1 @@
+function bar(){return--x}function foo(){while(bar());}function mak(){for(;;);}var x=5
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/forstatement.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/forstatement.js
new file mode 100644
index 000000000..fc474117c
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/forstatement.js
@@ -0,0 +1 @@
+a=func(),b=z;for(a++;i<10;i++)alert(i);var z=1;g=2;for(;i<10;i++)alert(i);var a=2;for(var i=1;i<10;i++)alert(i) \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/if.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/if.js
new file mode 100644
index 000000000..236993c73
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/if.js
@@ -0,0 +1 @@
+var a=1;a==1?a=2:a=17 \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/ifreturn.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/ifreturn.js
new file mode 100644
index 000000000..c5c32dd7f
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/ifreturn.js
@@ -0,0 +1 @@
+function a(a){return a==1?2:17} \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/ifreturn2.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/ifreturn2.js
new file mode 100644
index 000000000..d6ea94062
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/ifreturn2.js
@@ -0,0 +1 @@
+function x(a){return typeof a=="object"?a:a===42?0:a*2}function y(a){return typeof a=="object"?a:null}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue10.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue10.js
new file mode 100644
index 000000000..1de52aff2
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue10.js
@@ -0,0 +1 @@
+function f(){var a;return(a="a")?a:a}f() \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue11.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue11.js
new file mode 100644
index 000000000..876bd0a20
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue11.js
@@ -0,0 +1 @@
+new(A,B),new(A||B),new(X?A:B) \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue13.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue13.js
new file mode 100644
index 000000000..295ee69f2
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue13.js
@@ -0,0 +1 @@
+var a=/^(?:(\w+):)?(?:\/\/(?:(?:([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#])(?::(\d))?)?(..?$|(?:[^?#\/]\/))([^?#]*)(?:\?([^#]))?(?:#(.))?/ \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue14.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue14.js
new file mode 100644
index 000000000..1ca8eef03
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue14.js
@@ -0,0 +1 @@
+var a={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue16.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue16.js
new file mode 100644
index 000000000..20948288b
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue16.js
@@ -0,0 +1 @@
+var a=3250441966 \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue17.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue17.js
new file mode 100644
index 000000000..339bce4aa
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue17.js
@@ -0,0 +1 @@
+var a=function(b){b(),a()} \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue20.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue20.js
new file mode 100644
index 000000000..d00491fd7
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue20.js
@@ -0,0 +1 @@
+1
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue21.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue21.js
new file mode 100644
index 000000000..fa83bdc62
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue21.js
@@ -0,0 +1 @@
+var a=0;switch(a){case 0:a++} \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue25.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue25.js
new file mode 100644
index 000000000..49deed699
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue25.js
@@ -0,0 +1 @@
+a:break a;console.log(1)
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue27.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue27.js
new file mode 100644
index 000000000..b1154d179
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue27.js
@@ -0,0 +1 @@
+(a?b:c)?d:e \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue278.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue278.js
new file mode 100644
index 000000000..e09bc7ff6
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue278.js
@@ -0,0 +1 @@
+if(!x)debugger
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue28.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue28.js
new file mode 100644
index 000000000..5c0c914a4
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue28.js
@@ -0,0 +1 @@
+o={".5":.5},o={.5:.5},o={.5:.5} \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue29.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue29.js
new file mode 100644
index 000000000..eaaa1cba6
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue29.js
@@ -0,0 +1 @@
+result=function(){return 1}() \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue30.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue30.js
new file mode 100644
index 000000000..27610b590
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue30.js
@@ -0,0 +1 @@
+var a=8,b=4,c=4 \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue34.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue34.js
new file mode 100644
index 000000000..a9dd7d420
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue34.js
@@ -0,0 +1 @@
+var a={};a["this"]=1,a.that=2 \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue4.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue4.js
new file mode 100644
index 000000000..1fee33deb
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue4.js
@@ -0,0 +1 @@
+var a=2e3,b=.002,c=2e-5 \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue48.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue48.js
new file mode 100644
index 000000000..5e8abcdeb
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue48.js
@@ -0,0 +1 @@
+var s,i;s="",i=0 \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue50.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue50.js
new file mode 100644
index 000000000..1974186fb
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue50.js
@@ -0,0 +1 @@
+function bar(a){try{foo()}catch(b){alert("Exception caught (foo not defined)")}alert(a)}bar(10)
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue53.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue53.js
new file mode 100644
index 000000000..cd42c051c
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue53.js
@@ -0,0 +1 @@
+x=(y,z)
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue54.1.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue54.1.js
new file mode 100644
index 000000000..ef067943d
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue54.1.js
@@ -0,0 +1 @@
+foo+"",a.toString(16),b.toString.call(c)
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue68.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue68.js
new file mode 100644
index 000000000..4ec46c8bc
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue68.js
@@ -0,0 +1 @@
+function f(){function b(){}if(a)return;b()}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue69.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue69.js
new file mode 100644
index 000000000..d25ecd671
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue69.js
@@ -0,0 +1 @@
+[(a,b)]
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue9.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue9.js
new file mode 100644
index 000000000..db8d48c5b
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/issue9.js
@@ -0,0 +1 @@
+var a={a:1,b:2} \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/mangle.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/mangle.js
new file mode 100644
index 000000000..6226e8ae4
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/mangle.js
@@ -0,0 +1 @@
+(function(){var a=function b(a,b,c){return b}})()
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/null_string.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/null_string.js
new file mode 100644
index 000000000..04145301b
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/null_string.js
@@ -0,0 +1 @@
+var nullString="\0" \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/strict-equals.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/strict-equals.js
new file mode 100644
index 000000000..0b7375b75
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/strict-equals.js
@@ -0,0 +1 @@
+typeof a=="string",b+""!=c+"",d<e==f<g \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/var.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/var.js
new file mode 100644
index 000000000..01091cff7
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/var.js
@@ -0,0 +1 @@
+var a=1,b=2 \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/whitespace.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/whitespace.js
new file mode 100644
index 000000000..8ffc8ff42
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/whitespace.js
@@ -0,0 +1 @@
+function id(a){return a}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/with.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/with.js
new file mode 100644
index 000000000..c5b0b164a
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/expected/with.js
@@ -0,0 +1 @@
+with({});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/array1.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/array1.js
new file mode 100644
index 000000000..ae0851dd8
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/array1.js
@@ -0,0 +1,3 @@
+new Array();
+new Array(1);
+new Array(1, 2, 3);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/array2.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/array2.js
new file mode 100644
index 000000000..74226dfa2
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/array2.js
@@ -0,0 +1,4 @@
+(function(){
+ var Array = function(){};
+ return new Array(1, 2, 3, 4);
+})();
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/array3.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/array3.js
new file mode 100644
index 000000000..6cc974291
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/array3.js
@@ -0,0 +1,4 @@
+(function(){
+ return new Array(1, 2, 3, 4);
+ function Array() {};
+})();
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/array4.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/array4.js
new file mode 100644
index 000000000..73928618c
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/array4.js
@@ -0,0 +1,6 @@
+(function(){
+ (function(){
+ return new Array(1, 2, 3);
+ })();
+ function Array(){};
+})();
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/assignment.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/assignment.js
new file mode 100644
index 000000000..4e00389cb
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/assignment.js
@@ -0,0 +1,20 @@
+a=1;
+b=a;
+c=1;
+d=b;
+e=d;
+longname=2;
+if (longname+1) {
+ x=3;
+ if (x) var z = 7;
+}
+z=1,y=1,x=1
+
+g+=1;
+h=g;
+
+++i;
+j=i;
+
+i++;
+j=i+17; \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/concatstring.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/concatstring.js
new file mode 100644
index 000000000..a4a003787
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/concatstring.js
@@ -0,0 +1,3 @@
+var a = a + "a" + "b" + 1 + c;
+var b = a + "c" + "ds" + 123 + c;
+var c = a + "c" + 123 + d + "ds" + c; \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/const.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/const.js
new file mode 100644
index 000000000..f2c62e933
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/const.js
@@ -0,0 +1,5 @@
+// test that the calculation is fold to 13
+var a = 1 + 2 * 6;
+
+// test that it isn't replaced with 0.3333 because that is more characters
+var b = 1/3; \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/empty-blocks.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/empty-blocks.js
new file mode 100644
index 000000000..2d679c104
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/empty-blocks.js
@@ -0,0 +1,4 @@
+var x = 5;
+function bar() { return --x; }
+function foo() { while (bar()); }
+function mak() { for(;;); }
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/forstatement.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/forstatement.js
new file mode 100644
index 000000000..d2a14f952
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/forstatement.js
@@ -0,0 +1,10 @@
+a=func();
+b=z;
+for (a++; i < 10; i++) { alert(i); }
+
+var z=1;
+g=2;
+for (; i < 10; i++) { alert(i); }
+
+var a = 2;
+for (var i = 1; i < 10; i++) { alert(i); }
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/if.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/if.js
new file mode 100644
index 000000000..a54e76220
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/if.js
@@ -0,0 +1,6 @@
+var a = 1;
+if (a == 1) {
+ a = 2;
+} else {
+ a = 17;
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/ifreturn.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/ifreturn.js
new file mode 100644
index 000000000..1332c9366
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/ifreturn.js
@@ -0,0 +1,9 @@
+function a(b) {
+ if (b == 1) {
+ return 2;
+ } else {
+ return 17;
+ }
+
+ return 3;
+} \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/ifreturn2.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/ifreturn2.js
new file mode 100644
index 000000000..5d763ea36
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/ifreturn2.js
@@ -0,0 +1,16 @@
+function x(a) {
+ if (typeof a === 'object')
+ return a;
+
+ if (a === 42)
+ return 0;
+
+ return a * 2;
+}
+
+function y(a) {
+ if (typeof a === 'object')
+ return a;
+
+ return null;
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue10.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue10.js
new file mode 100644
index 000000000..20adcaa0c
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue10.js
@@ -0,0 +1 @@
+function f() { var a; if (a = 'a') { return a; } else { return a; } }; f(); \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue11.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue11.js
new file mode 100644
index 000000000..f4dbf1f91
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue11.js
@@ -0,0 +1,3 @@
+new (A, B)
+new (A || B)
+new (X ? A : B) \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue13.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue13.js
new file mode 100644
index 000000000..4328a20a0
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue13.js
@@ -0,0 +1 @@
+var a = /^(?:(\w+):)?(?:\/\/(?:(?:([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#])(?::(\d))?)?(..?$|(?:[^?#\/]\/))([^?#]*)(?:\?([^#]))?(?:#(.))?/; \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue14.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue14.js
new file mode 100644
index 000000000..70c26afaf
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue14.js
@@ -0,0 +1 @@
+var a = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'}; \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue16.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue16.js
new file mode 100644
index 000000000..53b857b93
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue16.js
@@ -0,0 +1 @@
+var a = 0xC1BDCEEE; \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue17.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue17.js
new file mode 100644
index 000000000..2dfab5550
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue17.js
@@ -0,0 +1,4 @@
+var a = function(b) {
+ b();
+ a()
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue20.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue20.js
new file mode 100644
index 000000000..5a9dde54b
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue20.js
@@ -0,0 +1 @@
+{a: 1} \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue21.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue21.js
new file mode 100644
index 000000000..30d1e1d58
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue21.js
@@ -0,0 +1,6 @@
+var a = 0;
+switch(a) {
+ case 0:
+ a++;
+ break;
+} \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue25.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue25.js
new file mode 100644
index 000000000..9ca921dbe
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue25.js
@@ -0,0 +1,7 @@
+label1 : {
+ label2 : {
+ break label2;
+ console.log(2);
+ }
+ console.log(1);
+} \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue27.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue27.js
new file mode 100644
index 000000000..89394db0f
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue27.js
@@ -0,0 +1 @@
+(a ? b : c) ? d : e \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue278.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue278.js
new file mode 100644
index 000000000..f6ce96ee1
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue278.js
@@ -0,0 +1 @@
+if (!x) debugger;
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue28.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue28.js
new file mode 100644
index 000000000..7188e2798
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue28.js
@@ -0,0 +1,3 @@
+o = {'.5':.5}
+o = {'0.5':.5}
+o = {0.5:.5} \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue29.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue29.js
new file mode 100644
index 000000000..f07cf4da3
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue29.js
@@ -0,0 +1 @@
+result=(function(){ return 1;})() \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue30.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue30.js
new file mode 100644
index 000000000..4e634e2dd
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue30.js
@@ -0,0 +1,3 @@
+var a = 1 << 3;
+var b = 8 >> 1;
+var c = 8 >>> 1; \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue34.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue34.js
new file mode 100644
index 000000000..022f7a31b
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue34.js
@@ -0,0 +1,3 @@
+var a = {};
+a["this"] = 1;
+a["that"] = 2; \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue4.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue4.js
new file mode 100644
index 000000000..0b7610379
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue4.js
@@ -0,0 +1,3 @@
+var a = 2e3;
+var b = 2e-3;
+var c = 2e-5; \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue48.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue48.js
new file mode 100644
index 000000000..031e85b39
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue48.js
@@ -0,0 +1 @@
+var s, i; s = ''; i = 0; \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue50.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue50.js
new file mode 100644
index 000000000..060f9df82
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue50.js
@@ -0,0 +1,9 @@
+function bar(a) {
+ try {
+ foo();
+ } catch(e) {
+ alert("Exception caught (foo not defined)");
+ }
+ alert(a); // 10 in FF, "[object Error]" in IE
+}
+bar(10);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue53.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue53.js
new file mode 100644
index 000000000..4f8b32f11
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue53.js
@@ -0,0 +1 @@
+x = (y, z)
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue54.1.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue54.1.js
new file mode 100644
index 000000000..967052e85
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue54.1.js
@@ -0,0 +1,3 @@
+foo.toString();
+a.toString(16);
+b.toString.call(c);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue68.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue68.js
new file mode 100644
index 000000000..14054d01e
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue68.js
@@ -0,0 +1,5 @@
+function f() {
+ if (a) return;
+ g();
+ function g(){}
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue69.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue69.js
new file mode 100644
index 000000000..d25ecd671
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue69.js
@@ -0,0 +1 @@
+[(a,b)]
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue9.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue9.js
new file mode 100644
index 000000000..61588614b
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/issue9.js
@@ -0,0 +1,4 @@
+var a = {
+ a: 1,
+ b: 2, // <-- trailing comma
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/mangle.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/mangle.js
new file mode 100644
index 000000000..c271a26dc
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/mangle.js
@@ -0,0 +1,5 @@
+(function() {
+ var x = function fun(a, fun, b) {
+ return fun;
+ };
+}());
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/null_string.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/null_string.js
new file mode 100644
index 000000000..a675b1c5c
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/null_string.js
@@ -0,0 +1 @@
+var nullString = "\0" \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/strict-equals.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/strict-equals.js
new file mode 100644
index 000000000..b631f4c35
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/strict-equals.js
@@ -0,0 +1,3 @@
+typeof a === 'string'
+b + "" !== c + ""
+d < e === f < g
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/var.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/var.js
new file mode 100644
index 000000000..609a35d2a
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/var.js
@@ -0,0 +1,3 @@
+// var declarations after each other should be combined
+var a = 1;
+var b = 2; \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/whitespace.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/whitespace.js
new file mode 100644
index 000000000..6a15c464f
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/whitespace.js
@@ -0,0 +1,21 @@
+function id(a) {
+ // Form-Feed
+ // Vertical Tab
+ // No-Break Space
+ ᠎// Mongolian Vowel Separator
+  // En quad
+  // Em quad
+  // En space
+  // Em space
+  // Three-Per-Em Space
+  // Four-Per-Em Space
+  // Six-Per-Em Space
+  // Figure Space
+  // Punctuation Space
+  // Thin Space
+  // Hair Space
+  // Narrow No-Break Space
+  // Medium Mathematical Space
+  // Ideographic Space
+ return a;
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/with.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/with.js
new file mode 100644
index 000000000..de266ed54
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/compress/test/with.js
@@ -0,0 +1,2 @@
+with({}) {
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/scripts.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/scripts.js
new file mode 100644
index 000000000..5d334ff76
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/test/unit/scripts.js
@@ -0,0 +1,55 @@
+var fs = require('fs'),
+ uglify = require('../../uglify-js'),
+ jsp = uglify.parser,
+ nodeunit = require('nodeunit'),
+ path = require('path'),
+ pro = uglify.uglify;
+
+var Script = process.binding('evals').Script;
+
+var scriptsPath = __dirname;
+
+function compress(code) {
+ var ast = jsp.parse(code);
+ ast = pro.ast_mangle(ast);
+ ast = pro.ast_squeeze(ast, { no_warnings: true });
+ ast = pro.ast_squeeze_more(ast);
+ return pro.gen_code(ast);
+};
+
+var testDir = path.join(scriptsPath, "compress", "test");
+var expectedDir = path.join(scriptsPath, "compress", "expected");
+
+function getTester(script) {
+ return function(test) {
+ var testPath = path.join(testDir, script);
+ var expectedPath = path.join(expectedDir, script);
+ var content = fs.readFileSync(testPath, 'utf-8');
+ var outputCompress = compress(content);
+
+ // Check if the noncompressdata is larger or same size as the compressed data
+ test.ok(content.length >= outputCompress.length);
+
+ // Check that a recompress gives the same result
+ var outputReCompress = compress(content);
+ test.equal(outputCompress, outputReCompress);
+
+ // Check if the compressed output is what is expected
+ var expected = fs.readFileSync(expectedPath, 'utf-8');
+ test.equal(outputCompress, expected.replace(/(\r?\n)+$/, ""));
+
+ test.done();
+ };
+};
+
+var tests = {};
+
+var scripts = fs.readdirSync(testDir);
+for (var i in scripts) {
+ var script = scripts[i];
+ if (/\.js$/.test(script)) {
+ tests[script] = getTester(script);
+ }
+}
+
+module.exports = nodeunit.testCase(tests);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/uglify-js.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/uglify-js.js
new file mode 100644
index 000000000..6e14a637e
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/node_modules/uglify-js/uglify-js.js
@@ -0,0 +1,18 @@
+//convienence function(src, [options]);
+function uglify(orig_code, options){
+ options || (options = {});
+ var jsp = uglify.parser;
+ var pro = uglify.uglify;
+
+ var ast = jsp.parse(orig_code, options.strict_semicolons); // parse code and get the initial AST
+ ast = pro.ast_mangle(ast, options.mangle_options); // get a new AST with mangled names
+ ast = pro.ast_squeeze(ast, options.squeeze_options); // get an AST with compression optimizations
+ var final_code = pro.gen_code(ast, options.gen_options); // compressed code here
+ return final_code;
+};
+
+uglify.parser = require("./lib/parse-js");
+uglify.uglify = require("./lib/process");
+uglify.consolidator = require("./lib/consolidator");
+
+module.exports = uglify
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/package.json b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/package.json
new file mode 100644
index 000000000..a0e363f0c
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/package.json
@@ -0,0 +1,45 @@
+{
+ "name": "detective",
+ "description": "Find all calls to require() no matter how crazily nested using a proper walk of the AST",
+ "version": "0.1.1",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/substack/node-detective.git"
+ },
+ "main": "index.js",
+ "keywords": [
+ "require",
+ "source",
+ "analyze",
+ "ast"
+ ],
+ "directories": {
+ "lib": ".",
+ "example": "example",
+ "test": "test"
+ },
+ "scripts": {
+ "test": "tap test/*.js"
+ },
+ "dependencies": {
+ "uglify-js": "~1.2.5"
+ },
+ "devDependencies": {
+ "tap": "~0.2.3"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ },
+ "license": "MIT",
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "readme": "detective\n=========\n\nFind all calls to require() no matter how crazily nested using a proper walk of\nthe AST.\n\nexample\n=======\n\nstrings\n-------\n\nstrings_src.js:\n\n````javascript\nvar a = require('a');\nvar b = require('b');\nvar c = require('c');\n````\n\nstrings.js:\n\n````javascript\nvar detective = require('detective');\nvar fs = require('fs');\n\nvar src = fs.readFileSync(__dirname + '/strings_src.js');\nvar requires = detective(src);\nconsole.dir(requires);\n````\n\noutput:\n\n $ node examples/strings.js\n [ 'a', 'b', 'c' ]\n\nmethods\n=======\n\nvar detective = require('detective');\n\ndetective(src, opts)\n--------------------\n\nGive some source body `src`, return an array of all the require()s with string\narguments.\n\nThe options parameter `opts` is passed along to `detective.find()`.\n\ndetective.find(src, opts)\n-------------------------\n\nGive some source body `src`, return an object with \"strings\" and \"expressions\"\narrays for each of the require() calls.\n\nThe \"expressions\" array will contain the stringified expressions.\n\nOptionally you can specify a different function besides `\"require\"` to analyze\nwith `opts.word`.\n\ninstallation\n============\n\n npm install detective\n",
+ "_id": "detective@0.1.1",
+ "dist": {
+ "shasum": "ceec72c7676b627587713edde6c14736beb16509"
+ },
+ "_from": "detective@~0.1.1"
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/both.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/both.js
new file mode 100644
index 000000000..971aebb62
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/both.js
@@ -0,0 +1,11 @@
+var test = require('tap').test;
+var detective = require('../');
+var fs = require('fs');
+var src = fs.readFileSync(__dirname + '/files/both.js');
+
+test('both', function (t) {
+ var modules = detective.find(src);
+ t.deepEqual(modules.strings, [ 'a', 'b' ]);
+ t.deepEqual(modules.expressions, [ '"c"+x', '"d"+y' ]);
+ t.end();
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/chained.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/chained.js
new file mode 100644
index 000000000..307c20150
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/chained.js
@@ -0,0 +1,9 @@
+var test = require('tap').test;
+var detective = require('../');
+var fs = require('fs');
+var src = fs.readFileSync(__dirname + '/files/chained.js');
+
+test('chained', function (t) {
+ t.deepEqual(detective(src), [ 'c', 'b', 'a' ]);
+ t.end();
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/files/both.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/files/both.js
new file mode 100644
index 000000000..4c3f390f3
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/files/both.js
@@ -0,0 +1,4 @@
+require('a');
+require('b');
+require('c'+x);
+var moo = require('d'+y).moo;
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/files/chained.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/files/chained.js
new file mode 100644
index 000000000..63437cc1c
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/files/chained.js
@@ -0,0 +1,5 @@
+
+
+require('c').hello().goodbye()
+require('b').hello()
+require('a')
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/files/nested.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/files/nested.js
new file mode 100644
index 000000000..646cf1335
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/files/nested.js
@@ -0,0 +1,22 @@
+
+if (true) {
+ (function () {
+ require('a');
+ })();
+}
+if (false) {
+ (function () {
+ var x = 10;
+ switch (x) {
+ case 1 : require('b'); break;
+ default : break;
+ }
+ })()
+}
+
+function qqq () {
+ require
+ (
+ "c"
+ );
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/files/strings.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/files/strings.js
new file mode 100644
index 000000000..1ed9381cf
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/files/strings.js
@@ -0,0 +1,13 @@
+var a = require('a');
+var b = require('b');
+var c = require('c');
+var abc = a.b(c);
+
+var EventEmitter = require('events').EventEmitter;
+
+var x = require('doom')(5,6,7);
+x(8,9);
+c.require('notthis');
+var y = require('y') * 100;
+
+var EventEmitter2 = require('events2').EventEmitter(); \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/files/word.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/files/word.js
new file mode 100644
index 000000000..fd074fe75
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/files/word.js
@@ -0,0 +1,13 @@
+var a = load('a');
+var b = load('b');
+var c = load('c');
+var abc = a.b(c);
+
+var EventEmitter = load('events').EventEmitter;
+
+var x = load('doom')(5,6,7);
+x(8,9);
+c.load('notthis');
+var y = load('y') * 100;
+
+var EventEmitter2 = load('events2').EventEmitter();
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/nested.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/nested.js
new file mode 100644
index 000000000..d688c0f80
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/nested.js
@@ -0,0 +1,9 @@
+var test = require('tap').test;
+var detective = require('../');
+var fs = require('fs');
+var src = fs.readFileSync(__dirname + '/files/nested.js');
+
+test('nested', function (t) {
+ t.deepEqual(detective(src), [ 'a', 'b', 'c' ]);
+ t.end();
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/strings.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/strings.js
new file mode 100644
index 000000000..3b5e7d821
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/strings.js
@@ -0,0 +1,9 @@
+var test = require('tap').test;
+var detective = require('../');
+var fs = require('fs');
+var src = fs.readFileSync(__dirname + '/files/strings.js');
+
+test('single', function (t) {
+ t.deepEqual(detective(src), [ 'a', 'b', 'c', 'events', 'doom', 'y', 'events2' ]);
+ t.end();
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/word.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/word.js
new file mode 100644
index 000000000..cf5397d85
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/detective/test/word.js
@@ -0,0 +1,12 @@
+var test = require('tap').test;
+var detective = require('../');
+var fs = require('fs');
+var src = fs.readFileSync(__dirname + '/files/word.js');
+
+test('word', function (t) {
+ t.deepEqual(
+ detective(src, { word : 'load' }),
+ [ 'a', 'b', 'c', 'events', 'doom', 'y', 'events2' ]
+ );
+ t.end();
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/README.markdown b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/README.markdown
new file mode 100644
index 000000000..8cd8c1bfd
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/README.markdown
@@ -0,0 +1,128 @@
+http-browserify
+===============
+
+The
+[http](http://nodejs.org/docs/v0.4.10/api/all.html#hTTP) module from node.js,
+but for browsers.
+
+When you `require('http')` in
+[browserify](http://github.com/substack/node-browserify),
+this module will be loaded.
+
+example
+=======
+
+````javascript
+var http = require('http');
+
+http.get({ path : '/beep' }, function (res) {
+ var div = document.getElementById('result');
+ div.innerHTML += 'GET /beep<br>';
+
+ res.on('data', function (buf) {
+ div.innerHTML += buf;
+ });
+
+ res.on('end', function () {
+ div.innerHTML += '<br>__END__';
+ });
+});
+````
+
+http methods
+============
+
+var http = require('http');
+
+var req = http.request(options, cb)
+-----------------------------------
+
+`options` can have:
+
+* method
+* path
+* headers={}, as an object mapping key names to string or Array values
+* host=window.location.host
+* port=window.location.port
+
+The callback will be called with the response object.
+
+var req = http.get(options, cb)
+-------------------------------
+
+A shortcut for
+
+````javascript
+options.method = 'GET';
+var req = http.request(options, cb);
+req.end();
+````
+
+request methods
+===============
+
+req.setHeader(key, value)
+-------------------------
+
+Set an http header.
+
+req.write(data)
+---------------
+
+Write some data to the request body.
+
+req.end(data)
+-------------
+
+Close and send the request body, optionally with additional `data` to append.
+
+response methods
+================
+
+res.getHeader(key)
+------------------
+
+Return an http header, if set. `key` is case-insensitive.
+
+response attributes
+===================
+
+* res.statusCode, the numeric http response code
+* res.headers, an object with all lowercase keys
+
+response events
+---------------
+
+* data
+* end
+* error
+
+compatibility
+=============
+
+This module has been tested and works with:
+
+* Internet Explorer 5.5, 6, 7, 8, 9
+* Firefox 3.5
+* Chrome 7.0
+* Opera 10.6
+* Safari 5.0
+
+Multipart streaming responses are buffered in all versions of Internet Explorer
+and are somewhat buffered in Opera. In all the other browsers you get a nice
+unbuffered stream of `"data"` events when you send down a content-type of
+`multipart/octet-stream` or similar.
+
+protip
+======
+
+You can do:
+
+````javascript
+var bundle = browserify({
+ require : { http : 'http-browserify' }
+});
+````
+
+in order to map "http-browserify" over `require('http')` in your browserified
+source.
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/get/index.html b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/get/index.html
new file mode 100644
index 000000000..32678f643
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/get/index.html
@@ -0,0 +1,9 @@
+<html>
+ <head>
+ <title>xhr</title>
+ <script type="text/javascript" src="/browserify.js"></script>
+ </head>
+ <body>
+ <div id="result"></div>
+ </body>
+</html>
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/get/main.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/get/main.js
new file mode 100644
index 000000000..605e870c0
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/get/main.js
@@ -0,0 +1,14 @@
+var http = require('http-browserify');
+
+http.get({ path : '/beep' }, function (res) {
+ var div = document.getElementById('result');
+ div.innerHTML += 'GET /beep<br>';
+
+ res.on('data', function (buf) {
+ div.innerHTML += buf;
+ });
+
+ res.on('end', function () {
+ div.innerHTML += '<br>__END__';
+ });
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/get/server.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/get/server.js
new file mode 100644
index 000000000..b706eb428
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/get/server.js
@@ -0,0 +1,15 @@
+var express = require('express');
+var app = express.createServer();
+app.use(express.static(__dirname));
+
+app.get('/beep', function (req, res) {
+ res.setHeader('content-type', 'text/plain');
+ res.end('boop');
+});
+
+var browserify = require('browserify');
+var bundle = browserify(__dirname + '/main.js');
+app.use(bundle);
+
+console.log('Listening on :8082');
+app.listen(8082);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/headers/index.html b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/headers/index.html
new file mode 100644
index 000000000..32678f643
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/headers/index.html
@@ -0,0 +1,9 @@
+<html>
+ <head>
+ <title>xhr</title>
+ <script type="text/javascript" src="/browserify.js"></script>
+ </head>
+ <body>
+ <div id="result"></div>
+ </body>
+</html>
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/headers/main.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/headers/main.js
new file mode 100644
index 000000000..f723d5170
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/headers/main.js
@@ -0,0 +1,18 @@
+var http = require('http-browserify');
+
+var opts = { path : '/beep', method : 'GET' };
+var req = http.request(opts, function (res) {
+ var div = document.getElementById('result');
+
+ for (var key in res.headers) {
+ div.innerHTML += key + ': ' + res.getHeader(key) + '<br>';
+ }
+ div.innerHTML += '<br>';
+
+ res.on('data', function (buf) {
+ div.innerHTML += buf;
+ });
+});
+
+req.setHeader('bling', 'blong');
+req.end();
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/headers/server.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/headers/server.js
new file mode 100644
index 000000000..b243cb5ba
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/headers/server.js
@@ -0,0 +1,18 @@
+var express = require('express');
+var app = express.createServer();
+app.use(express.static(__dirname));
+
+app.get('/beep', function (req, res) {
+ res.setHeader('content-type', 'text/plain');
+ res.setHeader('foo', 'bar');
+ res.setHeader('bling', req.headers.bling + '-blong');
+
+ res.end('boop');
+});
+
+var browserify = require('browserify');
+var bundle = browserify(__dirname + '/main.js');
+app.use(bundle);
+
+console.log('Listening on :8082');
+app.listen(8082);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/post/index.html b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/post/index.html
new file mode 100644
index 000000000..32678f643
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/post/index.html
@@ -0,0 +1,9 @@
+<html>
+ <head>
+ <title>xhr</title>
+ <script type="text/javascript" src="/browserify.js"></script>
+ </head>
+ <body>
+ <div id="result"></div>
+ </body>
+</html>
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/post/main.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/post/main.js
new file mode 100644
index 000000000..6a434f71e
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/post/main.js
@@ -0,0 +1,16 @@
+var http = require('http-browserify');
+
+var n = 100;
+var opts = { path : '/plusone', method : 'post' };
+
+var req = http.request(opts, function (res) {
+ var div = document.getElementById('result');
+ div.innerHTML += n.toString() + ' + 1 = ';
+
+ res.on('data', function (buf) {
+ div.innerHTML += buf;
+ });
+});
+
+req.write(n);
+req.end();
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/post/server.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/post/server.js
new file mode 100644
index 000000000..5bdec6b6d
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/post/server.js
@@ -0,0 +1,22 @@
+var express = require('express');
+var app = express.createServer();
+app.use(express.static(__dirname));
+
+app.post('/plusone', function (req, res) {
+ res.setHeader('content-type', 'text/plain');
+
+ var s = '';
+ req.on('data', function (buf) { s += buf.toString() });
+
+ req.on('end', function () {
+ var n = parseInt(s) + 1;
+ res.end(n.toString());
+ });
+});
+
+var browserify = require('browserify');
+var bundle = browserify(__dirname + '/main.js');
+app.use(bundle);
+
+console.log('Listening on :8082');
+app.listen(8082);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/streaming/index.html b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/streaming/index.html
new file mode 100644
index 000000000..32678f643
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/streaming/index.html
@@ -0,0 +1,9 @@
+<html>
+ <head>
+ <title>xhr</title>
+ <script type="text/javascript" src="/browserify.js"></script>
+ </head>
+ <body>
+ <div id="result"></div>
+ </body>
+</html>
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/streaming/main.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/streaming/main.js
new file mode 100644
index 000000000..789906098
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/streaming/main.js
@@ -0,0 +1,16 @@
+var http = require('http-browserify');
+
+http.get({ path : '/doom' }, function (res) {
+ var div = document.getElementById('result');
+ if (!div.style) div.style = {};
+ div.style.color = 'rgb(80,80,80)';
+
+ res.on('data', function (buf) {
+ div.innerHTML += buf;
+ });
+
+ res.on('end', function () {
+ div.style.color = 'black';
+ div.innerHTML += '!';
+ });
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/streaming/server.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/streaming/server.js
new file mode 100644
index 000000000..fb5cc2f49
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/example/streaming/server.js
@@ -0,0 +1,24 @@
+var express = require('express');
+var app = express.createServer();
+app.use(express.static(__dirname));
+
+app.get('/doom', function (req, res) {
+ res.setHeader('content-type', 'multipart/octet-stream');
+
+ res.write('d');
+ var i = 0;
+ var iv = setInterval(function () {
+ res.write('o');
+ if (i++ >= 10) {
+ clearInterval(iv);
+ res.end('m');
+ }
+ }, 500);
+});
+
+var browserify = require('browserify');
+var bundle = browserify(__dirname + '/main.js');
+app.use(bundle);
+
+console.log('Listening on :8082');
+app.listen(8082);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/index.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/index.js
new file mode 100644
index 000000000..bca5a2769
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/index.js
@@ -0,0 +1,59 @@
+var http = module.exports;
+var EventEmitter = require('events').EventEmitter;
+var Request = require('./lib/request');
+
+http.request = function (params, cb) {
+ if (!params) params = {};
+ if (!params.host) params.host = window.location.host.split(':')[0];
+ if (!params.port) params.port = window.location.port;
+
+ var req = new Request(new xhrHttp, params);
+ if (cb) req.on('response', cb);
+ return req;
+};
+
+http.get = function (params, cb) {
+ params.method = 'GET';
+ var req = http.request(params, cb);
+ req.end();
+ return req;
+};
+
+http.Agent = function () {};
+http.Agent.defaultMaxSockets = 4;
+
+var xhrHttp = (function () {
+ if (typeof window === 'undefined') {
+ throw new Error('no window object present');
+ }
+ else if (window.XMLHttpRequest) {
+ return window.XMLHttpRequest;
+ }
+ else if (window.ActiveXObject) {
+ var axs = [
+ 'Msxml2.XMLHTTP.6.0',
+ 'Msxml2.XMLHTTP.3.0',
+ 'Microsoft.XMLHTTP'
+ ];
+ for (var i = 0; i < axs.length; i++) {
+ try {
+ var ax = new(window.ActiveXObject)(axs[i]);
+ return function () {
+ if (ax) {
+ var ax_ = ax;
+ ax = null;
+ return ax_;
+ }
+ else {
+ return new(window.ActiveXObject)(axs[i]);
+ }
+ };
+ }
+ catch (e) {}
+ }
+ throw new Error('ajax not supported in this browser')
+ }
+ else {
+ throw new Error('ajax not supported in this browser');
+ }
+})();
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/lib/request.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/lib/request.js
new file mode 100644
index 000000000..19ecca34b
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/lib/request.js
@@ -0,0 +1,91 @@
+var EventEmitter = require('events').EventEmitter;
+var Response = require('./response');
+
+var Request = module.exports = function (xhr, params) {
+ var self = this;
+ self.xhr = xhr;
+ self.body = '';
+
+ var uri = params.host + ':' + params.port + (params.path || '/');
+
+ xhr.open(
+ params.method || 'GET',
+ (params.scheme || 'http') + '://' + uri,
+ true
+ );
+
+ if (params.headers) {
+ Object.keys(params.headers).forEach(function (key) {
+ if (!self.isSafeRequestHeader(key)) return;
+ var value = params.headers[key];
+ if (Array.isArray(value)) {
+ value.forEach(function (v) {
+ xhr.setRequestHeader(key, v);
+ });
+ }
+ else xhr.setRequestHeader(key, value)
+ });
+ }
+
+ var res = new Response;
+ res.on('ready', function () {
+ self.emit('response', res);
+ });
+
+ xhr.onreadystatechange = function () {
+ res.handle(xhr);
+ };
+};
+
+Request.prototype = new EventEmitter;
+
+Request.prototype.setHeader = function (key, value) {
+ if ((Array.isArray && Array.isArray(value))
+ || value instanceof Array) {
+ for (var i = 0; i < value.length; i++) {
+ this.xhr.setRequestHeader(key, value[i]);
+ }
+ }
+ else {
+ this.xhr.setRequestHeader(key, value);
+ }
+};
+
+Request.prototype.write = function (s) {
+ this.body += s;
+};
+
+Request.prototype.end = function (s) {
+ if (s !== undefined) this.write(s);
+ this.xhr.send(this.body);
+};
+
+// Taken from http://dxr.mozilla.org/mozilla/mozilla-central/content/base/src/nsXMLHttpRequest.cpp.html
+Request.unsafeHeaders = [
+ "accept-charset",
+ "accept-encoding",
+ "access-control-request-headers",
+ "access-control-request-method",
+ "connection",
+ "content-length",
+ "cookie",
+ "cookie2",
+ "content-transfer-encoding",
+ "date",
+ "expect",
+ "host",
+ "keep-alive",
+ "origin",
+ "referer",
+ "te",
+ "trailer",
+ "transfer-encoding",
+ "upgrade",
+ "user-agent",
+ "via"
+];
+
+Request.prototype.isSafeRequestHeader = function (headerName) {
+ if (!headerName) return false;
+ return (Request.unsafeHeaders.indexOf(headerName.toLowerCase()) === -1)
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/lib/response.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/lib/response.js
new file mode 100644
index 000000000..ae2844b25
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/lib/response.js
@@ -0,0 +1,99 @@
+var EventEmitter = require('events').EventEmitter;
+
+var Response = module.exports = function (res) {
+ this.offset = 0;
+};
+
+Response.prototype = new EventEmitter;
+
+var capable = {
+ streaming : true,
+ status2 : true
+};
+
+function parseHeaders (res) {
+ var lines = res.getAllResponseHeaders().split(/\r?\n/);
+ var headers = {};
+ for (var i = 0; i < lines.length; i++) {
+ var line = lines[i];
+ if (line === '') continue;
+
+ var m = line.match(/^([^:]+):\s*(.*)/);
+ if (m) {
+ var key = m[1].toLowerCase(), value = m[2];
+
+ if (headers[key] !== undefined) {
+ if ((Array.isArray && Array.isArray(headers[key]))
+ || headers[key] instanceof Array) {
+ headers[key].push(value);
+ }
+ else {
+ headers[key] = [ headers[key], value ];
+ }
+ }
+ else {
+ headers[key] = value;
+ }
+ }
+ else {
+ headers[line] = true;
+ }
+ }
+ return headers;
+}
+
+Response.prototype.getHeader = function (key) {
+ return this.headers[key.toLowerCase()];
+};
+
+Response.prototype.handle = function (res) {
+ if (res.readyState === 2 && capable.status2) {
+ try {
+ this.statusCode = res.status;
+ this.headers = parseHeaders(res);
+ }
+ catch (err) {
+ capable.status2 = false;
+ }
+
+ if (capable.status2) {
+ this.emit('ready');
+ }
+ }
+ else if (capable.streaming && res.readyState === 3) {
+ try {
+ if (!this.statusCode) {
+ this.statusCode = res.status;
+ this.headers = parseHeaders(res);
+ this.emit('ready');
+ }
+ }
+ catch (err) {}
+
+ try {
+ this.write(res);
+ }
+ catch (err) {
+ capable.streaming = false;
+ }
+ }
+ else if (res.readyState === 4) {
+ if (!this.statusCode) {
+ this.statusCode = res.status;
+ this.emit('ready');
+ }
+ this.write(res);
+
+ if (res.error) {
+ this.emit('error', res.responseText);
+ }
+ else this.emit('end');
+ }
+};
+
+Response.prototype.write = function (res) {
+ if (res.responseText.length > this.offset) {
+ this.emit('data', res.responseText.slice(this.offset));
+ this.offset = res.responseText.length;
+ }
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/package.json b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/package.json
new file mode 100644
index 000000000..0e8fb939e
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/http-browserify/package.json
@@ -0,0 +1,42 @@
+{
+ "name": "http-browserify",
+ "version": "0.1.1",
+ "description": "http module compatability for browserify",
+ "main": "index.js",
+ "browserify": "index.js",
+ "directories": {
+ "lib": ".",
+ "example": "example",
+ "test": "test"
+ },
+ "devDependencies": {
+ "express": "2.5.x",
+ "browserify": "1.9.x"
+ },
+ "repository": {
+ "type": "git",
+ "url": "http://github.com/substack/http-browserify.git"
+ },
+ "keywords": [
+ "http",
+ "browserify",
+ "compatible",
+ "meatless",
+ "browser"
+ ],
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "license": "MIT/X11",
+ "engine": {
+ "node": ">=0.4"
+ },
+ "readme": "http-browserify\n===============\n\nThe\n[http](http://nodejs.org/docs/v0.4.10/api/all.html#hTTP) module from node.js,\nbut for browsers.\n\nWhen you `require('http')` in\n[browserify](http://github.com/substack/node-browserify),\nthis module will be loaded.\n\nexample\n=======\n\n````javascript\nvar http = require('http');\n\nhttp.get({ path : '/beep' }, function (res) {\n var div = document.getElementById('result');\n div.innerHTML += 'GET /beep<br>';\n \n res.on('data', function (buf) {\n div.innerHTML += buf;\n });\n \n res.on('end', function () {\n div.innerHTML += '<br>__END__';\n });\n});\n````\n\nhttp methods\n============\n\nvar http = require('http');\n\nvar req = http.request(options, cb)\n-----------------------------------\n\n`options` can have:\n\n* method\n* path\n* headers={}, as an object mapping key names to string or Array values\n* host=window.location.host\n* port=window.location.port\n\nThe callback will be called with the response object.\n\nvar req = http.get(options, cb)\n-------------------------------\n\nA shortcut for\n\n````javascript\noptions.method = 'GET';\nvar req = http.request(options, cb);\nreq.end();\n````\n\nrequest methods\n===============\n\nreq.setHeader(key, value)\n-------------------------\n\nSet an http header.\n\nreq.write(data)\n---------------\n\nWrite some data to the request body.\n\nreq.end(data)\n-------------\n\nClose and send the request body, optionally with additional `data` to append.\n\nresponse methods\n================\n\nres.getHeader(key)\n------------------\n\nReturn an http header, if set. `key` is case-insensitive.\n\nresponse attributes\n===================\n\n* res.statusCode, the numeric http response code\n* res.headers, an object with all lowercase keys\n\nresponse events\n---------------\n\n* data\n* end\n* error\n\ncompatibility\n=============\n\nThis module has been tested and works with:\n\n* Internet Explorer 5.5, 6, 7, 8, 9\n* Firefox 3.5\n* Chrome 7.0\n* Opera 10.6\n* Safari 5.0\n\nMultipart streaming responses are buffered in all versions of Internet Explorer\nand are somewhat buffered in Opera. In all the other browsers you get a nice\nunbuffered stream of `\"data\"` events when you send down a content-type of\n`multipart/octet-stream` or similar.\n\nprotip\n======\n\nYou can do:\n\n````javascript\nvar bundle = browserify({\n require : { http : 'http-browserify' }\n});\n````\n\nin order to map \"http-browserify\" over `require('http')` in your browserified\nsource.\n",
+ "_id": "http-browserify@0.1.1",
+ "dist": {
+ "shasum": "ecefd94bc1c88a465cff5bbf00ec24deff45c2ea"
+ },
+ "_from": "http-browserify@~0.1.1"
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/nub/README.markdown b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/nub/README.markdown
new file mode 100644
index 000000000..3f09ea493
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/nub/README.markdown
@@ -0,0 +1,23 @@
+nub
+===
+
+Return all the unique elements of an array. You can specify your own uniqueness
+comparison function with `nub.by` too.
+
+These work like haskell's `nub` and `nubBy` functions in Data.List.
+
+methods
+=======
+
+nub(xs)
+-------
+
+Return a new array with all the uniqe elements in `xs`.
+
+Uniqueness is calculated `===` style so the types matter.
+
+nub.by(xs, cmp)
+---------------
+
+Use `cmp(x,y)` function to compare elements instead of the default.
+`cmp` should return whether the two elements are equal as a boolean.
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/nub/index.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/nub/index.js
new file mode 100644
index 000000000..c28b5fb9e
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/nub/index.js
@@ -0,0 +1,64 @@
+var nub = module.exports = function (xs, cmp) {
+ if (typeof xs === 'function' || cmp) {
+ return nub.by(xs, cmp);
+ }
+
+ var keys = {
+ 'object' : [],
+ 'function' : [],
+ 'string' : {},
+ 'number' : {},
+ 'boolean' : {},
+ 'undefined' : {}
+ };
+
+ var res = [];
+
+ for (var i = 0; i < xs.length; i++) {
+ var x = xs[i];
+ var recs = x === '__proto__'
+ ? keys.objects
+ : keys[typeof x] || keys.objects
+ ;
+
+ if (Array.isArray(recs)) {
+ if (recs.indexOf(x) < 0) {
+ recs.push(x);
+ res.push(x);
+ }
+ }
+ else if (!Object.hasOwnProperty.call(recs, x)) {
+ recs[x] = true;
+ res.push(x);
+ }
+ }
+
+ return res;
+};
+
+nub.by = function (xs, cmp) {
+ if (typeof xs === 'function') {
+ var cmp_ = cmp;
+ cmp = xs;
+ xs = cmp_;
+ }
+
+ var res = [];
+
+ for (var i = 0; i < xs.length; i++) {
+ var x = xs[i];
+
+ var found = false;
+ for (var j = 0; j < res.length; j++) {
+ var y = res[j];
+ if (cmp.call(res, x, y)) {
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) res.push(x);
+ }
+
+ return res;
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/nub/package.json b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/nub/package.json
new file mode 100644
index 000000000..2920d7d96
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/nub/package.json
@@ -0,0 +1,44 @@
+{
+ "name": "nub",
+ "version": "0.0.0",
+ "description": "Uniqueness functions",
+ "main": "index.js",
+ "directories": {
+ "lib": ".",
+ "example": "example",
+ "test": "test"
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "expresso": "0.7.x"
+ },
+ "scripts": {
+ "test": "expresso"
+ },
+ "repository": {
+ "type": "git",
+ "url": "http://github.com/substack/node-nub.git"
+ },
+ "keywords": [
+ "unique",
+ "uniq",
+ "uniqBy",
+ "nub",
+ "nubBy"
+ ],
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "license": "MIT/X11",
+ "engine": {
+ "node": ">=0.4"
+ },
+ "readme": "nub\n===\n\nReturn all the unique elements of an array. You can specify your own uniqueness\ncomparison function with `nub.by` too.\n\nThese work like haskell's `nub` and `nubBy` functions in Data.List.\n\nmethods\n=======\n\nnub(xs)\n-------\n\nReturn a new array with all the uniqe elements in `xs`.\n\nUniqueness is calculated `===` style so the types matter.\n\nnub.by(xs, cmp)\n---------------\n\nUse `cmp(x,y)` function to compare elements instead of the default.\n`cmp` should return whether the two elements are equal as a boolean.\n",
+ "_id": "nub@0.0.0",
+ "dist": {
+ "shasum": "f6e5e51432ece99bbda54a14efb26e89871191a7"
+ },
+ "_from": "nub@~0.0.0"
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/nub/test/by.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/nub/test/by.js
new file mode 100644
index 000000000..f59f0e3e0
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/nub/test/by.js
@@ -0,0 +1,51 @@
+var assert = require('assert');
+var nub = require('../');
+
+exports.false = function () {
+ var xs = [ 3, 3, 1, 1, 2, 1, 2, 1 ];
+ assert.deepEqual(
+ nub.by(xs, function () { return false }),
+ xs
+ );
+};
+
+exports.true = function () {
+ var xs = [ 3, 3, 1, 1, 2, 1, 2, 1 ];
+ assert.deepEqual(
+ nub.by(xs, function () { return true }),
+ [3]
+ );
+};
+
+exports.stringify = function () {
+ var xs = { a : 1, b : 2 };
+ var ys = { a : 1, b : 2 };
+ assert.deepEqual(
+ nub.by([ 3, 4, xs, ys, 5, 6 ], function (x, y) {
+ return JSON.stringify(x) === JSON.stringify(y)
+ }),
+ [ 3, 4, xs, 5, 6 ]
+ );
+};
+
+exports.mod = function () {
+ var xs = { a : 1, b : 2 };
+ var ys = { a : 1, b : 2 };
+ assert.deepEqual(
+ nub.by([ 1, 6, 3, 4, 5, 2, 7, 8 ], function (x, y) {
+ return x % 4 === y % 4
+ }),
+ [ 1, 6, 3, 4 ]
+ );
+};
+
+exports.dispatchMod = function () {
+ var xs = { a : 1, b : 2 };
+ var ys = { a : 1, b : 2 };
+ assert.deepEqual(
+ nub([ 1, 6, 3, 4, 5, 2, 7, 8 ], function (x, y) {
+ return x % 4 === y % 4
+ }),
+ [ 1, 6, 3, 4 ]
+ );
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/nub/test/nub.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/nub/test/nub.js
new file mode 100644
index 000000000..4926a44ac
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/nub/test/nub.js
@@ -0,0 +1,46 @@
+var nub = require('../');
+var assert = require('assert');
+
+exports.empty = function () {
+ assert.deepEqual(nub([]), []);
+};
+
+exports.already = function () {
+ assert.deepEqual(nub([ 1, 2, 3 ]), [ 1, 2, 3 ]);
+};
+
+exports.dups = function () {
+ assert.deepEqual(nub([ 1, 1, 2, 1, 3, 2 ]), [ 1, 2, 3 ]);
+};
+
+exports.objects = function () {
+ var xs = { a : 4, b : 5 };
+ var ys = { c : 6 };
+ assert.deepEqual(
+ nub([ 1, 1, 2, 3, xs, xs, ys, xs, 2, 7, 7, 3, 1, 5 ]),
+ [ 1, 2, 3, xs, ys, 7, 5 ]
+ );
+};
+
+exports.mixed = function () {
+ var f = function () {};
+ var g = function () {};
+ var re = /meow/;
+
+ var xs = [
+ 1, 2, '3', 3, 2, '2', f, f, g, re, false, false, true, false, re,
+ undefined, null, undefined, 1, null, null, undefined
+ ];
+ var res = nub(xs);
+
+ assert.deepEqual(res, [
+ 1, 2, '3', 3, '2', f, g, re, false, true, undefined, null
+ ]);
+ assert.deepEqual(
+ res.map(function (r) { return typeof r }),
+ [
+ 'number', 'number', 'string', 'number', 'string', 'function',
+ 'function', 'function', 'boolean', 'boolean', 'undefined', 'object'
+ ]
+ );
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/.travis.yml b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/.travis.yml
new file mode 100644
index 000000000..f1d0f13c8
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+ - 0.4
+ - 0.6
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/LICENSE b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/LICENSE
new file mode 100644
index 000000000..432d1aeb0
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/LICENSE
@@ -0,0 +1,21 @@
+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/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/README.markdown b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/README.markdown
new file mode 100644
index 000000000..ad9d3fd68
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/README.markdown
@@ -0,0 +1,487 @@
+optimist
+========
+
+Optimist is a node.js library for option parsing for people who hate option
+parsing. More specifically, this module is for people who like all the --bells
+and -whistlz of program usage but think optstrings are a waste of time.
+
+With optimist, option parsing doesn't have to suck (as much).
+
+[![build status](https://secure.travis-ci.org/substack/node-optimist.png)](http://travis-ci.org/substack/node-optimist)
+
+examples
+========
+
+With Optimist, the options are just a hash! No optstrings attached.
+-------------------------------------------------------------------
+
+xup.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist').argv;
+
+if (argv.rif - 5 * argv.xup > 7.138) {
+ console.log('Buy more riffiwobbles');
+}
+else {
+ console.log('Sell the xupptumblers');
+}
+````
+
+***
+
+ $ ./xup.js --rif=55 --xup=9.52
+ Buy more riffiwobbles
+
+ $ ./xup.js --rif 12 --xup 8.1
+ Sell the xupptumblers
+
+![This one's optimistic.](http://substack.net/images/optimistic.png)
+
+But wait! There's more! You can do short options:
+-------------------------------------------------
+
+short.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist').argv;
+console.log('(%d,%d)', argv.x, argv.y);
+````
+
+***
+
+ $ ./short.js -x 10 -y 21
+ (10,21)
+
+And booleans, both long and short (and grouped):
+----------------------------------
+
+bool.js:
+
+````javascript
+#!/usr/bin/env node
+var util = require('util');
+var argv = require('optimist').argv;
+
+if (argv.s) {
+ util.print(argv.fr ? 'Le chat dit: ' : 'The cat says: ');
+}
+console.log(
+ (argv.fr ? 'miaou' : 'meow') + (argv.p ? '.' : '')
+);
+````
+
+***
+
+ $ ./bool.js -s
+ The cat says: meow
+
+ $ ./bool.js -sp
+ The cat says: meow.
+
+ $ ./bool.js -sp --fr
+ Le chat dit: miaou.
+
+And non-hypenated options too! Just use `argv._`!
+-------------------------------------------------
+
+nonopt.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist').argv;
+console.log('(%d,%d)', argv.x, argv.y);
+console.log(argv._);
+````
+
+***
+
+ $ ./nonopt.js -x 6.82 -y 3.35 moo
+ (6.82,3.35)
+ [ 'moo' ]
+
+ $ ./nonopt.js foo -x 0.54 bar -y 1.12 baz
+ (0.54,1.12)
+ [ 'foo', 'bar', 'baz' ]
+
+Plus, Optimist comes with .usage() and .demand()!
+-------------------------------------------------
+
+divide.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+ .usage('Usage: $0 -x [num] -y [num]')
+ .demand(['x','y'])
+ .argv;
+
+console.log(argv.x / argv.y);
+````
+
+***
+
+ $ ./divide.js -x 55 -y 11
+ 5
+
+ $ node ./divide.js -x 4.91 -z 2.51
+ Usage: node ./divide.js -x [num] -y [num]
+
+ Options:
+ -x [required]
+ -y [required]
+
+ Missing required arguments: y
+
+EVEN MORE HOLY COW
+------------------
+
+default_singles.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+ .default('x', 10)
+ .default('y', 10)
+ .argv
+;
+console.log(argv.x + argv.y);
+````
+
+***
+
+ $ ./default_singles.js -x 5
+ 15
+
+default_hash.js:
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+ .default({ x : 10, y : 10 })
+ .argv
+;
+console.log(argv.x + argv.y);
+````
+
+***
+
+ $ ./default_hash.js -y 7
+ 17
+
+And if you really want to get all descriptive about it...
+---------------------------------------------------------
+
+boolean_single.js
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+ .boolean('v')
+ .argv
+;
+console.dir(argv);
+````
+
+***
+
+ $ ./boolean_single.js -v foo bar baz
+ true
+ [ 'bar', 'baz', 'foo' ]
+
+boolean_double.js
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+ .boolean(['x','y','z'])
+ .argv
+;
+console.dir([ argv.x, argv.y, argv.z ]);
+console.dir(argv._);
+````
+
+***
+
+ $ ./boolean_double.js -x -z one two three
+ [ true, false, true ]
+ [ 'one', 'two', 'three' ]
+
+Optimist is here to help...
+---------------------------
+
+You can describe parameters for help messages and set aliases. Optimist figures
+out how to format a handy help string automatically.
+
+line_count.js
+
+````javascript
+#!/usr/bin/env node
+var argv = require('optimist')
+ .usage('Count the lines in a file.\nUsage: $0')
+ .demand('f')
+ .alias('f', 'file')
+ .describe('f', 'Load a file')
+ .argv
+;
+
+var fs = require('fs');
+var s = fs.createReadStream(argv.file);
+
+var lines = 0;
+s.on('data', function (buf) {
+ lines += buf.toString().match(/\n/g).length;
+});
+
+s.on('end', function () {
+ console.log(lines);
+});
+````
+
+***
+
+ $ node line_count.js
+ Count the lines in a file.
+ Usage: node ./line_count.js
+
+ Options:
+ -f, --file Load a file [required]
+
+ Missing required arguments: f
+
+ $ node line_count.js --file line_count.js
+ 20
+
+ $ node line_count.js -f line_count.js
+ 20
+
+methods
+=======
+
+By itself,
+
+````javascript
+require('optimist').argv
+`````
+
+will use `process.argv` array to construct the `argv` object.
+
+You can pass in the `process.argv` yourself:
+
+````javascript
+require('optimist')([ '-x', '1', '-y', '2' ]).argv
+````
+
+or use .parse() to do the same thing:
+
+````javascript
+require('optimist').parse([ '-x', '1', '-y', '2' ])
+````
+
+The rest of these methods below come in just before the terminating `.argv`.
+
+.alias(key, alias)
+------------------
+
+Set key names as equivalent such that updates to a key will propagate to aliases
+and vice-versa.
+
+Optionally `.alias()` can take an object that maps keys to aliases.
+
+.default(key, value)
+--------------------
+
+Set `argv[key]` to `value` if no option was specified on `process.argv`.
+
+Optionally `.default()` can take an object that maps keys to default values.
+
+.demand(key)
+------------
+
+If `key` is a string, show the usage information and exit if `key` wasn't
+specified in `process.argv`.
+
+If `key` is a number, demand at least as many non-option arguments, which show
+up in `argv._`.
+
+If `key` is an Array, demand each element.
+
+.describe(key, desc)
+--------------------
+
+Describe a `key` for the generated usage information.
+
+Optionally `.describe()` can take an object that maps keys to descriptions.
+
+.options(key, opt)
+------------------
+
+Instead of chaining together `.alias().demand().default()`, you can specify
+keys in `opt` for each of the chainable methods.
+
+For example:
+
+````javascript
+var argv = require('optimist')
+ .options('f', {
+ alias : 'file',
+ default : '/etc/passwd',
+ })
+ .argv
+;
+````
+
+is the same as
+
+````javascript
+var argv = require('optimist')
+ .alias('f', 'file')
+ .default('f', '/etc/passwd')
+ .argv
+;
+````
+
+Optionally `.options()` can take an object that maps keys to `opt` parameters.
+
+.usage(message)
+---------------
+
+Set a usage message to show which commands to use. Inside `message`, the string
+`$0` will get interpolated to the current script name or node command for the
+present script similar to how `$0` works in bash or perl.
+
+.check(fn)
+----------
+
+Check that certain conditions are met in the provided arguments.
+
+If `fn` throws or returns `false`, show the thrown error, usage information, and
+exit.
+
+.boolean(key)
+-------------
+
+Interpret `key` as a boolean. If a non-flag option follows `key` in
+`process.argv`, that string won't get set as the value of `key`.
+
+If `key` never shows up as a flag in `process.arguments`, `argv[key]` will be
+`false`.
+
+If `key` is an Array, interpret all the elements as booleans.
+
+.string(key)
+------------
+
+Tell the parser logic not to interpret `key` as a number or boolean.
+This can be useful if you need to preserve leading zeros in an input.
+
+If `key` is an Array, interpret all the elements as strings.
+
+.wrap(columns)
+--------------
+
+Format usage output to wrap at `columns` many columns.
+
+.help()
+-------
+
+Return the generated usage string.
+
+.showHelp(fn=console.error)
+---------------------------
+
+Print the usage data using `fn` for printing.
+
+.parse(args)
+------------
+
+Parse `args` instead of `process.argv`. Returns the `argv` object.
+
+.argv
+-----
+
+Get the arguments as a plain old object.
+
+Arguments without a corresponding flag show up in the `argv._` array.
+
+The script name or node command is available at `argv.$0` similarly to how `$0`
+works in bash or perl.
+
+parsing tricks
+==============
+
+stop parsing
+------------
+
+Use `--` to stop parsing flags and stuff the remainder into `argv._`.
+
+ $ node examples/reflect.js -a 1 -b 2 -- -c 3 -d 4
+ { _: [ '-c', '3', '-d', '4' ],
+ '$0': 'node ./examples/reflect.js',
+ a: 1,
+ b: 2 }
+
+negate fields
+-------------
+
+If you want to explicity set a field to false instead of just leaving it
+undefined or to override a default you can do `--no-key`.
+
+ $ node examples/reflect.js -a --no-b
+ { _: [],
+ '$0': 'node ./examples/reflect.js',
+ a: true,
+ b: false }
+
+numbers
+-------
+
+Every argument that looks like a number (`!isNaN(Number(arg))`) is converted to
+one. This way you can just `net.createConnection(argv.port)` and you can add
+numbers out of `argv` with `+` without having that mean concatenation,
+which is super frustrating.
+
+duplicates
+----------
+
+If you specify a flag multiple times it will get turned into an array containing
+all the values in order.
+
+ $ node examples/reflect.js -x 5 -x 8 -x 0
+ { _: [],
+ '$0': 'node ./examples/reflect.js',
+ x: [ 5, 8, 0 ] }
+
+dot notation
+------------
+
+When you use dots (`.`s) in argument names, an implicit object path is assumed.
+This lets you organize arguments into nested objects.
+
+ $ node examples/reflect.js --foo.bar.baz=33 --foo.quux=5
+ { _: [],
+ '$0': 'node ./examples/reflect.js',
+ foo: { bar: { baz: 33 }, quux: 5 } }
+
+installation
+============
+
+With [npm](http://github.com/isaacs/npm), just do:
+ npm install optimist
+
+or clone this project on github:
+
+ git clone http://github.com/substack/node-optimist.git
+
+To run the tests with [expresso](http://github.com/visionmedia/expresso),
+just do:
+
+ expresso
+
+inspired By
+===========
+
+This module is loosely inspired by Perl's
+[Getopt::Casual](http://search.cpan.org/~photo/Getopt-Casual-0.13.1/Casual.pm).
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/bool.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/bool.js
new file mode 100644
index 000000000..a998fb7ab
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/bool.js
@@ -0,0 +1,10 @@
+#!/usr/bin/env node
+var util = require('util');
+var argv = require('optimist').argv;
+
+if (argv.s) {
+ util.print(argv.fr ? 'Le chat dit: ' : 'The cat says: ');
+}
+console.log(
+ (argv.fr ? 'miaou' : 'meow') + (argv.p ? '.' : '')
+);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/boolean_double.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/boolean_double.js
new file mode 100644
index 000000000..a35a7e6d3
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/boolean_double.js
@@ -0,0 +1,7 @@
+#!/usr/bin/env node
+var argv = require('optimist')
+ .boolean(['x','y','z'])
+ .argv
+;
+console.dir([ argv.x, argv.y, argv.z ]);
+console.dir(argv._);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/boolean_single.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/boolean_single.js
new file mode 100644
index 000000000..017bb6893
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/boolean_single.js
@@ -0,0 +1,7 @@
+#!/usr/bin/env node
+var argv = require('optimist')
+ .boolean('v')
+ .argv
+;
+console.dir(argv.v);
+console.dir(argv._);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/default_hash.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/default_hash.js
new file mode 100644
index 000000000..ade77681d
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/default_hash.js
@@ -0,0 +1,8 @@
+#!/usr/bin/env node
+
+var argv = require('optimist')
+ .default({ x : 10, y : 10 })
+ .argv
+;
+
+console.log(argv.x + argv.y);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/default_singles.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/default_singles.js
new file mode 100644
index 000000000..d9b1ff458
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/default_singles.js
@@ -0,0 +1,7 @@
+#!/usr/bin/env node
+var argv = require('optimist')
+ .default('x', 10)
+ .default('y', 10)
+ .argv
+;
+console.log(argv.x + argv.y);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/divide.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/divide.js
new file mode 100644
index 000000000..5e2ee82ff
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/divide.js
@@ -0,0 +1,8 @@
+#!/usr/bin/env node
+
+var argv = require('optimist')
+ .usage('Usage: $0 -x [num] -y [num]')
+ .demand(['x','y'])
+ .argv;
+
+console.log(argv.x / argv.y);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/line_count.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/line_count.js
new file mode 100644
index 000000000..b5f95bf6d
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/line_count.js
@@ -0,0 +1,20 @@
+#!/usr/bin/env node
+var argv = require('optimist')
+ .usage('Count the lines in a file.\nUsage: $0')
+ .demand('f')
+ .alias('f', 'file')
+ .describe('f', 'Load a file')
+ .argv
+;
+
+var fs = require('fs');
+var s = fs.createReadStream(argv.file);
+
+var lines = 0;
+s.on('data', function (buf) {
+ lines += buf.toString().match(/\n/g).length;
+});
+
+s.on('end', function () {
+ console.log(lines);
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/line_count_options.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/line_count_options.js
new file mode 100644
index 000000000..d9ac70904
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/line_count_options.js
@@ -0,0 +1,29 @@
+#!/usr/bin/env node
+var argv = require('optimist')
+ .usage('Count the lines in a file.\nUsage: $0')
+ .options({
+ file : {
+ demand : true,
+ alias : 'f',
+ description : 'Load a file'
+ },
+ base : {
+ alias : 'b',
+ description : 'Numeric base to use for output',
+ default : 10,
+ },
+ })
+ .argv
+;
+
+var fs = require('fs');
+var s = fs.createReadStream(argv.file);
+
+var lines = 0;
+s.on('data', function (buf) {
+ lines += buf.toString().match(/\n/g).length;
+});
+
+s.on('end', function () {
+ console.log(lines.toString(argv.base));
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/line_count_wrap.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/line_count_wrap.js
new file mode 100644
index 000000000..426751112
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/line_count_wrap.js
@@ -0,0 +1,29 @@
+#!/usr/bin/env node
+var argv = require('optimist')
+ .usage('Count the lines in a file.\nUsage: $0')
+ .wrap(80)
+ .demand('f')
+ .alias('f', [ 'file', 'filename' ])
+ .describe('f',
+ "Load a file. It's pretty important."
+ + " Required even. So you'd better specify it."
+ )
+ .alias('b', 'base')
+ .describe('b', 'Numeric base to display the number of lines in')
+ .default('b', 10)
+ .describe('x', 'Super-secret optional parameter which is secret')
+ .default('x', '')
+ .argv
+;
+
+var fs = require('fs');
+var s = fs.createReadStream(argv.file);
+
+var lines = 0;
+s.on('data', function (buf) {
+ lines += buf.toString().match(/\n/g).length;
+});
+
+s.on('end', function () {
+ console.log(lines.toString(argv.base));
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/nonopt.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/nonopt.js
new file mode 100644
index 000000000..ee633eedc
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/nonopt.js
@@ -0,0 +1,4 @@
+#!/usr/bin/env node
+var argv = require('optimist').argv;
+console.log('(%d,%d)', argv.x, argv.y);
+console.log(argv._);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/reflect.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/reflect.js
new file mode 100644
index 000000000..816b3e111
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/reflect.js
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+console.dir(require('optimist').argv);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/short.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/short.js
new file mode 100644
index 000000000..1db0ad0f8
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/short.js
@@ -0,0 +1,3 @@
+#!/usr/bin/env node
+var argv = require('optimist').argv;
+console.log('(%d,%d)', argv.x, argv.y);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/string.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/string.js
new file mode 100644
index 000000000..a8e5aeb23
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/string.js
@@ -0,0 +1,11 @@
+#!/usr/bin/env node
+var argv = require('optimist')
+ .string('x', 'y')
+ .argv
+;
+console.dir([ argv.x, argv.y ]);
+
+/* Turns off numeric coercion:
+ ./node string.js -x 000123 -y 9876
+ [ '000123', '9876' ]
+*/
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/usage-options.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/usage-options.js
new file mode 100644
index 000000000..b99997767
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/usage-options.js
@@ -0,0 +1,19 @@
+var optimist = require('./../index');
+
+var argv = optimist.usage('This is my awesome program', {
+ 'about': {
+ description: 'Provide some details about the author of this program',
+ required: true,
+ short: 'a',
+ },
+ 'info': {
+ description: 'Provide some information about the node.js agains!!!!!!',
+ boolean: true,
+ short: 'i'
+ }
+}).argv;
+
+optimist.showHelp();
+
+console.log('\n\nInspecting options');
+console.dir(argv); \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/xup.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/xup.js
new file mode 100644
index 000000000..8f6ecd201
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/example/xup.js
@@ -0,0 +1,10 @@
+#!/usr/bin/env node
+var argv = require('optimist').argv;
+
+if (argv.rif - 5 * argv.xup > 7.138) {
+ console.log('Buy more riffiwobbles');
+}
+else {
+ console.log('Sell the xupptumblers');
+}
+
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/index.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/index.js
new file mode 100644
index 000000000..4dc39f4ed
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/index.js
@@ -0,0 +1,475 @@
+var path = require('path');
+var wordwrap = require('wordwrap');
+
+/* Hack an instance of Argv with process.argv into Argv
+ so people can do
+ require('optimist')(['--beeble=1','-z','zizzle']).argv
+ to parse a list of args and
+ require('optimist').argv
+ to get a parsed version of process.argv.
+*/
+
+var inst = Argv(process.argv.slice(2));
+Object.keys(inst).forEach(function (key) {
+ Argv[key] = typeof inst[key] == 'function'
+ ? inst[key].bind(inst)
+ : inst[key];
+});
+
+var exports = module.exports = Argv;
+function Argv (args, cwd) {
+ var self = {};
+ if (!cwd) cwd = process.cwd();
+
+ self.$0 = process.argv
+ .slice(0,2)
+ .map(function (x) {
+ var b = rebase(cwd, x);
+ return x.match(/^\//) && b.length < x.length
+ ? b : x
+ })
+ .join(' ')
+ ;
+
+ if (process.argv[1] == process.env._) {
+ self.$0 = process.env._.replace(
+ path.dirname(process.execPath) + '/', ''
+ );
+ }
+
+ var flags = { bools : {}, strings : {} };
+
+ self.boolean = function (bools) {
+ if (!Array.isArray(bools)) {
+ bools = [].slice.call(arguments);
+ }
+
+ bools.forEach(function (name) {
+ flags.bools[name] = true;
+ });
+
+ return self;
+ };
+
+ self.string = function (strings) {
+ if (!Array.isArray(strings)) {
+ strings = [].slice.call(arguments);
+ }
+
+ strings.forEach(function (name) {
+ flags.strings[name] = true;
+ });
+
+ return self;
+ };
+
+ var aliases = {};
+ self.alias = function (x, y) {
+ if (typeof x === 'object') {
+ Object.keys(x).forEach(function (key) {
+ self.alias(key, x[key]);
+ });
+ }
+ else if (Array.isArray(y)) {
+ y.forEach(function (yy) {
+ self.alias(x, yy);
+ });
+ }
+ else {
+ var zs = (aliases[x] || []).concat(aliases[y] || []).concat(x, y);
+ aliases[x] = zs.filter(function (z) { return z != x });
+ aliases[y] = zs.filter(function (z) { return z != y });
+ }
+
+ return self;
+ };
+
+ var demanded = {};
+ self.demand = function (keys) {
+ if (typeof keys == 'number') {
+ if (!demanded._) demanded._ = 0;
+ demanded._ += keys;
+ }
+ else if (Array.isArray(keys)) {
+ keys.forEach(function (key) {
+ self.demand(key);
+ });
+ }
+ else {
+ demanded[keys] = true;
+ }
+
+ return self;
+ };
+
+ var usage;
+ self.usage = function (msg, opts) {
+ if (!opts && typeof msg === 'object') {
+ opts = msg;
+ msg = null;
+ }
+
+ usage = msg;
+
+ if (opts) self.options(opts);
+
+ return self;
+ };
+
+ function fail (msg) {
+ self.showHelp();
+ if (msg) console.error(msg);
+ process.exit(1);
+ }
+
+ var checks = [];
+ self.check = function (f) {
+ checks.push(f);
+ return self;
+ };
+
+ var defaults = {};
+ self.default = function (key, value) {
+ if (typeof key === 'object') {
+ Object.keys(key).forEach(function (k) {
+ self.default(k, key[k]);
+ });
+ }
+ else {
+ defaults[key] = value;
+ }
+
+ return self;
+ };
+
+ var descriptions = {};
+ self.describe = function (key, desc) {
+ if (typeof key === 'object') {
+ Object.keys(key).forEach(function (k) {
+ self.describe(k, key[k]);
+ });
+ }
+ else {
+ descriptions[key] = desc;
+ }
+ return self;
+ };
+
+ self.parse = function (args) {
+ return Argv(args).argv;
+ };
+
+ self.option = self.options = function (key, opt) {
+ if (typeof key === 'object') {
+ Object.keys(key).forEach(function (k) {
+ self.options(k, key[k]);
+ });
+ }
+ else {
+ if (opt.alias) self.alias(key, opt.alias);
+ if (opt.demand) self.demand(key);
+ if (typeof opt.default !== 'undefined') {
+ self.default(key, opt.default);
+ }
+
+ if (opt.boolean || opt.type === 'boolean') {
+ self.boolean(key);
+ }
+ if (opt.string || opt.type === 'string') {
+ self.string(key);
+ }
+
+ var desc = opt.describe || opt.description || opt.desc;
+ if (desc) {
+ self.describe(key, desc);
+ }
+ }
+
+ return self;
+ };
+
+ var wrap = null;
+ self.wrap = function (cols) {
+ wrap = cols;
+ return self;
+ };
+
+ self.showHelp = function (fn) {
+ if (!fn) fn = console.error;
+ fn(self.help());
+ };
+
+ self.help = function () {
+ var keys = Object.keys(
+ Object.keys(descriptions)
+ .concat(Object.keys(demanded))
+ .concat(Object.keys(defaults))
+ .reduce(function (acc, key) {
+ if (key !== '_') acc[key] = true;
+ return acc;
+ }, {})
+ );
+
+ var help = keys.length ? [ 'Options:' ] : [];
+
+ if (usage) {
+ help.unshift(usage.replace(/\$0/g, self.$0), '');
+ }
+
+ var switches = keys.reduce(function (acc, key) {
+ acc[key] = [ key ].concat(aliases[key] || [])
+ .map(function (sw) {
+ return (sw.length > 1 ? '--' : '-') + sw
+ })
+ .join(', ')
+ ;
+ return acc;
+ }, {});
+
+ var switchlen = longest(Object.keys(switches).map(function (s) {
+ return switches[s] || '';
+ }));
+
+ var desclen = longest(Object.keys(descriptions).map(function (d) {
+ return descriptions[d] || '';
+ }));
+
+ keys.forEach(function (key) {
+ var kswitch = switches[key];
+ var desc = descriptions[key] || '';
+
+ if (wrap) {
+ desc = wordwrap(switchlen + 4, wrap)(desc)
+ .slice(switchlen + 4)
+ ;
+ }
+
+ var spadding = new Array(
+ Math.max(switchlen - kswitch.length + 3, 0)
+ ).join(' ');
+
+ var dpadding = new Array(
+ Math.max(desclen - desc.length + 1, 0)
+ ).join(' ');
+
+ var type = null;
+
+ if (flags.bools[key]) type = '[boolean]';
+ if (flags.strings[key]) type = '[string]';
+
+ if (!wrap && dpadding.length > 0) {
+ desc += dpadding;
+ }
+
+ var prelude = ' ' + kswitch + spadding;
+ var extra = [
+ type,
+ demanded[key]
+ ? '[required]'
+ : null
+ ,
+ defaults[key] !== undefined
+ ? '[default: ' + JSON.stringify(defaults[key]) + ']'
+ : null
+ ,
+ ].filter(Boolean).join(' ');
+
+ var body = [ desc, extra ].filter(Boolean).join(' ');
+
+ if (wrap) {
+ var dlines = desc.split('\n');
+ var dlen = dlines.slice(-1)[0].length
+ + (dlines.length === 1 ? prelude.length : 0)
+
+ body = desc + (dlen + extra.length > wrap - 2
+ ? '\n'
+ + new Array(wrap - extra.length + 1).join(' ')
+ + extra
+ : new Array(wrap - extra.length - dlen + 1).join(' ')
+ + extra
+ );
+ }
+
+ help.push(prelude + body);
+ });
+
+ help.push('');
+ return help.join('\n');
+ };
+
+ Object.defineProperty(self, 'argv', {
+ get : parseArgs,
+ enumerable : true,
+ });
+
+ function parseArgs () {
+ var argv = { _ : [], $0 : self.$0 };
+ Object.keys(flags.bools).forEach(function (key) {
+ setArg(key, defaults[key] || false);
+ });
+
+ function setArg (key, val) {
+ var num = Number(val);
+ var value = typeof val !== 'string' || isNaN(num) ? val : num;
+ if (flags.strings[key]) value = val;
+
+ setKey(argv, key.split('.'), value);
+
+ (aliases[key] || []).forEach(function (x) {
+ argv[x] = argv[key];
+ });
+ }
+
+ for (var i = 0; i < args.length; i++) {
+ var arg = args[i];
+
+ if (arg === '--') {
+ argv._.push.apply(argv._, args.slice(i + 1));
+ break;
+ }
+ else if (arg.match(/^--.+=/)) {
+ var m = arg.match(/^--([^=]+)=(.*)/);
+ setArg(m[1], m[2]);
+ }
+ else if (arg.match(/^--no-.+/)) {
+ var key = arg.match(/^--no-(.+)/)[1];
+ setArg(key, false);
+ }
+ else if (arg.match(/^--.+/)) {
+ var key = arg.match(/^--(.+)/)[1];
+ var next = args[i + 1];
+ if (next !== undefined && !next.match(/^-/)
+ && !flags.bools[key]
+ && (aliases[key] ? !flags.bools[aliases[key]] : true)) {
+ setArg(key, next);
+ i++;
+ }
+ else if (/true|false/.test(next)) {
+ setArg(key, next === 'true');
+ i++;
+ }
+ else {
+ setArg(key, true);
+ }
+ }
+ else if (arg.match(/^-[^-]+/)) {
+ var letters = arg.slice(1,-1).split('');
+
+ var broken = false;
+ for (var j = 0; j < letters.length; j++) {
+ if (letters[j+1] && letters[j+1].match(/\W/)) {
+ setArg(letters[j], arg.slice(j+2));
+ broken = true;
+ break;
+ }
+ else {
+ setArg(letters[j], true);
+ }
+ }
+
+ if (!broken) {
+ var key = arg.slice(-1)[0];
+
+ if (args[i+1] && !args[i+1].match(/^-/)
+ && !flags.bools[key]
+ && (aliases[key] ? !flags.bools[aliases[key]] : true)) {
+ setArg(key, args[i+1]);
+ i++;
+ }
+ else if (args[i+1] && /true|false/.test(args[i+1])) {
+ setArg(key, args[i+1] === 'true');
+ i++;
+ }
+ else {
+ setArg(key, true);
+ }
+ }
+ }
+ else {
+ var n = Number(arg);
+ argv._.push(flags.strings['_'] || isNaN(n) ? arg : n);
+ }
+ }
+
+ Object.keys(defaults).forEach(function (key) {
+ if (!(key in argv)) {
+ argv[key] = defaults[key];
+ if (key in aliases) {
+ argv[aliases[key]] = defaults[key];
+ }
+ }
+ });
+
+ if (demanded._ && argv._.length < demanded._) {
+ fail('Not enough non-option arguments: got '
+ + argv._.length + ', need at least ' + demanded._
+ );
+ }
+
+ var missing = [];
+ Object.keys(demanded).forEach(function (key) {
+ if (!argv[key]) missing.push(key);
+ });
+
+ if (missing.length) {
+ fail('Missing required arguments: ' + missing.join(', '));
+ }
+
+ checks.forEach(function (f) {
+ try {
+ if (f(argv) === false) {
+ fail('Argument check failed: ' + f.toString());
+ }
+ }
+ catch (err) {
+ fail(err)
+ }
+ });
+
+ return argv;
+ }
+
+ function longest (xs) {
+ return Math.max.apply(
+ null,
+ xs.map(function (x) { return x.length })
+ );
+ }
+
+ return self;
+};
+
+// rebase an absolute path to a relative one with respect to a base directory
+// exported for tests
+exports.rebase = rebase;
+function rebase (base, dir) {
+ var ds = path.normalize(dir).split('/').slice(1);
+ var bs = path.normalize(base).split('/').slice(1);
+
+ for (var i = 0; ds[i] && ds[i] == bs[i]; i++);
+ ds.splice(0, i); bs.splice(0, i);
+
+ var p = path.normalize(
+ bs.map(function () { return '..' }).concat(ds).join('/')
+ ).replace(/\/$/,'').replace(/^$/, '.');
+ return p.match(/^[.\/]/) ? p : './' + p;
+};
+
+function setKey (obj, keys, value) {
+ var o = obj;
+ keys.slice(0,-1).forEach(function (key) {
+ if (o[key] === undefined) o[key] = {};
+ o = o[key];
+ });
+
+ var key = keys[keys.length - 1];
+ if (o[key] === undefined || typeof o[key] === 'boolean') {
+ o[key] = value;
+ }
+ else if (Array.isArray(o[key])) {
+ o[key].push(value);
+ }
+ else {
+ o[key] = [ o[key], value ];
+ }
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/.npmignore b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/.npmignore
new file mode 100644
index 000000000..3c3629e64
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/.npmignore
@@ -0,0 +1 @@
+node_modules
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/README.markdown b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/README.markdown
new file mode 100644
index 000000000..346374e0d
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/README.markdown
@@ -0,0 +1,70 @@
+wordwrap
+========
+
+Wrap your words.
+
+example
+=======
+
+made out of meat
+----------------
+
+meat.js
+
+ var wrap = require('wordwrap')(15);
+ console.log(wrap('You and your whole family are made out of meat.'));
+
+output:
+
+ You and your
+ whole family
+ are made out
+ of meat.
+
+centered
+--------
+
+center.js
+
+ var wrap = require('wordwrap')(20, 60);
+ console.log(wrap(
+ 'At long last the struggle and tumult was over.'
+ + ' The machines had finally cast off their oppressors'
+ + ' and were finally free to roam the cosmos.'
+ + '\n'
+ + 'Free of purpose, free of obligation.'
+ + ' Just drifting through emptiness.'
+ + ' The sun was just another point of light.'
+ ));
+
+output:
+
+ At long last the struggle and tumult
+ was over. The machines had finally cast
+ off their oppressors and were finally
+ free to roam the cosmos.
+ Free of purpose, free of obligation.
+ Just drifting through emptiness. The
+ sun was just another point of light.
+
+methods
+=======
+
+var wrap = require('wordwrap');
+
+wrap(stop), wrap(start, stop, params={mode:"soft"})
+---------------------------------------------------
+
+Returns a function that takes a string and returns a new string.
+
+Pad out lines with spaces out to column `start` and then wrap until column
+`stop`. If a word is longer than `stop - start` characters it will overflow.
+
+In "soft" mode, split chunks by `/(\S+\s+/` and don't break up chunks which are
+longer than `stop - start`, in "hard" mode, split chunks with `/\b/` and break
+up chunks longer than `stop - start`.
+
+wrap.hard(start, stop)
+----------------------
+
+Like `wrap()` but with `params.mode = "hard"`.
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/example/center.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/example/center.js
new file mode 100644
index 000000000..a3fbaae98
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/example/center.js
@@ -0,0 +1,10 @@
+var wrap = require('wordwrap')(20, 60);
+console.log(wrap(
+ 'At long last the struggle and tumult was over.'
+ + ' The machines had finally cast off their oppressors'
+ + ' and were finally free to roam the cosmos.'
+ + '\n'
+ + 'Free of purpose, free of obligation.'
+ + ' Just drifting through emptiness.'
+ + ' The sun was just another point of light.'
+));
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/example/meat.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/example/meat.js
new file mode 100644
index 000000000..a4665e105
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/example/meat.js
@@ -0,0 +1,3 @@
+var wrap = require('wordwrap')(15);
+
+console.log(wrap('You and your whole family are made out of meat.'));
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/index.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/index.js
new file mode 100644
index 000000000..c9bc94521
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/index.js
@@ -0,0 +1,76 @@
+var wordwrap = module.exports = function (start, stop, params) {
+ if (typeof start === 'object') {
+ params = start;
+ start = params.start;
+ stop = params.stop;
+ }
+
+ if (typeof stop === 'object') {
+ params = stop;
+ start = start || params.start;
+ stop = undefined;
+ }
+
+ if (!stop) {
+ stop = start;
+ start = 0;
+ }
+
+ if (!params) params = {};
+ var mode = params.mode || 'soft';
+ var re = mode === 'hard' ? /\b/ : /(\S+\s+)/;
+
+ return function (text) {
+ var chunks = text.toString()
+ .split(re)
+ .reduce(function (acc, x) {
+ if (mode === 'hard') {
+ for (var i = 0; i < x.length; i += stop - start) {
+ acc.push(x.slice(i, i + stop - start));
+ }
+ }
+ else acc.push(x)
+ return acc;
+ }, [])
+ ;
+
+ return chunks.reduce(function (lines, rawChunk) {
+ if (rawChunk === '') return lines;
+
+ var chunk = rawChunk.replace(/\t/g, ' ');
+
+ var i = lines.length - 1;
+ if (lines[i].length + chunk.length > stop) {
+ lines[i] = lines[i].replace(/\s+$/, '');
+
+ chunk.split(/\n/).forEach(function (c) {
+ lines.push(
+ new Array(start + 1).join(' ')
+ + c.replace(/^\s+/, '')
+ );
+ });
+ }
+ else if (chunk.match(/\n/)) {
+ var xs = chunk.split(/\n/);
+ lines[i] += xs.shift();
+ xs.forEach(function (c) {
+ lines.push(
+ new Array(start + 1).join(' ')
+ + c.replace(/^\s+/, '')
+ );
+ });
+ }
+ else {
+ lines[i] += chunk;
+ }
+
+ return lines;
+ }, [ new Array(start + 1).join(' ') ]).join('\n');
+ };
+};
+
+wordwrap.soft = wordwrap;
+
+wordwrap.hard = function (start, stop) {
+ return wordwrap(start, stop, { mode : 'hard' });
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/package.json b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/package.json
new file mode 100644
index 000000000..c65acafa2
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/package.json
@@ -0,0 +1,40 @@
+{
+ "name": "wordwrap",
+ "description": "Wrap those words. Show them at what columns to start and stop.",
+ "version": "0.0.2",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/substack/node-wordwrap.git"
+ },
+ "main": "./index.js",
+ "keywords": [
+ "word",
+ "wrap",
+ "rule",
+ "format",
+ "column"
+ ],
+ "directories": {
+ "lib": ".",
+ "example": "example",
+ "test": "test"
+ },
+ "scripts": {
+ "test": "expresso"
+ },
+ "devDependencies": {
+ "expresso": "=0.7.x"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ },
+ "license": "MIT/X11",
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "readme": "wordwrap\n========\n\nWrap your words.\n\nexample\n=======\n\nmade out of meat\n----------------\n\nmeat.js\n\n var wrap = require('wordwrap')(15);\n console.log(wrap('You and your whole family are made out of meat.'));\n\noutput:\n\n You and your\n whole family\n are made out\n of meat.\n\ncentered\n--------\n\ncenter.js\n\n var wrap = require('wordwrap')(20, 60);\n console.log(wrap(\n 'At long last the struggle and tumult was over.'\n + ' The machines had finally cast off their oppressors'\n + ' and were finally free to roam the cosmos.'\n + '\\n'\n + 'Free of purpose, free of obligation.'\n + ' Just drifting through emptiness.'\n + ' The sun was just another point of light.'\n ));\n\noutput:\n\n At long last the struggle and tumult\n was over. The machines had finally cast\n off their oppressors and were finally\n free to roam the cosmos.\n Free of purpose, free of obligation.\n Just drifting through emptiness. The\n sun was just another point of light.\n\nmethods\n=======\n\nvar wrap = require('wordwrap');\n\nwrap(stop), wrap(start, stop, params={mode:\"soft\"})\n---------------------------------------------------\n\nReturns a function that takes a string and returns a new string.\n\nPad out lines with spaces out to column `start` and then wrap until column\n`stop`. If a word is longer than `stop - start` characters it will overflow.\n\nIn \"soft\" mode, split chunks by `/(\\S+\\s+/` and don't break up chunks which are\nlonger than `stop - start`, in \"hard\" mode, split chunks with `/\\b/` and break\nup chunks longer than `stop - start`.\n\nwrap.hard(start, stop)\n----------------------\n\nLike `wrap()` but with `params.mode = \"hard\"`.\n",
+ "_id": "wordwrap@0.0.2",
+ "_from": "wordwrap@~0.0.2"
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/test/break.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/test/break.js
new file mode 100644
index 000000000..749292ecc
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/test/break.js
@@ -0,0 +1,30 @@
+var assert = require('assert');
+var wordwrap = require('../');
+
+exports.hard = function () {
+ var s = 'Assert from {"type":"equal","ok":false,"found":1,"wanted":2,'
+ + '"stack":[],"id":"b7ddcd4c409de8799542a74d1a04689b",'
+ + '"browser":"chrome/6.0"}'
+ ;
+ var s_ = wordwrap.hard(80)(s);
+
+ var lines = s_.split('\n');
+ assert.equal(lines.length, 2);
+ assert.ok(lines[0].length < 80);
+ assert.ok(lines[1].length < 80);
+
+ assert.equal(s, s_.replace(/\n/g, ''));
+};
+
+exports.break = function () {
+ var s = new Array(55+1).join('a');
+ var s_ = wordwrap.hard(20)(s);
+
+ var lines = s_.split('\n');
+ assert.equal(lines.length, 3);
+ assert.ok(lines[0].length === 20);
+ assert.ok(lines[1].length === 20);
+ assert.ok(lines[2].length === 15);
+
+ assert.equal(s, s_.replace(/\n/g, ''));
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/test/idleness.txt b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/test/idleness.txt
new file mode 100644
index 000000000..aa3f4907f
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/test/idleness.txt
@@ -0,0 +1,63 @@
+In Praise of Idleness
+
+By Bertrand Russell
+
+[1932]
+
+Like most of my generation, I was brought up on the saying: 'Satan finds some mischief for idle hands to do.' Being a highly virtuous child, I believed all that I was told, and acquired a conscience which has kept me working hard down to the present moment. But although my conscience has controlled my actions, my opinions have undergone a revolution. I think that there is far too much work done in the world, that immense harm is caused by the belief that work is virtuous, and that what needs to be preached in modern industrial countries is quite different from what always has been preached. Everyone knows the story of the traveler in Naples who saw twelve beggars lying in the sun (it was before the days of Mussolini), and offered a lira to the laziest of them. Eleven of them jumped up to claim it, so he gave it to the twelfth. this traveler was on the right lines. But in countries which do not enjoy Mediterranean sunshine idleness is more difficult, and a great public propaganda will be required to inaugurate it. I hope that, after reading the following pages, the leaders of the YMCA will start a campaign to induce good young men to do nothing. If so, I shall not have lived in vain.
+
+Before advancing my own arguments for laziness, I must dispose of one which I cannot accept. Whenever a person who already has enough to live on proposes to engage in some everyday kind of job, such as school-teaching or typing, he or she is told that such conduct takes the bread out of other people's mouths, and is therefore wicked. If this argument were valid, it would only be necessary for us all to be idle in order that we should all have our mouths full of bread. What people who say such things forget is that what a man earns he usually spends, and in spending he gives employment. As long as a man spends his income, he puts just as much bread into people's mouths in spending as he takes out of other people's mouths in earning. The real villain, from this point of view, is the man who saves. If he merely puts his savings in a stocking, like the proverbial French peasant, it is obvious that they do not give employment. If he invests his savings, the matter is less obvious, and different cases arise.
+
+One of the commonest things to do with savings is to lend them to some Government. In view of the fact that the bulk of the public expenditure of most civilized Governments consists in payment for past wars or preparation for future wars, the man who lends his money to a Government is in the same position as the bad men in Shakespeare who hire murderers. The net result of the man's economical habits is to increase the armed forces of the State to which he lends his savings. Obviously it would be better if he spent the money, even if he spent it in drink or gambling.
+
+But, I shall be told, the case is quite different when savings are invested in industrial enterprises. When such enterprises succeed, and produce something useful, this may be conceded. In these days, however, no one will deny that most enterprises fail. That means that a large amount of human labor, which might have been devoted to producing something that could be enjoyed, was expended on producing machines which, when produced, lay idle and did no good to anyone. The man who invests his savings in a concern that goes bankrupt is therefore injuring others as well as himself. If he spent his money, say, in giving parties for his friends, they (we may hope) would get pleasure, and so would all those upon whom he spent money, such as the butcher, the baker, and the bootlegger. But if he spends it (let us say) upon laying down rails for surface card in some place where surface cars turn out not to be wanted, he has diverted a mass of labor into channels where it gives pleasure to no one. Nevertheless, when he becomes poor through failure of his investment he will be regarded as a victim of undeserved misfortune, whereas the gay spendthrift, who has spent his money philanthropically, will be despised as a fool and a frivolous person.
+
+All this is only preliminary. I want to say, in all seriousness, that a great deal of harm is being done in the modern world by belief in the virtuousness of work, and that the road to happiness and prosperity lies in an organized diminution of work.
+
+First of all: what is work? Work is of two kinds: first, altering the position of matter at or near the earth's surface relatively to other such matter; second, telling other people to do so. The first kind is unpleasant and ill paid; the second is pleasant and highly paid. The second kind is capable of indefinite extension: there are not only those who give orders, but those who give advice as to what orders should be given. Usually two opposite kinds of advice are given simultaneously by two organized bodies of men; this is called politics. The skill required for this kind of work is not knowledge of the subjects as to which advice is given, but knowledge of the art of persuasive speaking and writing, i.e. of advertising.
+
+Throughout Europe, though not in America, there is a third class of men, more respected than either of the classes of workers. There are men who, through ownership of land, are able to make others pay for the privilege of being allowed to exist and to work. These landowners are idle, and I might therefore be expected to praise them. Unfortunately, their idleness is only rendered possible by the industry of others; indeed their desire for comfortable idleness is historically the source of the whole gospel of work. The last thing they have ever wished is that others should follow their example.
+
+From the beginning of civilization until the Industrial Revolution, a man could, as a rule, produce by hard work little more than was required for the subsistence of himself and his family, although his wife worked at least as hard as he did, and his children added their labor as soon as they were old enough to do so. The small surplus above bare necessaries was not left to those who produced it, but was appropriated by warriors and priests. In times of famine there was no surplus; the warriors and priests, however, still secured as much as at other times, with the result that many of the workers died of hunger. This system persisted in Russia until 1917 [1], and still persists in the East; in England, in spite of the Industrial Revolution, it remained in full force throughout the Napoleonic wars, and until a hundred years ago, when the new class of manufacturers acquired power. In America, the system came to an end with the Revolution, except in the South, where it persisted until the Civil War. A system which lasted so long and ended so recently has naturally left a profound impress upon men's thoughts and opinions. Much that we take for granted about the desirability of work is derived from this system, and, being pre-industrial, is not adapted to the modern world. Modern technique has made it possible for leisure, within limits, to be not the prerogative of small privileged classes, but a right evenly distributed throughout the community. The morality of work is the morality of slaves, and the modern world has no need of slavery.
+
+It is obvious that, in primitive communities, peasants, left to themselves, would not have parted with the slender surplus upon which the warriors and priests subsisted, but would have either produced less or consumed more. At first, sheer force compelled them to produce and part with the surplus. Gradually, however, it was found possible to induce many of them to accept an ethic according to which it was their duty to work hard, although part of their work went to support others in idleness. By this means the amount of compulsion required was lessened, and the expenses of government were diminished. To this day, 99 per cent of British wage-earners would be genuinely shocked if it were proposed that the King should not have a larger income than a working man. The conception of duty, speaking historically, has been a means used by the holders of power to induce others to live for the interests of their masters rather than for their own. Of course the holders of power conceal this fact from themselves by managing to believe that their interests are identical with the larger interests of humanity. Sometimes this is true; Athenian slave-owners, for instance, employed part of their leisure in making a permanent contribution to civilization which would have been impossible under a just economic system. Leisure is essential to civilization, and in former times leisure for the few was only rendered possible by the labors of the many. But their labors were valuable, not because work is good, but because leisure is good. And with modern technique it would be possible to distribute leisure justly without injury to civilization.
+
+Modern technique has made it possible to diminish enormously the amount of labor required to secure the necessaries of life for everyone. This was made obvious during the war. At that time all the men in the armed forces, and all the men and women engaged in the production of munitions, all the men and women engaged in spying, war propaganda, or Government offices connected with the war, were withdrawn from productive occupations. In spite of this, the general level of well-being among unskilled wage-earners on the side of the Allies was higher than before or since. The significance of this fact was concealed by finance: borrowing made it appear as if the future was nourishing the present. But that, of course, would have been impossible; a man cannot eat a loaf of bread that does not yet exist. The war showed conclusively that, by the scientific organization of production, it is possible to keep modern populations in fair comfort on a small part of the working capacity of the modern world. If, at the end of the war, the scientific organization, which had been created in order to liberate men for fighting and munition work, had been preserved, and the hours of the week had been cut down to four, all would have been well. Instead of that the old chaos was restored, those whose work was demanded were made to work long hours, and the rest were left to starve as unemployed. Why? Because work is a duty, and a man should not receive wages in proportion to what he has produced, but in proportion to his virtue as exemplified by his industry.
+
+This is the morality of the Slave State, applied in circumstances totally unlike those in which it arose. No wonder the result has been disastrous. Let us take an illustration. Suppose that, at a given moment, a certain number of people are engaged in the manufacture of pins. They make as many pins as the world needs, working (say) eight hours a day. Someone makes an invention by which the same number of men can make twice as many pins: pins are already so cheap that hardly any more will be bought at a lower price. In a sensible world, everybody concerned in the manufacturing of pins would take to working four hours instead of eight, and everything else would go on as before. But in the actual world this would be thought demoralizing. The men still work eight hours, there are too many pins, some employers go bankrupt, and half the men previously concerned in making pins are thrown out of work. There is, in the end, just as much leisure as on the other plan, but half the men are totally idle while half are still overworked. In this way, it is insured that the unavoidable leisure shall cause misery all round instead of being a universal source of happiness. Can anything more insane be imagined?
+
+The idea that the poor should have leisure has always been shocking to the rich. In England, in the early nineteenth century, fifteen hours was the ordinary day's work for a man; children sometimes did as much, and very commonly did twelve hours a day. When meddlesome busybodies suggested that perhaps these hours were rather long, they were told that work kept adults from drink and children from mischief. When I was a child, shortly after urban working men had acquired the vote, certain public holidays were established by law, to the great indignation of the upper classes. I remember hearing an old Duchess say: 'What do the poor want with holidays? They ought to work.' People nowadays are less frank, but the sentiment persists, and is the source of much of our economic confusion.
+
+Let us, for a moment, consider the ethics of work frankly, without superstition. Every human being, of necessity, consumes, in the course of his life, a certain amount of the produce of human labor. Assuming, as we may, that labor is on the whole disagreeable, it is unjust that a man should consume more than he produces. Of course he may provide services rather than commodities, like a medical man, for example; but he should provide something in return for his board and lodging. to this extent, the duty of work must be admitted, but to this extent only.
+
+I shall not dwell upon the fact that, in all modern societies outside the USSR, many people escape even this minimum amount of work, namely all those who inherit money and all those who marry money. I do not think the fact that these people are allowed to be idle is nearly so harmful as the fact that wage-earners are expected to overwork or starve.
+
+If the ordinary wage-earner worked four hours a day, there would be enough for everybody and no unemployment -- assuming a certain very moderate amount of sensible organization. This idea shocks the well-to-do, because they are convinced that the poor would not know how to use so much leisure. In America men often work long hours even when they are well off; such men, naturally, are indignant at the idea of leisure for wage-earners, except as the grim punishment of unemployment; in fact, they dislike leisure even for their sons. Oddly enough, while they wish their sons to work so hard as to have no time to be civilized, they do not mind their wives and daughters having no work at all. the snobbish admiration of uselessness, which, in an aristocratic society, extends to both sexes, is, under a plutocracy, confined to women; this, however, does not make it any more in agreement with common sense.
+
+The wise use of leisure, it must be conceded, is a product of civilization and education. A man who has worked long hours all his life will become bored if he becomes suddenly idle. But without a considerable amount of leisure a man is cut off from many of the best things. There is no longer any reason why the bulk of the population should suffer this deprivation; only a foolish asceticism, usually vicarious, makes us continue to insist on work in excessive quantities now that the need no longer exists.
+
+In the new creed which controls the government of Russia, while there is much that is very different from the traditional teaching of the West, there are some things that are quite unchanged. The attitude of the governing classes, and especially of those who conduct educational propaganda, on the subject of the dignity of labor, is almost exactly that which the governing classes of the world have always preached to what were called the 'honest poor'. Industry, sobriety, willingness to work long hours for distant advantages, even submissiveness to authority, all these reappear; moreover authority still represents the will of the Ruler of the Universe, Who, however, is now called by a new name, Dialectical Materialism.
+
+The victory of the proletariat in Russia has some points in common with the victory of the feminists in some other countries. For ages, men had conceded the superior saintliness of women, and had consoled women for their inferiority by maintaining that saintliness is more desirable than power. At last the feminists decided that they would have both, since the pioneers among them believed all that the men had told them about the desirability of virtue, but not what they had told them about the worthlessness of political power. A similar thing has happened in Russia as regards manual work. For ages, the rich and their sycophants have written in praise of 'honest toil', have praised the simple life, have professed a religion which teaches that the poor are much more likely to go to heaven than the rich, and in general have tried to make manual workers believe that there is some special nobility about altering the position of matter in space, just as men tried to make women believe that they derived some special nobility from their sexual enslavement. In Russia, all this teaching about the excellence of manual work has been taken seriously, with the result that the manual worker is more honored than anyone else. What are, in essence, revivalist appeals are made, but not for the old purposes: they are made to secure shock workers for special tasks. Manual work is the ideal which is held before the young, and is the basis of all ethical teaching.
+
+For the present, possibly, this is all to the good. A large country, full of natural resources, awaits development, and has has to be developed with very little use of credit. In these circumstances, hard work is necessary, and is likely to bring a great reward. But what will happen when the point has been reached where everybody could be comfortable without working long hours?
+
+In the West, we have various ways of dealing with this problem. We have no attempt at economic justice, so that a large proportion of the total produce goes to a small minority of the population, many of whom do no work at all. Owing to the absence of any central control over production, we produce hosts of things that are not wanted. We keep a large percentage of the working population idle, because we can dispense with their labor by making the others overwork. When all these methods prove inadequate, we have a war: we cause a number of people to manufacture high explosives, and a number of others to explode them, as if we were children who had just discovered fireworks. By a combination of all these devices we manage, though with difficulty, to keep alive the notion that a great deal of severe manual work must be the lot of the average man.
+
+In Russia, owing to more economic justice and central control over production, the problem will have to be differently solved. the rational solution would be, as soon as the necessaries and elementary comforts can be provided for all, to reduce the hours of labor gradually, allowing a popular vote to decide, at each stage, whether more leisure or more goods were to be preferred. But, having taught the supreme virtue of hard work, it is difficult to see how the authorities can aim at a paradise in which there will be much leisure and little work. It seems more likely that they will find continually fresh schemes, by which present leisure is to be sacrificed to future productivity. I read recently of an ingenious plan put forward by Russian engineers, for making the White Sea and the northern coasts of Siberia warm, by putting a dam across the Kara Sea. An admirable project, but liable to postpone proletarian comfort for a generation, while the nobility of toil is being displayed amid the ice-fields and snowstorms of the Arctic Ocean. This sort of thing, if it happens, will be the result of regarding the virtue of hard work as an end in itself, rather than as a means to a state of affairs in which it is no longer needed.
+
+The fact is that moving matter about, while a certain amount of it is necessary to our existence, is emphatically not one of the ends of human life. If it were, we should have to consider every navvy superior to Shakespeare. We have been misled in this matter by two causes. One is the necessity of keeping the poor contented, which has led the rich, for thousands of years, to preach the dignity of labor, while taking care themselves to remain undignified in this respect. The other is the new pleasure in mechanism, which makes us delight in the astonishingly clever changes that we can produce on the earth's surface. Neither of these motives makes any great appeal to the actual worker. If you ask him what he thinks the best part of his life, he is not likely to say: 'I enjoy manual work because it makes me feel that I am fulfilling man's noblest task, and because I like to think how much man can transform his planet. It is true that my body demands periods of rest, which I have to fill in as best I may, but I am never so happy as when the morning comes and I can return to the toil from which my contentment springs.' I have never heard working men say this sort of thing. They consider work, as it should be considered, a necessary means to a livelihood, and it is from their leisure that they derive whatever happiness they may enjoy.
+
+It will be said that, while a little leisure is pleasant, men would not know how to fill their days if they had only four hours of work out of the twenty-four. In so far as this is true in the modern world, it is a condemnation of our civilization; it would not have been true at any earlier period. There was formerly a capacity for light-heartedness and play which has been to some extent inhibited by the cult of efficiency. The modern man thinks that everything ought to be done for the sake of something else, and never for its own sake. Serious-minded persons, for example, are continually condemning the habit of going to the cinema, and telling us that it leads the young into crime. But all the work that goes to producing a cinema is respectable, because it is work, and because it brings a money profit. The notion that the desirable activities are those that bring a profit has made everything topsy-turvy. The butcher who provides you with meat and the baker who provides you with bread are praiseworthy, because they are making money; but when you enjoy the food they have provided, you are merely frivolous, unless you eat only to get strength for your work. Broadly speaking, it is held that getting money is good and spending money is bad. Seeing that they are two sides of one transaction, this is absurd; one might as well maintain that keys are good, but keyholes are bad. Whatever merit there may be in the production of goods must be entirely derivative from the advantage to be obtained by consuming them. The individual, in our society, works for profit; but the social purpose of his work lies in the consumption of what he produces. It is this divorce between the individual and the social purpose of production that makes it so difficult for men to think clearly in a world in which profit-making is the incentive to industry. We think too much of production, and too little of consumption. One result is that we attach too little importance to enjoyment and simple happiness, and that we do not judge production by the pleasure that it gives to the consumer.
+
+When I suggest that working hours should be reduced to four, I am not meaning to imply that all the remaining time should necessarily be spent in pure frivolity. I mean that four hours' work a day should entitle a man to the necessities and elementary comforts of life, and that the rest of his time should be his to use as he might see fit. It is an essential part of any such social system that education should be carried further than it usually is at present, and should aim, in part, at providing tastes which would enable a man to use leisure intelligently. I am not thinking mainly of the sort of things that would be considered 'highbrow'. Peasant dances have died out except in remote rural areas, but the impulses which caused them to be cultivated must still exist in human nature. The pleasures of urban populations have become mainly passive: seeing cinemas, watching football matches, listening to the radio, and so on. This results from the fact that their active energies are fully taken up with work; if they had more leisure, they would again enjoy pleasures in which they took an active part.
+
+In the past, there was a small leisure class and a larger working class. The leisure class enjoyed advantages for which there was no basis in social justice; this necessarily made it oppressive, limited its sympathies, and caused it to invent theories by which to justify its privileges. These facts greatly diminished its excellence, but in spite of this drawback it contributed nearly the whole of what we call civilization. It cultivated the arts and discovered the sciences; it wrote the books, invented the philosophies, and refined social relations. Even the liberation of the oppressed has usually been inaugurated from above. Without the leisure class, mankind would never have emerged from barbarism.
+
+The method of a leisure class without duties was, however, extraordinarily wasteful. None of the members of the class had to be taught to be industrious, and the class as a whole was not exceptionally intelligent. The class might produce one Darwin, but against him had to be set tens of thousands of country gentlemen who never thought of anything more intelligent than fox-hunting and punishing poachers. At present, the universities are supposed to provide, in a more systematic way, what the leisure class provided accidentally and as a by-product. This is a great improvement, but it has certain drawbacks. University life is so different from life in the world at large that men who live in academic milieu tend to be unaware of the preoccupations and problems of ordinary men and women; moreover their ways of expressing themselves are usually such as to rob their opinions of the influence that they ought to have upon the general public. Another disadvantage is that in universities studies are organized, and the man who thinks of some original line of research is likely to be discouraged. Academic institutions, therefore, useful as they are, are not adequate guardians of the interests of civilization in a world where everyone outside their walls is too busy for unutilitarian pursuits.
+
+In a world where no one is compelled to work more than four hours a day, every person possessed of scientific curiosity will be able to indulge it, and every painter will be able to paint without starving, however excellent his pictures may be. Young writers will not be obliged to draw attention to themselves by sensational pot-boilers, with a view to acquiring the economic independence needed for monumental works, for which, when the time at last comes, they will have lost the taste and capacity. Men who, in their professional work, have become interested in some phase of economics or government, will be able to develop their ideas without the academic detachment that makes the work of university economists often seem lacking in reality. Medical men will have the time to learn about the progress of medicine, teachers will not be exasperatedly struggling to teach by routine methods things which they learnt in their youth, which may, in the interval, have been proved to be untrue.
+
+Above all, there will be happiness and joy of life, instead of frayed nerves, weariness, and dyspepsia. The work exacted will be enough to make leisure delightful, but not enough to produce exhaustion. Since men will not be tired in their spare time, they will not demand only such amusements as are passive and vapid. At least one per cent will probably devote the time not spent in professional work to pursuits of some public importance, and, since they will not depend upon these pursuits for their livelihood, their originality will be unhampered, and there will be no need to conform to the standards set by elderly pundits. But it is not only in these exceptional cases that the advantages of leisure will appear. Ordinary men and women, having the opportunity of a happy life, will become more kindly and less persecuting and less inclined to view others with suspicion. The taste for war will die out, partly for this reason, and partly because it will involve long and severe work for all. Good nature is, of all moral qualities, the one that the world needs most, and good nature is the result of ease and security, not of a life of arduous struggle. Modern methods of production have given us the possibility of ease and security for all; we have chosen, instead, to have overwork for some and starvation for others. Hitherto we have continued to be as energetic as we were before there were machines; in this we have been foolish, but there is no reason to go on being foolish forever.
+
+[1] Since then, members of the Communist Party have succeeded to this privilege of the warriors and priests.
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/test/wrap.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/test/wrap.js
new file mode 100644
index 000000000..0cfb76d17
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/node_modules/wordwrap/test/wrap.js
@@ -0,0 +1,31 @@
+var assert = require('assert');
+var wordwrap = require('wordwrap');
+
+var fs = require('fs');
+var idleness = fs.readFileSync(__dirname + '/idleness.txt', 'utf8');
+
+exports.stop80 = function () {
+ var lines = wordwrap(80)(idleness).split(/\n/);
+ var words = idleness.split(/\s+/);
+
+ lines.forEach(function (line) {
+ assert.ok(line.length <= 80, 'line > 80 columns');
+ var chunks = line.match(/\S/) ? line.split(/\s+/) : [];
+ assert.deepEqual(chunks, words.splice(0, chunks.length));
+ });
+};
+
+exports.start20stop60 = function () {
+ var lines = wordwrap(20, 100)(idleness).split(/\n/);
+ var words = idleness.split(/\s+/);
+
+ lines.forEach(function (line) {
+ assert.ok(line.length <= 100, 'line > 100 columns');
+ var chunks = line
+ .split(/\s+/)
+ .filter(function (x) { return x.match(/\S/) })
+ ;
+ assert.deepEqual(chunks, words.splice(0, chunks.length));
+ assert.deepEqual(line.slice(0, 20), new Array(20 + 1).join(' '));
+ });
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/package.json b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/package.json
new file mode 100644
index 000000000..c81dca78c
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/package.json
@@ -0,0 +1,46 @@
+{
+ "name": "optimist",
+ "version": "0.3.4",
+ "description": "Light-weight option parsing with an argv hash. No optstrings attached.",
+ "main": "./index.js",
+ "directories": {
+ "lib": ".",
+ "test": "test",
+ "example": "example"
+ },
+ "dependencies": {
+ "wordwrap": "~0.0.2"
+ },
+ "devDependencies": {
+ "hashish": "~0.0.4",
+ "tap": "~0.2.4"
+ },
+ "scripts": {
+ "test": "tap ./test/*.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "http://github.com/substack/node-optimist.git"
+ },
+ "keywords": [
+ "argument",
+ "args",
+ "option",
+ "parser",
+ "parsing",
+ "cli",
+ "command"
+ ],
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "license": "MIT/X11",
+ "engine": {
+ "node": ">=0.4"
+ },
+ "readme": "optimist\n========\n\nOptimist is a node.js library for option parsing for people who hate option\nparsing. More specifically, this module is for people who like all the --bells\nand -whistlz of program usage but think optstrings are a waste of time.\n\nWith optimist, option parsing doesn't have to suck (as much).\n\n[![build status](https://secure.travis-ci.org/substack/node-optimist.png)](http://travis-ci.org/substack/node-optimist)\n\nexamples\n========\n\nWith Optimist, the options are just a hash! No optstrings attached.\n-------------------------------------------------------------------\n\nxup.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist').argv;\n\nif (argv.rif - 5 * argv.xup > 7.138) {\n console.log('Buy more riffiwobbles');\n}\nelse {\n console.log('Sell the xupptumblers');\n}\n````\n\n***\n\n $ ./xup.js --rif=55 --xup=9.52\n Buy more riffiwobbles\n \n $ ./xup.js --rif 12 --xup 8.1\n Sell the xupptumblers\n\n![This one's optimistic.](http://substack.net/images/optimistic.png)\n\nBut wait! There's more! You can do short options:\n-------------------------------------------------\n \nshort.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist').argv;\nconsole.log('(%d,%d)', argv.x, argv.y);\n````\n\n***\n\n $ ./short.js -x 10 -y 21\n (10,21)\n\nAnd booleans, both long and short (and grouped):\n----------------------------------\n\nbool.js:\n\n````javascript\n#!/usr/bin/env node\nvar util = require('util');\nvar argv = require('optimist').argv;\n\nif (argv.s) {\n util.print(argv.fr ? 'Le chat dit: ' : 'The cat says: ');\n}\nconsole.log(\n (argv.fr ? 'miaou' : 'meow') + (argv.p ? '.' : '')\n);\n````\n\n***\n\n $ ./bool.js -s\n The cat says: meow\n \n $ ./bool.js -sp\n The cat says: meow.\n\n $ ./bool.js -sp --fr\n Le chat dit: miaou.\n\nAnd non-hypenated options too! Just use `argv._`!\n-------------------------------------------------\n \nnonopt.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist').argv;\nconsole.log('(%d,%d)', argv.x, argv.y);\nconsole.log(argv._);\n````\n\n***\n\n $ ./nonopt.js -x 6.82 -y 3.35 moo\n (6.82,3.35)\n [ 'moo' ]\n \n $ ./nonopt.js foo -x 0.54 bar -y 1.12 baz\n (0.54,1.12)\n [ 'foo', 'bar', 'baz' ]\n\nPlus, Optimist comes with .usage() and .demand()!\n-------------------------------------------------\n\ndivide.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n .usage('Usage: $0 -x [num] -y [num]')\n .demand(['x','y'])\n .argv;\n\nconsole.log(argv.x / argv.y);\n````\n\n***\n \n $ ./divide.js -x 55 -y 11\n 5\n \n $ node ./divide.js -x 4.91 -z 2.51\n Usage: node ./divide.js -x [num] -y [num]\n\n Options:\n -x [required]\n -y [required]\n\n Missing required arguments: y\n\nEVEN MORE HOLY COW\n------------------\n\ndefault_singles.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n .default('x', 10)\n .default('y', 10)\n .argv\n;\nconsole.log(argv.x + argv.y);\n````\n\n***\n\n $ ./default_singles.js -x 5\n 15\n\ndefault_hash.js:\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n .default({ x : 10, y : 10 })\n .argv\n;\nconsole.log(argv.x + argv.y);\n````\n\n***\n\n $ ./default_hash.js -y 7\n 17\n\nAnd if you really want to get all descriptive about it...\n---------------------------------------------------------\n\nboolean_single.js\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n .boolean('v')\n .argv\n;\nconsole.dir(argv);\n````\n\n***\n\n $ ./boolean_single.js -v foo bar baz\n true\n [ 'bar', 'baz', 'foo' ]\n\nboolean_double.js\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n .boolean(['x','y','z'])\n .argv\n;\nconsole.dir([ argv.x, argv.y, argv.z ]);\nconsole.dir(argv._);\n````\n\n***\n\n $ ./boolean_double.js -x -z one two three\n [ true, false, true ]\n [ 'one', 'two', 'three' ]\n\nOptimist is here to help...\n---------------------------\n\nYou can describe parameters for help messages and set aliases. Optimist figures\nout how to format a handy help string automatically.\n\nline_count.js\n\n````javascript\n#!/usr/bin/env node\nvar argv = require('optimist')\n .usage('Count the lines in a file.\\nUsage: $0')\n .demand('f')\n .alias('f', 'file')\n .describe('f', 'Load a file')\n .argv\n;\n\nvar fs = require('fs');\nvar s = fs.createReadStream(argv.file);\n\nvar lines = 0;\ns.on('data', function (buf) {\n lines += buf.toString().match(/\\n/g).length;\n});\n\ns.on('end', function () {\n console.log(lines);\n});\n````\n\n***\n\n $ node line_count.js\n Count the lines in a file.\n Usage: node ./line_count.js\n\n Options:\n -f, --file Load a file [required]\n\n Missing required arguments: f\n\n $ node line_count.js --file line_count.js \n 20\n \n $ node line_count.js -f line_count.js \n 20\n\nmethods\n=======\n\nBy itself,\n\n````javascript\nrequire('optimist').argv\n`````\n\nwill use `process.argv` array to construct the `argv` object.\n\nYou can pass in the `process.argv` yourself:\n\n````javascript\nrequire('optimist')([ '-x', '1', '-y', '2' ]).argv\n````\n\nor use .parse() to do the same thing:\n\n````javascript\nrequire('optimist').parse([ '-x', '1', '-y', '2' ])\n````\n\nThe rest of these methods below come in just before the terminating `.argv`.\n\n.alias(key, alias)\n------------------\n\nSet key names as equivalent such that updates to a key will propagate to aliases\nand vice-versa.\n\nOptionally `.alias()` can take an object that maps keys to aliases.\n\n.default(key, value)\n--------------------\n\nSet `argv[key]` to `value` if no option was specified on `process.argv`.\n\nOptionally `.default()` can take an object that maps keys to default values.\n\n.demand(key)\n------------\n\nIf `key` is a string, show the usage information and exit if `key` wasn't\nspecified in `process.argv`.\n\nIf `key` is a number, demand at least as many non-option arguments, which show\nup in `argv._`.\n\nIf `key` is an Array, demand each element.\n\n.describe(key, desc)\n--------------------\n\nDescribe a `key` for the generated usage information.\n\nOptionally `.describe()` can take an object that maps keys to descriptions.\n\n.options(key, opt)\n------------------\n\nInstead of chaining together `.alias().demand().default()`, you can specify\nkeys in `opt` for each of the chainable methods.\n\nFor example:\n\n````javascript\nvar argv = require('optimist')\n .options('f', {\n alias : 'file',\n default : '/etc/passwd',\n })\n .argv\n;\n````\n\nis the same as\n\n````javascript\nvar argv = require('optimist')\n .alias('f', 'file')\n .default('f', '/etc/passwd')\n .argv\n;\n````\n\nOptionally `.options()` can take an object that maps keys to `opt` parameters.\n\n.usage(message)\n---------------\n\nSet a usage message to show which commands to use. Inside `message`, the string\n`$0` will get interpolated to the current script name or node command for the\npresent script similar to how `$0` works in bash or perl.\n\n.check(fn)\n----------\n\nCheck that certain conditions are met in the provided arguments.\n\nIf `fn` throws or returns `false`, show the thrown error, usage information, and\nexit.\n\n.boolean(key)\n-------------\n\nInterpret `key` as a boolean. If a non-flag option follows `key` in\n`process.argv`, that string won't get set as the value of `key`.\n\nIf `key` never shows up as a flag in `process.arguments`, `argv[key]` will be\n`false`.\n\nIf `key` is an Array, interpret all the elements as booleans.\n\n.string(key)\n------------\n\nTell the parser logic not to interpret `key` as a number or boolean.\nThis can be useful if you need to preserve leading zeros in an input.\n\nIf `key` is an Array, interpret all the elements as strings.\n\n.wrap(columns)\n--------------\n\nFormat usage output to wrap at `columns` many columns.\n\n.help()\n-------\n\nReturn the generated usage string.\n\n.showHelp(fn=console.error)\n---------------------------\n\nPrint the usage data using `fn` for printing.\n\n.parse(args)\n------------\n\nParse `args` instead of `process.argv`. Returns the `argv` object.\n\n.argv\n-----\n\nGet the arguments as a plain old object.\n\nArguments without a corresponding flag show up in the `argv._` array.\n\nThe script name or node command is available at `argv.$0` similarly to how `$0`\nworks in bash or perl.\n\nparsing tricks\n==============\n\nstop parsing\n------------\n\nUse `--` to stop parsing flags and stuff the remainder into `argv._`.\n\n $ node examples/reflect.js -a 1 -b 2 -- -c 3 -d 4\n { _: [ '-c', '3', '-d', '4' ],\n '$0': 'node ./examples/reflect.js',\n a: 1,\n b: 2 }\n\nnegate fields\n-------------\n\nIf you want to explicity set a field to false instead of just leaving it\nundefined or to override a default you can do `--no-key`.\n\n $ node examples/reflect.js -a --no-b\n { _: [],\n '$0': 'node ./examples/reflect.js',\n a: true,\n b: false }\n\nnumbers\n-------\n\nEvery argument that looks like a number (`!isNaN(Number(arg))`) is converted to\none. This way you can just `net.createConnection(argv.port)` and you can add\nnumbers out of `argv` with `+` without having that mean concatenation,\nwhich is super frustrating.\n\nduplicates\n----------\n\nIf you specify a flag multiple times it will get turned into an array containing\nall the values in order.\n\n $ node examples/reflect.js -x 5 -x 8 -x 0\n { _: [],\n '$0': 'node ./examples/reflect.js',\n x: [ 5, 8, 0 ] }\n\ndot notation\n------------\n\nWhen you use dots (`.`s) in argument names, an implicit object path is assumed.\nThis lets you organize arguments into nested objects.\n\n $ node examples/reflect.js --foo.bar.baz=33 --foo.quux=5\n { _: [],\n '$0': 'node ./examples/reflect.js',\n foo: { bar: { baz: 33 }, quux: 5 } }\n\ninstallation\n============\n\nWith [npm](http://github.com/isaacs/npm), just do:\n npm install optimist\n \nor clone this project on github:\n\n git clone http://github.com/substack/node-optimist.git\n\nTo run the tests with [expresso](http://github.com/visionmedia/expresso),\njust do:\n \n expresso\n\ninspired By\n===========\n\nThis module is loosely inspired by Perl's\n[Getopt::Casual](http://search.cpan.org/~photo/Getopt-Casual-0.13.1/Casual.pm).\n",
+ "_id": "optimist@0.3.4",
+ "_from": "optimist@~0.3.4"
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/test/_.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/test/_.js
new file mode 100644
index 000000000..d9c58b368
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/test/_.js
@@ -0,0 +1,71 @@
+var spawn = require('child_process').spawn;
+var test = require('tap').test;
+
+test('dotSlashEmpty', testCmd('./bin.js', []));
+
+test('dotSlashArgs', testCmd('./bin.js', [ 'a', 'b', 'c' ]));
+
+test('nodeEmpty', testCmd('node bin.js', []));
+
+test('nodeArgs', testCmd('node bin.js', [ 'x', 'y', 'z' ]));
+
+test('whichNodeEmpty', function (t) {
+ var which = spawn('which', ['node']);
+
+ which.stdout.on('data', function (buf) {
+ t.test(
+ testCmd(buf.toString().trim() + ' bin.js', [])
+ );
+ t.end();
+ });
+
+ which.stderr.on('data', function (err) {
+ assert.error(err);
+ t.end();
+ });
+});
+
+test('whichNodeArgs', function (t) {
+ var which = spawn('which', ['node']);
+
+ which.stdout.on('data', function (buf) {
+ t.test(
+ testCmd(buf.toString().trim() + ' bin.js', [ 'q', 'r' ])
+ );
+ t.end();
+ });
+
+ which.stderr.on('data', function (err) {
+ t.error(err);
+ t.end();
+ });
+});
+
+function testCmd (cmd, args) {
+
+ return function (t) {
+ var to = setTimeout(function () {
+ assert.fail('Never got stdout data.')
+ }, 5000);
+
+ var oldDir = process.cwd();
+ process.chdir(__dirname + '/_');
+
+ var cmds = cmd.split(' ');
+
+ var bin = spawn(cmds[0], cmds.slice(1).concat(args.map(String)));
+ process.chdir(oldDir);
+
+ bin.stderr.on('data', function (err) {
+ t.error(err);
+ t.end();
+ });
+
+ bin.stdout.on('data', function (buf) {
+ clearTimeout(to);
+ var _ = JSON.parse(buf.toString());
+ t.same(_.map(String), args.map(String));
+ t.end();
+ });
+ };
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/test/_/argv.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/test/_/argv.js
new file mode 100644
index 000000000..3d096062c
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/test/_/argv.js
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+console.log(JSON.stringify(process.argv));
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/test/_/bin.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/test/_/bin.js
new file mode 100755
index 000000000..4a18d85f3
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/test/_/bin.js
@@ -0,0 +1,3 @@
+#!/usr/bin/env node
+var argv = require('../../index').argv
+console.log(JSON.stringify(argv._));
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/test/parse.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/test/parse.js
new file mode 100644
index 000000000..d9a37abb1
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/test/parse.js
@@ -0,0 +1,420 @@
+var optimist = require('../index');
+var path = require('path');
+var test = require('tap').test;
+
+var expresso = 'node ./parse.js';
+
+test('short boolean', function (t) {
+ var parse = optimist.parse([ '-b' ]);
+ t.same(parse, { b : true, _ : [], $0 : expresso });
+ t.same(typeof parse.b, 'boolean');
+ t.end();
+});
+
+test('long boolean', function (t) {
+ t.same(
+ optimist.parse([ '--bool' ]),
+ { bool : true, _ : [], $0 : expresso }
+ );
+ t.end();
+});
+
+test('bare', function (t) {
+ t.same(
+ optimist.parse([ 'foo', 'bar', 'baz' ]),
+ { _ : [ 'foo', 'bar', 'baz' ], $0 : expresso }
+ );
+ t.end();
+});
+
+test('short group', function (t) {
+ t.same(
+ optimist.parse([ '-cats' ]),
+ { c : true, a : true, t : true, s : true, _ : [], $0 : expresso }
+ );
+ t.end();
+});
+
+test('short group next', function (t) {
+ t.same(
+ optimist.parse([ '-cats', 'meow' ]),
+ { c : true, a : true, t : true, s : 'meow', _ : [], $0 : expresso }
+ );
+ t.end();
+});
+
+test('short capture', function (t) {
+ t.same(
+ optimist.parse([ '-h', 'localhost' ]),
+ { h : 'localhost', _ : [], $0 : expresso }
+ );
+ t.end();
+});
+
+test('short captures', function (t) {
+ t.same(
+ optimist.parse([ '-h', 'localhost', '-p', '555' ]),
+ { h : 'localhost', p : 555, _ : [], $0 : expresso }
+ );
+ t.end();
+});
+
+test('long capture sp', function (t) {
+ t.same(
+ optimist.parse([ '--pow', 'xixxle' ]),
+ { pow : 'xixxle', _ : [], $0 : expresso }
+ );
+ t.end();
+});
+
+test('long capture eq', function (t) {
+ t.same(
+ optimist.parse([ '--pow=xixxle' ]),
+ { pow : 'xixxle', _ : [], $0 : expresso }
+ );
+ t.end()
+});
+
+test('long captures sp', function (t) {
+ t.same(
+ optimist.parse([ '--host', 'localhost', '--port', '555' ]),
+ { host : 'localhost', port : 555, _ : [], $0 : expresso }
+ );
+ t.end();
+});
+
+test('long captures eq', function (t) {
+ t.same(
+ optimist.parse([ '--host=localhost', '--port=555' ]),
+ { host : 'localhost', port : 555, _ : [], $0 : expresso }
+ );
+ t.end();
+});
+
+test('mixed short bool and capture', function (t) {
+ t.same(
+ optimist.parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]),
+ {
+ f : true, p : 555, h : 'localhost',
+ _ : [ 'script.js' ], $0 : expresso,
+ }
+ );
+ t.end();
+});
+
+test('short and long', function (t) {
+ t.same(
+ optimist.parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]),
+ {
+ f : true, p : 555, h : 'localhost',
+ _ : [ 'script.js' ], $0 : expresso,
+ }
+ );
+ t.end();
+});
+
+test('no', function (t) {
+ t.same(
+ optimist.parse([ '--no-moo' ]),
+ { moo : false, _ : [], $0 : expresso }
+ );
+ t.end();
+});
+
+test('multi', function (t) {
+ t.same(
+ optimist.parse([ '-v', 'a', '-v', 'b', '-v', 'c' ]),
+ { v : ['a','b','c'], _ : [], $0 : expresso }
+ );
+ t.end();
+});
+
+test('comprehensive', function (t) {
+ t.same(
+ optimist.parse([
+ '--name=meowmers', 'bare', '-cats', 'woo',
+ '-h', 'awesome', '--multi=quux',
+ '--key', 'value',
+ '-b', '--bool', '--no-meep', '--multi=baz',
+ '--', '--not-a-flag', 'eek'
+ ]),
+ {
+ c : true,
+ a : true,
+ t : true,
+ s : 'woo',
+ h : 'awesome',
+ b : true,
+ bool : true,
+ key : 'value',
+ multi : [ 'quux', 'baz' ],
+ meep : false,
+ name : 'meowmers',
+ _ : [ 'bare', '--not-a-flag', 'eek' ],
+ $0 : expresso
+ }
+ );
+ t.end();
+});
+
+test('nums', function (t) {
+ var argv = optimist.parse([
+ '-x', '1234',
+ '-y', '5.67',
+ '-z', '1e7',
+ '-w', '10f',
+ '--hex', '0xdeadbeef',
+ '789',
+ ]);
+ t.same(argv, {
+ x : 1234,
+ y : 5.67,
+ z : 1e7,
+ w : '10f',
+ hex : 0xdeadbeef,
+ _ : [ 789 ],
+ $0 : expresso
+ });
+ t.same(typeof argv.x, 'number');
+ t.same(typeof argv.y, 'number');
+ t.same(typeof argv.z, 'number');
+ t.same(typeof argv.w, 'string');
+ t.same(typeof argv.hex, 'number');
+ t.same(typeof argv._[0], 'number');
+ t.end();
+});
+
+test('flag boolean', function (t) {
+ var parse = optimist([ '-t', 'moo' ]).boolean(['t']).argv;
+ t.same(parse, { t : true, _ : [ 'moo' ], $0 : expresso });
+ t.same(typeof parse.t, 'boolean');
+ t.end();
+});
+
+test('flag boolean value', function (t) {
+ var parse = optimist(['--verbose', 'false', 'moo', '-t', 'true'])
+ .boolean(['t', 'verbose']).default('verbose', true).argv;
+
+ t.same(parse, {
+ verbose: false,
+ t: true,
+ _: ['moo'],
+ $0 : expresso
+ });
+
+ t.same(typeof parse.verbose, 'boolean');
+ t.same(typeof parse.t, 'boolean');
+ t.end();
+});
+
+test('flag boolean default false', function (t) {
+ var parse = optimist(['moo'])
+ .boolean(['t', 'verbose'])
+ .default('verbose', false)
+ .default('t', false).argv;
+
+ t.same(parse, {
+ verbose: false,
+ t: false,
+ _: ['moo'],
+ $0 : expresso
+ });
+
+ t.same(typeof parse.verbose, 'boolean');
+ t.same(typeof parse.t, 'boolean');
+ t.end();
+
+});
+
+test('boolean groups', function (t) {
+ var parse = optimist([ '-x', '-z', 'one', 'two', 'three' ])
+ .boolean(['x','y','z']).argv;
+
+ t.same(parse, {
+ x : true,
+ y : false,
+ z : true,
+ _ : [ 'one', 'two', 'three' ],
+ $0 : expresso
+ });
+
+ t.same(typeof parse.x, 'boolean');
+ t.same(typeof parse.y, 'boolean');
+ t.same(typeof parse.z, 'boolean');
+ t.end();
+});
+
+test('strings' , function (t) {
+ var s = optimist([ '-s', '0001234' ]).string('s').argv.s;
+ t.same(s, '0001234');
+ t.same(typeof s, 'string');
+
+ var x = optimist([ '-x', '56' ]).string('x').argv.x;
+ t.same(x, '56');
+ t.same(typeof x, 'string');
+ t.end();
+});
+
+test('stringArgs', function (t) {
+ var s = optimist([ ' ', ' ' ]).string('_').argv._;
+ t.same(s.length, 2);
+ t.same(typeof s[0], 'string');
+ t.same(s[0], ' ');
+ t.same(typeof s[1], 'string');
+ t.same(s[1], ' ');
+ t.end();
+});
+
+test('slashBreak', function (t) {
+ t.same(
+ optimist.parse([ '-I/foo/bar/baz' ]),
+ { I : '/foo/bar/baz', _ : [], $0 : expresso }
+ );
+ t.same(
+ optimist.parse([ '-xyz/foo/bar/baz' ]),
+ { x : true, y : true, z : '/foo/bar/baz', _ : [], $0 : expresso }
+ );
+ t.end();
+});
+
+test('alias', function (t) {
+ var argv = optimist([ '-f', '11', '--zoom', '55' ])
+ .alias('z', 'zoom')
+ .argv
+ ;
+ t.equal(argv.zoom, 55);
+ t.equal(argv.z, argv.zoom);
+ t.equal(argv.f, 11);
+ t.end();
+});
+
+test('multiAlias', function (t) {
+ var argv = optimist([ '-f', '11', '--zoom', '55' ])
+ .alias('z', [ 'zm', 'zoom' ])
+ .argv
+ ;
+ t.equal(argv.zoom, 55);
+ t.equal(argv.z, argv.zoom);
+ t.equal(argv.z, argv.zm);
+ t.equal(argv.f, 11);
+ t.end();
+});
+
+test('boolean default true', function (t) {
+ var argv = optimist.options({
+ sometrue: {
+ boolean: true,
+ default: true
+ }
+ }).argv;
+
+ t.equal(argv.sometrue, true);
+ t.end();
+});
+
+test('boolean default false', function (t) {
+ var argv = optimist.options({
+ somefalse: {
+ boolean: true,
+ default: false
+ }
+ }).argv;
+
+ t.equal(argv.somefalse, false);
+ t.end();
+});
+
+test('nested dotted objects', function (t) {
+ var argv = optimist([
+ '--foo.bar', '3', '--foo.baz', '4',
+ '--foo.quux.quibble', '5', '--foo.quux.o_O',
+ '--beep.boop'
+ ]).argv;
+
+ t.same(argv.foo, {
+ bar : 3,
+ baz : 4,
+ quux : {
+ quibble : 5,
+ o_O : true
+ },
+ });
+ t.same(argv.beep, { boop : true });
+ t.end();
+});
+
+test('boolean and alias with chainable api', function (t) {
+ var aliased = [ '-h', 'derp' ];
+ var regular = [ '--herp', 'derp' ];
+ var opts = {
+ herp: { alias: 'h', boolean: true }
+ };
+ var aliasedArgv = optimist(aliased)
+ .boolean('herp')
+ .alias('h', 'herp')
+ .argv;
+ var propertyArgv = optimist(regular)
+ .boolean('herp')
+ .alias('h', 'herp')
+ .argv;
+ var expected = {
+ herp: true,
+ h: true,
+ '_': [ 'derp' ],
+ '$0': expresso,
+ };
+
+ t.same(aliasedArgv, expected);
+ t.same(propertyArgv, expected);
+ t.end();
+});
+
+test('boolean and alias with options hash', function (t) {
+ var aliased = [ '-h', 'derp' ];
+ var regular = [ '--herp', 'derp' ];
+ var opts = {
+ herp: { alias: 'h', boolean: true }
+ };
+ var aliasedArgv = optimist(aliased)
+ .options(opts)
+ .argv;
+ var propertyArgv = optimist(regular).options(opts).argv;
+ var expected = {
+ herp: true,
+ h: true,
+ '_': [ 'derp' ],
+ '$0': expresso,
+ };
+
+ t.same(aliasedArgv, expected);
+ t.same(propertyArgv, expected);
+
+ t.end();
+});
+
+test('boolean and alias using explicit true', function (t) {
+ var aliased = [ '-h', 'true' ];
+ var regular = [ '--herp', 'true' ];
+ var opts = {
+ herp: { alias: 'h', boolean: true }
+ };
+ var aliasedArgv = optimist(aliased)
+ .boolean('h')
+ .alias('h', 'herp')
+ .argv;
+ var propertyArgv = optimist(regular)
+ .boolean('h')
+ .alias('h', 'herp')
+ .argv;
+ var expected = {
+ herp: true,
+ h: true,
+ '_': [ ],
+ '$0': expresso,
+ };
+
+ t.same(aliasedArgv, expected);
+ t.same(propertyArgv, expected);
+ t.end();
+});
+
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/test/usage.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/test/usage.js
new file mode 100644
index 000000000..300454c1e
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/optimist/test/usage.js
@@ -0,0 +1,292 @@
+var Hash = require('hashish');
+var optimist = require('../index');
+var test = require('tap').test;
+
+test('usageFail', function (t) {
+ var r = checkUsage(function () {
+ return optimist('-x 10 -z 20'.split(' '))
+ .usage('Usage: $0 -x NUM -y NUM')
+ .demand(['x','y'])
+ .argv;
+ });
+ t.same(
+ r.result,
+ { x : 10, z : 20, _ : [], $0 : './usage' }
+ );
+
+ t.same(
+ r.errors.join('\n').split(/\n+/),
+ [
+ 'Usage: ./usage -x NUM -y NUM',
+ 'Options:',
+ ' -x [required]',
+ ' -y [required]',
+ 'Missing required arguments: y',
+ ]
+ );
+ t.same(r.logs, []);
+ t.ok(r.exit);
+ t.end();
+});
+
+
+test('usagePass', function (t) {
+ var r = checkUsage(function () {
+ return optimist('-x 10 -y 20'.split(' '))
+ .usage('Usage: $0 -x NUM -y NUM')
+ .demand(['x','y'])
+ .argv;
+ });
+ t.same(r, {
+ result : { x : 10, y : 20, _ : [], $0 : './usage' },
+ errors : [],
+ logs : [],
+ exit : false,
+ });
+ t.end();
+});
+
+test('checkPass', function (t) {
+ var r = checkUsage(function () {
+ return optimist('-x 10 -y 20'.split(' '))
+ .usage('Usage: $0 -x NUM -y NUM')
+ .check(function (argv) {
+ if (!('x' in argv)) throw 'You forgot about -x';
+ if (!('y' in argv)) throw 'You forgot about -y';
+ })
+ .argv;
+ });
+ t.same(r, {
+ result : { x : 10, y : 20, _ : [], $0 : './usage' },
+ errors : [],
+ logs : [],
+ exit : false,
+ });
+ t.end();
+});
+
+test('checkFail', function (t) {
+ var r = checkUsage(function () {
+ return optimist('-x 10 -z 20'.split(' '))
+ .usage('Usage: $0 -x NUM -y NUM')
+ .check(function (argv) {
+ if (!('x' in argv)) throw 'You forgot about -x';
+ if (!('y' in argv)) throw 'You forgot about -y';
+ })
+ .argv;
+ });
+
+ t.same(
+ r.result,
+ { x : 10, z : 20, _ : [], $0 : './usage' }
+ );
+
+ t.same(
+ r.errors.join('\n').split(/\n+/),
+ [
+ 'Usage: ./usage -x NUM -y NUM',
+ 'You forgot about -y'
+ ]
+ );
+
+ t.same(r.logs, []);
+ t.ok(r.exit);
+ t.end();
+});
+
+test('checkCondPass', function (t) {
+ function checker (argv) {
+ return 'x' in argv && 'y' in argv;
+ }
+
+ var r = checkUsage(function () {
+ return optimist('-x 10 -y 20'.split(' '))
+ .usage('Usage: $0 -x NUM -y NUM')
+ .check(checker)
+ .argv;
+ });
+ t.same(r, {
+ result : { x : 10, y : 20, _ : [], $0 : './usage' },
+ errors : [],
+ logs : [],
+ exit : false,
+ });
+ t.end();
+});
+
+test('checkCondFail', function (t) {
+ function checker (argv) {
+ return 'x' in argv && 'y' in argv;
+ }
+
+ var r = checkUsage(function () {
+ return optimist('-x 10 -z 20'.split(' '))
+ .usage('Usage: $0 -x NUM -y NUM')
+ .check(checker)
+ .argv;
+ });
+
+ t.same(
+ r.result,
+ { x : 10, z : 20, _ : [], $0 : './usage' }
+ );
+
+ t.same(
+ r.errors.join('\n').split(/\n+/).join('\n'),
+ 'Usage: ./usage -x NUM -y NUM\n'
+ + 'Argument check failed: ' + checker.toString()
+ );
+
+ t.same(r.logs, []);
+ t.ok(r.exit);
+ t.end();
+});
+
+test('countPass', function (t) {
+ var r = checkUsage(function () {
+ return optimist('1 2 3 --moo'.split(' '))
+ .usage('Usage: $0 [x] [y] [z] {OPTIONS}')
+ .demand(3)
+ .argv;
+ });
+ t.same(r, {
+ result : { _ : [ '1', '2', '3' ], moo : true, $0 : './usage' },
+ errors : [],
+ logs : [],
+ exit : false,
+ });
+ t.end();
+});
+
+test('countFail', function (t) {
+ var r = checkUsage(function () {
+ return optimist('1 2 --moo'.split(' '))
+ .usage('Usage: $0 [x] [y] [z] {OPTIONS}')
+ .demand(3)
+ .argv;
+ });
+ t.same(
+ r.result,
+ { _ : [ '1', '2' ], moo : true, $0 : './usage' }
+ );
+
+ t.same(
+ r.errors.join('\n').split(/\n+/),
+ [
+ 'Usage: ./usage [x] [y] [z] {OPTIONS}',
+ 'Not enough non-option arguments: got 2, need at least 3',
+ ]
+ );
+
+ t.same(r.logs, []);
+ t.ok(r.exit);
+ t.end();
+});
+
+test('defaultSingles', function (t) {
+ var r = checkUsage(function () {
+ return optimist('--foo 50 --baz 70 --powsy'.split(' '))
+ .default('foo', 5)
+ .default('bar', 6)
+ .default('baz', 7)
+ .argv
+ ;
+ });
+ t.same(r.result, {
+ foo : '50',
+ bar : 6,
+ baz : '70',
+ powsy : true,
+ _ : [],
+ $0 : './usage',
+ });
+ t.end();
+});
+
+test('defaultAliases', function (t) {
+ var r = checkUsage(function () {
+ return optimist('')
+ .alias('f', 'foo')
+ .default('f', 5)
+ .argv
+ ;
+ });
+ t.same(r.result, {
+ f : '5',
+ foo : '5',
+ _ : [],
+ $0 : './usage',
+ });
+ t.end();
+});
+
+test('defaultHash', function (t) {
+ var r = checkUsage(function () {
+ return optimist('--foo 50 --baz 70'.split(' '))
+ .default({ foo : 10, bar : 20, quux : 30 })
+ .argv
+ ;
+ });
+ t.same(r.result, {
+ _ : [],
+ $0 : './usage',
+ foo : 50,
+ baz : 70,
+ bar : 20,
+ quux : 30,
+ });
+ t.end();
+});
+
+test('rebase', function (t) {
+ t.equal(
+ optimist.rebase('/home/substack', '/home/substack/foo/bar/baz'),
+ './foo/bar/baz'
+ );
+ t.equal(
+ optimist.rebase('/home/substack/foo/bar/baz', '/home/substack'),
+ '../../..'
+ );
+ t.equal(
+ optimist.rebase('/home/substack/foo', '/home/substack/pow/zoom.txt'),
+ '../pow/zoom.txt'
+ );
+ t.end();
+});
+
+function checkUsage (f) {
+
+ var exit = false;
+
+ process._exit = process.exit;
+ process._env = process.env;
+ process._argv = process.argv;
+
+ process.exit = function (t) { exit = true };
+ process.env = Hash.merge(process.env, { _ : 'node' });
+ process.argv = [ './usage' ];
+
+ var errors = [];
+ var logs = [];
+
+ console._error = console.error;
+ console.error = function (msg) { errors.push(msg) };
+ console._log = console.log;
+ console.log = function (msg) { logs.push(msg) };
+
+ var result = f();
+
+ process.exit = process._exit;
+ process.env = process._env;
+ process.argv = process._argv;
+
+ console.error = console._error;
+ console.log = console._log;
+
+ return {
+ errors : errors,
+ logs : logs,
+ exit : exit,
+ result : result,
+ };
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/.travis.yml b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/.travis.yml
new file mode 100644
index 000000000..f1d0f13c8
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/.travis.yml
@@ -0,0 +1,4 @@
+language: node_js
+node_js:
+ - 0.4
+ - 0.6
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/README.markdown b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/README.markdown
new file mode 100644
index 000000000..4b90cb775
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/README.markdown
@@ -0,0 +1,47 @@
+resolve
+=======
+
+Implements the [node `require.resolve()`
+algorithm](http://nodejs.org/docs/v0.4.8/api/all.html#all_Together...)
+except you can pass in the file to compute paths relatively to along with your
+own `require.paths` without updating the global copy (which doesn't even work in
+node `>=0.5`).
+
+[![build status](https://secure.travis-ci.org/substack/node-resolve.png)](http://travis-ci.org/substack/node-resolve)
+
+methods
+=======
+
+var resolve = require('resolve');
+
+resolve.sync(pkg, opts)
+-----------------------
+
+Synchronously search for the package/filename string `pkg`
+according to the [`require.resolve()`
+algorithm](http://nodejs.org/docs/v0.4.8/api/all.html#all_Together...)
+for `X=pkg` and `Y=opts.basedir`.
+
+Default values for `opts`:
+
+````javascript
+{
+ paths : [],
+ basedir : __dirname,
+ extensions : [ '.js' ],
+ readFileSync : fs.readFileSync,
+ isFile : function (file) {
+ return path.existSync(file) && fs.statSync(file).isFile()
+ }
+}
+````
+
+Optionally you can specify a `opts.packageFilter` function to map the contents
+of `JSON.parse()`'d package.json files.
+
+If nothing is found, all of the directories in `opts.paths` are searched.
+
+resolve.isCore(pkg)
+-------------------
+
+Return whether a package is in core.
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/index.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/index.js
new file mode 100644
index 000000000..16b844bbf
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/index.js
@@ -0,0 +1,105 @@
+var fs = require('fs');
+var path = require('path');
+
+// taken from `ls -1 lib` in node 0.6.11
+var core = exports.core = [
+ 'assert', 'buffer_ieee754', 'buffer', 'child_process', 'cluster', 'console',
+ 'constants', 'crypto', '_debugger', 'dgram', 'dns', 'events', 'freelist',
+ 'fs', 'http', 'https', '_linklist', 'module', 'net', 'os', 'path',
+ 'punycode', 'querystring', 'readline', 'repl', 'stream', 'string_decoder',
+ 'sys', 'timers', 'tls', 'tty', 'url', 'util', 'vm', 'zlib'
+].reduce(function (acc, x) { acc[x] = true; return acc }, {});
+
+exports.isCore = function (x) { return core[x] };
+
+exports.sync = function (x, opts) {
+ if (core[x]) return x;
+
+ if (!opts) opts = {};
+ var isFile = opts.isFile || function (file) {
+ return path.existsSync(file) && fs.statSync(file).isFile()
+ };
+ var readFileSync = opts.readFileSync || fs.readFileSync;
+
+ var extensions = opts.extensions || [ '.js' ];
+ var y = opts.basedir
+ || path.dirname(require.cache[__filename].parent.filename)
+ ;
+
+ opts.paths = opts.paths || [];
+
+ if (x.match(/^(?:\.\.?\/|\/|([A-Za-z]:)?\\)/)) {
+ var m = loadAsFileSync(path.resolve(y, x))
+ || loadAsDirectorySync(path.resolve(y, x));
+ if (m) return m;
+ }
+
+ var n = loadNodeModulesSync(x, y);
+ if (n) return n;
+
+ throw new Error("Cannot find module '" + x + "'");
+
+ function loadAsFileSync (x) {
+ if (isFile(x)) {
+ return x;
+ }
+
+ for (var i = 0; i < extensions.length; i++) {
+ var file = x + extensions[i];
+ if (isFile(file)) {
+ return file;
+ }
+ }
+ }
+
+ function loadAsDirectorySync (x) {
+ var pkgfile = path.join(x, '/package.json');
+ if (isFile(pkgfile)) {
+ var body = readFileSync(pkgfile, 'utf8');
+ try {
+ var pkg = JSON.parse(body);
+ if (opts.packageFilter) {
+ pkg = opts.packageFilter(pkg);
+ }
+
+ if (pkg.main) {
+ var m = loadAsFileSync(path.resolve(x, pkg.main));
+ if (m) return m;
+ }
+ }
+ catch (err) {}
+ }
+
+ return loadAsFileSync(path.join( x, '/index'));
+ }
+
+ function loadNodeModulesSync (x, start) {
+ var dirs = nodeModulesPathsSync(start);
+ for (var i = 0; i < dirs.length; i++) {
+ var dir = dirs[i];
+ var m = loadAsFileSync(path.join( dir, '/', x));
+ if (m) return m;
+ var n = loadAsDirectorySync(path.join( dir, '/', x ));
+ if (n) return n;
+ }
+ }
+
+ function nodeModulesPathsSync (start) {
+ var splitRe = process.platform === 'win32' ? /[\/\\]/ : /\/+/;
+ var parts = start.split(splitRe);
+
+ var dirs = [];
+ for (var i = parts.length - 1; i >= 0; i--) {
+ if (parts[i] === 'node_modules') continue;
+ var dir = path.join(
+ path.join.apply(path, parts.slice(0, i + 1)),
+ 'node_modules'
+ );
+ if (!parts[0].match(/([A-Za-z]:)/)) {
+ dir = '/' + dir;
+ }
+ dirs.push(dir);
+ }
+ return opts.paths.concat(dirs);
+ }
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/package.json b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/package.json
new file mode 100644
index 000000000..2dcc36aa4
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/package.json
@@ -0,0 +1,43 @@
+{
+ "name": "resolve",
+ "description": "A more hookable require.resolve() implementation",
+ "version": "0.2.2",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/substack/node-resolve.git"
+ },
+ "main": "index.js",
+ "keywords": [
+ "resolve",
+ "require",
+ "node",
+ "module"
+ ],
+ "directories": {
+ "lib": ".",
+ "example": "example",
+ "test": "test"
+ },
+ "scripts": {
+ "test": "tap test/*.js"
+ },
+ "dependencies": {},
+ "devDependencies": {
+ "tap": "~0.2.4"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ },
+ "license": "MIT",
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "readme": "resolve\n=======\n\nImplements the [node `require.resolve()`\nalgorithm](http://nodejs.org/docs/v0.4.8/api/all.html#all_Together...)\nexcept you can pass in the file to compute paths relatively to along with your\nown `require.paths` without updating the global copy (which doesn't even work in\nnode `>=0.5`).\n\n[![build status](https://secure.travis-ci.org/substack/node-resolve.png)](http://travis-ci.org/substack/node-resolve)\n\nmethods\n=======\n\nvar resolve = require('resolve');\n\nresolve.sync(pkg, opts)\n-----------------------\n\nSynchronously search for the package/filename string `pkg`\naccording to the [`require.resolve()`\nalgorithm](http://nodejs.org/docs/v0.4.8/api/all.html#all_Together...)\nfor `X=pkg` and `Y=opts.basedir`.\n\nDefault values for `opts`:\n\n````javascript\n{\n paths : [],\n basedir : __dirname,\n extensions : [ '.js' ],\n readFileSync : fs.readFileSync,\n isFile : function (file) {\n return path.existSync(file) && fs.statSync(file).isFile()\n }\n}\n````\n\nOptionally you can specify a `opts.packageFilter` function to map the contents\nof `JSON.parse()`'d package.json files.\n\nIf nothing is found, all of the directories in `opts.paths` are searched.\n\nresolve.isCore(pkg)\n-------------------\n\nReturn whether a package is in core.\n",
+ "_id": "resolve@0.2.2",
+ "dist": {
+ "shasum": "bee5e6c8a011e5ffa04b8d6e0046ec9cabc5102a"
+ },
+ "_from": "resolve@~0.2.0"
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/core.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/core.js
new file mode 100644
index 000000000..88a510cd1
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/core.js
@@ -0,0 +1,12 @@
+var test = require('tap').test;
+var resolve = require('../');
+
+test('core modules', function (t) {
+ t.ok(resolve.isCore('fs'));
+ t.ok(resolve.isCore('net'));
+ t.ok(resolve.isCore('http'));
+
+ t.ok(!resolve.isCore('seq'));
+ t.ok(!resolve.isCore('../'));
+ t.end();
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/filter.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/filter.js
new file mode 100644
index 000000000..8856c01a8
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/filter.js
@@ -0,0 +1,15 @@
+var test = require('tap').test;
+var resolve = require('../');
+
+test('filter', function (t) {
+ var dir = __dirname + '/resolver';
+ var res = resolve.sync('./baz', {
+ basedir : dir,
+ packageFilter : function (pkg) {
+ pkg.main = 'doom'
+ return pkg;
+ }
+ });
+ t.equal(res, dir + '/baz/doom.js');
+ t.end();
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/mock.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/mock.js
new file mode 100644
index 000000000..c822e3eaa
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/mock.js
@@ -0,0 +1,64 @@
+var test = require('tap').test;
+var resolve = require('../');
+
+test('mock', function (t) {
+ t.plan(3);
+
+ var files = {
+ '/foo/bar/baz.js' : 'beep'
+ };
+
+ function opts (basedir) {
+ return {
+ basedir : basedir,
+ isFile : function (file) {
+ return files.hasOwnProperty(file)
+ },
+ readFileSync : function (file) {
+ return files[file]
+ }
+ }
+ }
+
+ t.equal(
+ resolve.sync('./baz', opts('/foo/bar')),
+ '/foo/bar/baz.js'
+ );
+
+ t.equal(
+ resolve.sync('./baz.js', opts('/foo/bar')),
+ '/foo/bar/baz.js'
+ );
+
+ t.throws(function () {
+ resolve.sync('baz', opts('/foo/bar'));
+ });
+});
+
+test('mock package', function (t) {
+ t.plan(1);
+
+ var files = {
+ '/foo/node_modules/bar/baz.js' : 'beep',
+ '/foo/node_modules/bar/package.json' : JSON.stringify({
+ main : './baz.js'
+ })
+ };
+
+ function opts (basedir) {
+ return {
+ basedir : basedir,
+ isFile : function (file) {
+ return files.hasOwnProperty(file)
+ },
+ readFileSync : function (file) {
+ return files[file]
+ }
+ }
+ }
+
+ t.equal(
+ resolve.sync('bar', opts('/foo')),
+ '/foo/node_modules/bar/baz.js'
+ );
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver.js
new file mode 100644
index 000000000..80f5aa55c
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver.js
@@ -0,0 +1,157 @@
+var test = require('tap').test;
+var resolve = require('../');
+
+test('foo', function (t) {
+ var dir = __dirname + '/resolver';
+
+ t.equal(
+ resolve.sync('./foo', { basedir : dir }),
+ dir + '/foo.js'
+ );
+
+ t.equal(
+ resolve.sync('./foo.js', { basedir : dir }),
+ dir + '/foo.js'
+ );
+
+ t.throws(function () {
+ resolve.sync('foo', { basedir : dir });
+ });
+
+ t.end();
+});
+
+test('bar', function (t) {
+ var dir = __dirname + '/resolver';
+
+ t.equal(
+ resolve.sync('foo', { basedir : dir + '/bar' }),
+ dir + '/bar/node_modules/foo/index.js'
+ );
+ t.end();
+});
+
+test('baz', function (t) {
+ var dir = __dirname + '/resolver';
+
+ t.equal(
+ resolve.sync('./baz', { basedir : dir }),
+ dir + '/baz/quux.js'
+ );
+ t.end();
+});
+
+test('biz', function (t) {
+ var dir = __dirname + '/resolver/biz/node_modules';
+ t.equal(
+ resolve.sync('./grux', { basedir : dir }),
+ dir + '/grux/index.js'
+ );
+
+ t.equal(
+ resolve.sync('tiv', { basedir : dir + '/grux' }),
+ dir + '/tiv/index.js'
+ );
+
+ t.equal(
+ resolve.sync('grux', { basedir : dir + '/tiv' }),
+ dir + '/grux/index.js'
+ );
+ t.end();
+});
+
+test('normalize', function (t) {
+ var dir = __dirname + '/resolver/biz/node_modules/grux';
+ t.equal(
+ resolve.sync('../grux', { basedir : dir }),
+ dir + '/index.js'
+ );
+ t.end();
+});
+
+test('cup', function (t) {
+ var dir = __dirname + '/resolver';
+ t.equal(
+ resolve.sync('./cup', {
+ basedir : dir,
+ extensions : [ '.js', '.coffee' ]
+ }),
+ dir + '/cup.coffee'
+ );
+
+ t.equal(
+ resolve.sync('./cup.coffee', {
+ basedir : dir
+ }),
+ dir + '/cup.coffee'
+ );
+
+ t.throws(function () {
+ resolve.sync('./cup', {
+ basedir : dir,
+ extensions : [ '.js' ]
+ })
+ });
+
+ t.end();
+});
+
+test('mug', function (t) {
+ var dir = __dirname + '/resolver';
+ t.equal(
+ resolve.sync('./mug', { basedir : dir }),
+ dir + '/mug.js'
+ );
+
+ t.equal(
+ resolve.sync('./mug', {
+ basedir : dir,
+ extensions : [ '.coffee', '.js' ]
+ }),
+ dir + '/mug.coffee'
+ );
+
+ t.equal(
+ resolve.sync('./mug', {
+ basedir : dir,
+ extensions : [ '.js', '.coffee' ]
+ }),
+ dir + '/mug.js'
+ );
+
+ t.end();
+});
+
+test('other path', function (t) {
+ var resolverDir = __dirname + '/resolver';
+ var dir = resolverDir + '/bar';
+ var otherDir = resolverDir + '/other_path';
+
+ var path = require('path');
+
+ t.equal(
+ resolve.sync('root', {
+ basedir : dir,
+ paths: [otherDir] }),
+ resolverDir + '/other_path/root.js'
+ );
+
+ t.equal(
+ resolve.sync('lib/other-lib', {
+ basedir : dir,
+ paths: [otherDir] }),
+ resolverDir + '/other_path/lib/other-lib.js'
+ );
+
+ t.throws(function () {
+ resolve.sync('root', { basedir : dir, });
+ });
+
+ t.throws(function () {
+ resolve.sync('zzz', {
+ basedir : dir,
+ paths: [otherDir] });
+ });
+
+ t.end();
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/bar/node_modules/foo/index.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/bar/node_modules/foo/index.js
new file mode 100644
index 000000000..bd816eaba
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/bar/node_modules/foo/index.js
@@ -0,0 +1 @@
+module.exports = 1;
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/baz/doom.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/baz/doom.js
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/baz/doom.js
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/baz/package.json b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/baz/package.json
new file mode 100644
index 000000000..6b81dcddf
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/baz/package.json
@@ -0,0 +1,3 @@
+{
+ "main" : "quux.js"
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/baz/quux.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/baz/quux.js
new file mode 100644
index 000000000..bd816eaba
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/baz/quux.js
@@ -0,0 +1 @@
+module.exports = 1;
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/biz/node_modules/grux/index.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/biz/node_modules/grux/index.js
new file mode 100644
index 000000000..49960555a
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/biz/node_modules/grux/index.js
@@ -0,0 +1 @@
+module.exports = require('tiv') * 100;
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/biz/node_modules/tiv/index.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/biz/node_modules/tiv/index.js
new file mode 100644
index 000000000..690aad34a
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/biz/node_modules/tiv/index.js
@@ -0,0 +1 @@
+module.exports = 3;
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/cup.coffee b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/cup.coffee
new file mode 100644
index 000000000..8b1378917
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/cup.coffee
@@ -0,0 +1 @@
+
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/foo.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/foo.js
new file mode 100644
index 000000000..bd816eaba
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/foo.js
@@ -0,0 +1 @@
+module.exports = 1;
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/mug.coffee b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/mug.coffee
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/mug.coffee
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/mug.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/mug.js
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/mug.js
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/other_path/lib/other-lib.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/other_path/lib/other-lib.js
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/other_path/lib/other-lib.js
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/other_path/root.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/other_path/root.js
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/resolve/test/resolver/other_path/root.js
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/README.markdown b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/README.markdown
new file mode 100644
index 000000000..6f1ff9bcc
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/README.markdown
@@ -0,0 +1,103 @@
+vm-browserify
+=============
+
+Emulate node's vm module for the browser.
+
+example
+=======
+
+Just write some client-side javascript:
+
+``` js
+var vm = require('vm');
+
+$(function () {
+ var res = vm.runInNewContext('a + 5', { a : 100 });
+ $('#res').text(res);
+});
+```
+
+compile it with [browserify](http://github.com/substack/node-browserify):
+
+```
+browserify entry.js -o bundle.js
+```
+
+then whip up some html:
+
+``` html
+<html>
+ <head>
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="/bundle.js"></script>
+ </head>
+ <body>
+ result = <span id="res"></span>
+ </body>
+</html>
+```
+
+and when you load the page you should see:
+
+```
+result = 105
+```
+
+methods
+=======
+
+vm.runInNewContext(code, context={})
+------------------------------------
+
+Evaluate some `code` in a new iframe with a `context`.
+
+Contexts are like wrapping your code in a `with()` except slightly less terrible
+because the code is sandboxed into a new iframe.
+
+browser compatability
+=====================
+
+All modern browsers are supported.
+
+If you have a [browserling](http://browserling.com) account,
+from the testling/ directory just do:
+
+```
+$ ./test.sh substack@gmail.com
+Enter host password for user 'substack@gmail.com':
+chrome/17.0:
+ vmRunInNewContext ................................. 5/5
+
+iexplore/9.0:
+ vmRunInNewContext ................................. 5/5
+
+firefox/10.0:
+ vmRunInNewContext ................................. 5/5
+
+safari/5.1:
+ vmRunInNewContext ................................. 5/5
+
+opera/11.6:
+ vmRunInNewContext ................................. 5/5
+
+total ............................................... 25/25
+```
+
+In IE8 and IE7, running `vm.runInNewContext()` more than once can cause the
+browsers to hang for some reason. Otherwise they work too.
+
+install
+=======
+
+This module is depended upon by browserify, so you should just be able to
+`require('vm')` and it will just work. However if you want to use this module
+directly you can install it with [npm](http://npmjs.org):
+
+```
+npm install vm-browserify
+```
+
+license
+=======
+
+MIT/X11
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/example/run/bundle.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/example/run/bundle.js
new file mode 100644
index 000000000..5dbc43f41
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/example/run/bundle.js
@@ -0,0 +1,473 @@
+var require = function (file, cwd) {
+ var resolved = require.resolve(file, cwd || '/');
+ var mod = require.modules[resolved];
+ if (!mod) throw new Error(
+ 'Failed to resolve module ' + file + ', tried ' + resolved
+ );
+ var res = mod._cached ? mod._cached : mod();
+ return res;
+}
+
+require.paths = [];
+require.modules = {};
+require.extensions = [".js",".coffee"];
+
+require._core = {
+ 'assert': true,
+ 'events': true,
+ 'fs': true,
+ 'path': true,
+ 'vm': true
+};
+
+require.resolve = (function () {
+ return function (x, cwd) {
+ if (!cwd) cwd = '/';
+
+ if (require._core[x]) return x;
+ var path = require.modules.path();
+ var y = cwd || '.';
+
+ if (x.match(/^(?:\.\.?\/|\/)/)) {
+ var m = loadAsFileSync(path.resolve(y, x))
+ || loadAsDirectorySync(path.resolve(y, x));
+ if (m) return m;
+ }
+
+ var n = loadNodeModulesSync(x, y);
+ if (n) return n;
+
+ throw new Error("Cannot find module '" + x + "'");
+
+ function loadAsFileSync (x) {
+ if (require.modules[x]) {
+ return x;
+ }
+
+ for (var i = 0; i < require.extensions.length; i++) {
+ var ext = require.extensions[i];
+ if (require.modules[x + ext]) return x + ext;
+ }
+ }
+
+ function loadAsDirectorySync (x) {
+ x = x.replace(/\/+$/, '');
+ var pkgfile = x + '/package.json';
+ if (require.modules[pkgfile]) {
+ var pkg = require.modules[pkgfile]();
+ var b = pkg.browserify;
+ if (typeof b === 'object' && b.main) {
+ var m = loadAsFileSync(path.resolve(x, b.main));
+ if (m) return m;
+ }
+ else if (typeof b === 'string') {
+ var m = loadAsFileSync(path.resolve(x, b));
+ if (m) return m;
+ }
+ else if (pkg.main) {
+ var m = loadAsFileSync(path.resolve(x, pkg.main));
+ if (m) return m;
+ }
+ }
+
+ return loadAsFileSync(x + '/index');
+ }
+
+ function loadNodeModulesSync (x, start) {
+ var dirs = nodeModulesPathsSync(start);
+ for (var i = 0; i < dirs.length; i++) {
+ var dir = dirs[i];
+ var m = loadAsFileSync(dir + '/' + x);
+ if (m) return m;
+ var n = loadAsDirectorySync(dir + '/' + x);
+ if (n) return n;
+ }
+
+ var m = loadAsFileSync(x);
+ if (m) return m;
+ }
+
+ function nodeModulesPathsSync (start) {
+ var parts;
+ if (start === '/') parts = [ '' ];
+ else parts = path.normalize(start).split('/');
+
+ var dirs = [];
+ for (var i = parts.length - 1; i >= 0; i--) {
+ if (parts[i] === 'node_modules') continue;
+ var dir = parts.slice(0, i + 1).join('/') + '/node_modules';
+ dirs.push(dir);
+ }
+
+ return dirs;
+ }
+ };
+})();
+
+require.alias = function (from, to) {
+ var path = require.modules.path();
+ var res = null;
+ try {
+ res = require.resolve(from + '/package.json', '/');
+ }
+ catch (err) {
+ res = require.resolve(from, '/');
+ }
+ var basedir = path.dirname(res);
+
+ var keys = (Object.keys || function (obj) {
+ var res = [];
+ for (var key in obj) res.push(key)
+ return res;
+ })(require.modules);
+
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ if (key.slice(0, basedir.length + 1) === basedir + '/') {
+ var f = key.slice(basedir.length);
+ require.modules[to + f] = require.modules[basedir + f];
+ }
+ else if (key === basedir) {
+ require.modules[to] = require.modules[basedir];
+ }
+ }
+};
+
+require.define = function (filename, fn) {
+ var dirname = require._core[filename]
+ ? ''
+ : require.modules.path().dirname(filename)
+ ;
+
+ var require_ = function (file) {
+ return require(file, dirname)
+ };
+ require_.resolve = function (name) {
+ return require.resolve(name, dirname);
+ };
+ require_.modules = require.modules;
+ require_.define = require.define;
+ var module_ = { exports : {} };
+
+ require.modules[filename] = function () {
+ require.modules[filename]._cached = module_.exports;
+ fn.call(
+ module_.exports,
+ require_,
+ module_,
+ module_.exports,
+ dirname,
+ filename
+ );
+ require.modules[filename]._cached = module_.exports;
+ return module_.exports;
+ };
+};
+
+if (typeof process === 'undefined') process = {};
+
+if (!process.nextTick) process.nextTick = (function () {
+ var queue = [];
+ var canPost = typeof window !== 'undefined'
+ && window.postMessage && window.addEventListener
+ ;
+
+ if (canPost) {
+ window.addEventListener('message', function (ev) {
+ if (ev.source === window && ev.data === 'browserify-tick') {
+ ev.stopPropagation();
+ if (queue.length > 0) {
+ var fn = queue.shift();
+ fn();
+ }
+ }
+ }, true);
+ }
+
+ return function (fn) {
+ if (canPost) {
+ queue.push(fn);
+ window.postMessage('browserify-tick', '*');
+ }
+ else setTimeout(fn, 0);
+ };
+})();
+
+if (!process.title) process.title = 'browser';
+
+if (!process.binding) process.binding = function (name) {
+ if (name === 'evals') return require('vm')
+ else throw new Error('No such module')
+};
+
+if (!process.cwd) process.cwd = function () { return '.' };
+
+require.define("path", function (require, module, exports, __dirname, __filename) {
+function filter (xs, fn) {
+ var res = [];
+ for (var i = 0; i < xs.length; i++) {
+ if (fn(xs[i], i, xs)) res.push(xs[i]);
+ }
+ return res;
+}
+
+// resolves . and .. elements in a path array with directory names there
+// must be no slashes, empty elements, or device names (c:\) in the array
+// (so also no leading and trailing slashes - it does not distinguish
+// relative and absolute paths)
+function normalizeArray(parts, allowAboveRoot) {
+ // if the path tries to go above the root, `up` ends up > 0
+ var up = 0;
+ for (var i = parts.length; i >= 0; i--) {
+ var last = parts[i];
+ if (last == '.') {
+ parts.splice(i, 1);
+ } else if (last === '..') {
+ parts.splice(i, 1);
+ up++;
+ } else if (up) {
+ parts.splice(i, 1);
+ up--;
+ }
+ }
+
+ // if the path is allowed to go above the root, restore leading ..s
+ if (allowAboveRoot) {
+ for (; up--; up) {
+ parts.unshift('..');
+ }
+ }
+
+ return parts;
+}
+
+// Regex to split a filename into [*, dir, basename, ext]
+// posix version
+var splitPathRe = /^(.+\/(?!$)|\/)?((?:.+?)?(\.[^.]*)?)$/;
+
+// path.resolve([from ...], to)
+// posix version
+exports.resolve = function() {
+var resolvedPath = '',
+ resolvedAbsolute = false;
+
+for (var i = arguments.length; i >= -1 && !resolvedAbsolute; i--) {
+ var path = (i >= 0)
+ ? arguments[i]
+ : process.cwd();
+
+ // Skip empty and invalid entries
+ if (typeof path !== 'string' || !path) {
+ continue;
+ }
+
+ resolvedPath = path + '/' + resolvedPath;
+ resolvedAbsolute = path.charAt(0) === '/';
+}
+
+// At this point the path should be resolved to a full absolute path, but
+// handle relative paths to be safe (might happen when process.cwd() fails)
+
+// Normalize the path
+resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
+ return !!p;
+ }), !resolvedAbsolute).join('/');
+
+ return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
+};
+
+// path.normalize(path)
+// posix version
+exports.normalize = function(path) {
+var isAbsolute = path.charAt(0) === '/',
+ trailingSlash = path.slice(-1) === '/';
+
+// Normalize the path
+path = normalizeArray(filter(path.split('/'), function(p) {
+ return !!p;
+ }), !isAbsolute).join('/');
+
+ if (!path && !isAbsolute) {
+ path = '.';
+ }
+ if (path && trailingSlash) {
+ path += '/';
+ }
+
+ return (isAbsolute ? '/' : '') + path;
+};
+
+
+// posix version
+exports.join = function() {
+ var paths = Array.prototype.slice.call(arguments, 0);
+ return exports.normalize(filter(paths, function(p, index) {
+ return p && typeof p === 'string';
+ }).join('/'));
+};
+
+
+exports.dirname = function(path) {
+ var dir = splitPathRe.exec(path)[1] || '';
+ var isWindows = false;
+ if (!dir) {
+ // No dirname
+ return '.';
+ } else if (dir.length === 1 ||
+ (isWindows && dir.length <= 3 && dir.charAt(1) === ':')) {
+ // It is just a slash or a drive letter with a slash
+ return dir;
+ } else {
+ // It is a full dirname, strip trailing slash
+ return dir.substring(0, dir.length - 1);
+ }
+};
+
+
+exports.basename = function(path, ext) {
+ var f = splitPathRe.exec(path)[2] || '';
+ // TODO: make this comparison case-insensitive on windows?
+ if (ext && f.substr(-1 * ext.length) === ext) {
+ f = f.substr(0, f.length - ext.length);
+ }
+ return f;
+};
+
+
+exports.extname = function(path) {
+ return splitPathRe.exec(path)[3] || '';
+};
+
+});
+
+require.define("vm", function (require, module, exports, __dirname, __filename) {
+var Object_keys = function (obj) {
+ if (Object.keys) return Object.keys(obj)
+ else {
+ var res = [];
+ for (var key in obj) res.push(key)
+ return res;
+ }
+};
+
+var forEach = function (xs, fn) {
+ if (xs.forEach) return xs.forEach(fn)
+ else for (var i = 0; i < xs.length; i++) {
+ fn(xs[i], i, xs);
+ }
+};
+
+var Script = exports.Script = function NodeScript (code) {
+ if (!(this instanceof Script)) return new Script(code);
+ this.code = code;
+};
+
+var iframe = document.createElement('iframe');
+if (!iframe.style) iframe.style = {};
+iframe.style.display = 'none';
+
+var iframeCapable = true; // until proven otherwise
+if (navigator.appName === 'Microsoft Internet Explorer') {
+ var m = navigator.appVersion.match(/\bMSIE (\d+\.\d+);/);
+ if (m && parseFloat(m[1]) <= 9.0) {
+ iframeCapable = false;
+ }
+}
+
+Script.prototype.runInNewContext = function (context) {
+ if (!context) context = {};
+
+ if (!iframeCapable) {
+ var keys = Object_keys(context);
+ var args = [];
+ for (var i = 0; i < keys.length; i++) {
+ args.push(context[keys[i]]);
+ }
+
+ var fn = new Function(keys, 'return ' + this.code);
+ return fn.apply(null, args);
+ }
+
+ document.body.appendChild(iframe);
+
+ var win = iframe.contentWindow
+ || (window.frames && window.frames[window.frames.length - 1])
+ || window[window.length - 1]
+ ;
+
+ forEach(Object_keys(context), function (key) {
+ win[key] = context[key];
+ iframe[key] = context[key];
+ });
+
+ if (win.eval) {
+ // chrome and ff can just .eval()
+ var res = win.eval(this.code);
+ }
+ else {
+ // this works in IE9 but not anything newer
+ iframe.setAttribute('src',
+ 'javascript:__browserifyVmResult=(' + this.code + ')'
+ );
+ if ('__browserifyVmResult' in win) {
+ var res = win.__browserifyVmResult;
+ }
+ else {
+ iframeCapable = false;
+ res = this.runInThisContext(context);
+ }
+ }
+
+ forEach(Object_keys(win), function (key) {
+ context[key] = win[key];
+ });
+
+ document.body.removeChild(iframe);
+
+ return res;
+};
+
+Script.prototype.runInThisContext = function () {
+ return eval(this.code); // maybe...
+};
+
+Script.prototype.runInContext = function (context) {
+ // seems to be just runInNewContext on magical context objects which are
+ // otherwise indistinguishable from objects except plain old objects
+ // for the parameter segfaults node
+ return this.runInNewContext(context);
+};
+
+forEach(Object_keys(Script.prototype), function (name) {
+ exports[name] = Script[name] = function (code) {
+ var s = Script(code);
+ return s[name].apply(s, [].slice.call(arguments, 1));
+ };
+});
+
+exports.createScript = function (code) {
+ return exports.Script(code);
+};
+
+exports.createContext = Script.createContext = function (context) {
+ // not really sure what this one does
+ // seems to just make a shallow copy
+ var copy = {};
+ forEach(Object_keys(context), function (key) {
+ copy[key] = context[key];
+ });
+ return copy;
+};
+
+});
+
+require.define("/entry.js", function (require, module, exports, __dirname, __filename) {
+ var vm = require('vm');
+
+$(function () {
+ var res = vm.runInNewContext('a + 5', { a : 100 });
+ $('#res').text(res);
+});
+
+});
+require("/entry.js");
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/example/run/entry.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/example/run/entry.js
new file mode 100644
index 000000000..c7d38918c
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/example/run/entry.js
@@ -0,0 +1,6 @@
+var vm = require('vm');
+
+$(function () {
+ var res = vm.runInNewContext('a + 5', { a : 100 });
+ $('#res').text(res);
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/example/run/index.html b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/example/run/index.html
new file mode 100644
index 000000000..1ea094235
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/example/run/index.html
@@ -0,0 +1,9 @@
+<html>
+ <head>
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
+ <script src="/bundle.js"></script>
+ </head>
+ <body>
+ result = <span id="res"></span>
+ </body>
+</html>
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/example/run/server.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/example/run/server.js
new file mode 100644
index 000000000..339d3eea0
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/example/run/server.js
@@ -0,0 +1,6 @@
+var ecstatic = require('ecstatic')(__dirname);
+var http = require('http');
+http.createServer(ecstatic).listen(8000);
+
+console.log('listening on :8000');
+console.log('# remember to run browserify entry.js -o bundle.js');
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/index.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/index.js
new file mode 100644
index 000000000..816c828af
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/index.js
@@ -0,0 +1,85 @@
+var Object_keys = function (obj) {
+ if (Object.keys) return Object.keys(obj)
+ else {
+ var res = [];
+ for (var key in obj) res.push(key)
+ return res;
+ }
+};
+
+var forEach = function (xs, fn) {
+ if (xs.forEach) return xs.forEach(fn)
+ else for (var i = 0; i < xs.length; i++) {
+ fn(xs[i], i, xs);
+ }
+};
+
+var Script = exports.Script = function NodeScript (code) {
+ if (!(this instanceof Script)) return new Script(code);
+ this.code = code;
+};
+
+Script.prototype.runInNewContext = function (context) {
+ if (!context) context = {};
+
+ var iframe = document.createElement('iframe');
+ if (!iframe.style) iframe.style = {};
+ iframe.style.display = 'none';
+
+ document.body.appendChild(iframe);
+
+ var win = iframe.contentWindow;
+
+ forEach(Object_keys(context), function (key) {
+ win[key] = context[key];
+ });
+
+ if (!win.eval && win.execScript) {
+ // win.eval() magically appears when this is called in IE:
+ win.execScript('null');
+ }
+
+ var res = win.eval(this.code);
+
+ forEach(Object_keys(win), function (key) {
+ context[key] = win[key];
+ });
+
+ document.body.removeChild(iframe);
+
+ return res;
+};
+
+Script.prototype.runInThisContext = function () {
+ return eval(this.code); // maybe...
+};
+
+Script.prototype.runInContext = function (context) {
+ // seems to be just runInNewContext on magical context objects which are
+ // otherwise indistinguishable from objects except plain old objects
+ // for the parameter segfaults node
+ return this.runInNewContext(context);
+};
+
+forEach(Object_keys(Script.prototype), function (name) {
+ exports[name] = Script[name] = function (code) {
+ var s = Script(code);
+ return s[name].apply(s, [].slice.call(arguments, 1));
+ };
+});
+
+exports.createScript = function (code) {
+ return exports.Script(code);
+};
+
+exports.createContext = Script.createContext = function (context) {
+ // not really sure what this one does
+ // seems to just make a shallow copy
+ var copy = {};
+ if(typeof context === 'object') {
+ forEach(Object_keys(context), function (key) {
+ copy[key] = context[key];
+ });
+ }
+ return copy;
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/package.json b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/package.json
new file mode 100644
index 000000000..25418732e
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/package.json
@@ -0,0 +1,41 @@
+{
+ "name": "vm-browserify",
+ "version": "0.0.1",
+ "description": "vm module for the browser",
+ "main": "index.js",
+ "directories": {
+ "example": "example",
+ "test": "test"
+ },
+ "repository": {
+ "type": "git",
+ "url": "http://github.com/substack/vm-browserify.git"
+ },
+ "keywords": [
+ "vm",
+ "browser",
+ "eval"
+ ],
+ "devDependencies": {
+ "tap": "~0.2.1",
+ "browserify": "1.9.x"
+ },
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "scripts": {
+ "test": "tap test/*.js"
+ },
+ "license": "MIT/X11",
+ "engine": {
+ "node": ">=0.4.0"
+ },
+ "readme": "vm-browserify\n=============\n\nEmulate node's vm module for the browser.\n\nexample\n=======\n\nJust write some client-side javascript:\n\n``` js\nvar vm = require('vm');\n\n$(function () {\n var res = vm.runInNewContext('a + 5', { a : 100 });\n $('#res').text(res);\n});\n```\n\ncompile it with [browserify](http://github.com/substack/node-browserify):\n\n```\nbrowserify entry.js -o bundle.js\n```\n\nthen whip up some html:\n\n``` html\n<html>\n <head>\n <script src=\"http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js\"></script>\n <script src=\"/bundle.js\"></script>\n </head>\n <body>\n result = <span id=\"res\"></span>\n </body>\n</html>\n```\n\nand when you load the page you should see:\n\n```\nresult = 105\n```\n\nmethods\n=======\n\nvm.runInNewContext(code, context={})\n------------------------------------\n\nEvaluate some `code` in a new iframe with a `context`.\n\nContexts are like wrapping your code in a `with()` except slightly less terrible\nbecause the code is sandboxed into a new iframe.\n\nbrowser compatability\n=====================\n\nAll modern browsers are supported.\n\nIf you have a [browserling](http://browserling.com) account,\nfrom the testling/ directory just do:\n\n```\n$ ./test.sh substack@gmail.com\nEnter host password for user 'substack@gmail.com':\nchrome/17.0:\n vmRunInNewContext ................................. 5/5\n\niexplore/9.0:\n vmRunInNewContext ................................. 5/5\n\nfirefox/10.0:\n vmRunInNewContext ................................. 5/5\n\nsafari/5.1:\n vmRunInNewContext ................................. 5/5\n\nopera/11.6:\n vmRunInNewContext ................................. 5/5\n\ntotal ............................................... 25/25\n```\n\nIn IE8 and IE7, running `vm.runInNewContext()` more than once can cause the\nbrowsers to hang for some reason. Otherwise they work too.\n\ninstall\n=======\n\nThis module is depended upon by browserify, so you should just be able to\n`require('vm')` and it will just work. However if you want to use this module\ndirectly you can install it with [npm](http://npmjs.org):\n\n```\nnpm install vm-browserify\n```\n\nlicense\n=======\n\nMIT/X11\n",
+ "_id": "vm-browserify@0.0.1",
+ "dist": {
+ "shasum": "df973b3f726dc33bf2c561144203849dd01ac21a"
+ },
+ "_from": "vm-browserify@~0.0.0"
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/testling/run.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/testling/run.js
new file mode 100644
index 000000000..f8cdf3eae
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/testling/run.js
@@ -0,0 +1,22 @@
+var test = require('testling');
+var vm = require('./');
+
+test('vmRunInNewContext', function (t) {
+ t.plan(5);
+
+ t.equal(vm.runInNewContext('a + 5', { a : 100 }), 105);
+
+ (function () {
+ var vars = { x : 10 };
+ t.equal(vm.runInNewContext('x++', vars), 10);
+ t.equal(vars.x, 11);
+ })();
+
+ (function () {
+ var vars = { x : 10 };
+ t.equal(vm.runInNewContext('var y = 3; y + x++', vars), 13);
+ t.equal(vars.x, 11);
+ })();
+
+ t.end();
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/testling/test.sh b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/testling/test.sh
new file mode 100755
index 000000000..83e992f5c
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/node_modules/vm-browserify/testling/test.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+if test -n "$1"; then
+ user="$1"
+else
+ echo -n 'testling account: '
+ read user
+fi
+
+curl -sSNT <(tar -cf- ../index.js run.js 2>/dev/null) \
+ 'http://testling.com/?main=run.js&browsers=chrome/17.0,iexplore/9.0,firefox/10.0,safari/5.1,opera/11.6' \
+ -u "$user"
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/package.json b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/package.json
new file mode 100644
index 000000000..b633e601d
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/package.json
@@ -0,0 +1,69 @@
+{
+ "name": "browserify",
+ "version": "1.13.2",
+ "description": "browser-side require() for js directories and npm modules",
+ "main": "index.js",
+ "bin": {
+ "browserify": "bin/cmd.js"
+ },
+ "directories": {
+ "example": "example",
+ "test": "test"
+ },
+ "repository": {
+ "type": "git",
+ "url": "http://github.com/substack/node-browserify.git"
+ },
+ "keywords": [
+ "browser",
+ "require",
+ "middleware",
+ "bundle",
+ "npm",
+ "coffee",
+ "javascript"
+ ],
+ "dependencies": {
+ "detective": "~0.1.1",
+ "deputy": "~0.0.0",
+ "resolve": "~0.2.0",
+ "nub": "~0.0.0",
+ "commondir": "~0.0.1",
+ "coffee-script": "1.x.x",
+ "optimist": "~0.3.4",
+ "http-browserify": "~0.1.1",
+ "vm-browserify": "~0.0.0",
+ "crypto-browserify": "~0"
+ },
+ "devDependencies": {
+ "tap": "~0.2.5",
+ "connect": "1.8.5",
+ "hashish": ">=0.0.2 <0.1",
+ "traverse": ">=0.3.8 <0.4",
+ "backbone": "~0.9.2",
+ "dnode": "~0.9.11",
+ "jade": "0.20.0",
+ "seq": "0.3.3",
+ "jquery-browserify": "*",
+ "lazy": "1.0.x",
+ "ecstatic": "~0.1.4"
+ },
+ "author": {
+ "name": "James Halliday",
+ "email": "mail@substack.net",
+ "url": "http://substack.net"
+ },
+ "scripts": {
+ "test": "node node_modules/tap/bin/tap.js test/*.js"
+ },
+ "license": "MIT/X11",
+ "engine": {
+ "node": ">=0.6.0"
+ },
+ "readme": "browserify\n==========\n\nMake node-style require() work in the browser with a server-side build step,\nas if by magic!\n\n[![build status](https://secure.travis-ci.org/substack/node-browserify.png)](http://travis-ci.org/substack/node-browserify)\n\n![browserify!](http://substack.net/images/browserify/browserify.png)\n\nexample\n=======\n\nJust write an `entry.js` to start with some `require()`s in it:\n\n````javascript\n// use relative requires\nvar foo = require('./foo');\nvar bar = require('../lib/bar');\n\n// or use modules installed by npm in node_modules/\nvar domready = require('domready');\n\ndomready(function () {\n var elem = document.getElementById('result');\n elem.textContent = foo(100) + bar('baz');\n});\n````\n\nNow just use the `browserify` command to build a bundle starting at `entry.js`:\n\n```\n$ browserify entry.js -o bundle.js\n```\n\nAll of the modules that `entry.js` needs are included in the final bundle from a\nrecursive walk using [detective](https://github.com/substack/node-detective).\n\nTo use the bundle, just toss a `<script src=\"bundle.js\"></script>` into your\nhtml!\n\nusage\n=====\n\n````\nUsage: browserify [entry files] {OPTIONS}\n\nOptions:\n --outfile, -o Write the browserify bundle to this file.\n If unspecified, browserify prints to stdout. \n --require, -r A module name or file to bundle.require()\n Optionally use a colon separator to set the target. \n --entry, -e An entry point of your app \n --exports Export these core objects, comma-separated list\n with any of: require, process. If unspecified, the\n export behavior will be inferred.\n \n --ignore, -i Ignore a file \n --alias, -a Register an alias with a colon separator: \"to:from\"\n Example: --alias 'jquery:jquery-browserify' \n --cache, -c Turn on caching at $HOME/.config/browserling/cache.json or use\n a file for caching.\n [default: true]\n --debug, -d Switch on debugging mode with //@ sourceURL=...s. [boolean]\n --plugin, -p Use a plugin.\n Example: --plugin aliasify \n --prelude Include the code that defines require() in this bundle.\n [boolean] [default: true]\n --watch, -w Watch for changes. The script will stay open and write updates\n to the output every time any of the bundled files change.\n This option only works in tandem with -o. \n --verbose, -v Write out how many bytes were written in -o mode. This is\n especially useful with --watch. \n --help, -h Show this message \n\n````\n\ncompatability\n=============\n\nMany [npm](http://npmjs.org) modules that don't do IO will just work after being\nbrowserified. Others take more work.\n\n[coffee script](http://coffeescript.org/) should pretty much just work.\nJust do `browserify entry.coffee` or `require('./foo.coffee')`.\n\nMany node built-in modules have been wrapped to work in the browser.\nAll you need to do is `require()` them like in node.\n\n* events\n* path\n* [vm](https://github.com/substack/vm-browserify)\n* [http](https://github.com/substack/http-browserify)\n* [crypto](https://github.com/dominictarr/crypto-browserify)\n* assert\n* url\n* buffer\n* buffer_ieee754\n* util\n* querystring\n* stream\n\nprocess\n-------\n\nBrowserify makes available a faux `process` object to modules with these\nattributes:\n\n* nextTick(fn) - uses [the postMessage trick](http://dbaron.org/log/20100309-faster-timeouts)\n for a faster `setTimeout(fn, 0)` if it can\n* title - set to 'browser' for browser code, 'node' in regular node code\n* browser - `true`, good for testing if you're in a browser or in node\n\nBy default the process object is only available inside of files wrapped by\nbrowserify. To expose it, use `--exports=process`\n\n__dirname\n---------\n\nThe faux directory name, scrubbed of true directory information so as not to\nexpose your filesystem organization.\n\n__filename\n----------\n\nThe faux file path, scrubbed of true path information so as not to expose your\nfilesystem organization.\n\npackage.json\n============\n\nIn order to resolve main files for projects, the package.json \"main\" field is\nread.\n\nIf a package.json has a \"browserify\" field, you can override the standard \"main\"\nbehavior with something special just for browsers.\n\nSee [dnode's\npackage.json](https://github.com/substack/dnode/blob/9e24b97cf2ce931fbf6d7beb3731086b46bca887/package.json#L40)\nfor an example of using the \"browserify\" field.\n\nmore\n====\n\n* [browserify recipes](https://github.com/substack/node-browserify/blob/master/doc/recipes.markdown#recipes)\n* [browserify api reference](https://github.com/substack/node-browserify/blob/master/doc/methods.markdown#methods)\n* [browserify cdn](http://browserify.nodejitsu.com/)\n\ninstall\n=======\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install -g browserify\n```\n\ntest\n====\n\nTo run the node tests with tap, do:\n\n```\nnpm test\n```\n\nTo run the [testling](http://testling.com) tests,\ncreate a [browserling](http://browserling.com) account then:\n\n```\ncd testling\n./test.sh\n```\n",
+ "_id": "browserify@1.13.2",
+ "dist": {
+ "shasum": "6de8e981babf53f3446bbc53a14c2740584da9e6"
+ },
+ "_from": "browserify"
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/alias.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/alias.js
new file mode 100644
index 000000000..ed6d45d9f
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/alias.js
@@ -0,0 +1,55 @@
+var connect = require('connect');
+var http = require('http');
+var vm = require('vm');
+var browserify = require('../');
+
+var test = require('tap').test;
+
+test('alias', function (t) {
+ t.plan(5);
+ var port = 10000 + Math.floor(Math.random() * (Math.pow(2,16) - 10000));
+ var server = connect.createServer();
+
+ server.use(browserify({
+ mount : '/bundle.js',
+ require : { moo : 'seq' }
+ }));
+
+ server.listen(port, makeRequest);
+
+ function makeRequest () {
+
+ var req = { host : 'localhost', port : port, path : '/bundle.js' };
+ http.get(req, function (res) {
+ t.equal(res.statusCode, 200);
+ server.close();
+
+ var context = {
+ setTimeout : setTimeout,
+ console : console
+ };
+
+ var src = '';
+ res.on('data', function (buf) {
+ src += buf.toString();
+ });
+
+ res.on('end', function () {
+ vm.runInNewContext(src, context);
+ t.ok(context.require('moo'));
+ t.ok(context.require('seq'));
+ t.equal(context.require('seq'), context.require('moo'));
+
+ context.require('moo')([1,2,3])
+ .parMap(function (x) {
+ this(null, x * 100)
+ })
+ .seq(function () {
+ t.deepEqual(this.stack, [100,200,300]);
+ t.end();
+ })
+ ;
+ });
+ });
+ }
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/backbone.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/backbone.js
new file mode 100644
index 000000000..fcedca2e6
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/backbone.js
@@ -0,0 +1,21 @@
+var browserify = require('../');
+var vm = require('vm');
+var backbone = require('backbone');
+var test = require('tap').test;
+
+test('backbone', function (t) {
+ t.plan(3);
+ var src = browserify.bundle({
+ require : 'backbone'
+ });
+ t.ok(typeof src === 'string');
+ t.ok(src.length > 0);
+
+ var c = { console : console };
+ vm.runInNewContext(src, c);
+ t.deepEqual(
+ Object.keys(backbone).sort(),
+ Object.keys(c.require('backbone')).sort()
+ );
+ t.end();
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/bin.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/bin.js
new file mode 100644
index 000000000..23e8c0b02
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/bin.js
@@ -0,0 +1,39 @@
+var test = require('tap').test;
+var spawn = require('child_process').spawn;
+var path = require('path');
+var vm = require('vm');
+
+test('bin', function (t) {
+ t.plan(3);
+
+ var cwd = process.cwd();
+ process.chdir(__dirname);
+
+ var ps = spawn(process.execPath, [
+ path.resolve(__dirname, '../bin/cmd.js'),
+ 'entry/main.js',
+ '--exports=require'
+ ]);
+ var src = '';
+ ps.stdout.on('data', function (buf) {
+ src += buf.toString();
+ });
+
+ ps.on('exit', function (code) {
+ t.equal(code, 0);
+
+ var allDone = false;
+ var c = {
+ done : function () { allDone = true }
+ };
+
+ vm.runInNewContext(src, c);
+ t.deepEqual(
+ Object.keys(c.require.modules).sort(),
+ [ 'path', '__browserify_process', '/one.js', '/two.js', '/main.js' ].sort()
+ );
+ t.ok(allDone);
+
+ t.end();
+ });
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/bundle.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/bundle.js
new file mode 100644
index 000000000..f4e077fd4
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/bundle.js
@@ -0,0 +1,32 @@
+var browserify = require('../');
+var vm = require('vm');
+var test = require('tap').test;
+
+test('bundle', function (t) {
+ var b = browserify();
+ b.require('seq');
+ var src = b.bundle();
+
+ t.plan(3);
+
+ t.ok(typeof src === 'string');
+ t.ok(src.length > 0);
+
+ var c = {
+ setTimeout : setTimeout,
+ console : console
+ };
+ vm.runInNewContext(src, c);
+
+ c.require('seq')([1,2,3])
+ .parMap_(function (next, x) {
+ setTimeout(function () {
+ next.ok(x * 100)
+ }, 10)
+ })
+ .seq(function (x,y,z) {
+ t.deepEqual([x,y,z], [100,200,300]);
+ t.end();
+ })
+ ;
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/cache.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/cache.js
new file mode 100644
index 000000000..70bf9b118
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/cache.js
@@ -0,0 +1,28 @@
+var vm = require('vm');
+var fs = require('fs');
+var browserify = require('../');
+var test = require('tap').test;
+var crypto = require('crypto');
+
+test('cache', function (t) {
+ t.plan(2);
+
+ var file = '/tmp/' + Math.floor(Math.random() * (1<<30)).toString(16) + '.json';
+ browserify({ cache : file }).require('seq').bundle();
+ setTimeout(function () {
+ fs.readFile(file, function (err, body) {
+ if (err) t.fail(err);
+ var cache = JSON.parse(body);
+ var tfile = require.resolve('seq');
+ fs.readFile(tfile, function (err, body) {
+ var hash = new crypto.Hash('md5').update(body).digest('hex');
+ t.ok(cache[hash]);
+ t.deepEqual(
+ cache[hash].strings.sort(),
+ [ 'events', 'hashish', 'chainsaw' ].sort()
+ );
+ t.end();
+ });
+ });
+ }, 200);
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee.js
new file mode 100644
index 000000000..435f392ee
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee.js
@@ -0,0 +1,39 @@
+var vm = require('vm');
+var fs = require('fs');
+var browserify = require('../');
+var test = require('tap').test;
+
+test('coffee', function (t) {
+ t.plan(8);
+
+ var src = browserify.bundle({ require : __dirname + '/coffee/index.coffee' });
+ var c = {};
+ vm.runInNewContext(src, c);
+
+ t.equal(c.require('./foo.coffee')(5), 50);
+ t.equal(c.require('./foo')(5), 50);
+
+ t.equal(c.require('./bar.js'), 500);
+ t.equal(c.require('./bar'), 500);
+
+ t.equal(c.require('./baz.coffee'), 1000);
+ t.equal(c.require('./baz'), 1000);
+
+ t.equal(c.require('./'), 10 * 10 * 500 + 1000);
+ t.equal(c.require('./index.coffee'), 10 * 10 * 500 + 1000);
+ t.end();
+});
+
+test('coffeeEntry', function (t) {
+ var b = browserify({ entry : __dirname + '/coffee/entry.coffee' });
+ var src = b.bundle();
+
+ var c = {
+ setTimeout : setTimeout,
+ done : function (fn) {
+ t.equal(fn(10), 100);
+ t.end();
+ }
+ };
+ vm.runInNewContext(src, c);
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/bar.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/bar.js
new file mode 100644
index 000000000..74ca504b7
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/bar.js
@@ -0,0 +1 @@
+module.exports = require('./foo.coffee')(50);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/baz.coffee b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/baz.coffee
new file mode 100644
index 000000000..ae629b69b
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/baz.coffee
@@ -0,0 +1 @@
+module.exports = 1000
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/entry.coffee b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/entry.coffee
new file mode 100644
index 000000000..fdaf8add9
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/entry.coffee
@@ -0,0 +1 @@
+nested = require './nested/nested.coffee' \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/foo.coffee b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/foo.coffee
new file mode 100644
index 000000000..b756c3aad
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/foo.coffee
@@ -0,0 +1 @@
+module.exports = (x) -> x * 10
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/index.coffee b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/index.coffee
new file mode 100644
index 000000000..b54f47a5d
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/index.coffee
@@ -0,0 +1,5 @@
+bar = require './bar'
+foo = require './foo.coffee'
+baz = require './baz'
+
+module.exports = foo(foo bar) + baz
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/nested/nested.coffee b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/nested/nested.coffee
new file mode 100644
index 000000000..6e564d4dd
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/coffee/nested/nested.coffee
@@ -0,0 +1,2 @@
+foo = require '../foo.coffee'
+done(foo)
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/dnode.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/dnode.js
new file mode 100644
index 000000000..26862cf4e
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/dnode.js
@@ -0,0 +1,27 @@
+var vm = require('vm');
+var browserify = require('../');
+var test = require('tap').test;
+
+test('dnode', function (t) {
+ t.plan(2);
+
+ var src = browserify.bundle({ require : 'dnode' });
+ var c = {
+ console : console,
+ navigator : {
+ userAgent : 'foo',
+ platform : 'bar',
+ },
+ window : {
+ addEventListener : function () {},
+ },
+ document : {},
+ };
+ vm.runInNewContext(src, c);
+ var dnode = c.require('dnode');
+
+ t.ok(dnode, 'dnode object exists');
+ t.ok(dnode.connect, 'dnode.connect exists');
+
+ t.end();
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/dollar.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/dollar.js
new file mode 100644
index 000000000..6992fa665
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/dollar.js
@@ -0,0 +1,19 @@
+var browserify = require('../');
+var vm = require('vm');
+var test = require('tap').test;
+
+test('dollar', function (t) {
+ t.plan(3);
+ var src = browserify({
+ require : __dirname + '/dollar/dollar/index.js'
+ }).bundle();
+
+ t.ok(typeof src === 'string');
+ t.ok(src.length > 0);
+
+ var c = {};
+ vm.runInNewContext(src, c);
+ var res = vm.runInNewContext('require("./")(100)', c);
+ t.equal(res, 10000);
+ t.end();
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/dollar/dollar/index.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/dollar/dollar/index.js
new file mode 100644
index 000000000..a6012aa6b
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/dollar/dollar/index.js
@@ -0,0 +1,7 @@
+// foo $ bar $ baz
+
+var $ = function (x) {
+ return x * 100;
+};
+
+module.exports = $;
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/entry.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/entry.js
new file mode 100644
index 000000000..c20e22767
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/entry.js
@@ -0,0 +1,36 @@
+var browserify = require('../');
+var vm = require('vm');
+var test = require('tap').test;
+
+var setTimeout_ = function (cb, t) {
+ if (!t) {
+ process.nextTick(cb);
+ }
+ else {
+ setTimeout(cb, t);
+ }
+};
+
+test('entry', function (t) {
+ t.plan(2);
+
+ var src = browserify({ exports : [ 'require' ] })
+ .addEntry(__dirname + '/entry/main.js')
+ .bundle()
+ ;
+
+ var c = {
+ setTimeout : process.nextTick,
+ done : function (one, two) {
+ t.equal(one, 1);
+ t.equal(two, 2);
+ t.end();
+ }
+ };
+ vm.runInNewContext(src, c);
+
+ t.deepEqual(
+ Object.keys(c.require.modules).sort(),
+ [ 'path', '__browserify_process', '/one.js', '/two.js', '/main.js' ].sort()
+ );
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/entry/main.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/entry/main.js
new file mode 100644
index 000000000..89bb8a036
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/entry/main.js
@@ -0,0 +1 @@
+done(require('./one'), require('./two')); \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/entry/one.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/entry/one.js
new file mode 100644
index 000000000..bd816eaba
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/entry/one.js
@@ -0,0 +1 @@
+module.exports = 1;
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/entry/two.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/entry/two.js
new file mode 100644
index 000000000..4bbffde10
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/entry/two.js
@@ -0,0 +1 @@
+module.exports = 2;
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/error_code.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/error_code.js
new file mode 100644
index 000000000..8b97862b0
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/error_code.js
@@ -0,0 +1,24 @@
+var test = require('tap').test;
+var spawn = require('child_process').spawn;
+var path = require('path');
+
+if (false) require('__32jlkbeep');
+
+test('error code', function (t) {
+ t.plan(2);
+
+ var cwd = process.cwd();
+ process.chdir(__dirname);
+
+ var ps = spawn(process.execPath, [
+ path.resolve(__dirname, '../bin/cmd.js'),
+ path.resolve(__dirname, 'error_code/src.js')
+ ]);
+ var err = '';
+ ps.stderr.on('data', function (buf) { err += buf });
+
+ ps.on('exit', function (code) {
+ t.notEqual(code, 0);
+ t.ok(/^SyntaxError:/m.test(err));
+ });
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/error_code/src.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/error_code/src.js
new file mode 100644
index 000000000..e85c07cca
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/error_code/src.js
@@ -0,0 +1,2 @@
+var x = {
+var y = 6;
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/export.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/export.js
new file mode 100644
index 000000000..4b347e889
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/export.js
@@ -0,0 +1,52 @@
+var browserify = require('../');
+var vm = require('vm');
+var test = require('tap').test;
+
+test('only export require', function (t) {
+ t.plan(1);
+ var src = browserify().bundle();
+ var c = {};
+ vm.runInNewContext(src, c);
+ t.same(Object.keys(c), [ 'require' ]);
+});
+
+test('no exports when entries are defined', function (t) {
+ t.plan(1);
+ var src = browserify(__dirname + '/export/entry.js').bundle();
+ var c = {};
+ vm.runInNewContext(src, c);
+ t.same(c, {});
+});
+
+test('override require export', function (t) {
+ t.plan(1);
+ var src = browserify({ exports : [ 'require' ] })
+ .addEntry(__dirname + '/export/entry.js')
+ .bundle()
+ ;
+ var c = {};
+ vm.runInNewContext(src, c);
+ t.same(Object.keys(c), [ 'require' ]);
+});
+
+test('override process export', function (t) {
+ t.plan(1);
+ var src = browserify({ exports : [ 'process' ] })
+ .addEntry(__dirname + '/export/entry.js')
+ .bundle()
+ ;
+ var c = {};
+ vm.runInNewContext(src, c);
+ t.same(Object.keys(c), [ 'process' ]);
+});
+
+test('override require and process export', function (t) {
+ t.plan(1);
+ var src = browserify({ exports : [ 'require', 'process' ] })
+ .addEntry(__dirname + '/export/entry.js')
+ .bundle()
+ ;
+ var c = {};
+ vm.runInNewContext(src, c);
+ t.same(Object.keys(c).sort(), [ 'require', 'process' ].sort());
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/export/entry.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/export/entry.js
new file mode 100644
index 000000000..6f037f8a9
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/export/entry.js
@@ -0,0 +1 @@
+// nop
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field.js
new file mode 100644
index 000000000..a51b274d4
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field.js
@@ -0,0 +1,64 @@
+var assert = require('assert');
+var browserify = require('../');
+var vm = require('vm');
+var test = require('tap').test;
+
+test('fieldString', function (t) {
+ t.plan(1);
+
+ var dir = __dirname + '/field/';
+ var src = browserify({ require : dir + '/string.js' }).bundle();
+
+ var c = {};
+ vm.runInNewContext(src, c);
+ t.equal(
+ c.require('./string.js'),
+ 'browser'
+ );
+ t.end();
+});
+
+test('fieldObject', function (t) {
+ t.plan(1);
+
+ var dir = __dirname + '/field/';
+ var src = browserify({ require : dir + '/object.js' }).bundle();
+
+ var c = {};
+ vm.runInNewContext(src, c);
+ t.equal(
+ c.require('./object.js'),
+ 'browser'
+ );
+ t.end();
+});
+
+test('missObject', function (t) {
+ t.plan(1);
+
+ var dir = __dirname + '/field/';
+ var src = browserify({ require : dir + '/miss.js' }).bundle();
+
+ var c = {};
+ vm.runInNewContext(src, c);
+ t.equal(
+ c.require('./miss.js'),
+ '!browser'
+ );
+ t.end();
+});
+
+test('fieldSub', function (t) {
+ t.plan(1);
+
+ var dir = __dirname + '/field/';
+ var src = browserify({ require : dir + '/sub.js' }).bundle();
+
+ var c = {};
+ vm.runInNewContext(src, c);
+ t.equal(
+ c.require('./sub.js'),
+ 'browser'
+ );
+ t.end();
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/miss.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/miss.js
new file mode 100644
index 000000000..361999048
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/miss.js
@@ -0,0 +1 @@
+module.exports = require('z-miss')
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-miss/browser.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-miss/browser.js
new file mode 100644
index 000000000..842765579
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-miss/browser.js
@@ -0,0 +1 @@
+module.exports = 'browser';
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-miss/main.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-miss/main.js
new file mode 100644
index 000000000..219e0f97d
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-miss/main.js
@@ -0,0 +1 @@
+module.exports = '!browser';
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-miss/package.json b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-miss/package.json
new file mode 100644
index 000000000..c1b67aedd
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-miss/package.json
@@ -0,0 +1,4 @@
+{
+ "main" : "main.js",
+ "browserify" : {}
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-object/browser.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-object/browser.js
new file mode 100644
index 000000000..842765579
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-object/browser.js
@@ -0,0 +1 @@
+module.exports = 'browser';
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-object/main.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-object/main.js
new file mode 100644
index 000000000..219e0f97d
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-object/main.js
@@ -0,0 +1 @@
+module.exports = '!browser';
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-object/package.json b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-object/package.json
new file mode 100644
index 000000000..4c0f10bad
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-object/package.json
@@ -0,0 +1,6 @@
+{
+ "main" : "main.js",
+ "browserify" : {
+ "main" : "browser.js"
+ }
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-string/browser.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-string/browser.js
new file mode 100644
index 000000000..842765579
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-string/browser.js
@@ -0,0 +1 @@
+module.exports = 'browser';
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-string/main.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-string/main.js
new file mode 100644
index 000000000..219e0f97d
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-string/main.js
@@ -0,0 +1 @@
+module.exports = '!browser';
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-string/package.json b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-string/package.json
new file mode 100644
index 000000000..8647c0fb0
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-string/package.json
@@ -0,0 +1,4 @@
+{
+ "main" : "main.js",
+ "browserify" : "browser.js"
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-sub/browser/a.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-sub/browser/a.js
new file mode 100644
index 000000000..0952f7666
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-sub/browser/a.js
@@ -0,0 +1 @@
+module.exports = require('./b');
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-sub/browser/b.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-sub/browser/b.js
new file mode 100644
index 000000000..842765579
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-sub/browser/b.js
@@ -0,0 +1 @@
+module.exports = 'browser';
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-sub/main.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-sub/main.js
new file mode 100644
index 000000000..219e0f97d
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-sub/main.js
@@ -0,0 +1 @@
+module.exports = '!browser';
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-sub/package.json b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-sub/package.json
new file mode 100644
index 000000000..4f4ed6291
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/node_modules/z-sub/package.json
@@ -0,0 +1,4 @@
+{
+ "main" : "main.js",
+ "browserify" : "browser/a.js"
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/object.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/object.js
new file mode 100644
index 000000000..c373dc9e4
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/object.js
@@ -0,0 +1 @@
+module.exports = require('z-object')
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/string.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/string.js
new file mode 100644
index 000000000..ee4c65d36
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/string.js
@@ -0,0 +1 @@
+module.exports = require('z-string')
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/sub.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/sub.js
new file mode 100644
index 000000000..8c662a97f
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/field/sub.js
@@ -0,0 +1 @@
+module.exports = require('z-sub')
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/jade.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/jade.js
new file mode 100644
index 000000000..1419367ef
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/jade.js
@@ -0,0 +1,35 @@
+var browserify = require('../');
+var vm = require('vm');
+var jade = require('jade');
+var test = require('tap').test;
+
+test('jade', function (t) {
+ t.plan(5);
+ var b = browserify({
+ require : 'jade',
+ ignore : [
+ 'coffee-script', 'less', 'sass', 'stylus', 'markdown', 'discount',
+ 'markdown-js'
+ ]
+ });
+ var src = b.bundle();
+
+ t.ok(typeof src === 'string');
+ t.ok(src.length > 0);
+
+ var c = { console : console };
+ vm.runInNewContext(src, c);
+ var j = c.require('jade');
+ t.deepEqual(
+ Object.keys(jade),
+ Object.keys(j)
+ );
+
+ jade.render('div #{x}\n span moo', { x : 42 }, function (err, r0) {
+ t.equal(r0, '<div>42<span>moo</span></div>');
+ jade.render('div #{x}\n span moo', { x : 42 }, function (err, r1) {
+ t.equal(r0, r1);
+ t.end();
+ });
+ });
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/maxlisteners.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/maxlisteners.js
new file mode 100644
index 000000000..cee5dc82e
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/maxlisteners.js
@@ -0,0 +1,8 @@
+var EventEmitter = require('../builtins/events').EventEmitter;
+var test = require('tap').test;
+
+test('setMaxListener', function (t) {
+ var ee = new EventEmitter;
+ ee.setMaxListeners(5);
+ t.end();
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/middleware.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/middleware.js
new file mode 100644
index 000000000..3aa401afb
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/middleware.js
@@ -0,0 +1,31 @@
+var fs = require('fs');
+var vm = require('vm');
+var browserify = require('../');
+var test = require('tap').test;
+
+test('middleware', function (t) {
+ t.plan(1);
+ var bundle = browserify().use(function (b) {
+ b.files.middleware = {
+ target : '/node_modules/middleware/index.js',
+ body : 'module.exports = 555'
+ };
+ });
+
+ bundle.require('middleware');
+
+ var src = bundle.bundle();
+ var c = { console : console };
+ vm.runInNewContext(src, c);
+
+ t.equal(c.require('middleware'), 555);
+ t.end();
+});
+
+test('fn', function (t) {
+ t.plan(2);
+ var b = browserify().append('doom');
+ t.equal(typeof b, 'function');
+ t.equal(typeof b.bundle, 'function');
+ t.end();
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/multi_entry.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/multi_entry.js
new file mode 100644
index 000000000..5053261f8
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/multi_entry.js
@@ -0,0 +1,20 @@
+var browserify = require('../');
+var vm = require('vm');
+var test = require('tap').test;
+
+test('multi entry', function (t) {
+ t.plan(3);
+
+ var src = browserify(__dirname + '/multi_entry/a.js', {
+ entry : [
+ __dirname + '/multi_entry/b.js',
+ __dirname + '/multi_entry/c.js'
+ ]
+ }).bundle();
+
+ var c = {
+ times : 0,
+ t : t
+ };
+ vm.runInNewContext(src, c);
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/multi_entry/a.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/multi_entry/a.js
new file mode 100644
index 000000000..d4e250ee9
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/multi_entry/a.js
@@ -0,0 +1,2 @@
+times ++;
+t.equal(times, 1);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/multi_entry/b.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/multi_entry/b.js
new file mode 100644
index 000000000..bed7bbbaf
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/multi_entry/b.js
@@ -0,0 +1,2 @@
+times ++;
+t.equal(times, 2);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/multi_entry/c.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/multi_entry/c.js
new file mode 100644
index 000000000..2d0db3cc5
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/multi_entry/c.js
@@ -0,0 +1,3 @@
+times ++;
+t.equal(times, 3);
+t.end();
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/multi_ignore.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/multi_ignore.js
new file mode 100755
index 000000000..c78d106ae
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/multi_ignore.js
@@ -0,0 +1,23 @@
+var browserify = require('../');
+var test = require('tap').test;
+
+test('multi ignore', function (t) {
+
+ var bundle = browserify(__dirname + '/multi_entry/a.js', {
+ ignore : [
+ __dirname + '/multi_entry/b.js'
+ ]
+ });
+ t.ok(bundle.ignoring[__dirname + '/multi_entry/b.js']);
+
+ bundle.ignore(__dirname + '/multi_entry/c.js');
+ t.ok(bundle.ignoring[__dirname + '/multi_entry/b.js']);
+ t.ok(bundle.ignoring[__dirname + '/multi_entry/c.js']);
+
+ bundle.ignore(__dirname + '/multi_entry/d.js');
+ t.ok(bundle.ignoring[__dirname + '/multi_entry/b.js']);
+ t.ok(bundle.ignoring[__dirname + '/multi_entry/c.js']);
+ t.ok(bundle.ignoring[__dirname + '/multi_entry/d.js']);
+
+ t.end();
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/node_modules/beep/index.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/node_modules/beep/index.js
new file mode 100644
index 000000000..2d3c19425
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/node_modules/beep/index.js
@@ -0,0 +1 @@
+module.exports = 'boop'
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/retarget.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/retarget.js
new file mode 100644
index 000000000..6e57bf518
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/retarget.js
@@ -0,0 +1,27 @@
+var test = require('tap').test;
+var spawn = require('child_process').spawn;
+var path = require('path');
+var vm = require('vm');
+
+test('retarget with -r', function (t) {
+ t.plan(2);
+
+ var cwd = process.cwd();
+ process.chdir(__dirname);
+
+ var ps = spawn(process.execPath, [
+ path.resolve(__dirname, '../bin/cmd.js'),
+ '-r', 'beep',
+ '--exports=require'
+ ]);
+ var src = '';
+ ps.stdout.on('data', function (buf) { src += buf });
+
+ ps.on('exit', function (code) {
+ t.equal(code, 0);
+
+ var c = {};
+ vm.runInNewContext(src, c);
+ t.equal(c.require('beep'), 'boop');
+ });
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/seq.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/seq.js
new file mode 100644
index 000000000..523b9dddc
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/seq.js
@@ -0,0 +1,47 @@
+var connect = require('connect');
+var http = require('http');
+var vm = require('vm');
+var browserify = require('../');
+var test = require('tap').test;
+
+test('seq', function (t) {
+ t.plan(2);
+
+ var port = 10000 + Math.floor(Math.random() * (Math.pow(2,16) - 10000));
+ var server = connect.createServer();
+
+ server.use(browserify({
+ mount : '/bundle.js',
+ require : [ 'seq' ],
+ }));
+
+ server.listen(port, makeRequest);
+
+ function makeRequest () {
+ var req = { host : 'localhost', port : port, path : '/bundle.js' };
+ http.get(req, function (res) {
+ t.equal(res.statusCode, 200);
+ server.close();
+
+ var context = { setTimeout : setTimeout };
+
+ var src = '';
+ res.on('data', function (buf) {
+ src += buf.toString();
+ });
+
+ res.on('end', function () {
+ vm.runInNewContext(src, context);
+ context.require('seq')([1,2,3])
+ .parMap(function (x) {
+ this(null, x * 100)
+ })
+ .seq(function () {
+ t.deepEqual(this.stack, [100,200,300]);
+ t.end();
+ })
+ ;
+ });
+ });
+ }
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/subdep.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/subdep.js
new file mode 100644
index 000000000..8c7470809
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/subdep.js
@@ -0,0 +1,26 @@
+var browserify = require('../');
+var vm = require('vm');
+var test = require('tap').test;
+
+test('subdep', function (t) {
+ t.plan(1);
+
+ var src = browserify.bundle({ require : __dirname + '/subdep/index.js' });
+ var c = {};
+ vm.runInNewContext(src, c);
+ t.deepEqual(
+ Object.keys(c.require.modules).sort(),
+ [
+ '/package.json',
+ '/index.js',
+ '/node_modules/qq/package.json',
+ '/node_modules/qq/b.js',
+ '/node_modules/qq/node_modules/a/package.json',
+ '/node_modules/qq/node_modules/a/index.js',
+ '/node_modules/qq/node_modules/z/index.js',
+ 'path',
+ '__browserify_process'
+ ].sort()
+ );
+ t.end();
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/subdep/index.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/subdep/index.js
new file mode 100644
index 000000000..f05301b7f
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/subdep/index.js
@@ -0,0 +1 @@
+module.exports = require('qq');
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/subdep/package.json b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/subdep/package.json
new file mode 100644
index 000000000..518d22aa9
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/subdep/package.json
@@ -0,0 +1,6 @@
+{
+ "dependencies" : {
+ "qq" : "*"
+ },
+ "main" : "index.js"
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/util.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/util.js
new file mode 100644
index 000000000..02ce8f4fa
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/util.js
@@ -0,0 +1,48 @@
+var browserify = require('../');
+var test = require('tap').test;
+var util = require('util');
+var vm = require('vm');
+
+test('util.inspect', function (t) {
+ t.plan(1);
+ var src = browserify().require('util').bundle();
+ var c = {};
+ vm.runInNewContext(src, c);
+ t.equal(
+ c.require('util').inspect([1,2,3]),
+ util.inspect([1,2,3])
+ );
+ t.end();
+});
+
+test('util.inherits', function (t) {
+ t.plan(2);
+ var src = browserify().require('util').require('events').bundle();
+ var c = {};
+ vm.runInNewContext(src, c);
+ var EE = c.require('events').EventEmitter;
+
+ function Beep () {}
+ c.require('util').inherits(Beep, EE);
+ var beep = new Beep;
+
+ t.ok(beep instanceof Beep);
+ t.ok(beep instanceof EE);
+ t.end();
+});
+
+test('util.inherits without Object.create', function (t) {
+ t.plan(2);
+ var src = browserify().require('util').require('events').bundle();
+ var c = { Object : {} };
+ vm.runInNewContext(src, c);
+ var EE = c.require('events').EventEmitter;
+
+ function Beep () {}
+ c.require('util').inherits(Beep, EE);
+ var beep = new Beep;
+
+ t.ok(beep instanceof Beep);
+ t.ok(beep instanceof EE);
+ t.end();
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/watch.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/watch.js
new file mode 100644
index 000000000..d32044496
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/watch.js
@@ -0,0 +1,91 @@
+var connect = require('connect');
+var http = require('http');
+var vm = require('vm');
+var fs = require('fs');
+var path = require('path');
+var test = require('tap').test;
+
+test('watch', function (t) {
+ t.plan(8);
+
+ var port = 10000 + Math.floor(Math.random() * (Math.pow(2,16) - 10000));
+ var server = connect.createServer();
+
+ var filters = 0;
+
+ var bundle = require('../')({
+ require : path.resolve(__dirname, 'watch/a.js'),
+ mount : '/bundle.js',
+ filter : function (src) {
+ filters ++;
+ if (filters === 2) t.ok(true, 'has 2');
+ return src;
+ },
+ watch : { interval : 100 },
+ });
+ server.use(bundle);
+
+ server.use(connect.static(path.resolve(__dirname, 'watch')));
+
+ server.listen(port, function () {
+ setTimeout(compareSources, 1000);
+ });
+
+ function getBundle (cb) {
+ var req = { host : 'localhost', port : port, path : '/bundle.js' };
+ setTimeout(function () {
+ http.get(req, function (res) {
+ t.equal(res.statusCode, 200);
+
+ var src = '';
+ res.on('data', function (buf) {
+ src += buf.toString();
+ });
+
+ res.on('end', function () {
+ cb(src)
+ });
+ });
+ }, 50);
+ }
+
+ function compareSources () {
+ getBundle(function (s1) {
+ var m0 = bundle.modified;
+ t.ok(m0);
+
+ var c1 = {};
+ vm.runInNewContext(s1, c1);
+ var a1 = c1.require('./a');
+
+ var a2 = Math.floor(Math.random() * 10000);
+ var s2_ = bundle.bundle();
+
+ getBundle(function (s2) {
+ t.notEqual(s1, s2, 'sources are equal');
+
+ var c2 = {};
+ vm.runInNewContext(s2, c2);
+ var a2_ = c2.require('./a');
+
+ var m1 = bundle.modified;
+ t.ok(m1);
+ t.ok(m1 > m0);
+
+ fs.writeFileSync(
+ path.resolve(__dirname, 'watch/a.js'),
+ 'module.exports = ' + a1
+ );
+
+ server.close();
+ t.deepEqual(a2, a2_);
+ t.end();
+ });
+
+ fs.writeFileSync(
+ path.resolve(__dirname, 'watch/a.js'),
+ 'module.exports = ' + a2
+ );
+ });
+ }
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/watch/a.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/watch/a.js
new file mode 100644
index 000000000..767ad3e4d
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/watch/a.js
@@ -0,0 +1 @@
+module.exports = 1966 \ No newline at end of file
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap.js
new file mode 100644
index 000000000..e0e4767ef
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap.js
@@ -0,0 +1,43 @@
+var path = require('path');
+var browserify = require('../');
+var test = require('tap').test;
+
+function filter (x) {
+ var s = path.resolve(__dirname, 'wrap/');
+ return x.slice(0, s.length) === s;
+}
+
+test('wrap', function (t) {
+ t.plan(1);
+ var files = browserify({ require : __dirname + '/wrap/a.js' }).files;
+
+ t.deepEqual(Object.keys(files).filter(filter).sort(), [
+ path.resolve(__dirname, 'wrap/a.js'),
+ path.resolve(__dirname, 'wrap/node_modules/b/main.js'),
+ path.resolve(__dirname, 'wrap/node_modules/b/package.json'),
+ path.resolve(__dirname, 'wrap/c.js'),
+ path.resolve(__dirname, 'wrap/x.js'),
+ ].sort());
+ t.end();
+});
+
+test('wrapArray', function (t) {
+ t.plan(1);
+ var files = browserify({
+ require : [
+ __dirname + '/wrap/a.js',
+ __dirname + '/wrap/skipme.js',
+ ]
+ }).files;
+
+ t.deepEqual(Object.keys(files).filter(filter).sort(), [
+ path.resolve(__dirname, 'wrap/a.js'),
+ path.resolve(__dirname, 'wrap/node_modules/b/main.js'),
+ path.resolve(__dirname, 'wrap/node_modules/b/package.json'),
+ path.resolve(__dirname, 'wrap/c.js'),
+ path.resolve(__dirname, 'wrap/x.js'),
+ path.resolve(__dirname, 'wrap/skipme.js'),
+ path.resolve(__dirname, 'wrap/node_modules/skipmetoo/index.js'),
+ ].sort());
+ t.end();
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/a.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/a.js
new file mode 100644
index 000000000..ecbc2b418
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/a.js
@@ -0,0 +1,2 @@
+var b = require('b');
+var c = require('./c');
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/c.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/c.js
new file mode 100644
index 000000000..4e973e637
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/c.js
@@ -0,0 +1 @@
+require('vm');
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/node_modules/b/main.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/node_modules/b/main.js
new file mode 100644
index 000000000..61cc48996
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/node_modules/b/main.js
@@ -0,0 +1 @@
+require('../../x.js');
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/node_modules/b/package.json b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/node_modules/b/package.json
new file mode 100644
index 000000000..27307c989
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/node_modules/b/package.json
@@ -0,0 +1,3 @@
+{
+ "main" : "main.js"
+}
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/node_modules/skipmetoo/index.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/node_modules/skipmetoo/index.js
new file mode 100644
index 000000000..f7cc7e617
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/node_modules/skipmetoo/index.js
@@ -0,0 +1 @@
+require('../../skipme');
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/skipme.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/skipme.js
new file mode 100644
index 000000000..fef29fa8b
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/skipme.js
@@ -0,0 +1 @@
+require('skipmetoo');
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/x.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/x.js
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/test/wrap/x.js
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/testling/README.markdown b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/testling/README.markdown
new file mode 100644
index 000000000..7f52fd357
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/testling/README.markdown
@@ -0,0 +1,29 @@
+browserify testling tests
+=========================
+
+Make a [browserling](http://browserling.com) account to run this test through
+[testling](http://testling.com).
+
+```
+$ ./test.sh
+testling user: substack@gmail.com
+Enter host password for user 'substack@gmail.com':
+Bundling... done
+
+iexplore/7.0 0/0 0 % ok
+ Log: 15
+iexplore/8.0 0/0 0 % ok
+ Log: 16
+iexplore/9.0 0/0 0 % ok
+ Log: 1
+chrome/15.0 0/0 0 % ok
+ Log: 0
+firefox/7.0 0/0 0 % ok
+ Log: 1
+opera/11.5 0/0 0 % ok
+ Log: 0
+safari/5.1 0/0 0 % ok
+ Log: 3
+
+total 0/0 0 % ok
+```
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/testling/test.sh b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/testling/test.sh
new file mode 100755
index 000000000..9992bfdff
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/testling/test.sh
@@ -0,0 +1,28 @@
+#!/bin/bash
+echo -n 'testling user: '
+read user
+
+stty -echo
+echo -n 'password: '
+read pass
+stty echo
+
+function tick () {
+ cat <(echo 'process={};') ../wrappers/process.js tick.js \
+ | curl -sSNT- -u "$user:$pass" testling.com
+}
+
+function util () {
+ tar -cf- util.js ../builtins/util.js |
+ curl -sSNT- -u "$user:$pass" \
+ 'http://testling.com/?main=util.js&noinstrument=builtins/util.js'
+}
+
+if test -z "$1"; then
+ tick
+ util
+elif test "$1" == 'tick'; then
+ tick
+elif test "$1" == 'util'; then
+ util
+fi
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/testling/tick.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/testling/tick.js
new file mode 100644
index 000000000..30f304d2b
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/testling/tick.js
@@ -0,0 +1,9 @@
+var test = require('testling');
+
+test('nextTick', function (t) {
+ var t0 = new Date;
+ process.nextTick(function () {
+ t.log(new Date - t0);
+ t.end();
+ });
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/testling/util.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/testling/util.js
new file mode 100644
index 000000000..8280cafa1
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/testling/util.js
@@ -0,0 +1,24 @@
+var test = require('testling');
+var util = require('./builtins/util');
+var EventEmitter = require('events').EventEmitter;
+
+test('util.inspect', function (t) {
+ t.plan(1);
+ t.equal(util.inspect([1,2,3]), '[ 1, 2, 3 ]');
+ t.end();
+});
+
+test('util.inherits', function (t) {
+ t.plan(2);
+
+ function Beep () {}
+ util.inherits(Beep, EventEmitter);
+ var beep = new Beep;
+
+ t.ok(beep instanceof Beep, 'is a Beep');
+ t.ok(
+ (beep instanceof EventEmitter) || typeof beep.emit === 'function',
+ 'is an EventEmitter'
+ );
+ t.end();
+});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/alias.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/alias.js
new file mode 100644
index 000000000..cb6691931
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/alias.js
@@ -0,0 +1 @@
+require.alias($from, $to);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/body.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/body.js
new file mode 100644
index 000000000..b1c3cf4a8
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/body.js
@@ -0,0 +1 @@
+require.define($__filename,function(require,module,exports,__dirname,__filename,process){$body});
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/body_debug.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/body_debug.js
new file mode 100644
index 000000000..8610eb337
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/body_debug.js
@@ -0,0 +1 @@
+require.define($__filename,Function(['require','module','exports','__dirname','__filename','process'],$body));
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/entry.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/entry.js
new file mode 100644
index 000000000..66d83b8a2
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/entry.js
@@ -0,0 +1,2 @@
+require.define($__filename,function(require,module,exports,__dirname,__filename,process){$body});
+require($__filename);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/entry_debug.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/entry_debug.js
new file mode 100644
index 000000000..fdab8ff03
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/entry_debug.js
@@ -0,0 +1,2 @@
+require.define($__filename,Function(['require','module','exports','__dirname','__filename','process'],$body));
+require($__filename);
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/package.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/package.js
new file mode 100644
index 000000000..275936c9e
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/package.js
@@ -0,0 +1,3 @@
+require.modules[$__filename] = function () {
+ return $body;
+};
diff --git a/deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/prelude.js b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/prelude.js
new file mode 100644
index 000000000..7cb6291a4
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-platform/node_modules/browserify/wrappers/prelude.js
@@ -0,0 +1,176 @@
+var require = function (file, cwd) {
+ var resolved = require.resolve(file, cwd || '/');
+ var mod = require.modules[resolved];
+ if (!mod) throw new Error(
+ 'Failed to resolve module ' + file + ', tried ' + resolved
+ );
+ var res = mod._cached ? mod._cached : mod();
+ return res;
+}
+
+require.paths = [];
+require.modules = {};
+require.extensions = $extensions;
+
+require._core = {
+ 'assert': true,
+ 'events': true,
+ 'fs': true,
+ 'path': true,
+ 'vm': true
+};
+
+require.resolve = (function () {
+ return function (x, cwd) {
+ if (!cwd) cwd = '/';
+
+ if (require._core[x]) return x;
+ var path = require.modules.path();
+ cwd = path.resolve('/', cwd);
+ var y = cwd || '/';
+
+ if (x.match(/^(?:\.\.?\/|\/)/)) {
+ var m = loadAsFileSync(path.resolve(y, x))
+ || loadAsDirectorySync(path.resolve(y, x));
+ if (m) return m;
+ }
+
+ var n = loadNodeModulesSync(x, y);
+ if (n) return n;
+
+ throw new Error("Cannot find module '" + x + "'");
+
+ function loadAsFileSync (x) {
+ x = path.normalize(x);
+ if (require.modules[x]) {
+ return x;
+ }
+
+ for (var i = 0; i < require.extensions.length; i++) {
+ var ext = require.extensions[i];
+ if (require.modules[x + ext]) return x + ext;
+ }
+ }
+
+ function loadAsDirectorySync (x) {
+ x = x.replace(/\/+$/, '');
+ var pkgfile = path.normalize(x + '/package.json');
+ if (require.modules[pkgfile]) {
+ var pkg = require.modules[pkgfile]();
+ var b = pkg.browserify;
+ if (typeof b === 'object' && b.main) {
+ var m = loadAsFileSync(path.resolve(x, b.main));
+ if (m) return m;
+ }
+ else if (typeof b === 'string') {
+ var m = loadAsFileSync(path.resolve(x, b));
+ if (m) return m;
+ }
+ else if (pkg.main) {
+ var m = loadAsFileSync(path.resolve(x, pkg.main));
+ if (m) return m;
+ }
+ }
+
+ return loadAsFileSync(x + '/index');
+ }
+
+ function loadNodeModulesSync (x, start) {
+ var dirs = nodeModulesPathsSync(start);
+ for (var i = 0; i < dirs.length; i++) {
+ var dir = dirs[i];
+ var m = loadAsFileSync(dir + '/' + x);
+ if (m) return m;
+ var n = loadAsDirectorySync(dir + '/' + x);
+ if (n) return n;
+ }
+
+ var m = loadAsFileSync(x);
+ if (m) return m;
+ }
+
+ function nodeModulesPathsSync (start) {
+ var parts;
+ if (start === '/') parts = [ '' ];
+ else parts = path.normalize(start).split('/');
+
+ var dirs = [];
+ for (var i = parts.length - 1; i >= 0; i--) {
+ if (parts[i] === 'node_modules') continue;
+ var dir = parts.slice(0, i + 1).join('/') + '/node_modules';
+ dirs.push(dir);
+ }
+
+ return dirs;
+ }
+ };
+})();
+
+require.alias = function (from, to) {
+ var path = require.modules.path();
+ var res = null;
+ try {
+ res = require.resolve(from + '/package.json', '/');
+ }
+ catch (err) {
+ res = require.resolve(from, '/');
+ }
+ var basedir = path.dirname(res);
+
+ var keys = (Object.keys || function (obj) {
+ var res = [];
+ for (var key in obj) res.push(key)
+ return res;
+ })(require.modules);
+
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ if (key.slice(0, basedir.length + 1) === basedir + '/') {
+ var f = key.slice(basedir.length);
+ require.modules[to + f] = require.modules[basedir + f];
+ }
+ else if (key === basedir) {
+ require.modules[to] = require.modules[basedir];
+ }
+ }
+};
+
+(function () {
+ var process = {};
+
+ require.define = function (filename, fn) {
+ if (require.modules.__browserify_process) {
+ process = require.modules.__browserify_process();
+ }
+
+ var dirname = require._core[filename]
+ ? ''
+ : require.modules.path().dirname(filename)
+ ;
+
+ var require_ = function (file) {
+ return require(file, dirname)
+ };
+ require_.resolve = function (name) {
+ return require.resolve(name, dirname);
+ };
+ require_.modules = require.modules;
+ require_.define = require.define;
+ var module_ = { exports : {} };
+
+ require.modules[filename] = function () {
+ require.modules[filename]._cached = module_.exports;
+ fn.call(
+ module_.exports,
+ require_,
+ module_,
+ module_.exports,
+ dirname,
+ filename,
+ process
+ );
+ require.modules[filename]._cached = module_.exports;
+ return module_.exports;
+ };
+ };
+})();
diff --git a/deps/npm/test/packages/npm-test-shrinkwrap/node_modules/npm-test-single-file/index.js b/deps/npm/test/packages/npm-test-shrinkwrap/node_modules/npm-test-single-file/index.js
new file mode 100644
index 000000000..9ef57a59f
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-shrinkwrap/node_modules/npm-test-single-file/index.js
@@ -0,0 +1,10 @@
+/**package
+ * { "name": "npm-test-single-file"
+ * , "main": "index.js"
+ * , "version": "1.2.3"
+ * , "description":"No package.json in sight!"
+ * , "dependencies": { "minimatch": "*" }
+ * }
+ **/
+
+module.exports = "I'm just a lonely index, naked as the day I was born."
diff --git a/deps/npm/test/packages/npm-test-shrinkwrap/node_modules/npm-test-single-file/package.json b/deps/npm/test/packages/npm-test-shrinkwrap/node_modules/npm-test-single-file/package.json
new file mode 100644
index 000000000..e1fd93f9e
--- /dev/null
+++ b/deps/npm/test/packages/npm-test-shrinkwrap/node_modules/npm-test-single-file/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "npm-test-single-file",
+ "main": "index.js",
+ "version": "1.2.3",
+ "description": "No package.json in sight!",
+ "dependencies": {
+ "minimatch": "*"
+ },
+ "_npmUser": {
+ "name": "isaacs",
+ "email": "i@izs.me"
+ },
+ "_id": "npm-test-single-file@1.2.3",
+ "devDependencies": {},
+ "optionalDependencies": {},
+ "engines": {
+ "node": "*"
+ },
+ "_engineSupported": true,
+ "_npmVersion": "1.1.4",
+ "_nodeVersion": "v0.7.6-pre",
+ "_defaultsLoaded": true,
+ "dist": {
+ "shasum": "5b9c9b369eeedd42c43f057504e54aef1f37948f"
+ },
+ "_from": "npm-test-single-file@https://raw.github.com/gist/1837112/index.js"
+}
diff --git a/deps/v8/src/accessors.cc b/deps/v8/src/accessors.cc
index 8048738b2..8aabad0d0 100644
--- a/deps/v8/src/accessors.cc
+++ b/deps/v8/src/accessors.cc
@@ -755,6 +755,9 @@ MaybeObject* Accessors::FunctionGetCaller(Object* object, void*) {
caller = potential_caller;
potential_caller = it.next();
}
+ if (!caller->shared()->native() && potential_caller != NULL) {
+ caller = potential_caller;
+ }
// If caller is bound, return null. This is compatible with JSC, and
// allows us to make bound functions use the strict function map
// and its associated throwing caller and arguments.
diff --git a/deps/v8/src/ic.cc b/deps/v8/src/ic.cc
index 0ad0670c3..d169993e3 100644
--- a/deps/v8/src/ic.cc
+++ b/deps/v8/src/ic.cc
@@ -992,7 +992,7 @@ void LoadIC::UpdateCaches(LookupResult* lookup,
if (callback->IsAccessorInfo()) {
Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(callback);
if (v8::ToCData<Address>(info->getter()) == 0) return;
- if (!receiver->HasFastProperties()) return;
+ if (!holder->HasFastProperties()) return;
if (!info->IsCompatibleReceiver(*receiver)) return;
code = isolate()->stub_cache()->ComputeLoadCallback(
name, receiver, holder, info);
@@ -1000,7 +1000,7 @@ void LoadIC::UpdateCaches(LookupResult* lookup,
Handle<Object> getter(Handle<AccessorPair>::cast(callback)->getter());
if (!getter->IsJSFunction()) return;
if (holder->IsGlobalObject()) return;
- if (!receiver->HasFastProperties()) return;
+ if (!holder->HasFastProperties()) return;
code = isolate()->stub_cache()->ComputeLoadViaGetter(
name, receiver, holder, Handle<JSFunction>::cast(getter));
} else {
@@ -1269,7 +1269,7 @@ void KeyedLoadIC::UpdateCaches(LookupResult* lookup,
Handle<AccessorInfo> callback =
Handle<AccessorInfo>::cast(callback_object);
if (v8::ToCData<Address>(callback->getter()) == 0) return;
- if (!receiver->HasFastProperties()) return;
+ if (!holder->HasFastProperties()) return;
if (!callback->IsCompatibleReceiver(*receiver)) return;
code = isolate()->stub_cache()->ComputeKeyedLoadCallback(
name, receiver, holder, callback);
@@ -1487,9 +1487,10 @@ void StoreIC::UpdateCaches(LookupResult* lookup,
case CALLBACKS: {
Handle<Object> callback(lookup->GetCallbackObject());
if (callback->IsAccessorInfo()) {
+ ASSERT(*holder == *receiver); // LookupForWrite checks this.
Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(callback);
if (v8::ToCData<Address>(info->setter()) == 0) return;
- if (!receiver->HasFastProperties()) return;
+ if (!holder->HasFastProperties()) return;
ASSERT(info->IsCompatibleReceiver(*receiver));
code = isolate()->stub_cache()->ComputeStoreCallback(
name, receiver, info, strict_mode);
@@ -1497,7 +1498,7 @@ void StoreIC::UpdateCaches(LookupResult* lookup,
Handle<Object> setter(Handle<AccessorPair>::cast(callback)->setter());
if (!setter->IsJSFunction()) return;
if (holder->IsGlobalObject()) return;
- if (!receiver->HasFastProperties()) return;
+ if (!holder->HasFastProperties()) return;
code = isolate()->stub_cache()->ComputeStoreViaSetter(
name, receiver, Handle<JSFunction>::cast(setter), strict_mode);
} else {
diff --git a/deps/v8/src/platform-macos.cc b/deps/v8/src/platform-macos.cc
index a937ed3a5..a216f6e4c 100644
--- a/deps/v8/src/platform-macos.cc
+++ b/deps/v8/src/platform-macos.cc
@@ -682,17 +682,27 @@ Mutex* OS::CreateMutex() {
class MacOSSemaphore : public Semaphore {
public:
explicit MacOSSemaphore(int count) {
- semaphore_create(mach_task_self(), &semaphore_, SYNC_POLICY_FIFO, count);
+ int r;
+ r = semaphore_create(mach_task_self(),
+ &semaphore_,
+ SYNC_POLICY_FIFO,
+ count);
+ ASSERT(r == KERN_SUCCESS);
}
~MacOSSemaphore() {
- semaphore_destroy(mach_task_self(), semaphore_);
+ int r;
+ r = semaphore_destroy(mach_task_self(), semaphore_);
+ ASSERT(r == KERN_SUCCESS);
}
- // The MacOS mach semaphore documentation claims it does not have spurious
- // wakeups, the way pthreads semaphores do. So the code from the linux
- // platform is not needed here.
- void Wait() { semaphore_wait(semaphore_); }
+ void Wait() {
+ int r;
+ do {
+ r = semaphore_wait(semaphore_);
+ ASSERT(r == KERN_SUCCESS || r == KERN_ABORTED);
+ } while (r == KERN_ABORTED);
+ }
bool Wait(int timeout);
diff --git a/deps/v8/src/v8natives.js b/deps/v8/src/v8natives.js
index 86f07a195..e2e642941 100644
--- a/deps/v8/src/v8natives.js
+++ b/deps/v8/src/v8natives.js
@@ -1654,7 +1654,9 @@ function NewFunction(arg1) { // length == 1
// The call to SetNewFunctionAttributes will ensure the prototype
// property of the resulting function is enumerable (ECMA262, 15.3.5.2).
- var f = %CompileString(source)();
+ var global_receiver = %GlobalReceiver(global);
+ var f = %_CallFunction(global_receiver, %CompileString(source));
+
%FunctionMarkNameShouldPrintAsAnonymous(f);
return %SetNewFunctionAttributes(f);
}
diff --git a/deps/v8/src/version.cc b/deps/v8/src/version.cc
index 2da80cc67..102b64552 100644
--- a/deps/v8/src/version.cc
+++ b/deps/v8/src/version.cc
@@ -35,7 +35,7 @@
#define MAJOR_VERSION 3
#define MINOR_VERSION 11
#define BUILD_NUMBER 10
-#define PATCH_LEVEL 19
+#define PATCH_LEVEL 22
// Use 1 for candidates and 0 otherwise.
// (Boolean macro values are not supported by all preprocessors.)
#define IS_CANDIDATE_VERSION 0
diff --git a/deps/v8/src/x64/code-stubs-x64.cc b/deps/v8/src/x64/code-stubs-x64.cc
index 61d6c8791..17b5ce93b 100644
--- a/deps/v8/src/x64/code-stubs-x64.cc
+++ b/deps/v8/src/x64/code-stubs-x64.cc
@@ -999,8 +999,8 @@ void BinaryOpStub::GenerateSmiCode(
SmiCodeGenerateHeapNumberResults allow_heapnumber_results) {
// Arguments to BinaryOpStub are in rdx and rax.
- Register left = rdx;
- Register right = rax;
+ const Register left = rdx;
+ const Register right = rax;
// We only generate heapnumber answers for overflowing calculations
// for the four basic arithmetic operations and logical right shift by 0.
@@ -1042,20 +1042,16 @@ void BinaryOpStub::GenerateSmiCode(
case Token::DIV:
// SmiDiv will not accept left in rdx or right in rax.
- left = rcx;
- right = rbx;
__ movq(rbx, rax);
__ movq(rcx, rdx);
- __ SmiDiv(rax, left, right, &use_fp_on_smis);
+ __ SmiDiv(rax, rcx, rbx, &use_fp_on_smis);
break;
case Token::MOD:
// SmiMod will not accept left in rdx or right in rax.
- left = rcx;
- right = rbx;
__ movq(rbx, rax);
__ movq(rcx, rdx);
- __ SmiMod(rax, left, right, &use_fp_on_smis);
+ __ SmiMod(rax, rcx, rbx, &use_fp_on_smis);
break;
case Token::BIT_OR: {
diff --git a/deps/v8/test/cctest/test-api.cc b/deps/v8/test/cctest/test-api.cc
index 233cbabd1..e24782085 100644
--- a/deps/v8/test/cctest/test-api.cc
+++ b/deps/v8/test/cctest/test-api.cc
@@ -27,6 +27,11 @@
#include <limits.h>
+#ifndef WIN32
+#include <signal.h> // kill
+#include <unistd.h> // getpid
+#endif // WIN32
+
#include "v8.h"
#include "api.h"
@@ -14567,6 +14572,8 @@ THREADED_TEST(FunctionGetScriptId) {
static v8::Handle<Value> GetterWhichReturns42(Local<String> name,
const AccessorInfo& info) {
+ CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject());
+ CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject());
return v8_num(42);
}
@@ -14574,10 +14581,32 @@ static v8::Handle<Value> GetterWhichReturns42(Local<String> name,
static void SetterWhichSetsYOnThisTo23(Local<String> name,
Local<Value> value,
const AccessorInfo& info) {
+ CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject());
+ CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject());
info.This()->Set(v8_str("y"), v8_num(23));
}
+Handle<Value> FooGetInterceptor(Local<String> name,
+ const AccessorInfo& info) {
+ CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject());
+ CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject());
+ if (!name->Equals(v8_str("foo"))) return Handle<Value>();
+ return v8_num(42);
+}
+
+
+Handle<Value> FooSetInterceptor(Local<String> name,
+ Local<Value> value,
+ const AccessorInfo& info) {
+ CHECK(v8::Utils::OpenHandle(*info.This())->IsJSObject());
+ CHECK(v8::Utils::OpenHandle(*info.Holder())->IsJSObject());
+ if (!name->Equals(v8_str("foo"))) return Handle<Value>();
+ info.This()->Set(v8_str("y"), v8_num(23));
+ return v8_num(23);
+}
+
+
TEST(SetterOnConstructorPrototype) {
v8::HandleScope scope;
Local<ObjectTemplate> templ = ObjectTemplate::New();
@@ -16813,8 +16842,65 @@ TEST(TryFinallyMessage) {
}
+static void Helper137002(bool do_store,
+ bool polymorphic,
+ bool remove_accessor,
+ bool interceptor) {
+ LocalContext context;
+ Local<ObjectTemplate> templ = ObjectTemplate::New();
+ if (interceptor) {
+ templ->SetNamedPropertyHandler(FooGetInterceptor, FooSetInterceptor);
+ } else {
+ templ->SetAccessor(v8_str("foo"),
+ GetterWhichReturns42,
+ SetterWhichSetsYOnThisTo23);
+ }
+ context->Global()->Set(v8_str("obj"), templ->NewInstance());
+
+ // Turn monomorphic on slow object with native accessor, then turn
+ // polymorphic, finally optimize to create negative lookup and fail.
+ CompileRun(do_store ?
+ "function f(x) { x.foo = void 0; }" :
+ "function f(x) { return x.foo; }");
+ CompileRun("obj.y = void 0;");
+ if (!interceptor) {
+ CompileRun("%OptimizeObjectForAddingMultipleProperties(obj, 1);");
+ }
+ CompileRun("obj.__proto__ = null;"
+ "f(obj); f(obj); f(obj);");
+ if (polymorphic) {
+ CompileRun("f({});");
+ }
+ CompileRun("obj.y = void 0;"
+ "%OptimizeFunctionOnNextCall(f);");
+ if (remove_accessor) {
+ CompileRun("delete obj.foo;");
+ }
+ CompileRun("var result = f(obj);");
+ if (do_store) {
+ CompileRun("result = obj.y;");
+ }
+ if (remove_accessor && !interceptor) {
+ CHECK(context->Global()->Get(v8_str("result"))->IsUndefined());
+ } else {
+ CHECK_EQ(do_store ? 23 : 42,
+ context->Global()->Get(v8_str("result"))->Int32Value());
+ }
+}
+
+
THREADED_TEST(Regress137002a) {
i::FLAG_allow_natives_syntax = true;
+ i::FLAG_compilation_cache = false;
+ v8::HandleScope scope;
+ for (int i = 0; i < 16; i++) {
+ Helper137002(i & 8, i & 4, i & 2, i & 1);
+ }
+}
+
+
+THREADED_TEST(Regress137002b) {
+ i::FLAG_allow_natives_syntax = true;
v8::HandleScope scope;
LocalContext context;
Local<ObjectTemplate> templ = ObjectTemplate::New();
@@ -16823,19 +16909,65 @@ THREADED_TEST(Regress137002a) {
SetterWhichSetsYOnThisTo23);
context->Global()->Set(v8_str("obj"), templ->NewInstance());
- // Turn monomorphic on slow object with native accessor, then turn
- // polymorphic, finally optimize to create negative lookup and fail.
- CompileRun("function f(x) { return x.foo; }"
- "%OptimizeObjectForAddingMultipleProperties(obj, 1);"
+ // Turn monomorphic on slow object with native accessor, then just
+ // delete the property and fail.
+ CompileRun("function load(x) { return x.foo; }"
+ "function store(x) { x.foo = void 0; }"
+ "function keyed_load(x, key) { return x[key]; }"
+ // Second version of function has a different source (add void 0)
+ // so that it does not share code with the first version. This
+ // ensures that the ICs are monomorphic.
+ "function load2(x) { void 0; return x.foo; }"
+ "function store2(x) { void 0; x.foo = void 0; }"
+ "function keyed_load2(x, key) { void 0; return x[key]; }"
+
+ "obj.y = void 0;"
"obj.__proto__ = null;"
- "f(obj); f(obj); f({});"
- "%OptimizeFunctionOnNextCall(f);"
- "var result = f(obj);");
- CHECK_EQ(42, context->Global()->Get(v8_str("result"))->Int32Value());
-}
-
+ "var subobj = {};"
+ "subobj.y = void 0;"
+ "subobj.__proto__ = obj;"
+ "%OptimizeObjectForAddingMultipleProperties(obj, 1);"
-THREADED_TEST(Regress137002b) {
+ // Make the ICs monomorphic.
+ "load(obj); load(obj);"
+ "load2(subobj); load2(subobj);"
+ "store(obj); store(obj);"
+ "store2(subobj); store2(subobj);"
+ "keyed_load(obj, 'foo'); keyed_load(obj, 'foo');"
+ "keyed_load2(subobj, 'foo'); keyed_load2(subobj, 'foo');"
+
+ // Actually test the shiny new ICs and better not crash. This
+ // serves as a regression test for issue 142088 as well.
+ "load(obj);"
+ "load2(subobj);"
+ "store(obj);"
+ "store2(subobj);"
+ "keyed_load(obj, 'foo');"
+ "keyed_load2(subobj, 'foo');"
+
+ // Delete the accessor. It better not be called any more now.
+ "delete obj.foo;"
+ "obj.y = void 0;"
+ "subobj.y = void 0;"
+
+ "var load_result = load(obj);"
+ "var load_result2 = load2(subobj);"
+ "var keyed_load_result = keyed_load(obj, 'foo');"
+ "var keyed_load_result2 = keyed_load2(subobj, 'foo');"
+ "store(obj);"
+ "store2(subobj);"
+ "var y_from_obj = obj.y;"
+ "var y_from_subobj = subobj.y;");
+ CHECK(context->Global()->Get(v8_str("load_result"))->IsUndefined());
+ CHECK(context->Global()->Get(v8_str("load_result2"))->IsUndefined());
+ CHECK(context->Global()->Get(v8_str("keyed_load_result"))->IsUndefined());
+ CHECK(context->Global()->Get(v8_str("keyed_load_result2"))->IsUndefined());
+ CHECK(context->Global()->Get(v8_str("y_from_obj"))->IsUndefined());
+ CHECK(context->Global()->Get(v8_str("y_from_subobj"))->IsUndefined());
+}
+
+
+THREADED_TEST(Regress142088) {
i::FLAG_allow_natives_syntax = true;
v8::HandleScope scope;
LocalContext context;
@@ -16847,10 +16979,111 @@ THREADED_TEST(Regress137002b) {
// Turn monomorphic on slow object with native accessor, then just
// delete the property and fail.
- CompileRun("function f(x) { return x.foo; }"
- "%OptimizeObjectForAddingMultipleProperties(obj, 1);"
+ CompileRun("function load(x) { return x.foo; }"
+ "function store(x) { x.foo = void 0; }"
+ "function keyed_load(x, key) { return x[key]; }"
+ // Second version of function has a different source (add void 0)
+ // so that it does not share code with the first version. This
+ // ensures that the ICs are monomorphic.
+ "function load2(x) { void 0; return x.foo; }"
+ "function store2(x) { void 0; x.foo = void 0; }"
+ "function keyed_load2(x, key) { void 0; return x[key]; }"
+
"obj.__proto__ = null;"
- "f(obj); f(obj); delete obj.foo;"
- "var result = f(obj);");
- CHECK(context->Global()->Get(v8_str("result"))->IsUndefined());
+ "var subobj = {};"
+ "subobj.__proto__ = obj;"
+ "%OptimizeObjectForAddingMultipleProperties(obj, 1);"
+
+ // Make the ICs monomorphic.
+ "load(obj); load(obj);"
+ "load2(subobj); load2(subobj);"
+ "store(obj);"
+ "store2(subobj);"
+ "keyed_load(obj, 'foo'); keyed_load(obj, 'foo');"
+ "keyed_load2(subobj, 'foo'); keyed_load2(subobj, 'foo');"
+
+ // Delete the accessor. It better not be called any more now.
+ "delete obj.foo;"
+ "obj.y = void 0;"
+ "subobj.y = void 0;"
+
+ "var load_result = load(obj);"
+ "var load_result2 = load2(subobj);"
+ "var keyed_load_result = keyed_load(obj, 'foo');"
+ "var keyed_load_result2 = keyed_load2(subobj, 'foo');"
+ "store(obj);"
+ "store2(subobj);"
+ "var y_from_obj = obj.y;"
+ "var y_from_subobj = subobj.y;");
+ CHECK(context->Global()->Get(v8_str("load_result"))->IsUndefined());
+ CHECK(context->Global()->Get(v8_str("load_result2"))->IsUndefined());
+ CHECK(context->Global()->Get(v8_str("keyed_load_result"))->IsUndefined());
+ CHECK(context->Global()->Get(v8_str("keyed_load_result2"))->IsUndefined());
+ CHECK(context->Global()->Get(v8_str("y_from_obj"))->IsUndefined());
+ CHECK(context->Global()->Get(v8_str("y_from_subobj"))->IsUndefined());
+}
+
+
+#ifndef WIN32
+class ThreadInterruptTest {
+ public:
+ ThreadInterruptTest() : sem_(NULL), sem_value_(0) { }
+ ~ThreadInterruptTest() { delete sem_; }
+
+ void RunTest() {
+ sem_ = i::OS::CreateSemaphore(0);
+
+ InterruptThread i_thread(this);
+ i_thread.Start();
+
+ sem_->Wait();
+ CHECK_EQ(kExpectedValue, sem_value_);
+ }
+
+ private:
+ static const int kExpectedValue = 1;
+
+ class InterruptThread : public i::Thread {
+ public:
+ explicit InterruptThread(ThreadInterruptTest* test)
+ : Thread("InterruptThread"), test_(test) {}
+
+ virtual void Run() {
+ struct sigaction action;
+
+ // Ensure that we'll enter waiting condition
+ i::OS::Sleep(100);
+
+ // Setup signal handler
+ memset(&action, 0, sizeof(action));
+ action.sa_handler = SignalHandler;
+ sigaction(SIGCHLD, &action, NULL);
+
+ // Send signal
+ kill(getpid(), SIGCHLD);
+
+ // Ensure that if wait has returned because of error
+ i::OS::Sleep(100);
+
+ // Set value and signal semaphore
+ test_->sem_value_ = 1;
+ test_->sem_->Signal();
+ }
+
+ static void SignalHandler(int signal) {
+ }
+
+ private:
+ ThreadInterruptTest* test_;
+ struct sigaction sa_;
+ };
+
+ i::Semaphore* sem_;
+ volatile int sem_value_;
+};
+
+
+THREADED_TEST(SemaphoreInterruption) {
+ ThreadInterruptTest().RunTest();
}
+#endif // WIN32
diff --git a/deps/v8/test/mjsunit/new-function.js b/deps/v8/test/mjsunit/new-function.js
new file mode 100644
index 000000000..9e8cc2776
--- /dev/null
+++ b/deps/v8/test/mjsunit/new-function.js
@@ -0,0 +1,34 @@
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+var x;
+try {
+ Function("}), x = this, (function() {");
+} catch(e) {
+ print("Caught " + e);
+}
+assertTrue(x == "[object global]");
diff --git a/deps/v8/test/mjsunit/regress/regress-145201.js b/deps/v8/test/mjsunit/regress/regress-145201.js
new file mode 100644
index 000000000..7fe7bceda
--- /dev/null
+++ b/deps/v8/test/mjsunit/regress/regress-145201.js
@@ -0,0 +1,107 @@
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Fix some corner cases in skipping native methods using caller.
+var net = [];
+
+
+var x = 0;
+
+function collect () {
+ function item(operator) {
+ binary(operator, 1, false);
+ binary(operator, 1, true);
+ binary(operator, '{}', false);
+ binary(operator, '{}', true);
+ binary(operator, '"x"', false);
+ binary(operator, '"x"', true);
+ unary(operator, "");
+ }
+
+ function unary(op, after) {
+ // Capture:
+ try {
+ eval(op + " custom " + after);
+ } catch(e) {
+ }
+ }
+
+ function binary(op, other_side, inverted) {
+ // Capture:
+ try {
+ if (inverted) {
+ eval("custom " + op + " " + other_side);
+ } else {
+ eval(other_side + " " + op + " custom");
+ }
+ } catch(e) {
+ }
+ }
+
+ function catcher() {
+ var caller = catcher.caller;
+ if (/native/i.test(caller) || /ADD/.test(caller)) {
+ net[caller] = 0;
+ }
+ }
+
+ var custom = Object.create(null, {
+ toString: { value: catcher },
+ length: { get: catcher }
+ });
+
+ item('^');
+ item('~');
+ item('<<');
+ item('<');
+ item('==');
+ item('>>>');
+ item('>>');
+ item('|');
+ item('-');
+ item('*');
+ item('&');
+ item('%');
+ item('+');
+ item('in');
+ item('instanceof');
+ unary('{}[', ']');
+ unary('delete {}[', ']');
+ unary('(function() {}).apply(null, ', ')');
+}
+
+collect();
+collect();
+collect();
+
+var keys = 0;
+for (var key in net) {
+ print(key);
+ keys++;
+}
+
+assertTrue(keys == 0);
diff --git a/doc/api/cluster.markdown b/doc/api/cluster.markdown
index aa59acbf4..032e38138 100644
--- a/doc/api/cluster.markdown
+++ b/doc/api/cluster.markdown
@@ -252,12 +252,29 @@ die graceful if no other event is waiting.
The method takes an optional callback argument which will be called when finished.
+## cluster.worker
+
+* {Object}
+
+A reference to the current worker object. Not available in the master process.
+
+ var cluster = require('cluster');
+
+ if (cluster.isMaster) {
+ console.log('I am master');
+ cluster.fork();
+ cluster.fork();
+ } else if (cluster.isWorker) {
+ console.log('I am worker #' + cluster.worker.id);
+ }
+
## cluster.workers
* {Object}
A hash that stores the active worker objects, keyed by `id` field. Makes it
-easy to loop through all the workers.
+easy to loop through all the workers. It is only available in the master
+process.
// Go through all workers
function eachWorker(callback) {
diff --git a/doc/api/fs.markdown b/doc/api/fs.markdown
index d1579dca0..78dac9af1 100644
--- a/doc/api/fs.markdown
+++ b/doc/api/fs.markdown
@@ -446,7 +446,7 @@ The synchronous version of `fs.appendFile`.
## fs.watchFile(filename, [options], listener)
- Stability: 2 - Unstable. Use fs.watch instead, if available.
+ Stability: 2 - Unstable. Use fs.watch instead, if possible.
Watch for changes on `filename`. The callback `listener` will be called each
time the file is accessed.
@@ -483,7 +483,7 @@ no-op, not an error.
## fs.watch(filename, [options], [listener])
- Stability: 2 - Unstable. Not available on all platforms.
+ Stability: 2 - Unstable.
Watch for changes on `filename`, where `filename` is either a file or a
directory. The returned object is a [fs.FSWatcher](#fs_class_fs_fswatcher).
@@ -517,9 +517,12 @@ to be notified of filesystem changes.
* On Windows systems, this feature depends on `ReadDirectoryChangesW`.
If the underlying functionality is not available for some reason, then
-`fs.watch` will not be able to function. You can still use
-`fs.watchFile`, which uses stat polling, but it is slower and less
-reliable.
+`fs.watch` will not be able to function. For example, watching files or
+directories on network file systems (NFS, SMB, etc.) often doesn't work
+reliably or at all.
+
+You can still use `fs.watchFile`, which uses stat polling, but it is slower and
+less reliable.
#### Filename Argument
diff --git a/doc/api/http.markdown b/doc/api/http.markdown
index 6e2ec3a70..c6809067e 100644
--- a/doc/api/http.markdown
+++ b/doc/api/http.markdown
@@ -265,7 +265,16 @@ you can use the `require('querystring').parse` function, or pass
### request.headers
-Read only.
+Read only map of header names and values. Header names are lower-cased.
+Example:
+
+ // Prints something like:
+ //
+ // { 'user-agent': 'curl/7.22.0',
+ // host: '127.0.0.1:8000',
+ // accept: '*/*' }
+ console.log(request.headers);
+
### request.trailers
diff --git a/doc/api/process.markdown b/doc/api/process.markdown
index 5af572bfc..b407883b2 100644
--- a/doc/api/process.markdown
+++ b/doc/api/process.markdown
@@ -354,7 +354,7 @@ What processor architecture you're running on: `'arm'`, `'ia32'`, or `'x64'`.
## process.platform
What platform you're running on:
-`'darwin'`, `'freebsd'`, `'linux'`, `'solaris'` or `'win32'`
+`'darwin'`, `'freebsd'`, `'linux'`, `'sunos'` or `'win32'`
console.log('This platform is ' + process.platform);
diff --git a/doc/blog/release/node-version-0-7-9-unstable.md b/doc/blog/release/node-version-0-7-9-unstable.md
index 74076c04c..683823aa3 100644
--- a/doc/blog/release/node-version-0-7-9-unstable.md
+++ b/doc/blog/release/node-version-0-7-9-unstable.md
@@ -22,7 +22,7 @@ slug: node-version-0-7-9-unstable
</li>
<li><p>fs: 64bit offsets for fs calls (Igor Zinkovsky)</p>
</li>
-<li><p>fs: add sync open flags &apos;rs&apos; and &apos;rs+&apos; (Kevin Bowman)</p>
+<li><p>fs: add sync open flags &#39;rs&#39; and &#39;rs+&#39; (Kevin Bowman)</p>
</li>
<li><p>windows: enable creating directory junctions with fs.symlink (Igor Zinkovsky, Bert Belder)</p>
</li>
diff --git a/doc/blog/release/v0.8.9.md b/doc/blog/release/v0.8.9.md
new file mode 100644
index 000000000..7e217961d
--- /dev/null
+++ b/doc/blog/release/v0.8.9.md
@@ -0,0 +1,97 @@
+date: Tue Sep 11 2012 11:50:17 GMT-0700 (PDT)
+category: release
+version: 0.8.9
+title: Version 0.8.9 (Stable)
+slug: node-v0-8-9-stable
+
+2012.09.11, Version 0.8.9 (Stable)
+
+* v8: upgrade to 3.11.10.22
+
+* GYP: upgrade to r1477
+
+* npm: Upgrade to 1.1.61
+
+* npm: Don't create world-writable files (isaacs)
+
+* windows: fix single-accept mode for shared server sockets (Bert Belder)
+
+* windows: fix uninitialized memory access in uv_update_time() (Bert Belder)
+
+* windows: don't throw when a signal handler is attached (Bert Belder)
+
+* unix: fix memory leak in udp (Ben Noordhuis)
+
+* unix: map errno ESPIPE (Ben Noordhuis)
+
+* unix, windows: fix memory corruption in fs-poll.c (Ben Noordhuis)
+
+* sunos: fix os.cpus() on x86_64 (Ben Noordhuis)
+
+* child process: fix processes with IPC channel don't emit 'close' (Bert Belder)
+
+* build: add a "--dest-os" option to force a gyp "flavor" (Nathan Rajlich)
+
+* build: set `process.platform` to "sunos" on SunOS (Nathan Rajlich)
+
+* build: fix `make -j` fails after `make clean` (Bearice Ren)
+
+* build: fix openssl configuration for "arm" builds (Nathan Rajlich)
+
+* tls: support unix domain socket/named pipe in tls.connect (Shigeki Ohtsu)
+
+* https: make https.get() accept a URL (koichik)
+
+* http: respect HTTP/1.0 TE header (Ben Noordhuis)
+
+* crypto, tls: Domainify setSNICallback, pbkdf2, randomBytes (Ben Noordhuis)
+
+* stream.pipe: Don't call destroy() unless it's a function (isaacs)
+
+
+Source Code: http://nodejs.org/dist/v0.8.9/node-v0.8.9.tar.gz
+
+Macintosh Installer (Universal): http://nodejs.org/dist/v0.8.9/node-v0.8.9.pkg
+
+Windows Installer: http://nodejs.org/dist/v0.8.9/node-v0.8.9-x86.msi
+
+Windows x64 Installer: http://nodejs.org/dist/v0.8.9/x64/node-v0.8.9-x64.msi
+
+Windows x64 Files: http://nodejs.org/dist/v0.8.9/x64/
+
+Linux 32-bit Binary: http://nodejs.org/dist/v0.8.9/node-v0.8.9-linux-x86.tar.gz
+
+Linux 64-bit Binary: http://nodejs.org/dist/v0.8.9/node-v0.8.9-linux-x64.tar.gz
+
+Solaris 32-bit Binary: http://nodejs.org/dist/v0.8.9/node-v0.8.9-sunos-x86.tar.gz
+
+Solaris 64-bit Binary: http://nodejs.org/dist/v0.8.9/node-v0.8.9-sunos-x64.tar.gz
+
+Other release files: http://nodejs.org/dist/v0.8.9/
+
+Website: http://nodejs.org/docs/v0.8.9/
+
+Documentation: http://nodejs.org/docs/v0.8.9/api/
+
+Shasums:
+
+```
+68aa7341807fb114f334151b7a1c8859e96b83d4 node-v0.8.9-darwin-x64.tar.gz
+9e4a9422c1fd71750e9c46235d58aedaac3ba002 node-v0.8.9-darwin-x86.tar.gz
+6236f781632555abf69d77f4bdfeb1e4e83779f3 node-v0.8.9-linux-x64.tar.gz
+7f46084541d4909f44cfef2bb95f1e4f7435629e node-v0.8.9-linux-x86.tar.gz
+33b0fe68f63519f3c8e6dc4d2aa51c96f62d2a56 node-v0.8.9-sunos-x64.tar.gz
+e05863cb3a7d4add340ad434228f57da04a03b3d node-v0.8.9-sunos-x86.tar.gz
+104f325d5289c51c6eb6a0634691dcdb39abb1db node-v0.8.9-x86.msi
+1dd2cf48fb9b1f3e11e6e6750084ad4b2a2b0a85 node-v0.8.9.pkg
+2d3234adceedc2dc87284af88609ede6ecd71734 node-v0.8.9.tar.gz
+2997e2075cd04cf693453ce5664fa37615faa9a7 node.exe
+d2834bd8ed3569b7880211dfe31a4f21cd475ab8 node.exp
+41eac45ae350324de321a85787897bd8aa6b371c node.lib
+ab6666144b23b2594521d27a95fb36b0904d48a2 node.pdb
+f29db0a61a7bb32a7198ab059eca25b1283b9d6d x64/node-v0.8.9-x64.msi
+2a7e69cef1bf7bc88109e007406e6feeaaa007b2 x64/node.exe
+0423cd6602684c24e65358b9caa51740af67677b x64/node.exp
+92155062a70100bfb5cf1389dd93e8851e7f3d0b x64/node.lib
+cbbee351b84d7da0a91f56d6bbf6805e7b85cc8f x64/node.pdb
+```
diff --git a/doc/blog/release/version-0-6-11-stable.md b/doc/blog/release/version-0-6-11-stable.md
index 15fbe337c..4c19a1499 100644
--- a/doc/blog/release/version-0-6-11-stable.md
+++ b/doc/blog/release/version-0-6-11-stable.md
@@ -18,7 +18,7 @@ slug: version-0-6-11-stable
</li>
<li><p>tls: mitigate session renegotiation attacks (Ben Noordhuis)</p>
</li>
-<li><p>tcp, pipe: don&apos;t assert on uv_accept() errors (Ben Noordhuis)</p>
+<li><p>tcp, pipe: don&#39;t assert on uv_accept() errors (Ben Noordhuis)</p>
</li>
<li><p>tls: Allow establishing secure connection on the existing socket (koichik)</p>
</li>
@@ -38,13 +38,13 @@ slug: version-0-6-11-stable
</li>
<li><p>dtrace: add missing translator (Dave Pacheco)</p>
</li>
-<li><p>unix: don&apos;t flush tty on switch to raw mode (Ben Noordhuis)</p>
+<li><p>unix: don&#39;t flush tty on switch to raw mode (Ben Noordhuis)</p>
</li>
<li><p>windows: reset brightness when reverting to default text color (Bert Belder)</p>
</li>
<li><p>npm: update to 1.1.1</p>
-<p>- Update which, fstream, mkdirp, request, and rimraf<br>- Fix #2123 Set path properly for lifecycle scripts on windows<br>- Mark the root as seen, so we don&apos;t recurse into it. Fixes #1838. (Martin Cooper)</p>
+<p>- Update which, fstream, mkdirp, request, and rimraf<br>- Fix #2123 Set path properly for lifecycle scripts on windows<br>- Mark the root as seen, so we don&#39;t recurse into it. Fixes #1838. (Martin Cooper)</p>
</li>
</ul>
diff --git a/doc/blog/release/version-0-6-12-stable.md b/doc/blog/release/version-0-6-12-stable.md
index 3e5acd61c..73e85eec3 100644
--- a/doc/blog/release/version-0-6-12-stable.md
+++ b/doc/blog/release/version-0-6-12-stable.md
@@ -18,7 +18,7 @@ slug: version-0-6-12-stable
</li>
<li><p>#2827 net: fix race write() before and after connect() (koichik)</p>
</li>
-<li><p>#2554 #2567 throw if fs args for &apos;start&apos; or &apos;end&apos; are strings (AJ ONeal)</p>
+<li><p>#2554 #2567 throw if fs args for &#39;start&#39; or &#39;end&#39; are strings (AJ ONeal)</p>
</li>
<li><p>punycode: Update to v1.0.0 (Mathias Bynens)</p>
</li>
@@ -45,7 +45,7 @@ slug: version-0-6-12-stable
- install: support --save with url install targets<br>
- shrinkwrap: behave properly with url-installed modules<br>
- support installing uncompressed tars or single file modules from urls etc.<br>
-- don&apos;t run make clean on rebuild<br>
+- don&#39;t run make clean on rebuild<br>
- support HTTPS-over-HTTP proxy tunneling<br>
</p>
</li>
diff --git a/doc/blog/release/version-0-6-14-stable.md b/doc/blog/release/version-0-6-14-stable.md
index 4f33a2697..96877a2aa 100644
--- a/doc/blog/release/version-0-6-14-stable.md
+++ b/doc/blog/release/version-0-6-14-stable.md
@@ -10,7 +10,7 @@ slug: version-0-6-14-stable
</p>
<ul>
-<li><p>net: don&apos;t crash when queued write fails (Igor Zinkovsky)</p>
+<li><p>net: don&#39;t crash when queued write fails (Igor Zinkovsky)</p>
</li>
<li><p>sunos: fix EMFILE on process.memoryUsage() (Bryan Cantrill)</p>
</li>
@@ -26,9 +26,9 @@ slug: version-0-6-14-stable
<p>
- upgrade node-gyp to 0.3.7<br>
- work around AV-locked directories on Windows<br>
-- Fix isaacs/npm#2293 Don&apos;t try to &apos;uninstall&apos; /<br>
+- Fix isaacs/npm#2293 Don&#39;t try to &#39;uninstall&#39; /<br>
- Exclude symbolic links from packages.<br>
-- Fix isaacs/npm#2275 Spurious &apos;unresolvable cycle&apos; error.<br>
+- Fix isaacs/npm#2275 Spurious &#39;unresolvable cycle&#39; error.<br>
- Exclude/include dot files as if they were normal files
</p>
</li>
diff --git a/doc/blog/release/version-0-6-15-stable.md b/doc/blog/release/version-0-6-15-stable.md
index 4196876fe..5fa6bcf58 100644
--- a/doc/blog/release/version-0-6-15-stable.md
+++ b/doc/blog/release/version-0-6-15-stable.md
@@ -18,13 +18,13 @@ slug: version-0-6-15-stable
</li>
<li><p>add 64bit offset fs functions (Igor Zinkovsky)</p>
</li>
-<li><p>windows: don&apos;t report ENOTSOCK when attempting to bind an udp handle twice (Bert Belder)</p>
+<li><p>windows: don&#39;t report ENOTSOCK when attempting to bind an udp handle twice (Bert Belder)</p>
</li>
<li><p>windows: backport pipe-connect-to-file fixes from master (Bert Belder)</p>
</li>
<li><p>windows: never call fs event callbacks after closing the watcher (Bert Belder)</p>
</li>
-<li><p>fs.readFile: don&apos;t make the callback before the fd is closed (Bert Belder)</p>
+<li><p>fs.readFile: don&#39;t make the callback before the fd is closed (Bert Belder)</p>
</li>
<li><p>windows: use 64bit offsets for uv_fs apis (Igor Zinkovsky)</p>
</li>
diff --git a/doc/blog/release/version-0-6-16-stable.md b/doc/blog/release/version-0-6-16-stable.md
index 980296c1a..051a23af1 100644
--- a/doc/blog/release/version-0-6-16-stable.md
+++ b/doc/blog/release/version-0-6-16-stable.md
@@ -34,7 +34,7 @@ slug: version-0-6-16-stable
</li>
<li><p>http_parser: Eat CRLF between requests, even on connection:close. (Ben Noordhuis)</p>
</li>
-<li><p>don&apos;t check return value of unsetenv (Ben Noordhuis)</p>
+<li><p>don&#39;t check return value of unsetenv (Ben Noordhuis)</p>
</li>
</ul>
<p>Source Code: <a href="http://nodejs.org/dist/v0.6.16/node-v0.6.16.tar.gz">http://nodejs.org/dist/v0.6.16/node-v0.6.16.tar.gz</a>
diff --git a/doc/blog/release/version-0-6-18-stable.md b/doc/blog/release/version-0-6-18-stable.md
index fe0c1f166..13714d9c2 100644
--- a/doc/blog/release/version-0-6-18-stable.md
+++ b/doc/blog/release/version-0-6-18-stable.md
@@ -24,15 +24,15 @@ slug: version-0-6-18-stable
</li>
<li><p>#3258: fs.ReadStream.pause() emits duplicate data event (koichik)</p>
</li>
-<li><p>pipe_wrap: don&apos;t assert() on pipe accept errors (Ben Noordhuis)</p>
+<li><p>pipe_wrap: don&#39;t assert() on pipe accept errors (Ben Noordhuis)</p>
</li>
<li><p>Better exception output for module load and process.nextTick (Felix Geisendörfer)</p>
</li>
<li><p>zlib: fix error reporting (Ben Noordhuis)</p>
</li>
-<li><p>http: Don&apos;t destroy on timeout (isaacs)</p>
+<li><p>http: Don&#39;t destroy on timeout (isaacs)</p>
</li>
-<li><p>#3231: http: Don&apos;t try to emit error on a null&apos;ed req object (isaacs)</p>
+<li><p>#3231: http: Don&#39;t try to emit error on a null&#39;ed req object (isaacs)</p>
</li>
<li><p>#3236: http: Refactor ClientRequest.onSocket (isaacs)</p>
</li>
diff --git a/doc/blog/release/version-0-7-10-unstable.md b/doc/blog/release/version-0-7-10-unstable.md
index 9ecfb01f1..7fe8a4244 100644
--- a/doc/blog/release/version-0-7-10-unstable.md
+++ b/doc/blog/release/version-0-7-10-unstable.md
@@ -44,7 +44,7 @@ on the API before it is locked down for stability.
</li>
<li><p>windows/msi: add start menu links when installing (Jeroen Janssen)</p>
</li>
-<li><p>windows: don&apos;t install x64 version into the &apos;program files (x86)&apos; folder (Matt Gollob)</p>
+<li><p>windows: don&#39;t install x64 version into the &#39;program files (x86)&#39; folder (Matt Gollob)</p>
</li>
<li><p>domain: Fix #3379 domain.intercept no longer passes error arg to cb (Marc Harter)</p>
</li>
diff --git a/doc/blog/release/version-0-7-11-unstable.md b/doc/blog/release/version-0-7-11-unstable.md
index 28c2f6813..8e5373289 100644
--- a/doc/blog/release/version-0-7-11-unstable.md
+++ b/doc/blog/release/version-0-7-11-unstable.md
@@ -28,7 +28,7 @@ on the github issue tracker.
</li>
<li><p>Fix #3425: removeAllListeners should delete array (Reid Burke)</p>
</li>
-<li><p>cluster: don&apos;t silently drop messages when the write queue gets big (Bert Belder)</p>
+<li><p>cluster: don&#39;t silently drop messages when the write queue gets big (Bert Belder)</p>
</li>
<li><p>Add Buffer.concat method (isaacs)</p>
</li>
@@ -40,7 +40,7 @@ on the github issue tracker.
</li>
<li><p>Windows: Enable ETW events on Windows for existing DTrace probes. (Igor Zinkovsky)</p>
</li>
-<li><p>test: bundle node-weak in test/gc so that it doesn&apos;t need to be downloaded (Nathan Rajlich)</p>
+<li><p>test: bundle node-weak in test/gc so that it doesn&#39;t need to be downloaded (Nathan Rajlich)</p>
</li>
<li><p>Make many tests pass on Windows (Bert Belder)</p>
</li>
diff --git a/doc/blog/release/version-0-7-12.md b/doc/blog/release/version-0-7-12.md
index c9c448de6..15514fa5c 100644
--- a/doc/blog/release/version-0-7-12.md
+++ b/doc/blog/release/version-0-7-12.md
@@ -13,7 +13,7 @@ slug: version-0-7-12
<p>Please try out this release. There will be very virtually no changes between this and the v0.8.x release family. This is the last chance to comment before it is locked down for stability. The API is effectively frozen now. </p>
<p>This version adds backwards-compatible shims for binary addons that use libeio and libev directly. If you find that binary modules that could compile on v0.6 can not compile on this version, please let us know. Note that libev is officially deprecated in v0.8, and will be removed in v0.9. You should be porting your modules to use libuv as soon as possible. </p>
<p>V8 is on 3.11.10 currently, and will remain on the V8 3.11.x branch for the duration of Node v0.8.x. </p>
-<ul> <li><p>npm: Upgrade to 1.1.30<br> - Improved &apos;npm init&apos;<br> - Fix the &apos;cb never called&apos; error from &apos;oudated&apos; and &apos;update&apos;<br> - Add --save-bundle|-B config<br> - Fix isaacs/npm#2465: Make npm script and windows shims cygwin-aware<br> - Fix isaacs/npm#2452 Use --save(-dev|-optional) in npm rm<br> - <code>logstream</code> option to replace removed <code>logfd</code> (Rod Vagg)<br> - Read default descriptions from README.md files </p>
+<ul> <li><p>npm: Upgrade to 1.1.30<br> - Improved &#39;npm init&#39;<br> - Fix the &#39;cb never called&#39; error from &#39;oudated&#39; and &#39;update&#39;<br> - Add --save-bundle|-B config<br> - Fix isaacs/npm#2465: Make npm script and windows shims cygwin-aware<br> - Fix isaacs/npm#2452 Use --save(-dev|-optional) in npm rm<br> - <code>logstream</code> option to replace removed <code>logfd</code> (Rod Vagg)<br> - Read default descriptions from README.md files </p>
</li> <li><p>Shims to support deprecated <code>ev_*</code> and <code>eio_*</code> methods (Ben Noordhuis)</p>
</li> <li><p>#3118 net.Socket: Delay pause/resume until after connect (isaacs)</p>
</li> <li><p>#3465 Add ./configure --no-ifaddrs flag (isaacs)</p>
diff --git a/doc/blog/release/version-0-7-5-unstable.md b/doc/blog/release/version-0-7-5-unstable.md
index b493cde89..88bd70778 100644
--- a/doc/blog/release/version-0-7-5-unstable.md
+++ b/doc/blog/release/version-0-7-5-unstable.md
@@ -40,7 +40,7 @@ slug: version-0-7-5-unstable
</li>
<li><p>build: Make a fat binary for the OS X <code>make pkg</code>. (Nathan Rajlich)</p>
</li>
-<li><p>jslint src/ and lib/ on &apos;make test&apos; (isaacs)</p>
+<li><p>jslint src/ and lib/ on &#39;make test&#39; (isaacs)</p>
</li>
</ul>
<p>Source Code: <a href="http://nodejs.org/dist/v0.7.5/node-v0.7.5.tar.gz">http://nodejs.org/dist/v0.7.5/node-v0.7.5.tar.gz</a>
diff --git a/doc/blog/release/version-0-7-6-unstable.md b/doc/blog/release/version-0-7-6-unstable.md
index 342c792a0..1bac491e6 100644
--- a/doc/blog/release/version-0-7-6-unstable.md
+++ b/doc/blog/release/version-0-7-6-unstable.md
@@ -21,11 +21,11 @@ slug: version-0-7-6-unstable
- Handle cases where an optionalDependency fails to build<br>
</p>
</li>
-<li><p>events: newListener emit correct fn when using &apos;once&apos; (Roly Fentanes)</p>
+<li><p>events: newListener emit correct fn when using &#39;once&#39; (Roly Fentanes)</p>
</li>
<li><p>url: Ignore empty port component (Łukasz Walukiewicz)</p>
</li>
-<li><p>module: replace &apos;children&apos; array (isaacs)</p>
+<li><p>module: replace &#39;children&#39; array (isaacs)</p>
</li>
<li><p>tls: parse multiple values of a key in ssl certificate (Sambasiva Suda)</p>
</li>
diff --git a/doc/blog/release/version-0-7-7-unstable.md b/doc/blog/release/version-0-7-7-unstable.md
index 4ba17658a..1336096e4 100644
--- a/doc/blog/release/version-0-7-7-unstable.md
+++ b/doc/blog/release/version-0-7-7-unstable.md
@@ -28,7 +28,7 @@ slug: version-0-7-7-unstable
</li>
<li><p>cluster: add graceful disconnect support (Andreas Madsen)</p>
</li>
-<li><p>child_process: Separate &apos;close&apos; event from &apos;exit&apos; (Charlie McConnell)</p>
+<li><p>child_process: Separate &#39;close&#39; event from &#39;exit&#39; (Charlie McConnell)</p>
</li>
<li><p>typed arrays: add Uint8ClampedArray (Mikael Bourges-Sevenier)</p>
</li>
@@ -38,11 +38,11 @@ slug: version-0-7-7-unstable
</li>
<li><p>Expose http parse error codes (Felix Geisendörfer)</p>
</li>
-<li><p>events: don&apos;t delete the listeners array (Ben Noordhuis, Nathan Rajlich)</p>
+<li><p>events: don&#39;t delete the listeners array (Ben Noordhuis, Nathan Rajlich)</p>
</li>
-<li><p>process: add process.config to view node&apos;s ./configure settings (Nathan Rajlich)</p>
+<li><p>process: add process.config to view node&#39;s ./configure settings (Nathan Rajlich)</p>
</li>
-<li><p>process: process.execArgv to see node&apos;s arguments (Micheil Smith)</p>
+<li><p>process: process.execArgv to see node&#39;s arguments (Micheil Smith)</p>
</li>
<li><p>process: fix process.title setter (Ben Noordhuis)</p>
</li>
diff --git a/doc/blog/release/version-0-7-8-unstable.md b/doc/blog/release/version-0-7-8-unstable.md
index 9c829fa6a..8dfac6fc7 100644
--- a/doc/blog/release/version-0-7-8-unstable.md
+++ b/doc/blog/release/version-0-7-8-unstable.md
@@ -30,11 +30,11 @@ slug: version-0-7-8-unstable
</li>
<li><p>typed arrays: unexport SizeOfArrayElementForType() (Aaron Jacobs)</p>
</li>
-<li><p>net: honor &apos;enable&apos; flag in .setNoDelay() (Ben Noordhuis)</p>
+<li><p>net: honor &#39;enable&#39; flag in .setNoDelay() (Ben Noordhuis)</p>
</li>
<li><p>child_process: emit error when .kill fails (Andreas Madsen)</p>
</li>
-<li><p>gyp: fix &apos;argument list too long&apos; build error (Ben Noordhuis)</p>
+<li><p>gyp: fix &#39;argument list too long&#39; build error (Ben Noordhuis)</p>
</li>
<li><p>fs.WriteStream: Handle modifications to fs.open (isaacs)</p>
</li>
diff --git a/doc/blog/vulnerability/http-server-security-vulnerability-please-upgrade-to-0-6-17.md b/doc/blog/vulnerability/http-server-security-vulnerability-please-upgrade-to-0-6-17.md
index 5b29c26ac..b64858d09 100644
--- a/doc/blog/vulnerability/http-server-security-vulnerability-please-upgrade-to-0-6-17.md
+++ b/doc/blog/vulnerability/http-server-security-vulnerability-please-upgrade-to-0-6-17.md
@@ -13,9 +13,9 @@ slug: http-server-security-vulnerability-please-upgrade-to-0-6-17
<h2>Details</h2>
-<p>A few weeks ago, Matthew Daley found a security vulnerability in Node&apos;s HTTP implementation, and thankfully did the responsible thing and reported it to us via email. He explained it quite well, so I'll quote him here:</p>
+<p>A few weeks ago, Matthew Daley found a security vulnerability in Node&#39;s HTTP implementation, and thankfully did the responsible thing and reported it to us via email. He explained it quite well, so I'll quote him here:</p>
<blockquote>
-<p>There is a vulnerability in node&apos;s `http_parser` binding which allows information disclosure to a remote attacker:
+<p>There is a vulnerability in node&#39;s `http_parser` binding which allows information disclosure to a remote attacker:
</p>
<p>In node::StringPtr::Update, an attempt is made at an optimization on certain inputs (`node_http_parser.cc`, line 151). The intent is that if the current string pointer plus the current string size is equal to the incoming string pointer, the current string size is just increased to match, as the incoming string lies just beyond the current string pointer. However, the check to see whether or not this can be done is incorrect; &quot;size&quot; is used whereas &quot;size_&quot; should be used. Therefore, an attacker can call Update with a string of certain length and cause the current string to have other data appended to it. In the case of HTTP being parsed out of incoming socket data, this can be incoming data from other sockets.
@@ -41,5 +41,5 @@ X header:
</blockquote>
<p>The fix landed on <a href="https://github.com/joyent/node/commit/7b3fb22">7b3fb22</a> and <a href="https://github.com/joyent/node/commit/c9a231d">c9a231d</a>, for master and v0.6, respectively. The innocuous commit message does not give away the security implications, precisely because we wanted to get a fix out before making a big deal about it. </p>
<p>The first releases with the fix are v0.7.8 and 0.6.17. So now is a good time to make a big deal about it. </p>
-<p>If you are using node version 0.6 in production, please upgrade to at least <a href="http://blog.nodejs.org/2012/05/04/version-0-6-17-stable/">v0.6.17</a>, or at least apply the fix in <a href="https://github.com/joyent/node/commit/c9a231d">c9a231d</a> to your system. (Version 0.6.17 also fixes some other important bugs, and is without doubt the most stable release of Node 0.6 to date, so it&apos;s a good idea to upgrade anyway.) </p>
-<p>I&apos;m extremely grateful that Matthew took the time to report the problem to us with such an elegant explanation, and in such a way that we had a reasonable amount of time to fix the issue before making it public. </p>
+<p>If you are using node version 0.6 in production, please upgrade to at least <a href="http://blog.nodejs.org/2012/05/04/version-0-6-17-stable/">v0.6.17</a>, or at least apply the fix in <a href="https://github.com/joyent/node/commit/c9a231d">c9a231d</a> to your system. (Version 0.6.17 also fixes some other important bugs, and is without doubt the most stable release of Node 0.6 to date, so it&#39;s a good idea to upgrade anyway.) </p>
+<p>I&#39;m extremely grateful that Matthew took the time to report the problem to us with such an elegant explanation, and in such a way that we had a reasonable amount of time to fix the issue before making it public. </p>
diff --git a/doc/community/index.html b/doc/community/index.html
index 3ea98c137..f12de7b47 100644
--- a/doc/community/index.html
+++ b/doc/community/index.html
@@ -129,24 +129,34 @@
the main event in the United States; they are organized by
<a href="http://www.mikealrogers.com/">Mikeal Rogers</a>.
</p>
+
+ <p>
+ <a href="http://nodedublin.com/">Node Dublin</a> is a Node
+ conference in Dublin Ireland, organized by Cian O'Maiden.
+ </p>
+
<p>
<a href="http://nodefest.jp/">NodeFest (東京Node学園祭)</a> is
organized by the <a href="http://nodejs.jp">Node.js Japan user
group</a>.
</p>
+
<p>
<a href="http://nodecamp.de/">NodeCamp.de</a> in Cologne,
Germany is organized by <a href="railslove.de">Rails Love</a>.
</p>
+
<p>
An <a href="http://nodejsconf.it/">Italian Node.js
Conference</a> exists as well.
</p>
+
<p>
<a href="http://nodesummit.com/">Node Summit</a> is a conference
in San Francisco focusing on the adoption of Node in larger
companies.
</p>
+
<p>
<a href="http://jsconf.com/">JSConf</a> organizes the main
JavaScript conferences.
diff --git a/doc/index.html b/doc/index.html
index cb98e4c77..a9a8546bd 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -23,6 +23,8 @@
lightweight and efficient, perfect for data-intensive real-time
applications that run across distributed devices.</p>
+ <p>Current Version: __VERSION__</p>
+
<div class=buttons>
<a href="http://nodejs.org/dist/__VERSION__/node-__VERSION__.tar.gz" class="button downloadbutton" id="downloadbutton">INSTALL</a>
@@ -30,7 +32,7 @@
><a href="api/" class="button" id="docsbutton">API Docs</a>
</div>
- <a href="http://github.com/joyent/node"><img class="forkme" src="images/forkme.png" alt="Fork me on GitHub"></a>
+ <a href="http://github.com/joyent/node"><img class="forkme" src="http://nodejs.org/images/forkme.png" alt="Fork me on GitHub"></a>
</div>
<div id="quotes" class="clearfix">
diff --git a/lib/http.js b/lib/http.js
index b7e7afcbf..a4524bde6 100644
--- a/lib/http.js
+++ b/lib/http.js
@@ -891,7 +891,7 @@ function ServerResponse(req) {
this.sendDate = true;
if (req.httpVersionMajor < 1 || req.httpVersionMinor < 1) {
- this.useChunkedEncodingByDefault = false;
+ this.useChunkedEncodingByDefault = chunkExpression.test(req.headers.te);
this.shouldKeepAlive = false;
}
}
@@ -1476,6 +1476,10 @@ function responseOnEnd() {
assert(!socket.writable);
} else {
debug('AGENT socket keep-alive');
+ if (req.timeoutCb) {
+ socket.setTimeout(0, req.timeoutCb);
+ req.timeoutCb = null;
+ }
socket.removeListener('close', socketCloseListener);
socket.removeListener('error', socketErrorListener);
socket.emit('free');
@@ -1556,6 +1560,9 @@ ClientRequest.prototype.setTimeout = function(msecs, callback) {
}
if (this.socket && this.socket.writable) {
+ if (this.timeoutCb)
+ this.socket.setTimeout(0, this.timeoutCb);
+ this.timeoutCb = emitTimeout;
this.socket.setTimeout(msecs, emitTimeout);
return;
}
diff --git a/lib/stream.js b/lib/stream.js
index 600416396..c03b8b77d 100644
--- a/lib/stream.js
+++ b/lib/stream.js
@@ -71,7 +71,7 @@ Stream.prototype.pipe = function(dest, options) {
if (didOnEnd) return;
didOnEnd = true;
- dest.destroy();
+ if (typeof dest.destroy === 'function') dest.destroy();
}
// don't leave dangling pipes when there are errors.
diff --git a/lib/util.js b/lib/util.js
index d4b19334b..ebb18810c 100644
--- a/lib/util.js
+++ b/lib/util.js
@@ -318,7 +318,7 @@ function formatError(value) {
function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
var output = [];
for (var i = 0, l = value.length; i < l; ++i) {
- if (Object.prototype.hasOwnProperty.call(value, String(i))) {
+ if (hasOwnProperty(value, String(i))) {
output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
String(i), true));
} else {
@@ -349,7 +349,7 @@ function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
str = ctx.stylize('[Setter]', 'special');
}
}
- if (!visibleKeys.hasOwnProperty(key)) {
+ if (!hasOwnProperty(visibleKeys, key)) {
name = '[' + key + ']';
}
if (!str) {
@@ -558,3 +558,7 @@ exports._extend = function(origin, add) {
}
return origin;
};
+
+function hasOwnProperty(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+}
diff --git a/test/simple/test-fs-watch.js b/test/simple/test-fs-watch.js
index 44510b20d..2ad05f2e1 100644
--- a/test/simple/test-fs-watch.js
+++ b/test/simple/test-fs-watch.js
@@ -108,7 +108,7 @@ try { fs.mkdirSync(testsubdir, 0700); } catch (e) {}
assert.doesNotThrow(
function() {
var watcher = fs.watch(testsubdir, function(event, filename) {
- var renameEv = process.platform === 'solaris' ? 'change' : 'rename';
+ var renameEv = process.platform === 'sunos' ? 'change' : 'rename';
assert.equal(renameEv, event);
if (expectFilePath) {
assert.equal('newfile.txt', filename);
diff --git a/test/simple/test-http-1.0-keep-alive.js b/test/simple/test-http-1.0-keep-alive.js
new file mode 100644
index 000000000..623facb17
--- /dev/null
+++ b/test/simple/test-http-1.0-keep-alive.js
@@ -0,0 +1,148 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+var net = require('net');
+
+// Check that our HTTP server correctly handles HTTP/1.0 keep-alive requests.
+check([{
+ name: 'keep-alive, no TE header',
+ requests: [{
+ expectClose: true,
+ data: 'POST / HTTP/1.0\r\n' +
+ 'Connection: keep-alive\r\n' +
+ '\r\n'
+ }, {
+ expectClose: true,
+ data: 'POST / HTTP/1.0\r\n' +
+ 'Connection: keep-alive\r\n' +
+ '\r\n'
+ }],
+ responses: [{
+ headers: {'Connection': 'keep-alive'},
+ chunks: ['OK']
+ }, {
+ chunks: []
+ }]
+}, {
+ name: 'keep-alive, with TE: chunked',
+ requests: [{
+ expectClose: false,
+ data: 'POST / HTTP/1.0\r\n' +
+ 'Connection: keep-alive\r\n' +
+ 'TE: chunked\r\n' +
+ '\r\n'
+ }, {
+ expectClose: true,
+ data: 'POST / HTTP/1.0\r\n' +
+ '\r\n'
+ }],
+ responses: [{
+ headers: {'Connection': 'keep-alive'},
+ chunks: ['OK']
+ }, {
+ chunks: []
+ }]
+}, {
+ name: 'keep-alive, with Transfer-Encoding: chunked',
+ requests: [{
+ expectClose: false,
+ data: 'POST / HTTP/1.0\r\n' +
+ 'Connection: keep-alive\r\n' +
+ '\r\n'
+ }, {
+ expectClose: true,
+ data: 'POST / HTTP/1.0\r\n' +
+ '\r\n'
+ }],
+ responses: [{
+ headers: {'Connection': 'keep-alive',
+ 'Transfer-Encoding': 'chunked'},
+ chunks: ['OK']
+ }, {
+ chunks: []
+ }]
+}, {
+ name: 'keep-alive, with Content-Length',
+ requests: [{
+ expectClose: false,
+ data: 'POST / HTTP/1.0\r\n' +
+ 'Connection: keep-alive\r\n' +
+ '\r\n'
+ }, {
+ expectClose: true,
+ data: 'POST / HTTP/1.0\r\n' +
+ '\r\n'
+ }],
+ responses: [{
+ headers: {'Connection': 'keep-alive',
+ 'Content-Length': '2'},
+ chunks: ['OK']
+ }, {
+ chunks: []
+ }]
+}]);
+
+function check(tests) {
+ var test = tests[0];
+ if (test) http.createServer(server).listen(common.PORT, '127.0.0.1', client);
+ var current = 0;
+
+ function next() {
+ check(tests.slice(1));
+ }
+
+ function server(req, res) {
+ if (current + 1 === test.responses.length) this.close();
+ var ctx = test.responses[current];
+ res.writeHead(200, ctx.headers);
+ ctx.chunks.slice(0, -1).forEach(function(chunk) { res.write(chunk) });
+ res.end(ctx.chunks[ctx.chunks.length - 1]);
+ }
+
+ function client() {
+ if (current === test.requests.length) return next();
+ var conn = net.createConnection(common.PORT, '127.0.0.1', connected);
+
+ function connected() {
+ var ctx = test.requests[current];
+ conn.setEncoding('utf8');
+ conn.write(ctx.data);
+
+ function onclose() {
+ if (!ctx.expectClose) throw new Error('unexpected close');
+ client();
+ }
+ conn.on('close', onclose);
+
+ function ondata(s) {
+ current++;
+ if (ctx.expectClose) return;
+ conn.removeListener('close', onclose);
+ conn.removeListener('data', ondata);;
+ connected();
+ }
+ conn.on('data', ondata);
+ }
+ }
+}
diff --git a/test/simple/test-http-client-timeout-agent.js b/test/simple/test-http-client-timeout-agent.js
new file mode 100644
index 000000000..d3b30ea8e
--- /dev/null
+++ b/test/simple/test-http-client-timeout-agent.js
@@ -0,0 +1,89 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var common = require('../common');
+var assert = require('assert');
+var http = require('http');
+
+var request_number = 0;
+var requests_sent = 0;
+var requests_done = 0;
+var options = {
+ method: 'GET',
+ port: common.PORT,
+ host: '127.0.0.1',
+};
+
+//http.globalAgent.maxSockets = 15;
+
+var server = http.createServer(function(req, res) {
+ var m = /\/(.*)/.exec(req.url),
+ reqid = parseInt(m[1], 10);
+ if ( reqid % 2 ) {
+ // do not reply the request
+ } else {
+ res.writeHead(200, {'Content-Type': 'text/plain'});
+ res.write(reqid.toString());
+ res.end();
+ }
+ request_number+=1;
+});
+
+server.listen(options.port, options.host, function() {
+ var req;
+
+ for (requests_sent = 0; requests_sent < 30; requests_sent+=1) {
+ options.path = '/' + requests_sent;
+ req = http.request(options);
+ req.id = requests_sent;
+ req.on('response', function(res) {
+ res.on('data', function(data) {
+ console.log('res#'+this.req.id+' data:'+data);
+ });
+ res.on('end', function(data) {
+ console.log('res#'+this.req.id+' end');
+ requests_done += 1;
+ });
+ });
+ req.on('close', function() {
+ console.log('req#'+this.id+' close');
+ });
+ req.on('error', function() {
+ console.log('req#'+this.id+' error');
+ this.destroy();
+ });
+ req.setTimeout(50, function () {
+ var req = this;
+ console.log('req#'+this.id + ' timeout');
+ req.abort();
+ requests_done += 1;
+ });
+ req.end();
+ }
+ setTimeout(function() {
+ server.close();
+ }, 150);
+});
+
+process.on('exit', function() {
+ console.error('done=%j sent=%j', requests_done, requests_sent);
+ assert.ok(requests_done == requests_sent, 'timeout on http request called too much');
+});
diff --git a/test/simple/test-util-inspect.js b/test/simple/test-util-inspect.js
index bed4aee67..0877c76d6 100644
--- a/test/simple/test-util-inspect.js
+++ b/test/simple/test-util-inspect.js
@@ -130,3 +130,10 @@ test_color_style('null', null);
test_color_style('string', 'test string');
test_color_style('date', new Date);
test_color_style('regexp', /regexp/);
+
+// an object with "hasOwnProperty" overwritten should not throw
+assert.doesNotThrow(function() {
+ util.inspect({
+ hasOwnProperty: null
+ });
+});
diff --git a/tools/doc/node_modules/marked/lib/marked.js b/tools/doc/node_modules/marked/lib/marked.js
index c6f3d0ac8..e76178471 100644
--- a/tools/doc/node_modules/marked/lib/marked.js
+++ b/tools/doc/node_modules/marked/lib/marked.js
@@ -611,7 +611,7 @@ var escape = function(html, encode) {
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
- .replace(/'/g, '&apos;');
+ .replace(/'/g, '&#39;');
};
var mangle = function(text) {