From 9d4e479d38aa9097c353aa68d966f0b755248e97 Mon Sep 17 00:00:00 2001 From: Martin Minsel Date: Tue, 15 Jan 2019 16:54:12 +0100 Subject: [PATCH 01/33] initial commit --- .gitignore | 9 + cep/.debug | 9 + cep/CSXS/manifest.xml | 84 + cep/css/style.css | 520 ++ cep/fonts/OpenSans/OpenSans-Bold.ttf | Bin 0 -> 224592 bytes cep/fonts/OpenSans/OpenSans-Italic.ttf | Bin 0 -> 212896 bytes cep/fonts/OpenSans/OpenSans-Regular.ttf | Bin 0 -> 217360 bytes cep/fonts/OpenSans/OpenSans-Semibold.ttf | Bin 0 -> 221328 bytes cep/html/manager.html | 47 + cep/html/panel.html | 96 + cep/icon_256.png | Bin 0 -> 262950 bytes cep/images/IconDark.png | Bin 0 -> 17628 bytes cep/images/IconDark@2X.png | Bin 0 -> 18146 bytes cep/images/IconDarkRollOver.png | Bin 0 -> 18044 bytes cep/images/IconDarkRollOver@2X.png | Bin 0 -> 18778 bytes cep/images/IconLight.png | Bin 0 -> 17616 bytes cep/images/IconLight@2X.png | Bin 0 -> 18146 bytes cep/images/IconLightRollOver.png | Bin 0 -> 18044 bytes cep/images/IconLightRollOver@2X.png | Bin 0 -> 18778 bytes cep/images/PySideLogo1.png | Bin 0 -> 12910 bytes cep/images/default_Asset_thumb_dark.png | Bin 0 -> 148010 bytes cep/images/default_Entity_thumb_dark.png | Bin 0 -> 148010 bytes cep/images/default_Project_thumb_dark.png | Bin 0 -> 148010 bytes cep/images/default_Shot_thumb_dark.png | Bin 0 -> 148010 bytes cep/images/default_Site_thumb_dark.png | Bin 0 -> 148010 bytes cep/images/default_Task_thumb_dark.png | Bin 0 -> 148010 bytes cep/images/external_link.png | Bin 0 -> 536 bytes cep/images/sg_logo.png | Bin 0 -> 84437 bytes cep/images/sg_logo_with_text.png | Bin 0 -> 111523 bytes cep/info.yml | 43 + cep/js/adobe/CSInterface.js | 1194 +++ cep/js/shotgun/ECMA/JSON-js/json2.js | 506 ++ cep/js/shotgun/ECMA/rpc.js | 418 + cep/js/shotgun/constants.js | 85 + cep/js/shotgun/events.js | 94 + cep/js/shotgun/logging.js | 81 + cep/js/shotgun/manager.js | 577 ++ cep/js/shotgun/manager_events.js | 51 + cep/js/shotgun/panel.js | 1176 +++ cep/js/shotgun/panel_events.js | 28 + cep/js/shotgun/socket_io_manager.js | 457 ++ cep/node_modules/accepts/HISTORY.md | 74 + cep/node_modules/accepts/LICENSE | 22 + cep/node_modules/accepts/README.md | 94 + cep/node_modules/accepts/index.js | 160 + cep/node_modules/accepts/package.json | 126 + cep/node_modules/after/.npmignore | 2 + cep/node_modules/after/.travis.yml | 5 + cep/node_modules/after/LICENCE | 19 + cep/node_modules/after/README.md | 75 + cep/node_modules/after/index.js | 28 + cep/node_modules/after/package.json | 97 + cep/node_modules/after/test/after-test.js | 120 + cep/node_modules/arraybuffer.slice/.npmignore | 17 + cep/node_modules/arraybuffer.slice/Makefile | 8 + cep/node_modules/arraybuffer.slice/README.md | 17 + cep/node_modules/arraybuffer.slice/index.js | 29 + .../arraybuffer.slice/package.json | 73 + .../arraybuffer.slice/test/slice-buffer.js | 227 + cep/node_modules/backo2/.npmignore | 1 + cep/node_modules/backo2/History.md | 12 + cep/node_modules/backo2/Makefile | 8 + cep/node_modules/backo2/Readme.md | 34 + cep/node_modules/backo2/component.json | 11 + cep/node_modules/backo2/index.js | 85 + cep/node_modules/backo2/package.json | 79 + cep/node_modules/backo2/test/index.js | 18 + .../base64-arraybuffer/.npmignore | 1 + .../base64-arraybuffer/.travis.yml | 6 + .../base64-arraybuffer/LICENSE-MIT | 22 + cep/node_modules/base64-arraybuffer/README.md | 23 + cep/node_modules/base64-arraybuffer/grunt.js | 39 + .../lib/base64-arraybuffer.js | 59 + .../base64-arraybuffer/package.json | 91 + .../test/base64-arraybuffer_test.js | 72 + cep/node_modules/base64id/.npmignore | 3 + cep/node_modules/base64id/README.md | 18 + cep/node_modules/base64id/lib/base64id.js | 103 + cep/node_modules/base64id/package.json | 81 + cep/node_modules/benchmark/LICENSE.txt | 22 + cep/node_modules/benchmark/README.md | 131 + cep/node_modules/benchmark/benchmark.js | 3918 +++++++++ cep/node_modules/benchmark/doc/README.md | 2629 ++++++ cep/node_modules/benchmark/package.json | 98 + cep/node_modules/benchmark/test/run-test.sh | 9 + cep/node_modules/benchmark/test/test.js | 2074 +++++ cep/node_modules/better-assert/.npmignore | 4 + cep/node_modules/better-assert/History.md | 15 + cep/node_modules/better-assert/Makefile | 5 + cep/node_modules/better-assert/Readme.md | 61 + cep/node_modules/better-assert/example.js | 10 + cep/node_modules/better-assert/index.js | 38 + cep/node_modules/better-assert/package.json | 101 + cep/node_modules/blob/.npmignore | 2 + cep/node_modules/blob/.zuul.yml | 14 + cep/node_modules/blob/Makefile | 14 + cep/node_modules/blob/README.md | 14 + cep/node_modules/blob/index.js | 96 + cep/node_modules/blob/package.json | 78 + cep/node_modules/blob/test/index.js | 94 + cep/node_modules/callsite/.npmignore | 4 + cep/node_modules/callsite/History.md | 10 + cep/node_modules/callsite/Makefile | 6 + cep/node_modules/callsite/Readme.md | 44 + cep/node_modules/callsite/index.js | 10 + cep/node_modules/callsite/package.json | 78 + cep/node_modules/component-bind/.npmignore | 4 + cep/node_modules/component-bind/History.md | 13 + cep/node_modules/component-bind/Makefile | 7 + cep/node_modules/component-bind/Readme.md | 64 + .../component-bind/component.json | 13 + cep/node_modules/component-bind/index.js | 23 + cep/node_modules/component-bind/package.json | 82 + cep/node_modules/component-emitter/.npmignore | 2 + .../component-emitter/.travis.yml | 4 + cep/node_modules/component-emitter/History.md | 52 + cep/node_modules/component-emitter/Makefile | 7 + cep/node_modules/component-emitter/Readme.md | 74 + cep/node_modules/component-emitter/bower.json | 21 + .../component-emitter/component.json | 14 + cep/node_modules/component-emitter/index.js | 164 + .../component-emitter/package.json | 84 + cep/node_modules/component-inherit/.npmignore | 3 + cep/node_modules/component-inherit/History.md | 5 + cep/node_modules/component-inherit/Makefile | 16 + cep/node_modules/component-inherit/Readme.md | 24 + .../component-inherit/component.json | 10 + cep/node_modules/component-inherit/index.js | 7 + .../component-inherit/package.json | 79 + .../component-inherit/test/inherit.js | 21 + cep/node_modules/debug/.jshintrc | 3 + cep/node_modules/debug/.npmignore | 6 + cep/node_modules/debug/History.md | 195 + cep/node_modules/debug/Makefile | 36 + cep/node_modules/debug/Readme.md | 188 + cep/node_modules/debug/bower.json | 28 + cep/node_modules/debug/browser.js | 168 + cep/node_modules/debug/component.json | 19 + cep/node_modules/debug/debug.js | 197 + cep/node_modules/debug/node.js | 209 + cep/node_modules/debug/package.json | 112 + cep/node_modules/engine.io-client/.npmignore | 2 + cep/node_modules/engine.io-client/.travis.yml | 46 + cep/node_modules/engine.io-client/.zuul.yml | 6 + cep/node_modules/engine.io-client/History.md | 568 ++ cep/node_modules/engine.io-client/LICENSE | 22 + cep/node_modules/engine.io-client/Makefile | 38 + cep/node_modules/engine.io-client/README.md | 292 + .../engine.io-client/engine.io.js | 4244 ++++++++++ cep/node_modules/engine.io-client/index.js | 2 + .../engine.io-client/lib/index.js | 10 + .../engine.io-client/lib/socket.js | 728 ++ .../engine.io-client/lib/transport.js | 155 + .../engine.io-client/lib/transports/index.js | 53 + .../lib/transports/polling-jsonp.js | 238 + .../lib/transports/polling-xhr.js | 412 + .../lib/transports/polling.js | 247 + .../lib/transports/websocket.js | 288 + .../engine.io-client/lib/xmlhttprequest.js | 36 + .../node_modules/ws/.npmignore | 11 + .../node_modules/ws/.travis.yml | 15 + .../engine.io-client/node_modules/ws/Makefile | 40 + .../node_modules/ws/README.md | 242 + .../engine.io-client/node_modules/ws/index.js | 49 + .../node_modules/ws/lib/BufferPool.js | 63 + .../ws/lib/BufferUtil.fallback.js | 47 + .../node_modules/ws/lib/BufferUtil.js | 13 + .../node_modules/ws/lib/ErrorCodes.js | 24 + .../node_modules/ws/lib/Extensions.js | 70 + .../node_modules/ws/lib/PerMessageDeflate.js | 325 + .../node_modules/ws/lib/Receiver.hixie.js | 184 + .../node_modules/ws/lib/Receiver.js | 702 ++ .../node_modules/ws/lib/Sender.hixie.js | 124 + .../node_modules/ws/lib/Sender.js | 324 + .../ws/lib/Validation.fallback.js | 12 + .../node_modules/ws/lib/Validation.js | 13 + .../node_modules/ws/lib/WebSocket.js | 965 +++ .../node_modules/ws/lib/WebSocketServer.js | 513 ++ .../node_modules/ws/package.json | 111 + .../engine.io-client/package.json | 130 + cep/node_modules/engine.io-parser/.npmignore | 17 + cep/node_modules/engine.io-parser/.travis.yml | 43 + cep/node_modules/engine.io-parser/.zuul.yml | 5 + cep/node_modules/engine.io-parser/History.md | 115 + cep/node_modules/engine.io-parser/LICENSE | 22 + cep/node_modules/engine.io-parser/Makefile | 26 + cep/node_modules/engine.io-parser/Readme.md | 202 + cep/node_modules/engine.io-parser/index.js | 2 + .../engine.io-parser/lib/browser.js | 594 ++ .../engine.io-parser/lib/index.js | 460 ++ cep/node_modules/engine.io-parser/lib/keys.js | 19 + .../node_modules/has-binary/.npmignore | 15 + .../node_modules/has-binary/History.md | 11 + .../node_modules/has-binary/LICENSE | 20 + .../node_modules/has-binary/Makefile | 3 + .../node_modules/has-binary/README.md | 4 + .../node_modules/has-binary/fixtures/big.json | 1 + .../node_modules/has-binary/index.js | 58 + .../node_modules/has-binary/package.json | 73 + .../node_modules/has-binary/test.js | 108 + .../engine.io-parser/package.json | 91 + cep/node_modules/engine.io/.npmignore | 6 + cep/node_modules/engine.io/.travis.yml | 10 + cep/node_modules/engine.io/History.md | 501 ++ cep/node_modules/engine.io/LICENSE | 19 + cep/node_modules/engine.io/Makefile | 23 + cep/node_modules/engine.io/README.md | 534 ++ cep/node_modules/engine.io/index.js | 4 + cep/node_modules/engine.io/lib/engine.io.js | 126 + cep/node_modules/engine.io/lib/server.js | 457 ++ cep/node_modules/engine.io/lib/socket.js | 471 ++ cep/node_modules/engine.io/lib/transport.js | 127 + .../engine.io/lib/transports/index.js | 36 + .../engine.io/lib/transports/polling-jsonp.js | 74 + .../engine.io/lib/transports/polling-xhr.js | 70 + .../engine.io/lib/transports/polling.js | 407 + .../engine.io/lib/transports/websocket.js | 125 + cep/node_modules/engine.io/package.json | 115 + cep/node_modules/has-binary/.npmignore | 15 + cep/node_modules/has-binary/History.md | 19 + cep/node_modules/has-binary/LICENSE | 20 + cep/node_modules/has-binary/Makefile | 3 + cep/node_modules/has-binary/README.md | 4 + cep/node_modules/has-binary/index.js | 59 + cep/node_modules/has-binary/package.json | 75 + cep/node_modules/has-binary/test.js | 73 + cep/node_modules/has-cors/.npmignore | 3 + cep/node_modules/has-cors/History.md | 21 + cep/node_modules/has-cors/Makefile | 11 + cep/node_modules/has-cors/Readme.md | 24 + cep/node_modules/has-cors/component.json | 13 + cep/node_modules/has-cors/index.js | 17 + cep/node_modules/has-cors/package.json | 97 + cep/node_modules/has-cors/test.js | 24 + cep/node_modules/indexof/.npmignore | 2 + cep/node_modules/indexof/Makefile | 11 + cep/node_modules/indexof/Readme.md | 15 + cep/node_modules/indexof/component.json | 10 + cep/node_modules/indexof/index.js | 10 + cep/node_modules/indexof/package.json | 68 + cep/node_modules/isarray/README.md | 54 + cep/node_modules/isarray/build/build.js | 209 + cep/node_modules/isarray/component.json | 19 + cep/node_modules/isarray/index.js | 3 + cep/node_modules/isarray/package.json | 90 + cep/node_modules/jrpc/LICENSE.txt | 21 + cep/node_modules/jrpc/README.md | 296 + cep/node_modules/jrpc/jrpc.browser.js | 811 ++ cep/node_modules/jrpc/jrpc.js | 623 ++ cep/node_modules/jrpc/jrpc.min.js | 6 + cep/node_modules/jrpc/jrpc.min.js.map | 1 + cep/node_modules/jrpc/package.json | 102 + cep/node_modules/json3/.gitmodules | 6 + cep/node_modules/json3/.jamignore | 10 + cep/node_modules/json3/.npmignore | 11 + cep/node_modules/json3/.travis.yml | 33 + cep/node_modules/json3/LICENSE | 20 + cep/node_modules/json3/README.md | 126 + cep/node_modules/json3/coverage/coverage.json | 1 + .../coverage/lcov-report/lib/json3.js.html | 2903 +++++++ .../json3/coverage/lcov-report/prettify.css | 1 + .../json3/coverage/lcov-report/prettify.js | 1 + cep/node_modules/json3/coverage/lcov.info | 2035 +++++ cep/node_modules/json3/lib/json3.js | 861 ++ cep/node_modules/json3/lib/json3.min.js | 18 + cep/node_modules/json3/package.json | 138 + cep/node_modules/mime-db/HISTORY.md | 212 + cep/node_modules/mime-db/LICENSE | 22 + cep/node_modules/mime-db/README.md | 76 + cep/node_modules/mime-db/db.json | 6359 +++++++++++++++ cep/node_modules/mime-db/index.js | 11 + cep/node_modules/mime-db/package.json | 129 + cep/node_modules/mime-types/HISTORY.md | 115 + cep/node_modules/mime-types/LICENSE | 22 + cep/node_modules/mime-types/README.md | 102 + cep/node_modules/mime-types/index.js | 63 + cep/node_modules/mime-types/package.json | 118 + cep/node_modules/ms/.npmignore | 5 + cep/node_modules/ms/History.md | 66 + cep/node_modules/ms/LICENSE | 20 + cep/node_modules/ms/README.md | 35 + cep/node_modules/ms/index.js | 125 + cep/node_modules/ms/package.json | 83 + cep/node_modules/negotiator/LICENSE | 23 + cep/node_modules/negotiator/README.md | 161 + cep/node_modules/negotiator/lib/charset.js | 87 + cep/node_modules/negotiator/lib/encoding.js | 117 + cep/node_modules/negotiator/lib/language.js | 100 + cep/node_modules/negotiator/lib/mediaType.js | 122 + cep/node_modules/negotiator/lib/negotiator.js | 37 + cep/node_modules/negotiator/package.json | 114 + cep/node_modules/object-component/.npmignore | 3 + cep/node_modules/object-component/History.md | 10 + cep/node_modules/object-component/Makefile | 16 + cep/node_modules/object-component/Readme.md | 31 + .../object-component/component.json | 10 + cep/node_modules/object-component/index.js | 84 + .../object-component/package.json | 70 + .../object-component/test/object.js | 48 + cep/node_modules/options/.npmignore | 7 + cep/node_modules/options/Makefile | 12 + cep/node_modules/options/README.md | 69 + cep/node_modules/options/lib/options.js | 86 + cep/node_modules/options/package.json | 86 + cep/node_modules/parsejson/Makefile | 3 + cep/node_modules/parsejson/index.js | 32 + cep/node_modules/parsejson/package.json | 71 + cep/node_modules/parsejson/test.js | 21 + cep/node_modules/parseqs/Makefile | 3 + cep/node_modules/parseqs/index.js | 37 + cep/node_modules/parseqs/package.json | 71 + cep/node_modules/parseqs/test.js | 27 + cep/node_modules/parseuri/History.md | 5 + cep/node_modules/parseuri/Makefile | 3 + cep/node_modules/parseuri/index.js | 39 + cep/node_modules/parseuri/package.json | 80 + cep/node_modules/parseuri/test.js | 51 + cep/node_modules/socket.io-adapter/.npmignore | 1 + cep/node_modules/socket.io-adapter/History.md | 33 + cep/node_modules/socket.io-adapter/LICENSE | 20 + cep/node_modules/socket.io-adapter/Readme.md | 16 + cep/node_modules/socket.io-adapter/index.js | 236 + .../node_modules/socket.io-parser/.npmignore | 5 + .../node_modules/socket.io-parser/.travis.yml | 11 + .../node_modules/socket.io-parser/.zuul.yml | 16 + .../node_modules/socket.io-parser/History.md | 87 + .../node_modules/socket.io-parser/Makefile | 11 + .../node_modules/socket.io-parser/Readme.md | 73 + .../socket.io-parser/bench/bench.js | 10 + .../socket.io-parser/bench/index.js | 81 + .../node_modules/socket.io-parser/binary.js | 141 + .../node_modules/socket.io-parser/index.js | 396 + .../socket.io-parser/is-buffer.js | 13 + .../node_modules/debug/Readme.md | 115 + .../node_modules/debug/debug.js | 137 + .../node_modules/debug/index.js | 5 + .../node_modules/debug/lib/debug.js | 147 + .../node_modules/debug/package.json | 97 + .../socket.io-parser/package.json | 85 + .../socket.io-adapter/package.json | 82 + cep/node_modules/socket.io-client/History.md | 461 ++ cep/node_modules/socket.io-client/LICENSE | 22 + cep/node_modules/socket.io-client/README.md | 188 + .../socket.io-client/lib/index.js | 92 + .../socket.io-client/lib/manager.js | 557 ++ cep/node_modules/socket.io-client/lib/on.js | 24 + .../socket.io-client/lib/socket.js | 412 + cep/node_modules/socket.io-client/lib/url.js | 76 + .../node_modules/component-emitter/History.md | 63 + .../node_modules/component-emitter/LICENSE | 24 + .../node_modules/component-emitter/Readme.md | 74 + .../node_modules/component-emitter/index.js | 161 + .../component-emitter/package.json | 209 + .../socket.io-client/package.json | 136 + .../socket.io-client/socket.io.js | 7248 +++++++++++++++++ cep/node_modules/socket.io-parser/.npmignore | 5 + cep/node_modules/socket.io-parser/.travis.yml | 46 + cep/node_modules/socket.io-parser/.zuul.yml | 20 + cep/node_modules/socket.io-parser/History.md | 108 + cep/node_modules/socket.io-parser/LICENSE | 20 + cep/node_modules/socket.io-parser/Makefile | 27 + cep/node_modules/socket.io-parser/Readme.md | 73 + .../socket.io-parser/bench/bench.js | 10 + .../socket.io-parser/bench/index.js | 81 + cep/node_modules/socket.io-parser/binary.js | 141 + cep/node_modules/socket.io-parser/index.js | 400 + .../socket.io-parser/is-buffer.js | 13 + .../node_modules/json3/LICENSE | 20 + .../node_modules/json3/README.md | 152 + .../node_modules/json3/lib/json3.js | 902 ++ .../node_modules/json3/lib/json3.min.js | 17 + .../node_modules/json3/package.json | 149 + .../socket.io-parser/package.json | 88 + cep/node_modules/socket.io/.npmignore | 4 + cep/node_modules/socket.io/.travis.yml | 20 + cep/node_modules/socket.io/History.md | 571 ++ cep/node_modules/socket.io/LICENSE | 22 + cep/node_modules/socket.io/Makefile | 15 + cep/node_modules/socket.io/Readme.md | 427 + cep/node_modules/socket.io/lib/client.js | 251 + cep/node_modules/socket.io/lib/index.js | 385 + cep/node_modules/socket.io/lib/namespace.js | 272 + cep/node_modules/socket.io/lib/socket.js | 470 ++ cep/node_modules/socket.io/package.json | 122 + cep/node_modules/to-array/.npmignore | 3 + cep/node_modules/to-array/LICENCE | 19 + cep/node_modules/to-array/README.md | 22 + cep/node_modules/to-array/index.js | 13 + cep/node_modules/to-array/package.json | 99 + cep/node_modules/ultron/.npmignore | 3 + cep/node_modules/ultron/.travis.yml | 21 + cep/node_modules/ultron/LICENSE | 22 + cep/node_modules/ultron/README.md | 97 + cep/node_modules/ultron/index.js | 129 + cep/node_modules/ultron/package.json | 110 + cep/node_modules/ultron/test.js | 327 + cep/node_modules/utf8/.gitattributes | 2 + cep/node_modules/utf8/.npmignore | 20 + cep/node_modules/utf8/.travis.yml | 21 + cep/node_modules/utf8/Gruntfile.js | 75 + cep/node_modules/utf8/LICENSE-MIT.txt | 20 + cep/node_modules/utf8/README.md | 119 + cep/node_modules/utf8/bower.json | 14 + cep/node_modules/utf8/component.json | 16 + cep/node_modules/utf8/package.json | 99 + .../utf8/tests/generate-test-data.py | 50 + cep/node_modules/utf8/tests/index.html | 35 + cep/node_modules/utf8/tests/tests.js | 276 + cep/node_modules/utf8/utf8.js | 244 + cep/node_modules/ws/.npmignore | 11 + cep/node_modules/ws/.travis.yml | 15 + cep/node_modules/ws/Makefile | 45 + cep/node_modules/ws/README.md | 235 + cep/node_modules/ws/SECURITY.md | 33 + cep/node_modules/ws/index.js | 49 + cep/node_modules/ws/lib/BufferPool.js | 63 + .../ws/lib/BufferUtil.fallback.js | 47 + cep/node_modules/ws/lib/BufferUtil.js | 13 + cep/node_modules/ws/lib/ErrorCodes.js | 24 + cep/node_modules/ws/lib/Extensions.js | 70 + cep/node_modules/ws/lib/PerMessageDeflate.js | 337 + cep/node_modules/ws/lib/Receiver.hixie.js | 194 + cep/node_modules/ws/lib/Receiver.js | 793 ++ cep/node_modules/ws/lib/Sender.hixie.js | 124 + cep/node_modules/ws/lib/Sender.js | 324 + .../ws/lib/Validation.fallback.js | 11 + cep/node_modules/ws/lib/Validation.js | 13 + cep/node_modules/ws/lib/WebSocket.js | 987 +++ cep/node_modules/ws/lib/WebSocketServer.js | 554 ++ cep/node_modules/ws/package.json | 117 + cep/node_modules/xmlhttprequest-ssl/LICENSE | 22 + cep/node_modules/xmlhttprequest-ssl/README.md | 61 + .../xmlhttprequest-ssl/autotest.watchr | 8 + .../xmlhttprequest-ssl/example/demo.js | 16 + .../xmlhttprequest-ssl/lib/XMLHttpRequest.js | 646 ++ .../xmlhttprequest-ssl/package.json | 93 + .../tests/test-constants.js | 13 + .../xmlhttprequest-ssl/tests/test-events.js | 50 + .../tests/test-exceptions.js | 59 + .../xmlhttprequest-ssl/tests/test-headers.js | 76 + .../tests/test-redirect-302.js | 41 + .../tests/test-redirect-303.js | 41 + .../tests/test-redirect-307.js | 43 + .../tests/test-request-methods.js | 62 + .../tests/test-request-protocols.js | 32 + .../xmlhttprequest-ssl/tests/testdata.txt | 1 + cep/node_modules/yeast/LICENSE | 22 + cep/node_modules/yeast/README.md | 82 + cep/node_modules/yeast/index.js | 68 + cep/node_modules/yeast/package.json | 101 + cep/software_credits | 290 + com.sg.basic.adobe.version | 1 + com.sg.basic.adobe.zxp | Bin 0 -> 1400242 bytes dev/build_extension.py | 437 + framework.py | 238 + info.yml | 27 + pkgs.zip | Bin 0 -> 666225 bytes python/__init__.py | 9 + python/environment_utils.py | 21 + python/plugin_bootstrap.py | 161 + python/tk_adobe_basic/__init__.py | 12 + python/tk_adobe_basic/classic_init.py | 40 + python/tk_adobe_basic/log.py | 61 + python/tk_adobe_basic/plugin_init.py | 84 + python/tk_adobe_basic/rpc/__init__.py | 12 + python/tk_adobe_basic/rpc/communicator.py | 747 ++ python/tk_adobe_basic/rpc/proxy.py | 304 + python/win_32_api.py | 200 + 468 files changed, 80109 insertions(+) create mode 100644 .gitignore create mode 100644 cep/.debug create mode 100644 cep/CSXS/manifest.xml create mode 100644 cep/css/style.css create mode 100644 cep/fonts/OpenSans/OpenSans-Bold.ttf create mode 100644 cep/fonts/OpenSans/OpenSans-Italic.ttf create mode 100644 cep/fonts/OpenSans/OpenSans-Regular.ttf create mode 100644 cep/fonts/OpenSans/OpenSans-Semibold.ttf create mode 100644 cep/html/manager.html create mode 100644 cep/html/panel.html create mode 100644 cep/icon_256.png create mode 100644 cep/images/IconDark.png create mode 100644 cep/images/IconDark@2X.png create mode 100644 cep/images/IconDarkRollOver.png create mode 100644 cep/images/IconDarkRollOver@2X.png create mode 100644 cep/images/IconLight.png create mode 100644 cep/images/IconLight@2X.png create mode 100644 cep/images/IconLightRollOver.png create mode 100644 cep/images/IconLightRollOver@2X.png create mode 100644 cep/images/PySideLogo1.png create mode 100644 cep/images/default_Asset_thumb_dark.png create mode 100644 cep/images/default_Entity_thumb_dark.png create mode 100644 cep/images/default_Project_thumb_dark.png create mode 100644 cep/images/default_Shot_thumb_dark.png create mode 100644 cep/images/default_Site_thumb_dark.png create mode 100644 cep/images/default_Task_thumb_dark.png create mode 100644 cep/images/external_link.png create mode 100644 cep/images/sg_logo.png create mode 100644 cep/images/sg_logo_with_text.png create mode 100644 cep/info.yml create mode 100644 cep/js/adobe/CSInterface.js create mode 100644 cep/js/shotgun/ECMA/JSON-js/json2.js create mode 100644 cep/js/shotgun/ECMA/rpc.js create mode 100644 cep/js/shotgun/constants.js create mode 100644 cep/js/shotgun/events.js create mode 100644 cep/js/shotgun/logging.js create mode 100644 cep/js/shotgun/manager.js create mode 100644 cep/js/shotgun/manager_events.js create mode 100644 cep/js/shotgun/panel.js create mode 100644 cep/js/shotgun/panel_events.js create mode 100644 cep/js/shotgun/socket_io_manager.js create mode 100644 cep/node_modules/accepts/HISTORY.md create mode 100644 cep/node_modules/accepts/LICENSE create mode 100644 cep/node_modules/accepts/README.md create mode 100644 cep/node_modules/accepts/index.js create mode 100644 cep/node_modules/accepts/package.json create mode 100644 cep/node_modules/after/.npmignore create mode 100644 cep/node_modules/after/.travis.yml create mode 100644 cep/node_modules/after/LICENCE create mode 100644 cep/node_modules/after/README.md create mode 100644 cep/node_modules/after/index.js create mode 100644 cep/node_modules/after/package.json create mode 100644 cep/node_modules/after/test/after-test.js create mode 100644 cep/node_modules/arraybuffer.slice/.npmignore create mode 100644 cep/node_modules/arraybuffer.slice/Makefile create mode 100644 cep/node_modules/arraybuffer.slice/README.md create mode 100644 cep/node_modules/arraybuffer.slice/index.js create mode 100644 cep/node_modules/arraybuffer.slice/package.json create mode 100644 cep/node_modules/arraybuffer.slice/test/slice-buffer.js create mode 100644 cep/node_modules/backo2/.npmignore create mode 100644 cep/node_modules/backo2/History.md create mode 100644 cep/node_modules/backo2/Makefile create mode 100644 cep/node_modules/backo2/Readme.md create mode 100644 cep/node_modules/backo2/component.json create mode 100644 cep/node_modules/backo2/index.js create mode 100644 cep/node_modules/backo2/package.json create mode 100644 cep/node_modules/backo2/test/index.js create mode 100644 cep/node_modules/base64-arraybuffer/.npmignore create mode 100644 cep/node_modules/base64-arraybuffer/.travis.yml create mode 100644 cep/node_modules/base64-arraybuffer/LICENSE-MIT create mode 100644 cep/node_modules/base64-arraybuffer/README.md create mode 100644 cep/node_modules/base64-arraybuffer/grunt.js create mode 100644 cep/node_modules/base64-arraybuffer/lib/base64-arraybuffer.js create mode 100644 cep/node_modules/base64-arraybuffer/package.json create mode 100644 cep/node_modules/base64-arraybuffer/test/base64-arraybuffer_test.js create mode 100644 cep/node_modules/base64id/.npmignore create mode 100644 cep/node_modules/base64id/README.md create mode 100644 cep/node_modules/base64id/lib/base64id.js create mode 100644 cep/node_modules/base64id/package.json create mode 100644 cep/node_modules/benchmark/LICENSE.txt create mode 100644 cep/node_modules/benchmark/README.md create mode 100644 cep/node_modules/benchmark/benchmark.js create mode 100644 cep/node_modules/benchmark/doc/README.md create mode 100644 cep/node_modules/benchmark/package.json create mode 100644 cep/node_modules/benchmark/test/run-test.sh create mode 100644 cep/node_modules/benchmark/test/test.js create mode 100644 cep/node_modules/better-assert/.npmignore create mode 100644 cep/node_modules/better-assert/History.md create mode 100644 cep/node_modules/better-assert/Makefile create mode 100644 cep/node_modules/better-assert/Readme.md create mode 100644 cep/node_modules/better-assert/example.js create mode 100644 cep/node_modules/better-assert/index.js create mode 100644 cep/node_modules/better-assert/package.json create mode 100644 cep/node_modules/blob/.npmignore create mode 100644 cep/node_modules/blob/.zuul.yml create mode 100644 cep/node_modules/blob/Makefile create mode 100644 cep/node_modules/blob/README.md create mode 100644 cep/node_modules/blob/index.js create mode 100644 cep/node_modules/blob/package.json create mode 100644 cep/node_modules/blob/test/index.js create mode 100644 cep/node_modules/callsite/.npmignore create mode 100644 cep/node_modules/callsite/History.md create mode 100644 cep/node_modules/callsite/Makefile create mode 100644 cep/node_modules/callsite/Readme.md create mode 100644 cep/node_modules/callsite/index.js create mode 100644 cep/node_modules/callsite/package.json create mode 100644 cep/node_modules/component-bind/.npmignore create mode 100644 cep/node_modules/component-bind/History.md create mode 100644 cep/node_modules/component-bind/Makefile create mode 100644 cep/node_modules/component-bind/Readme.md create mode 100644 cep/node_modules/component-bind/component.json create mode 100644 cep/node_modules/component-bind/index.js create mode 100644 cep/node_modules/component-bind/package.json create mode 100644 cep/node_modules/component-emitter/.npmignore create mode 100644 cep/node_modules/component-emitter/.travis.yml create mode 100644 cep/node_modules/component-emitter/History.md create mode 100644 cep/node_modules/component-emitter/Makefile create mode 100644 cep/node_modules/component-emitter/Readme.md create mode 100644 cep/node_modules/component-emitter/bower.json create mode 100644 cep/node_modules/component-emitter/component.json create mode 100644 cep/node_modules/component-emitter/index.js create mode 100644 cep/node_modules/component-emitter/package.json create mode 100644 cep/node_modules/component-inherit/.npmignore create mode 100644 cep/node_modules/component-inherit/History.md create mode 100644 cep/node_modules/component-inherit/Makefile create mode 100644 cep/node_modules/component-inherit/Readme.md create mode 100644 cep/node_modules/component-inherit/component.json create mode 100644 cep/node_modules/component-inherit/index.js create mode 100644 cep/node_modules/component-inherit/package.json create mode 100644 cep/node_modules/component-inherit/test/inherit.js create mode 100644 cep/node_modules/debug/.jshintrc create mode 100644 cep/node_modules/debug/.npmignore create mode 100644 cep/node_modules/debug/History.md create mode 100644 cep/node_modules/debug/Makefile create mode 100644 cep/node_modules/debug/Readme.md create mode 100644 cep/node_modules/debug/bower.json create mode 100644 cep/node_modules/debug/browser.js create mode 100644 cep/node_modules/debug/component.json create mode 100644 cep/node_modules/debug/debug.js create mode 100644 cep/node_modules/debug/node.js create mode 100644 cep/node_modules/debug/package.json create mode 100644 cep/node_modules/engine.io-client/.npmignore create mode 100644 cep/node_modules/engine.io-client/.travis.yml create mode 100644 cep/node_modules/engine.io-client/.zuul.yml create mode 100644 cep/node_modules/engine.io-client/History.md create mode 100644 cep/node_modules/engine.io-client/LICENSE create mode 100644 cep/node_modules/engine.io-client/Makefile create mode 100644 cep/node_modules/engine.io-client/README.md create mode 100644 cep/node_modules/engine.io-client/engine.io.js create mode 100644 cep/node_modules/engine.io-client/index.js create mode 100644 cep/node_modules/engine.io-client/lib/index.js create mode 100644 cep/node_modules/engine.io-client/lib/socket.js create mode 100644 cep/node_modules/engine.io-client/lib/transport.js create mode 100644 cep/node_modules/engine.io-client/lib/transports/index.js create mode 100644 cep/node_modules/engine.io-client/lib/transports/polling-jsonp.js create mode 100644 cep/node_modules/engine.io-client/lib/transports/polling-xhr.js create mode 100644 cep/node_modules/engine.io-client/lib/transports/polling.js create mode 100644 cep/node_modules/engine.io-client/lib/transports/websocket.js create mode 100644 cep/node_modules/engine.io-client/lib/xmlhttprequest.js create mode 100644 cep/node_modules/engine.io-client/node_modules/ws/.npmignore create mode 100644 cep/node_modules/engine.io-client/node_modules/ws/.travis.yml create mode 100644 cep/node_modules/engine.io-client/node_modules/ws/Makefile create mode 100644 cep/node_modules/engine.io-client/node_modules/ws/README.md create mode 100644 cep/node_modules/engine.io-client/node_modules/ws/index.js create mode 100644 cep/node_modules/engine.io-client/node_modules/ws/lib/BufferPool.js create mode 100644 cep/node_modules/engine.io-client/node_modules/ws/lib/BufferUtil.fallback.js create mode 100644 cep/node_modules/engine.io-client/node_modules/ws/lib/BufferUtil.js create mode 100644 cep/node_modules/engine.io-client/node_modules/ws/lib/ErrorCodes.js create mode 100644 cep/node_modules/engine.io-client/node_modules/ws/lib/Extensions.js create mode 100644 cep/node_modules/engine.io-client/node_modules/ws/lib/PerMessageDeflate.js create mode 100644 cep/node_modules/engine.io-client/node_modules/ws/lib/Receiver.hixie.js create mode 100644 cep/node_modules/engine.io-client/node_modules/ws/lib/Receiver.js create mode 100644 cep/node_modules/engine.io-client/node_modules/ws/lib/Sender.hixie.js create mode 100644 cep/node_modules/engine.io-client/node_modules/ws/lib/Sender.js create mode 100644 cep/node_modules/engine.io-client/node_modules/ws/lib/Validation.fallback.js create mode 100644 cep/node_modules/engine.io-client/node_modules/ws/lib/Validation.js create mode 100644 cep/node_modules/engine.io-client/node_modules/ws/lib/WebSocket.js create mode 100644 cep/node_modules/engine.io-client/node_modules/ws/lib/WebSocketServer.js create mode 100644 cep/node_modules/engine.io-client/node_modules/ws/package.json create mode 100644 cep/node_modules/engine.io-client/package.json create mode 100644 cep/node_modules/engine.io-parser/.npmignore create mode 100644 cep/node_modules/engine.io-parser/.travis.yml create mode 100644 cep/node_modules/engine.io-parser/.zuul.yml create mode 100644 cep/node_modules/engine.io-parser/History.md create mode 100644 cep/node_modules/engine.io-parser/LICENSE create mode 100644 cep/node_modules/engine.io-parser/Makefile create mode 100644 cep/node_modules/engine.io-parser/Readme.md create mode 100644 cep/node_modules/engine.io-parser/index.js create mode 100644 cep/node_modules/engine.io-parser/lib/browser.js create mode 100644 cep/node_modules/engine.io-parser/lib/index.js create mode 100644 cep/node_modules/engine.io-parser/lib/keys.js create mode 100644 cep/node_modules/engine.io-parser/node_modules/has-binary/.npmignore create mode 100644 cep/node_modules/engine.io-parser/node_modules/has-binary/History.md create mode 100644 cep/node_modules/engine.io-parser/node_modules/has-binary/LICENSE create mode 100644 cep/node_modules/engine.io-parser/node_modules/has-binary/Makefile create mode 100644 cep/node_modules/engine.io-parser/node_modules/has-binary/README.md create mode 100644 cep/node_modules/engine.io-parser/node_modules/has-binary/fixtures/big.json create mode 100644 cep/node_modules/engine.io-parser/node_modules/has-binary/index.js create mode 100644 cep/node_modules/engine.io-parser/node_modules/has-binary/package.json create mode 100644 cep/node_modules/engine.io-parser/node_modules/has-binary/test.js create mode 100644 cep/node_modules/engine.io-parser/package.json create mode 100644 cep/node_modules/engine.io/.npmignore create mode 100644 cep/node_modules/engine.io/.travis.yml create mode 100644 cep/node_modules/engine.io/History.md create mode 100644 cep/node_modules/engine.io/LICENSE create mode 100644 cep/node_modules/engine.io/Makefile create mode 100644 cep/node_modules/engine.io/README.md create mode 100644 cep/node_modules/engine.io/index.js create mode 100644 cep/node_modules/engine.io/lib/engine.io.js create mode 100644 cep/node_modules/engine.io/lib/server.js create mode 100644 cep/node_modules/engine.io/lib/socket.js create mode 100644 cep/node_modules/engine.io/lib/transport.js create mode 100644 cep/node_modules/engine.io/lib/transports/index.js create mode 100644 cep/node_modules/engine.io/lib/transports/polling-jsonp.js create mode 100644 cep/node_modules/engine.io/lib/transports/polling-xhr.js create mode 100644 cep/node_modules/engine.io/lib/transports/polling.js create mode 100644 cep/node_modules/engine.io/lib/transports/websocket.js create mode 100644 cep/node_modules/engine.io/package.json create mode 100644 cep/node_modules/has-binary/.npmignore create mode 100644 cep/node_modules/has-binary/History.md create mode 100644 cep/node_modules/has-binary/LICENSE create mode 100644 cep/node_modules/has-binary/Makefile create mode 100644 cep/node_modules/has-binary/README.md create mode 100644 cep/node_modules/has-binary/index.js create mode 100644 cep/node_modules/has-binary/package.json create mode 100644 cep/node_modules/has-binary/test.js create mode 100644 cep/node_modules/has-cors/.npmignore create mode 100644 cep/node_modules/has-cors/History.md create mode 100644 cep/node_modules/has-cors/Makefile create mode 100644 cep/node_modules/has-cors/Readme.md create mode 100644 cep/node_modules/has-cors/component.json create mode 100644 cep/node_modules/has-cors/index.js create mode 100644 cep/node_modules/has-cors/package.json create mode 100644 cep/node_modules/has-cors/test.js create mode 100644 cep/node_modules/indexof/.npmignore create mode 100644 cep/node_modules/indexof/Makefile create mode 100644 cep/node_modules/indexof/Readme.md create mode 100644 cep/node_modules/indexof/component.json create mode 100644 cep/node_modules/indexof/index.js create mode 100644 cep/node_modules/indexof/package.json create mode 100644 cep/node_modules/isarray/README.md create mode 100644 cep/node_modules/isarray/build/build.js create mode 100644 cep/node_modules/isarray/component.json create mode 100644 cep/node_modules/isarray/index.js create mode 100644 cep/node_modules/isarray/package.json create mode 100644 cep/node_modules/jrpc/LICENSE.txt create mode 100644 cep/node_modules/jrpc/README.md create mode 100644 cep/node_modules/jrpc/jrpc.browser.js create mode 100644 cep/node_modules/jrpc/jrpc.js create mode 100644 cep/node_modules/jrpc/jrpc.min.js create mode 100644 cep/node_modules/jrpc/jrpc.min.js.map create mode 100644 cep/node_modules/jrpc/package.json create mode 100644 cep/node_modules/json3/.gitmodules create mode 100644 cep/node_modules/json3/.jamignore create mode 100644 cep/node_modules/json3/.npmignore create mode 100644 cep/node_modules/json3/.travis.yml create mode 100644 cep/node_modules/json3/LICENSE create mode 100644 cep/node_modules/json3/README.md create mode 100644 cep/node_modules/json3/coverage/coverage.json create mode 100644 cep/node_modules/json3/coverage/lcov-report/lib/json3.js.html create mode 100644 cep/node_modules/json3/coverage/lcov-report/prettify.css create mode 100644 cep/node_modules/json3/coverage/lcov-report/prettify.js create mode 100644 cep/node_modules/json3/coverage/lcov.info create mode 100644 cep/node_modules/json3/lib/json3.js create mode 100644 cep/node_modules/json3/lib/json3.min.js create mode 100644 cep/node_modules/json3/package.json create mode 100644 cep/node_modules/mime-db/HISTORY.md create mode 100644 cep/node_modules/mime-db/LICENSE create mode 100644 cep/node_modules/mime-db/README.md create mode 100644 cep/node_modules/mime-db/db.json create mode 100644 cep/node_modules/mime-db/index.js create mode 100644 cep/node_modules/mime-db/package.json create mode 100644 cep/node_modules/mime-types/HISTORY.md create mode 100644 cep/node_modules/mime-types/LICENSE create mode 100644 cep/node_modules/mime-types/README.md create mode 100644 cep/node_modules/mime-types/index.js create mode 100644 cep/node_modules/mime-types/package.json create mode 100644 cep/node_modules/ms/.npmignore create mode 100644 cep/node_modules/ms/History.md create mode 100644 cep/node_modules/ms/LICENSE create mode 100644 cep/node_modules/ms/README.md create mode 100644 cep/node_modules/ms/index.js create mode 100644 cep/node_modules/ms/package.json create mode 100644 cep/node_modules/negotiator/LICENSE create mode 100644 cep/node_modules/negotiator/README.md create mode 100644 cep/node_modules/negotiator/lib/charset.js create mode 100644 cep/node_modules/negotiator/lib/encoding.js create mode 100644 cep/node_modules/negotiator/lib/language.js create mode 100644 cep/node_modules/negotiator/lib/mediaType.js create mode 100644 cep/node_modules/negotiator/lib/negotiator.js create mode 100644 cep/node_modules/negotiator/package.json create mode 100644 cep/node_modules/object-component/.npmignore create mode 100644 cep/node_modules/object-component/History.md create mode 100644 cep/node_modules/object-component/Makefile create mode 100644 cep/node_modules/object-component/Readme.md create mode 100644 cep/node_modules/object-component/component.json create mode 100644 cep/node_modules/object-component/index.js create mode 100644 cep/node_modules/object-component/package.json create mode 100644 cep/node_modules/object-component/test/object.js create mode 100644 cep/node_modules/options/.npmignore create mode 100644 cep/node_modules/options/Makefile create mode 100644 cep/node_modules/options/README.md create mode 100644 cep/node_modules/options/lib/options.js create mode 100644 cep/node_modules/options/package.json create mode 100644 cep/node_modules/parsejson/Makefile create mode 100644 cep/node_modules/parsejson/index.js create mode 100644 cep/node_modules/parsejson/package.json create mode 100644 cep/node_modules/parsejson/test.js create mode 100644 cep/node_modules/parseqs/Makefile create mode 100644 cep/node_modules/parseqs/index.js create mode 100644 cep/node_modules/parseqs/package.json create mode 100644 cep/node_modules/parseqs/test.js create mode 100644 cep/node_modules/parseuri/History.md create mode 100644 cep/node_modules/parseuri/Makefile create mode 100644 cep/node_modules/parseuri/index.js create mode 100644 cep/node_modules/parseuri/package.json create mode 100644 cep/node_modules/parseuri/test.js create mode 100644 cep/node_modules/socket.io-adapter/.npmignore create mode 100644 cep/node_modules/socket.io-adapter/History.md create mode 100644 cep/node_modules/socket.io-adapter/LICENSE create mode 100644 cep/node_modules/socket.io-adapter/Readme.md create mode 100644 cep/node_modules/socket.io-adapter/index.js create mode 100644 cep/node_modules/socket.io-adapter/node_modules/socket.io-parser/.npmignore create mode 100644 cep/node_modules/socket.io-adapter/node_modules/socket.io-parser/.travis.yml create mode 100644 cep/node_modules/socket.io-adapter/node_modules/socket.io-parser/.zuul.yml create mode 100644 cep/node_modules/socket.io-adapter/node_modules/socket.io-parser/History.md create mode 100644 cep/node_modules/socket.io-adapter/node_modules/socket.io-parser/Makefile create mode 100644 cep/node_modules/socket.io-adapter/node_modules/socket.io-parser/Readme.md create mode 100644 cep/node_modules/socket.io-adapter/node_modules/socket.io-parser/bench/bench.js create mode 100644 cep/node_modules/socket.io-adapter/node_modules/socket.io-parser/bench/index.js create mode 100644 cep/node_modules/socket.io-adapter/node_modules/socket.io-parser/binary.js create mode 100644 cep/node_modules/socket.io-adapter/node_modules/socket.io-parser/index.js create mode 100644 cep/node_modules/socket.io-adapter/node_modules/socket.io-parser/is-buffer.js create mode 100644 cep/node_modules/socket.io-adapter/node_modules/socket.io-parser/node_modules/debug/Readme.md create mode 100644 cep/node_modules/socket.io-adapter/node_modules/socket.io-parser/node_modules/debug/debug.js create mode 100644 cep/node_modules/socket.io-adapter/node_modules/socket.io-parser/node_modules/debug/index.js create mode 100644 cep/node_modules/socket.io-adapter/node_modules/socket.io-parser/node_modules/debug/lib/debug.js create mode 100644 cep/node_modules/socket.io-adapter/node_modules/socket.io-parser/node_modules/debug/package.json create mode 100644 cep/node_modules/socket.io-adapter/node_modules/socket.io-parser/package.json create mode 100644 cep/node_modules/socket.io-adapter/package.json create mode 100644 cep/node_modules/socket.io-client/History.md create mode 100644 cep/node_modules/socket.io-client/LICENSE create mode 100644 cep/node_modules/socket.io-client/README.md create mode 100644 cep/node_modules/socket.io-client/lib/index.js create mode 100644 cep/node_modules/socket.io-client/lib/manager.js create mode 100644 cep/node_modules/socket.io-client/lib/on.js create mode 100644 cep/node_modules/socket.io-client/lib/socket.js create mode 100644 cep/node_modules/socket.io-client/lib/url.js create mode 100644 cep/node_modules/socket.io-client/node_modules/component-emitter/History.md create mode 100644 cep/node_modules/socket.io-client/node_modules/component-emitter/LICENSE create mode 100644 cep/node_modules/socket.io-client/node_modules/component-emitter/Readme.md create mode 100644 cep/node_modules/socket.io-client/node_modules/component-emitter/index.js create mode 100644 cep/node_modules/socket.io-client/node_modules/component-emitter/package.json create mode 100644 cep/node_modules/socket.io-client/package.json create mode 100644 cep/node_modules/socket.io-client/socket.io.js create mode 100644 cep/node_modules/socket.io-parser/.npmignore create mode 100644 cep/node_modules/socket.io-parser/.travis.yml create mode 100644 cep/node_modules/socket.io-parser/.zuul.yml create mode 100644 cep/node_modules/socket.io-parser/History.md create mode 100644 cep/node_modules/socket.io-parser/LICENSE create mode 100644 cep/node_modules/socket.io-parser/Makefile create mode 100644 cep/node_modules/socket.io-parser/Readme.md create mode 100644 cep/node_modules/socket.io-parser/bench/bench.js create mode 100644 cep/node_modules/socket.io-parser/bench/index.js create mode 100644 cep/node_modules/socket.io-parser/binary.js create mode 100644 cep/node_modules/socket.io-parser/index.js create mode 100644 cep/node_modules/socket.io-parser/is-buffer.js create mode 100644 cep/node_modules/socket.io-parser/node_modules/json3/LICENSE create mode 100644 cep/node_modules/socket.io-parser/node_modules/json3/README.md create mode 100644 cep/node_modules/socket.io-parser/node_modules/json3/lib/json3.js create mode 100644 cep/node_modules/socket.io-parser/node_modules/json3/lib/json3.min.js create mode 100644 cep/node_modules/socket.io-parser/node_modules/json3/package.json create mode 100644 cep/node_modules/socket.io-parser/package.json create mode 100644 cep/node_modules/socket.io/.npmignore create mode 100644 cep/node_modules/socket.io/.travis.yml create mode 100644 cep/node_modules/socket.io/History.md create mode 100644 cep/node_modules/socket.io/LICENSE create mode 100644 cep/node_modules/socket.io/Makefile create mode 100644 cep/node_modules/socket.io/Readme.md create mode 100644 cep/node_modules/socket.io/lib/client.js create mode 100644 cep/node_modules/socket.io/lib/index.js create mode 100644 cep/node_modules/socket.io/lib/namespace.js create mode 100644 cep/node_modules/socket.io/lib/socket.js create mode 100644 cep/node_modules/socket.io/package.json create mode 100644 cep/node_modules/to-array/.npmignore create mode 100644 cep/node_modules/to-array/LICENCE create mode 100644 cep/node_modules/to-array/README.md create mode 100644 cep/node_modules/to-array/index.js create mode 100644 cep/node_modules/to-array/package.json create mode 100644 cep/node_modules/ultron/.npmignore create mode 100644 cep/node_modules/ultron/.travis.yml create mode 100644 cep/node_modules/ultron/LICENSE create mode 100644 cep/node_modules/ultron/README.md create mode 100644 cep/node_modules/ultron/index.js create mode 100644 cep/node_modules/ultron/package.json create mode 100644 cep/node_modules/ultron/test.js create mode 100644 cep/node_modules/utf8/.gitattributes create mode 100644 cep/node_modules/utf8/.npmignore create mode 100644 cep/node_modules/utf8/.travis.yml create mode 100644 cep/node_modules/utf8/Gruntfile.js create mode 100644 cep/node_modules/utf8/LICENSE-MIT.txt create mode 100644 cep/node_modules/utf8/README.md create mode 100644 cep/node_modules/utf8/bower.json create mode 100644 cep/node_modules/utf8/component.json create mode 100644 cep/node_modules/utf8/package.json create mode 100644 cep/node_modules/utf8/tests/generate-test-data.py create mode 100644 cep/node_modules/utf8/tests/index.html create mode 100644 cep/node_modules/utf8/tests/tests.js create mode 100644 cep/node_modules/utf8/utf8.js create mode 100644 cep/node_modules/ws/.npmignore create mode 100644 cep/node_modules/ws/.travis.yml create mode 100644 cep/node_modules/ws/Makefile create mode 100644 cep/node_modules/ws/README.md create mode 100644 cep/node_modules/ws/SECURITY.md create mode 100644 cep/node_modules/ws/index.js create mode 100644 cep/node_modules/ws/lib/BufferPool.js create mode 100644 cep/node_modules/ws/lib/BufferUtil.fallback.js create mode 100644 cep/node_modules/ws/lib/BufferUtil.js create mode 100644 cep/node_modules/ws/lib/ErrorCodes.js create mode 100644 cep/node_modules/ws/lib/Extensions.js create mode 100644 cep/node_modules/ws/lib/PerMessageDeflate.js create mode 100644 cep/node_modules/ws/lib/Receiver.hixie.js create mode 100644 cep/node_modules/ws/lib/Receiver.js create mode 100644 cep/node_modules/ws/lib/Sender.hixie.js create mode 100644 cep/node_modules/ws/lib/Sender.js create mode 100644 cep/node_modules/ws/lib/Validation.fallback.js create mode 100644 cep/node_modules/ws/lib/Validation.js create mode 100644 cep/node_modules/ws/lib/WebSocket.js create mode 100644 cep/node_modules/ws/lib/WebSocketServer.js create mode 100644 cep/node_modules/ws/package.json create mode 100644 cep/node_modules/xmlhttprequest-ssl/LICENSE create mode 100644 cep/node_modules/xmlhttprequest-ssl/README.md create mode 100644 cep/node_modules/xmlhttprequest-ssl/autotest.watchr create mode 100644 cep/node_modules/xmlhttprequest-ssl/example/demo.js create mode 100644 cep/node_modules/xmlhttprequest-ssl/lib/XMLHttpRequest.js create mode 100644 cep/node_modules/xmlhttprequest-ssl/package.json create mode 100644 cep/node_modules/xmlhttprequest-ssl/tests/test-constants.js create mode 100644 cep/node_modules/xmlhttprequest-ssl/tests/test-events.js create mode 100644 cep/node_modules/xmlhttprequest-ssl/tests/test-exceptions.js create mode 100644 cep/node_modules/xmlhttprequest-ssl/tests/test-headers.js create mode 100644 cep/node_modules/xmlhttprequest-ssl/tests/test-redirect-302.js create mode 100644 cep/node_modules/xmlhttprequest-ssl/tests/test-redirect-303.js create mode 100644 cep/node_modules/xmlhttprequest-ssl/tests/test-redirect-307.js create mode 100644 cep/node_modules/xmlhttprequest-ssl/tests/test-request-methods.js create mode 100644 cep/node_modules/xmlhttprequest-ssl/tests/test-request-protocols.js create mode 100644 cep/node_modules/xmlhttprequest-ssl/tests/testdata.txt create mode 100644 cep/node_modules/yeast/LICENSE create mode 100644 cep/node_modules/yeast/README.md create mode 100644 cep/node_modules/yeast/index.js create mode 100644 cep/node_modules/yeast/package.json create mode 100644 cep/software_credits create mode 100644 com.sg.basic.adobe.version create mode 100644 com.sg.basic.adobe.zxp create mode 100644 dev/build_extension.py create mode 100644 framework.py create mode 100644 info.yml create mode 100644 pkgs.zip create mode 100644 python/__init__.py create mode 100644 python/environment_utils.py create mode 100644 python/plugin_bootstrap.py create mode 100644 python/tk_adobe_basic/__init__.py create mode 100644 python/tk_adobe_basic/classic_init.py create mode 100644 python/tk_adobe_basic/log.py create mode 100644 python/tk_adobe_basic/plugin_init.py create mode 100644 python/tk_adobe_basic/rpc/__init__.py create mode 100644 python/tk_adobe_basic/rpc/communicator.py create mode 100644 python/tk_adobe_basic/rpc/proxy.py create mode 100644 python/win_32_api.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..22095ea --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +*.py[co] + +.DS_Store +*.swp +*.lock +profile +Thumbs.db + +*.swp diff --git a/cep/.debug b/cep/.debug new file mode 100644 index 0000000..1623cda --- /dev/null +++ b/cep/.debug @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/cep/CSXS/manifest.xml b/cep/CSXS/manifest.xml new file mode 100644 index 0000000..8548e29 --- /dev/null +++ b/cep/CSXS/manifest.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + ./html/manager.html + + --enable-nodejs + + + + + false + + + com.adobe.csxs.events.AppOnline + + com.adobe.csxs.events.ApplicationActivate + + + + + Custom + + + 100 + 100 + + + + + + + + + ./html/panel.html + + --enable-nodejs + + + + false + + + Panel + Shotgun + + + 350 + 400 + + + + ./images/IconLight.png + ./images/IconLightRollOver.png + ./images/IconDark.png + ./images/IconDarkRollOver.png + + + + + + diff --git a/cep/css/style.css b/cep/css/style.css new file mode 100644 index 0000000..6343e59 --- /dev/null +++ b/cep/css/style.css @@ -0,0 +1,520 @@ +/* +Copyright (c) 2016 Shotgun Software Inc. + +CONFIDENTIAL AND PROPRIETARY + +This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit Source +Code License included in this distribution package. See LICENSE. By accessing, +using, copying or modifying this work you indicate your agreement to the Shotgun +Pipeline Toolkit Source Code License. All rights not expressly granted therein +are reserved by Shotgun Software Inc. +*/ + +/* fonts... bundled Open Sans fonts which are the SG approved fonts */ +@font-face { + font-family: "Open Sans"; + src: url("../fonts/OpenSans/OpenSans-Regular.ttf"); +} + +@font-face { + font-family: "Open Sans"; + src: url("../fonts/OpenSans/OpenSans-Bold.ttf"); + font-weight: bold; +} +@font-face { + font-family: "Open Sans"; + src: url("../fonts/OpenSans/OpenSans-Italic.ttf"); + font-style: italic; +} + +/* high level defs */ +body { + color: #D7D7D7; + font-family: "Open Sans",Verdana,sans-serif; + font-size: 11px; + margin: 0; + padding: 0; + background-color: #222222; +} + +/* no underlining links */ +a { + text-decoration: none; +} + +a:link { + color: #18A7E3; +} + +a:link.sg_small_link { + color: #18A7E3; + font-size: 10px; +} + +/* links typically found in context header. not SG blue */ +a:link.sg_value_link { + color: #D7D7D7; +} + +a:link.sg_value_link:hover { + color: #FFFFFF; +} + +/* indicator for external links in context header */ +/* +a:link.sg_value_link:after { + content: url(../images/external_link.png); + margin-left: 4px; +} +*/ + +/* white on hover */ +a:hover { + color: #FFFFFF; +} + +/* shift links slightly when clicking */ +a:active { + position: relative; + top: 1px; + left: 1px +} + +/* placeholder for the context thumbnail */ +#context_thumbnail_data { +} + +/* container for the context field info */ +#context_field_data { + padding-left: 8px; + padding-right: 8px; +} + +/* table for field info */ +#context_field_table { + vertical-align: top; +} + +/* the thumbnail itself */ +#context_thumbnail { + max-width: 178px; + max-height: 100px; + float: left; + padding-right: 8px; + padding-bottom: 8px; +} + +/* the first image that shows up when panel is loading */ +#loading_img { + position: fixed; + margin: auto; + left: 0; + right: 0; + top: 0; + bottom: 0; +} + +/* error display */ +div.sg_error { + width: 90%; + height: 100px; + resize: vertical; + overflow-x: scroll; + overflow-y: auto; + font-size: 10px; + background-color: #2C2C2C; + padding: 8px; + display: inline-block; + text-align: left; +} + +/* scrollbar styling */ +::-webkit-resizer { + background-color: transparent; +} + +::-webkit-scrollbar-track { + background-color: #4A4A4A; + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track:horizontal { + border-top: 1px solid #222222; +} + +::-webkit-scrollbar { + width: 10px; + height: 10px; +} +::-webkit-scrollbar-thumb { + height: 8px; + width: 8px; + border: 2px solid transparent; + background-clip: padding-box; + -webkit-border-radius: 4px; + background-color: #696969; +} +::-webkit-scrollbar-button { + width: 0; + height: 0; + display: none; +} +::-webkit-scrollbar-corner { + background-color: #4A4A4A; +} + + +#sg_panel_contents { +} + +/* the container for the favorite commands */ +#sg_panel_favorites { + background-color: #525152; + text-align: left; + flex-wrap: wrap; + padding-top: 8px; + padding-bottom: 4px; + margin: 0; + border-bottom: 2px solid #373737; +} + +#sg_panel_favorites_header { + color: #D7D7D7; + padding-left: 20px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +#sg_panel_favorites_shelf { + padding-left: 12px; +} + +.sg_panel_command_img { + width: 19px; + height: 19px; +} + +.sg_panel_command_other_img { + width: 19px; + height: 19px; +} + +/* regular command button */ +.sg_command_button { + display: inline-block; + border-radius: 3px; + margin: 2px; + padding: 4px; + border: 1px solid rgba(0, 0, 0, 0); +} + +.sg_command_button img { + -webkit-filter: grayscale(1) brightness(.8); +} + +.sg_command_button:hover img { + -webkit-filter: grayscale(0) brightness(1); +} + +.sg_command_button:hover { + border: 1px solid #666666; + background-color: #454545; +} + +.sg_command_button_icon { + padding: 2px; + vertical-align: middle; +} + +/* container for the commands */ +#sg_panel_commands { + margin: 0; + background-color: #525152; +} + +/* a single command div */ +.sg_panel_command { + border-bottom: 1px solid #373737; + height: 32px; + padding-left: 16px; + padding-right: 18px; + padding-top: 5px; + color: #D7D7D7; +} + +.sg_panel_command_td { + padding-left: 8px; + max-width: 1px; /* trick to elide text */ + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.sg_panel_command img { + -webkit-filter: grayscale(1) brightness(.8); +} + +.sg_panel_command a:link { + color: #D7D7D7; +} + +.sg_panel_command a:link:hover { + color: white; +} + +.sg_panel_command:hover { + background-color: #6B6B6B; + color: white; +} + +.sg_panel_command:hover img { + -webkit-filter: grayscale(0) brightness(1); +} + +.sg_panel_command:hover a:link { + color: white; +} + +/* mouseover tooltip styling */ +#sg_panel_command_help { + max-width: 186px; + display: inline; + position: absolute; + width: auto; + background-color: rgba(45, 45, 45, .95); + color: #D7D7D7; + border-radius: 3px; + font-size: 10px; + line-height: 13px; + padding: 7px; + overflow: auto; +} + +#sg_panel_footer { + position:fixed; + left:0px; + bottom:0px; + width:100%; +} + +/* the blue status popup section */ +#sg_status_info { + text-align: center; + height: 22px; + line-height: 22px; + color: #D7D7D7; + background-color: rgba(24, 167, 227, .75); +} + +/* the main context header section */ +.sg_context_header { + padding-left: 18px; + padding-right: 8px; + padding-top: 8px; + padding-bottom: 8px; + border-bottom: 2px solid #373737; + background-color: #424242; + min-height: 100px; +} + +/* general styling for labels (less emphasis) */ +.sg_label { + color: #777777; +} + +/* general styling for values (more emphasis) */ +.sg_value { + color: #D7D7D7; +} + +/* context field label td styling */ +.sg_label_td { + display: table-cell; + vertical-align: top; + text-align: right; + color: #777777; +} + +/* context field value td styling */ +.sg_value_td { + display: table-cell; + text-align: left; + vertical-align: top; + color: #D7D7D7; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; /* number of lines to show */ +} + +.sg_container { + padding: 12px; +} + +.sg_error_message { + padding: 8px; + color: rgba(226, 74, 74, .75); + border-left: 1px solid rgba(226, 74, 74, .75); +} + +#sg_status_error { + width: 100%; + text-align: center; + height: 22px; + line-height: 22px; + color: #D7D7D7; + background-color: rgba(226, 74, 74, .75); +} + +#sg_status_warning { + width: 100%; + text-align: center; + height: 22px; + line-height: 22px; + color: #D7D7D7; + background-color: rgba(226, 159, 74, .75); +} + +#sg_progress { + position: relative; + width: 100%; + height: 8px; + background-color: #222222; + border-bottom: 1px solid #222222; +} + +#sg_progress_bar { + position: absolute; + width: 0%; + height: 8px; + background-color: rgba(24, 167, 227, .75); +} + +/* console styling */ +#sg_panel_console { + position: fixed; + bottom: 0px; + width: 100%; + height: 100%; + background-color: rgba(24, 24, 24, .85); + display: none; +} + +#sg_panel_console_tag { + display: inline; + color: #373737; + border-right: 1px solid #373737; +} + +.sg_panel_console_button { + background-color: #4A4A4A; + border-radius: 3px; + border: 1px solid #343434; + display: inline-block; + color: #D7D7D7; + padding: 4px 8px; + text-decoration: none; + font-family: "Open Sans",Verdana,sans-serif; +} +.sg_panel_console_button:hover { + background-color: #636363; + color: #FFFFFF; +} +.sg_panel_console_button:active { + position:relative; + top:1px; +} + +#sg_panel_console_log { + position: fixed; + top: 0px; + bottom: calc(100% - 44px); + height: calc(100% - 44px); + width: calc(100% - 4px); + padding-left: 4px; + padding-right: 0px; + padding-top: 0px; + padding-bottom: 0px; + text-align: left; + overflow-x: scroll; + overflow-y: scroll; +} + +#sg_panel_console_footer { + position: fixed; + top: calc(100% - 44px); + left: 0px; + width: 100%; + height: 44px; + color: #D7D7D7; + background-color: #4A4A4A; + padding-left: 5px; + padding-right: 0px; + padding-top: 0px; + padding-bottom: 0px; + border-top: 1px solid #222222; + overflow-y:hidden; + overflow-x:scroll; +} + + +#sg_log_message { + color: #D7D7D7; + display: inline; + padding-left: 3px; +} + +#sg_log_message_debug { + color: #18A7E3; + display: inline; + padding-left: 3px; +} + +#sg_log_message_warn { + color: rgb(226, 159, 74); + display: inline; + padding-left: 3px; +} + +#sg_log_message_error { + color: rgb(226, 74, 74); + display: inline; + padding-left: 3px; +} + +#sg_unknown_context_table { + width: 100%; + padding: 10px; + vertical-align: top; +} + +#sg_unknown_context_thumbnail { + display: table-cell; + vertical-align: top; + text-align: center; +} + +#sg_unknown_context_title { + text-align: left; + vertical-align: top; + color: #D7D7D7; + padding-left: 8px; + padding-top: 0; + width: 100%; + flex: 1; + display: inline-block; +} + +#sg_unknown_context_details{ + text-align: left; + vertical-align: top; + color: #777777; + padding-left: 8px; + padding-top: 0px; + width: 100%; + flex: 1; + display: inline-block; +} diff --git a/cep/fonts/OpenSans/OpenSans-Bold.ttf b/cep/fonts/OpenSans/OpenSans-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fd79d43bea0293ac1b20e8aca1142627983d2c07 GIT binary patch literal 224592 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 literal 0 HcmV?d00001 diff --git a/cep/fonts/OpenSans/OpenSans-Italic.ttf b/cep/fonts/OpenSans/OpenSans-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c90da48ff3b8ad6167236d70c48df4d7b5de3bbb GIT binary patch literal 212896 zcmb@vc|a4__Bej;%w!VQgaimX36V`emavGTL}W+VL?pPeD&j7isECM&f{2QHty;B~ zQfs3kwbt6IRjbym)>_;8)LLI_Yinz3pH(vXojXYs?d$h_{`kcXH#2kR-gD1>&OMVN zj1ZE+9|ncQk4j0(uhDA|-9Hc^hsvb*ghb>+zk_HWYv|>Xl$kNgDoPv$=WrhlOd2&h z&Ng7kyKr8D5Pd3RRB+g9Bi9c>2p@v`1;x_~XZgPsT!xUO8zyimuC7$rek6BB$bA*u z-#%&93ubg{bc>WGTloLX>o2Qn}nUNDCbCM+cc=F6R4ICqv{INlD=Z-nO+GYY4dj;i#!fT+J!>EQ4gje$^h{B z1k9RKIxDAPeFs8rOW+v`L~w_lH{ZOwO*&B=^9Wgp-~vKtijzO$+aJ;{^fLOdEv}1- z5QQw@Fn-`UQJcOKA&c5xhI51a2p=%r;~RP>8Jq4xEyxj#K>~PEf`ZXFn9dfpAsX(| z%v8Jz?uZ1N1!}nNX>94sXcC!*vSL|Uz)%!(3sDa=NHG>J`jNpyhm9Hz&npai)|0bG zOGIr{o&w=*7CEFSfR>}%f&diDl%Zrc4|NL0p*Va5-KLUJ zHkE8BV9L=oxL1$w8@5pOD2ifH0CnE51FqFFWjGjGYdAHw z8d!@x(`C3S7=lg%zPs=)LoRh5Q8l;Yv+04A6lMAf#ziWg!VkY0<8b5 zCHzcy>K|L+br^3j;d#>XcqY6@@cp;eu-SZ_*<-lQNT46c2;oy+PJmYlzY=*NJZo$X z+g>=2=da5_r!a(${M;|M{%HKOdqmCv$Gp7tY1wONJ$nz<4>CyPz}Ol#Jv%3I39`Y< z=YMHIW>Ier z1BB-Z-w~eW`Nj!JM`Kg99OR>~Jw8D_$HCLC={12vOrz{dz55xHYp zQ4%XcNpuq`U~SPjfhU~Dp&V*9D&u(#bRB&WXk24B!^;=IMrcm(N@z;x2lraddX7;U z?vi_gnQ)!RPJrPK!4+Aj;18e)=s3Y`bXsr&^c#7eth)_lrycY;;UhBd7SP9V4S4?w zy$5JL9i@`{^mcL$XqE>$5Bl*ua|7f8^au?!g+AH5T%AWFnALEN^xqBF^WYrD1Upg0 zum)GKE$xD9#xeN0h%A!(aE+`{kc$rUYbJUHaLe;9;cMVop}XOzFv{46sfG1*7<&1& z61i*y88_qWv4Ph|Yy{YmIKvY`2Rs7@c}C!CILhP8gvV#NA~H;HMaDGaDjRHvJ9;AA zg>r9F2T6vZ?^3v$lxG2Ec*K!2Ka3)tns z%m~8{K@;ekbMT$4o#2${8PH?IUJ!m1ka55sFegAK%?8`|1kDzD!uKNp!%5V@_@V}S zH{=KBB)M%@Os2Y8DHePEV{ms_)Z z(AQ9uaIf(ITNsMRq4{vs5gQNfUFss54@VuHZ`eW~M%Q87bect{SyvPw`W1Cz@DGUJ zK*ggxIOOy-!@sdL=S)51?N|`8X@c{Bw=xvVMx%2KLfeI#LBDaRmhdX`2dZaTu;&eE z6x)Wzvj})?H^?8z1=y)S1=i>Uv3X1h$Ym$mNK26~oLBJIcsmLAy3j_Tl`DTV;Bma2 zzD%(|lP&aR{21(F2OQ(zXoh1q9DCttgrg1MLBy*ww^SGSLU4|A;aV+xSHkzraN#^0 zrVsSbAqSa<;EHJnpT{12ja)RH@E`9RnCuBV*ib=r84lC=SS^$rT*(1)V$`9h!AJQO z%|=K+0FHkn)O!%xqtNc*;Fm|eJr*+tdCu~B#r`3rX=f5CQ;nH|8(#CG`tU5qyVDt!`oMgqR! z6^(@Eo`^p29aN0hR%a7A~vHI<+5+!@bn5Abc+-Dnbf9@=j7Snv>J ztsVVIpFkUh0ibUy3_E~Va@k*D9jk#JJ-|cpK)3w>YbN;jU|$4Mz*!W;2`}N}|Mzne zGyETXFf;yNZh3q3%*O)T@(+0apV!Uu{l8igqxAJ{O!`3ZKU%Zy{#&~h2|;&&D(n3o z4$xqHdk=Jq<@2NWPlyR}F!)2{pb=UIGEhX_1Yh7L*qfV%xlFd2n4H zlZaxNXe1O^8(djulnrvW4t%p___4eRi)*g&~bQPdIYG_`m*+@@ zmBK;cq3}}pC_)r!#UMqDB3>~|QLCs|>{7g;*rOCEWlBe-Lg}USQ4UZ}@S?m}FR_=@ z%f-vXE5Iw+tH7(&`|MMOGZ^#+13<0-h*Qya^eMW8{jeGr0mR$!I{@($%87^g6hQnX zK#ZP2yaXU#N$;fJqAvr)h_PidnF3}RvxfPIx#WR7hI%aW*zWO($2pIO05MX?6mo@v zhd4|TZGyNGAl?ZOzx5KtV@(j-^?|qqAVvUjufbq|?26%z;W+#?A3F3Q+K&niDTFeH z^;{FTgsV1`8Hx=>hVf{!As%?^BDtqO&n@Qap#^)%K}LzQAjfxk-#Oix_gx)AppVqAht@g#Z& zF2hrBIi8BA;pun=o{4AS*?11Fz?HZPSJOMGGQ0)9inrozcssp|ejV?`yYTCHH-3Yf zLY3nm@lW_Z{u%#*9{?}^1~Jj^_z(Punu`C#|DiglwbVLlJ+*<_NNu7v$>u|tQ%3?39cFe)-4G$eRH zP@tc$k9R+nm(tV8-cBO6wXw3a5D8fULsJ+9Ds;FYK}UNl>=FxA397>6pg=`}Q(1ga zV1g>KK&L2F=%8VIRLO7$E~yH2iUNhs2b#h@mkV?n=sD@7o*H9M&9k0ZqKH8;WD1o+ zcRpUFIE3@F^5A=0yh^Lk{mg$K$$w{j_!ApAQ7YjH9x4K@B0-l}UDlFN05IZxR+ht6 z!%HoL0?|H8EBI;!-*kSeS^KcxP|Sa!{1OK3qmamkObaVbC@j%sX5}TsyDF91puiNJ ztqMkhTWB~xq>de~6Y@hUrogIns8z8q@S~O$ha{+|Ai%mrRZ=)EPe&KRvn_N&OG~rP zEWE zQc2LzdPswc;6%45E6;eYKt-@ zDJ7}|z<6t+Zc!0%S2-b!N}{v<(^aWzk=iMug8@e9s{o)=N~S1u0v{bqp6dGm@FaPp z1^xg@Z2vSiKfA&NK6X+?vS}8*c3jSGXQfqj02+hs!$0;lO1+2`zaglXRX1t|cIMlN5QbN}Wav z6xOQpO0|UT07L$_U^@7~vVd1|^3q1B(z5dNfT~I@e}~*4!!h0oFAby0b2SbF45$-% zixhd3E3Ji&61bp9gfFVN82GCbdW+zY0K)mJgmL3y6nWScnR^2mI)6n%X}qZ)Ie%eL zIHA3VC!0rO$tjF8JlRzVBF=w;0x7tyFii}PiwIJa$vtul)D+wn0e=oB*NnJyB22Hy zQd7}>w_#n6H>x$9&;vS>JkH<;gBF#m&Bi& zaSc54;_VdkZAFVnl{Tt{P(o!I5CP;VIz(7lGtdr}4U$g;S_QgSApw!*1-fOQMni2d z{S>B#7sP4z^@DqP?c62d48v}G*?S|V)75l937ffKD73S?3Z1wdG9ou#TYPG_Zx zBiCce^;qL|mRuLA;&j*%!{duU?lN^4{^pF$Q-Vk;T+X<*NPZ@i(t=WHk=zZ^Y_d=$ zD@H4@$7s)FdbFnp7K79Mjt4z5&Bt>@n%Xlh(c9A}Tr%2Q-EXwB%-|_x44y1)@Jvln zd#1oWnOZtpfa%eU8lI-Hn2x32q3NVVXV0G!vC2#B>85ra?WlGbZHL99C2H|#u{c9a zd5SNJDY4ifrdY7|qp=!|o{8$wJLmy|OgUcUhz0l%UbQc0R6s!5A)x_Gghl399bTsM z9!36YvhsE8G94P7KQ?b4#w)c=ZEYydJxv!jDo>|y*QV)8;ETk4pCgLXR#XH8OsJ@= z3Lu}#fQm}~i}??K>ICi!V(pO}G8#Sbw@T0hnXwl>Ofs@ZtHH~@PcA?I%h{9faX0~W(oSJS@~GzonG-ed>F zR#Hk$jiTzPE!2MMW9k<5hz_PRAxild;{uV%yUbNVw4hz^q2Nc>iuGgD*v&#mVWO}@ zcvgf&14KEZEus^mUo4~+gDpl|tgv|3;!n%|merQsmIf;it4ym3s{>YFTRpW_S;tzB zvYuhxV!g$>+gfjvVpC`HiLIS&zU{YSrFgh_uJ{e{dlEZIs-#JB+0Mf*-EN)T=Td9w z0O=g*X6a|rC$e~1u57#PGW>gLKg_<>{%Z$shj@p#9j-YhIxca1&+&re7xF}Tp1etZ zQ2uWxA195|LZ?oreNI=M9yxnC=Q>YwZgAe<{GIckE+Q8fmq3?T7p=<RgYze(w5j*T3An-5T6F++KHk*X^v^H|}!xj^?cp4$Mdx3b%;63Ai``>yrOtp zaa3sw(Pfx&xN@{|l5&o6p>mb-HRS>2$I361KPaDgS$Vm8`Fn+Wt@hgK)$Mi4>zda+ zucs=ZN~ZEwMXHj)6iihuP_0yLSM5=Kpt`8K-Osn*oPJCCt?$>_?{L3Q`~9omkNqBb z3%#AZ`+0|W$9d;?7kE$g-sJt3_Xpl*ysvuS_P+1^*oW~6_nF``%csGo&1a)em(Tk? zr+r!9Oy45k3g0H*^}cWVzV9dVYxdjZ*X7saciiuDzkmBZ_P6kN^$+ro_D}F1<3Gi} z(!bt+wg0RBpY`w8KeB&Pe{KKr{tNoI_21rqfB%#Hul2vv|3Lr_kOuS%hzv*x7#lDx zU}3i)D`as5P^{eV%!o$O7h93_9HvGqk z(1_@W2@xMgoQ@PkrbVudybvXbQb#pKT^{H#uyo+ufh_}H8MtTQ(Setv-J%CXS47W` zZj4?Zy*2vbpr}EWgO(23IOy1*GlQAI)`RT_XAjOFyk_v77~2>{Ok&LZn8ujan2wlN zVs^&76>}iwhnQbu9uH9s(GF=G^6rp_LkA2k9Qx)^Lu^cJeC+1f2bu^?yJo{M$*_sT zCJ&oCY}>G};v{j=al_(L;5P!uX8%jq%qLoD-%byq|DB zF(`3pVtrzBVte9_#I7W}q{5^rN%N9glP)FwmTZ@-N)As>OwLQ5np~IMp8Q(!f#j3P z=aaum{w>8aMUfJfGCrj#<;|2YQ+-p1rDmnxPyHjcH_at2IxQhBKdm+GlM!JfULA=? z7LI&7-7bAp`q=a>=?Bu!rr%C~oROMQmC=#$VaBD5Uo%rPD>6UL5@e~f3bK}Dt;*Vx z^Tpv)5#w8zmhzVAPUP=l=O$&dt%Gqlb@98+~H*AGtZXlXBY4JdCqy$^N!?k+C*)JHcwlqZPxD4c56>*ztrB#ADzD{|EsaVW1Gi*HO_8a z;<)y4SH}mAZy5jmgp>*2O{|^RFmd_BuL`^h#ucnC*j4au!HI&4g@X!r6vY;OQCwJj zr1()uU`cUFbIE~{FG~JXdVbQFNnMjICTC6FJ^A;t+_I%*2g?joQm3peXUnDK9_5+k zi_4Fe|20)TwQ}mtsh>>~OpBg2b=sC`KTaPw{jC}D8LAn{xe`W^FESU-6_HMTX5H6Aq~HN$FF)qGX+bB$rHbguW@fpgR5w$J@+?ssz^ z)rx9eYJ+NHYm;g-YKv+sYny8~*Y2tPp!QPjx3!Pv3Fo=Y3!IlduV!A$yjSPln;$X1 zcK!$R|5^~fpmf3X1;^`r>zeECER0y#vhb_=$ol&FGmE5)MlV{k=t_fkLr}x~hD#0K zH2l!;WU=*P&&6Sj6Bg$!p1OG9;?;|HEk3;X;^J=?KWY>;x;74I9M+iAIJvQ|aZTga z#;(RAjTahkHU74QSt4K3f60&~nM;b7R4-Y+WZRPNC8w5rx#YVgzb@%*5;eIr1vbSt zWjB>J&24IJ+S;_Q>Eouan*OuYVyVm0z@&+t53D@3^1{m7EAOrRt(|TsR+S?4HjE|Ma2m3- z)(03Ga<#!>!RpWunbJ-f1;;TurT5)3s#f1D=y{S_#=wRUgm@&#Jt9r~vMl>7n)9#f7L7t2SZ)7k$>54p&TH}N~B@$-`J3AR8vbM%TsVYFB^K&V!$?chK2 z7c#z5NXF-nC`hTop{Dsmh~bp6F2e3M+_}2e2JUiwQ!V$@2D_DVKiS}*`K@(0w7#hh zi>!N3;@|@AGTq4SY2dQ)UUD?xoO;~NjUY!ow+H6{zLTMrC76{U59Eyk(IAbdr#0>G z73gN;&9XAqI!){9BlAhqI?CWo<{)rD!NJmKh?ect0d@!uDUwHr*#V`nJu4KdqI`TK z939m%AD@Wu$fzi_&`~b*@ueLdab#pfIDBJS2YW|3z4!LX(5BE6bF<%1DQd0z@AX9pw0e4_~X!ZbGChCr`vC>X^yqvlA~5| zJ8Tw=i_B3_saBOm5n2~OJnA&u7xW6w!OFz2rT{bud26JMn;Y#N8cNYD<>Wa~XzAe0 zV?UN~2#Bg&sgMnqz8y;7_y%<|f-o0Te$L%X# zw|X}Y-PlfzTliPao{V*8l6G&L#_4rM>-p=eU`27THc#-2t&k&%Kp`5}{{3A95?@B_ z7ZSvH21`9rs@9WHTc>K(GNT0WQXr3(1I1v8Ua&ejS%D7@i;Tjy6p+Fj$V6zxi-#>G z#F0^IRwz^X@~fwAPpQmqEgL$TdwtA~IoyRsvj#VDUv^)e{P{cU-WfJybryE4Pwp)3 zId`UN?l;Rj&kEw_&X`+~ls<0INbOT~+*rJCcu`eKdBe@MUr%~{)vhyJo6@U`vio!M zXS{b`$35I#lKT%=3V*?4u0i^0FxL={*K?h< z*lqge_n?LmL&czoku%$2Rkqz07_$@tjlj#3GD2ymwo^JN?Nk)Q&Bsk`cquopjcQ$q zo4MMRTpg@v3-=fYpkHABN3;+2wt@k1-f~u`l15>bX!ffO3)6p*|MUm;_!4G{!dIzi zssi{(v=2^s?HZ*NMyc>kFMM_DRs0yNeKE$9rb1<|CTAyIwQXFyg`KtyKz zfXLL5W5XkoCWgavh8+mebvy+LZJ=P1$1GN1x~})iUOLFg@?lrZtHa=#tW9odC#-p13p<+DGk zDVbSuWH$XLcb#*3YIulk@x8xRea{tsx#!S#c+Ue2^`1BwpljmkF6m)}*n)+94I=x| zp&?3@Od17>%NMw4#Ga1_yN7A_XX0b)=+#(I6ftNrSf8hz9y5y3bBKdZtt!0#Frfv9127NY=y$Seke#Ir=6Ugozk?< z&Q?A?iZrc{(8>;wXGR-n;%KK}qL5)(L>W6c5`zaijMvCvME$B%QGmz3@G+rh4=h-@ z;Fn#Wy))sn(L1`gwl#XTzW!BZapvZt%oBGHe9Sa&xvsE~zfsq8ZcfIo(1>jwm)O+P{~Orl>F3_; zu5Tx}$pqYxnq4=78&~icq$9OZ+ANm?SwIHBbP4}EZg@uk7!2^z2OBbCbt9?Vo@;Bk zC;N^q-_`Zu7affuMfs^GsVz$VpY>zty36}t`=d5v*QAg3EbOpxil+8#;!@-U2TcG= zKG4aKvpSL1pd=}Xu2aN@zVJ*cO zT1yGf5Wy}No*9)s1Dowjv1weBouMw6hQ+8BJ!B-zbr@ByvA~o-z%sCp5B{T_IxHGo zUKkbjYaK9VB)wDU4SEOar-yiV5x%*OYvT@)b=Tt~jGVp;4+)X)Y+ltvQEr4Aks zkIN#I4j7JldSh=HY#isewsJ))R}$Uud~R2bm4LyRMl40M#@X$_?dIo~VIF{5>YiRs zZ|I$Zm*Zqyv5r#~artEatxyB9ndcE7qS=J-wnjg@ejXXxevWpQDOx+mtowP@DWTu_$xE{yp_H0mxb#9)2aqigJW!$^O=BA7Xn@gdYhD5eq&<&p8Fw|co^9c}IL`s~7 z3}GxJ@GrnKj07wn8+~<9yT(-$(?FDquZn0G@cRgea+Z}7w->YxQh70yg9ItVq8wP2 z0{kLrKV=vr1uIMhQXM9f`LOLXKACq?BAVG<(YWll6~pTCH1YJL^!ii-diWjp%1P{r zEl=M3`WAPJ+n~q$vCW6reziVz!uD}-!`>gA7)$3I;QqDi(4h@WU*%Rg^?TSmpla#8 z`Ue<&!8L!!J>;(C*5|{1`!L8sANz9ycYorHkLQdZ1^f9F(Y1zF&|VVIUPAE0+%>jV zj4e*l+S<|(H9`d>L{;F_lh_273Lz9$%TzS&1MVzM2XT@|AJCqA4|S!foCMxuF5t^t zFmX+&={VrPTX}oIr=p?a1~L0#d|SvvD~N3oD8yn#s#Ywvv9*<_YHev7r&O&COl36u zFW6m$o!Rm-DkYYg?2C$4n(QxZuj}@1t(ebUGH{_d!uRo(!%gj1o?y#^$Jed6FX-WP zZO7d$6|c_t{5NoXSFTxDHu>p{*E%Za6Rutl{=X&gqZ82r_9#Vb&)5i4v^HjEA687L zN5}-!0|N8pSU-rGz{8*g_MdU{ zxF_6p5UyNok3DT^e#@ncJ0Q~S!87d=jAY$74p&8 zvlb~@mWB5+1SwjI#vp0fJfq3UA)Xc{_L@KF2)zeO-0F zEN!+>m!Vz7K)Y_&_N~g~RMq5M805ASJ z_{n4^#R@4j5(|c92*qhjY?*4L00>KwHOo zGu^5Q6I4$}cq7am`9=Y^LNKbv)b1%EY{H0=MrW+< z;?8Ao_0Apkb#nz>PvW^I(^^Tk$A;J_OGaoVqOs7tPSCwdl@H}BjzP%^o_<5>0B650FZ%&0Q4afqY)PfoFHK?Jk8ywB9x#d zzJt;&jB;R~>JU6*kDN8umK1on)*{F?@PH7E6Bh@tO*B5yJunF5pQI3EQM-1FgaMMH zJ8;Aw>nx}aY{^~TyKt#1t5*vo$xl;zA%1!~g6Rfrlup%*eDaHFHbE!MCMIj9t%SCJ zTQgP}XTs{pC?IdeK`xwC^xp%sbmMcZNB_OMnA0~-_I?e6$J{zdLnuV?dZZD2I2(v( zNDOAn^RGi6{xwRrN&lOvU1Ezxxcff$>6WwH#;;D_Jb|a(IDONoR~X3R@$mvkq!nV%$k&G<_>Wun&$&uaq1V}=w(e`-fCU7lNs`ud!j!k==nhZ zWsk0ICRru7OJH23CsJwbJSFZDp&XQ^oRNUil)NCSl2b%?_FW?uK3~0^1PLK#Dd!it z^3Bp2?{%jfY>rhXu<_{9baszARTH0&B~SE;_1Dxi*W(qUcOYNr!^@&&I~1^UZ}NVuo91MT3JqIFhvSuiSI@>dM)$B)ukUbXVp3Kluz;?-STs6FD+|NM1=TKy?_jXg6R)Na7JJ z6@n=TULuEb43V5szh(S>a<+C0*4!-;Lg) zpRJ(tU3yEX_m(qjUTJ+glZ*!$!e3!L@C*+Mz}?4?;RBrv&=79{)G@B$>Tn%y^t{6z zzr!72pR_$u0$px^QUogq#;`&fvKNa9rG z15&Go9D8%wkY=}o0cFhfA%|lemc0SGheW*v%s4P}3goM?w`8o5KrC`VE{R$sv6dxj ztxa1eL;=Ox@hLJ0*yZXdHLZ$L8Dj=%B+aMD!Ij}PCRIOfm7mq{`g=_-q64Q|x2}BR zU-;47S!2r%Oq#%qD;~e+>7mPaPwlycOV0MXzK8wSO`f-h`)cPLc)5o{g8`ywsQhpM zrvMqM<>WANPKS?^70s!Coo zbb+)Ff}>W`1Hv~x?}&Goc8ib{18TDPov+gO~vH$AW z5v={FsiymUW@AUckTroS`u34GYGy|yf;6~t_H-k>eWZX`*U{R=!d(I!B0(^% z5&%T5MzcxqMC=BUFmNyV9AA`76-yaIT_NFGp-?SULAt3dVW1{tM7HytV>TD$19oor zt5gJx7&2zOyYny3KmXvngR^&Nb6ilt3>qF+^2zIR+XnZ-hH3Rrdp_8UXhQ>M&x`;Z z`9TCe93^Y~T-9p8lQ23-%P1^pp^qA7aq#oeBx!vlepHgyPwWtwq;+@!P6!?$Ya46_ zeq(?sXcY>L8W$Q)-uGMmS&bzjq?a zy)`bj>flc98}2{HzghKK`lPY3nGX)9kI<(sUet4b+Tv|<7h%Wz%#7;TyzKOw9AKO29G%~-wa%i%x#Caht9j(pj z$j#2pS`8927__-RaI!mz%B5D0kTbV(a0JRY8WTyNib0`(F_-aKO_PUgOFt7~$Q4u9 z*GfCIZ#F1PJ3(@#N|nE>)r5CT8r$W*k;_lDYyyR(iXI{wU82H2QWq-!-lO|1(yGLO6*SOkDav|b>8qmzi@bM*=b->e$q;I9H=W{bzdrqgn-$3j#j7|l?=)|5;h{prL0#@Jd z#3MT4hLKuqGjMMpXdRiO*ji>IMoMc3U)bhN)Vj!kWPHLN+)$ouX1WpSApwUBnA<2& zW(7Bqxll5eu81oxHW+Oy39{pz3pRauM)tbk+v2N=0w>*^h zfW$x+UIkM`@0vl02nTz(#?O+W#Z!0V%vP||$Chtx`Qy1gEXntA&gW=0{PLX>y3e_- zCttLO;5h(X#B(siWrf7xIk@r`TEatT#>(G32MmnykA|vYLc6!k@H$SnyVN2?G_kv2 z#kSS|@gMhb?ewBjT^Td3bnKqLKE=0!bhXn?yz@COJKpPh2z$LUW!{_IwVm)n7S9

MAzfu-#(7W5VH7%hxxNU1% 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/cep/html/panel.html b/cep/html/panel.html new file mode 100644 index 0000000..4d0120d --- /dev/null +++ b/cep/html/panel.html @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ + + + + +
+ + +
+ + + + + + + + +
+ + +
+
+ + +
+ + + + diff --git a/cep/icon_256.png b/cep/icon_256.png new file mode 100644 index 0000000000000000000000000000000000000000..ff2d2a3b7e01608271a89c77134c686474132ad2 GIT binary patch literal 262950 zcmeFa2b|=`b>I0qPxs`sv$JV72LOvi00c>p1Vm6I7(|((L}ioK$(DS&JK6F%eQZ;* z&*!uKv2Q&+(L;1AbxGxm=j`S5#VrvmG{?t1Id7ysy|%(mJi z4?py=e;Tl@zj@+QJX?ypbmjL z1nLl|L!b_UIt1zvs6(I*fjR{05U4|-4uLuZ>JYeIA@JPm|IJX?ypbmjL1nLl|L!b_UIs|F~0ht@u)761Mkk@W(h$l9;b#(Q%w6^uc8ymZ$(O63; z8f}h5BTbQTBpwI^!i$<$$QSbIY$lt^W-`;cY-Tb&Gc%f;njD-QAL}0*89GP)Gh7pk z%GH0?A#e!<>IC2tkksskU>oC#aBb*bzv0%lj*eTJ+dB3(HZ|>NXlU4EfnYGX7JdiroGIeBnqCiUuUYUYj9^i==Y z@X#Q|$GJpQ>ggteK%D?oKiJVwCLt&xVpih}d=K}!!;x@nAQ%L{gkIN4heQxW62u~8 zbGd9TJCM)iE=(trFC{0&o*x?;e06kq=qS%euah3to4FhW0s@J37~I_*i$( z`VYb4_r)3-dJy6vyt@&weTj}=a!b>rXmAKgwhL#IlM^ot_Fwpm@sYvD_r2xb$(Mfc z_{{={OCWQj+^7?Pc_X=f@4iql5Nd&?za3TGFSK@aK7wFxT?k&ERdHUh&eA_V%E%jGOJojjIK&wO?!nf#mVZ2Hi#H(##{5if%3y7+ce z6M&u#8>1ln`t=((e~5kkPa@oVcO)7`SPs(H5r5?g3?abwz>pOfs>UEY<>-AoQOdVbLGK-3;%6ueEc(06JrO*M@B>l>Ks80;asb#ZWaO%MzX)Ysk!;> zE$tmY)6(AlNQ7noW*6+$Y7$*i4@5v|dUE2;iP6zdPfsVmIy%_@MsjjegrJ_TBm^3M zZhgZlwgBbk-0;MprLD8GyLZFA5Q2{)==%`ny1fCc@voksZ$8L9xdU2w#zWsdbHeiA zEGv_6Ra~s6=#Y=!d^%&q5;D%!bCniinM=SK)fg1GC0a!Y+L=? z)r7#sS#&j9ae3Yy+_rn~?ai%iKb~l6`3Y2fw}vB_=d(NY{A(`HOE0OljEo>Tl1A+D z@}*1Wx)%{&$Xftmifm8v5>4>k{T5Qs)!~&177LWsmA4T4aPPb87#V1R%J8KqLKg^G z!PQq9YQ6Fb5(I4z^uF2I%*4#})OV9p6Q3Cy7Y-rg4uM-rNdS8UZUA#4ET4Cb?3InYsvDi=NwJQTHbEN(NgCMz^FTi$&(S~i-n zTr_Su+zayIu;uV8$_C{`cyXA7{En+{hYqQPk zY%I=k66P* zzeUF`SmWfNC1xfqOuj$?%U-oD6tjZfIgh|Bcz4ZzU`;^V^Z8t1COQ4W)YQa(e(lBQ zzQk*$YW}Kvg%v?y@l>j)(6yKekG;md`|o^DQ)}C=Cz@Lx3SALNzgYUB1;vJg_(d+Q z-noV*OE$LIbo(ZoUAN69Iyc*Rb2rG|MAQHwJ4nY$Zmi(ON^U|(dHOqK=YBb9fnI8a z7ThO;uu7L$ebp^u;@&|<5r$04V$d-^tQ-}$qR z&CP!gw!cqUBX(anQL7}JbBQlO_TFOa<@BEe(bCaIOE+~|vbEbL+BaCbd#jCgZn9jW z4TL9Fh>(i>mYv~Zm4;xrRBoT1FGxHnKhynkM_eQ3T2k7|&-<;ty@-gr#UIrxLcq4d zwL_JP;DGck6NAqgWXk#sYur0~wiqpxd zui7E3CD#zs#M8fq$Jt}hrdPZJXm%ejJu%ImBDBwWc=Nuu>Gu>Btt};OgLlB%` zklXYpksP(yc)vA{owxSkQx+RJV;#w1Cs)YRCUG?`KiR#Pxi7W(L;X_C&d#J>nVcB= z!`EMY{x7l09H>p@^;%YgKzX*UmhW18-mr7uZ9jpE@7LJt-xCaKGb>D}W%9ri${|bx zQHs$f8}Ha?BRxATxqhdOz~UDhTbbLN>?JgN#aAfhBYk!YMf<1c}A+XT_e+ zT0A#nQ9dJFLHDk-1;r^~a;v(6B?2PaAXZ)V6(cb2;TXcg2FtOn$VMA1#b+S`a!27h zAX1Kih$tvILO}b}Mtv8taqUvuO5b@FMNSZz8nN!76V`O$h;^}Lh_hWN5O7HEDY~tN ztI$z|&Q`of7fU;jO#7ago+-8Wrbzw?b>`5CjV_Q=BzeXP>XpZrwcZ!#6G z%hYp@M~0BQtdLSUsZvxxL=xOcCe-*}rPdv`kC-;k&|tU^TZ zEyY@XOB6}iU)~D{`y6`!D*?8(v;1laj;6*el;oO0dWRG*%6=ityFw+Yom2`AbD?sc z{?HqzVu_8=2ENF9#J4*^1lT$gYqX5i3TAR%@| zR8+r3A;fNolIR^!p$P42X3x-m{ter3?w~coD#(cZ zID6{1PoF&g{hHKUuVh&WXw^%_S$TV`9KM;I*UU0~SjSTO4tH zY<3#rGV6)wK`1A{kP;tE)PQ(ogl`Thml&QBp-~Ah@mab@p%P(;T2{J8h}Ueq!?G>i zmTK#@^Qa|qEuBt6S(LCq4tM1Z98Y#Yyj@$4g~p(lPBVgn~T+pPpjH9O=8u&TqfRQa#&kMjL%4^nD(0EySmU z#P6)UZbOg2paI@lI=HscvmpIBkiOrE<72GuAp`_k)eCx;TZ#2fR$4|ti0>i$T86_z z-mQ**U%_}1|e8~>^W;2JOLrdL1@rz){-L-jNqIU-E?AX`2Tz3(93_C&lKwM&>5jx zr?t$uTDN7z`Zo1#f6s=#zJHmBH@%(6oRL~t`M4E~i5-U}Pb29&xBaa)yz8wti9SyX zeMe-36mE4avE^9sn3VdgnqkE0o#zf))4&mHNAK1!ISlJOWg!^{NLR?ei>7(7?M&_k zD|@Y0&iT;OJCsD#L|(KF(I*5*I!yIhZOS1)NMo>&YF%f;9b0T>!yX%3zm2Hpjoubv z7MEXfI*t%fXGw@4Aw}clkhPyWU>goUVI70V+%_Z&adD)y27OW&G{)!-&*6joN5@`& z{dZHTsk%9#hO~yMG*fC=<7KF7+pfJIS-)ZPzhb|C2d;f=d~5TPB7($7YSQBDbx&-+ z*ZS}NppCQQXOXr!?3oj@^HY0rByWcPPb*}@*+aJN%_pt-{9$W=rI)NABsRK~w9>DA zRWH|8%TI9%G!3G_+U`IpqLf3Xk&iW4vZc#Lx7}-JAcEGhfxe>4L{{NR5>-Nkz~c-c zXUH?gtn-Z@*shnq<|K+U+Fm&EWsL@jH*!kKD8UN<^vvnw|8ZoX|3WRHakJNT%@cqv zTX%hU)3)vZj_^JEKq$??wI_NlVOpG3Y^Jf(Uc2`rHh$~791;}WURW!Ac>)VtnD7#$ zK@i%GzhK*6{f4!id&8Xs;0fi_B(3iHyyiiwM$Sw0PhE7RK%4^KA$GIzRvXy+4m)|< zdn|`#lVNvkGhFlg=(YzT7=wsK`;Xb~r~b+|A|uFP5aCP?rTVB*QqV#;fj>NP-IZ{qm#cIRV%Y};S>k|nUD(Y+$adpQCiL~v~P^@jZFCv7fsE3O|N zjg4YX*naMiZ8-X@1zF`MTYIdC>_CLhGc*u#i%_zqfMDd{7KV4;1M;_9+rUW+rzcBW zpW4uDOh2QXuSOupcoZXoS2_3qYE(~ag}^mS05)yg@qx{K+y5i}y!+_n+Gi2-T;_Z- zj-O$_d*J?$*{S4Q$- zIgMN-uPu@gU2xQP0^(T|^20R@ZNAl}A+!kuq~e}L5ahSKmL&dzV2@#9xxXbAZHQ+x z>F41L5LnbxwGdd_h*bO570PYdx%(p<`?md`u{itxHF5!(z%qK5>s+Q|lf7}@$L!4Q z4_gMK8P8x}6ITf$A+=vHYAyXoZTB;OZG8y18pqCZ58qz5`iqcg3f_c?u8T7$g2XZu zYP;~Jbs-4VZeY4)y%iIv6Sa*hZ>8Y4#7(5S`)qLiZp9-ib{}Bb$+DI4Kn!W<6B{foqBYZ0g(bo{d}j{tXmBe}N_3QJykQol(r%no-T5T)SmT z+XP@1WosZKp{}7bHja8U+qn@~0xPLcfxROJa0Yo)jzeq_Ca^i!bmnznKV!wR#$^p1 zWq!a3G~5wnoUkE!VJ0&XWq zchQhxPE|hu5hx3FDk@*k#18IS0783v=jP4Zcm5xZEv-MwpsuY=TKUI8r+Z)n z-aut=B$=Fove#3k5Lg?sRr;2d^R@1}_4a?!($@ZQPUeiQ#oAAM{xET}H2IFc?WgVJ z13$~IlldUz*F@CRkS#pcf1O93vHf5F&$jv4v(7PI0>b*Lzw$sW_f%V@EPMNoi3_&z zjmL3-nnE*hE8GBt7h>!I7T{w{C0Wcc=GJj!Eo}owEr;c$go9Pf1=z-c_>G}(=uX@W zpPNl3&$A_{6M^LhYtj9yO#mA9?7#EZ+B>^{mBZ*-)`I-%SA-}Svkfiw;(LDChVJ>0 z6{R+ol)o%afIU^1noUoC!S;Rsk1aYqW*PRc5?FcEVG(rdKP!WPQwtJ*OzKjoZ1<^` ztnvI&8{e?oa+n-@GM7?Sa0^+q2Sa<`ZnM)9w(;y67-Mx%h4( zk35OJK>ZB#OCYrLjjKrjg4=iB^0BU-_5T=Q&W1H1KP!G1hn}hS&Gy{;e$~=@?l+ql zDG8(`PGI$CrHRZ;+n&e&+_t^^RcEjw7gwItQ_Ud2!V59Y;!)X*2Bqi3%Qnf1pYFuG zSb+~53kJmD1QhgOa_{{%&MtH_M4-Ty%_GFsHwMi>A1)(pv#Hb%GHGnJZ<6%WfBMy5 zHLKnhpbVy~MhrG=?z?aO<}Lq{SYNl78&lOMgg}ljQ|q?dD-V6ra+_}<7A1>;llC+5 zw9-eT78$)@`yT%vw(;=y+4mC@3pL+-|NE-mT`#mG1jO1G@TZ94)3fp9D>kZ_1>KvV z$&7^?7m7(%0PUDzypm`L*0D8k+62d$Em>_vH#s8eb}SZ0;0T`2a(F>Sg>K?ZSA_ty zb$0h{-nRW8#~TwLKsE=KYWr5jRYv}3X}3Q9 zXrrAS3Wa(Q2(f}QH&zKFoUam#J=x8M_g zSPnKJAJ|bW2A)Vxjt~1Rep6+?;sjvN?RS2FV|_jqi^bMye5*;a&yQdpo^0>4S0DO> z&2DDp7xK#>MG5vZ1oCe<^nKg))L#Ncm@QV}1Vpf8TOj*z=3+FB_u3b_QW9`(FBn z?RfIDgutCbK$WNq{;C6Z?Mgv>^K8eOMowZPeB35_cUy*NMJ_6lRsxM5L|{t90m85j z4@IeQWr|!)Li1CM#u{#mM4|*68hWytI&OwC)j_uk$Z&#ZOW*cg|EQ^{`QtMBt5yS` za8)uneeU7EXIV-9CGbNLjVCSjGuDs_05% z8}>m2*0Vli*6)Y_W6KzdLkJMVp$oeK&qA}R<-!@4Vr6z{ z2_CI3T-V}G*MDDK2;?|%rGa>gofl*`u!mTM5CO$f*I0_c!`)>N7&Z)_wI%|sUOeZ_ z=bn-JI7%uOiN*FzjgNgflaXC`J@mevY_3+!sdVU`ekeX1|fHABHn+UEt z(X-RC&4d_J=yk^l5P-C0o!cTb51g=gas*C55#m?`e7vWWHGr_WJrs@PMg|9dz&)Q- z#QzJgREhV$=ht5{Te~elxxJU27__u^babs-|B1$ymXG7!83DE3XlO(#xwO(Nj8zQl zzcYK^ZAWqVDM*!6w)~S0nSEx*(HCszQ=fGXC_2zj?!lGRU(Zw7IMfs zjI$I*Ih~~d0e3=OjW0sN86pu$?$gStCNa)fC@{`Se%j&+1OrhC2iX?9mYke8e;Un1Ok>I#Cjl;Mn16H$pbutA&3CuIK#n=8DbQ)Asf&c=@Ked zkpid*TTl@Phc28KM^N7ulz@0y3BbAy8+%(jI)AmPrR9-oJ%7V^^38H?*Fh})@?9HC z$X{X#W%dg@xd&^%j{d_SKQ5|O@QYPUsCtnaK|r=0LCk}jN6%S4fNj7=h=7n>R)bO% zvJIGq2t=?aXc;=m8p1t!dHPJuzX(L23mR~2a%}81pT%$3?3a@Ogu8lrf3&@$^MAuY zqZvPLe?SD0gSnh@B|Y-CkK5!n+`*kZhm}E9;qVj23266Ye`f0m>Y0{*x+aFt*Z6Bx zJ$KC^z&OiGP)D`34xh0!EdR7P0S%T|0UD&a*{q$r^&vZd=X*W8)~cW+ zb5oZ3U61{D+xYtTG5Eo_5H_)n{Q}PQndBf8&Lph`A~1t6aE9aBoOVDfz9JJhaV8=b zhOO8WL<2b{Xj@3IWN zP{i5U?rnCS*nR~ed|CRhRX*Nmz0ZHidJlbA+O&gRkR2|XIIzHPOP;_M^V|Bj31qmmBeW8U%R)3*1!e~4Qt#zh#JR3lux z5eM`7?~|evhhXyuT`a=!P5THo!ZB?MHlne|x^uF%%Q{ZI?z95cZ~=l50f#%=yVs>L z8UF6JU3&uKqqvmcq^afvprflRl1McEJbV97it!JyPjjF8UcsfPGx4!O8`%90JNx#Z zWZW5evHsE(!ve+-3f}US-?oP7Q9REG{K5T7>aFLg4E|RgPV(JgOcSFR1A+XLn=t!! zvH))$6fh;$h<6@)f!V~IfMEEYW5GZm!gio(Vr=AxgBQ*ZQqgsl0)L)+i`i1P0KZxM z)LMH|^F2XBym4J;SI^&d_8bhDuf!4`NsZfVbC;cb`^Q`;nz>NFNREunf7>&kM?8E6 z``;Ev4SdyK&wTAe0BRsMFU&rmViNp_ZdB+O0qM49Z~)&72gl!s_eUt}_TIDk%p(65B0^I%$F+5CyqHqbuws0Hh8yC=mU{u?LPhthB2rAzcje*t26J!`B^KP-!n$%U4qZ5D14hws&;> z%Wy2Zt#ah|npi{-&@eS(XOa4x$NAr>5jEiYqVv1)2-^R>KgG5b1+pT2)}?@}jqP>( z+_Mc=M3+X6Ae!co!W5y0-Iz;4h!v4_5tEGXokSwh;^A9BzfHpCtq9~qgbwCIhLuVw@QW77mYEO#yd7OY-x1EQ@y)f4xJqMCB6znH_WPVii?c&ve5;!0CQ50$9)4=FR7h zpax)35C^D>{r}kZx8PK;7fphe4ZkacJEpj&sj2n76lR}!^QD?_0DEq~Bbd+Uf2*an z{Vw0DKQPx3zk?wE(5(-8E?{Ewl&}eHCkFMF=fBJVYtX&h^}jb41jOF!um@RyO>ruz zJMBdXFAV_lp+X>RohM%Kv_d}Th_OR-PQn7%ZsS}_>0!8*y3dl zKzgQZ%0_nHO^BhLIFm?j8!``{`GG@ALe%pq~4BfPl_*Zydj1 zEk~YZkzjE^Sm+QRXA*IZ=lB1pBN$#>_{w{v4Fod5P$Uw2M|V%}y_J`|F>)9iuy()I6k*@8HoWa#OKJ6Y z_W&o-2`u zzFds9DtK_Q+KLEkUoJy_sp=%D7mMz7Sot{02?7wzt9;IBZvx15ba|eltTkl!U{o&W zqeHYq=f5>f3|ix%Cv2SX!v&oXqb&f(6&q1x*F{DHUc0d0WCKKU* zaUZLBV#I~6&fQD|hwpAOyM1P9a*M?*Pke{N?$5=hFd^|%a%~N$-AsP5pNeK7^^`** z%`7IOhcJ|1Ko~Aob=AKK9&^Y_I}yC)8JpRr4ofz5TAILq1q^fYi56n9H!>!1P65@S z075cF`v8`d5984zr~fGS9if>?3#KM4h#;>qHDZmN9vUXjdw~7BtUn#hk@+|^-XhR0 z3lCtaa8O%cf5IkkA)Q1;=r|EY9L1TSzwb8d>)K|K;bSfq*|PO4exR|$eJB=h*uQ>j z-?lTykJSmlVi+y;8<=fPG&SGD{HdJWmMRK^+`~P)ZHn-*4l%@D${L`x+nNtNX3eKx zW}?Yxt9HqG6){m1iB#{*LR|8g8|RqZv(4=`$#x`#zd=!vM_6r&A&60!oedL}S*|(j zB_T3flz^gLQdfWp7(kX`oM#@vZoQewFZ1SDatuV!l_cyjI&8e4v}$=PXYKm6mYUQq z@3fAX%@Uw*0z;c&qIu>Or>nVxBbw2a0SgzxM~Etd3Bov7EFfsy({Fc=Pr(YJpxEGH zPI8Sw3?jq?j}4!;ZcY+u}uv`hn1wgn*;R138zGH#ZsDtt1^2_~pfdoRKj)r)Ae=O11nNCfg zUoP*Bbbl=bAllN>b}u?rLOS@12NYy7$q2~Bg_5(swgZ|}=yzi$U$&+*2Vmid04hB9#N+I!D$KoBpoJntCWewUrQ?;|#?$fH`3 zIF-WK7F^u7s+8Z!GXG7heJ|H71Sq{94j|jT#g2a9f3>kgcUTW`vf2kvIL(Jv!Hd%P z)#|S7IZ_J0au}0EPz^Sm=cwqt5cskj0-d5|wI1_!7?RfmN)_vq@n23Vg2Gx=X$jY)1iQD;IciPB(KW@p*w}Ege zGdK~KoK%15=3bGz8hgUdq1dxBT^%zbXy@C5z&4&e$%WwJ#!XetghW%*`dBo& z2S8&{DdU>TF6rWRM)Y*&W-lx(6W%3QxhTjVV?}fmfSZ-pseGzejz*{M`&%}K%E{0_ zJAvP|iv08E6CtrI31ZULWAFU94PYf1=A;xq{lAzOxItjG4Vu9?=H!E)u)$m20W2f{ z)fT8)qB6h1m-%}M|1b7w`MIU7f;>zc&L8oJhHDyqgu|IuBq0tWkPx(zy2^P(JUNDV zT{Ifmfh+)(&W)X_A^>Osw%`vyZ14(!ybBzdeLLhFX zRnBFk5z-?M?s}UIX{9Sm`W0Mstw|kpD~eW?`B%lQtgHnhRH-B?(N=<_{sgPpdIu|4 z*w3qIulD>xejU3kTY0zDQ2g!dC^<4!QNQ7om_tp&rx5tT@!^`{k~9qn6{q0>WRT^y z7ZuefI-=MC;cz4z-I{1_x#436R6_uQu~-ZNAc|eF{{rl4mm3u?7-$lslX3RFP8cT1 zIJ*A;)^s{LMyG~2Lz&g;D-R~00q`;f!brVn2)k;s(n(OKPANbo?R6I>vZf2^vUh|L z&(;1~C9Tfv*+m>rBdHhd(W>NH9xsBU^7ru7aH5dRh6Gg5xTE z7EtmK&(^Vii{drt)XJ(yWoB%J5ETp=6e0I)H|)O0_b7&M`*JU*a(QyPp#KP@0*YM7AQMN?t`S8AX*zCF; z7rB5{;XzCBO~}Cso#nhW`OQ0f1X;>mPPShJO8sB%stPWG0Lht!>ibF;PthJlCD=+U-kFum2(SO zN`s^J$e>FOUC4KwbzZrRLPlNM>WM9vX|cYSk<=l#-n7y{tB#dh<2@ylgvYsQYiCQ4 zl7%1y(YZ16J%GW{%(|^6)9f7n0~gz{a^2bzgd>r@cp|~z-q@)c0?-qSHLL?jD~;eH zsCip~biB=`7!W55kXp*gTZ-1sDjU<_`QF19Q7vx3z^Kn#ktATO8VQ+9$SQ(_DBt~^ zKejfa6o*9+=%p4WaWZ1hU9S;9bz$n;36U6h>ql+mmUnsYm71@N2#X+4@lUtKAYMM_ zsLgiou-M3PFK+%E0xhaZLb22oPEMURbnlO$Ztd{|qKmRs|C7!Orb2Xg5yOGt93c*Q zvFXzmK=TrS*vKbBNL!%)MR|6zl`2ACA2RuNfnZ!d@`_U_a|=uLO|y&oR!`m; zWa~Ik<^pj9^PD$kY37zJ5Q#l8j1yWbehAqXjo<3EDTfF^1a)IL6cRTeH&q7q#!S8m zKwD?me$*yXT34K8>o4R}IcmfA zewbB}6;a!q1w_Crck%6-*}C+>r~6v|&AWtb2(}8no9x7$587?tI$;^PA-i^X#peD} zKEV3|a6$w3e8k4Ku?;}B;`YM}+Avqb-xsw-aABN6xcDXp3Db>3j{Q!X}vTd_0?u|8YeC<)(mfQiCa#b#61_rljKC;NYC zB*fXMocbrdzC*lxD$}CR2Cz>Kk z4pwpfcm60(d9UL_mdLxf>`K4Ye&-q-ai-c`N1k&r`X`fCKyxQrD0)FNh{}jYv3bXJTEELD29cse1Oz^-e&jXe!qSVybxQ`D;tHLA% zV0C8Av@GVDj_ps5dV|D3C1APZDF#pZ9I{kcFC(Na!w~-c4mreH`YAvEHPoZB?Hod3 zdCX|F@74@hDY@r_uL4ox7^ZY`*4_BF{hlDvsi8_pp?qqa)5}AokW&OfjwWOv4X6R5 zGgBO#LQoA@=@8$g9SO0jMp@aV+s`?#izUEKdzCMZz-tKe=WI&{tUoJYwJ<36RqX{~ zbQS9G%9TF<^_ zg@cb-vTL(VZpTd-C!u0XyIajYR$cYXueaR5OF!MdKcBKLP9Yrx@tskb`XTNF!kljI zwkRAzK{5;7uOKNGdcnSymgd$Q7W>u53ShAy3#S9^jE_nUwKeQL6_ymD5Hme@39!s&@ zOVlL7C7bm2!DH6``ctfE+c9n$uokh*?9HQm3bBJAd4Q8}f*7&LaY<2ih_?>=F7}yE z*9RsqsG^m%+!ZGmDgT)Ne%dHwsG%MA*$ApHM_|eUM7-PdrCkN2%SPcg7Ux}L$oYI4WjR%nEUE<0Gw>z2Q-w275J!bwg0zV#>8 zcXcXOySTnHDZxtF_?DRW-);ZPdw93%ggVusGf6K%W{QVRg zbwuGMDx^J$q=$Jfw^7zUhvfRJHmTnWlBVw3lj>J6gxQ|0NF%XkS_@TF8xd^CQ)};| ze?Ul{0!BWyA;XW1=x57F&k`y z|7^n#xd91h7}G&T#tgIB*PDwPpp%RnK9-|&p)hQ?AGEzJ#uKSsx^eVU5|>w~fd zf`N4{9qsYS(J?5?jhB28fOtdGxx@MUKtn&}opCL6+r-j+PPcx7H+Ng;2THuwS8ePx`3nnp^R{L23o(X=kM$lZm5D z11C|Gj}Z|QBGHA-Y9nIk==hNHSuSGmAU&d!ib+?v)&xPy;;@j#<lwr_v-hM)l4D< zL~2_@PGw0rUap%Zp+Y12)gcFyGGGY7gs>-vd182m?WS&5hX1am!EmUpp)v05?Jif_ zuVTIa2tXu)7QPw+z!o5aDVQW=N*V+%Mb4B&u-c>(EW%R*)^+9$8{Ypek!uE5O!#F? zixE~V<}6%|q)~2WLCx5YIwu26;HFSDOx-GjfRu&D2Aw%!{M>8S0#S&|A_}V?r+z4J z6;^9H{VTvdO=E61!^$R$s_K#kAZ(FyZ(7rdmmtu{Xs%b}F9U$~>*NwA$(=)V^-~sB zY{#Uc@tFu5&>SUlfX`yrO?F=dAQX(iBYGOFN_!}Ql~%i)SoB3nr*23w?(oKqjSteS zx-_<^7TP#iZg|(-rELJKucI)FUUpf3(vbOt!Fk3&5Q>xDeVIJ62hFYDY6HF7%=W+A z;y6S!oqWaC9e&DM&b{u4fHOy2WqHz;O8ec6yqF|okn+2lBfly;O6!nEC)eOhgD&wnT;aE7~Y*zf>DS7iC zK*lMU`61vtWI?yZc0krKj&=7_=Nz;cbaakFptj?$*tiRg!xqEG0MAub(=VEgR9Geo znvhODp?h#C+@C>$KZAes$i8>ly4N1JEl>W1J8CDVRo$g!0HVIh7MjQ+&UH}kchw}x za$D#&bb+}d2k&9(y1Q3*dcm7IGpCr_sm7|C2BOl9v_F_%mHyH;6Lcuum zzQnpN&T;+!_O+i61%f3g`s=uq{uwvP=9L4u?htq(heMWm&wPB9LOBfExBlgCSwzO+ zV)d@cRO+NwA@v#Ir?v$J>|y)g{c(HtZ~wNq0b%o^6>LFwn7ooZ zuPrhG3?aPqOzA4bimKjs1q!K4OeArHi{U2@Kym6TMf~}##W*0wyss9}^Q&6s``Q2c z5B{0ivbF%rl)4*$RB|ygjv8mh5|>9qt0crgai93hKNN>lR!M!A z=8@77&A{nbt@XLDdK2NYn6}j#{2mNk%gvDHqR`pr7KW?UI-j$$M$)^Jp zdO@EMzHYMn+75{IcH%%k;3$a?E-9i_Q3QZGH4tk_QniV**zx?|SO8PR;dgwDJu|dT zo+1uO)>8XrE-SWNu)riyrg}#{^!IHW{pot`dmfT6o_hdG8Wzv3vP#GaCe#~4of!cB zg&K0Zl2+e?f>RN%J#qe=d37}8DHKdUS4s% zS1hBDlB0KviAFp9-cL9Wqt@duc&Dt)2cCl?dDlwVsK=d!?pDn5G`M7t{BDXnyS3JiqHc@3cRW#=5aKnU~x_!}xq(*!Olz-uEH4Ur6TFmr9zad?H3zH)hzjb)0^!L;(Es z%bRCTTOuD5)mct_)%=@xr~IUn&!XchD#>{r=J7=Uiupn&5Rx3wPm;N2!6I6Lh3sxZ zs0u_f5CG4mj^DcPv*x8*;RXxsLl#*;+nHA^{-raVqVZ0f%lGfGaW7&ll@0JzK7-x%(6@7IVydO^_Qh`62+BTrL%hgv-GnDgcNlq1Rqh zXM-(Bf-QsPg?52DL$Q^+CW*SVy~uzx;h72B^6VFF2IHIY-d#3Jd@3Dbl*W{|fD??2 zMT%N|q@@5UE)oOUQsx%QjiSyH1uNgVJf9*0X`GC({5wkwGO@)jAfnTx&;nqoNS$kP z2vW;2E6#LmcH1QdJg6T28cg8jR^9S<2P_}(A%97~q`BbcgO4iQ>%r54G(ZvnyDbv0 zR~-oP+hflh|ckT^@@CnJKTH63; zYf;7g)SSjyYp`#>?Ku9NJ8(~}D}j`p zF<|K}<9_BD97Um!%H`#GR_oOM%)dHdb}iTflzZlj7-X|}l32ngYs6qMFgosc!RRty zbf&l$(Xrf|%kZfg1)EwR3=XHCg3LLB{S6beaL5WAVJuBTE(*bb5M&8$G>uDX1~$3C zVRYHnP8XNknd8dvNGz+f6`>vx2855!>rr#xZ7*tp1oL3PJ95okHcC9Qw*I5eTT!f- zgn`aInK)!QIrgY6ev`Hw^l4~$;^(>W}gHAu!{g7EOHJlLKLm0 zAY%>!kVQ}z^+oopgj)F>tn&GJD}9iaHKypLTyX*bx?ML0H+cv~4z3`B^Gpi1yhzB~ z4BW$P=LRnZy5e<}U7uy9tNszrrH@zQ5lf>4#mKdERtpfv zZ4`PDJaPo{wx|9IS6aBBGMs$ZD)cK~z6&oZ;0NYP&7@N7WpB*nivY|dll|=35!-4NuVk<#V)8TsLB+Nf%dE(dVm~Fkk^i<%lAtbC z>rLbu0a|TboJvjBhbR2vn||osy2Kf{a+H-FzBCptFMr@-w35UiWN~ck4L9H7;U`%& zk9m5w%sfoCH@Qj)vwV`8Ju zlOc}Zq`oS2Gh2)^SW<5P+V8nYu1+8C#-qXt%dl2sYmhXxv|U?b1edN|?}s~5xVBk& zPl|w*+agT|k(?B3-Gy{h<+>_NC*;i%TTBdHE_Ss@fHSX^ zi7klE%Bqt(@^h25UPNX%LQz_zt2W_r6(8Hs80ero*%0); z`K%=fnvstHmL-XtH>t{KCjE0k!S1;oU|Z22#1MLRpE4F zLTSa)DIraS&q~T@LrLQRTdQzaT2(D4C!W%MJzpUSAtDMnMzr3%PN)Q-6^k&(mEq*b zDL!Yp0@{=FSwNUq6t@8Z5FwBqfHV-!5{=bW?0zxcfCiw$_MdvyX)P3uXZ1uw)DMy- zR}O-r<9yps9YBWI2|ub6@Qu7yga|axR%g#dSH3Li3@LL_Tq3 z88kOK=D9p3`Vs(6?Zj>rFXLjAOQT(3l6Pi9EP9UY6|zDVR(uU*^UDEXt1^2k5o+2+ zA1WOlauVDfr=2GD&PiudP{#D4&7gJ@;zY3`D^!4UvWUwel|TOQ-*v0G)8D&eYCYo~ zt;*UjYd`3aLX+1Ce|V=zx+b!_=B66M3vwas%WS#LrnlT~&BvZ`$l!mRB=F=6YWgB0 z6ij#gS24eYii6NPATPurgZT&%mR%pX4{IBkowZiD7P0R$2qV2M#~R)#84VoM$h{x1 zSt1d4!wIZoTN5l2MjhhdZ1=U=s*P&L{3OsWzBm7QrQb`#;=QA?LRjrVv7RY>;eY?szL;=~|KGw}n-Zx*HqnW0BbAP-a`pw~f#<>AUL4-Tc9Af`SK##It zfwEVa#QCI=s%!5#Hz_MDdr3Cxl8`bmd=_qi2*&8UFRpaZFIK)L0;hHyc+Ae}R1v*X zK}##*WG;D|2SXWhK}@H&-(l&ljW%`oS?fCZm^Iu^N<8y{pvYwt&2Qh~tVi*WBFFTo62_2Cac;&dztljr%Hy4W#L*jY;PfaHe@zaM)06`yECR_gTUH9UP0J1t3e)ZDJ=Af+v9k&Lw4{lOBge&I;u2=^aLILX{ zVp7Y=R}m1P4|hm7zklWYK0eiMV46d{HhR~O+KIpQ8+QC7zhP(Z`Jhd7Yyv;=`G7-- zL9`pj`-zA=K$!GFu6}I%;V9J3%5ZmyM$vZH{K_kEs#4@TIUQLI@$!PHQif?te++&;}L}thcp?Ra%U&zQ_ zJ==kaE{I*!%1xYocYirh!rJRp&bBw7u^A?(BP5FuW4WTM-q*y37+iSZr<@JL=5PLi zWr?SsZC>a29e38%{7RUkPR|U%i4h1i+tg)e-~ID8x#vC)VSP@x`Bl5`XdoiPXRMRc zi(KGU!OIb_Qck|>+^;C7aISyi)0SSh4WpP=xS8=aAYiF(ZQIb0$igne_A86w&;-OW zjP^h$rUnO2!kL_LVaFOdwI>Sa(V(%Fv6Q$wimxfn@8?Pt(Y_+^pVe{I(u_E|QF=Ms z%qGrAlTCnO)a6Sy=w*Sn@p>$`nHdJNv=^ z*#_2avAy5N$fUUiC#dGM%Tgq(=N|4Q!hqtfyd!G zon7wph+;`RSp8MSX(~dEb>k-A1OQOXU?%xSB+~kJhP|>;W|F#NcM&)>V2f|JzS{|& z+$2RhKhDAOJ*c0WIG@j)7xK#NpCs2>af63{X!&>ltVaN9IYw{-1uo#2BfW*kY({Z){Ok6cTxAM39gZFp*FN` zD@W8p0Lt+bbXEnNQ6n5cPFo`%ngG2vm&r_IW@q|&KZAMWrfLX4CN(?zN}{>-euk+s z0-%Y5Fe{8+HpH3LZiPTKM^p$8vYgeIYg=yxB)6U*aFv1Ass~lS<)z2$05Jdz*4u3< zYQ+U;251hB_Iql?x4hr_IY+Qx$S+l-CX-|X5)z_~5CXb`D;4k0A^s}uUu{0Qy2IA+ z^3&FQ>Y#IXUTXE9tA_UE*)Am5V)Z`#WjoW_i+T)wzE0ejk-XLL`l; zbSj%kGf{8sRN2g01Oo`b;ao-`VahzA1DW^JEuBmJ2BK1{McJ<>#04lxUoVyo)_F?K zHMr<{I@=}6Us5kPhXj1{i;r6TCPP|fUry4fc1RBz-=it9y0Vo4%4b*(c~#uRtr}EL%}K!QOW1Cr_$3YSh`xJ$f+%FnyqXL@SDX? z)#`QC)>9Qln4O&+z=8Tm8Br>Gx%61FY?-nUOS#kCNr$6Rf(+!lIUiexzt1U!SF4qB zkoquA?mbU@hGiS}O~&oDW(!tpMlGL1SprbU_Sc?-B7B8?4|@)mgdvqAmOo(1vCp>Y zhks$~9{&qYFolB22e?KAtCCh+u{^|mD@LQ1#X`zig*lAp?Sz5~aK^h1OO$D-M@=eg zmFBekgRu@eo=PRJ#HOmUhFzvyRS|&csfqqvF8hWr$d)=FbFOAK+fkJJo@EISSYES8 z*JjWUN)=un$JP6+Ssk#BlP{we`@DBx0Q~fINd$!a?2Vd^JZGD}{YS6`Qm|JwJkBJp zfPQroy29RX5>H*{p1V_3ZY(OGC?IL{qO+)(oOjS1@ef+-xg!=U3kX)9NDFcliiH8@ z_i=943BUr#T>LSaPiGG05uG?>)dE%N1s5QTk|@#|Cs`9ejbta^)M8Tv_LDv8oGokx zb;>`e$V#x`rAMv%@xP=lRy@ZCi;z^ha$fA%mH!4(BH;|6Z)-j9ecSPc|Kx%c6vE4UYW?{5EAr0^Lgw0Yw8?2j^hNJfOLk}Iyuug9F2ZJTy1rbOi9`8VZy6sQ?g{^z)i`ZzR#cM===C)tg z%EYGiLSPmHNsgE73y&Avhga8O5y`Flk;Cz z?gQUL0w}*`t^EEpE-SS*078iqh$F;pef7H*Ls6b0T57SIVG|LM#LVCDt@Jwo&$Q{* zs_mq@tlXGf|2+*3yl0P9jME&OZ2aoIpzDn{8=rzbhJz?Z=a%@_GQWB0C7O$u0X(+M?7K0nh~j z2xDg|q;RSnZ4dk;njxW26g^$@tB)ZF8nJZuX5w(;K(13IRG+7J;8T<9N+jN+cM0jG z2GQYm+6EEor{i0HVp|{meF7GaV~9_b3)kPJC;VDks-C)tBX9!=-rM!c_pC5APK-13 zX}s6LMgSKfzY=iKJJeTkXk0q6H;NH|+Y^6n8xKC=xSu)s&{7=-mf?vJo7j85jlcCH ztn{?oaRAgAjac*Zk6Op6SDYskFIuXGW$!VqkEfDTpPQN(KeTM78|Xphh$dh+zGD#uc&n04)tOsjBo%nS z>F{&JA;5kY!r+wos#6osxfIeChnOM^nkZcEqx9YT;oV>9yPMD|TdK#^3260OtD7!X z^^i;>v1g8By|eSt|7x8_p2CZWUK~0mBiU$hTapZZ72%fPN=9u9`f)$so zm)tg`Q&V5nhdE+UhKHY~l**KmT`(xaL)@DDdpQIlj(cMp@Ywo|KeV3L9)}153B{CK zma9|-1)xmYv4{T-{@u5Fo?*(5j3bDr(&nfB#=?{RrM~!RGgV~L=^u`d4*%8c%nVZM z8$U4;Ri`2}m^a2%65nX${1`nrXS)O;C68CrH}Qfppy* z2pC2D$v z7u0<6TA4*wA=Y0$w^t>VR@wq8NcCBfNj9TV$sc+G$A^tJBl`^OZc|v^q(!jUP6;lu z@)A6B2%#dFmZ0EufjS++3nrLP>Wue*?36jqDKa(2fej;^jyhnWk<-?MHYkB_aR67u z9I#HaC6orkgNI=3pu03^2xg#j&LIP)#-A7|??1W~T2JZw1NI z93ct;^A&+}<9GkmaRlBzxx%^^XLDLhyjhsQc}17hD$S&6hf6TLe-sx>UQD{O2(WZ5(f?B!?}!;1JFPkajR$p_7Mf-7$p0BHSui>feGoR``J|;Mnxk)J-7= zD1%|G1i&UI$G_L!(S0TsZ`fOL00E7TQ{&BA8v{0Z+q-OL<1X&O)`74#J!OOUK4P6O ze;Y^mLAZdjbzHgGReY8vgSH6@7d)qMhnN+8ZlNxs0m zy9Z%n0QW$J5w5siio4K2xqK>{%{@0hHhRLQka>;_E@p0Xm*C!DN6=H=ZD3pWgf-;x6l5u>xa?{9hC3A?NG>%iNH3XDh%iP)aRVNOs<;IOWC}#UdGW&8 zQ!i9p=myDH3j$zcqeI_I&&(bu1(x;TF9KY_rNjD~iAE`Vc*p*Wb=D+8sFp)zIDE&$ ztjsjCyz*2~XC?2g=c#Obt_e8NRI&f#sQ;!3$K*5)jsWn0`4dEt+;!;t$cswcN~Lo| z_41E1!zXZmeS$6QId0ulsU`$~4Rw+O2LGg>K@spPO+soAUaGm4gO6EQ-hHCzN)F-k zHhRZ1+OJ znjxbo6kea2oc#7p23XhK+7JM$!jtOj=u=NfpyDfO0FWxTo_*6=FbQ_5APJ2`Nuc@# zWC3UI`2fGU=On(qYOiO$-XXyJkVzy`9C}y|%OHeFfDjJDM|4Hk5?FTM^qu&KW zbCpFaok`C=J~}-3dd)!fNalCnXLjA#0+jn*Gh%>2$$1FEr(Fo(a_tpWf+ML8d=mX(UsKv4K zKB_L_%o8Ub^-QA8W_GdX6UEn<=(DNSrZMj6le!3U z$fmX`!b)dNJ>QjsK+zczO>Mfx`XBsRR{vh+0|x;>6ikN{AST}Qh2OSDEK7AfkW)$e zY+SyOKRG*-`rYx-(E~n<-Z0r~N&v8^$|f3{Mq}~B#~=VGYJDUp7a+JG=Rb#%lQsq0 zFUvd^5mI|USiafbtrk3W$eOWdcSpk9oLrj^pkAk0S)FwtV;Y#Ofa&8?>$`{sN0d%=gQzzt4B& zLZQ*IZTmhm`|yv;5NP$J9qF~07PqTVIB#G2zrJg~^;@i(tEc(HwR-N#as)PS-Em(_ zOZyLkVVv`Q4ve-AvZv1_y6o^Lf6MZO53}i{H?e4KpsCY(Vf}i){U^8?uXh%Ml{KrL z>vBOLPjJq&zxFR|>aP14AR%ytZ(1=QdvsZes=mcj8I|BAPE{+`HNQRHl*iWuU*oVx zRVpdFWFD_BSNoFB=f8J_@2>2;y5_R-pptsac>)B%$mPFo$DjEH`>BUOn$=THw*ckW z!COtC)oY3;8krGQB=o#tR{mfiV96bKc~riv2WB>;cHU{Bvqvn!;d=6Wuk_G?Dq2!6 zQUL@C2yn;W_9K?rxCMkov9#D)aJk>h=4D!{%yLOYVYxb&xJ&C#p*l5s|(zDLP z@BGL9cQ}AP!`fD`aAc0UY(_=*t~kS>t5u&n+J2xyf3=10JptR$r^q*@XS!c` zx?BXnW~Qen(@ia3hAVg&Ex`kG9jd%-XapLp`Sh#S3K1Co(63?-j)nkkz(EUN|J2Ug z?f8fPzU}<{f5Im{$<_eBb7>Fi>54)?V>>s#BJ_j=i+=s9*7SuhF;ohOQl6Bcn{cO; zxqR2nY|6=NG^>cu2>FURZyW<9ha{Z~9^t@7#d(<9DwJR9KD{6F(W?AdVQKU(T*C{Q zd~v*32#(V(9=rcM;$7gN2Q)~A`rv+paY8zth%l%{m=n8w0NrriBCDQK1AAB10DZv|yzoS#GF84lelBhXQ_^D5Z?Gyhn z=saw_yY6qLe=ZvVPybineY<}j;Hom^kau0meQxTRm z1hX@i+W&Stfp^&UZ~igi2<1mkm+C~I(($iNJ|T=|s*Z(bIM z9;M7)R%SVfmsE$V$0HK%Cj`tD;MEG@uH}{bijWL~6wz2R1%;Y)%=@KK zHr`pds*OzU)gI9haHvfl)DV#p2jK2G0>DGP#pQ9|)f|39XjDnLAFiC9D38ldTf!V@ znNEAZN@e|ih#p_Il$uFRPp4AfNT<`^sm5Gbpb)jsG3d8G`bQRd?P*j(MB6DR2m#dG zrtbT&ow@fzsF7e1HF))O%|JktSZ4&6rY=9+6!z$ZzVfVK5zEFIR|2S(@X8U50K{Aq zKf;zzHUdS-%e26jmPS{%>Mzyl&|H}9@Xce?l}Gn^4Z-dUQ=vdGt>-G@mRDE);veOA z1WTC5dprc85z0>~uRhmowXMwCXnEK31$FAT%DamO=yy3snJ96?1BiR3@8olLsE^lr zWxR*34fEeQzho(k-;c{m0MwY#;Q`rQe>R`Xohh#bz8VP-B=s+3rfkpWf5&2{@#Rqb zI_|rKow(xIjXm^pHgwAap6|c{sQG$ZJ#$SVuxKFWW1NQ14IvSPMAWhO5UW0i4^FUH zB#z+(p~i^aK~=it%^|*&%Fn$)U#QPzGOxpNcOR|Nq8^1NI1YVDrxo}TGhrI9ov zv>`?dl8^*QfEI+<41(BJaEx(m$Jk7_r7S|Gn@3|GU2X z22Ez>h}rr#zher=56M?|q*_=t*e)94$no*_{Gyq`Mv~k#zW*(&1U=G^A7=`mi1u>p z!V^WJLby4~7U`vwC33A^q;XK)gz`t+=F8{EAGHg;K92o!JZBJ}pk@;)a{(j^M-Vyf znUshk&rj3T2uLL2*$WUDyk~4CL8ML-LnA;MaPa_LLPVzHFv9{cC^+=Mks49iPQ$1m z?0NxWXavSxI6|hR7i9;<5qtBUjpZ-ml6|4yGh$s;pJR+Qd-&lW^IrQWI-prkK ziOElni4jy6*z_}* zN%qJ1q&Gk{sf7q;h=0UUi3x9<7#4+K=B_mb`g$Tz|FW__1`+n-HjfQiKW&Uw5VB`<}@=0Utxd2Iz zK;Q|;AM!Qkx1*11mq219LqywggMfP%fl0!a5b@~+vRD}9x(!xyOmLUsJ8c$$JRNx9 z`8%*q_-E3YVo6r?!%LmRXP9#yy2A{7<8SncUcONzPY=%xZyMD$!YbVUAI;SH*J8Y2 zX9`!8*GhSO4dS85u~RA4ASF!Xm2%Gn%<^KdcVh_ae_Y;?Gg|?`=Z8%JJSb9@0Az`W zdQ2GmBaB!E6~#^sfjIhas%&g$i&*?RY1o1yQ133Y;s;g>kMWJ`g;i6b?9r|iH7f6W}b`0c2v zKt5u)viwr4W!C`ZG)AHi&zk?3=C7km7jhi1Ncq_nz{eNxrICP>Ja|cft8E;;yPs+T zo-awdE&}u7Px6B}%lbSs!y-Uv#_+96>?C2jogfgnL~&zNqT;AmWF#IpIbdTgs@#yD z-Q%FJnm@1VlbcmmZNnY5O_#!``D#sfaJ+LRQd1okW4&BhuYMAfm*q~k0Wjl74?ka- zpZ!xDH;iu73LTW3uL(Azx;gWoK5K>^_=>a~h99D1eem(kPMQ#t1V=GbICj;00AI$E zK?Ug@p5_YKNYT2~fURQD5VVn0kqBQLsbdl#>>I=*fD%i~j%P*j#SAWw2X0Y*^b|-& z`weX7w5d~Lz!Vw+BJ-zS@#**g+K(MTQ3f-CXlmGa+rE9WPszS(gmfX}C@B%4iHr38 zkuKQCQ5@}pIEyI58VFq+ZIk00ZJ6?DYX&I+-HJ_788m=d<`KC60XJwlVB35yv-+=J6o{ zEEkNu^QXwB ze+3OV6+b56Qq)nVCS((CI9n9&AB86kss!zS~}aH4(z0KnsxT z1xSnz1K?G9xYGtmK!AC1dAMlpA;ifF(Skzb;FY)~El$u_mzLbsF8bt`<$qZW06453 zcyaINFckPg)WoMGS)7&p@Oas+44~+n?)hsoj6KA1$RNI!DUL<}AN1n~=8nJZ$IZca z{VNuNR=88gCITr+TyI z!C4f76O2Fb6R#06USsXe(n4>=l50yx5DEAfKo5p-bn!62@&-8D^U(B@yL#1fa)efZ zJvKUa@XxVf;G5{A`SrRyQm7`rtIE&gZoca?X86wk3-f}-WE?UmuMkoYD^&Q%Ouy;f z=HUDPjhWf9U5r2$2hE9d4{3Qhr_dd10F_D6g^=>YgY^MS_Hn;9$NY$ws-^%#`Lj3? zB#)C}_~~VSSg@1wYwMU?{Vc^0I3obckfR32{m4+?lZDDyZiq%nfU2?;Cl|tr(=r!S z-V;uV2UgK{U_Qi5CIdCCjgC@v21Yv^7tRu>kALLnqN_I@Swvy4h?8l@#WFam~~h)%#Xh)pT9L2dy3;*MR>h%{*vp> zkq`em4x_&w^Urvr8*iQHf%J=>#EMvXZ6Z;OTIHHwZEbL}PsZfdz7vFD{HXLfd`dXL zyo~PRYOQ~#^6m9$m8dmZi~w4ZW)|O_&Q500^;d=UT3wQl2k(L|EvmHMagy>NSG_o8 z(`?-!L37sv1J2q8iB$^piZ8Zlt+j*HR$9J-6S);UA?hb+k6%agNxAN55${{@ov#@}4KK=X5~3pM*k-W3b>{JL>`% zf!{Er7!pil$&jA{<|m7i{1e|Yxp)nMYaNLc@^i|zg?AMo-+z}luXD#Yec*z*Nhm)K zhUC6(ZsCLm`TF21Ih9KX2Fy?M^wXsmfM^{4cMN`v`*94Ar!W>p5$)s;@ny@PaO0>Z zlYutczgc{ZVu|km(l75bru7>E$hO6(C^VVz7>b7iUR<2+8LT)?so-jPutNgJkyMc8 z;bX^G%kaGH#(=yYIdI?~=I3Vq3?CpkM4?#eAG@4HsQsBetc%u6wo8U zD~IxqDFo0=P2g;@Av5ug+s&a5|C%{^<$GlJQ5IuTe&A39Y{guxl>1j3o+@yby(x_5 z8U;HCkzLDB(1eT z3qIl$*G9!RWX4il771;K0X9C@0Ul9fX?9~tLfAP~?CBVxBI1A_`9G?P&EySMU zzC%x&O<(3`^JXfAN@Jl;l$Pn+ZhbW9f3&)JR_41UQRde_h6oH87H4pX1u(xE)f zlday9D90-tHG}%3^7HE+6IZ<3ER1Yvd?OLE9b$n-sw0jIDyOyj2IE|0TO?i zCQjGFBySG)tp2bpJd3w^M>E+hUNA;pcDNC;>yIp=AdJF18iq`RHbxz%1Slpp2qa-P z2@55gYTH;DN+=0nzae8->SFMV3^7u77J$n z`m0QH-7uDdA-0%gjPkj9SnR8rpge?`ogtISk(AXQU`0^+`V3B+oNWe&#~Z=H{q@{| zLyg?T6wEw!AyaKBE5KkEUv>$CIT0UbOiDskzYyetzW8A*w`8nF z)KL@5fd#AhCk9iTx0`B9^x75Q1Y|c|@%LA9cq%WV;CYgVJ*nk4AM0^)r3R4QBSjH<@sF z1A0<;mp4A$)z%5|Fq{hJDwuSg#jZ@uxlm?1=>W1}1IwE2>>^V;=PWb(i@$23LA+Ni zvJc1%j;GFKlhY&glnzS*1UdGm0P)wv2I0zlGkfH4E%(%umE0pc=kt&6tOip!o&>7h z#ugAn!sBpoSt2ixO5fC5?UnNYIOGHn zuJ|p@^1d<>DUTR(K#}9K!ED)F z5m?A}W?Y(Ib{oei=C`C1K;f(ddrM+>0zlvPmFF6@`Ye7==JPqY!WF3alQ&fC#^agf zF$OIke8#NWyW7-3wtnWh`b{d1`?T4Cg1*(W^UUX_5EJcf)b|*nn)v&IQp&8fUmx8#4Ox&gYNp& zr9A~8asMwNNaV#oVFm>Ag=}>8wo>D=H|9V73tU9%iCT-xx$!T$e)^O5^Ia z7tPLxzi6Jg2i@DH-N`G~(s`^1V!kqaBpPl0!CJi8v1(xOmr>J{u9I`L?*TTW-~|*; z5T5z@|7K=zKKbEWK5C*Z=i`MUOi*#hASa1W$S>l(k|Kkb|T$YL9|hYn7U4YO042gv)KCj>v@VtC?47;Stzh0$T;WX zIHl^M7u}g0>ofdoMhdl${LDym^~8Jq(EMxO~6g^PcWA0d&L?6mZMUwj2%Bd_PeMC8iAjOX)Q~YEVGb{ zz#+7(zyM>^)!+NN>BpBzM{(ZR%r);d;Sjd4&ck@J>q-IVy$SKe#8Y+4#byD=5zV~i zHdB23F0*0R{U(2Oujl~3X-&C`KYJtc!dzaVjtvIOhhLV5EK&^7m2VaX%*-V>o6*Z} zFd@!gt8-%yjUv1HGS0VUqT+K^1wEzw4<9kvdcRp1z9cCuC7TAt>WykWk}0pw0+5s^ z)SjrvbQA>Vahgm86`jX}!?-_ARu8fgk6hK;27!E7U^pf_5UB%DD-^TM_kL)&GC3Xg z|JA1_FU7U6gT=80g zNEyaBaiHlcJBeJ5?-gwfSdh8t*<+b7_#KSFrg0AWzs}|IgPkj9ImK33zPZLRZyv4R z<}d$GGxhx)W(tZvcM;AP=v#vcLrio@mlu`J-T}tO#927=Lj2A*m1{m|^80q1f#;tv z#eGki(&SN-$FPFSWn7ZduU&E&f(Iv0e(A@*{8IFa0Uog4DI0m9)LE2^NBcGkeWtPs zio9W)scgH%%xuHwobkbiCMQg}YBGx+k{AKxLlNe7Uo5xsM33CzJ!S~YtpmI6Hlx4v z?-nt_Spamt60L9$(gcE-{v%fPgLCFOG04d^_70dKHhzWSY?#gA@bJtgM?&seohlA< zvvpI)3IHemL_+})Aop?^W59f%Cy*~?5h z6m6q@lOT)cIcj1{)0_-%0M4Q?c~MV;(fG+eg|5nMvlkkmqVyQq;ut{-v<&x(HvlZl z?CjJrJfc5rHk;#pt5*GoLb0^rWL_(X>qjaQs|I+pFcUV+;Pc-z1Bae5lV@LIrnqwO z`nO=4FVL)>9F>Z{k|(2|X&deNIrc6!_t4(&0;{Xa1IBhQ&tm^UbM z7aZPKXutr3+yH|fh4vPxjNl@ESc@KI%;NGr6hmN%P(cLQ(o2t~Y4RbC;LYUGwO@<# z*f*HUx^qnPj0;Q!OQDT*XP5{>8yYRyKS9N3{YaM|{N@qQv)Y1!$wKi5(2E*=@*bTi zG8OSxZo?oiJ@s0iAMVDfuNIzwsIjT!&Wn^e@)4K-p zk3GJSnW>3FJ23yAAiG$`I6_v*RZACx0+RKi(7ak)pM)dZekYnm?ghLZy;JyAVF1YZ z%*@m@J_7%j_#Ifas`+1vW{{EeX9_pHJY5e)#K}!&!jN&xGYwimMZlzIh!Z+%>o%Js z8@6EC^IQ{dI9oo+6t39-ql94$m7I=7jy)bxd~iaA#C(V;@O(CekM1`EkKAF_Kk;pB z@jZ%Uq_c-E?_rQ3&k#QdjZ_?A7+k2`A5;@ax($Wkal^v zJ7TRXJpXL1_}u;)UJuqpnXM;vQ;+W7RcUJVc3o@rc=NC z%Kn8nTsTvD@CiIC7pNaBv?i?Q8;mcxD$y4tv62T6c;CU@Wgau zPY0kAM7?SZ0Lw5xH#?6Zz?bU_)q_Jr!~eb1-~YB1mb*)p;E77VjtAF=ru@T4&Ff$Y z>f0_ihp_XlejdiVL+fP|k@O1K8{ngKA1%NmCqEGm!>^qS<>J>+F^s6-7~I1=3G*0+ z2rvpmP^7+z12Xgo=CDN;C*#Nj8kLxibSOTt2*omnL<aN9F+!4ea%{o z%{QCr^=F!Sd}}RQx5-39>yU7)}o^-^KJ}QBGAh;o_iv1FMpG9lG z!>oPs+a^147<+H1^ytkv4Ck?7-l!L11K`(MVVGrt&H!HGcxPGVu2}K_qOgJLAIBSc z6Bs^WpSGWYUl+u&4hESjDoSXV>X4rT<7lbebS=vL<6Se^iHXMi$9`^obRLZWz}wx> zPyi!PDn9sFRX+;a4j^H{(?JU6QxI~Gj;Sc&V!A#V7Tz-)aT2loqQ(iW9+VLo=qHU@ zQ3pw=hxok>wY=2Mh{o3Ef>Ncj=jj%r;CKR?fWG zj9&Z}C^yE*8_qFi5W@qGler|uR#aM2JVl&fWU6dQ;YSNE8)vY*XwcnWfZ~p!b(VE> zPCVkJCBygRapw5|j6nfCgj@xiXlirljZi`HE+e-z(_ttfhoeCG_`NN@iC6C%F!R`< zSHOj%dO6uH-cB06J0J(YOChNgzSJ)@{QyzNK5 zVuI6TMeBA2*Z4A+^sizNXFFI@92t};J@|Mv9Qn%e$}ep#nQ|Wr9a~v?$)ah#{tcz( zU@@DS!JGoKU+i40z;nPMri7s;9=dEnwz~`YS}~UE6aiWfk3(Kewqp#z;|C>Gl@LgL z9Z{E#eAO8M775>iiSQ1=)6rP;>&<%O2Lppczmm=6HZ8kqm#QC14=3}=Pzo%EmG?bi zw(i@77WND?iHX4Zt=mm)+jcp(oS(mumWs<}Y*~5dqsAL_rh*?GpB}ffQXz9#O5}3l zS{Mc>b_2?Xtv3qCp$75AsNfExA&z3eNjOd_Qdvod%?}+>1ZC;Uj;pB=J-7x zwp)$|VS%_}1cWhy%;AWyF)%cTm0&3ddPYdZS3f#Up1Hg=OB*6(Vz`_Tu0NNe0TerCo4i0C{^e8G{cxwk@SQ7BjUW`ndQFE|A+gv>yn1MCf zaIl0fN055QpKwZurz1`9BEqx?HREa5vS$p#DK)bFFAFE zIAOx8(g3&;;pE|?IFI~~@%#S3;NWi+N~J4Z+9|z@AwcVk;XuCk@(5Y`Vphf#!Cwh zDH9+o4CIG1^Fqghi?N`eF#M4o?)1iY#Bof|r92uDZi~iPzHdJ^Nj>|x3HI+c{rDhb zer^V~2P+wz_~Yg$lA>e2-JG9f;VlP51PP5)!+5QcmD=_zP!Vu4nIS&8MA$vp zSU;349D)I8C7A$092$ivTfg|?LgT8dOX2n_iqXb1bEe#nO($4=VEvMx5E4_X^4)}} zao|8B^UPz7+#?Uw@{d2+!0MK(mV|D1Us7^glJ20rr@X2S0E^kE*D4cZN56t|2cKIt zH1u2L{=Oeat)li{BFD-{s~NK9q8gU|j>z(#!Iop3hKGs3&Dc42shND;6{ddn>rDnj zg@^}aa?FkHz04gr#TA9J&-FygwVa~FbRc|e+3~8h!7zbidN~gP{F>n@XXIUCy&X+Rn52D*k^{-9*Xq5FQ5^TPXgTeFSC% zOK$`Ch8FD=XW+Tpj(1sI;3MbHV_TwlvC+Pq#o9r5(BrBCUUuS7_Nij7B7<)!L{R(^ zTKctncVS4g+vG;~AqTXveXH?0HIyFTYFGVng^}D&`a)`WnOA6wZX+zEgDycW(7}(Y z_;T)H7=fzn*+PKF{IZBtXsVB3K&hceUZq$<9XKQ&qj6Wq5G{}kGsx#wo8x*TVl7!m zo^X6Nfqr&SiP$TdhVob6e08aQ`%e!=Z@2<$p``9TlsF$7XG;;&Vf31HL0HW55yjAP zdM_T30HSc(3ch@DKPm>m)k9_U@S#7fROTKW9$xqHVxe?3Y8m}sS&VWpFX0_e6l?#@ z!4XQCOuiMNbZ6l6M_l&fmow$PgLPZX@pWgKXyhytVNU@k@z`UC(Dja>ys{yd<9sep zu;~(6vJW?IF(7$tBe}r`%ar{7mcgn+21jv)SZ!D}cEAi^^`VHj91D}Hjt`QbEn+FY}vZK)C zkKpQJJ1aq-U#Gb2HaK`O766jE0~rSo)53EgWYvdC?#Rb9Toe%S5lcTWlH%y3dgb;) z?V~?8WX|8tnN!xI;}HN7(|U>HEEoy3Iz}WkB+UgE!6KD>vv1_5`F@8hgqFPgs2Kn$ z@XX}YcN^8(PYkVD`zz(X{@Zdv{yb|4maLFd0zir5kKZ@I#vz_h$aVJ&<_8L6FPP%N zXEAiZN*B88@(MC$_W2re1Iu|0?6|99R=&Y;IG6Zv44Uj2aExJtPo~aw|Eeis>uv#u zb>w&kAASLhK(@|ZiTHpfd(vDv0G%2POeVk*C7tj_E%1d#lTPK8c8Yy_za2%EIMgS^ z`QX{9Y$llHL^Gh6mjhh&>X})04BHV3mHd|=p>oSktqLSjiBKhSc4a9 zeC`xqu61x;U9c1x1ET~gjiFMu_GABSAXa|0%pM|gCwp|#@+&vWuWw}(WQEr*6(E@| zo8*tA0bniQ{ep?gp##4=w0iB`ST_6@#Zu{JoI7v^TAjnslUgqbc+yo9FlHQgj zf#V1l-g;dryz;HwO91D!{0x$RW?P5hs8*2)Mi`t>&F687c>z3uj|A zxJ8ID^t-og5ThEewn5555U)744!kJhW19?z_wr;xFsUf1XhmnoqP}4y*Sz3jyVQ|@ zxhyghN9x&Q6R5yM$-^RsaMxUqqo>NqA&D2NRQ}3*n7QX0^VugKsp3SUW`OTjHv7w& z=Fr+8v+=B4^ZX0)(d*ujH|saaZYnQVuUsdV0uQjGmo-beUbS?D^CN%M4S*}_#KidM z=Wt5#eQVcmdjG0{fuGFh^Or$dbV&wwvmX*A;uUI_?iv8{I+UHNK& zbGRt^m=uJJvQHwyuA4BWAAm%t93r5i_yZJ5DtaRQ1NvF?PQ~Y#pO9in2<;W!D!&kt z)%%92-Sp0Z=$viX1Mb7o4@Jg*@Z2*C!Q4DqR0!M}Bf~+s?R?!4)q)3vMkC68=`+*$ z&whF~!23x#@S`JjpBrSV(h2ey=*i2H#kp&tiD!$S zB=tm$K(7@8AQghz+dn>f_nJE1cuCZY_fI*QO0Yt}ha#Ue7;Wol5F-HePra4%gg=XYmeK_IIid=!w7IFoEQN{L$hH7xWgVx00>f$B?58M8&HBsP(_lUf1wiEpLPWJ{HU~4 zEwF?u_Bdqfn@4ihn{OGYzv~05&DwQXE44<((XwcnXP>I(ckNo>F@z-Zf$z-TV~n>K zfTpb6&)1EKp^o{B`|arC$_#+GUtA5CZCq5c9IRjiEE8du`|){LgB*$|sR?06H@UZ` zwTD?=nFApyQnOu=gu)WO*Ho9Fy)LSA^H1)d+wb`8aabv#ux(iFqi?)}eGtVyRf`6Me zAW;^mS_$*t`POW1^cc1Wa`%v`FI$NWzDbwCa)HEXbi&Ho^+Dsh8%o*Fe||owC5^Mz zfurKUkq-PW_RRt@gE*&-WoLz|OOn}N;g6=dSNEDW0IrfIMn`wSziW8S$QKKx;*F(J z@s?~hcR9KVXTunzb>u1vcj^h0{y28_K2xvP?x`)*?ijoLvIAy#nTH=Bg>ta)k$<_qc01-E?OtK5 zxgs9TcASmH#|`u)OI$>ckRASmd%rzXyz5(Y8QB9$05_;Whh+YE7%gC_z~C(` z-!cC@jvo5(#|CRKJ;kqlY2M6XBGj_$gLd1{zacWo}8zX*n46`nQb@L!t_Nc#-5ftd)l7$kvcTfmG_FIeqWS+0p z;)HT++QN=tfO57_1z&mto*@7;;;2C65YEQLVb7xg_8P<4uqz_@~1yN znSXviUgLt95{C^2p3BZPqTrDSD~(I9>66zh)to5=sW4o^kmJVpt*UOnvKZWZXEk^C zw<@{ayP8?u)74H2^2Bwffx5^uzq&37@%UWMo?|U%0GL zC~U{@;CvW^b6^bC}BQ?s+vd%-R?Aa`*j>57ayy>!e2G~*k5{FCOMDKG+z;zoJyAd=++!YjTr z1XM<$AvArjMs&G4Cj4ZXys#0oGmYTxZ_bqd{_m#qdk=Hy94jdy$TV-<-GEJsrm$m2 zrFqTUD$!+c;(l{iINZq|Bgi9IU%xru{NPXL!)tFSHShjhFkLNR_%bN&7q6Qz|USlQU<0j?NS4})TeCUz3^JK>pm1lyFl<3j0p8?Moi2kQ za^>X<<;I(cjY-`1gNGM!GRNL#qrMkAcV9rOzo%NMOyEp5oL^+-+Y7y-Fo*y6gHcS{ zNWT9|<)G}cCqTlsdyJPTBrF>U2t~UA2jc+k>?YcXXC`qvbXL?$B6L!)UXL=fShXKJ zTn~P*s}el=NHzb&&V}4e9nA3ASVfmCV&w->kmeYk{E?q#))epgZZ%Wrn_BqD#|EQw z&a-DHX)(yFIH9BKNO_DDbLVd_X3xaC!CSV@N1y#a6*E4`EmDd0vJ#j_XV+6afzmmE z&K3Al#zJoz$EPNb<1|3?EPfAQ(y)ZnOb1{P*5`Bi&Aj6!l(Qg?+pu2@Lx$X0=rx=X zWbqy$`@No185ZgBVtepXf-M-a*=(UZk9Q85$H3oy9L2E@AbSwKx4BS1Qft(YU?T5u zt+p_+0IdfK4-jMD@)SEX?NlJJLnFYuW&kC#Jpqb6QZyb)fI2{LK+8izz=CmTAhyC{ z3ys9jt$AVYzPo3#JX98&0J!@gTgUk$)6@9E_*gS@e7up{f3T4m9cu=YGa*jtASY0K z*_orZMd*nV{@Qg<-D-^83qYpfv>arPaL_cYSHLL2Al!LpC7PcJYq#A#5M6e4Sq^9* z)8rhm#OL$iBpntOu}=!`3iPeYWiqQl+}zas>@2>LfzA5*k`n2>G){D$5(~Ly&!6Ip6+Q8xV31_S z;KEiH(W>Sm;9?Y{JFiOTdItbc6hN>^!E?=eRQlTgn=U^76pfmYC3$>y9E~ok3yL42 zZ^7)bDMvFS92g)y{-`_x78OXF}hl zH-pCsg$EeB+N=V(11G@XD0lM*${D?&GnY$+(kg64$Q82C+#JRfS)5;kR*lV8yAV)m z(4!BV4fO4C#py})+QI@xDV4cut=3@c&YzPJKfjmQ-@+=p@MtihRDAzmm-VS(GW!Qe zwynJ3U*-rH;-3~+xR>66K;W%|7UH5BEhWUE3Gz}lj~rD{_PC+&F-g&OO9iN6qqLTY z(5n2>i=p8nJbths7L#ur0v7v$a|g$o=2L$$TYu=Gh3Fl(l*2c_qc1bE5yu9KQp%DM ztv8jDclJHF22#G|wsN%R>BhoW|Di_1BxON*;-p|Uza*AEF<4#{Y4az*EL2OKcz|8J zsR8IxF{ddSvqJ_whRPIvrzy*qG8;-?tK9O9W{SN;t7gh<-{Ls}?G2ECRXVH2h!Ndv zlWZ5{9Y2hIGI-^>O#u=TjxB&HgAU&sAx4r*A*XWyBrB0L1B%25MZ}daIUv)VDLt{f zp56Uaqjv8^|usj_k5?GnV#kJkQyVQ z4ztK?5|?Bx+$0I~(a6f(Mz`VG*zUK~0CcaLG-V|b57Do z<=CBfL{N||qBmDySx7XQAb{-R5*h^X;DDwfn}yQ@EF0WSGRch;M`A8VN1J8PNu-rk=%?_#`Rj82fW{5l-q@POK0Ja2nGw{>f_ zv1?a|mkEV8$Ahw?8OpVdcbW*x0Z_y`O5sRE2w9|FZZt}%OKadIsR1fA8)Zr*1x>oq zDy6d1m)5{e80yG6=7Nd|5vP>%CvuGeyy(dZL|kdB7Px#60tv6XPjV#GN%@&4c%ow4 z=33S+hyohcZV5~DJ1}M?Y~m8&ouACt{&AuCiQk(EcixAuknk-i9RhGpl&~}c0Zu0k zHl2aFPDFHcT@n~gBI*Q43#cr+gkJBd0qC`+Qn+Q+040+OLWdr8EV7(QmjN*(56SwC z5CF(~ga{K*ft`{9-qI0b?jjl3fTR;1bbucJ*hlx_V#QBdO+eU|AAq9NpktLEGcA@C z<`a7X4_m}2(9=a77uKdeOSE0P>dh~IZay=0yonhO+4V>yM;a?fnf%~d9FC5?NJ@hKFK~g;~ax>*a@$DTxtNi*G-yo5;ed{KZvvZNX8lg=`N%BhtxuDA+fyb z1RVGxY{NT*&i?0y1GT=z>9ACV+2OMQ|rCoGxlG!#4v zgwW8ge<*JrpnpKihJS*R2pzM;73IaB5YJ`mKX{@ZjvvNO0>C0tCj^m&!_8w_kZXa~ zk%rQ7F>QC7=)<7EGTG?(aQ8OMuEEp*bgh~+;bdxnn#kEc=_*@2QTD72=ec|9qzyr%7C+XL8C1teF@+~gR>l$P6#fiwo=%hYk=KkuENt8U}=uK z<7GvjI>Vj;l|YE`qX8oQTsuUh*a%$EHnTw%CpS;*HMac ztrWu}$;^(*&z7GCV8gl~`q^J!9o@XA5#E1SCG+4t3*n)o+=Yb=N3yZbrgP*SWhy@vm5lHgHtJD*>S)s-73Z!fVtnmbR@g+L?4YDf>4W5im$yBiy&-sszNiO+OaJ80Nb`MzPuD%u)UbM^}~(K^Uu_xy-(Mp zJ$sws)EGJnINLpw&*V0535s|xp#0_=%K^?1aLO+RfSH19^XS2_{^B021~@C%qTC+m z&TEZ?FfAm&5uJ7jgf>F54?^O5yQBu7w|YvUma2iI5wp!VBom6HMu2;Q*c)J!C=*r8 z>7<)f)2=Lb+sHdKSU%*YWl=%kqRs5g0Rix1uL3ujU~B6A#pyM~>pnL9tklH-gc%-)%+cP54$ga8BcuAlT@hZ>a(3xvEmYC2K&G zEm1-$juTcHFIyvkPCu=KZD&10AQ{*(E&Bg#8=-Du2mtJqq5~VSCd`Ycgn4$t=1r@U zXrRS*t$xBG6I_>Hfr!r^NwSAPWsyle3=ODs+~I(Yo0&|ZoXO(D4a`R3;S;4q8J%(p z3n0dO?Z69-xqtd*ErT;j66gHxo}?h_*g)7+k`X6#;p3fYa zfE`;Z76mjw^T&Ug7=*m4@FEQ!{I~T8?9f0a0!YJ({vuXM1&%i~xsn^a4%*$RkCpTYM7aW**kvet;NIY_pGph~X_Zw&wv$q->sZZZ{x zb2H)eKYp%KeQakV8*-NbLHM_XBQMqrC_ODB{m%J*7q`?sH2_Q1P@2B78i2AvaqyF& zyHf*n_wA`b)(}uFD7e%mxg$&i!6;pC7e8Z!mS_qA7den2gtqshbez4XLW;8-xS-yd zB{~?Y2=7HgoP(s9^f}7Mw^pg`|HZo zm;Y`7`v%%e;lk~A)`;URzH6#@OKyUSwLM^if*rs7Y5Q;&S5FJ5` zh^a_EdjnJ&og1LS!4ME|u_0j2BJbK93#7-5s4MlDIksq3to$*wpWLGOqI9H0<0I`c zbe55%fzzN&Ghmd-+!bw{f#eH z=XQL%p2gRlnZgV6lKcdk9JIL(-GAmuvUK#bR$W;;P!PCom(&1stC=+ZRMY@v6Anr% z5{vd#`a6|#mnAQ z3|{y8e15~0T+rX2je9`qpmQpv@Mw1#ghdgNAd-(kgB|~4m;extfSvNG4kCS$A0$l#-e)co z;X46N6Kq0@O1U^8rYUl@>^S9-V|{I0TSgT?3=q6pNh~^%Y;7i#2&~0-70sAlTxtM% zsihQV=^CKm$0K2t(-=vWOy!lzrBbXjc$8dV%02*iAjYD8ZhI>=4Dhxk7V}~0D5A?l z#2+b6n-qwtnw$D0NH3hW_JrpznSA8x0Mm&nSK1t*Vkt=$a$$$YWrP!msQdy0Eu@c> z!MT76DSJVL)Il3(4lcP%>klZW{z{Qlg_6sf`LN|DqD~!3a!;4k0Q6K%DbR9jfWi$$ z!ZI2z>`5oms-)O3iXhWEh>mGU8arSBia%9M#U=@vT$j63P^TU3N&z72n41S+AtiPqr8!nvcqMTjMSNKB@pGhJ-|7C=afs<+sXDnsf@UG+J}^ zSoB(dW(kJWfFM6dgLh;ub0~~dI7wzwPcAh8JylZ*v}6sm%bh5Oc1fi>EP^X-JrrA8 zLlIvRwwjN4$S?s#oS~f}^8^rMU_n)D8Gs{X(tVG?Buy^bnGmm^>blBQ8tXt;LsU>z zQz7rtRl{^RqX|+*Rc8RjHGtB^eoIPdAkrEOFINvQ&WLmsMCU>*aph0B^Ye3f*gpv# zTWGtauJ_acbgh~+;S|(BtO%;ypa|iH6DehPUh~i})JDQq!~sJvMiEXy6WwqzzRb7S z1|{954{brAEjb`BO_RH3rWBNo*l5{&PpJHUE?Pz{0OKXi()ZzP0hy=Q`db!k>+j&* z9jVr8kzgy+7ITSPY5bYV&ul^Py$%G^&^0%XplK~BQ8rPFGuy`N@ z%0iqpH5lhW4_%VE&{jCtZDFFP_$}~Ua$q{^eI+in2rH?z6lZY_P`aIq{jdt?qe_FG zjNPH>w&SY$&pv{Sh?NZ@uT)euce%%GS&g<~&B4cUfN_^4)?o53 zkoF$qqKxpzh*}O81P0;pXW`?77~c{_ML_LY8@Bj}7g{c8^A&JjNI+%Jg&#K?BTAtdo*^KnS_7vnjIrXc>JpP>ii*AZPWmd` zAYbK5$l1&+1FFVIP)=-yu522#_?89$fg9slj23*4mMTA>{Wl%~Ok%MGjo}e5eiy;J z^Sg|ex~B$UsTxYtS5^aD>BskiMfxeIZX$qvR_cR_s>myXsxGc!2ZR&kuEs#PA{hs{ zOg1$~i)5A7hGL4~$1&#a0Ev?cz6|BJcyZB)p3q`mnn_Z4rZdj#i4chnh?X}sfh3d= z6Of)RsR8Jzno^+U*MQSzr(6_#$Skh#@rqC^!y>zj3<1EP-=Y@YMPR{?s*5n@ye^56 zE{^^V@s2$vTNgvwG}$HId&U~1f@l`-Ap1_ zQZ&^TkG3$Yu`%BgbaX7NSfLn#dKRl5Vm-gZi(y+^eFCE#Hb(#pyp&!eEq)tIF*V}j zt!AkpFIPmfOMqWY&qr~7j{jv20C&yd1o=25@17a}uQF2asjUHDAla59Y$d$i5Kw6- z>;w^Kl|~R;oTm5QWPyyBd%hfJGIWMx2rw(2=YaV2*An#$2+J#J(8rC4miw$3hUtt8hK@>L3w6Csj2$IFJZw} z+U|;YON-MXqWzfkOZp#z$700Yin!+_B)ZX+3~i#zYsq_R0G6zx6kz2wKtbnET7UYT z7M;)#Fh9Sw?P3fF2I?_Q35(t^&qR9&WcA`hAG_}J#<*_;D8iy^M;-F{i80*doRlgt z1lGEdH;`v}^Sy9QHZ(6wsPgk{$Ng_L^mf8CojX3 z8h~X~RtkE88fcgI*02@gRzm;~C&_KS1LotB;O$}z95-rJTJ*#Pd@fuZ(HuX_#gBI+ z_3o6OA&(Le1ji~pmEWTwfL>TgC1GjY?b<)`CbT6jFxrW6nfY`(@<~e~L`aBOe8;*U zzx4QER6^=r&KeNmb%O6C+J;*V0l4(irMc&1xQk=5qXWNdACs~HkcuGi>W^_fyae9) z2;*xK!V`Y^!-eB<9{(cJl!-Q&5{X#%frX@{fa{4WYJwB z@6PWCFLh6Q087<4RVs?2@FVydHi@}`7 z-kI*V@{DfBK@@q?Bu%siAkNPsd0|4g>7rA976vWdNs8R$Zw zB|0?#E!B|*PGt>1Ftzg@w^bseszsU+W!4j6D!(NAFhtUS2i%fMLQslcTsvNS*rO3= zNb1UyySL>fMB3uobP>v*O!)Pp{4M42XuEjKidb%#yW11svEQ>dH2^(VRSMX94LFTw z3x#7cIqAhu0jVf^0xg@lTi~%Ekr1p^TWiiEn5*Os-=M752MQip+hVAi- z!{E!k>;v_6296X2wzb>OXs6`#`^C2L(rHQx3xZNvB(}JogvJRksR1})^`wc*tARxR zA*b?k3tA^w14=DV&(x4d(;+yCwqcQSfJsm;))-h++7gG#sKienh&g%!k2vT_5@*9q zb8v`KFRxx+B-iEyu0y=Xgkp#lv}^v-?I&HEq2RYGKT_55Is7>1R->RiF3N9lM2z3v zlNx~Tb(5y7qz0^nvt4Qi=&JJLTTnp!AjR-gb7MV-Ga!iTAuv)DMD^Ce*eII@$}T4W z$7#NTAzkAm^S%oQzGsZL7k~*!PZ)`TB|9Z8W~P0Pz_Fuu&~dPiF(zo70~Pf}6mz4W zoI40IqRb$T4nd{~Se&=i4Z#vbp&*b*Bwf^ktq29=(7^cwbID6;43?~-6kypk0I7_w zxgi%0kHkmuI_8BReCAkmGQstGmJDU7>QiTNW#E)HIC47>Bn8Q}~L zX4R3r8Thp8erelIZEepT!Og-R%gOg0bhAZgpgEVC+N(AKgK(wK)<8tE3#8wB#U!6 zK0Ffy&JnPX4pxHpB5__B+v&I@7w?pxVLEqr{5v=l2ptKu1<0KfH14Eq)|A#rN^r>l-*Unc0F|5CEIo>)$Y!#2e9!p#=Ft})0qE>f;7m^qKrgkF!Yow- zl+OYD`tVC-YN^_K>C)Lr;5$Jx`1RZicN(M z&e&e3Q1K8YAteDLK@`ffQp=+c6(W>E)3l`)N`I7=2B}S<38YeElqfhL9z`g#nP>`$`=}QT5$joxSLLiT^wQ^XTufs}Dbp zz80jr23(3-_$B{$9<}%TODU>-((dc``V-e{hLel{)6rohn@l5Zii)kurh%~qdLbPS z+Nsv?>6Z?ML$=u(-WW}=iF5}Xvb(lr;QDRr`iyN`4Al&;ir2-m8gh_?9tdTV!zowG zwuWyJjWe!W|^{dc-DzgOcIIG+%?ZPnXEar z>#ZI|2ntARTDpDXX~^_K*BQweaP=s_0pPq8)s*QHabjIA3F{aw2oH%7~ zuoHMN?k6_Q@iZ6h<56PsnxN9GqOmOIB(GWJBjK2~HD2@~qh&#}Y9A+SB9DG>ADCvf z53~?X;DI@L!F4e|rlDC*CJDT_odkoBNv8&5OnDH~ETyN`;S4(&bXqVj#F$#cHLW@w zW5iz{Z7Bn~C>SmlBowM#1!xC@m7~Q2!*(16C1Tp9CIFF@*{DIYI*+1ouzrp z5>!bMWK*zWjKA)YQTa>?*-#iSI#W1B6(lIr(9jiH;zf>DI1$oE~BkWMp1<69#4JZQIFhqk^Il-VM8AdIr zMuEylb4g!mUJgLPb#Zp&I=`csj)B~l(})vvMbQCIo05sv76&C-HD!xdWJzRApy-l< z;+sED%-M{IZpheZ!vn*ZPBH4hP<0mSQCb0lfKo^lX}|(>LAu291}n%GTbiPVn;BDe z*?vNgS7uu-q1VH$m80c^&TUO;ka3}3cw588%3IpY@)=vm+gt(HfZ=ayalI}3;VJ8g8k>H7UL zkM2`*Hq{4e8V<~6h#e>x=9dljyeSu${3v>wg&w3ar6*}v%iI>FLX- z5AHeuc0aWJ=-Umc0rk*qY^uv$;angI{#i!nnU%CFw1B?Fh<(HTKZu!ZDYJ+n7Lx(omhHg;_-*G+nb;G@S>gl3$AGBXuNlA!;_hh1};XIa{AZL(hr_mz3=3bz3lD6 zH>Q3$?`K;T^Yx}vLzhj_mrVCx{z>Ct^Krf7;feZNU%Y?()1N=}z**rtU!pFkhzWI)S18HSz7XSbN literal 0 HcmV?d00001 diff --git a/cep/images/IconDark@2X.png b/cep/images/IconDark@2X.png new file mode 100644 index 0000000000000000000000000000000000000000..847c281a6f4c91ba5b722657c276ffd25b4a6b93 GIT binary patch literal 18146 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 literal 0 HcmV?d00001 diff --git a/cep/images/IconDarkRollOver.png b/cep/images/IconDarkRollOver.png new file mode 100644 index 0000000000000000000000000000000000000000..9af8c6abb839194af1431d1a190dffccab3367cd GIT binary patch literal 18044 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 literal 0 HcmV?d00001 diff --git a/cep/images/IconDarkRollOver@2X.png b/cep/images/IconDarkRollOver@2X.png new file mode 100644 index 0000000000000000000000000000000000000000..b19463ef231f7e9af028faeb1a1b339716cf96d1 GIT binary patch literal 18778 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 EA7-PvrT_o{ literal 0 HcmV?d00001 diff --git a/cep/images/IconLight.png b/cep/images/IconLight.png new file mode 100644 index 0000000000000000000000000000000000000000..f88374e11e3141fd6b9d351c9d119023c67575ff GIT binary patch literal 17616 zcmeI4Yiu0V6@Vuc+B`5-Xqtppb~c-Y62$C0cV1m@>evakf`jFl#7@N(M z&e&e3Q1K8YA#DOif+(~UsMPZ4Lxl(hXc}4?q4Y;-X^`3!nm{TwMu~z0;!%XsJNvjh zUa!NYiKDfh(k5*HPd))A$LGObY=P z+-c0hBPFw9PL)EPLePxXJOqK4@A16BbSYiCDzS*Qwub4c#;)4nW^Hf8U!LM>O{$4g z^#me5hzyu)N+QsD>;>9YoY> z9iUZcg8+Q8i>PA6iESBga-wwxb|0q{>h`21A}fFg(G3RwjlwTSNWvH@}_9AGISsdOp|9t z$B}eJlT=%BQe3#=kx}(b%6U*8uQ<~LO_vm?vd}U$RuN@^)dU%`l7kMYs%B}nPVCIo zB-yeoo7Hqwo8+Wsu^OM0Q5{rNAlZs2DKfD$=-9w9bsf17B^Efc$?CjfvZ`dOHt(2% zWx@K+N~4oeM&op@K!lmy*=clS{Q#gib+i?+yCHTNst_hc)-e@@HK7bxQ$%^LBTTlb zY634S#dM!+UJXFmb!B$sy0n+ro`u|3(@2n$P?w<0+KP=il1w^fJLR7K`(pqYw> z;#)e;h_fjZU7vT+RtE+nI+dscOE-CFCRq(g5=tRiW&sZ@RyP%1w0KE%csxZNH&do+ zcf*7pot$mOgkA@?OdhQ!ba7M4fxHjHlG_}w)Lgual`^)Rx5d(J04vaum8?yn%d*-c z6kFxVeM+Uhn%dV?nz&MGt_~Me*inCS8-undbO&feDq+}+g^eX?A+0f=v=GbQQ7c)z z#hA9Yv~(S{)2OMo6;!#4y`^c2HfuSu2n0=$Z2>j0rBjVKt2dW-zU^gcmO5^#vsL2I zR>d9ZCR5=JvVr(qehGn&F65co$!~(Oid~T*0)GOiIZVS36v5(d8E4U~ij?ZZ!R{Qx?%3 zYSE_lKwZPW=?o(W%7&%ZB=U@@7?{#1dV+->o^kl;StMq7*egmow` zjDkd3f<&OWNGM?) ziVLG45hyMaN?3>D!YD`tii?C2)}gpC3KD_hBB6wJC@zeGM4-4xC}ACn3!@+r&WUSw z^?ejDi(W!8g5EZ8#v7kl{P>BxZokJkJn+V&0}We_-tgP+ti1c4w=(*Mro{cMvj6D# zYyW)com>8}>+~CsAHFI1w>ul3nLBjm?Dc=|`q}z9-&)wH-MaebmYpx{etqdMvtY}- z=O-H06vp6Ruj)CI@_r-lJiBcB=6!SDOQc?Uc7@*Gw|@DN{IbR0Jh(hC7f&46xgYF$ zVB66*=Vy;Mq`ke%et-4bpIJ1~^!mWT)O(xQG3|#R>^in~`NSRLU;D|}qK_snyK&;u zk53%@%1@84eDkZno+aGeerVCL?4d`lIJNKYYj^K>=Lg$gzOG~F8~eWd&{Om7`q8`T z*IvwzKV|*t#~=RVWbnjukG-3|a^0Ex=Kkf2FE0Gu;*)dq`Pyv{9D0A*rFZUcdb+#m z#KI$E4?kGgw&aobFWS*N>x%iUjo(`{|Iz#heHWukIsL+u?ER-!?LE0*4}Y8V_3>ZL z_{A2@ezob;z-8m?B@?}uf7IB&g&)qxv@h=~{@2vFg&ofW|xi9ggzjp`) PlId8rw(aLDH{JekEn#RY literal 0 HcmV?d00001 diff --git a/cep/images/IconLight@2X.png b/cep/images/IconLight@2X.png new file mode 100644 index 0000000000000000000000000000000000000000..7efefaf7ab81e6e2acaecfdb36b601b93b2235ef GIT binary patch literal 18146 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 literal 0 HcmV?d00001 diff --git a/cep/images/IconLightRollOver.png b/cep/images/IconLightRollOver.png new file mode 100644 index 0000000000000000000000000000000000000000..90884f7214a02db8a761951f31f7ce51ae3584b0 GIT binary patch literal 18044 zcmeHPdvp}l86OT6G2x{U5o~c?9*yW^9y>cbvuqYZ7EFM}Gzk*w0h!00WJz{s-I+Xn z2Ze^xA{J7JXay>uQhZX22sTooqHVQ)^Fq&g?na z-Q4?qzi;mE``zz;Gkwi@YqH zHjG&PiD>Eu>8FHu?BUqNja1tX)6k4E4bwK5+ z(10>J0usaV07VG-f~rprSTtOYm&?^mt5pls`HHT~AM6YiP@>#H7O^TWh!Gh$mdr^M zI(>rWp|bF$i2?@7fFA@@1^N+5{emU3Dk~*&48C?DPT(nkNNPeNqoN+DwlmfGS@PZrV)5 zEv%_Xs$GyYXLbm1svIhmP+&3?U6Np`!WCdLSKM_pHc{qt!=z-0KGA98DBOYD1r+B=9;JW;P>$zul$0bJ zOEWfyXp>x+w(p@+{7Rx~h>pj=7=mGKG;p9m;2D%ADFS5(3ZOO#PBhpB1L}>cu{FIvN*r_-G1pAq8lKH`5xcyq#xRM6prbh6}ip6SPCkEokKoh%T(l zX#BD|JzWt4U-xwOj)HFPJ;$gl0fB3k!w6K^s%H>Imefiv1hR@@q3BJej-YmRON39p zOa3E?P`HY3mj($C6v^6I)WP92JOn5bWhfhmGK_-YKzektet1E z6NPqCgcGVfdMfFxdIssrXD<%S-lQRZjY0_*C)j+ka$J^%bCMjTm-bhqmrGn zp(IX;C@0$Ns6cZ-u;YSA13tFCe=l5B zSmqNrt(0OF0WsS3cb-5NRkrAwp$P9fjQ^raMG*2CsW7^$6k;@4{?FF@t!rxUI+aLT z&7B$P6(W_kYqt{X=DK$`u~sgk&Z*j-()#Lu-ORv43f>Jmb*yVGnbuzRwwxxociD?k zbl6aaZ!~)BFa?%{O*L$-MOt7Z9VX9{A}UA}$q@`qi3F{cZY`D$ELkl1+cuezC`n-A z(PDY<#Oc=clrHUN*$KN;*fE7mnj1C@-Ntli;khEM+bk;&cashhhcArK-lMMi=|tB# z*LKxUC%VQxX9aw!n~X+F7}j}dcl43l%>wuo3%F^!-DY=TiNlE=dA=%8R^;))+f7C5 zmq~b^8um$?Na{GJCr8~x)G@McbkCc@iHVHDr&;hp8rJzFO_#ICp8HPT<16}3;3J@B z5JTjebeVJ+V!)8GsVlm1GU+nJ zfFWa3T_#`Iy5CevcO?8=c8DhYYv8gVTE<+3$GB(v^(q)JNL&m1MOu7s) zV93~1mr0i)1`HXS>N4pv#DF1VQ(Y!qh8QqpY^uwo%Mb&Gj7@c!bQxm6kg=&QlP*IH z7&121WzuDc0Yk>uR98y;w<$mX{vbsq{N;(i4O)5}{%VCq$jSF2NX=LTd2Atqe03Fm zb|6SOjvy!JBZzYq{8bG3>HBw0MUcKkt|zOo>e%U((@W;g8n)=&t(Vw#xAIEIz!!7> zw6LM*z{yEBuG^HRS{K}!_EK$a?Tcp5*tmL99Udi8AE%H6d)qVo@$AEs z?r-{F`;sevXq-?p>U&RRZ~WmF_q?sech}GO?dMM}O~2PtQM>%hb(iOURC0UUy|3)Q zc|rS!V<%kvwDu0iJM*t|wGGQ3{1+?uk)>dt?(BdxOLQreY^OPiM+%RWD1{lS5s{eEz2R%zp;k|*FLReJZe zepoW{mXfNWnfvQcw>)vFT^%#*c>AyndWw5Z%HZLfN1bU}@bKL;H`ctqVz=;I%c#b} zYj`)6E^XPz zp|kJJ$WFg580;IER{vINeRf^@w*9Xb-LUo4+qJ3l&Un8Fq&E7O7WwzgZ#iGxn!Yyu z<|+51xGdp5oda3&-AepRnP`nw-Wh?QOSxbp86F@;iS6Ky_D9+3 zQ_Za>_Pu6T=DX+}e|+(1!{TZECxim!vl|EB>3Va;lHG$geE;B)n;+^}v~EI3+SU5# wPHD-{9vyq(>va>iwS0B>jia?!i!Wy)!VcyA8H>-sjf5b%Q)YU$OrBr+Pd2$vCjbBd literal 0 HcmV?d00001 diff --git a/cep/images/IconLightRollOver@2X.png b/cep/images/IconLightRollOver@2X.png new file mode 100644 index 0000000000000000000000000000000000000000..82c7dc94886de6d974d5cf248e25637e54b684a5 GIT binary patch literal 18778 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 literal 0 HcmV?d00001 diff --git a/cep/images/PySideLogo1.png b/cep/images/PySideLogo1.png new file mode 100644 index 0000000000000000000000000000000000000000..ec381a1f652e04207a7abe19581d998105985653 GIT binary patch literal 12910 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 Y0qaSy1x1mM`2YX_07*qoM6N<$f^ZnHjsO4v literal 0 HcmV?d00001 diff --git a/cep/images/default_Asset_thumb_dark.png b/cep/images/default_Asset_thumb_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b9a5337b8ea437a0089a314aeba64ae9646b3bb3 GIT binary patch literal 148010 zcmeHQON<;x8LpYxdC#n4@7i%*U_oRNEO8(bTsS1iQDPw?6eWk`gmT~l2c!T&2pJi1 zK|(Af#O2?i-OJIL7hry!JUWyZm4Emfbs^-R+s_o~o|;+V1Ul zb=CL(-_&1!{Z;+buf6zuyYXm4Db>F5!u6MA`%kR3iu`@)gKt%3Q+fR>&tF%E`1kww z{`d(9RY{err7 z>-NpUlUJWQl-sxvfglkm23cwrng|>rKmt$|f<}M@2wMCsJPAM@2pRzrAZYQk@FW0r zAZP?gfS|?C!jk~hfuIo}0fH7k3r_+Br33GN{wd#bQBSxNu&bTU}L~o11E|wRP(KyqGQmBtW`&>eMQgiZ*wk+)0 zTvw}7D}V?)J3C1q<$VhvKmsfP-sGdjVo{qr<#KuQQsU!ErK}!)_>$V)*;N}tg#G>f z#Lx1^*%2TCX2)#m6EJmP@}#xYB)v!LkEks%i8ePoYBU<9l{C|dAwUAez?f&ZEbh#v zcyvmoY&^U{5*)OZB?PG4# z!$W@hAq~_?fH_dC)nNM66*{?=xuAjl&_fTYRdJ)DtuPo2mic-w-$eqMtw-?Q@X$6l5B zE(7n9K}-S&PVnhN@ez{X+hPLm(2sz4qpdA^jN&p5o&a^2I}(DhY@dEy2+P=q3-{v1 zi{d&RYLC(G?(Q;P>-;-{B>=)18uF{ZV%evku7gSaUU z^ObTC#hpd}^}TQ*txB9ltKF6X%w0WpGnD8%uQdYZj%oGItQ7%102k8v^N79^7m^HO z4k7x^TLR28W-&mWpIT%+b~BLZJMRd9n1*Jvp%xjlI8`eGJZYluc6ax5r-F~scU}@mtM0c?#^%&*#}oAZ0ocdf`{)bIDxeZi7a%N+rZk5hd54>`h5WUDH-w0q1c?93N8hGa%0nihPuS~c+MMJ(- za{0M;Iq)uIwW)Adt z;VdHX4qiPMI@7EY;P@2GRQ`oED@O^S#&=;#Y-RCk%;KE|94M630 zLHzdeu!#D<^3)e3{P&8wasAns(=35CGNf4urj3ULY5G1YJ>v5c5%R zqzy;{gs6Qkl-ZFgz#0MQ19CwN?d2i(Hozf+;OuFi18*h)_(}BH)bR6vetnchEWm8J z$mH(e$&d-EOf)wLIMN)j=@H6}teDXZ5MT|E0jNweKM2qz%Jx8hv^9&II${G^bBVH3 zEDNp5PntA=@*^weGy?>JCje`J474goNjhQy+4BO)Q~@~>7qgl+0>Re+j>JW!Emx+O z5CM9DSOX+f6+drd4Unh`_|ZQ;`zcRj0sPeK`AX$VgW%e&+c)VKolk~*YC!~ouM+4M zT2O;>{&?^N$hrKO{RI(lWu|1BKnn_zkI#ny-9mH=&8In@JVg`86G5^Vb0Xk~E6AD& z#IE5v6~~jug0BG>8R3a0&shvdDgcYYL30Af$B00h2v{?L*bk7V81tFd6f@`(pM3JW z)?xvyks+VrW3JOgURs)(F7bAd!5$zKI0zTD&aWSqKD8fV05ib^j3vngBF` z{8#X^O6bBwvew!FXMw}(0U+Q&#{dbiWIaR8*X#D=%hHExWu?62x4ZQ^7fc{)U)P2x zpbRd6uq?G04M%D;8p#COhiZ3kSCz|UwYqvvRVo!V9?KlLfh{h`-YNk?`K07{G*&|> z{=^pqhr^+|d-r2iDy;|++NxHoOU*FWKMWyoA$S7#UIW0)fs#Y1Ph0Tozqz?7wP9C? zu&SDkh8hPz1QI}x4{*U3aGH9~ehtNf;wLq0Uj6&y&rHSwptk6CJJMe0s#d$LNr6cQ z4i5bM4y^<2VP)AInqARcegd@{?0u|@ENCzE`#rt3S}oOVHg&tnHzK$&TFfc|pfJ8H zM)A`w(_k=ASnKtMYPFhbMcNK9mAqISr~<4Kz=y#yCpC7{R?wZDZH2X3scQ46BHpCD z6CwEa0PNemE=e1^X_s$re^2e*-P7*WwzLy!)tVaR)SVhU0n#=X(pI)<>CM{Mot8!# z=g{EZ*x1nS)ONe2>f%n#Ta6Gr0n$)}Wu*}{aL3ZX9WLvYiQWURQ>W8W-9k^HMlkNw zL=RiO$$=(-T`y2x+Q8$nbZW^juFEwRT&TTXSM_^6-9~6M>Q3hu+zY-2a9N=sppo?E z>M(|h-dtRBb&0!B;XZ9h2V1dNbdn6gyFp!5B3ljIwDH*5+EQ2}7ivq0P;iR~4%k3e z-Jq`305Hk+_xH~XV@O+3vrg}r3spMS%9XMcy~|;nKtFi*t$)R00bC&i@)4OnZZ&q( zCW&^ZZba@>^fp(kRjZ^3n+zgd7rF#=Z?1$d!;TJRLE|1ld5BI05$g4t6(Trb4cYbx z*;BeaHg?k{DBP(!5U*F%L|C>LDfk+|Minp~A80SnS)t2mE1S#d!JUdgyg|Po)d=EF zUB(i;M`)RS0={^8vQ$j%P95}BU)Dy$xKpz;R14y&wY_-n5sDhPi-#-Q7SyuezrDSs zuwwKYdYVfsrPQ-P6DV~^k0%&n1NS%riy!Uo?kKE?NNplCd&TN+=HdmKNWp4pvT}p6 zfjc4P6b|DqRG3G#T6N(Lw%}`kvdaoGS*wpM%5d%0?VGu?iO}MO zVJZ{QWq}FPOaXzoE2$y&5~j+Vwgg`d%%Z|<@lI1Ax6f%;k_>Rh9FcG(RU||;zPL~e zI9~&>#T!?deC{Lu94n&nFoI_hS5n#tSS7$|eo?k~(-yV;^o%QMFepilP(N}d*&V^- zBmvmUwXdvM<^Yk2a3ys*-GzJC7R{$s0!(I}4ctjY{5-~d^84D6VZVG<31CbhG;pIS z8T_0f*1nkC$bn0WZxFFgfZg3asRpU|Mj$?JhxSH_ z=GGR9j~^_^E02q_1TbLY^C^3Kd)ibgON~&H)rIbKlfO{6c~^WRH|GgpG79rZ`;loL z8Az;beNlV^UTz3rGK_89Jc`;1>5t})zmNO)qF*{6N^=d%ToS;52=gckx>5?}(TcPc zXdW4K(%G88M0o6cTyjl-xIo~0#)|$0G@9u>ila08zVC`}5b=fpra-2D0p25;M+TMT z+fWqWAmSYXOu>$sM^Ynz3^b1nIuC9`Q+$Jfw*)W+#MX4KG5jKqO0;i+5`Ftx_k$&! zekKzFeDD4D|KoZrfH9Rk48@o(=~K>zP67i>CS)*)ySfcI{DO*qTq}blKpX#6 zM8%Iw{r-ON1Tav<%_Gyl;KP(GW8qK!CFR1vlNbBT#Nr02FNp!`SM=~y42jpcPe&OPj zBZ+`=^d=G@MZshle&N32U-{qmzg>?7I9=Ez!|C|Ub=8Ay7{8D#QZ*m*?qmqv(vl_t1ZpU1e3gUf6CHXRUBd}|)@+ZS(~>&sc)Hj9 zbaaesljktlA9L!rTI~nO0M8CS@s0sM$j`m66CJT;@)+ssbLP6);w=8lvHp0M-r{CC zGOK<#I>v6Oi}M6PgA*nNW*x@n zc*68K*QZ>}>QmOV07|$gUv9>D-{EjyjWF+we6nyX zpGv}f^H6->7bujlQ4`YFvVs8kfCfHMk8KogQr0zLrCQTlTV=Oe1Khpyk?Qw*TG?#@ zVEetO$$Ve%LpK^>QZ0P{?f3$7aBcmPe7e4U{KArstkwXgjQFM3HGtT@W2~kYfY~G0 z#(E2rCo+QoC>J*oK#d0Tr*vcj6(x)WVdo{7L-86w90D){ZJS3{YXBoc4N$3W4$s_z z0I>gcJ3wrIy$>@2ZGxk%z6b3BeQfOi`?kM6FV~FuA$MT+*s*T-Mkn<(+@tSD4mAgl zo{0{k=a2SHA)?##Uvnz?7B=_PyJ2%5UAT9TITzoeC5-?06P?GtRyutg?c*5#qI;rq zkzH@Do3?-`H|`bX#xvT^m$rdXdYz7(&(q=r0cHgZK!Y^$XVyn~KM^>F04MD~1_uv9 zLx2QWOycz)KJzQ3uBaQ=pM80;l=!rD1V{$!B47q=B2ZZW(w+Co0-GY>yR9QY0$3LT zGhh<|62K<zFE;eQ$3j}5*Ll${pnnb`F0wjPn==ow75Fi0ukOK2y z4FM9s8uWaz3kZ+^E=YlSu!aB$U=4b{*aZYg02iddJXk}31h57@U+e+`B!CN2U>>X? uKmu5UK1VOUT6y!+lHCtIpBLbXU;gRir@wgh=a9^e=U%-2moI<)$NvWtX9>*! literal 0 HcmV?d00001 diff --git a/cep/images/default_Entity_thumb_dark.png b/cep/images/default_Entity_thumb_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..2b08c92d01a0368225931e842eec2443996934b6 GIT binary patch literal 148010 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 AcmMzZ literal 0 HcmV?d00001 diff --git a/cep/images/default_Project_thumb_dark.png b/cep/images/default_Project_thumb_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..a7acdf59a14fa327fa6d3287ce52e39515493119 GIT binary patch literal 148010 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 a{rVrhcjrIXDg4`?f9K7={+VC>%KrnfugVnw literal 0 HcmV?d00001 diff --git a/cep/images/default_Site_thumb_dark.png b/cep/images/default_Site_thumb_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..82c71f78748df9cc676d6dce710f169e7be6f899 GIT binary patch literal 148010 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 literal 0 HcmV?d00001 diff --git a/cep/images/default_Task_thumb_dark.png b/cep/images/default_Task_thumb_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..03c89d4d525dc766766463df846bec05ac3ca396 GIT binary patch literal 148010 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 M9{ukx{r=zlKR=L<^8f$< literal 0 HcmV?d00001 diff --git a/cep/images/sg_logo_with_text.png b/cep/images/sg_logo_with_text.png new file mode 100644 index 0000000000000000000000000000000000000000..d2e0d187c2c5ccf23ad7c3330e7dfd2a915103c0 GIT binary patch literal 111523 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

Bx4KM<;-3(5Z$1ZK=+WeLU;HbkMPU`SNqZta45O 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 Sqik-v;gi>Y?<4p8@&5 + *

  • Access information about the host application in which an extension is running
  • + *
  • Launch an extension
  • + *
  • Register interest in event notifications, and dispatch events
  • + * + * + * @return A new \c CSInterface object + */ +function CSInterface() +{ +} + +/** + * User can add this event listener to handle native application theme color changes. + * Callback function gives extensions ability to fine-tune their theme color after the + * global theme color has been changed. + * The callback function should be like below: + * + * @example + * // event is a CSEvent object, but user can ignore it. + * function OnAppThemeColorChanged(event) + * { + * // Should get a latest HostEnvironment object from application. + * var skinInfo = JSON.parse(window.__adobe_cep__.getHostEnvironment()).appSkinInfo; + * // Gets the style information such as color info from the skinInfo, + * // and redraw all UI controls of your extension according to the style info. + * } + */ +CSInterface.THEME_COLOR_CHANGED_EVENT = "com.adobe.csxs.events.ThemeColorChanged"; + +/** The host environment data object. */ +CSInterface.prototype.hostEnvironment = JSON.parse(window.__adobe_cep__.getHostEnvironment()); + +/** Retrieves information about the host environment in which the + * extension is currently running. + * + * @return A \c #HostEnvironment object. + */ +CSInterface.prototype.getHostEnvironment = function() +{ + this.hostEnvironment = JSON.parse(window.__adobe_cep__.getHostEnvironment()); + return this.hostEnvironment; +}; + +/** Closes this extension. */ +CSInterface.prototype.closeExtension = function() +{ + window.__adobe_cep__.closeExtension(); +}; + +/** + * Retrieves a path for which a constant is defined in the system. + * + * @param pathType The path-type constant defined in \c #SystemPath , + * + * @return The platform-specific system path string. + */ +CSInterface.prototype.getSystemPath = function(pathType) +{ + var path = decodeURI(window.__adobe_cep__.getSystemPath(pathType)); + var OSVersion = this.getOSInformation(); + if (OSVersion.indexOf("Windows") >= 0) + { + path = path.replace("file:///", ""); + } + else if (OSVersion.indexOf("Mac") >= 0) + { + path = path.replace("file://", ""); + } + return path; +}; + + +/** + * Evaluates a JavaScript script, which can use the JavaScript DOM + * of the host application. + * + * @param script The JavaScript script. + * @param callback Optional. A callback function that receives the result of execution. + * If execution fails, the callback function receives the error message \c EvalScript_ErrMessage. + */ +CSInterface.prototype.evalScript = function(script, callback) +{ + if(callback === null || callback === undefined) + { + callback = function(result){}; + } + window.__adobe_cep__.evalScript(script, callback); +}; + +/** + * Retrieves the unique identifier of the application. + * in which the extension is currently running. + * + * @return The unique ID string. + */ +CSInterface.prototype.getApplicationID = function() +{ + var appId = this.hostEnvironment.appId; + return appId; +}; + +/** + * Retrieves host capability information for the application + * in which the extension is currently running. + * + * @return A \c #HostCapabilities object. + */ +CSInterface.prototype.getHostCapabilities = function() +{ + var hostCapabilities = JSON.parse(window.__adobe_cep__.getHostCapabilities() ); + return hostCapabilities; +}; + +/** + * Triggers a CEP event programmatically. Yoy can use it to dispatch + * an event of a predefined type, or of a type you have defined. + * + * @param event A \c CSEvent object. + */ +CSInterface.prototype.dispatchEvent = function(event) +{ + if (typeof event.data == "object") + { + event.data = JSON.stringify(event.data); + } + + window.__adobe_cep__.dispatchEvent(event); +}; + +/** + * Registers an interest in a CEP event of a particular type, and + * assigns an event handler. + * The event infrastructure notifies your extension when events of this type occur, + * passing the event object to the registered handler function. + * + * @param type The name of the event type of interest. + * @param listener The JavaScript handler function or method. + * @param obj Optional, the object containing the handler method, if any. + * Default is null. + */ +CSInterface.prototype.addEventListener = function(type, listener, obj) +{ + window.__adobe_cep__.addEventListener(type, listener, obj); +}; + +/** + * Removes a registered event listener. + * + * @param type The name of the event type of interest. + * @param listener The JavaScript handler function or method that was registered. + * @param obj Optional, the object containing the handler method, if any. + * Default is null. + */ +CSInterface.prototype.removeEventListener = function(type, listener, obj) +{ + window.__adobe_cep__.removeEventListener(type, listener, obj); +}; + +/** + * Loads and launches another extension, or activates the extension if it is already loaded. + * + * @param extensionId The extension's unique identifier. + * @param startupParams Not currently used, pass "". + * + * @example + * To launch the extension "help" with ID "HLP" from this extension, call: + * requestOpenExtension("HLP", ""); + * + */ +CSInterface.prototype.requestOpenExtension = function(extensionId, params) +{ + window.__adobe_cep__.requestOpenExtension(extensionId, params); +}; + +/** + * Retrieves the list of extensions currently loaded in the current host application. + * The extension list is initialized once, and remains the same during the lifetime + * of the CEP session. + * + * @param extensionIds Optional, an array of unique identifiers for extensions of interest. + * If omitted, retrieves data for all extensions. + * + * @return Zero or more \c #Extension objects. + */ +CSInterface.prototype.getExtensions = function(extensionIds) +{ + var extensionIdsStr = JSON.stringify(extensionIds); + var extensionsStr = window.__adobe_cep__.getExtensions(extensionIdsStr); + + var extensions = JSON.parse(extensionsStr); + return extensions; +}; + +/** + * Retrieves network-related preferences. + * + * @return A JavaScript object containing network preferences. + */ +CSInterface.prototype.getNetworkPreferences = function() +{ + var result = window.__adobe_cep__.getNetworkPreferences(); + var networkPre = JSON.parse(result); + + return networkPre; +}; + +/** + * Initializes the resource bundle for this extension with property values + * for the current application and locale. + * To support multiple locales, you must define a property file for each locale, + * containing keyed display-string values for that locale. + * See localization documentation for Extension Builder and related products. + * + * Keys can be in the + * form key.value="localized string", for use in HTML text elements. + * For example, in this input element, the localized \c key.value string is displayed + * instead of the empty \c value string: + * + * + * + * @return An object containing the resource bundle information. + */ +CSInterface.prototype.initResourceBundle = function() +{ + var resourceBundle = JSON.parse(window.__adobe_cep__.initResourceBundle()); + var resElms = document.querySelectorAll('[data-locale]'); + for (var n = 0; n < resElms.length; n++) + { + var resEl = resElms[n]; + // Get the resource key from the element. + var resKey = resEl.getAttribute('data-locale'); + if (resKey) + { + // Get all the resources that start with the key. + for (var key in resourceBundle) + { + if (key.indexOf(resKey) === 0) + { + var resValue = resourceBundle[key]; + if (key.length == resKey.length) + { + resEl.innerHTML = resValue; + } + else if ('.' == key.charAt(resKey.length)) + { + var attrKey = key.substring(resKey.length + 1); + resEl[attrKey] = resValue; + } + } + } + } + } + return resourceBundle; +}; + +/** + * Writes installation information to a file. + * + * @return The file path. + */ +CSInterface.prototype.dumpInstallationInfo = function() +{ + return window.__adobe_cep__.dumpInstallationInfo(); +}; + +/** + * Retrieves version information for the current Operating System, + * See http://www.useragentstring.com/pages/Chrome/ for Chrome \c navigator.userAgent values. + * + * @return A string containing the OS version, or "unknown Operation System". + * If user customizes the User Agent by setting CEF command parameter "--user-agent", only + * "Mac OS X" or "Windows" will be returned. + */ +CSInterface.prototype.getOSInformation = function() +{ + var userAgent = navigator.userAgent; + + if ((navigator.platform == "Win32") || (navigator.platform == "Windows")) + { + var winVersion = "Windows"; + var winBit = ""; + if (userAgent.indexOf("Windows") > -1) + { + if (userAgent.indexOf("Windows NT 5.0") > -1) + { + winVersion = "Windows 2000"; + } + else if (userAgent.indexOf("Windows NT 5.1") > -1) + { + winVersion = "Windows XP"; + } + else if (userAgent.indexOf("Windows NT 5.2") > -1) + { + winVersion = "Windows Server 2003"; + } + else if (userAgent.indexOf("Windows NT 6.0") > -1) + { + winVersion = "Windows Vista"; + } + else if (userAgent.indexOf("Windows NT 6.1") > -1) + { + winVersion = "Windows 7"; + } + else if (userAgent.indexOf("Windows NT 6.2") > -1) + { + winVersion = "Windows 8"; + } + else if (userAgent.indexOf("Windows NT 6.3") > -1) + { + winVersion = "Windows 8.1"; + } + else if (userAgent.indexOf("Windows NT 10") > -1) + { + winVersion = "Windows 10"; + } + + if (userAgent.indexOf("WOW64") > -1 || userAgent.indexOf("Win64") > -1) + { + winBit = " 64-bit"; + } + else + { + winBit = " 32-bit"; + } + } + + return winVersion + winBit; + } + else if ((navigator.platform == "MacIntel") || (navigator.platform == "Macintosh")) + { + var result = "Mac OS X"; + + if (userAgent.indexOf("Mac OS X") > -1) + { + result = userAgent.substring(userAgent.indexOf("Mac OS X"), userAgent.indexOf(")")); + result = result.replace(/_/g, "."); + } + + return result; + } + + return "Unknown Operation System"; +}; + +/** + * Opens a page in the default system browser. + * + * Since 4.2.0 + * + * @param url The URL of the page/file to open, or the email address. + * Must use HTTP/HTTPS/file/mailto protocol. For example: + * "http://www.adobe.com" + * "https://github.com" + * "file:///C:/log.txt" + * "mailto:test@adobe.com" + * + * @return One of these error codes:\n + *
      \n + *
    • NO_ERROR - 0
    • \n + *
    • ERR_UNKNOWN - 1
    • \n + *
    • ERR_INVALID_PARAMS - 2
    • \n + *
    • ERR_INVALID_URL - 201
    • \n + *
    \n + */ +CSInterface.prototype.openURLInDefaultBrowser = function(url) +{ + return cep.util.openURLInDefaultBrowser(url); +}; + +/** + * Retrieves extension ID. + * + * Since 4.2.0 + * + * @return extension ID. + */ +CSInterface.prototype.getExtensionID = function() +{ + return window.__adobe_cep__.getExtensionId(); +}; + +/** + * Retrieves the scale factor of screen. + * On Windows platform, the value of scale factor might be different from operating system's scale factor, + * since host application may use its self-defined scale factor. + * + * Since 4.2.0 + * + * @return One of the following float number. + *
      \n + *
    • -1.0 when error occurs
    • \n + *
    • 1.0 means normal screen
    • \n + *
    • >1.0 means HiDPI screen
    • \n + *
    \n + */ +CSInterface.prototype.getScaleFactor = function() +{ + return window.__adobe_cep__.getScaleFactor(); +}; + +/** + * Set a handler to detect any changes of scale factor. This only works on Mac. + * + * Since 4.2.0 + * + * @param handler The function to be called when scale factor is changed. + * + */ +CSInterface.prototype.setScaleFactorChangedHandler = function(handler) +{ + window.__adobe_cep__.setScaleFactorChangedHandler(handler); +}; + +/** + * Retrieves current API version. + * + * Since 4.2.0 + * + * @return ApiVersion object. + * + */ +CSInterface.prototype.getCurrentApiVersion = function() +{ + var apiVersion = JSON.parse(window.__adobe_cep__.getCurrentApiVersion()); + return apiVersion; +}; + +/** + * Set panel flyout menu by an XML. + * + * Since 5.2.0 + * + * Register a callback function for "com.adobe.csxs.events.flyoutMenuClicked" to get notified when a + * menu item is clicked. + * The "data" attribute of event is an object which contains "menuId" and "menuName" attributes. + * + * Register callback functions for "com.adobe.csxs.events.flyoutMenuOpened" and "com.adobe.csxs.events.flyoutMenuClosed" + * respectively to get notified when flyout menu is opened or closed. + * + * @param menu A XML string which describes menu structure. + * An example menu XML: + * + * + * + * + * + * + * + * + * + * + * + * + */ +CSInterface.prototype.setPanelFlyoutMenu = function(menu) +{ + if ("string" != typeof menu) + { + return; + } + + window.__adobe_cep__.invokeSync("setPanelFlyoutMenu", menu); +}; + +/** + * Updates a menu item in the extension window's flyout menu, by setting the enabled + * and selection status. + * + * Since 5.2.0 + * + * @param menuItemLabel The menu item label. + * @param enabled True to enable the item, false to disable it (gray it out). + * @param checked True to select the item, false to deselect it. + * + * @return false when the host application does not support this functionality (HostCapabilities.EXTENDED_PANEL_MENU is false). + * Fails silently if menu label is invalid. + * + * @see HostCapabilities.EXTENDED_PANEL_MENU + */ +CSInterface.prototype.updatePanelMenuItem = function(menuItemLabel, enabled, checked) +{ + var ret = false; + if (this.getHostCapabilities().EXTENDED_PANEL_MENU) + { + var itemStatus = new MenuItemStatus(menuItemLabel, enabled, checked); + ret = window.__adobe_cep__.invokeSync("updatePanelMenuItem", JSON.stringify(itemStatus)); + } + return ret; +}; + + +/** + * Set context menu by XML string. + * + * Since 5.2.0 + * + * There are a number of conventions used to communicate what type of menu item to create and how it should be handled. + * - an item without menu ID or menu name is disabled and is not shown. + * - if the item name is "---" (three hyphens) then it is treated as a separator. The menu ID in this case will always be NULL. + * - Checkable attribute takes precedence over Checked attribute. + * - a PNG icon. For optimal display results please supply a 16 x 16px icon as larger dimensions will increase the size of the menu item. + The Chrome extension contextMenus API was taken as a reference. + https://developer.chrome.com/extensions/contextMenus + * - the items with icons and checkable items cannot coexist on the same menu level. The former take precedences over the latter. + * + * @param menu A XML string which describes menu structure. + * @param callback The callback function which is called when a menu item is clicked. The only parameter is the returned ID of clicked menu item. + * + * @description An example menu XML: + * + * + * + * + * + * + * + * + * + * + * + */ +CSInterface.prototype.setContextMenu = function(menu, callback) +{ + if ("string" != typeof menu) + { + return; + } + + window.__adobe_cep__.invokeAsync("setContextMenu", menu, callback); +}; + +/** + * Set context menu by JSON string. + * + * Since 6.0.0 + * + * There are a number of conventions used to communicate what type of menu item to create and how it should be handled. + * - an item without menu ID or menu name is disabled and is not shown. + * - if the item label is "---" (three hyphens) then it is treated as a separator. The menu ID in this case will always be NULL. + * - Checkable attribute takes precedence over Checked attribute. + * - a PNG icon. For optimal display results please supply a 16 x 16px icon as larger dimensions will increase the size of the menu item. + The Chrome extension contextMenus API was taken as a reference. + * - the items with icons and checkable items cannot coexist on the same menu level. The former take precedences over the latter. + https://developer.chrome.com/extensions/contextMenus + * + * @param menu A JSON string which describes menu structure. + * @param callback The callback function which is called when a menu item is clicked. The only parameter is the returned ID of clicked menu item. + * + * @description An example menu JSON: + * + * { + * "menu": [ + * { + * "id": "menuItemId1", + * "label": "testExample1", + * "enabled": true, + * "checkable": true, + * "checked": false, + * "icon": "./image/small_16X16.png" + * }, + * { + * "id": "menuItemId2", + * "label": "testExample2", + * "menu": [ + * { + * "id": "menuItemId2-1", + * "label": "testExample2-1", + * "menu": [ + * { + * "id": "menuItemId2-1-1", + * "label": "testExample2-1-1", + * "enabled": false, + * "checkable": true, + * "checked": true + * } + * ] + * }, + * { + * "id": "menuItemId2-2", + * "label": "testExample2-2", + * "enabled": true, + * "checkable": true, + * "checked": true + * } + * ] + * }, + * { + * "label": "---" + * }, + * { + * "id": "menuItemId3", + * "label": "testExample3", + * "enabled": false, + * "checkable": true, + * "checked": false + * } + * ] + * } + * + */ +CSInterface.prototype.setContextMenuByJSON = function(menu, callback) +{ + if ("string" != typeof menu) + { + return; + } + + window.__adobe_cep__.invokeAsync("setContextMenuByJSON", menu, callback); +}; + +/** + * Updates a context menu item by setting the enabled and selection status. + * + * Since 5.2.0 + * + * @param menuItemID The menu item ID. + * @param enabled True to enable the item, false to disable it (gray it out). + * @param checked True to select the item, false to deselect it. + */ +CSInterface.prototype.updateContextMenuItem = function(menuItemID, enabled, checked) +{ + var itemStatus = new ContextMenuItemStatus(menuItemID, enabled, checked); + ret = window.__adobe_cep__.invokeSync("updateContextMenuItem", JSON.stringify(itemStatus)); +}; + +/** + * Get the visibility status of an extension window. + * + * Since 6.0.0 + * + * @return true if the extension window is visible; false if the extension window is hidden. + */ +CSInterface.prototype.isWindowVisible = function() +{ + return window.__adobe_cep__.invokeSync("isWindowVisible", ""); +}; + +/** + * Resize extension's content to the specified dimensions. + * 1. Works with modal and modeless extensions in all Adobe products. + * 2. Extension's manifest min/max size constraints apply and take precedence. + * 3. For panel extensions + * 3.1 This works in all Adobe products except: + * * Premiere Pro + * * Prelude + * * After Effects + * 3.2 When the panel is in certain states (especially when being docked), + * it will not change to the desired dimensions even when the + * specified size satisfies min/max constraints. + * + * Since 6.0.0 + * + * @param width The new width + * @param height The new height + */ +CSInterface.prototype.resizeContent = function(width, height) +{ + window.__adobe_cep__.resizeContent(width, height); +}; + +/** + * Register the invalid certificate callback for an extension. + * This callback will be triggered when the extension tries to access the web site that contains the invalid certificate on the main frame. + * But if the extension does not call this function and tries to access the web site containing the invalid certificate, a default error page will be shown. + * + * Since 6.1.0 + * + * @param callback the callback function + */ +CSInterface.prototype.registerInvalidCertificateCallback = function(callback) +{ + return window.__adobe_cep__.registerInvalidCertificateCallback(callback); +}; + +/** + * Register an interest in some key events to prevent them from being sent to the host application. + * + * This function works with modeless extensions and panel extensions. + * Generally all the key events will be sent to the host application for these two extensions if the current focused element + * is not text input or dropdown, + * If you want to intercept some key events and want them to be handled in the extension, please call this function + * in advance to prevent them being sent to the host application. + * + * Since 6.1.0 + * + * @param keyEventsInterest A JSON string describing those key events you are interested in. A null object or + an empty string will lead to removing the interest + * + * This JSON string should be an array, each object has following keys: + * + * keyCode: [Required] represents an OS system dependent virtual key code identifying + * the unmodified value of the pressed key. + * ctrlKey: [optional] a Boolean that indicates if the control key was pressed (true) or not (false) when the event occurred. + * altKey: [optional] a Boolean that indicates if the alt key was pressed (true) or not (false) when the event occurred. + * shiftKey: [optional] a Boolean that indicates if the shift key was pressed (true) or not (false) when the event occurred. + * metaKey: [optional] (Mac Only) a Boolean that indicates if the Meta key was pressed (true) or not (false) when the event occurred. + * On Macintosh keyboards, this is the command key. To detect Windows key on Windows, please use keyCode instead. + * An example JSON string: + * + * [ + * { + * "keyCode": 48 + * }, + * { + * "keyCode": 123, + * "ctrlKey": true + * }, + * { + * "keyCode": 123, + * "ctrlKey": true, + * "metaKey": true + * } + * ] + * + */ +CSInterface.prototype.registerKeyEventsInterest = function(keyEventsInterest) +{ + return window.__adobe_cep__.registerKeyEventsInterest(keyEventsInterest); +}; + +/** + * Set the title of the extension window. + * This function works with modal and modeless extensions in all Adobe products, and panel extensions in Photoshop, InDesign, InCopy, Illustrator, Flash Pro and Dreamweaver. + * + * Since 6.1.0 + * + * @param title The window title. + */ +CSInterface.prototype.setWindowTitle = function(title) +{ + window.__adobe_cep__.invokeSync("setWindowTitle", title); +}; + +/** + * Get the title of the extension window. + * This function works with modal and modeless extensions in all Adobe products, and panel extensions in Photoshop, InDesign, InCopy, Illustrator, Flash Pro and Dreamweaver. + * + * Since 6.1.0 + * + * @return The window title. + */ +CSInterface.prototype.getWindowTitle = function() +{ + return window.__adobe_cep__.invokeSync("getWindowTitle", ""); +}; diff --git a/cep/js/shotgun/ECMA/JSON-js/json2.js b/cep/js/shotgun/ECMA/JSON-js/json2.js new file mode 100644 index 0000000..d4720c0 --- /dev/null +++ b/cep/js/shotgun/ECMA/JSON-js/json2.js @@ -0,0 +1,506 @@ +// json2.js +// 2016-05-01 +// Public Domain. +// NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. +// See http://www.JSON.org/js.html +// This code should be minified before deployment. +// See http://javascript.crockford.com/jsmin.html + +// USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO +// NOT CONTROL. + +// This file creates a global JSON object containing two methods: stringify +// and parse. This file is provides the ES5 JSON capability to ES3 systems. +// If a project might run on IE8 or earlier, then this file should be included. +// This file does nothing on ES5 systems. + +// JSON.stringify(value, replacer, space) +// value any JavaScript value, usually an object or array. +// replacer an optional parameter that determines how object +// values are stringified for objects. It can be a +// function or an array of strings. +// space an optional parameter that specifies the indentation +// of nested structures. If it is omitted, the text will +// be packed without extra whitespace. If it is a number, +// it will specify the number of spaces to indent at each +// level. If it is a string (such as "\t" or " "), +// it contains the characters used to indent at each level. +// This method produces a JSON text from a JavaScript value. +// When an object value is found, if the object contains a toJSON +// method, its toJSON method will be called and the result will be +// stringified. A toJSON method does not serialize: it returns the +// value represented by the name/value pair that should be serialized, +// or undefined if nothing should be serialized. The toJSON method +// will be passed the key associated with the value, and this will be +// bound to the value. + +// For example, this would serialize Dates as ISO strings. + +// Date.prototype.toJSON = function (key) { +// function f(n) { +// // Format integers to have at least two digits. +// return (n < 10) +// ? "0" + n +// : n; +// } +// return this.getUTCFullYear() + "-" + +// f(this.getUTCMonth() + 1) + "-" + +// f(this.getUTCDate()) + "T" + +// f(this.getUTCHours()) + ":" + +// f(this.getUTCMinutes()) + ":" + +// f(this.getUTCSeconds()) + "Z"; +// }; + +// You can provide an optional replacer method. It will be passed the +// key and value of each member, with this bound to the containing +// object. The value that is returned from your method will be +// serialized. If your method returns undefined, then the member will +// be excluded from the serialization. + +// If the replacer parameter is an array of strings, then it will be +// used to select the members to be serialized. It filters the results +// such that only members with keys listed in the replacer array are +// stringified. + +// Values that do not have JSON representations, such as undefined or +// functions, will not be serialized. Such values in objects will be +// dropped; in arrays they will be replaced with null. You can use +// a replacer function to replace those with JSON values. + +// JSON.stringify(undefined) returns undefined. + +// The optional space parameter produces a stringification of the +// value that is filled with line breaks and indentation to make it +// easier to read. + +// If the space parameter is a non-empty string, then that string will +// be used for indentation. If the space parameter is a number, then +// the indentation will be that many spaces. + +// Example: + +// text = JSON.stringify(["e", {pluribus: "unum"}]); +// // text is '["e",{"pluribus":"unum"}]' + +// text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t"); +// // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' + +// text = JSON.stringify([new Date()], function (key, value) { +// return this[key] instanceof Date +// ? "Date(" + this[key] + ")" +// : value; +// }); +// // text is '["Date(---current time---)"]' + +// JSON.parse(text, reviver) +// This method parses a JSON text to produce an object or array. +// It can throw a SyntaxError exception. + +// The optional reviver parameter is a function that can filter and +// transform the results. It receives each of the keys and values, +// and its return value is used instead of the original value. +// If it returns what it received, then the structure is not modified. +// If it returns undefined then the member is deleted. + +// Example: + +// // Parse the text. Values that look like ISO date strings will +// // be converted to Date objects. + +// myData = JSON.parse(text, function (key, value) { +// var a; +// if (typeof value === "string") { +// a = +// /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); +// if (a) { +// return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +// +a[5], +a[6])); +// } +// } +// return value; +// }); + +// myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { +// var d; +// if (typeof value === "string" && +// value.slice(0, 5) === "Date(" && +// value.slice(-1) === ")") { +// d = new Date(value.slice(5, -1)); +// if (d) { +// return d; +// } +// } +// return value; +// }); + +// This is a reference implementation. You are free to copy, modify, or +// redistribute. + +/*jslint + eval, for, this +*/ + +/*property + JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, + getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, + lastIndex, length, parse, prototype, push, replace, slice, stringify, + test, toJSON, toString, valueOf +*/ + + +// Create a JSON object only if one does not already exist. We create the +// methods in a closure to avoid creating global variables. + +if (typeof JSON !== "object") { + JSON = {}; +} + +(function () { + "use strict"; + + var rx_one = /^[\],:{}\s]*$/; + var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g; + var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g; + var rx_four = /(?:^|:|,)(?:\s*\[)+/g; + var rx_escapable = /[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; + var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; + + function f(n) { + // Format integers to have at least two digits. + return n < 10 + ? "0" + n + : n; + } + + function this_value() { + return this.valueOf(); + } + + if (typeof Date.prototype.toJSON !== "function") { + + Date.prototype.toJSON = function () { + + return isFinite(this.valueOf()) + ? this.getUTCFullYear() + "-" + + f(this.getUTCMonth() + 1) + "-" + + f(this.getUTCDate()) + "T" + + f(this.getUTCHours()) + ":" + + f(this.getUTCMinutes()) + ":" + + f(this.getUTCSeconds()) + "Z" + : null; + }; + + Boolean.prototype.toJSON = this_value; + Number.prototype.toJSON = this_value; + String.prototype.toJSON = this_value; + } + + var gap; + var indent; + var meta; + var rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + rx_escapable.lastIndex = 0; + return rx_escapable.test(string) + ? "\"" + string.replace(rx_escapable, function (a) { + var c = meta[a]; + return typeof c === "string" + ? c + : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4); + }) + "\"" + : "\"" + string + "\""; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i; // The loop counter. + var k; // The member key. + var v; // The member value. + var length; + var mind = gap; + var partial; + var value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value && typeof value === "object" && + typeof value.toJSON === "function") { + value = value.toJSON(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === "function") { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case "string": + return quote(value); + + case "number": + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) + ? String(value) + : "null"; + + case "boolean": + case "null": + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce "null". The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is "object", we might be dealing with an object or an array or +// null. + + case "object": + +// Due to a specification blunder in ECMAScript, typeof null is "object", +// so watch out for that case. + + if (!value) { + return "null"; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// Is the value an array? + + if (Object.prototype.toString.apply(value) === "[object Array]") { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || "null"; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 + ? "[]" + : gap + ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]" + : "[" + partial.join(",") + "]"; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === "object") { + length = rep.length; + for (i = 0; i < length; i += 1) { + if (typeof rep[i] === "string") { + k = rep[i]; + v = str(k, value); + if (v) { + partial.push(quote(k) + ( + gap + ? ": " + : ":" + ) + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + ( + gap + ? ": " + : ":" + ) + v); + } + } + } + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 + ? "{}" + : gap + ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}" + : "{" + partial.join(",") + "}"; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + if (typeof JSON.stringify !== "function") { + meta = { // table of character substitutions + "\b": "\\b", + "\t": "\\t", + "\n": "\\n", + "\f": "\\f", + "\r": "\\r", + "\"": "\\\"", + "\\": "\\\\" + }; + JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ""; + indent = ""; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === "number") { + for (i = 0; i < space; i += 1) { + indent += " "; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === "string") { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== "function" && + (typeof replacer !== "object" || + typeof replacer.length !== "number")) { + throw new Error("JSON.stringify"); + } + +// Make a fake root object containing our value under the key of "". +// Return the result of stringifying the value. + + return str("", {"": value}); + }; + } + + +// If the JSON object does not yet have a parse method, give it one. + + if (typeof JSON.parse !== "function") { + JSON.parse = function (text, reviver) { + +// The parse method takes a text and an optional reviver function, and returns +// a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + +// The walk method is used to recursively walk the resulting structure so +// that modifications can be made. + + var k; + var v; + var value = holder[key]; + if (value && typeof value === "object") { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + +// Parsing happens in four stages. In the first stage, we replace certain +// Unicode characters with escape sequences. JavaScript handles many characters +// incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + rx_dangerous.lastIndex = 0; + if (rx_dangerous.test(text)) { + text = text.replace(rx_dangerous, function (a) { + return "\\u" + + ("0000" + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + +// In the second stage, we run the text against regular expressions that look +// for non-JSON patterns. We are especially concerned with "()" and "new" +// because they can cause invocation, and "=" because it can cause mutation. +// But just to be safe, we want to reject all unexpected forms. + +// We split the second stage into 4 regexp operations in order to work around +// crippling inefficiencies in IE's and Safari's regexp engines. First we +// replace the JSON backslash pairs with "@" (a non-JSON character). Second, we +// replace all simple value tokens with "]" characters. Third, we delete all +// open brackets that follow a colon or comma or that begin the text. Finally, +// we look to see that the remaining characters are only whitespace or "]" or +// "," or ":" or "{" or "}". If that is so, then the text is safe for eval. + + if ( + rx_one.test( + text + .replace(rx_two, "@") + .replace(rx_three, "]") + .replace(rx_four, "") + ) + ) { + +// In the third stage we use the eval function to compile the text into a +// JavaScript structure. The "{" operator is subject to a syntactic ambiguity +// in JavaScript: it can begin a block or an object literal. We wrap the text +// in parens to eliminate the ambiguity. + + j = eval("(" + text + ")"); + +// In the optional fourth stage, we recursively walk the new structure, passing +// each name/value pair to a reviver function for possible transformation. + + return (typeof reviver === "function") + ? walk({"": j}, "") + : j; + } + +// If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError("JSON.parse"); + }; + } +}()); diff --git a/cep/js/shotgun/ECMA/rpc.js b/cep/js/shotgun/ECMA/rpc.js new file mode 100644 index 0000000..08e9472 --- /dev/null +++ b/cep/js/shotgun/ECMA/rpc.js @@ -0,0 +1,418 @@ + +// Copyright (c) 2016 Shotgun Software Inc. +// +// CONFIDENTIAL AND PROPRIETARY +// +// This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +// Source Code License included in this distribution package. See LICENSE. +// By accessing, using, copying or modifying this work you indicate your +// agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +// not expressly granted therein are reserved by Shotgun Software Inc. + +#include "./JSON-js/json2.js" +#strict on + +__OBJECT_REGISTRY = {}; +__WRAPPER_REGISTRY = {}; +__GLOBAL_SCOPE_WRAPPERS = undefined; + +// This adds a "unique_id" method to any object that's defined. +(function() { + if (Object.prototype.unique_id === undefined) { + var id = 0; + Object.prototype.unique_id = function() { + if (this.__uniqueid === undefined) { + this.__uniqueid = ++id; + } + return this.__uniqueid; + }; + } +})(); + +/* +Registers a wrapper object and records its relationship to a concrete object for +future lookups. + +:param wrapper: The wrapper object to register. +:param obj: The concrete object that the wrapper object wraps. +*/ +function register_object(wrapper, obj) { + if (obj instanceof Array) { + for (i in obj) { + register_object(wrapper, obj[i]); + } + } + else if (typeof obj == 'object' || typeof obj == 'function') { + __OBJECT_REGISTRY[wrapper.unique_id()] = obj; + __WRAPPER_REGISTRY[wrapper.unique_id()] = wrapper; + } +} + +/* +Tests whether the given object is a wrapper object. + +:param obj: The object to test. + +:rtype: boolean +*/ +function is_wrapper(obj) { + if (obj instanceof ObjectWrapper) { + return true; + } + else if (obj instanceof EnumeratorWrapper) { + return true; + } + else if (obj instanceof FunctionWrapper) { + return true; + } + else if (obj instanceof MethodDescriptor) { + return true; + } + else if (obj['__uniqueid'] != undefined) { + return true; + } + + return false; +} + +/* +Prepares the contents of a list of arguments for use in the native ExtendScript +runtime. If wrapper objects are found in the params list, they will be replaced +with their concrete-object equivalent. + +:param params: The list of arguments to prepare. +*/ +function prepare_arguments(params) { + prepped = []; + + if (params == undefined) { + return prepped; + } + + for (i in params) { + arg = params[i]; + + if (arg instanceof Array) { + prepped.push(prepare_arguments(arg)); + } + else if (is_wrapper(arg) == true) { + prepped.push(__OBJECT_REGISTRY[arg['__uniqueid']]); + } + else { + prepped.push(arg); + } + } + + return prepped; +} + +/* +An argument descriptor that records available argument data in such a way that +it can be JSON encoded. + +:param argument: The argument description object from ExtendScript's Reflection + interface. +*/ +function ArgumentDescriptor(argument) { + this.name = argument.name; + this.dataType = argument.dataType; + this.defaultValue = argument.defaultValue; + this.description = argument.description; + this.help = argument.help; + this.min = argument.min; + this.max = argument.max; +} + +/* +A method descriptor that records available method data in such a way that it can +be JSON encoded. + +:param method: The method description object from ExtendScript's Reflection + interface. +*/ +function MethodDescriptor(method) { + this.dataType = method.dataType; + this.defaultValue = method.defaultValue; + this.description = method.description; + this.help = method.help; + this.arguments = []; + + if (method.arguments != undefined) { + for (i in method.arguments) { + argument = method.arguments[i]; + this.arguments.push(new ArgumentDescriptor(argument)); + } + } + + this.name = method.name; + register_object(this, method); +} + +/* +A javascript object wrapper. Using ExtendScript's Reflection interface, the +object will be introspected and all relevant data recorded in the ObjectWrapper +in such a way that it can be JSON encoded. + +:param obj: The concrete object to wrap. +*/ +function ObjectWrapper(obj) { + this.description = obj.reflect.description; + this.help = obj.reflect.help; + this.instanceof = obj.constructor.name; + this.properties = []; + this.methods = {}; + + for (i in obj.reflect.properties) { + prop = obj.reflect.properties[i]; + this.properties.push(prop.name); + } + + for (i in obj.reflect.methods) { + method_info = obj.reflect.methods[i]; + this.methods[method_info.name] = new MethodDescriptor(method_info); + } + + this.name = obj.name; + register_object(this, obj); +} + +/* +A javascript function wrapper. Using ExtendScript's Reflection interface, the +function will be introspected and all relevant data recorded in the +FunctionWrapper in such a way that it can be JSON encoded. + +:param func: The function to wrap. +:param name: The name of the function as defined in the global scope. +*/ +function FunctionWrapper(func, name) { + this.description = ""; + this.help = ""; + this.instanceof = "Function"; + this.properties = []; + this.methods = {}; + this.arguments = []; + + if (func.arguments != undefined) { + for (i in func.arguments) { + argument = func.arguments[i]; + this.arguments.push(new ArgumentDescriptor(argument)); + } + } + + this.name = name; + register_object(this, func); +} + +/* +An enumerator object wrapper. Enumerators in ExtendScript are special and cannot +be introspected in the way that other objects can be via ExtendScript's +Reflection interface. As a result, the enumerator is wrapped minimally in such +a way that it can be JSON encoded. + +:param enumerator: The enumerator object to wrap. +:param name: The name of the enumerator as defined in the global scope. +*/ +function EnumeratorWrapper(enumerator, name) { + this.name = name; + this.description = ""; + this.help = ""; + this.instanceof = "Enumerator"; + this.properties = []; + this.methods = {}; + + register_object(this, enumerator); +} + +/* +Creates an instance of the class of the given name. + +:param class_name: The name of the class as defined in the global scope. +*/ +function rpc_new(class_name) { + // TODO: Need to figure out how to expand arguments for object + // construction in ECMA3. Sadly, tricks from more modern JS do + // not work here. Right now we only support no-argument + // construction. + var obj = new this[class_name]; + return JSON.stringify(wrap_item(obj, obj.reflect.name)); +} + +/* +Gets the value of the property of the given name as defined on the concrete +object identified by the given unique id. + +:param uid: The unique id of the concrete object. +:param name: The name of the property to get the value of. +*/ +function rpc_get(uid, name) { + var obj = __OBJECT_REGISTRY[uid]; + var value = obj[name]; + + return JSON.stringify(wrap_item(value, name)); +} + +/* +Gets the value at the given index of the concrete object identified by the given +unique id. + +:param uid: The unique id of the concrete object. +:param index: The index number to get the value of. +*/ +function rpc_get_index(uid, index) { + var obj = __OBJECT_REGISTRY[uid]; + var value = obj[index]; + + return JSON.stringify(wrap_item(value, index)); +} + +/* +Sets the property of the given name on the concrete object, identified by the +given unique id, to the given value. + +:param uid: The unique id of the concrete object. +:param name: The name of the property to set. +:param value: The value to set the property to. +*/ +function rpc_set(uid, name, value) { + var obj = __OBJECT_REGISTRY[uid]; + var value = value; + + if (is_wrapper(value)) { + value = __OBJECT_REGISTRY[value['__uniqueid']]; + } + + obj[name] = value; +} + +/* +Calls the given callable as identified by the given unique id. Parameters given +will be prepared for use in the local runtime using prepare_arguments() and then +passed on to the callable at call time. If a bound_parent_uid is given, the +callable will be call as a method of the concrete object that it identifies. If +the bound_parent_id is undefined, the callable will be called as if it were +defined as a function in the global scope. + +:param uid: The unique id of the concrete callable object. +:param params: The list of arguments to provide the callable when it is called. +:param bound_parent_uid: The parent concrete object, if any, of the callable. +*/ +function rpc_call(uid, params, bound_parent_uid) { + var obj = __OBJECT_REGISTRY[uid]; + var wrapper = __WRAPPER_REGISTRY[uid]; + var result; + var args = prepare_arguments(params); + + if (bound_parent_uid != undefined && bound_parent_uid != -1) { + var parent = __OBJECT_REGISTRY[bound_parent_uid]; + result = parent[wrapper.name].apply(parent, args); + } + else { + result = this[wrapper.name].apply(this, args); + } + + if (result != undefined) { + return JSON.stringify(wrap_item(result, result.reflect.name)); + } + else { + return; + } +} + +/* +Wraps the given concrete object according to its type. If a name is given, that +name will be passed to the wrapper class during instantiation in order to be +recorded in the resulting wrapper object. + +:param item: The concrete object to wrap. +:param name: The name of the object, if any. +*/ +function wrap_item(item, name) { + if (item instanceof Array) { + var wrappers = []; + + for (i in item) { + wrappers.push(wrap_item(item[i], item[i].reflect.name)); + } + + return wrappers; + } + else { + if (typeof item == 'function') { + return new FunctionWrapper(item, name); + } + else if (typeof item != 'object') { + return item; + } + else { + try { + return new ObjectWrapper(item); + } + catch(e) { + if (e == "Error: Invalid enumeration value") { + return new EnumeratorWrapper(item, name); + } + else { + return new EnumeratorWrapper(item, name); + } + } + } + } +} + +/* +Introspects the global scope and wraps all objects, functions, variables, +enumerators, and classes found. These wrappers are registered using +register_object(), stored in a container object by name, and then JSON encoded +before being returned as a string. +*/ +function map_global_scope() { + if (__GLOBAL_SCOPE_WRAPPERS != undefined) { + return JSON.stringify(__GLOBAL_SCOPE_WRAPPERS); + } + + var variables = this.reflect.properties; + var functions = this.reflect.methods; + var wrappers = {}; + + for (i in variables) { + var var_name = variables[i].name; + var variable = this[var_name]; + + if (variable != undefined) { + wrappers[var_name] = wrap_item(variable, var_name); + } + } + + for (i in functions) { + var func_name = functions[i].name; + var func = this[functions[i].name]; + + if (func != undefined) { + wrappers[func_name] = wrap_item(func, func_name); + } + } + + // Some things don't end up in the scope's reflection interface + // for whatever reason. We'll have to force them into the scope + // wrapper list ourselves. + var add_items = ["stringIDToTypeID", "charIDToTypeID", "executeAction"]; + + for (i in add_items) { + var item_name = add_items[i]; + var item = this[item_name]; + + if (item != undefined) { + wrappers[item_name] = wrap_item(item, item_name); + } + } + + // The dollar ($) object also needs to be passed over. We're going + // to replace the special character with the name "dollar" as that + // is how the object is referred to in ExtendScript docs from Adobe. + wrappers["dollar"] = wrap_item($, "dollar"); + + __GLOBAL_SCOPE_WRAPPERS = wrappers; + return JSON.stringify(wrappers); +} + + diff --git a/cep/js/shotgun/constants.js b/cep/js/shotgun/constants.js new file mode 100644 index 0000000..7471779 --- /dev/null +++ b/cep/js/shotgun/constants.js @@ -0,0 +1,85 @@ +// Copyright (c) 2016 Shotgun Software Inc. +// +// CONFIDENTIAL AND PROPRIETARY +// +// This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +// Source Code License included in this distribution package. See LICENSE. +// By accessing, using, copying or modifying this work you indicate your +// agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +// not expressly granted therein are reserved by Shotgun Software Inc. + +"use strict"; + +var sg_constants = sg_constants || {}; + +// information identifying each of the sg extensions running +sg_constants.extension_info = { + + manager: { + id: "com.sg.basic.adobe.manager" + }, + + panel: { + id: "com.sg.basic.adobe.panel" + } +}; + +// debug console urls. the ports should correspond to the ports defined in +// the extension's .debug file for the supported CC applications. +sg_constants.product_info = { + + // ---- key'd on app id which is what we have access to in the extensions + + // tk_engine_name: translates the app id (like "PHSP") to the expected + // engine block name (like "tk-photoshop") in a tk configuration. + + // Photoshop + PHSP: { + display_name: "Photoshop", + tk_engine_name: "tk-photoshopcc", + debug_url: "http://localhost:45216" + }, + + // Photoshop alt + PHXS: { + display_name: "Photoshop", + tk_engine_name: "tk-photoshopcc", + debug_url: "http://localhost:45217" + } + + // NOTE: the debug ports are defined in .debug file at the top level of the + // plugin. +}; + +// This is simply a lookup of panel div ids. The keys of this should never +// change. The values should always match the div ids in panel.html. +sg_constants.panel_div_ids = { + error: "sg_status_error", + warning: "sg_status_warning", + header: "sg_panel_header", + contents: "sg_panel_contents", + command_help: "sg_panel_command_help", + footer: "sg_panel_footer", + progress: "sg_progress", + progress_bar: "sg_progress_bar", + info: "sg_status_info", + console: "sg_panel_console", + console_log: "sg_panel_console_log" +}; + +// Error codes to identify why the python process was shut down +sg_constants.python_error_codes = { + EXIT_STATUS_CLEAN: 0, + EXIT_STATUS_ERROR: 100, + EXIT_STATUS_NO_PYSIDE: 101, + EXIT_STATUS_PYTHON_FAIL: 102 +}; + +// External link to pyside docs +sg_constants.pyside_url = "https://wiki.qt.io/PySide"; + +// Environment variable pointing to the root folder of this framework. +// This needs to be set in the bootstrap.py of the engines using this framework +sg_constants.framework_adobe_env_var = "SHOTGUN_ADOBE_FRAMEWORK_LOCATION" + + diff --git a/cep/js/shotgun/events.js b/cep/js/shotgun/events.js new file mode 100644 index 0000000..e61c21a --- /dev/null +++ b/cep/js/shotgun/events.js @@ -0,0 +1,94 @@ +// Copyright (c) 2016 Shotgun Software Inc. +// +// CONFIDENTIAL AND PROPRIETARY +// +// This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +// Source Code License included in this distribution package. See LICENSE. +// By accessing, using, copying or modifying this work you indicate your +// agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +// not expressly granted therein are reserved by Shotgun Software Inc. + +"use strict"; + +var sg_event = sg_event || {}; + +const _cs_interface = new CSInterface(); + +// namespace for app events +const _event_namespace = "com.sg.basic.adobe.events"; + + +// ---- Functions + +sg_event.create_event = function(namespace, event_name) { + // Creates an event and adds + namespace[event_name] = + new sg_event.Event(_event_namespace + "." + event_name); +}; + +// ---- Event Object + +sg_event.Event = function(event_type) { + // Convenience object that allows for connecting to and emitting events + this.event_type = event_type; +}; + +// Convenience wrapper for sending application events. +// +// Args: +// data: data to send along with the event. for use by listeners +sg_event.Event.prototype.emit = function(data) { + + // allow emission with no data. just populate with null + data = data || null; + + // create an event instance by populating the type and data supplied + // as well as the scope, app id, and extension id. + var event = new CSEvent( + this.event_type, + "APPLICATION", + _cs_interface.getApplicationID(), + _cs_interface.getExtensionID() + ); + + // serialize the data within an object so that we know the type of data. + // when the event is heard on the other end, we know to parse it and + // access the actual data. use encodeURIComponent to prevent parsing + // problems on the other end when unexpected characters are encountered. + event.data = encodeURIComponent( + JSON.stringify({data: data}) + ); + + _cs_interface.dispatchEvent(event); +}; + +// Convenience wrapper for listening to application events. +// +// Args: +// callback: the method to call when the event is heard +// +// Callbacks should take a single argument which is the event object +// itself. +sg_event.Event.prototype.connect = function(callback) { + + // listen for shutdown requests from panel + _cs_interface.addEventListener( + this.event_type, + function(event) { + + // deserialize the event data and extract the actual data. + // We decode the serialized string to counter the encoding done + // when the event was sent. This prevents errors when parsing + // special characters. + try { + event.data = JSON.parse(decodeURIComponent(event.data)).data; + } catch(error) { + event.data = null; + } + + callback(event); + } + ); +}; + + diff --git a/cep/js/shotgun/logging.js b/cep/js/shotgun/logging.js new file mode 100644 index 0000000..74fbd06 --- /dev/null +++ b/cep/js/shotgun/logging.js @@ -0,0 +1,81 @@ +// Copyright (c) 2016 Shotgun Software Inc. +// +// CONFIDENTIAL AND PROPRIETARY +// +// This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +// Source Code License included in this distribution package. See LICENSE. +// By accessing, using, copying or modifying this work you indicate your +// agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +// not expressly granted therein are reserved by Shotgun Software Inc. + +"use strict"; + +// Each of the extensions (panel & manager) will use this interface, and each +// will emit log messages. The panel will be connected to these log messages and +// react to both sources. This allows all logging from python (via the manager) +// and the panel to end up in one destination. In addition, logging messages +// that don't originate from python will be forwarded back to the python +// process. + +// namespace +var sg_logging = sg_logging || {}; + +// ---- Events + +// sent from non-panel extensions and received by the panel to log to the +// console available via the panel's flyout menu +sg_event.create_event(sg_logging, "LOG_MESSAGE"); + +// ---- Interface + +// The rpc interface will be assigned by the manager once +// the server has been spun up. +sg_logging.rpc = undefined; + +sg_logging._get_logger_by_level = function(level, send_to_rpc) { + return function(message) { + sg_logging._log(level, message, send_to_rpc); + }; +}; + +sg_logging._log_rpc = function(level, message) { + if ( sg_logging.rpc !== undefined ) { + sg_logging.rpc.rpc_log(level, message); + } +}; + +sg_logging._log = function(level, message, send_to_rpc) { + // Attempt to send the log message to the socket.io server to + // be emitted to clients. + if ( send_to_rpc && sg_logging.rpc !== undefined ) { + sg_logging._log_rpc(level, message); + } + + // the log messages with level "python" could be comprised of multiple + // log messages because of stdout buffering. submit each + if (level == "python") { + var messages = message.split("\n"); + } else { + var messages = [message]; + } + + messages.forEach(function(message) { + // send a log message. this should be received and processed by the + // panel extension. that's where the user will have access to the + // flyout menu where they can click and go to the console. + sg_logging.LOG_MESSAGE.emit({ + level: level, + message: message, + from_python: !send_to_rpc + }); + }); +}; + +sg_logging.debug = sg_logging._get_logger_by_level("debug", true); +sg_logging.info = sg_logging._get_logger_by_level("info", true); +sg_logging.log = sg_logging._get_logger_by_level("log", true); +sg_logging.warn = sg_logging._get_logger_by_level("warn", true); +sg_logging.error = sg_logging._get_logger_by_level("error", true); + +// for log messages coming from python (not sent back via rpc) +sg_logging.python = sg_logging._get_logger_by_level("python", false); diff --git a/cep/js/shotgun/manager.js b/cep/js/shotgun/manager.js new file mode 100644 index 0000000..5013dea --- /dev/null +++ b/cep/js/shotgun/manager.js @@ -0,0 +1,577 @@ +// Copyright (c) 2016 Shotgun Software Inc. +// +// CONFIDENTIAL AND PROPRIETARY +// +// This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +// Source Code License included in this distribution package. See LICENSE. +// By accessing, using, copying or modifying this work you indicate your +// agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +// not expressly granted therein are reserved by Shotgun Software Inc. + +"use strict"; + +// namespace +var sg_manager = sg_manager || {}; + +// A singleton "class" to manage the Shotgun integration layers +// * python bootstrap +// * communication with the panel +// * communication with adobe api (extendscript) via socket.io +sg_manager.Manager = new function() { + + // ---- public data members + + // the port we'll be communicating over + this.communication_port = undefined; + + // ---- private + + // adobe interface + const _cs_interface = new CSInterface(); + + // remember if/why python was disconnected + var __python_disconnected = false; + var __python_disconnected_error = undefined; + + // remember if pyside was unavailable + var __pyside_unavailable = false; + + // keep track of the active document + var __active_document = undefined; + + // ---- public methods + + // Setup the Shotgun integration within the app. + this.on_load = function() { + + // Execute the startup payload and catch *any* errors. If there are + // errors, display them in the panel if possible. + try { + + // ensure this app is supported by our extension + if (!_app_is_supported()) { + _emit_python_critical_error({ + message: "This CC product does not meet the minimum " + + "requirements to run the Shotgun integration. The " + + "Shotgun integration requires support for HTML " + + "panels and the extended panel menu.", + stack: undefined + }); + return; + } + + // setup event listeners so that we can react to messages as they + // come in. + _setup_event_listeners(); + + const manager_ext_id = sg_constants.extension_info["manager"]["id"]; + const panel_ext_id = sg_constants.extension_info["panel"]["id"]; + + // start up the panel in the adobe product first. we can display + // messages and information to the user while functions below are + // running + sg_logging.debug("Launching the panel extension..."); + _cs_interface.requestOpenExtension(panel_ext_id); + + // Look for an open port to use for the server. Once a port has been + // found, this method will directly call the supplied callback + // method to start up the server and then bootstrap python. + _get_open_port(_on_server_port_found); + + // log info about the loaded extensions + const extensions = _cs_interface.getExtensions( + [panel_ext_id, manager_ext_id]); + + if (extensions.length > 0) { + sg_logging.debug("Loaded extensions:"); + extensions.forEach(function(ext) { + sg_logging.debug( + "--------------------------------------\n" + + ` name: ${ext.name}\n` + + ` id: ${ext.id}\n` + + `mainPath: ${ext.mainPath}\n` + + `basePath: ${ext.basePath}\n` + ); + }); + } + + // log the os information + sg_logging.debug("OS information: " + _cs_interface.getOSInformation()); + + // log the cep api version: + const api_version = _cs_interface.getCurrentApiVersion(); + sg_logging.debug("CEP API Version: " + + api_version.major + "." + + api_version.minor + "." + + api_version.micro + ); + + } catch (error) { + + const error_lines = error.stack.split(/\r?\n/); + const stack_err_msg = error_lines[0]; + + const message = "There was an unexpected error during startup of " + + "the Adobe Shotgun integration:

    " + stack_err_msg; + + // log the error in the event that the panel has started and the + // user can click the console + sg_logging.error(message); + sg_logging.error(error.stack); + + // emit the critical error for any listeners to display + _emit_python_critical_error({ + message: message, + stack: error.stack + }); + + // There are no guarantees that the panel has started up, and + // therefore no guarantees that the user has easy access to the + // debug console. Go ahead and display an old school alert box here + // to ensure that they get something. This may look like crap. + alert(message + "\n\n" + error.stack); + } + }; + + // Code to run when the manager extension is unloaded + this.on_unload = function() { + + // This callback never seems to run. This could be because this is an + // "invisible" extension, but it seems like even regular panels never + // have their page "unload" callbacks called. Leaving this here for now + // in the event that this becomes called at some point in the future. + this.shutdown(); + }; + + // Ensure all the manager's components are shutdown properly + // + // Also emits an event for listeners to respond to manager shutdown. + this.shutdown = function() { + + // alert listeners that the manager is shutting down + sg_manager.SHUTTING_DOWN.emit(); + + // ensure the python process is shut down + if (typeof this.python_process !== "undefined") { + sg_logging.debug("Terminating python process..."); + try { + this.python_process.kill(); + sg_logging.debug("Python process terminated successfully."); + } catch(error) { + sg_logging.warning( + "Unable to terminate python process: " + error.stack); + } + } + + // shut down socket.io server + sg_socket_io.SocketManager.stop_socket_server(); + }; + + // ---- private methods + + // Tests whether the extension can run with the current application + const _app_is_supported = function() { + + // supported if the panel menu and html extensions are available + const host_capabilities = _cs_interface.getHostCapabilities(); + return host_capabilities.EXTENDED_PANEL_MENU && + host_capabilities.SUPPORT_HTML_EXTENSIONS; + }; + + const _active_document_check = function(event) { + _cs_interface.evalScript( + // NOTE: Hopefully this is the same across all Adobe CC + // products. If it isn't, then we'll likely want to make + // a manager method that abstracts it away and returns + // the active document after checking which DCC we're in. + // + // UPDATE: It's not the same, at least not for AE. In that + // case you look up the current project and get the path + // from that. This is going to need to be abstracted + // somehow when we break this out of being PS only. + "app.activeDocument.fullName.fsName", + function(result) { + // If the above command fails, then it's because the + // active document is an unsaved file. + if ( result == "EvalScript error." ) { + // If we previously had a path stored and we're in + // this undefined state, then we've switched from a + // saved document to one that isn't and we still + // need to alert clients. + if ( __active_document !== undefined ) { + sg_logging.debug("Active document changed to undefined"); + __active_document = undefined; + sg_socket_io.rpc_active_document_changed(""); + } + } + else { + // If it's changed, then alert clients. + if ( __active_document !== result ) { + sg_logging.debug("Active document changed to " + result); + __active_document = result; + sg_socket_io.rpc_active_document_changed(result); + } + } + } + ); + }; + + // Bootstrap the toolkit python process. + // + // Returns a `child_process.ChildProcess` object for the running + // python process with a bootstrapped toolkit core. + const _bootstrap_python = function(framework_folder, port) { + + const child_process = require("child_process"); + const path = require("path"); + + const app_id = _cs_interface.hostEnvironment.appId; + const engine_name = sg_constants.product_info[app_id].tk_engine_name; + + // The path to this extension. We're also replacing any encoded + // $ characters that might be returned with a literal $. On + // Windows we're seeing the CS interface returning system paths + // without having $ decoded. This becomes a problem when there's + // a $ in the path, like when using roaming user profiles on + // a Windows network. + const ext_dir = framework_folder.replace("%24", "$"); + + // path to the python folder within the extension + const plugin_python_path = path.join(ext_dir, "python"); + + // get a copy of the current environment and append to PYTHONPATH. + // we need to append the plugin's python path so that it can locate the + // manifest and other files necessary for the bootstrap. + if (process.env.PYTHONPATH) { + // append the plugin's python path to the existing env var + process.env.PYTHONPATH += path.delimiter + plugin_python_path; + } else { + // no PYTHONPATH set. set it to the plugin python path + process.env.PYTHONPATH = plugin_python_path; + } + + // Set the port in the environment. The engine will use this when + // establishing a socket client connection. + process.env.SHOTGUN_ADOBE_PORT = port; + + // get the bootstrap python script from the bootstrap python dir + const plugin_bootstrap_py = path.join(plugin_python_path, + "plugin_bootstrap.py"); + + sg_logging.debug("Bootstrapping: " + plugin_bootstrap_py); + + // launch a separate process to bootstrap python with toolkit running... + // > cd $ext_dir + // > python /path/to/ext/bootstrap.py + + // use the system installed python + var python_exe_path = "python"; + + if (process.env.SHOTGUN_ADOBE_PYTHON) { + // use the python specified in the environment if it exists + sg_logging.info("Using python executable set in environment variable 'SHOTGUN_ADOBE_PYTHON'."); + python_exe_path = process.env.SHOTGUN_ADOBE_PYTHON; + } + + sg_logging.debug("Spawning child process... "); + sg_logging.debug("Python executable: " + python_exe_path); + sg_logging.debug("Current working directory: " + plugin_python_path); + sg_logging.debug("Executing command: " + + [ + python_exe_path, + plugin_bootstrap_py, + port, + engine_name, + app_id + ].join(" ") + ); + + try { + this.python_process = child_process.spawn( + python_exe_path, + [ + // path to the python bootstrap script + plugin_bootstrap_py, + port, + engine_name, + app_id + ], + { + // start the process from this dir + cwd: plugin_python_path, + // the environment to use for bootstrapping + env: process.env + } + ); + } + catch (error) { + sg_logging.error("Child process failed to spawn: " + error); + throw error; + } + + this.python_process.on("error", function(error) { + sg_logging.error("Python process error: " + error); + }); + + // log stdout from python process + this.python_process.stdout.on("data", function(data) { + sg_logging.python(data.toString()); + }); + + // log stderr from python process + this.python_process.stderr.on("data", function(data) { + sg_logging.python(data.toString()); + }); + + // handle python process disconnection + this.python_process.on("close", _handle_python_close); + + }.bind(this); + + // Python should never be shut down by anything other than the manager. + // So if we're here, something caused it to exit early. Handle any known + // status codes accordingly. + const _handle_python_close = function(code, signal) { + + const error_codes = sg_constants.python_error_codes; + + if (code == error_codes.EXIT_STATUS_NO_PYSIDE) { + // Special case, PySide does not appear to be installed. + __pyside_unavailable = true; + __python_disconnected = true; + sg_logging.error("Python exited because PySide is unavailable."); + sg_manager.PYSIDE_NOT_AVAILABLE.emit(); + } else { + // Fallback case where we don't know why it shut down. + sg_logging.error("Python exited unexpectedly."); + _emit_python_critical_error({ + message: "The Shotgun integration has unexpectedly shut " + + "down. Specifically, the python process that " + + "handles the communication with Shotgun has " + + "been terminated.", + stack: undefined + }); + } + }; + + // Find an open port and send it to the supplied callback + const _get_open_port = function(port_found_callback) { + + // https://nodejs.org/api/http.html#http_class_http_server + const http = require('http'); + + // keep track of how many times we've tried to find an open port + var num_tries = 0; + + // the number of times to try to find an open port + const max_tries = 25; + + // function to try a port. recurses until a port is found or the max + // try limit is reached. + const _try_port = function() { + + ++num_tries; + + // double checking whether we need to continue here. this should + // prevent this method from being called after a suitable port has + // been identified. + if (typeof this.communication_port !== "undefined") { + // the port is defined. no need to continue + return; + } + + // check the current number of tries. if too many, emit a signal + // indicating that a port could not be found + if (num_tries > max_tries) { + _emit_python_critical_error({ + message: "Unable to set up the communication server that " + + "allows the shotgun integration to work. " + + "Specifically, there was a problem identifying " + + "a port to start up the server.", + stack: undefined + }); + return; + } + + // our method to find an open port seems a bit hacky, and not + // entirely failsafe, but hopefully good enough. if you're reading + // this and know a better way to get an open port, please make + // changes. + + // the logic here is to create an http server, and provide 0 to + // listen(). the OS will provide a random port number. it is *NOT* + // guaranteed to be an open port, so we wait until the listening + // event is fired before presuming it can be used. we close the + // server before proceeding and there's no guarantee that some other + // process won't start using it before our communication server is + // started up. + const server = http.createServer(); + + // if we can listen to the port then we're using it and nobody else + // is. close out and forward the port on for use by the + // communication server + server.on( + "listening", + function() { + // listening, so the port is available + this.communication_port = server.address().port; + server.close(); + }.bind(this) + ); + + // if we get an error, we presume that the port is already in use. + server.on( + "error", + function(error) { + const port = server.address().port; + sg_logging.debug("Could not listen on port: " + port); + // will close after this event + } + ); + + // when the server is closed, check to see if we got a port number. + // if so, call the callback. if not, try again + server.on( + "close", + function() { + if (this.communication_port !== undefined) { + // the port is defined. no need to continue + const port = this.communication_port; + sg_logging.debug("Found available port: " + port); + try { + port_found_callback(port); + } catch(error) { + _emit_python_critical_error({ + message: "Unable to set up the communication " + + "server that allows the shotgun " + + "integration to work.", + stack: error.stack + }); + } + } else { + // still no port. try again + _try_port(); + } + }.bind(this) + ); + + // now that we've setup the event callbacks, tell the server to + // listen to a port assigned by the OS. + server.listen(0); + }.bind(this); + + // fake error message to test startup fail. good for debugging. + //var error = new Error(); + //error.message = "This is a fake fail!!! Thrown manually to force an error!"; + //Error.captureStackTrace(error); + //throw error; + + // initiate the port finding + _try_port(); + }.bind(this); + + // Callback for when an open port is found. + const _on_server_port_found = function(port) { + + sg_socket_io.SocketManager.start_socket_server(port, _cs_interface); + + // Register the socket manager for logging. + sg_logging.rpc = sg_socket_io; + + // bootstrap the python process. + function __tmp_bootstrap_python(result){ + if (!result) + { + console.log("Variable " + sg_constants.framework_adobe_env_var + "is not set. Please edit the bootstrap.py of your engine implementation."); + return false; + } + _bootstrap_python(result, port); + return true; + } + _cs_interface.evalScript("$.getenv('" + sg_constants.framework_adobe_env_var + "')", __tmp_bootstrap_python); + }; + + // Reloads the manager + const _reload = function(event) { + + sg_logging.debug("Reloading the manager..."); + + // shutdown the python process + this.shutdown(); + + // remember this extension id to reload it + const extension_id = _cs_interface.getExtensionID(); + + // close the extension + sg_logging.debug(" Closing the python extension."); + _cs_interface.closeExtension(); + + // request relaunch + sg_logging.debug(" Relaunching the manager..."); + _cs_interface.requestOpenExtension(extension_id); + + }.bind(this); + + // Setup listeners for any events that need to be processed by the manager + const _setup_event_listeners = function() { + + sg_logging.debug("Setting up event listeners..."); + + // ---- Events from the panel + sg_panel.REQUEST_MANAGER_RELOAD.connect(_reload); + + // Handle python process disconnected + sg_panel.REGISTERED_COMMAND_TRIGGERED.connect( + function(event) { + sg_logging.debug("Registered Command Triggered: " + event.data); + sg_socket_io.rpc_command(event.data); + } + ); + + // Handle requests for test running. + sg_panel.RUN_TESTS.connect( + function(event) { + sg_logging.debug("Requesting that tk_photoshopcc run tests..."); + sg_socket_io.rpc_run_tests(); + } + ); + + sg_panel.REQUEST_STATE.connect( + function() { + sg_logging.debug("State requested."); + if (__python_disconnected) { + if (__pyside_unavailable) { + sg_manager.PYSIDE_NOT_AVAILABLE.emit(); + } else { + _emit_python_critical_error(__python_disconnected_error); + } + } else { + sg_logging.debug("Awaiting new state from Python..."); + sg_socket_io.rpc_state_requested(); + } + } + ); + + // Keep an eye on the active document. + // + // NOTE: A useful answer from an Adobe employee in the below: + // https://forums.adobe.com/thread/1380138# + // + sg_logging.debug("Registering documentAfterActivate event..."); + _cs_interface.addEventListener( + 'documentAfterActivate', + _active_document_check + ); + + sg_logging.debug("Event listeners created."); + }; + + // Wrapper to emit the python critical error for listeners + const _emit_python_critical_error = function(error) { + __python_disconnected = true; + __python_disconnected_error = error; + sg_manager.CRITICAL_ERROR.emit(error); + }; + +}; + diff --git a/cep/js/shotgun/manager_events.js b/cep/js/shotgun/manager_events.js new file mode 100644 index 0000000..c3facdd --- /dev/null +++ b/cep/js/shotgun/manager_events.js @@ -0,0 +1,51 @@ +// Copyright (c) 2016 Shotgun Software Inc. +// +// CONFIDENTIAL AND PROPRIETARY +// +// This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +// Source Code License included in this distribution package. See LICENSE. +// By accessing, using, copying or modifying this work you indicate your +// agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +// not expressly granted therein are reserved by Shotgun Software Inc. + +"use strict"; + +// namespace +var sg_manager = sg_manager || {}; + +// typically as an async response to a REQUEST_STATE event from the panel +sg_event.create_event(sg_manager, "UPDATE_COMMANDS"); + +// typically as an async response to a REQUEST_STATE event from the panel +sg_event.create_event(sg_manager, "UPDATE_CONTEXT_DISPLAY"); + +// typically as an async response to a REQUEST_STATE event from the panel +sg_event.create_event(sg_manager, "UPDATE_CONTEXT_THUMBNAIL"); + +// provides the toolkit log file path for display in panel +sg_event.create_event(sg_manager, "UPDATE_LOG_FILE_PATH"); + +// sent when the python side cannot determine a context for the current document +sg_event.create_event(sg_manager, "UNKNOWN_CONTEXT"); + +// sent just before a context change from python +sg_event.create_event(sg_manager, "CONTEXT_ABOUT_TO_CHANGE"); + +// emits critical errors whereby the manager is not or can not function +// properly. the emitted event will contain a dictionary of the following form: +// +// { +// message: +// stack: +// } +// +// this event is only emitted when something happens that prevents the manager +// from continuing to function properly. +sg_event.create_event(sg_manager, "CRITICAL_ERROR"); + +// this event emitted when the python process cannot bootstrap due to pyside +// not being installed +sg_event.create_event(sg_manager, "PYSIDE_NOT_AVAILABLE"); + +// emitted when the manager is shutting down. allows listeners to act accordingly +sg_event.create_event(sg_manager, "SHUTTING_DOWN"); diff --git a/cep/js/shotgun/panel.js b/cep/js/shotgun/panel.js new file mode 100644 index 0000000..e53c3fb --- /dev/null +++ b/cep/js/shotgun/panel.js @@ -0,0 +1,1176 @@ +// Copyright (c) 2016 Shotgun Software Inc. +// +// CONFIDENTIAL AND PROPRIETARY +// +// This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +// Source Code License included in this distribution package. See LICENSE. +// By accessing, using, copying or modifying this work you indicate your +// agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +// not expressly granted therein are reserved by Shotgun Software Inc. + +"use strict"; + +// namespace. not to be confused with the Shotgun Panel app. +var sg_panel = sg_panel || {}; + +// --------------------------------------------------------------------------- +// The panel + +// A singleton "class" to manage the state of the extension's panel display. +sg_panel.Panel = new function() { + + // ---- private vars + + // adobe interface + const _cs_interface = new CSInterface(); + + // keep track of timeout ids for showing and hiding tooltips. these will be + // used over and over during session. + var _show_tooltip_timeout_id = undefined; + var _hide_tooltip_timeout_id = undefined; + + // we keep track of mouse position to make tooltips easier to manage + var _cur_mouse_pos = { + x: undefined, + y: undefined + }; + + // when context menu items are triggered this will be our lookup to know + // what we need to do + var _context_menu_lookup = {}; + + // tells us whether the thumbnail data has already been retrieved for the + // current context. + var _context_thumbnail_data = undefined; + + var _previous_log_level = "debug"; + + var _log_file_path = undefined; + + // ---- public methods + + this.clear = function() { + // clears any state for the current context. + + _context_thumbnail_data = undefined; + _build_flyout_menu([]); + _clear_messages(); + }; + + // Clears the panel's contents and resets it to the loading state. + this.set_panel_loading_state = function() { + + this.clear(); + + _set_bg_color("#222222"); + + _show_header(false); + _set_contents( + ""); + + _show_info(true); + _set_info( + "Loading Shotgun Integration..." + ); + }; + + // Clears the panel's contents and displays a message that it is disabled + this.set_unknown_context_state = function() { + + this.clear(); + + _set_bg_color("#222222"); + + _show_header(false); + _clear_messages(); + + var app_name = _cs_interface.getHostEnvironment().appName; + const app_display_name = sg_constants.product_info[app_name].display_name; + + _set_contents( + ` + + + + +
    + + + + + + + + + +
    + Integration Disabled +
    + The currently active file can't be associated with a + Shotgun context. Try switching to another file or + restarting ${app_display_name}. +
    +
    ` + ); + + }; + + // Clears the current context and displays it as loading a new one. + this.set_context_loading_state = function() { + + this.clear(); + + _set_bg_color("#4D4D4D"); + + var header_html = `
    +
    + +
    +
    + Loading context... +
    + +
    `; + + _set_header(header_html); + _show_header(true); + + var contents_html = "Loading commands..."; + + _set_contents(contents_html); + _show_contents(true); + _clear_messages(); + }; + + // Need to display a tooltip with the supplied info + this.show_command_help = function(title, help, favorite) { + + // clear any existing tooltip hide timeout so that it doesn't disappear + // prematurely + if (_hide_tooltip_timeout_id !== undefined) { + clearTimeout(_hide_tooltip_timeout_id); + } + + // slight delay to mimic typical tooltip display + _show_tooltip_timeout_id = setTimeout( + function(){_on_show_command_help_timeout(help)}, 1500); + + // update the text in the favorite header with this command's title + if (favorite) { + const fav_header_div = document.getElementById("sg_panel_favorites_header"); + fav_header_div.innerHTML = title; + } + }; + + // Need to hide the tooltip + this.hide_command_help = function() { + + // clear any existing timeouts for showing the tooltip. + if (_show_tooltip_timeout_id !== undefined) { + clearTimeout(_show_tooltip_timeout_id); + } + + // turn off the command help div + _show_command_help(false); + + // reset the favorite header text + const fav_header_div = document.getElementById("sg_panel_favorites_header"); + if (fav_header_div) { + fav_header_div.innerHTML = "Run a command"; + } + }; + + // Open an email in default email client. + this.email_support = function(subject, body) { + + const mailto_url = `mailto:support@shotgunsoftware.com?subject=${subject}&body=${body}`; + + sg_logging.debug("Emailing support: " + mailto_url); + + _clear_info(); + _set_progress_info(100, "Composing SG support email..."); + setTimeout(_clear_info, 2000); + + this.open_external_url(mailto_url); + }; + + // Setup the Shotgun integration within the app. + this.on_load = function() { + + try { + + // ensure the panel is in its loading state. + this.set_panel_loading_state(); + + // build the flyout menu. always do this first so we can have access + // to the debug console no matter what happens during bootstrap. + _build_flyout_menu([]); + + // Listen for the Flyout menu clicks + _cs_interface.addEventListener( + "com.adobe.csxs.events.flyoutMenuClicked", + _on_flyout_menu_clicked + ); + + // setup event listeners first so we can react to various events + _setup_event_listeners(); + + // If the current Adobe application is photoshop, turn on persistence. + // This isn't required, but provides a better user experience by not + // trying to reload the panel whenever it regains focus. + const photoshop_ids = ["PHSP", "PHXS"]; + if (photoshop_ids.indexOf(_cs_interface.getApplicationID()) > -1) { + sg_logging.debug("Making panel persistent."); + _make_persistent(true); + } + + // track the mouse + document.onmousemove = _on_mouse_move; + + } catch(error) { + sg_logging.error("Manager startup error: " + error.stack); + alert("Manager startup error: " + error.stack); + } + + // Here we send the "AppOnline" event strictly in the event of a manual + // reload/restart of the SG extension. For initial launch of PS, this + // will be a no-op since the manager will already be running. For the + // reload scenario, this is the jumpstart that the manager requires to + // start up. + const event_type = "com.adobe.csxs.events.AppOnline"; + var event = new CSEvent(event_type, "APPLICATION"); + event.extensionId = _cs_interface.getExtensionID(); + _cs_interface.dispatchEvent(event); + + }.bind(this); + + // Code to run when the extension panel is unloaded + this.on_unload = function() { + sg_logging.debug("Panel unloaded."); + }; + + // Open the supplied url in the default browser + this.open_external_url = function(url) { + sg_logging.debug("Opening external url: " + url); + _cs_interface.openURLInDefaultBrowser(url); + }; + + // Request reload of the manager. + // + // After requesting manager reload, simply shuts down this extension + // since the manager will restart it. + this.reload = function() { + + sg_logging.debug("Closing the panel."); + + // turn off persistence so we can close the panel + _make_persistent(false); + + // close the panel + this.on_unload(); + + // request manager reload and close the panel + sg_panel.REQUEST_MANAGER_RELOAD.emit(); + _cs_interface.closeExtension(); + }; + + // Copy selection to the clipboard + this.selection_to_clipboard = function() { + var selected_text = ""; + if (window.getSelection){ + selected_text = window.getSelection().toString() + } + + if (!selected_text) { + sg_logging.warn("Nothing selected to copy.") + } + + try{ + document.execCommand("copy"); + } catch(e){ + sg_logging.error(`Failed to copy selection to clipboard!\n${e}`); + } + }; + + // Select all the text within the provided div + this.select_text = function(div_id) { + + document.getElementById(div_id).focus(); + + if (document.selection) { + const range = document.body.createTextRange(); + range.moveToElementText(document.getElementById(div_id)); + range.select(); + } else if (window.getSelection) { + const range = document.createRange(); + range.selectNodeContents(document.getElementById(div_id)); + const selection = window.getSelection(); + selection.removeAllRanges(); + selection.addRange(range); + } + }; + + + // Given thumbnail from python, display it in the header + this.set_context_thumbnail = function(context_thumbnail_data) { + + sg_logging.debug("Setting thumbnail."); + + // keep the thumbnail data around in case this runs before the context + // fields display is returned + _context_thumbnail_data = context_thumbnail_data; + + const thumb_path = context_thumbnail_data["thumb_path"]; + const url = context_thumbnail_data["url"]; + + var thumb_html = `
    + + `; + + _set_div_html("context_thumbnail_data", thumb_html); + }; + + // Given context display from python, display it in the header. + this.set_context_display = function(context_display) { + + sg_logging.debug("Setting context."); + + var context_thumb = ""; + + // if we already have the thumbnail data, display that instead of the default + if (_context_thumbnail_data !== undefined) { + const thumb_path = _context_thumbnail_data["thumb_path"]; + context_thumb = ``; + } + + var header_html = `
    +
    + ${context_thumb} +
    +
    + ${context_display} +
    + +
    `; + + _set_header(header_html); + _show_header(true); + }; + + // Display the registered commands for the current context + this.set_commands = function(all_commands) { + + sg_logging.debug("Setting commands."); + + // Favorite commands + + const favorites = all_commands["favorites"]; + var favorites_html = ""; + + if (favorites.length > 0) { + + favorites_html = `
    +
    Run a command
    +
    `; + + // loop over favorites here + favorites.forEach(function(favorite) { + if (favorite.hasOwnProperty("uid") && + favorite.hasOwnProperty("display_name") && + favorite.hasOwnProperty("icon_path")) { + + const command_id = favorite["uid"]; + const display_name = favorite["display_name"]; + const icon_path = favorite["icon_path"]; + const description = favorite["description"]; + + favorites_html += + ` +
    +
    + +
    +
    +
    ` + } else { + sg_logging.warn("Favorite command missing required info: " + favorite); + } + }); + + favorites_html += "
    "; + } + + // Now process the non-favorite commands + + const commands = all_commands["commands"]; + var commands_html = ""; + + if (commands.length > 0) { + + commands_html = "
    "; + + commands.forEach(function(command) { + if (command.hasOwnProperty("uid") && + command.hasOwnProperty("display_name") && + command.hasOwnProperty("icon_path")) { + + const command_id = command["uid"]; + const display_name = command["display_name"]; + const icon_path = command["icon_path"]; + const description = command["description"]; + + commands_html += + ` +
    + + + + + + + + + + +
    + + + ${display_name} +
    +
    +
    `; + } else { + sg_logging.warn("Command missing required info: " + command); + } + }); + + commands_html += "
    "; + } + + _set_contents(favorites_html + commands_html); + _show_contents(true); + + // make sure the progress bar and info is hidden + _show_progress(false); + _show_info(false); + + // now build the context menu with the context menu commands + const context_menu_cmds = all_commands["context_menu_cmds"]; + _build_flyout_menu(context_menu_cmds); + + }; + + // Show or hide the console. + this.show_console = function(show) { + + const console_div_id = sg_constants.panel_div_ids["console"]; + const console_log_div_id = sg_constants.panel_div_ids["console_log"]; + + _show_div(console_div_id, show); + + if (show) { + _scroll_to_log_bottom(); + document.body.style.overflow = 'hidden'; + } else { + document.body.style.overflow = 'visible'; + } + }; + + // Emits the signal to launch the supplied command id. + // Also shows a tmp message to confirm user click + this.trigger_command = function(command_id, command_display) { + + // show the progress message temporarily + _set_info("Launching: " + command_display); + setTimeout(_clear_info, 2000); + + // trigger the command + sg_panel.REGISTERED_COMMAND_TRIGGERED.emit(command_id); + }; + + // ---- private methods + + // Builds the flyout menu with the debug/reload options. + const _build_flyout_menu = function(context_menu_cmds) { + + // clear the context menu lookup + _context_menu_lookup = {}; + + // the xml that defines the flyout menu + var flyout_xml = ""; + + context_menu_cmds.forEach(function(command) { + if (command.hasOwnProperty("uid") && + command.hasOwnProperty("display_name") && + command.hasOwnProperty("icon_path")) { + + const command_id = command["uid"]; + const display_name = command["display_name"]; + + _context_menu_lookup[command_id] = display_name; + + flyout_xml += + ''; + } + }); + + flyout_xml += ' \ + '; + + if (process.env.SHOTGUN_ADOBE_NETWORK_DEBUG || + process.env.SHOTGUN_ADOBE_TESTS_ROOT || + process.env.TK_DEBUG) { + + flyout_xml += ''; + + flyout_xml += ''; + } + + if (process.env.SHOTGUN_ADOBE_TESTS_ROOT) { + flyout_xml += ' ' + } + flyout_xml += ''; + + // build the menu + _cs_interface.setPanelFlyoutMenu(flyout_xml); + }; + + // Provides a way to make the panel persistent. + // + // Only valid for Photoshop. + const _make_persistent = function(persistent) { + + var event_type = persistent ? + 'com.adobe.PhotoshopPersistent' : + 'com.adobe.PhotoshopUnPersistent'; + + var event = new CSEvent(event_type, "APPLICATION"); + event.extensionId = _cs_interface.getExtensionID(); + _cs_interface.dispatchEvent(event); + }; + + // Handles flyout menu clicks + const _on_flyout_menu_clicked = function(event) { + + const cmd_id = event.data.menuId; + const cmd_name = event.data.menuName; + + switch (cmd_id) { + + // NOTE: Looks like you can't use `const` in the switch cases. + // The panel won't even load if you do. Perhaps some type of failed + // optimization when doing the menu callback? No obvious errors + // are displayed. Leaving this here as a warning. + + // debug console + case "sg_dev_debug": + sg_logging.debug("Opening debugger in default browser."); + var app_name = _cs_interface.getHostEnvironment().appName; + var debug_url = sg_constants.product_info[app_name].debug_url; + this.open_external_url(debug_url); + break; + + // reload extension + case "sg_dev_reload": + this.reload(); + break; + + // about the extension + case "sg_console": + this.show_console(true); + break; + + // run test suite + case "sg_dev_tests": + sg_logging.debug("Emitting RUN_TESTS panel event."); + sg_panel.RUN_TESTS.emit(); + break; + + default: + + // see if the command id matches one of the context menu ids + if (cmd_id in _context_menu_lookup) { + this.trigger_command(cmd_id, cmd_name); + + // can't determine what this is + } else { + sg_logging.warn( + "Unhandled menu event '" + cmd_name + "' clicked."); + } + } + }.bind(this); + + // Display critical error in the panel + const _on_critical_error = function(message, stack) { + + _set_bg_color("#222222"); + _clear_messages(); + + sg_logging.error("Critical: " + message); + + _show_header(false); + + var contents_html = `
    ${message}
    `; + + contents_html += + `
    + You can try link below to attempt a full restart of the Adobe integration. +

    +
    + + Restart Shotgun Integration + +
    +
    `; + + const subject = encodeURIComponent("Adobe Integration Error"); + const body = _format_email_error_message(message, stack); + + if (typeof stack !== "undefined") { + contents_html += + `
    + If you encounter this problem consistently or have any other + questions, please send the following error and a description + of the steps to reproduce the problem to + + support@shotgunsoftware.com + . +

    +
    +
    ${stack}
    +
    `; + } else { + contents_html += + `
    + If you encounter this problem consistently or have any other + questions, please send the steps to reproduce to + + support@shotgunsoftware.com + .`; + } + + if (typeof _log_file_path !== "undefined") { + contents_html += + `

    + Please attach a copy of the this log file when emailing the + support team:

    + ${_log_file_path} +
    + ` + } + + contents_html = `
    ${contents_html}
    `; + + _set_contents(contents_html); + _set_error( + "Uh oh! Something went wrong." + ); + }; + + // store the mouse position always + const _on_mouse_move = function(event) { + _cur_mouse_pos = { + x: event.clientX, + y: event.clientY + }; + }; + + // Display pyside unavailable error in the panel + const _on_pyside_unavailable = function(event) { + + _set_bg_color("#222222"); + _clear_messages(); + + sg_logging.error("Critical: PySide is unavailable"); + + _show_header(false); + + var python_display = "system python"; + if (process.env.SHOTGUN_ADOBE_PYTHON) { + python_display = "" + process.env.SHOTGUN_ADOBE_PYTHON + ""; + } + + var contents_html = `
    + The Shotgun integration failed to load because PySide + is not installed (Running ${python_display}). +
    `; + + contents_html += + `
    + In order for the Shotgun integration to work properly, + PySide must be installed on your system. +

    + For information about PySide and how to install it, + please click the image below: +


    +
    + + + +
    +
    `; + + const subject = encodeURIComponent("Adobe Integration Error"); + const body = encodeURIComponent( + "Greetings Shotgun Support Team!\n\n" + + "We have some questions about the Photoshop CC Integration.\n\n" + + "*** Please enter your questions here... ***\n\n" + ); + + var app_name = _cs_interface.getHostEnvironment().appName; + const app_display_name = sg_constants.product_info[app_name].display_name; + + contents_html += + `
    + Once you have PySide installed, restart + ${app_display_name} to load the Shotgun integration. +

    + If you believe the error is incorrect or you have any further + questions, please contact + + support@shotgunsoftware.com + .`; + + contents_html = "
    " + contents_html + "
    "; + + _set_contents(contents_html); + _set_error( + "Uh Oh! Could not find PySide." + ); + }; + + // Handles incoming log messages + const _on_logged_message = function(event) { + + var level = event.data.level; + var message = event.data.message; + var from_python = event.data.from_python; + + // Some things are sent via log signal because there's no other + // way to get access to them. For example, during toolkit + // bootstrap, we can only gain access to progress via stdio pipe + // maintained between js process and the spawned python process. + // So we intercept messages formatted to relay progress. + if (message.includes("PLUGIN_BOOTSTRAP_PROGRESS")) { + + // It is possible that the message contains multiple + // progress messages packaged together. Identify all of them + // and update the progress bar. + var regex_str = "\\|PLUGIN_BOOTSTRAP_PROGRESS,(\\d+(\\.\\d+)?),([^|]+)\\|"; + + const multi_regex = new RegExp(regex_str, "gm"); + + var matches = message.match(multi_regex); + + if (!matches) { + return; + } + + matches.forEach(function (match) { + const single_regex = new RegExp(regex_str, "m"); + const msg_parts = match.match(single_regex); + // the regex returns the progress value as a float at + // position 1 of the match. position 3 is the message + _set_progress_info(msg_parts[1] * 100, msg_parts[3]); + }); + + return; + } + + var log_source = from_python ? "py" : "js"; + + var messages = undefined; + + if (from_python) { + messages = message.split("\n") + } else { + messages = [message] + } + + messages.forEach(function(msg) { + + // strip newlines + msg = msg.replace(/^\n/, ""); + msg = msg.replace(/\n$/, ""); + + if (msg.startsWith("[DEBUG]: ")) { + msg = msg.replace("[DEBUG]: ", ""); + level = "debug"; + } else if (msg.startsWith("[INFO]: ")) { + msg = msg.replace("[INFO]: ", ""); + level = "info"; + } else if (msg.startsWith("[WARNING]: ")) { + msg = msg.replace("[WARNING]: ", ""); + level = "warn"; + } else if (msg.startsWith("[ERROR]: ")) { + msg = msg.replace("[ERROR]: ", ""); + level = "error"; + } else if (msg.startsWith("[CRITICAL]: ")) { + msg = msg.replace("[ERROR]: ", ""); + level = "error"; + } else if (from_python) { + // account for multi-line log messages from python that may not + // have the expected format + level = _previous_log_level; + } + + if (!msg) { + // continue + return; + } + + // forward message to the panel console + _forward_to_panel_console(level, msg, log_source); + + // forward to the chrome console + console[level](msg); + + _previous_log_level = level; + }); + }; + + // Make the message pretty and add it to the panel's console log + const _forward_to_panel_console = function(level, message, log_source) { + + // figure out which div id to use for style/color + var div_id = "sg_log_message"; + if (level == "debug") { + div_id = "sg_log_message_debug" + } else if (level == "warn") { + div_id = "sg_log_message_warn" + } else if (level == "error") { + div_id = "sg_log_message_error" + } + + // append the
     element to the log div
    +        const log = document.getElementById("sg_panel_console_log");
    +
    +        message.split("\n").forEach(function(msg) {
    +
    +            if (!msg) {
    +                // continue
    +                return;
    +            }
    +
    +            // just a little indicator so that we know if the log message came from
    +            // (javascript or python) when looking in the panel console.
    +            const tag = document.createElement("pre");
    +            tag.setAttribute("id", "sg_panel_console_tag");
    +            tag.appendChild(document.createTextNode(log_source + " "));
    +
    +            // create a 
     element and insert the msg
    +            const node = document.createElement("pre");
    +            node.setAttribute("id", div_id);
    +            node.appendChild(document.createTextNode(msg));
    +
    +            log.appendChild(tag);
    +            log.appendChild(node);
    +            log.appendChild(document.createElement("br"));
    +
    +            // scroll to the bottom if an error occurs
    +            if (["error", "critical"].indexOf(level) >= 0) {
    +                _scroll_to_log_bottom();
    +            }
    +        });
    +    };
    +
    +    // Scroll to the bottom of the div
    +    const _scroll_to_log_bottom = function() {
    +
    +        const console_log_div_id = sg_constants.panel_div_ids["console_log"];
    +        const log = document.getElementById(console_log_div_id);
    +        log.scrollTop = log.scrollHeight;
    +    };
    +
    +    // Delay happened, still need to show the command
    +    const _on_show_command_help_timeout = function(help) {
    +
    +        // if no help, display a default message
    +        if (!help || help === "null") {
    +            help = "Could not find a description for this command. " +
    +                   "Please check with the author of the app to see about " +
    +                   "making a description available."
    +        }
    +
    +        // mouse pos. always align left to right from mouse position.
    +        // if help div will go past right and/or bottom border, adjust accordingly.
    +
    +        const mouse_x = _cur_mouse_pos.x;
    +        const mouse_y = _cur_mouse_pos.y;
    +
    +        const command_div = document.elementFromPoint(mouse_x, mouse_y);
    +
    +        const offset = 8;
    +        const margin = 8;
    +
    +        // ---- calculate where to display the help message
    +
    +        const help_div_id = sg_constants.panel_div_ids["command_help"];
    +        const help_div = document.getElementById(help_div_id);
    +
    +        // reset to the top left to allow it to grow as needed when contest set
    +        help_div.style.left = "0px";
    +        help_div.style.top = "0px";
    +
    +        _set_command_help(help);
    +
    +        const help_div_rect = help_div.getBoundingClientRect();
    +
    +        const help_width = help_div_rect.width;
    +        const help_height = help_div_rect.height;
    +
    +        const far_right = mouse_x + offset + margin + help_width;
    +        const far_bottom = mouse_y + offset + margin + help_height;
    +
    +        const win_width = window.innerWidth;
    +        const win_height = window.innerHeight;
    +
    +        const beyond_right = far_right - win_width + margin;
    +        const beyond_bottom = far_bottom - win_height + margin;
    +
    +        var adjust_left = 0;
    +        var adjust_top = 0;
    +
    +        if (beyond_right > 0) {
    +            adjust_left = -beyond_right;
    +        }
    +
    +        if (beyond_bottom > 0) {
    +            adjust_top = -beyond_bottom;
    +        }
    +
    +        const new_left = mouse_x + offset + adjust_left + window.scrollX;
    +        const new_top = mouse_y + offset + adjust_top + window.scrollY;
    +
    +        help_div.style.left = new_left + "px";
    +        help_div.style.top = new_top + "px";
    +
    +        const new_help_div_rect = help_div.getBoundingClientRect();
    +
    +        if (_point_in_rect(_cur_mouse_pos, new_help_div_rect)) {
    +            // the mouse is now inside the help div. need to adjust more
    +
    +            var additional_offset_y = 0;
    +
    +            if (beyond_bottom > 0) {
    +                // we already adjusted up, keep going. we know we need to get
    +                // at least `offset` pixels past the mouse. then it's just the
    +                // difference
    +                additional_offset_y = -1 * (offset + new_help_div_rect.bottom - mouse_y);
    +            }
    +
    +            help_div.style.top = new_top + additional_offset_y + "px";
    +        }
    +
    +        _show_command_help(true);
    +
    +        _hide_tooltip_timeout_id = setTimeout(
    +            function(){
    +                this.hide_command_help()
    +            }.bind(this),
    +            5000
    +        )
    +
    +    }.bind(this);
    +
    +    // Returns a boolean indicating if the point is in the rect
    +    const _point_in_rect = function(point, rect) {
    +
    +        return ((point.x >= rect.left) && (point.x <= rect.right) &&
    +                (point.y >= rect.top)  && (point.y <= rect.bottom));
    +    };
    +
    +    // Sets up all the event handling callbacks.
    +    const _setup_event_listeners = function() {
    +
    +        // Handle python process disconnected
    +        sg_manager.CRITICAL_ERROR.connect(
    +            function(event) {
    +                const message = event.data.message;
    +                const stack = event.data.stack;
    +                _on_critical_error(message, stack);
    +            }
    +        );
    +
    +        // Handle pyside not being installed
    +        sg_manager.PYSIDE_NOT_AVAILABLE.connect(_on_pyside_unavailable);
    +
    +        // Updates the panel with the current commands from python
    +        sg_manager.UPDATE_COMMANDS.connect(
    +            function(event) {
    +                this.set_commands(event.data);
    +            }.bind(this)
    +        );
    +
    +        // Updates the panel with the current context fields from python
    +        sg_manager.UPDATE_CONTEXT_DISPLAY.connect(
    +            function(event) {
    +                this.set_context_display(event.data);
    +            }.bind(this)
    +        );
    +
    +        // Updates the panel with the current context thumb path from python
    +        sg_manager.UPDATE_CONTEXT_THUMBNAIL.connect(
    +            function(event) {
    +                this.set_context_thumbnail(event.data);
    +            }.bind(this)
    +        );
    +
    +        // Updates the panel with the current log file path
    +        sg_manager.UPDATE_LOG_FILE_PATH.connect(
    +            function(event) {
    +                _log_file_path = event.data;
    +            }
    +        );
    +
    +        // Sets the panel into a state where the context is not known
    +        sg_manager.UNKNOWN_CONTEXT.connect(
    +            function(event) {
    +                this.set_unknown_context_state();
    +            }.bind(this)
    +        );
    +
    +        // Clears the current context
    +        sg_manager.CONTEXT_ABOUT_TO_CHANGE.connect(
    +            function(event) {
    +                this.set_context_loading_state();
    +            }.bind(this)
    +        );
    +
    +        // Handle the manager shutting down.
    +        sg_manager.SHUTTING_DOWN.connect(
    +            function(event) {
    +                _cs_interface.closeExtension();
    +            }
    +        );
    +
    +        // Handle log messages from python process
    +        sg_logging.LOG_MESSAGE.connect(_on_logged_message);
    +
    +    }.bind(this);
    +
    +    // set html for div
    +    const _set_div_html = function(div_id, html) {
    +        // Updates the inner HTML of the supplied div with the supplied HTML
    +        _show_div(div_id, true);
    +        document.getElementById(div_id).innerHTML = html;
    +    };
    +
    +    const _set_div_html_by_id = function(div_id) {
    +        return function(html) {
    +            // Convenience method for updating panel contents with supplied html
    +            _set_div_html(sg_constants.panel_div_ids[div_id], html);
    +        };
    +    };
    +
    +    // convenience methods for updating the various panel components
    +    const _set_contents = _set_div_html_by_id("contents");
    +    const _set_header = _set_div_html_by_id("header");
    +    const _set_info = _set_div_html_by_id("info");
    +    const _set_error = _set_div_html_by_id("error");
    +    const _set_warning = _set_div_html_by_id("warning");
    +    const _set_command_help = _set_div_html_by_id("command_help");
    +
    +    // ---- progress bar methods
    +
    +    // Update the progress section with a % and a message.
    +    const _set_progress_info = function(progress, message) {
    +
    +        if (progress == 100) {
    +            // progress is complete. nothing to do
    +            _clear_info();
    +        } else {
    +            _show_progress(true);
    +            _show_info(true);
    +            var elem = document.getElementById(
    +                sg_constants.panel_div_ids["progress_bar"]);
    +            elem.style.width = progress + '%';
    +            _set_info(message);
    +        }
    +    };
    +
    +    // Show or hide a div
    +    const _show_div = function(div_id, show_or_hide) {
    +        var display = "none";  // hide
    +        if (show_or_hide) {
    +            display = "block"; // show
    +        }
    +        var elem = document.getElementById(div_id);
    +        elem.style.display = display;
    +    };
    +
    +    const _show_div_by_id = function(div_id) {
    +        return function(show_or_hide) {
    +            // Convenience method for showing/hiding divs
    +            _show_div(sg_constants.panel_div_ids[div_id], show_or_hide);
    +        }
    +    };
    +
    +    // convenience methods for showing/hiding status divs
    +    const _show_header = _show_div_by_id("header");
    +    const _show_contents = _show_div_by_id("contents");
    +    const _show_info = _show_div_by_id("info");
    +    const _show_error = _show_div_by_id("error");
    +    const _show_warning = _show_div_by_id("warning");
    +    const _show_progress = _show_div_by_id("progress");
    +    const _show_command_help = _show_div_by_id("command_help");
    +
    +    // sets bg to supplied color
    +    const _set_bg_color = function(color) {
    +        document.body.style.background = color;
    +    };
    +
    +    // hide all transient divs
    +    const _clear_messages = function() {
    +        _show_info(false);
    +        _show_error(false);
    +        _show_warning(false);
    +        _show_progress(false);
    +        _show_command_help(false);
    +    };
    +
    +    // clears the info related divs
    +    const _clear_info = function() {
    +        _show_info(false);
    +        _show_progress(false);
    +    };
    +
    +    // format an email message to help client get started
    +    const _format_email_error_message = function(message, stack) {
    +
    +        return encodeURIComponent(
    +            "Greetings Shotgun Support Team!\n\n" +
    +            "We are experiencing some difficulties with the Photoshop CC Integration. " +
    +            "The details are included below.\n\n" +
    +            "Summary of the issue:\n\n" +
    +            "*** Please enter a summary of the issue here... ***\n\n" +
    +            "Steps to reproduce:\n\n" +
    +            "*** Please enter the steps you took to reach this error here. ***\n\n" +
    +            "Error displayed to the user:\n\n" +
    +            message + "\n\n" +
    +            "Stack trace:\n\n" +
    +            stack + "\n\n"
    +        );
    +    };
    +
    +};
    +
    diff --git a/cep/js/shotgun/panel_events.js b/cep/js/shotgun/panel_events.js
    new file mode 100644
    index 0000000..41dd733
    --- /dev/null
    +++ b/cep/js/shotgun/panel_events.js
    @@ -0,0 +1,28 @@
    +// Copyright (c) 2016 Shotgun Software Inc.
    +//
    +// CONFIDENTIAL AND PROPRIETARY
    +//
    +// This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit
    +// Source Code License included in this distribution package. See LICENSE.
    +// By accessing, using, copying or modifying this work you indicate your
    +// agreement to the Shotgun Pipeline Toolkit Source Code License. All rights
    +// not expressly granted therein are reserved by Shotgun Software Inc.
    +
    +"use strict";
    +
    +// namespace. not to be confused with the Shotgun Panel app.
    +var sg_panel = sg_panel || {};
    +
    +// sent when a command is clicked in the panel
    +sg_event.create_event(sg_panel, "REGISTERED_COMMAND_TRIGGERED");
    +
    +// sent from the panel when the user requests to reload the extension
    +sg_event.create_event(sg_panel, "REQUEST_MANAGER_RELOAD");
    +
    +// sent by the panel to request an updated state from the python process
    +sg_event.create_event(sg_panel, "REQUEST_STATE");
    +
    +// sent by the panel to alert Python of the need to run the photoshopcc
    +// test suite.
    +sg_event.create_event(sg_panel, "RUN_TESTS");
    +
    diff --git a/cep/js/shotgun/socket_io_manager.js b/cep/js/shotgun/socket_io_manager.js
    new file mode 100644
    index 0000000..c9fe907
    --- /dev/null
    +++ b/cep/js/shotgun/socket_io_manager.js
    @@ -0,0 +1,457 @@
    +// Copyright (c) 2016 Shotgun Software Inc.
    +//
    +// CONFIDENTIAL AND PROPRIETARY
    +//
    +// This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit
    +// Source Code License included in this distribution package. See LICENSE.
    +// By accessing, using, copying or modifying this work you indicate your
    +// agreement to the Shotgun Pipeline Toolkit Source Code License. All rights
    +// not expressly granted therein are reserved by Shotgun Software Inc.
    +
    +"use strict";
    +
    +// namespace
    +var sg_socket_io = sg_socket_io || {};
    +
    +sg_socket_io.io = undefined;
    +
    +/*
    +Emits the provided payload stringified as JSON via the currently open socket.io
    +server.
    +
    +:param message_type: The type of message to emit.
    +:param payload: The payload data to emit as a message.
    +*/
    +sg_socket_io.emit = function(message_type, payload) {
    +    if ( sg_socket_io.io !== undefined ) {
    +        sg_socket_io.io.emit(message_type, JSON.stringify(payload));
    +    }
    +};
    +
    +/*
    +Emits a message that informs any listeners of a change in active document within
    +the host application.
    +*/
    +sg_socket_io.rpc_active_document_changed = function(active_document_path) {
    +    sg_logging.debug("Emitting 'active_document_changed' message via socket.io.");
    +    var msg = {
    +        active_document_path: active_document_path
    +    };
    +    sg_socket_io.emit("active_document_changed", msg);
    +};
    +
    +/*
    +Emits a "logging" message from the currently open socket.io server. The log
    +message string and level are combined into a single payload object with "level"
    +and "message" properties that is JSON encoded before emission.
    +
    +:param level: The severity level of the logging message.
    +:param message: The logging message.
    +*/
    +sg_socket_io.rpc_log = function(level, message) {
    +    var msg = {
    +        level: level,
    +        message: message
    +    };
    +    sg_socket_io.emit("logging", msg);
    +};
    +
    +/*
    +Emits a "state_requested" message from the currently open socket.io server.
    +*/
    +sg_socket_io.rpc_state_requested = function() {
    +    sg_logging.debug("Emitting 'state_requested' message via socket.io.");
    +    sg_socket_io.emit("state_requested");
    +};
    +
    +/*
    +Emits a "command" message from the currently open socket.io server. The given
    +uid references an SGTK engine command by the same id, which will be used to look
    +up the appropriate callback once the message is handled by a client.
    +
    +:param uid: The unique id associated with the command to be by the remote client.
    +*/
    +sg_socket_io.rpc_command = function(uid) {
    +    sg_logging.debug("Emitting 'command' message via socket.io.");
    +    sg_socket_io.emit("command", uid);
    +};
    +
    +/*
    +Emits a "run_tests" message from the currently open socket.io server.
    +*/
    +sg_socket_io.rpc_run_tests = function() {
    +    sg_logging.debug("Emitting 'run_tests' message via socket.io.");
    +    sg_socket_io.emit("run_tests", {});
    +};
    +
    +sg_socket_io.SocketManager = new function() {
    +
    +    var io = undefined;
    +
    +    /*
    +    Emits a debug logging message only if network logging has been
    +    turned on via the environment.
    +
    +    :param msg: The logging message.
    +    */
    +    var log_network_debug = function(msg) {
    +        const legacy_env = process.env.SGTK_PHOTOSHOP_NETWORK_DEBUG;
    +        const env_var = process.env.SHOTGUN_ADOBE_NETWORK_DEBUG;
    +
    +        if ( legacy_env || env_var ) {
    +            sg_logging.debug(msg);
    +        }
    +    };
    +
    +    /*
    +    Replaces Windows-style backslash paths with forward slashes. Also
    +    replaces any %24 strings found with $, which is a problem that
    +    arises with system paths coming from the CS interface on Windows
    +    that contain $ for things like roaming user profiles.
    +
    +    :param file_path: The file path string to sanitize.
    +    */
    +    var sanitize_path = function(file_path) {
    +        var file_path = file_path.replace(RegExp('\\\\', 'g'), '/');
    +        return file_path.replace("%24", "$");
    +    };
    +
    +    /*
    +    The callback attached to each JSON-RPC call that's made.
    +
    +    :param next: The "next" callback that unlocks the socket server event loop.
    +    :param result: The result data to be returned back to the RPC caller.
    +    */
    +    var _eval_callback = function(next, result) {
    +        if ( result === "EvalScript error." ) {
    +            // We're not going to log here at all. We are notifying any
    +            // clients that are listening that the command failed, and
    +            // they will have the chance to either recover or raise an
    +            // exception on their own.
    +            next(true, result);
    +        }
    +        else {
    +            next(false, result);
    +        }
    +    };
    +
    +    /*
    +    Starts the socket.io server and defines the JSON-RPC interface that is made
    +    publicly available to clients.
    +
    +    :param port: The port number to use when opening the socket.
    +    :param csLib: A handle to the standard Adobe CSInterface object.
    +    */
    +    this.start_socket_server = function (port, csLib) {
    +        var path = require('path');
    +        var jrpc = require('jrpc');
    +        var io = require('socket.io').listen(port);
    +        sg_socket_io.io = io;
    +
    +        sg_logging.info("Listening on port " + JSON.stringify(port));
    +
    +        // Get the path to the extension.
    +        var ext_dir = csLib.getSystemPath(SystemPath.APPLICATION);
    +        var js_dir = path.join(ext_dir, "js", "shotgun");
    +
    +        // Tell ExtendScript to load the rpc.js file that contains our
    +        // helper functions.
    +        var jsx_rpc_path = sanitize_path(path.join(js_dir, "ECMA", "rpc.js"));
    +        var cmd = '$.evalFile("' + jsx_rpc_path + '")';
    +        sg_logging.debug("Sourcing rpc.js: " + cmd);
    +        csLib.evalScript(cmd);
    +
    +        sg_logging.info("Establishing jrpc interface.");
    +
    +        /*
    +        The object that defines the JSON-RPC interface exposed by the socket.io
    +        server. Each method on this object becomes a callable method over the
    +        socket.io connection.
    +        */
    +        function RPCInterface() {
    +
    +            /*
    +            Maps the global scope of ExtendScript and returns a list of wrapper
    +            objects as JSON data. Each wrapper describes the object, its
    +            properties, and its methods.
    +
    +            :param params: The list of parameters associated with the rpc call.
    +            :param next: The handle to the "next" callback that triggers the
    +                return of data to the caller and causes the next RPC call queued
    +                 up to be processed.
    +            */
    +            this.get_global_scope = function(params, next) {
    +                const cmd = "map_global_scope()";
    +                log_network_debug(cmd);
    +                csLib.evalScript(cmd, _eval_callback.bind(this, next));
    +            };
    +
    +            /*
    +            Evalualtes an arbitrary string of Javascript in ExtendScript and
    +            returns the resulting data.
    +
    +            :param params: The list of parameters associated with the rpc call.
    +                [extendscript_command]
    +            :param next: The handle to the "next" callback that triggers the
    +                return of data to the caller and causes the next RPC call queued
    +                up to be processed.
    +            */
    +            this.eval = function(params, next) {
    +                log_network_debug(params[0]);
    +                csLib.evalScript(params[0], function(result) {
    +                    next(false, result);
    +                });
    +            };
    +
    +            /*
    +            Instantiates an object for the given global-scope class. The given
    +            class name must be available in the global scope of ExtendScript at
    +            call time.
    +
    +            :param params: The list of parameters associated with the rpc call.
    +                [class_name]
    +            :param next: The handle to the "next" callback that triggers the
    +                return of data to the caller and causes the next RPC call queued
    +                up to be processed.
    +            */
    +            this.new = function(params, next) {
    +                var class_name = JSON.stringify(params.shift());
    +                var cmd = "rpc_new(" + class_name + ")";
    +                log_network_debug(cmd);
    +
    +                csLib.evalScript(
    +                    cmd,
    +                    _eval_callback.bind(this, next)
    +                );
    +            };
    +
    +            /*
    +            Gets the value of the given property on the given object.
    +
    +            :param params: The list of parameters associated with the rpc call.
    +                [object, property_name]
    +            :param next: The handle to the "next" callback that triggers the
    +                return of data to the caller and causes the next RPC call queued
    +                up to be processed.
    +            */
    +            this.get = function(params, next) {
    +                var base = JSON.parse(params.shift());
    +                var property = params.shift();
    +                var args = [base.__uniqueid, JSON.stringify(property)].join();
    +                var cmd = "rpc_get(" + args + ")";
    +                log_network_debug(cmd);
    +
    +                csLib.evalScript(
    +                    cmd,
    +                    _eval_callback.bind(this, next)
    +                );
    +            };
    +
    +            /*
    +            Gets the value for the given index number on the given iterable
    +                object.
    +
    +            :param params: The list of parameters associated with the rpc call.
    +                [object, index]
    +            :param next: The handle to the "next" callback that triggers the
    +                return of data to the caller and causes the next RPC call queued
    +                up to be processed.
    +            */
    +            this.get_index = function(params, next) {
    +                var base = JSON.parse(params.shift());
    +                var index = JSON.stringify(params.shift());
    +                var args = [base.__uniqueid, index].join();
    +                var cmd = "rpc_get_index(" + args + ")";
    +                log_network_debug(cmd);
    +
    +                csLib.evalScript(
    +                    cmd,
    +                    _eval_callback.bind(this, next)
    +                );
    +            };
    +
    +            /*
    +            Compares two objects for equality.
    +
    +            :param params: A list containing two objects describing what to
    +                compare. Each object should contain two properties:
    +                value, and is_wrapped. If is_wrapped is true, the comparison
    +                will treat the value as an object registry UID and look up
    +                the appropriate object for comparison. Otherwise, the value
    +                is compared as is.
    +            :param next: The handle to the "next" callback that triggers the
    +                return of data to the caller and causes the next RPC call queued
    +                up to be processed.
    +            */
    +            this.is_equal = function(params, next) {
    +                var left = params.shift();
    +                var right = params.shift();
    +
    +                var left_value = left["value"];
    +                var right_value = right["value"];
    +
    +                if (left["is_wrapped"] === true) {
    +                    left_value = "__OBJECT_REGISTRY[" + left_value + "]";
    +                }
    +                if (right["is_wrapped"] === true) {
    +                    right_value = "__OBJECT_REGISTRY[" + right_value + "]";
    +                }
    +
    +                var cmd = left_value + " == " + right_value;
    +                log_network_debug(cmd);
    +                csLib.evalScript(
    +                    cmd,
    +                    _eval_callback.bind(this, next)
    +                );
    +            };
    +
    +            /*
    +            Sets the value of the given property on the given object.
    +
    +            :param params: The list of parameters associated with the rpc call.
    +                [object, property_name, value]
    +            :param next: The handle to the "next" callback that triggers the
    +                return of data to the caller and causes the
    +                next RPC call queued up to be processed.
    +            */
    +            this.set = function(params, next) {
    +                var base = JSON.parse(params.shift());
    +                var property = params.shift();
    +                var value = params.shift();
    +                var args = [
    +                    base.__uniqueid,
    +                    JSON.stringify(property),
    +                    JSON.stringify(value)
    +                ].join();
    +
    +                var cmd = "rpc_set(" + args + ")";
    +                log_network_debug(cmd);
    +
    +                csLib.evalScript(
    +                    cmd,
    +                    _eval_callback.bind(this, next)
    +                );
    +            };
    +
    +            /*
    +            Calls the given method on the given object.
    +
    +            :param params: The list of parameters associated with the rpc call.
    +                [method_wrapper, parent_uid, method_arg_1, ...]
    +            :param next: The handle to the "next" callback that triggers the
    +                return of data to the caller and causes the next RPC call queued
    +                up to be processed.
    +            */
    +            this.call = function(params, next) {
    +                var base = JSON.parse(params.shift());
    +                // The parent object of the method being called. Since we
    +                // need to know what the method is bound to in order to
    +                // actually call it (foo.bar(), with "foo" being the parent
    +                // object identified by its unique id, and "bar" being the
    +                // method itself being called.
    +                var parent_uid = params.shift();
    +
    +                var args = [
    +                    base.__uniqueid,
    +                    JSON.stringify(params),
    +                    parent_uid
    +                ].join();
    +
    +                if ( args.endsWith(",") ) {
    +                    args = args + "-1";
    +                }
    +
    +                var cmd = "rpc_call(" + args + ")";
    +                log_network_debug(cmd);
    +
    +                csLib.evalScript(
    +                    cmd,
    +                    _eval_callback.bind(this, next)
    +                );
    +            };
    +
    +        }
    +
    +        // Stops the socket server.
    +        this.stop_socket_server = function() {
    +            sg_logging.debug("Shutting down socket server.");
    +            io.close();
    +        };
    +
    +        sg_logging.info("Setting up connection handling...");
    +
    +        const remote = new jrpc();
    +        remote.expose(new RPCInterface());
    +
    +        remote.setTransmitter(function(message, next) {
    +            try {
    +                io.emit("return", message);
    +                return next(false);
    +            } catch (e) {
    +                return next(true);
    +            }
    +        });
    +
    +        // Define the root namespace interface. This will receive all
    +        // commands for interacting with ExtendScript.
    +        io.on("connection", function(socket) {
    +            sg_logging.info("Connection received!");
    +
    +            socket.on("execute_command", function(message) {
    +                remote.receive(message);
    +            });
    +
    +            socket.on("set_commands", function(json_commands) {
    +                // The client is setting the commands
    +                var commands = JSON.parse(json_commands);
    +                sg_logging.debug("Setting commands from client: " + json_commands);
    +
    +                // TODO: we're emitting a manager event. perhaps we should
    +                // have a set of events that come from socket.io? or perhaps
    +                // this should call a method on the manager (tried, but doesn't
    +                // seem to work!)? but this shouldn't really know about the
    +                // manager. anyway, this works, so revisit as time permits.
    +                sg_manager.UPDATE_COMMANDS.emit(commands);
    +            });
    +
    +            socket.on("set_context_display", function(json_context_display) {
    +                // The client is setting the context display.
    +                var context_display = JSON.parse(json_context_display);
    +                sg_logging.debug("Setting context display from client.");
    +                sg_manager.UPDATE_CONTEXT_DISPLAY.emit(context_display);
    +            });
    +
    +            socket.on("set_context_thumbnail", function(json_context_thumbnail) {
    +                // The client is setting the context thumbnail path.
    +                var context_thumbnail = JSON.parse(json_context_thumbnail);
    +                sg_logging.debug("Setting context thumbnail from client: " + json_context_thumbnail);
    +                sg_manager.UPDATE_CONTEXT_THUMBNAIL.emit(context_thumbnail);
    +            });
    +
    +            socket.on("set_log_file_path", function(json_log_file_path) {
    +                // The client is setting the current log file path
    +                var log_file_path = JSON.parse(json_log_file_path);
    +                sg_logging.debug("Setting log file path from client: " + json_log_file_path);
    +                sg_manager.UPDATE_LOG_FILE_PATH.emit(log_file_path);
    +            });
    +
    +            socket.on("set_unknown_context", function() {
    +                // The context is unknown
    +                sg_logging.debug("Sending unknown context signal from the client.");
    +                sg_manager.UNKNOWN_CONTEXT.emit();
    +            });
    +
    +            socket.on("context_about_to_change", function() {
    +                // The context is about to change
    +                sg_logging.debug("Sending context about to change from client.");
    +                sg_manager.CONTEXT_ABOUT_TO_CHANGE.emit();
    +            });
    +
    +            socket.on("log_message", function(json_log_data) {
    +                // log a message from python
    +                var log_data = JSON.parse(json_log_data);
    +                sg_logging._log(log_data.level, log_data.msg, false)
    +            });
    +        });
    +    };
    +};
    diff --git a/cep/node_modules/accepts/HISTORY.md b/cep/node_modules/accepts/HISTORY.md
    new file mode 100644
    index 0000000..0508481
    --- /dev/null
    +++ b/cep/node_modules/accepts/HISTORY.md
    @@ -0,0 +1,74 @@
    +1.1.4 / 2014-12-10
    +==================
    +
    +  * deps: mime-types@~2.0.4
    +    - deps: mime-db@~1.3.0
    +
    +1.1.3 / 2014-11-09
    +==================
    +
    +  * deps: mime-types@~2.0.3
    +    - deps: mime-db@~1.2.0
    +
    +1.1.2 / 2014-10-14
    +==================
    +
    +  * deps: negotiator@0.4.9
    +    - Fix error when media type has invalid parameter
    +
    +1.1.1 / 2014-09-28
    +==================
    +
    +  * deps: mime-types@~2.0.2
    +    - deps: mime-db@~1.1.0
    +  * deps: negotiator@0.4.8
    +    - Fix all negotiations to be case-insensitive
    +    - Stable sort preferences of same quality according to client order
    +
    +1.1.0 / 2014-09-02
    +==================
    +
    +  * update `mime-types`
    +
    +1.0.7 / 2014-07-04
    +==================
    +
    +  * Fix wrong type returned from `type` when match after unknown extension
    +
    +1.0.6 / 2014-06-24
    +==================
    +
    +  * deps: negotiator@0.4.7
    +
    +1.0.5 / 2014-06-20
    +==================
    +
    + * fix crash when unknown extension given
    +
    +1.0.4 / 2014-06-19
    +==================
    +
    +  * use `mime-types`
    +
    +1.0.3 / 2014-06-11
    +==================
    +
    +  * deps: negotiator@0.4.6
    +    - Order by specificity when quality is the same
    +
    +1.0.2 / 2014-05-29
    +==================
    +
    +  * Fix interpretation when header not in request
    +  * deps: pin negotiator@0.4.5
    +
    +1.0.1 / 2014-01-18
    +==================
    +
    +  * Identity encoding isn't always acceptable
    +  * deps: negotiator@~0.4.0
    +
    +1.0.0 / 2013-12-27
    +==================
    +
    +  * Genesis
    diff --git a/cep/node_modules/accepts/LICENSE b/cep/node_modules/accepts/LICENSE
    new file mode 100644
    index 0000000..f23dca8
    --- /dev/null
    +++ b/cep/node_modules/accepts/LICENSE
    @@ -0,0 +1,22 @@
    +(The MIT License)
    +
    +Copyright (c) 2014 Jonathan Ong 
    +
    +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/cep/node_modules/accepts/README.md b/cep/node_modules/accepts/README.md
    new file mode 100644
    index 0000000..a9bc28a
    --- /dev/null
    +++ b/cep/node_modules/accepts/README.md
    @@ -0,0 +1,94 @@
    +# accepts
    +
    +[![NPM Version][npm-image]][npm-url]
    +[![NPM Downloads][downloads-image]][downloads-url]
    +[![Node.js Version][node-version-image]][node-version-url]
    +[![Build Status][travis-image]][travis-url]
    +[![Test Coverage][coveralls-image]][coveralls-url]
    +
    +Higher level content negotation based on [negotiator](https://github.com/federomero/negotiator). Extracted from [koa](https://github.com/koajs/koa) for general use.
    +
    +In addition to negotatior, it allows:
    +
    +- Allows types as an array or arguments list, ie `(['text/html', 'application/json'])` as well as `('text/html', 'application/json')`.
    +- Allows type shorthands such as `json`.
    +- Returns `false` when no types match
    +- Treats non-existent headers as `*`
    +
    +## API
    +
    +### var accept = new Accepts(req)
    +
    +```js
    +var accepts = require('accepts')
    +
    +http.createServer(function (req, res) {
    +  var accept = accepts(req)
    +})
    +```
    +
    +### accept\[property\]\(\)
    +
    +Returns all the explicitly accepted content property as an array in descending priority.
    +
    +- `accept.types()`
    +- `accept.encodings()`
    +- `accept.charsets()`
    +- `accept.languages()`
    +
    +They are also aliased in singular form such as `accept.type()`. `accept.languages()` is also aliased as `accept.langs()`, etc.
    +
    +Note: you should almost never do this in a real app as it defeats the purpose of content negotiation.
    +
    +Example:
    +
    +```js
    +// in Google Chrome
    +var encodings = accept.encodings() // -> ['sdch', 'gzip', 'deflate']
    +```
    +
    +Since you probably don't support `sdch`, you should just supply the encodings you support:
    +
    +```js
    +var encoding = accept.encodings('gzip', 'deflate') // -> 'gzip', probably
    +```
    +
    +### accept\[property\]\(values, ...\)
    +
    +You can either have `values` be an array or have an argument list of values.
    +
    +If the client does not accept any `values`, `false` will be returned.
    +If the client accepts any `values`, the preferred `value` will be return.
    +
    +For `accept.types()`, shorthand mime types are allowed.
    +
    +Example:
    +
    +```js
    +// req.headers.accept = 'application/json'
    +
    +accept.types('json') // -> 'json'
    +accept.types('html', 'json') // -> 'json'
    +accept.types('html') // -> false
    +
    +// req.headers.accept = ''
    +// which is equivalent to `*`
    +
    +accept.types() // -> [], no explicit types
    +accept.types('text/html', 'text/json') // -> 'text/html', since it was first
    +```
    +
    +## License
    +
    +[MIT](LICENSE)
    +
    +[npm-image]: https://img.shields.io/npm/v/accepts.svg?style=flat
    +[npm-url]: https://npmjs.org/package/accepts
    +[node-version-image]: https://img.shields.io/node/v/accepts.svg?style=flat
    +[node-version-url]: http://nodejs.org/download/
    +[travis-image]: https://img.shields.io/travis/jshttp/accepts.svg?style=flat
    +[travis-url]: https://travis-ci.org/jshttp/accepts
    +[coveralls-image]: https://img.shields.io/coveralls/jshttp/accepts.svg?style=flat
    +[coveralls-url]: https://coveralls.io/r/jshttp/accepts
    +[downloads-image]: https://img.shields.io/npm/dm/accepts.svg?style=flat
    +[downloads-url]: https://npmjs.org/package/accepts
    diff --git a/cep/node_modules/accepts/index.js b/cep/node_modules/accepts/index.js
    new file mode 100644
    index 0000000..805e33a
    --- /dev/null
    +++ b/cep/node_modules/accepts/index.js
    @@ -0,0 +1,160 @@
    +var Negotiator = require('negotiator')
    +var mime = require('mime-types')
    +
    +var slice = [].slice
    +
    +module.exports = Accepts
    +
    +function Accepts(req) {
    +  if (!(this instanceof Accepts))
    +    return new Accepts(req)
    +
    +  this.headers = req.headers
    +  this.negotiator = Negotiator(req)
    +}
    +
    +/**
    + * Check if the given `type(s)` is acceptable, returning
    + * the best match when true, otherwise `undefined`, in which
    + * case you should respond with 406 "Not Acceptable".
    + *
    + * The `type` value may be a single mime type string
    + * such as "application/json", the extension name
    + * such as "json" or an array `["json", "html", "text/plain"]`. When a list
    + * or array is given the _best_ match, if any is returned.
    + *
    + * Examples:
    + *
    + *     // Accept: text/html
    + *     this.types('html');
    + *     // => "html"
    + *
    + *     // Accept: text/*, application/json
    + *     this.types('html');
    + *     // => "html"
    + *     this.types('text/html');
    + *     // => "text/html"
    + *     this.types('json', 'text');
    + *     // => "json"
    + *     this.types('application/json');
    + *     // => "application/json"
    + *
    + *     // Accept: text/*, application/json
    + *     this.types('image/png');
    + *     this.types('png');
    + *     // => undefined
    + *
    + *     // Accept: text/*;q=.5, application/json
    + *     this.types(['html', 'json']);
    + *     this.types('html', 'json');
    + *     // => "json"
    + *
    + * @param {String|Array} type(s)...
    + * @return {String|Array|Boolean}
    + * @api public
    + */
    +
    +Accepts.prototype.type =
    +Accepts.prototype.types = function (types) {
    +  if (!Array.isArray(types)) types = slice.call(arguments);
    +  var n = this.negotiator;
    +  if (!types.length) return n.mediaTypes();
    +  if (!this.headers.accept) return types[0];
    +  var mimes = types.map(extToMime);
    +  var accepts = n.mediaTypes(mimes.filter(validMime));
    +  var first = accepts[0];
    +  if (!first) return false;
    +  return types[mimes.indexOf(first)];
    +}
    +
    +/**
    + * Return accepted encodings or best fit based on `encodings`.
    + *
    + * Given `Accept-Encoding: gzip, deflate`
    + * an array sorted by quality is returned:
    + *
    + *     ['gzip', 'deflate']
    + *
    + * @param {String|Array} encoding(s)...
    + * @return {String|Array}
    + * @api public
    + */
    +
    +Accepts.prototype.encoding =
    +Accepts.prototype.encodings = function (encodings) {
    +  if (!Array.isArray(encodings)) encodings = slice.call(arguments);
    +  var n = this.negotiator;
    +  if (!encodings.length) return n.encodings();
    +  return n.encodings(encodings)[0] || false;
    +}
    +
    +/**
    + * Return accepted charsets or best fit based on `charsets`.
    + *
    + * Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5`
    + * an array sorted by quality is returned:
    + *
    + *     ['utf-8', 'utf-7', 'iso-8859-1']
    + *
    + * @param {String|Array} charset(s)...
    + * @return {String|Array}
    + * @api public
    + */
    +
    +Accepts.prototype.charset =
    +Accepts.prototype.charsets = function (charsets) {
    +  if (!Array.isArray(charsets)) charsets = [].slice.call(arguments);
    +  var n = this.negotiator;
    +  if (!charsets.length) return n.charsets();
    +  if (!this.headers['accept-charset']) return charsets[0];
    +  return n.charsets(charsets)[0] || false;
    +}
    +
    +/**
    + * Return accepted languages or best fit based on `langs`.
    + *
    + * Given `Accept-Language: en;q=0.8, es, pt`
    + * an array sorted by quality is returned:
    + *
    + *     ['es', 'pt', 'en']
    + *
    + * @param {String|Array} lang(s)...
    + * @return {Array|String}
    + * @api public
    + */
    +
    +Accepts.prototype.lang =
    +Accepts.prototype.langs =
    +Accepts.prototype.language =
    +Accepts.prototype.languages = function (langs) {
    +  if (!Array.isArray(langs)) langs = slice.call(arguments);
    +  var n = this.negotiator;
    +  if (!langs.length) return n.languages();
    +  if (!this.headers['accept-language']) return langs[0];
    +  return n.languages(langs)[0] || false;
    +}
    +
    +/**
    + * Convert extnames to mime.
    + *
    + * @param {String} type
    + * @return {String}
    + * @api private
    + */
    +
    +function extToMime(type) {
    +  if (~type.indexOf('/')) return type;
    +  return mime.lookup(type);
    +}
    +
    +/**
    + * Check if mime is valid.
    + *
    + * @param {String} type
    + * @return {String}
    + * @api private
    + */
    +
    +function validMime(type) {
    +  return typeof type === 'string';
    +}
    diff --git a/cep/node_modules/accepts/package.json b/cep/node_modules/accepts/package.json
    new file mode 100644
    index 0000000..2f246c4
    --- /dev/null
    +++ b/cep/node_modules/accepts/package.json
    @@ -0,0 +1,126 @@
    +{
    +  "_args": [
    +    [
    +      {
    +        "raw": "accepts@1.1.4",
    +        "scope": null,
    +        "escapedName": "accepts",
    +        "name": "accepts",
    +        "rawSpec": "1.1.4",
    +        "spec": "1.1.4",
    +        "type": "version"
    +      },
    +      "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\engine.io"
    +    ]
    +  ],
    +  "_from": "accepts@1.1.4",
    +  "_id": "accepts@1.1.4",
    +  "_inCache": true,
    +  "_installable": true,
    +  "_location": "/accepts",
    +  "_npmUser": {
    +    "name": "dougwilson",
    +    "email": "doug@somethingdoug.com"
    +  },
    +  "_npmVersion": "1.4.21",
    +  "_phantomChildren": {},
    +  "_requested": {
    +    "raw": "accepts@1.1.4",
    +    "scope": null,
    +    "escapedName": "accepts",
    +    "name": "accepts",
    +    "rawSpec": "1.1.4",
    +    "spec": "1.1.4",
    +    "type": "version"
    +  },
    +  "_requiredBy": [
    +    "/engine.io"
    +  ],
    +  "_resolved": "https://registry.npmjs.org/accepts/-/accepts-1.1.4.tgz",
    +  "_shasum": "d71c96f7d41d0feda2c38cd14e8a27c04158df4a",
    +  "_shrinkwrap": null,
    +  "_spec": "accepts@1.1.4",
    +  "_where": "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\engine.io",
    +  "author": {
    +    "name": "Jonathan Ong",
    +    "email": "me@jongleberry.com",
    +    "url": "http://jongleberry.com"
    +  },
    +  "bugs": {
    +    "url": "https://github.com/jshttp/accepts/issues"
    +  },
    +  "dependencies": {
    +    "mime-types": "~2.0.4",
    +    "negotiator": "0.4.9"
    +  },
    +  "description": "Higher-level content negotiation",
    +  "devDependencies": {
    +    "istanbul": "~0.3.4",
    +    "mocha": "~2.0.1"
    +  },
    +  "directories": {},
    +  "dist": {
    +    "shasum": "d71c96f7d41d0feda2c38cd14e8a27c04158df4a",
    +    "tarball": "https://registry.npmjs.org/accepts/-/accepts-1.1.4.tgz"
    +  },
    +  "engines": {
    +    "node": ">= 0.8"
    +  },
    +  "files": [
    +    "LICENSE",
    +    "HISTORY.md",
    +    "index.js"
    +  ],
    +  "gitHead": "df66414d80f096627b28f137127fce0a851d7900",
    +  "homepage": "https://github.com/jshttp/accepts",
    +  "keywords": [
    +    "content",
    +    "negotiation",
    +    "accept",
    +    "accepts"
    +  ],
    +  "license": "MIT",
    +  "maintainers": [
    +    {
    +      "name": "jongleberry",
    +      "email": "jonathanrichardong@gmail.com"
    +    },
    +    {
    +      "name": "federomero",
    +      "email": "federomero@gmail.com"
    +    },
    +    {
    +      "name": "dougwilson",
    +      "email": "doug@somethingdoug.com"
    +    },
    +    {
    +      "name": "tjholowaychuk",
    +      "email": "tj@vision-media.ca"
    +    },
    +    {
    +      "name": "shtylman",
    +      "email": "shtylman@gmail.com"
    +    },
    +    {
    +      "name": "mscdex",
    +      "email": "mscdex@mscdex.net"
    +    },
    +    {
    +      "name": "fishrock123",
    +      "email": "fishrock123@rocketmail.com"
    +    }
    +  ],
    +  "name": "accepts",
    +  "optionalDependencies": {},
    +  "readme": "ERROR: No README data found!",
    +  "repository": {
    +    "type": "git",
    +    "url": "git+https://github.com/jshttp/accepts.git"
    +  },
    +  "scripts": {
    +    "test": "mocha --reporter spec --check-leaks --bail test/",
    +    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/",
    +    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/"
    +  },
    +  "version": "1.1.4"
    +}
    diff --git a/cep/node_modules/after/.npmignore b/cep/node_modules/after/.npmignore
    new file mode 100644
    index 0000000..6c78602
    --- /dev/null
    +++ b/cep/node_modules/after/.npmignore
    @@ -0,0 +1,2 @@
    +node_modules
    +.monitor
    diff --git a/cep/node_modules/after/.travis.yml b/cep/node_modules/after/.travis.yml
    new file mode 100644
    index 0000000..84fd7ca
    --- /dev/null
    +++ b/cep/node_modules/after/.travis.yml
    @@ -0,0 +1,5 @@
    +language: node_js
    +node_js:
    +  - 0.6
    +  - 0.8
    +  - 0.9
    diff --git a/cep/node_modules/after/LICENCE b/cep/node_modules/after/LICENCE
    new file mode 100644
    index 0000000..7c35130
    --- /dev/null
    +++ b/cep/node_modules/after/LICENCE
    @@ -0,0 +1,19 @@
    +Copyright (c) 2011 Raynos.
    +
    +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/cep/node_modules/after/README.md b/cep/node_modules/after/README.md
    new file mode 100644
    index 0000000..0012d35
    --- /dev/null
    +++ b/cep/node_modules/after/README.md
    @@ -0,0 +1,75 @@
    +# After [![Build Status][1]][2]
    +
    +Invoke callback after n calls
    +
    +## Status: production ready
    +
    +## Example
    +
    +    var after = require("after")
    +        , next = after(3, logItWorks)
    +
    +    next()
    +    next()
    +    next() // it works
    +
    +    function logItWorks() {
    +        console.log("it works!")
    +    }
    +
    +## Example with error handling
    +
    +    var after = require("after")
    +        , next = after(3, logError)
    +
    +    next()
    +    next(new Error("oops")) // logs oops
    +    next() // does nothing
    +
    +    function logError(err) {
    +        console.log(err)
    +    }
    +
    +## After < 0.6.0
    +
    +Older versions of after had iterators and flows in them.
    +
    +These have been replaced with seperate modules
    +
    + - [iterators][8]
    + - [composite][9]
    +
    +## Installation
    +
    +`npm install after`
    +
    +## Tests
    +
    +`npm test`
    +
    +## Blog post
    +
    + - [Flow control in node.js][3]
    +
    +## Examples :
    +
    + - [Determining the end of asynchronous operations][4]
    + - [In javascript what are best practices for executing multiple asynchronous functions][5]
    + - [JavaScript performance long running tasks][6]
    + - [Synchronous database queries with node.js][7]
    +
    +## Contributors
    +
    + - Raynos
    +
    +## MIT Licenced
    +
    +  [1]: https://secure.travis-ci.org/Raynos/after.png
    +  [2]: http://travis-ci.org/Raynos/after
    +  [3]: http://raynos.org/blog/2/Flow-control-in-node.js
    +  [4]: http://stackoverflow.com/questions/6852059/determining-the-end-of-asynchronous-operations-javascript/6852307#6852307
    +  [5]: http://stackoverflow.com/questions/6869872/in-javascript-what-are-best-practices-for-executing-multiple-asynchronous-functi/6870031#6870031
    +  [6]: http://stackoverflow.com/questions/6864397/javascript-performance-long-running-tasks/6889419#6889419
    +  [7]: http://stackoverflow.com/questions/6597493/synchronous-database-queries-with-node-js/6620091#6620091
    +  [8]: http://github.com/Raynos/iterators
    +  [9]: http://github.com/Raynos/composite
    diff --git a/cep/node_modules/after/index.js b/cep/node_modules/after/index.js
    new file mode 100644
    index 0000000..ec24879
    --- /dev/null
    +++ b/cep/node_modules/after/index.js
    @@ -0,0 +1,28 @@
    +module.exports = after
    +
    +function after(count, callback, err_cb) {
    +    var bail = false
    +    err_cb = err_cb || noop
    +    proxy.count = count
    +
    +    return (count === 0) ? callback() : proxy
    +
    +    function proxy(err, result) {
    +        if (proxy.count <= 0) {
    +            throw new Error('after called too many times')
    +        }
    +        --proxy.count
    +
    +        // after first error, rest are passed to err_cb
    +        if (err) {
    +            bail = true
    +            callback(err)
    +            // future error callbacks will go to error handler
    +            callback = err_cb
    +        } else if (proxy.count === 0 && !bail) {
    +            callback(null, result)
    +        }
    +    }
    +}
    +
    +function noop() {}
    diff --git a/cep/node_modules/after/package.json b/cep/node_modules/after/package.json
    new file mode 100644
    index 0000000..d48ea57
    --- /dev/null
    +++ b/cep/node_modules/after/package.json
    @@ -0,0 +1,97 @@
    +{
    +  "_args": [
    +    [
    +      {
    +        "raw": "after@0.8.1",
    +        "scope": null,
    +        "escapedName": "after",
    +        "name": "after",
    +        "rawSpec": "0.8.1",
    +        "spec": "0.8.1",
    +        "type": "version"
    +      },
    +      "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\engine.io-parser"
    +    ]
    +  ],
    +  "_from": "after@0.8.1",
    +  "_id": "after@0.8.1",
    +  "_inCache": true,
    +  "_installable": true,
    +  "_location": "/after",
    +  "_npmUser": {
    +    "name": "raynos",
    +    "email": "raynos2@gmail.com"
    +  },
    +  "_npmVersion": "1.2.25",
    +  "_phantomChildren": {},
    +  "_requested": {
    +    "raw": "after@0.8.1",
    +    "scope": null,
    +    "escapedName": "after",
    +    "name": "after",
    +    "rawSpec": "0.8.1",
    +    "spec": "0.8.1",
    +    "type": "version"
    +  },
    +  "_requiredBy": [
    +    "/engine.io-parser"
    +  ],
    +  "_resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz",
    +  "_shasum": "ab5d4fb883f596816d3515f8f791c0af486dd627",
    +  "_shrinkwrap": null,
    +  "_spec": "after@0.8.1",
    +  "_where": "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\engine.io-parser",
    +  "author": {
    +    "name": "Raynos",
    +    "email": "raynos2@gmail.com"
    +  },
    +  "bugs": {
    +    "url": "https://github.com/Raynos/after/issues"
    +  },
    +  "contributors": [
    +    {
    +      "name": "Raynos",
    +      "email": "raynos2@gmail.com",
    +      "url": "http://raynos.org"
    +    }
    +  ],
    +  "dependencies": {},
    +  "description": "after - tiny flow control",
    +  "devDependencies": {
    +    "mocha": "~1.8.1"
    +  },
    +  "directories": {},
    +  "dist": {
    +    "shasum": "ab5d4fb883f596816d3515f8f791c0af486dd627",
    +    "tarball": "https://registry.npmjs.org/after/-/after-0.8.1.tgz"
    +  },
    +  "homepage": "https://github.com/Raynos/after#readme",
    +  "keywords": [
    +    "flowcontrol",
    +    "after",
    +    "flow",
    +    "control",
    +    "arch"
    +  ],
    +  "maintainers": [
    +    {
    +      "name": "raynos",
    +      "email": "raynos2@gmail.com"
    +    },
    +    {
    +      "name": "shtylman",
    +      "email": "shtylman@gmail.com"
    +    }
    +  ],
    +  "name": "after",
    +  "optionalDependencies": {},
    +  "readme": "ERROR: No README data found!",
    +  "repository": {
    +    "type": "git",
    +    "url": "git://github.com/Raynos/after.git"
    +  },
    +  "scripts": {
    +    "test": "mocha --ui tdd --reporter spec test/*.js"
    +  },
    +  "version": "0.8.1"
    +}
    diff --git a/cep/node_modules/after/test/after-test.js b/cep/node_modules/after/test/after-test.js
    new file mode 100644
    index 0000000..0d63f4c
    --- /dev/null
    +++ b/cep/node_modules/after/test/after-test.js
    @@ -0,0 +1,120 @@
    +/*global suite, test*/
    +
    +var assert = require("assert")
    +    , after = require("../")
    +
    +test("exists", function () {
    +    assert(typeof after === "function", "after is not a function")
    +})
    +
    +test("after when called with 0 invokes", function (done) {
    +    after(0, done)
    +});
    +
    +test("after 1", function (done) {
    +    var next = after(1, done)
    +    next()
    +})
    +
    +test("after 5", function (done) {
    +    var next = after(5, done)
    +    , i = 5
    +
    +    while (i--) {
    +        next()
    +    }
    +})
    +
    +test("manipulate count", function (done) {
    +    var next = after(1, done)
    +    , i = 5
    +
    +    next.count = i
    +    while (i--) {
    +        next()
    +    }
    +})
    +
    +test("after terminates on error", function (done) {
    +    var next = after(2, function(err) {
    +        assert.equal(err.message, 'test');
    +        done();
    +    })
    +    next(new Error('test'))
    +    next(new Error('test2'))
    +})
    +
    +test('gee', function(done) {
    +    done = after(2, done)
    +
    +    function cb(err) {
    +        assert.equal(err.message, 1);
    +        done()
    +    }
    +
    +    var next = after(3, cb, function(err) {
    +        assert.equal(err.message, 2)
    +        done()
    +    });
    +
    +    next()
    +    next(new Error(1))
    +    next(new Error(2))
    +})
    +
    +test('eee', function(done) {
    +    done = after(3, done)
    +
    +    function cb(err) {
    +        assert.equal(err.message, 1);
    +        done()
    +    }
    +
    +    var next = after(3, cb, function(err) {
    +        assert.equal(err.message, 2)
    +        done()
    +    });
    +
    +    next(new Error(1))
    +    next(new Error(2))
    +    next(new Error(2))
    +})
    +
    +test('gge', function(done) {
    +    function cb(err) {
    +        assert.equal(err.message, 1);
    +        done()
    +    }
    +
    +    var next = after(3, cb, function(err) {
    +        // should not happen
    +        assert.ok(false);
    +    });
    +
    +    next()
    +    next()
    +    next(new Error(1))
    +})
    +
    +test('egg', function(done) {
    +    function cb(err) {
    +        assert.equal(err.message, 1);
    +        done()
    +    }
    +
    +    var next = after(3, cb, function(err) {
    +        // should not happen
    +        assert.ok(false);
    +    });
    +
    +    next(new Error(1))
    +    next()
    +    next()
    +})
    +
    +test('throws on too many calls', function(done) {
    +    var next = after(1, done);
    +    next()
    +    assert.throws(next, /after called too many times/);
    +});
    +
    diff --git a/cep/node_modules/arraybuffer.slice/.npmignore b/cep/node_modules/arraybuffer.slice/.npmignore
    new file mode 100644
    index 0000000..cfbee8d
    --- /dev/null
    +++ b/cep/node_modules/arraybuffer.slice/.npmignore
    @@ -0,0 +1,17 @@
    +lib-cov
    +lcov.info
    +*.seed
    +*.log
    +*.csv
    +*.dat
    +*.out
    +*.pid
    +*.gz
    +
    +pids
    +logs
    +results
    +build
    +.grunt
    +
    +node_modules
    diff --git a/cep/node_modules/arraybuffer.slice/Makefile b/cep/node_modules/arraybuffer.slice/Makefile
    new file mode 100644
    index 0000000..849887f
    --- /dev/null
    +++ b/cep/node_modules/arraybuffer.slice/Makefile
    @@ -0,0 +1,8 @@
    +
    +REPORTER = dot
    +
    +test:
    +	@./node_modules/.bin/mocha \
    +		--reporter $(REPORTER)
    +
    +.PHONY: test
    diff --git a/cep/node_modules/arraybuffer.slice/README.md b/cep/node_modules/arraybuffer.slice/README.md
    new file mode 100644
    index 0000000..15e465e
    --- /dev/null
    +++ b/cep/node_modules/arraybuffer.slice/README.md
    @@ -0,0 +1,17 @@
    +# How to
    +```javascript
    +var sliceBuffer = require('arraybuffer.slice');
    +var ab = (new Int8Array(5)).buffer;
    +var sliced = sliceBuffer(ab, 1, 3);
    +sliced = sliceBuffer(ab, 1);
    +```
    +
    +# Licence (MIT)
    +Copyright (C) 2013 Rase-
    +
    +
    +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/cep/node_modules/arraybuffer.slice/index.js b/cep/node_modules/arraybuffer.slice/index.js
    new file mode 100644
    index 0000000..11ac556
    --- /dev/null
    +++ b/cep/node_modules/arraybuffer.slice/index.js
    @@ -0,0 +1,29 @@
    +/**
    + * An abstraction for slicing an arraybuffer even when
    + * ArrayBuffer.prototype.slice is not supported
    + *
    + * @api public
    + */
    +
    +module.exports = function(arraybuffer, start, end) {
    +  var bytes = arraybuffer.byteLength;
    +  start = start || 0;
    +  end = end || bytes;
    +
    +  if (arraybuffer.slice) { return arraybuffer.slice(start, end); }
    +
    +  if (start < 0) { start += bytes; }
    +  if (end < 0) { end += bytes; }
    +  if (end > bytes) { end = bytes; }
    +
    +  if (start >= bytes || start >= end || bytes === 0) {
    +    return new ArrayBuffer(0);
    +  }
    +
    +  var abv = new Uint8Array(arraybuffer);
    +  var result = new Uint8Array(end - start);
    +  for (var i = start, ii = 0; i < end; i++, ii++) {
    +    result[ii] = abv[i];
    +  }
    +  return result.buffer;
    +};
    diff --git a/cep/node_modules/arraybuffer.slice/package.json b/cep/node_modules/arraybuffer.slice/package.json
    new file mode 100644
    index 0000000..672e6d6
    --- /dev/null
    +++ b/cep/node_modules/arraybuffer.slice/package.json
    @@ -0,0 +1,73 @@
    +{
    +  "_args": [
    +    [
    +      {
    +        "raw": "arraybuffer.slice@0.0.6",
    +        "scope": null,
    +        "escapedName": "arraybuffer.slice",
    +        "name": "arraybuffer.slice",
    +        "rawSpec": "0.0.6",
    +        "spec": "0.0.6",
    +        "type": "version"
    +      },
    +      "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\engine.io-parser"
    +    ]
    +  ],
    +  "_from": "arraybuffer.slice@0.0.6",
    +  "_id": "arraybuffer.slice@0.0.6",
    +  "_inCache": true,
    +  "_installable": true,
    +  "_location": "/arraybuffer.slice",
    +  "_npmUser": {
    +    "name": "rase-",
    +    "email": "tonykovanen@hotmail.com"
    +  },
    +  "_npmVersion": "1.3.5",
    +  "_phantomChildren": {},
    +  "_requested": {
    +    "raw": "arraybuffer.slice@0.0.6",
    +    "scope": null,
    +    "escapedName": "arraybuffer.slice",
    +    "name": "arraybuffer.slice",
    +    "rawSpec": "0.0.6",
    +    "spec": "0.0.6",
    +    "type": "version"
    +  },
    +  "_requiredBy": [
    +    "/engine.io-parser"
    +  ],
    +  "_resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz",
    +  "_shasum": "f33b2159f0532a3f3107a272c0ccfbd1ad2979ca",
    +  "_shrinkwrap": null,
    +  "_spec": "arraybuffer.slice@0.0.6",
    +  "_where": "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\engine.io-parser",
    +  "bugs": {
    +    "url": "https://github.com/rase-/arraybuffer.slice/issues"
    +  },
    +  "dependencies": {},
    +  "description": "Exports a function for slicing ArrayBuffers (no polyfilling)",
    +  "devDependencies": {
    +    "expect.js": "0.2.0",
    +    "mocha": "1.17.1"
    +  },
    +  "directories": {},
    +  "dist": {
    +    "shasum": "f33b2159f0532a3f3107a272c0ccfbd1ad2979ca",
    +    "tarball": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz"
    +  },
    +  "homepage": "https://github.com/rase-/arraybuffer.slice",
    +  "maintainers": [
    +    {
    +      "name": "rase-",
    +      "email": "tonykovanen@hotmail.com"
    +    }
    +  ],
    +  "name": "arraybuffer.slice",
    +  "optionalDependencies": {},
    +  "readme": "ERROR: No README data found!",
    +  "repository": {
    +    "type": "git",
    +    "url": "git+ssh://git@github.com/rase-/arraybuffer.slice.git"
    +  },
    +  "version": "0.0.6"
    +}
    diff --git a/cep/node_modules/arraybuffer.slice/test/slice-buffer.js b/cep/node_modules/arraybuffer.slice/test/slice-buffer.js
    new file mode 100644
    index 0000000..4778da6
    --- /dev/null
    +++ b/cep/node_modules/arraybuffer.slice/test/slice-buffer.js
    @@ -0,0 +1,227 @@
    +/*
    + * Test dependencies
    + */
    +
    +var sliceBuffer = require('../index.js');
    +var expect = require('expect.js');
    +
    +/**
    + * Tests
    + */
    +
    +describe('sliceBuffer', function() {
    +  describe('using standard slice', function() {
    +    it('should slice correctly with only start provided', function() {
    +      var abv = new Uint8Array(10);
    +      for (var i = 0; i < abv.length; i++) {
    +        abv[i] = i;
    +      }
    +
    +      var sliced = sliceBuffer(abv.buffer, 3);
    +      var sabv = new Uint8Array(sliced);
    +      for (var i = 3, ii = 0; i < abv.length; i++, ii++) {
    +        expect(abv[i]).to.equal(sabv[ii]);
    +      }
    +    });
    +
    +    it('should slice correctly with start and end provided', function() {
    +      var abv = new Uint8Array(10);
    +      for (var i = 0; i < abv.length; i++) {
    +        abv[i] = i;
    +      }
    +
    +      var sliced = sliceBuffer(abv.buffer, 3, 8);
    +      var sabv = new Uint8Array(sliced);
    +      for (var i = 3, ii = 0; i < 8; i++, ii++) {
    +        expect(abv[i]).to.equal(sabv[ii]);
    +      }
    +    });
    +
    +    it('should slice correctly with negative start', function() {
    +      var abv = new Uint8Array(10);
    +      for (var i = 0; i < abv.length; i++) {
    +        abv[i] = i;
    +      }
    +
    +      var sliced = sliceBuffer(abv.buffer, -3);
    +      var sabv = new Uint8Array(sliced);
    +      for (var i = abv.length - 3, ii = 0; i < abv.length; i++, ii++) {
    +        expect(abv[i]).to.equal(sabv[ii]);
    +      }
    +    });
    +
    +    it('should slice correctly with negative end', function() {
    +      var abv = new Uint8Array(10);
    +      for (var i = 0; i < abv.length; i++) {
    +        abv[i] = i;
    +      }
    +
    +      var sliced = sliceBuffer(abv.buffer, 0, -3);
    +      var sabv = new Uint8Array(sliced);
    +      for (var i = 0, ii = 0; i < abv.length - 3; i++, ii++) {
    +        expect(abv[i]).to.equal(sabv[ii]);
    +      }
    +    });
    +
    +    it('should slice correctly with negative start and end', function() {
    +      var abv = new Uint8Array(10);
    +      for (var i = 0; i < abv.length; i++) {
    +        abv[i] = i;
    +      }
    +
    +      var sliced = sliceBuffer(abv.buffer, -6, -3);
    +      var sabv = new Uint8Array(sliced);
    +      for (var i = abv.length - 6, ii = 0; i < abv.length - 3; i++, ii++) {
    +        expect(abv[i]).to.equal(sabv[ii]);
    +      }
    +    });
    +
    +    it('should slice correctly with equal start and end', function() {
    +      var abv = new Uint8Array(10);
    +      for (var i = 0; i < abv.length; i++) {
    +        abv[i] = i;
    +      }
    +
    +      var sliced = sliceBuffer(abv.buffer, 1, 1);
    +      expect(sliced.byteLength).to.equal(0);
    +    });
    +    
    +    it('should slice correctly when end larger than buffer', function() {
    +      var abv = new Uint8Array(10);
    +      for (var i = 0; i < abv.length; i++) {
    +        abv[i] = i;
    +      }
    +
    +      var sliced = sliceBuffer(abv.buffer, 0, 100);
    +      expect(new Uint8Array(sliced)).to.eql(abv);
    +    });
    +
    +    it('shoud slice correctly when start larger than end', function() {
    +      var abv = new Uint8Array(10);
    +      for (var i = 0; i < abv.length; i++) {
    +        abv[i] = i;
    +      }
    +
    +      var sliced = sliceBuffer(abv.buffer, 6, 5);
    +      expect(sliced.byteLength).to.equal(0);
    +    });
    +  });
    +
    +  describe('using fallback', function() {
    +    it('should slice correctly with only start provided', function() {
    +      var abv = new Uint8Array(10);
    +      for (var i = 0; i < abv.length; i++) {
    +        abv[i] = i;
    +      }
    +      var ab = abv.buffer;
    +      ab.slice = undefined;
    +
    +      var sliced = sliceBuffer(ab, 3);
    +      var sabv = new Uint8Array(sliced);
    +      for (var i = 3, ii = 0; i < abv.length; i++, ii++) {
    +        expect(abv[i]).to.equal(sabv[ii]);
    +      }
    +    });
    +
    +    it('should slice correctly with start and end provided', function() {
    +      var abv = new Uint8Array(10);
    +      for (var i = 0; i < abv.length; i++) {
    +        abv[i] = i;
    +      }
    +      var ab = abv.buffer;
    +      ab.slice = undefined;
    +
    +
    +      var sliced = sliceBuffer(ab, 3, 8);
    +      var sabv = new Uint8Array(sliced);
    +      for (var i = 3, ii = 0; i < 8; i++, ii++) {
    +        expect(abv[i]).to.equal(sabv[ii]);
    +      }
    +    });
    +
    +    it('should slice correctly with negative start', function() {
    +      var abv = new Uint8Array(10);
    +      for (var i = 0; i < abv.length; i++) {
    +        abv[i] = i;
    +      }
    +      var ab = abv.buffer;
    +      ab.slice = undefined;
    +
    +
    +      var sliced = sliceBuffer(ab, -3);
    +      var sabv = new Uint8Array(sliced);
    +      for (var i = abv.length - 3, ii = 0; i < abv.length; i++, ii++) {
    +        expect(abv[i]).to.equal(sabv[ii]);
    +      }
    +    });
    +
    +    it('should slice correctly with negative end', function() {
    +      var abv = new Uint8Array(10);
    +      for (var i = 0; i < abv.length; i++) {
    +        abv[i] = i;
    +      }
    +      var ab = abv.buffer;
    +      ab.slice = undefined;
    +
    +      var sliced = sliceBuffer(ab, 0, -3);
    +      var sabv = new Uint8Array(sliced);
    +      for (var i = 0, ii = 0; i < abv.length - 3; i++, ii++) {
    +        expect(abv[i]).to.equal(sabv[ii]);
    +      }
    +    });
    +
    +    it('should slice correctly with negative start and end', function() {
    +      var abv = new Uint8Array(10);
    +      for (var i = 0; i < abv.length; i++) {
    +        abv[i] = i;
    +      }
    +      var ab = abv.buffer;
    +      ab.slice = undefined;
    +
    +      var sliced = sliceBuffer(ab, -6, -3);
    +      var sabv = new Uint8Array(sliced);
    +      for (var i = abv.length - 6, ii = 0; i < abv.length - 3; i++, ii++) {
    +        expect(abv[i]).to.equal(sabv[ii]);
    +      }
    +    });
    +
    +    it('should slice correctly with equal start and end', function() {
    +      var abv = new Uint8Array(10);
    +      for (var i = 0; i < abv.length; i++) {
    +        abv[i] = i;
    +      }
    +      var ab = abv.buffer;
    +      ab.slice = undefined;
    +
    +      var sliced = sliceBuffer(ab, 1, 1);
    +      expect(sliced.byteLength).to.equal(0);
    +    });
    +
    +    it('should slice correctly when end larger than buffer', function() {
    +      var abv = new Uint8Array(10);
    +      for (var i = 0; i < abv.length; i++) {
    +        abv[i] = i;
    +      }
    +      var ab = abv.buffer;
    +      ab.slice = undefined;
    +
    +      var sliced = sliceBuffer(ab, 0, 100);
    +      var sabv = new Uint8Array(sliced);
    +      for (var i = 0; i < abv.length; i++) {
    +        expect(abv[i]).to.equal(sabv[i]);
    +      }
    +    });
    +
    +    it('shoud slice correctly when start larger than end', function() {
    +      var abv = new Uint8Array(10);
    +      for (var i = 0; i < abv.length; i++) {
    +        abv[i] = i;
    +      }
    +      var ab = abv.buffer;
    +      ab.slice = undefined;
    +
    +      var sliced = sliceBuffer(ab, 6, 5);
    +      expect(sliced.byteLength).to.equal(0);
    +    });
    +  });
    +});
    diff --git a/cep/node_modules/backo2/.npmignore b/cep/node_modules/backo2/.npmignore
    new file mode 100644
    index 0000000..c2658d7
    --- /dev/null
    +++ b/cep/node_modules/backo2/.npmignore
    @@ -0,0 +1 @@
    +node_modules/
    diff --git a/cep/node_modules/backo2/History.md b/cep/node_modules/backo2/History.md
    new file mode 100644
    index 0000000..8eb28b8
    --- /dev/null
    +++ b/cep/node_modules/backo2/History.md
    @@ -0,0 +1,12 @@
    +
    +1.0.1 / 2014-02-17
    +==================
    +
    + * go away decimal point
    + * history
    +
    +1.0.0 / 2014-02-17
    +==================
    +
    + * add jitter option
    + * Initial commit
    diff --git a/cep/node_modules/backo2/Makefile b/cep/node_modules/backo2/Makefile
    new file mode 100644
    index 0000000..9987df8
    --- /dev/null
    +++ b/cep/node_modules/backo2/Makefile
    @@ -0,0 +1,8 @@
    +
    +test:
    +	@./node_modules/.bin/mocha \
    +		--require should \
    +		--reporter dot \
    +		--bail
    +
    +.PHONY: test
    \ No newline at end of file
    diff --git a/cep/node_modules/backo2/Readme.md b/cep/node_modules/backo2/Readme.md
    new file mode 100644
    index 0000000..0df2a39
    --- /dev/null
    +++ b/cep/node_modules/backo2/Readme.md
    @@ -0,0 +1,34 @@
    +# backo
    +
    +  Simple exponential backoff because the others seem to have weird abstractions.
    +
    +## Installation
    +
    +```
    +$ npm install backo
    +```
    +
    +## Options
    +
    + - `min` initial timeout in milliseconds [100]
    + - `max` max timeout [10000]
    + - `jitter` [0]
    + - `factor` [2]
    +
    +## Example
    +
    +```js
    +var Backoff = require('backo');
    +var backoff = new Backoff({ min: 100, max: 20000 });
    +
    +setTimeout(function(){
    +  something.reconnect();
    +}, backoff.duration());
    +
    +// later when something works
    +backoff.reset()
    +```
    +
    +# License
    +
    +  MIT
    diff --git a/cep/node_modules/backo2/component.json b/cep/node_modules/backo2/component.json
    new file mode 100644
    index 0000000..994845a
    --- /dev/null
    +++ b/cep/node_modules/backo2/component.json
    @@ -0,0 +1,11 @@
    +{
    +  "name": "backo",
    +  "repo": "segmentio/backo",
    +  "dependencies": {},
    +  "version": "1.0.1",
    +  "description": "simple backoff without the weird abstractions",
    +  "keywords": ["backoff"],
    +  "license": "MIT",
    +  "scripts": ["index.js"],
    +  "main": "index.js"
    +}
    diff --git a/cep/node_modules/backo2/index.js b/cep/node_modules/backo2/index.js
    new file mode 100644
    index 0000000..fac4429
    --- /dev/null
    +++ b/cep/node_modules/backo2/index.js
    @@ -0,0 +1,85 @@
    +
    +/**
    + * Expose `Backoff`.
    + */
    +
    +module.exports = Backoff;
    +
    +/**
    + * Initialize backoff timer with `opts`.
    + *
    + * - `min` initial timeout in milliseconds [100]
    + * - `max` max timeout [10000]
    + * - `jitter` [0]
    + * - `factor` [2]
    + *
    + * @param {Object} opts
    + * @api public
    + */
    +
    +function Backoff(opts) {
    +  opts = opts || {};
    +  this.ms = opts.min || 100;
    +  this.max = opts.max || 10000;
    +  this.factor = opts.factor || 2;
    +  this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;
    +  this.attempts = 0;
    +}
    +
    +/**
    + * Return the backoff duration.
    + *
    + * @return {Number}
    + * @api public
    + */
    +
    +Backoff.prototype.duration = function(){
    +  var ms = this.ms * Math.pow(this.factor, this.attempts++);
    +  if (this.jitter) {
    +    var rand =  Math.random();
    +    var deviation = Math.floor(rand * this.jitter * ms);
    +    ms = (Math.floor(rand * 10) & 1) == 0  ? ms - deviation : ms + deviation;
    +  }
    +  return Math.min(ms, this.max) | 0;
    +};
    +
    +/**
    + * Reset the number of attempts.
    + *
    + * @api public
    + */
    +
    +Backoff.prototype.reset = function(){
    +  this.attempts = 0;
    +};
    +
    +/**
    + * Set the minimum duration
    + *
    + * @api public
    + */
    +
    +Backoff.prototype.setMin = function(min){
    +  this.ms = min;
    +};
    +
    +/**
    + * Set the maximum duration
    + *
    + * @api public
    + */
    +
    +Backoff.prototype.setMax = function(max){
    +  this.max = max;
    +};
    +
    +/**
    + * Set the jitter
    + *
    + * @api public
    + */
    +
    +Backoff.prototype.setJitter = function(jitter){
    +  this.jitter = jitter;
    +};
    +
    diff --git a/cep/node_modules/backo2/package.json b/cep/node_modules/backo2/package.json
    new file mode 100644
    index 0000000..2d92e21
    --- /dev/null
    +++ b/cep/node_modules/backo2/package.json
    @@ -0,0 +1,79 @@
    +{
    +  "_args": [
    +    [
    +      {
    +        "raw": "backo2@1.0.2",
    +        "scope": null,
    +        "escapedName": "backo2",
    +        "name": "backo2",
    +        "rawSpec": "1.0.2",
    +        "spec": "1.0.2",
    +        "type": "version"
    +      },
    +      "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\socket.io-client"
    +    ]
    +  ],
    +  "_from": "backo2@1.0.2",
    +  "_id": "backo2@1.0.2",
    +  "_inCache": true,
    +  "_installable": true,
    +  "_location": "/backo2",
    +  "_npmUser": {
    +    "name": "mokesmokes",
    +    "email": "mokesmokes@gmail.com"
    +  },
    +  "_npmVersion": "1.4.28",
    +  "_phantomChildren": {},
    +  "_requested": {
    +    "raw": "backo2@1.0.2",
    +    "scope": null,
    +    "escapedName": "backo2",
    +    "name": "backo2",
    +    "rawSpec": "1.0.2",
    +    "spec": "1.0.2",
    +    "type": "version"
    +  },
    +  "_requiredBy": [
    +    "/socket.io-client"
    +  ],
    +  "_resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
    +  "_shasum": "31ab1ac8b129363463e35b3ebb69f4dfcfba7947",
    +  "_shrinkwrap": null,
    +  "_spec": "backo2@1.0.2",
    +  "_where": "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\socket.io-client",
    +  "bugs": {
    +    "url": "https://github.com/mokesmokes/backo/issues"
    +  },
    +  "dependencies": {},
    +  "description": "simple backoff based on segmentio/backo",
    +  "devDependencies": {
    +    "mocha": "*",
    +    "should": "*"
    +  },
    +  "directories": {},
    +  "dist": {
    +    "shasum": "31ab1ac8b129363463e35b3ebb69f4dfcfba7947",
    +    "tarball": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz"
    +  },
    +  "gitHead": "3e695bade7756fef2295e8883bf3570a06e5d9ec",
    +  "homepage": "https://github.com/mokesmokes/backo",
    +  "keywords": [
    +    "backoff"
    +  ],
    +  "license": "MIT",
    +  "maintainers": [
    +    {
    +      "name": "mokesmokes",
    +      "email": "mokesmokes@gmail.com"
    +    }
    +  ],
    +  "name": "backo2",
    +  "optionalDependencies": {},
    +  "readme": "ERROR: No README data found!",
    +  "repository": {
    +    "type": "git",
    +    "url": "git+https://github.com/mokesmokes/backo.git"
    +  },
    +  "scripts": {},
    +  "version": "1.0.2"
    +}
    diff --git a/cep/node_modules/backo2/test/index.js b/cep/node_modules/backo2/test/index.js
    new file mode 100644
    index 0000000..ea1f6de
    --- /dev/null
    +++ b/cep/node_modules/backo2/test/index.js
    @@ -0,0 +1,18 @@
    +
    +var Backoff = require('..');
    +var assert = require('assert');
    +
    +describe('.duration()', function(){
    +  it('should increase the backoff', function(){
    +    var b = new Backoff;
    +
    +    assert(100 == b.duration());
    +    assert(200 == b.duration());
    +    assert(400 == b.duration());
    +    assert(800 == b.duration());
    +
    +    b.reset();
    +    assert(100 == b.duration());
    +    assert(200 == b.duration());
    +  })
    +})
    \ No newline at end of file
    diff --git a/cep/node_modules/base64-arraybuffer/.npmignore b/cep/node_modules/base64-arraybuffer/.npmignore
    new file mode 100644
    index 0000000..2ccbe46
    --- /dev/null
    +++ b/cep/node_modules/base64-arraybuffer/.npmignore
    @@ -0,0 +1 @@
    +/node_modules/
    diff --git a/cep/node_modules/base64-arraybuffer/.travis.yml b/cep/node_modules/base64-arraybuffer/.travis.yml
    new file mode 100644
    index 0000000..e2eeb99
    --- /dev/null
    +++ b/cep/node_modules/base64-arraybuffer/.travis.yml
    @@ -0,0 +1,6 @@
    +---
    +language: node_js
    +node_js:
    +- '0.10'
    +before_script:
    +- npm install
    diff --git a/cep/node_modules/base64-arraybuffer/LICENSE-MIT b/cep/node_modules/base64-arraybuffer/LICENSE-MIT
    new file mode 100644
    index 0000000..ed27b41
    --- /dev/null
    +++ b/cep/node_modules/base64-arraybuffer/LICENSE-MIT
    @@ -0,0 +1,22 @@
    +Copyright (c) 2012 Niklas von Hertzen
    +
    +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/cep/node_modules/base64-arraybuffer/README.md b/cep/node_modules/base64-arraybuffer/README.md
    new file mode 100644
    index 0000000..b841154
    --- /dev/null
    +++ b/cep/node_modules/base64-arraybuffer/README.md
    @@ -0,0 +1,23 @@
    +# base64-arraybuffer
    +
    +[![Build Status](https://travis-ci.org/niklasvh/base64-arraybuffer.png)](https://travis-ci.org/niklasvh/base64-arraybuffer)
    +
    +Encode/decode base64 data into ArrayBuffers
    +
    +## Getting Started
    +Install the module with: `npm install base64-arraybuffer`
    +
    +## API
    +The library encodes and decodes base64 to and from ArrayBuffers
    +
    + - __encode(buffer)__ - Encodes `ArrayBuffer` into base64 string
    + - __decode(str)__ - Decodes base64 string to `ArrayBuffer`
    +
    +## Release History
    +
    + - 0.1.2 - Fix old format of typed arrays
    + - 0.1.0 - Initial version, basic decode/encode base64 to and from ArrayBuffer
    +
    +## License
    +Copyright (c) 2012 Niklas von Hertzen
    +Licensed under the MIT license.
    diff --git a/cep/node_modules/base64-arraybuffer/grunt.js b/cep/node_modules/base64-arraybuffer/grunt.js
    new file mode 100644
    index 0000000..73c4e7a
    --- /dev/null
    +++ b/cep/node_modules/base64-arraybuffer/grunt.js
    @@ -0,0 +1,39 @@
    +module.exports = function(grunt) {
    +  "use strict";
    +  // Project configuration.
    +  grunt.initConfig({
    +    pkg: '',
    +    test: {
    +      files: ['test/**/*.js']
    +    },
    +    lint: {
    +      files: ['grunt.js', 'lib/**/*.js', 'test/**/*.js']
    +    },
    +    watch: {
    +      files: '',
    +      tasks: 'default'
    +    },
    +    jshint: {
    +      options: {
    +        curly: true,
    +        eqeqeq: true,
    +        immed: true,
    +        latedef: true,
    +        newcap: true,
    +        noarg: true,
    +        sub: true,
    +        undef: true,
    +        boss: true,
    +        eqnull: true,
    +        node: true
    +      },
    +      globals: {
    +        exports: true
    +      }
    +    }
    +  });
    +
    +  // Default task.
    +  grunt.registerTask('default', 'test');
    +
    +};
    \ No newline at end of file
    diff --git a/cep/node_modules/base64-arraybuffer/lib/base64-arraybuffer.js b/cep/node_modules/base64-arraybuffer/lib/base64-arraybuffer.js
    new file mode 100644
    index 0000000..362fbfa
    --- /dev/null
    +++ b/cep/node_modules/base64-arraybuffer/lib/base64-arraybuffer.js
    @@ -0,0 +1,59 @@
    +/*
    + * base64-arraybuffer
    + * https://github.com/niklasvh/base64-arraybuffer
    + *
    + * Copyright (c) 2012 Niklas von Hertzen
    + * Licensed under the MIT license.
    + */
    +(function(chars){
    +  "use strict";
    +
    +  exports.encode = function(arraybuffer) {
    +    var bytes = new Uint8Array(arraybuffer),
    +    i, len = bytes.length, base64 = "";
    +
    +    for (i = 0; i < len; i+=3) {
    +      base64 += chars[bytes[i] >> 2];
    +      base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];
    +      base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];
    +      base64 += chars[bytes[i + 2] & 63];
    +    }
    +
    +    if ((len % 3) === 2) {
    +      base64 = base64.substring(0, base64.length - 1) + "=";
    +    } else if (len % 3 === 1) {
    +      base64 = base64.substring(0, base64.length - 2) + "==";
    +    }
    +
    +    return base64;
    +  };
    +
    +  exports.decode =  function(base64) {
    +    var bufferLength = base64.length * 0.75,
    +    len = base64.length, i, p = 0,
    +    encoded1, encoded2, encoded3, encoded4;
    +
    +    if (base64[base64.length - 1] === "=") {
    +      bufferLength--;
    +      if (base64[base64.length - 2] === "=") {
    +        bufferLength--;
    +      }
    +    }
    +
    +    var arraybuffer = new ArrayBuffer(bufferLength),
    +    bytes = new Uint8Array(arraybuffer);
    +
    +    for (i = 0; i < len; i+=4) {
    +      encoded1 = chars.indexOf(base64[i]);
    +      encoded2 = chars.indexOf(base64[i+1]);
    +      encoded3 = chars.indexOf(base64[i+2]);
    +      encoded4 = chars.indexOf(base64[i+3]);
    +
    +      bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);
    +      bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
    +      bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);
    +    }
    +
    +    return arraybuffer;
    +  };
    +})("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
    diff --git a/cep/node_modules/base64-arraybuffer/package.json b/cep/node_modules/base64-arraybuffer/package.json
    new file mode 100644
    index 0000000..14c6df8
    --- /dev/null
    +++ b/cep/node_modules/base64-arraybuffer/package.json
    @@ -0,0 +1,91 @@
    +{
    +  "_args": [
    +    [
    +      {
    +        "raw": "base64-arraybuffer@0.1.2",
    +        "scope": null,
    +        "escapedName": "base64-arraybuffer",
    +        "name": "base64-arraybuffer",
    +        "rawSpec": "0.1.2",
    +        "spec": "0.1.2",
    +        "type": "version"
    +      },
    +      "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\engine.io-parser"
    +    ]
    +  ],
    +  "_from": "base64-arraybuffer@0.1.2",
    +  "_id": "base64-arraybuffer@0.1.2",
    +  "_inCache": true,
    +  "_installable": true,
    +  "_location": "/base64-arraybuffer",
    +  "_npmUser": {
    +    "name": "niklasvh",
    +    "email": "niklasvh@gmail.com"
    +  },
    +  "_npmVersion": "1.3.21",
    +  "_phantomChildren": {},
    +  "_requested": {
    +    "raw": "base64-arraybuffer@0.1.2",
    +    "scope": null,
    +    "escapedName": "base64-arraybuffer",
    +    "name": "base64-arraybuffer",
    +    "rawSpec": "0.1.2",
    +    "spec": "0.1.2",
    +    "type": "version"
    +  },
    +  "_requiredBy": [
    +    "/engine.io-parser"
    +  ],
    +  "_resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz",
    +  "_shasum": "474df4a9f2da24e05df3158c3b1db3c3cd46a154",
    +  "_shrinkwrap": null,
    +  "_spec": "base64-arraybuffer@0.1.2",
    +  "_where": "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\engine.io-parser",
    +  "author": {
    +    "name": "Niklas von Hertzen",
    +    "email": "niklasvh@gmail.com",
    +    "url": "http://hertzen.com"
    +  },
    +  "bugs": {
    +    "url": "https://github.com/niklasvh/base64-arraybuffer/issues"
    +  },
    +  "dependencies": {},
    +  "description": "Encode/decode base64 data into ArrayBuffers",
    +  "devDependencies": {
    +    "grunt": "~0.3.17"
    +  },
    +  "directories": {},
    +  "dist": {
    +    "shasum": "474df4a9f2da24e05df3158c3b1db3c3cd46a154",
    +    "tarball": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz"
    +  },
    +  "engines": {
    +    "node": ">= 0.6.0"
    +  },
    +  "homepage": "https://github.com/niklasvh/base64-arraybuffer",
    +  "keywords": [],
    +  "licenses": [
    +    {
    +      "type": "MIT",
    +      "url": "https://github.com/niklasvh/base64-arraybuffer/blob/master/LICENSE-MIT"
    +    }
    +  ],
    +  "main": "lib/base64-arraybuffer",
    +  "maintainers": [
    +    {
    +      "name": "niklasvh",
    +      "email": "niklasvh@gmail.com"
    +    }
    +  ],
    +  "name": "base64-arraybuffer",
    +  "optionalDependencies": {},
    +  "readme": "ERROR: No README data found!",
    +  "repository": {
    +    "type": "git",
    +    "url": "git+https://github.com/niklasvh/base64-arraybuffer.git"
    +  },
    +  "scripts": {
    +    "test": "grunt test"
    +  },
    +  "version": "0.1.2"
    +}
    diff --git a/cep/node_modules/base64-arraybuffer/test/base64-arraybuffer_test.js b/cep/node_modules/base64-arraybuffer/test/base64-arraybuffer_test.js
    new file mode 100644
    index 0000000..fe89c22
    --- /dev/null
    +++ b/cep/node_modules/base64-arraybuffer/test/base64-arraybuffer_test.js
    @@ -0,0 +1,72 @@
    +(function(){
    +  "use strict";
    +  var base64_arraybuffer = require('../lib/base64-arraybuffer.js');
    +
    +  /*
    +  ======== A Handy Little Nodeunit Reference ========
    +  https://github.com/caolan/nodeunit
    +
    +  Test methods:
    +    test.expect(numAssertions)
    +    test.done()
    +  Test assertions:
    +    test.ok(value, [message])
    +    test.equal(actual, expected, [message])
    +    test.notEqual(actual, expected, [message])
    +    test.deepEqual(actual, expected, [message])
    +    test.notDeepEqual(actual, expected, [message])
    +    test.strictEqual(actual, expected, [message])
    +    test.notStrictEqual(actual, expected, [message])
    +    test.throws(block, [error], [message])
    +    test.doesNotThrow(block, [error], [message])
    +    test.ifError(value)
    +*/
    +
    +
    +  function stringArrayBuffer(str) {
    +    var buffer = new ArrayBuffer(str.length);
    +    var bytes = new Uint8Array(buffer);
    +
    +    str.split('').forEach(function(str, i) {
    +      bytes[i] = str.charCodeAt(0);
    +    });
    +
    +    return buffer;
    +  }
    +
    +  function testArrayBuffers(buffer1, buffer2) {
    +    var len1 = buffer1.byteLength,
    +    len2 = buffer2.byteLength;
    +    if (len1 !== len2) {
    +      console.log(buffer1, buffer2);
    +      return false;
    +    }
    +
    +    for (var i = 0; i < len1; i++) {
    +      if (buffer1[i] !== buffer1[i]) {
    +        console.log(i, buffer1, buffer2);
    +        return false;
    +      }
    +    }
    +    return true;
    +  }
    +
    +  exports['base64tests'] = {
    +    'encode': function(test) {
    +      test.expect(4);
    +
    +      test.equal(base64_arraybuffer.encode(stringArrayBuffer("Hello world")), "SGVsbG8gd29ybGQ=", 'encode "Hello world"');
    +      test.equal(base64_arraybuffer.encode(stringArrayBuffer("Man")), 'TWFu', 'encode "Man"');
    +      test.equal(base64_arraybuffer.encode(stringArrayBuffer("Ma")), "TWE=", 'encode "Ma"');
    +      test.equal(base64_arraybuffer.encode(stringArrayBuffer("Hello worlds!")), "SGVsbG8gd29ybGRzIQ==", 'encode "Hello worlds!"');
    +      test.done();
    +    },
    +    'decode': function(test) {
    +      test.expect(3);
    +      test.ok(testArrayBuffers(base64_arraybuffer.decode("TWFu"), stringArrayBuffer("Man")), 'decode "Man"');
    +      test.ok(testArrayBuffers(base64_arraybuffer.decode("SGVsbG8gd29ybGQ="), stringArrayBuffer("Hello world")), 'decode "Hello world"');
    +      test.ok(testArrayBuffers(base64_arraybuffer.decode("SGVsbG8gd29ybGRzIQ=="), stringArrayBuffer("Hello worlds!")), 'decode "Hello worlds!"');
    +      test.done();
    +    }
    +  };
    +})();
    diff --git a/cep/node_modules/base64id/.npmignore b/cep/node_modules/base64id/.npmignore
    new file mode 100644
    index 0000000..39e9864
    --- /dev/null
    +++ b/cep/node_modules/base64id/.npmignore
    @@ -0,0 +1,3 @@
    +support
    +test
    +examples
    diff --git a/cep/node_modules/base64id/README.md b/cep/node_modules/base64id/README.md
    new file mode 100644
    index 0000000..b4361c1
    --- /dev/null
    +++ b/cep/node_modules/base64id/README.md
    @@ -0,0 +1,18 @@
    +base64id
    +========
    +
    +Node.js module that generates a base64 id.
    +
    +Uses crypto.randomBytes when available, falls back to unsafe methods for node.js <= 0.4.
    +
    +To increase performance, random bytes are buffered to minimize the number of synchronous calls to crypto.randomBytes.
    +
    +## Installation
    +
    +   $ npm install mongoose
    +
    +## Usage
    +
    +   var base64id = require('base64id');
    +
    +   var id = base64id.generateId();
    diff --git a/cep/node_modules/base64id/lib/base64id.js b/cep/node_modules/base64id/lib/base64id.js
    new file mode 100644
    index 0000000..f688159
    --- /dev/null
    +++ b/cep/node_modules/base64id/lib/base64id.js
    @@ -0,0 +1,103 @@
    +/*!
    + * base64id v0.1.0
    + */
    +
    +/**
    + * Module dependencies
    + */
    +
    +var crypto = require('crypto');
    +
    +/**
    + * Constructor
    + */
    +
    +var Base64Id = function() { };
    +
    +/**
    + * Get random bytes
    + *
    + * Uses a buffer if available, falls back to crypto.randomBytes
    + */
    +
    +Base64Id.prototype.getRandomBytes = function(bytes) {
    +
    +  var BUFFER_SIZE = 4096
    +  var self = this;  
    +  
    +  bytes = bytes || 12;
    +
    +  if (bytes > BUFFER_SIZE) {
    +    return crypto.randomBytes(bytes);
    +  }
    +  
    +  var bytesInBuffer = parseInt(BUFFER_SIZE/bytes);
    +  var threshold = parseInt(bytesInBuffer*0.85);
    +
    +  if (!threshold) {
    +    return crypto.randomBytes(bytes);
    +  }
    +
    +  if (this.bytesBufferIndex == null) {
    +     this.bytesBufferIndex = -1;
    +  }
    +
    +  if (this.bytesBufferIndex == bytesInBuffer) {
    +    this.bytesBuffer = null;
    +    this.bytesBufferIndex = -1;
    +  }
    +
    +  // No buffered bytes available or index above threshold
    +  if (this.bytesBufferIndex == -1 || this.bytesBufferIndex > threshold) {
    +     
    +    if (!this.isGeneratingBytes) {
    +      this.isGeneratingBytes = true;
    +      crypto.randomBytes(BUFFER_SIZE, function(err, bytes) {
    +        self.bytesBuffer = bytes;
    +        self.bytesBufferIndex = 0;
    +        self.isGeneratingBytes = false;
    +      }); 
    +    }
    +    
    +    // Fall back to sync call when no buffered bytes are available
    +    if (this.bytesBufferIndex == -1) {
    +      return crypto.randomBytes(bytes);
    +    }
    +  }
    +  
    +  var result = this.bytesBuffer.slice(bytes*this.bytesBufferIndex, bytes*(this.bytesBufferIndex+1)); 
    +  this.bytesBufferIndex++; 
    +  
    +  return result;
    +}
    +
    +/**
    + * Generates a base64 id
    + *
    + * (Original version from socket.io )
    + */
    +
    +Base64Id.prototype.generateId = function () {
    +  var rand = new Buffer(15); // multiple of 3 for base64
    +  if (!rand.writeInt32BE) {
    +    return Math.abs(Math.random() * Math.random() * Date.now() | 0).toString()
    +      + Math.abs(Math.random() * Math.random() * Date.now() | 0).toString();
    +  }
    +  this.sequenceNumber = (this.sequenceNumber + 1) | 0;
    +  rand.writeInt32BE(this.sequenceNumber, 11);
    +  if (crypto.randomBytes) {
    +    this.getRandomBytes(12).copy(rand);
    +  } else {
    +    // not secure for node 0.4
    +    [0, 4, 8].forEach(function(i) {
    +      rand.writeInt32BE(Math.random() * Math.pow(2, 32) | 0, i);
    +    });
    +  }
    +  return rand.toString('base64').replace(/\//g, '_').replace(/\+/g, '-');
    +};
    +
    +/**
    + * Export
    + */
    +
    +exports = module.exports = new Base64Id();
    diff --git a/cep/node_modules/base64id/package.json b/cep/node_modules/base64id/package.json
    new file mode 100644
    index 0000000..ecd8969
    --- /dev/null
    +++ b/cep/node_modules/base64id/package.json
    @@ -0,0 +1,81 @@
    +{
    +  "_args": [
    +    [
    +      {
    +        "raw": "base64id@0.1.0",
    +        "scope": null,
    +        "escapedName": "base64id",
    +        "name": "base64id",
    +        "rawSpec": "0.1.0",
    +        "spec": "0.1.0",
    +        "type": "version"
    +      },
    +      "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\engine.io"
    +    ]
    +  ],
    +  "_defaultsLoaded": true,
    +  "_engineSupported": true,
    +  "_from": "base64id@0.1.0",
    +  "_id": "base64id@0.1.0",
    +  "_inCache": true,
    +  "_installable": true,
    +  "_location": "/base64id",
    +  "_nodeVersion": "v0.6.15",
    +  "_npmUser": {
    +    "name": "faeldt_kristian",
    +    "email": "faeldt_kristian@cyberagent.co.jp"
    +  },
    +  "_npmVersion": "1.1.16",
    +  "_phantomChildren": {},
    +  "_requested": {
    +    "raw": "base64id@0.1.0",
    +    "scope": null,
    +    "escapedName": "base64id",
    +    "name": "base64id",
    +    "rawSpec": "0.1.0",
    +    "spec": "0.1.0",
    +    "type": "version"
    +  },
    +  "_requiredBy": [
    +    "/engine.io"
    +  ],
    +  "_resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz",
    +  "_shasum": "02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f",
    +  "_shrinkwrap": null,
    +  "_spec": "base64id@0.1.0",
    +  "_where": "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\engine.io",
    +  "author": {
    +    "name": "Kristian Faeldt",
    +    "email": "faeldt_kristian@cyberagent.co.jp"
    +  },
    +  "bugs": {
    +    "url": "https://github.com/faeldt/base64id/issues"
    +  },
    +  "dependencies": {},
    +  "description": "Generates a base64 id",
    +  "devDependencies": {},
    +  "directories": {},
    +  "dist": {
    +    "shasum": "02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f",
    +    "tarball": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz"
    +  },
    +  "engines": {
    +    "node": ">= 0.4.0"
    +  },
    +  "homepage": "https://github.com/faeldt/base64id#readme",
    +  "main": "./lib/base64id.js",
    +  "maintainers": [
    +    {
    +      "name": "faeldt_kristian",
    +      "email": "faeldt_kristian@cyberagent.co.jp"
    +    }
    +  ],
    +  "name": "base64id",
    +  "optionalDependencies": {},
    +  "readme": "ERROR: No README data found!",
    +  "repository": {
    +    "type": "git",
    +    "url": "git://github.com/faeldt/base64id.git"
    +  },
    +  "version": "0.1.0"
    +}
    diff --git a/cep/node_modules/benchmark/LICENSE.txt b/cep/node_modules/benchmark/LICENSE.txt
    new file mode 100644
    index 0000000..e33e63f
    --- /dev/null
    +++ b/cep/node_modules/benchmark/LICENSE.txt
    @@ -0,0 +1,22 @@
    +Copyright 2010-2012 Mathias Bynens 
    +Based on JSLitmus.js, copyright Robert Kieffer 
    +Modified by John-David Dalton 
    +
    +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/cep/node_modules/benchmark/README.md b/cep/node_modules/benchmark/README.md
    new file mode 100644
    index 0000000..a3ab3f8
    --- /dev/null
    +++ b/cep/node_modules/benchmark/README.md
    @@ -0,0 +1,131 @@
    +# Benchmark.js v1.0.0
    +
    +A [robust](http://calendar.perfplanet.com/2010/bulletproof-javascript-benchmarks/ "Bulletproof JavaScript benchmarks") benchmarking library that works on nearly all JavaScript platforms1, supports high-resolution timers, and returns statistically significant results. As seen on [jsPerf](http://jsperf.com/).
    +
    +## BestieJS
    +
    +Benchmark.js is part of the BestieJS *"Best in Class"* module collection. This means we promote solid browser/environment support, ES5 precedents, unit testing, and plenty of documentation.
    +
    +## Documentation
    +
    +The documentation for Benchmark.js can be viewed here: 
    +
    +For a list of upcoming features, check out our [roadmap](https://github.com/bestiejs/benchmark.js/wiki/Roadmap).
    +
    +## Support
    +
    +Benchmark.js has been tested in at least Adobe AIR 3.1, Chrome 5-21, Firefox 1.5-13, IE 6-9, Opera 9.25-12.01, Safari 3-6, Node.js 0.8.6, Narwhal 0.3.2, RingoJS 0.8, and Rhino 1.7RC5.
    +
    +## Installation and usage
    +
    +In a browser or Adobe AIR:
    +
    +~~~ html
    +
    +~~~
    +
    +Optionally, expose Java’s nanosecond timer by adding the `nano` applet to the ``:
    +
    +~~~ html
    +
    +~~~
    +
    +Or enable Chrome’s microsecond timer by using the [command line switch](http://peter.sh/experiments/chromium-command-line-switches/#enable-benchmarking):
    +
    +    --enable-benchmarking
    +
    +Via [npm](http://npmjs.org/):
    +
    +~~~ bash
    +npm install benchmark
    +~~~
    +
    +In [Node.js](http://nodejs.org/) and [RingoJS v0.8.0+](http://ringojs.org/):
    +
    +~~~ js
    +var Benchmark = require('benchmark');
    +~~~
    +
    +Optionally, use the [microtime module](https://github.com/wadey/node-microtime) by Wade Simmons:
    +
    +~~~ bash
    +npm install microtime
    +~~~
    +
    +In [RingoJS v0.7.0-](http://ringojs.org/):
    +
    +~~~ js
    +var Benchmark = require('benchmark').Benchmark;
    +~~~
    +
    +In [Rhino](http://www.mozilla.org/rhino/):
    +
    +~~~ js
    +load('benchmark.js');
    +~~~
    +
    +In an AMD loader like [RequireJS](http://requirejs.org/):
    +
    +~~~ js
    +require({
    +  'paths': {
    +    'benchmark': 'path/to/benchmark'
    +  }
    +},
    +['benchmark'], function(Benchmark) {
    +  console.log(Benchmark.version);
    +});
    +
    +// or with platform.js
    +// https://github.com/bestiejs/platform.js
    +require({
    +  'paths': {
    +    'benchmark': 'path/to/benchmark',
    +    'platform': 'path/to/platform'
    +  }
    +},
    +['benchmark', 'platform'], function(Benchmark, platform) {
    +  Benchmark.platform = platform;
    +  console.log(Benchmark.platform.name);
    +});
    +~~~
    +
    +Usage example:
    +
    +~~~ js
    +var suite = new Benchmark.Suite;
    +
    +// add tests
    +suite.add('RegExp#test', function() {
    +  /o/.test('Hello World!');
    +})
    +.add('String#indexOf', function() {
    +  'Hello World!'.indexOf('o') > -1;
    +})
    +// add listeners
    +.on('cycle', function(event) {
    +  console.log(String(event.target));
    +})
    +.on('complete', function() {
    +  console.log('Fastest is ' + this.filter('fastest').pluck('name'));
    +})
    +// run async
    +.run({ 'async': true });
    +
    +// logs:
    +// > RegExp#test x 4,161,532 +-0.99% (59 cycles)
    +// > String#indexOf x 6,139,623 +-1.00% (131 cycles)
    +// > Fastest is String#indexOf
    +~~~
    +
    +## Authors
    +
    +* [Mathias Bynens](http://mathiasbynens.be/)
    +  [![twitter/mathias](http://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](https://twitter.com/mathias "Follow @mathias on Twitter")
    +* [John-David Dalton](http://allyoucanleet.com/)
    +  [![twitter/jdalton](http://gravatar.com/avatar/299a3d891ff1920b69c364d061007043?s=70)](https://twitter.com/jdalton "Follow @jdalton on Twitter")
    +
    +## Contributors
    +
    +* [Kit Cambridge](http://kitcambridge.github.com/)
    +  [![twitter/kitcambridge](http://gravatar.com/avatar/6662a1d02f351b5ef2f8b4d815804661?s=70)](https://twitter.com/kitcambridge "Follow @kitcambridge on Twitter")
    diff --git a/cep/node_modules/benchmark/benchmark.js b/cep/node_modules/benchmark/benchmark.js
    new file mode 100644
    index 0000000..d8eb309
    --- /dev/null
    +++ b/cep/node_modules/benchmark/benchmark.js
    @@ -0,0 +1,3918 @@
    +/*!
    + * Benchmark.js v1.0.0 
    + * Copyright 2010-2012 Mathias Bynens 
    + * Based on JSLitmus.js, copyright Robert Kieffer 
    + * Modified by John-David Dalton 
    + * Available under MIT license 
    + */
    +;(function(window, undefined) {
    +  'use strict';
    +
    +  /** Used to assign each benchmark an incrimented id */
    +  var counter = 0;
    +
    +  /** Detect DOM document object */
    +  var doc = isHostType(window, 'document') && document;
    +
    +  /** Detect free variable `define` */
    +  var freeDefine = typeof define == 'function' &&
    +    typeof define.amd == 'object' && define.amd && define;
    +
    +  /** Detect free variable `exports` */
    +  var freeExports = typeof exports == 'object' && exports &&
    +    (typeof global == 'object' && global && global == global.global && (window = global), exports);
    +
    +  /** Detect free variable `require` */
    +  var freeRequire = typeof require == 'function' && require;
    +
    +  /** Used to crawl all properties regardless of enumerability */
    +  var getAllKeys = Object.getOwnPropertyNames;
    +
    +  /** Used to get property descriptors */
    +  var getDescriptor = Object.getOwnPropertyDescriptor;
    +
    +  /** Used in case an object doesn't have its own method */
    +  var hasOwnProperty = {}.hasOwnProperty;
    +
    +  /** Used to check if an object is extensible */
    +  var isExtensible = Object.isExtensible || function() { return true; };
    +
    +  /** Used to access Wade Simmons' Node microtime module */
    +  var microtimeObject = req('microtime');
    +
    +  /** Used to access the browser's high resolution timer */
    +  var perfObject = isHostType(window, 'performance') && performance;
    +
    +  /** Used to call the browser's high resolution timer */
    +  var perfName = perfObject && (
    +    perfObject.now && 'now' ||
    +    perfObject.webkitNow && 'webkitNow'
    +  );
    +
    +  /** Used to access Node's high resolution timer */
    +  var processObject = isHostType(window, 'process') && process;
    +
    +  /** Used to check if an own property is enumerable */
    +  var propertyIsEnumerable = {}.propertyIsEnumerable;
    +
    +  /** Used to set property descriptors */
    +  var setDescriptor = Object.defineProperty;
    +
    +  /** Used to resolve a value's internal [[Class]] */
    +  var toString = {}.toString;
    +
    +  /** Used to prevent a `removeChild` memory leak in IE < 9 */
    +  var trash = doc && doc.createElement('div');
    +
    +  /** Used to integrity check compiled tests */
    +  var uid = 'uid' + (+new Date);
    +
    +  /** Used to avoid infinite recursion when methods call each other */
    +  var calledBy = {};
    +
    +  /** Used to avoid hz of Infinity */
    +  var divisors = {
    +    '1': 4096,
    +    '2': 512,
    +    '3': 64,
    +    '4': 8,
    +    '5': 0
    +  };
    +
    +  /**
    +   * T-Distribution two-tailed critical values for 95% confidence
    +   * http://www.itl.nist.gov/div898/handbook/eda/section3/eda3672.htm
    +   */
    +  var tTable = {
    +    '1':  12.706,'2':  4.303, '3':  3.182, '4':  2.776, '5':  2.571, '6':  2.447,
    +    '7':  2.365, '8':  2.306, '9':  2.262, '10': 2.228, '11': 2.201, '12': 2.179,
    +    '13': 2.16,  '14': 2.145, '15': 2.131, '16': 2.12,  '17': 2.11,  '18': 2.101,
    +    '19': 2.093, '20': 2.086, '21': 2.08,  '22': 2.074, '23': 2.069, '24': 2.064,
    +    '25': 2.06,  '26': 2.056, '27': 2.052, '28': 2.048, '29': 2.045, '30': 2.042,
    +    'infinity': 1.96
    +  };
    +
    +  /**
    +   * Critical Mann-Whitney U-values for 95% confidence
    +   * http://www.saburchill.com/IBbiology/stats/003.html
    +   */
    +  var uTable = {
    +    '5':  [0, 1, 2],
    +    '6':  [1, 2, 3, 5],
    +    '7':  [1, 3, 5, 6, 8],
    +    '8':  [2, 4, 6, 8, 10, 13],
    +    '9':  [2, 4, 7, 10, 12, 15, 17],
    +    '10': [3, 5, 8, 11, 14, 17, 20, 23],
    +    '11': [3, 6, 9, 13, 16, 19, 23, 26, 30],
    +    '12': [4, 7, 11, 14, 18, 22, 26, 29, 33, 37],
    +    '13': [4, 8, 12, 16, 20, 24, 28, 33, 37, 41, 45],
    +    '14': [5, 9, 13, 17, 22, 26, 31, 36, 40, 45, 50, 55],
    +    '15': [5, 10, 14, 19, 24, 29, 34, 39, 44, 49, 54, 59, 64],
    +    '16': [6, 11, 15, 21, 26, 31, 37, 42, 47, 53, 59, 64, 70, 75],
    +    '17': [6, 11, 17, 22, 28, 34, 39, 45, 51, 57, 63, 67, 75, 81, 87],
    +    '18': [7, 12, 18, 24, 30, 36, 42, 48, 55, 61, 67, 74, 80, 86, 93, 99],
    +    '19': [7, 13, 19, 25, 32, 38, 45, 52, 58, 65, 72, 78, 85, 92, 99, 106, 113],
    +    '20': [8, 14, 20, 27, 34, 41, 48, 55, 62, 69, 76, 83, 90, 98, 105, 112, 119, 127],
    +    '21': [8, 15, 22, 29, 36, 43, 50, 58, 65, 73, 80, 88, 96, 103, 111, 119, 126, 134, 142],
    +    '22': [9, 16, 23, 30, 38, 45, 53, 61, 69, 77, 85, 93, 101, 109, 117, 125, 133, 141, 150, 158],
    +    '23': [9, 17, 24, 32, 40, 48, 56, 64, 73, 81, 89, 98, 106, 115, 123, 132, 140, 149, 157, 166, 175],
    +    '24': [10, 17, 25, 33, 42, 50, 59, 67, 76, 85, 94, 102, 111, 120, 129, 138, 147, 156, 165, 174, 183, 192],
    +    '25': [10, 18, 27, 35, 44, 53, 62, 71, 80, 89, 98, 107, 117, 126, 135, 145, 154, 163, 173, 182, 192, 201, 211],
    +    '26': [11, 19, 28, 37, 46, 55, 64, 74, 83, 93, 102, 112, 122, 132, 141, 151, 161, 171, 181, 191, 200, 210, 220, 230],
    +    '27': [11, 20, 29, 38, 48, 57, 67, 77, 87, 97, 107, 118, 125, 138, 147, 158, 168, 178, 188, 199, 209, 219, 230, 240, 250],
    +    '28': [12, 21, 30, 40, 50, 60, 70, 80, 90, 101, 111, 122, 132, 143, 154, 164, 175, 186, 196, 207, 218, 228, 239, 250, 261, 272],
    +    '29': [13, 22, 32, 42, 52, 62, 73, 83, 94, 105, 116, 127, 138, 149, 160, 171, 182, 193, 204, 215, 226, 238, 249, 260, 271, 282, 294],
    +    '30': [13, 23, 33, 43, 54, 65, 76, 87, 98, 109, 120, 131, 143, 154, 166, 177, 189, 200, 212, 223, 235, 247, 258, 270, 282, 293, 305, 317]
    +  };
    +
    +  /**
    +   * An object used to flag environments/features.
    +   *
    +   * @static
    +   * @memberOf Benchmark
    +   * @type Object
    +   */
    +  var support = {};
    +
    +  (function() {
    +
    +    /**
    +     * Detect Adobe AIR.
    +     *
    +     * @memberOf Benchmark.support
    +     * @type Boolean
    +     */
    +    support.air = isClassOf(window.runtime, 'ScriptBridgingProxyObject');
    +
    +    /**
    +     * Detect if `arguments` objects have the correct internal [[Class]] value.
    +     *
    +     * @memberOf Benchmark.support
    +     * @type Boolean
    +     */
    +    support.argumentsClass = isClassOf(arguments, 'Arguments');
    +
    +    /**
    +     * Detect if in a browser environment.
    +     *
    +     * @memberOf Benchmark.support
    +     * @type Boolean
    +     */
    +    support.browser = doc && isHostType(window, 'navigator');
    +
    +    /**
    +     * Detect if strings support accessing characters by index.
    +     *
    +     * @memberOf Benchmark.support
    +     * @type Boolean
    +     */
    +    support.charByIndex =
    +      // IE 8 supports indexes on string literals but not string objects
    +      ('x'[0] + Object('x')[0]) == 'xx';
    +
    +    /**
    +     * Detect if strings have indexes as own properties.
    +     *
    +     * @memberOf Benchmark.support
    +     * @type Boolean
    +     */
    +    support.charByOwnIndex =
    +      // Narwhal, Rhino, RingoJS, IE 8, and Opera < 10.52 support indexes on
    +      // strings but don't detect them as own properties
    +      support.charByIndex && hasKey('x', '0');
    +
    +    /**
    +     * Detect if Java is enabled/exposed.
    +     *
    +     * @memberOf Benchmark.support
    +     * @type Boolean
    +     */
    +    support.java = isClassOf(window.java, 'JavaPackage');
    +
    +    /**
    +     * Detect if the Timers API exists.
    +     *
    +     * @memberOf Benchmark.support
    +     * @type Boolean
    +     */
    +    support.timeout = isHostType(window, 'setTimeout') && isHostType(window, 'clearTimeout');
    +
    +    /**
    +     * Detect if functions support decompilation.
    +     *
    +     * @name decompilation
    +     * @memberOf Benchmark.support
    +     * @type Boolean
    +     */
    +    try {
    +      // Safari 2.x removes commas in object literals
    +      // from Function#toString results
    +      // http://webk.it/11609
    +      // Firefox 3.6 and Opera 9.25 strip grouping
    +      // parentheses from Function#toString results
    +      // http://bugzil.la/559438
    +      support.decompilation = Function(
    +        'return (' + (function(x) { return { 'x': '' + (1 + x) + '', 'y': 0 }; }) + ')'
    +      )()(0).x === '1';
    +    } catch(e) {
    +      support.decompilation = false;
    +    }
    +
    +    /**
    +     * Detect ES5+ property descriptor API.
    +     *
    +     * @name descriptors
    +     * @memberOf Benchmark.support
    +     * @type Boolean
    +     */
    +    try {
    +      var o = {};
    +      support.descriptors = (setDescriptor(o, o, o), 'value' in getDescriptor(o, o));
    +    } catch(e) {
    +      support.descriptors = false;
    +    }
    +
    +    /**
    +     * Detect ES5+ Object.getOwnPropertyNames().
    +     *
    +     * @name getAllKeys
    +     * @memberOf Benchmark.support
    +     * @type Boolean
    +     */
    +    try {
    +      support.getAllKeys = /\bvalueOf\b/.test(getAllKeys(Object.prototype));
    +    } catch(e) {
    +      support.getAllKeys = false;
    +    }
    +
    +    /**
    +     * Detect if own properties are iterated before inherited properties (all but IE < 9).
    +     *
    +     * @name iteratesOwnLast
    +     * @memberOf Benchmark.support
    +     * @type Boolean
    +     */
    +    support.iteratesOwnFirst = (function() {
    +      var props = [];
    +      function ctor() { this.x = 1; }
    +      ctor.prototype = { 'y': 1 };
    +      for (var prop in new ctor) { props.push(prop); }
    +      return props[0] == 'x';
    +    }());
    +
    +    /**
    +     * Detect if a node's [[Class]] is resolvable (all but IE < 9)
    +     * and that the JS engine errors when attempting to coerce an object to a
    +     * string without a `toString` property value of `typeof` "function".
    +     *
    +     * @name nodeClass
    +     * @memberOf Benchmark.support
    +     * @type Boolean
    +     */
    +    try {
    +      support.nodeClass = ({ 'toString': 0 } + '', toString.call(doc || 0) != '[object Object]');
    +    } catch(e) {
    +      support.nodeClass = true;
    +    }
    +  }());
    +
    +  /**
    +   * Timer object used by `clock()` and `Deferred#resolve`.
    +   *
    +   * @private
    +   * @type Object
    +   */
    +  var timer = {
    +
    +   /**
    +    * The timer namespace object or constructor.
    +    *
    +    * @private
    +    * @memberOf timer
    +    * @type Function|Object
    +    */
    +    'ns': Date,
    +
    +   /**
    +    * Starts the deferred timer.
    +    *
    +    * @private
    +    * @memberOf timer
    +    * @param {Object} deferred The deferred instance.
    +    */
    +    'start': null, // lazy defined in `clock()`
    +
    +   /**
    +    * Stops the deferred timer.
    +    *
    +    * @private
    +    * @memberOf timer
    +    * @param {Object} deferred The deferred instance.
    +    */
    +    'stop': null // lazy defined in `clock()`
    +  };
    +
    +  /** Shortcut for inverse results */
    +  var noArgumentsClass = !support.argumentsClass,
    +      noCharByIndex = !support.charByIndex,
    +      noCharByOwnIndex = !support.charByOwnIndex;
    +
    +  /** Math shortcuts */
    +  var abs   = Math.abs,
    +      floor = Math.floor,
    +      max   = Math.max,
    +      min   = Math.min,
    +      pow   = Math.pow,
    +      sqrt  = Math.sqrt;
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  /**
    +   * The Benchmark constructor.
    +   *
    +   * @constructor
    +   * @param {String} name A name to identify the benchmark.
    +   * @param {Function|String} fn The test to benchmark.
    +   * @param {Object} [options={}] Options object.
    +   * @example
    +   *
    +   * // basic usage (the `new` operator is optional)
    +   * var bench = new Benchmark(fn);
    +   *
    +   * // or using a name first
    +   * var bench = new Benchmark('foo', fn);
    +   *
    +   * // or with options
    +   * var bench = new Benchmark('foo', fn, {
    +   *
    +   *   // displayed by Benchmark#toString if `name` is not available
    +   *   'id': 'xyz',
    +   *
    +   *   // called when the benchmark starts running
    +   *   'onStart': onStart,
    +   *
    +   *   // called after each run cycle
    +   *   'onCycle': onCycle,
    +   *
    +   *   // called when aborted
    +   *   'onAbort': onAbort,
    +   *
    +   *   // called when a test errors
    +   *   'onError': onError,
    +   *
    +   *   // called when reset
    +   *   'onReset': onReset,
    +   *
    +   *   // called when the benchmark completes running
    +   *   'onComplete': onComplete,
    +   *
    +   *   // compiled/called before the test loop
    +   *   'setup': setup,
    +   *
    +   *   // compiled/called after the test loop
    +   *   'teardown': teardown
    +   * });
    +   *
    +   * // or name and options
    +   * var bench = new Benchmark('foo', {
    +   *
    +   *   // a flag to indicate the benchmark is deferred
    +   *   'defer': true,
    +   *
    +   *   // benchmark test function
    +   *   'fn': function(deferred) {
    +   *     // call resolve() when the deferred test is finished
    +   *     deferred.resolve();
    +   *   }
    +   * });
    +   *
    +   * // or options only
    +   * var bench = new Benchmark({
    +   *
    +   *   // benchmark name
    +   *   'name': 'foo',
    +   *
    +   *   // benchmark test as a string
    +   *   'fn': '[1,2,3,4].sort()'
    +   * });
    +   *
    +   * // a test's `this` binding is set to the benchmark instance
    +   * var bench = new Benchmark('foo', function() {
    +   *   'My name is '.concat(this.name); // My name is foo
    +   * });
    +   */
    +  function Benchmark(name, fn, options) {
    +    var me = this;
    +
    +    // allow instance creation without the `new` operator
    +    if (me == null || me.constructor != Benchmark) {
    +      return new Benchmark(name, fn, options);
    +    }
    +    // juggle arguments
    +    if (isClassOf(name, 'Object')) {
    +      // 1 argument (options)
    +      options = name;
    +    }
    +    else if (isClassOf(name, 'Function')) {
    +      // 2 arguments (fn, options)
    +      options = fn;
    +      fn = name;
    +    }
    +    else if (isClassOf(fn, 'Object')) {
    +      // 2 arguments (name, options)
    +      options = fn;
    +      fn = null;
    +      me.name = name;
    +    }
    +    else {
    +      // 3 arguments (name, fn [, options])
    +      me.name = name;
    +    }
    +    setOptions(me, options);
    +    me.id || (me.id = ++counter);
    +    me.fn == null && (me.fn = fn);
    +    me.stats = deepClone(me.stats);
    +    me.times = deepClone(me.times);
    +  }
    +
    +  /**
    +   * The Deferred constructor.
    +   *
    +   * @constructor
    +   * @memberOf Benchmark
    +   * @param {Object} clone The cloned benchmark instance.
    +   */
    +  function Deferred(clone) {
    +    var me = this;
    +    if (me == null || me.constructor != Deferred) {
    +      return new Deferred(clone);
    +    }
    +    me.benchmark = clone;
    +    clock(me);
    +  }
    +
    +  /**
    +   * The Event constructor.
    +   *
    +   * @constructor
    +   * @memberOf Benchmark
    +   * @param {String|Object} type The event type.
    +   */
    +  function Event(type) {
    +    var me = this;
    +    return (me == null || me.constructor != Event)
    +      ? new Event(type)
    +      : (type instanceof Event)
    +          ? type
    +          : extend(me, { 'timeStamp': +new Date }, typeof type == 'string' ? { 'type': type } : type);
    +  }
    +
    +  /**
    +   * The Suite constructor.
    +   *
    +   * @constructor
    +   * @memberOf Benchmark
    +   * @param {String} name A name to identify the suite.
    +   * @param {Object} [options={}] Options object.
    +   * @example
    +   *
    +   * // basic usage (the `new` operator is optional)
    +   * var suite = new Benchmark.Suite;
    +   *
    +   * // or using a name first
    +   * var suite = new Benchmark.Suite('foo');
    +   *
    +   * // or with options
    +   * var suite = new Benchmark.Suite('foo', {
    +   *
    +   *   // called when the suite starts running
    +   *   'onStart': onStart,
    +   *
    +   *   // called between running benchmarks
    +   *   'onCycle': onCycle,
    +   *
    +   *   // called when aborted
    +   *   'onAbort': onAbort,
    +   *
    +   *   // called when a test errors
    +   *   'onError': onError,
    +   *
    +   *   // called when reset
    +   *   'onReset': onReset,
    +   *
    +   *   // called when the suite completes running
    +   *   'onComplete': onComplete
    +   * });
    +   */
    +  function Suite(name, options) {
    +    var me = this;
    +
    +    // allow instance creation without the `new` operator
    +    if (me == null || me.constructor != Suite) {
    +      return new Suite(name, options);
    +    }
    +    // juggle arguments
    +    if (isClassOf(name, 'Object')) {
    +      // 1 argument (options)
    +      options = name;
    +    } else {
    +      // 2 arguments (name [, options])
    +      me.name = name;
    +    }
    +    setOptions(me, options);
    +  }
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  /**
    +   * Note: Some array methods have been implemented in plain JavaScript to avoid
    +   * bugs in IE, Opera, Rhino, and Mobile Safari.
    +   *
    +   * IE compatibility mode and IE < 9 have buggy Array `shift()` and `splice()`
    +   * functions that fail to remove the last element, `object[0]`, of
    +   * array-like-objects even though the `length` property is set to `0`.
    +   * The `shift()` method is buggy in IE 8 compatibility mode, while `splice()`
    +   * is buggy regardless of mode in IE < 9 and buggy in compatibility mode in IE 9.
    +   *
    +   * In Opera < 9.50 and some older/beta Mobile Safari versions using `unshift()`
    +   * generically to augment the `arguments` object will pave the value at index 0
    +   * without incrimenting the other values's indexes.
    +   * https://github.com/documentcloud/underscore/issues/9
    +   *
    +   * Rhino and environments it powers, like Narwhal and RingoJS, may have
    +   * buggy Array `concat()`, `reverse()`, `shift()`, `slice()`, `splice()` and
    +   * `unshift()` functions that make sparse arrays non-sparse by assigning the
    +   * undefined indexes a value of undefined.
    +   * https://github.com/mozilla/rhino/commit/702abfed3f8ca043b2636efd31c14ba7552603dd
    +   */
    +
    +  /**
    +   * Creates an array containing the elements of the host array followed by the
    +   * elements of each argument in order.
    +   *
    +   * @memberOf Benchmark.Suite
    +   * @returns {Array} The new array.
    +   */
    +  function concat() {
    +    var value,
    +        j = -1,
    +        length = arguments.length,
    +        result = slice.call(this),
    +        index = result.length;
    +
    +    while (++j < length) {
    +      value = arguments[j];
    +      if (isClassOf(value, 'Array')) {
    +        for (var k = 0, l = value.length; k < l; k++, index++) {
    +          if (k in value) {
    +            result[index] = value[k];
    +          }
    +        }
    +      } else {
    +        result[index++] = value;
    +      }
    +    }
    +    return result;
    +  }
    +
    +  /**
    +   * Utility function used by `shift()`, `splice()`, and `unshift()`.
    +   *
    +   * @private
    +   * @param {Number} start The index to start inserting elements.
    +   * @param {Number} deleteCount The number of elements to delete from the insert point.
    +   * @param {Array} elements The elements to insert.
    +   * @returns {Array} An array of deleted elements.
    +   */
    +  function insert(start, deleteCount, elements) {
    +    // `result` should have its length set to the `deleteCount`
    +    // see https://bugs.ecmascript.org/show_bug.cgi?id=332
    +    var deleteEnd = start + deleteCount,
    +        elementCount = elements ? elements.length : 0,
    +        index = start - 1,
    +        length = start + elementCount,
    +        object = this,
    +        result = Array(deleteCount),
    +        tail = slice.call(object, deleteEnd);
    +
    +    // delete elements from the array
    +    while (++index < deleteEnd) {
    +      if (index in object) {
    +        result[index - start] = object[index];
    +        delete object[index];
    +      }
    +    }
    +    // insert elements
    +    index = start - 1;
    +    while (++index < length) {
    +      object[index] = elements[index - start];
    +    }
    +    // append tail elements
    +    start = index--;
    +    length = max(0, (object.length >>> 0) - deleteCount + elementCount);
    +    while (++index < length) {
    +      if ((index - start) in tail) {
    +        object[index] = tail[index - start];
    +      } else if (index in object) {
    +        delete object[index];
    +      }
    +    }
    +    // delete excess elements
    +    deleteCount = deleteCount > elementCount ? deleteCount - elementCount : 0;
    +    while (deleteCount--) {
    +      index = length + deleteCount;
    +      if (index in object) {
    +        delete object[index];
    +      }
    +    }
    +    object.length = length;
    +    return result;
    +  }
    +
    +  /**
    +   * Rearrange the host array's elements in reverse order.
    +   *
    +   * @memberOf Benchmark.Suite
    +   * @returns {Array} The reversed array.
    +   */
    +  function reverse() {
    +    var upperIndex,
    +        value,
    +        index = -1,
    +        object = Object(this),
    +        length = object.length >>> 0,
    +        middle = floor(length / 2);
    +
    +    if (length > 1) {
    +      while (++index < middle) {
    +        upperIndex = length - index - 1;
    +        value = upperIndex in object ? object[upperIndex] : uid;
    +        if (index in object) {
    +          object[upperIndex] = object[index];
    +        } else {
    +          delete object[upperIndex];
    +        }
    +        if (value != uid) {
    +          object[index] = value;
    +        } else {
    +          delete object[index];
    +        }
    +      }
    +    }
    +    return object;
    +  }
    +
    +  /**
    +   * Removes the first element of the host array and returns it.
    +   *
    +   * @memberOf Benchmark.Suite
    +   * @returns {Mixed} The first element of the array.
    +   */
    +  function shift() {
    +    return insert.call(this, 0, 1)[0];
    +  }
    +
    +  /**
    +   * Creates an array of the host array's elements from the start index up to,
    +   * but not including, the end index.
    +   *
    +   * @memberOf Benchmark.Suite
    +   * @param {Number} start The starting index.
    +   * @param {Number} end The end index.
    +   * @returns {Array} The new array.
    +   */
    +  function slice(start, end) {
    +    var index = -1,
    +        object = Object(this),
    +        length = object.length >>> 0,
    +        result = [];
    +
    +    start = toInteger(start);
    +    start = start < 0 ? max(length + start, 0) : min(start, length);
    +    start--;
    +    end = end == null ? length : toInteger(end);
    +    end = end < 0 ? max(length + end, 0) : min(end, length);
    +
    +    while ((++index, ++start) < end) {
    +      if (start in object) {
    +        result[index] = object[start];
    +      }
    +    }
    +    return result;
    +  }
    +
    +  /**
    +   * Allows removing a range of elements and/or inserting elements into the
    +   * host array.
    +   *
    +   * @memberOf Benchmark.Suite
    +   * @param {Number} start The start index.
    +   * @param {Number} deleteCount The number of elements to delete.
    +   * @param {Mixed} [val1, val2, ...] values to insert at the `start` index.
    +   * @returns {Array} An array of removed elements.
    +   */
    +  function splice(start, deleteCount) {
    +    var object = Object(this),
    +        length = object.length >>> 0;
    +
    +    start = toInteger(start);
    +    start = start < 0 ? max(length + start, 0) : min(start, length);
    +
    +    // support the de-facto SpiderMonkey extension
    +    // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/splice#Parameters
    +    // https://bugs.ecmascript.org/show_bug.cgi?id=429
    +    deleteCount = arguments.length == 1
    +      ? length - start
    +      : min(max(toInteger(deleteCount), 0), length - start);
    +
    +    return insert.call(object, start, deleteCount, slice.call(arguments, 2));
    +  }
    +
    +  /**
    +   * Converts the specified `value` to an integer.
    +   *
    +   * @private
    +   * @param {Mixed} value The value to convert.
    +   * @returns {Number} The resulting integer.
    +   */
    +  function toInteger(value) {
    +    value = +value;
    +    return value === 0 || !isFinite(value) ? value || 0 : value - (value % 1);
    +  }
    +
    +  /**
    +   * Appends arguments to the host array.
    +   *
    +   * @memberOf Benchmark.Suite
    +   * @returns {Number} The new length.
    +   */
    +  function unshift() {
    +    var object = Object(this);
    +    insert.call(object, 0, 0, arguments);
    +    return object.length;
    +  }
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  /**
    +   * A generic `Function#bind` like method.
    +   *
    +   * @private
    +   * @param {Function} fn The function to be bound to `thisArg`.
    +   * @param {Mixed} thisArg The `this` binding for the given function.
    +   * @returns {Function} The bound function.
    +   */
    +  function bind(fn, thisArg) {
    +    return function() { fn.apply(thisArg, arguments); };
    +  }
    +
    +  /**
    +   * Creates a function from the given arguments string and body.
    +   *
    +   * @private
    +   * @param {String} args The comma separated function arguments.
    +   * @param {String} body The function body.
    +   * @returns {Function} The new function.
    +   */
    +  function createFunction() {
    +    // lazy define
    +    createFunction = function(args, body) {
    +      var result,
    +          anchor = freeDefine ? define.amd : Benchmark,
    +          prop = uid + 'createFunction';
    +
    +      runScript((freeDefine ? 'define.amd.' : 'Benchmark.') + prop + '=function(' + args + '){' + body + '}');
    +      result = anchor[prop];
    +      delete anchor[prop];
    +      return result;
    +    };
    +    // fix JaegerMonkey bug
    +    // http://bugzil.la/639720
    +    createFunction = support.browser && (createFunction('', 'return"' + uid + '"') || noop)() == uid ? createFunction : Function;
    +    return createFunction.apply(null, arguments);
    +  }
    +
    +  /**
    +   * Delay the execution of a function based on the benchmark's `delay` property.
    +   *
    +   * @private
    +   * @param {Object} bench The benchmark instance.
    +   * @param {Object} fn The function to execute.
    +   */
    +  function delay(bench, fn) {
    +    bench._timerId = setTimeout(fn, bench.delay * 1e3);
    +  }
    +
    +  /**
    +   * Destroys the given element.
    +   *
    +   * @private
    +   * @param {Element} element The element to destroy.
    +   */
    +  function destroyElement(element) {
    +    trash.appendChild(element);
    +    trash.innerHTML = '';
    +  }
    +
    +  /**
    +   * Iterates over an object's properties, executing the `callback` for each.
    +   * Callbacks may terminate the loop by explicitly returning `false`.
    +   *
    +   * @private
    +   * @param {Object} object The object to iterate over.
    +   * @param {Function} callback The function executed per own property.
    +   * @param {Object} options The options object.
    +   * @returns {Object} Returns the object iterated over.
    +   */
    +  function forProps() {
    +    var forShadowed,
    +        skipSeen,
    +        forArgs = true,
    +        shadowed = ['constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'valueOf'];
    +
    +    (function(enumFlag, key) {
    +      // must use a non-native constructor to catch the Safari 2 issue
    +      function Klass() { this.valueOf = 0; };
    +      Klass.prototype.valueOf = 0;
    +      // check various for-in bugs
    +      for (key in new Klass) {
    +        enumFlag += key == 'valueOf' ? 1 : 0;
    +      }
    +      // check if `arguments` objects have non-enumerable indexes
    +      for (key in arguments) {
    +        key == '0' && (forArgs = false);
    +      }
    +      // Safari 2 iterates over shadowed properties twice
    +      // http://replay.waybackmachine.org/20090428222941/http://tobielangel.com/2007/1/29/for-in-loop-broken-in-safari/
    +      skipSeen = enumFlag == 2;
    +      // IE < 9 incorrectly makes an object's properties non-enumerable if they have
    +      // the same name as other non-enumerable properties in its prototype chain.
    +      forShadowed = !enumFlag;
    +    }(0));
    +
    +    // lazy define
    +    forProps = function(object, callback, options) {
    +      options || (options = {});
    +
    +      var result = object;
    +      object = Object(object);
    +
    +      var ctor,
    +          key,
    +          keys,
    +          skipCtor,
    +          done = !result,
    +          which = options.which,
    +          allFlag = which == 'all',
    +          index = -1,
    +          iteratee = object,
    +          length = object.length,
    +          ownFlag = allFlag || which == 'own',
    +          seen = {},
    +          skipProto = isClassOf(object, 'Function'),
    +          thisArg = options.bind;
    +
    +      if (thisArg !== undefined) {
    +        callback = bind(callback, thisArg);
    +      }
    +      // iterate all properties
    +      if (allFlag && support.getAllKeys) {
    +        for (index = 0, keys = getAllKeys(object), length = keys.length; index < length; index++) {
    +          key = keys[index];
    +          if (callback(object[key], key, object) === false) {
    +            break;
    +          }
    +        }
    +      }
    +      // else iterate only enumerable properties
    +      else {
    +        for (key in object) {
    +          // Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1
    +          // (if the prototype or a property on the prototype has been set)
    +          // incorrectly set a function's `prototype` property [[Enumerable]] value
    +          // to `true`. Because of this we standardize on skipping the `prototype`
    +          // property of functions regardless of their [[Enumerable]] value.
    +          if ((done =
    +              !(skipProto && key == 'prototype') &&
    +              !(skipSeen && (hasKey(seen, key) || !(seen[key] = true))) &&
    +              (!ownFlag || ownFlag && hasKey(object, key)) &&
    +              callback(object[key], key, object) === false)) {
    +            break;
    +          }
    +        }
    +        // in IE < 9 strings don't support accessing characters by index
    +        if (!done && (forArgs && isArguments(object) ||
    +            ((noCharByIndex || noCharByOwnIndex) && isClassOf(object, 'String') &&
    +              (iteratee = noCharByIndex ? object.split('') : object)))) {
    +          while (++index < length) {
    +            if ((done =
    +                callback(iteratee[index], String(index), object) === false)) {
    +              break;
    +            }
    +          }
    +        }
    +        if (!done && forShadowed) {
    +          // Because IE < 9 can't set the `[[Enumerable]]` attribute of an existing
    +          // property and the `constructor` property of a prototype defaults to
    +          // non-enumerable, we manually skip the `constructor` property when we
    +          // think we are iterating over a `prototype` object.
    +          ctor = object.constructor;
    +          skipCtor = ctor && ctor.prototype && ctor.prototype.constructor === ctor;
    +          for (index = 0; index < 7; index++) {
    +            key = shadowed[index];
    +            if (!(skipCtor && key == 'constructor') &&
    +                hasKey(object, key) &&
    +                callback(object[key], key, object) === false) {
    +              break;
    +            }
    +          }
    +        }
    +      }
    +      return result;
    +    };
    +    return forProps.apply(null, arguments);
    +  }
    +
    +  /**
    +   * Gets the name of the first argument from a function's source.
    +   *
    +   * @private
    +   * @param {Function} fn The function.
    +   * @returns {String} The argument name.
    +   */
    +  function getFirstArgument(fn) {
    +    return (!hasKey(fn, 'toString') &&
    +      (/^[\s(]*function[^(]*\(([^\s,)]+)/.exec(fn) || 0)[1]) || '';
    +  }
    +
    +  /**
    +   * Computes the arithmetic mean of a sample.
    +   *
    +   * @private
    +   * @param {Array} sample The sample.
    +   * @returns {Number} The mean.
    +   */
    +  function getMean(sample) {
    +    return reduce(sample, function(sum, x) {
    +      return sum + x;
    +    }) / sample.length || 0;
    +  }
    +
    +  /**
    +   * Gets the source code of a function.
    +   *
    +   * @private
    +   * @param {Function} fn The function.
    +   * @param {String} altSource A string used when a function's source code is unretrievable.
    +   * @returns {String} The function's source code.
    +   */
    +  function getSource(fn, altSource) {
    +    var result = altSource;
    +    if (isStringable(fn)) {
    +      result = String(fn);
    +    } else if (support.decompilation) {
    +      // escape the `{` for Firefox 1
    +      result = (/^[^{]+\{([\s\S]*)}\s*$/.exec(fn) || 0)[1];
    +    }
    +    // trim string
    +    result = (result || '').replace(/^\s+|\s+$/g, '');
    +
    +    // detect strings containing only the "use strict" directive
    +    return /^(?:\/\*+[\w|\W]*?\*\/|\/\/.*?[\n\r\u2028\u2029]|\s)*(["'])use strict\1;?$/.test(result)
    +      ? ''
    +      : result;
    +  }
    +
    +  /**
    +   * Checks if a value is an `arguments` object.
    +   *
    +   * @private
    +   * @param {Mixed} value The value to check.
    +   * @returns {Boolean} Returns `true` if the value is an `arguments` object, else `false`.
    +   */
    +  function isArguments() {
    +    // lazy define
    +    isArguments = function(value) {
    +      return toString.call(value) == '[object Arguments]';
    +    };
    +    if (noArgumentsClass) {
    +      isArguments = function(value) {
    +        return hasKey(value, 'callee') &&
    +          !(propertyIsEnumerable && propertyIsEnumerable.call(value, 'callee'));
    +      };
    +    }
    +    return isArguments(arguments[0]);
    +  }
    +
    +  /**
    +   * Checks if an object is of the specified class.
    +   *
    +   * @private
    +   * @param {Mixed} value The value to check.
    +   * @param {String} name The name of the class.
    +   * @returns {Boolean} Returns `true` if the value is of the specified class, else `false`.
    +   */
    +  function isClassOf(value, name) {
    +    return value != null && toString.call(value) == '[object ' + name + ']';
    +  }
    +
    +  /**
    +   * Host objects can return type values that are different from their actual
    +   * data type. The objects we are concerned with usually return non-primitive
    +   * types of object, function, or unknown.
    +   *
    +   * @private
    +   * @param {Mixed} object The owner of the property.
    +   * @param {String} property The property to check.
    +   * @returns {Boolean} Returns `true` if the property value is a non-primitive, else `false`.
    +   */
    +  function isHostType(object, property) {
    +    var type = object != null ? typeof object[property] : 'number';
    +    return !/^(?:boolean|number|string|undefined)$/.test(type) &&
    +      (type == 'object' ? !!object[property] : true);
    +  }
    +
    +  /**
    +   * Checks if a given `value` is an object created by the `Object` constructor
    +   * assuming objects created by the `Object` constructor have no inherited
    +   * enumerable properties and that there are no `Object.prototype` extensions.
    +   *
    +   * @private
    +   * @param {Mixed} value The value to check.
    +   * @returns {Boolean} Returns `true` if the `value` is a plain `Object` object, else `false`.
    +   */
    +  function isPlainObject(value) {
    +    // avoid non-objects and false positives for `arguments` objects in IE < 9
    +    var result = false;
    +    if (!(value && typeof value == 'object') || (noArgumentsClass && isArguments(value))) {
    +      return result;
    +    }
    +    // IE < 9 presents DOM nodes as `Object` objects except they have `toString`
    +    // methods that are `typeof` "string" and still can coerce nodes to strings.
    +    // Also check that the constructor is `Object` (i.e. `Object instanceof Object`)
    +    var ctor = value.constructor;
    +    if ((support.nodeClass || !(typeof value.toString != 'function' && typeof (value + '') == 'string')) &&
    +        (!isClassOf(ctor, 'Function') || ctor instanceof ctor)) {
    +      // In most environments an object's own properties are iterated before
    +      // its inherited properties. If the last iterated property is an object's
    +      // own property then there are no inherited enumerable properties.
    +      if (support.iteratesOwnFirst) {
    +        forProps(value, function(subValue, subKey) {
    +          result = subKey;
    +        });
    +        return result === false || hasKey(value, result);
    +      }
    +      // IE < 9 iterates inherited properties before own properties. If the first
    +      // iterated property is an object's own property then there are no inherited
    +      // enumerable properties.
    +      forProps(value, function(subValue, subKey) {
    +        result = !hasKey(value, subKey);
    +        return false;
    +      });
    +      return result === false;
    +    }
    +    return result;
    +  }
    +
    +  /**
    +   * Checks if a value can be safely coerced to a string.
    +   *
    +   * @private
    +   * @param {Mixed} value The value to check.
    +   * @returns {Boolean} Returns `true` if the value can be coerced, else `false`.
    +   */
    +  function isStringable(value) {
    +    return hasKey(value, 'toString') || isClassOf(value, 'String');
    +  }
    +
    +  /**
    +   * Wraps a function and passes `this` to the original function as the
    +   * first argument.
    +   *
    +   * @private
    +   * @param {Function} fn The function to be wrapped.
    +   * @returns {Function} The new function.
    +   */
    +  function methodize(fn) {
    +    return function() {
    +      var args = [this];
    +      args.push.apply(args, arguments);
    +      return fn.apply(null, args);
    +    };
    +  }
    +
    +  /**
    +   * A no-operation function.
    +   *
    +   * @private
    +   */
    +  function noop() {
    +    // no operation performed
    +  }
    +
    +  /**
    +   * A wrapper around require() to suppress `module missing` errors.
    +   *
    +   * @private
    +   * @param {String} id The module id.
    +   * @returns {Mixed} The exported module or `null`.
    +   */
    +  function req(id) {
    +    try {
    +      var result = freeExports && freeRequire(id);
    +    } catch(e) { }
    +    return result || null;
    +  }
    +
    +  /**
    +   * Runs a snippet of JavaScript via script injection.
    +   *
    +   * @private
    +   * @param {String} code The code to run.
    +   */
    +  function runScript(code) {
    +    var anchor = freeDefine ? define.amd : Benchmark,
    +        script = doc.createElement('script'),
    +        sibling = doc.getElementsByTagName('script')[0],
    +        parent = sibling.parentNode,
    +        prop = uid + 'runScript',
    +        prefix = '(' + (freeDefine ? 'define.amd.' : 'Benchmark.') + prop + '||function(){})();';
    +
    +    // Firefox 2.0.0.2 cannot use script injection as intended because it executes
    +    // asynchronously, but that's OK because script injection is only used to avoid
    +    // the previously commented JaegerMonkey bug.
    +    try {
    +      // remove the inserted script *before* running the code to avoid differences
    +      // in the expected script element count/order of the document.
    +      script.appendChild(doc.createTextNode(prefix + code));
    +      anchor[prop] = function() { destroyElement(script); };
    +    } catch(e) {
    +      parent = parent.cloneNode(false);
    +      sibling = null;
    +      script.text = code;
    +    }
    +    parent.insertBefore(script, sibling);
    +    delete anchor[prop];
    +  }
    +
    +  /**
    +   * A helper function for setting options/event handlers.
    +   *
    +   * @private
    +   * @param {Object} bench The benchmark instance.
    +   * @param {Object} [options={}] Options object.
    +   */
    +  function setOptions(bench, options) {
    +    options = extend({}, bench.constructor.options, options);
    +    bench.options = forOwn(options, function(value, key) {
    +      if (value != null) {
    +        // add event listeners
    +        if (/^on[A-Z]/.test(key)) {
    +          forEach(key.split(' '), function(key) {
    +            bench.on(key.slice(2).toLowerCase(), value);
    +          });
    +        } else if (!hasKey(bench, key)) {
    +          bench[key] = deepClone(value);
    +        }
    +      }
    +    });
    +  }
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  /**
    +   * Handles cycling/completing the deferred benchmark.
    +   *
    +   * @memberOf Benchmark.Deferred
    +   */
    +  function resolve() {
    +    var me = this,
    +        clone = me.benchmark,
    +        bench = clone._original;
    +
    +    if (bench.aborted) {
    +      // cycle() -> clone cycle/complete event -> compute()'s invoked bench.run() cycle/complete
    +      me.teardown();
    +      clone.running = false;
    +      cycle(me);
    +    }
    +    else if (++me.cycles < clone.count) {
    +      // continue the test loop
    +      if (support.timeout) {
    +        // use setTimeout to avoid a call stack overflow if called recursively
    +        setTimeout(function() { clone.compiled.call(me, timer); }, 0);
    +      } else {
    +        clone.compiled.call(me, timer);
    +      }
    +    }
    +    else {
    +      timer.stop(me);
    +      me.teardown();
    +      delay(clone, function() { cycle(me); });
    +    }
    +  }
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  /**
    +   * A deep clone utility.
    +   *
    +   * @static
    +   * @memberOf Benchmark
    +   * @param {Mixed} value The value to clone.
    +   * @returns {Mixed} The cloned value.
    +   */
    +  function deepClone(value) {
    +    var accessor,
    +        circular,
    +        clone,
    +        ctor,
    +        descriptor,
    +        extensible,
    +        key,
    +        length,
    +        markerKey,
    +        parent,
    +        result,
    +        source,
    +        subIndex,
    +        data = { 'value': value },
    +        index = 0,
    +        marked = [],
    +        queue = { 'length': 0 },
    +        unmarked = [];
    +
    +    /**
    +     * An easily detectable decorator for cloned values.
    +     */
    +    function Marker(object) {
    +      this.raw = object;
    +    }
    +
    +    /**
    +     * The callback used by `forProps()`.
    +     */
    +    function forPropsCallback(subValue, subKey) {
    +      // exit early to avoid cloning the marker
    +      if (subValue && subValue.constructor == Marker) {
    +        return;
    +      }
    +      // add objects to the queue
    +      if (subValue === Object(subValue)) {
    +        queue[queue.length++] = { 'key': subKey, 'parent': clone, 'source': value };
    +      }
    +      // assign non-objects
    +      else {
    +        try {
    +          // will throw an error in strict mode if the property is read-only
    +          clone[subKey] = subValue;
    +        } catch(e) { }
    +      }
    +    }
    +
    +    /**
    +     * Gets an available marker key for the given object.
    +     */
    +    function getMarkerKey(object) {
    +      // avoid collisions with existing keys
    +      var result = uid;
    +      while (object[result] && object[result].constructor != Marker) {
    +        result += 1;
    +      }
    +      return result;
    +    }
    +
    +    do {
    +      key = data.key;
    +      parent = data.parent;
    +      source = data.source;
    +      clone = value = source ? source[key] : data.value;
    +      accessor = circular = descriptor = false;
    +
    +      // create a basic clone to filter out functions, DOM elements, and
    +      // other non `Object` objects
    +      if (value === Object(value)) {
    +        // use custom deep clone function if available
    +        if (isClassOf(value.deepClone, 'Function')) {
    +          clone = value.deepClone();
    +        } else {
    +          ctor = value.constructor;
    +          switch (toString.call(value)) {
    +            case '[object Array]':
    +              clone = new ctor(value.length);
    +              break;
    +
    +            case '[object Boolean]':
    +              clone = new ctor(value == true);
    +              break;
    +
    +            case '[object Date]':
    +              clone = new ctor(+value);
    +              break;
    +
    +            case '[object Object]':
    +              isPlainObject(value) && (clone = {});
    +              break;
    +
    +            case '[object Number]':
    +            case '[object String]':
    +              clone = new ctor(value);
    +              break;
    +
    +            case '[object RegExp]':
    +              clone = ctor(value.source,
    +                (value.global     ? 'g' : '') +
    +                (value.ignoreCase ? 'i' : '') +
    +                (value.multiline  ? 'm' : ''));
    +          }
    +        }
    +        // continue clone if `value` doesn't have an accessor descriptor
    +        // http://es5.github.com/#x8.10.1
    +        if (clone && clone != value &&
    +            !(descriptor = source && support.descriptors && getDescriptor(source, key),
    +              accessor = descriptor && (descriptor.get || descriptor.set))) {
    +          // use an existing clone (circular reference)
    +          if ((extensible = isExtensible(value))) {
    +            markerKey = getMarkerKey(value);
    +            if (value[markerKey]) {
    +              circular = clone = value[markerKey].raw;
    +            }
    +          } else {
    +            // for frozen/sealed objects
    +            for (subIndex = 0, length = unmarked.length; subIndex < length; subIndex++) {
    +              data = unmarked[subIndex];
    +              if (data.object === value) {
    +                circular = clone = data.clone;
    +                break;
    +              }
    +            }
    +          }
    +          if (!circular) {
    +            // mark object to allow quickly detecting circular references and tie it to its clone
    +            if (extensible) {
    +              value[markerKey] = new Marker(clone);
    +              marked.push({ 'key': markerKey, 'object': value });
    +            } else {
    +              // for frozen/sealed objects
    +              unmarked.push({ 'clone': clone, 'object': value });
    +            }
    +            // iterate over object properties
    +            forProps(value, forPropsCallback, { 'which': 'all' });
    +          }
    +        }
    +      }
    +      if (parent) {
    +        // for custom property descriptors
    +        if (accessor || (descriptor && !(descriptor.configurable && descriptor.enumerable && descriptor.writable))) {
    +          if ('value' in descriptor) {
    +            descriptor.value = clone;
    +          }
    +          setDescriptor(parent, key, descriptor);
    +        }
    +        // for default property descriptors
    +        else {
    +          parent[key] = clone;
    +        }
    +      } else {
    +        result = clone;
    +      }
    +    } while ((data = queue[index++]));
    +
    +    // remove markers
    +    for (index = 0, length = marked.length; index < length; index++) {
    +      data = marked[index];
    +      delete data.object[data.key];
    +    }
    +    return result;
    +  }
    +
    +  /**
    +   * An iteration utility for arrays and objects.
    +   * Callbacks may terminate the loop by explicitly returning `false`.
    +   *
    +   * @static
    +   * @memberOf Benchmark
    +   * @param {Array|Object} object The object to iterate over.
    +   * @param {Function} callback The function called per iteration.
    +   * @param {Mixed} thisArg The `this` binding for the callback.
    +   * @returns {Array|Object} Returns the object iterated over.
    +   */
    +  function each(object, callback, thisArg) {
    +    var result = object;
    +    object = Object(object);
    +
    +    var fn = callback,
    +        index = -1,
    +        length = object.length,
    +        isSnapshot = !!(object.snapshotItem && (length = object.snapshotLength)),
    +        isSplittable = (noCharByIndex || noCharByOwnIndex) && isClassOf(object, 'String'),
    +        isConvertable = isSnapshot || isSplittable || 'item' in object,
    +        origObject = object;
    +
    +    // in Opera < 10.5 `hasKey(object, 'length')` returns `false` for NodeLists
    +    if (length === length >>> 0) {
    +      if (isConvertable) {
    +        // the third argument of the callback is the original non-array object
    +        callback = function(value, index) {
    +          return fn.call(this, value, index, origObject);
    +        };
    +        // in IE < 9 strings don't support accessing characters by index
    +        if (isSplittable) {
    +          object = object.split('');
    +        } else {
    +          object = [];
    +          while (++index < length) {
    +            // in Safari 2 `index in object` is always `false` for NodeLists
    +            object[index] = isSnapshot ? result.snapshotItem(index) : result[index];
    +          }
    +        }
    +      }
    +      forEach(object, callback, thisArg);
    +    } else {
    +      forOwn(object, callback, thisArg);
    +    }
    +    return result;
    +  }
    +
    +  /**
    +   * Copies enumerable properties from the source(s) object to the destination object.
    +   *
    +   * @static
    +   * @memberOf Benchmark
    +   * @param {Object} destination The destination object.
    +   * @param {Object} [source={}] The source object.
    +   * @returns {Object} The destination object.
    +   */
    +  function extend(destination, source) {
    +    // Chrome < 14 incorrectly sets `destination` to `undefined` when we `delete arguments[0]`
    +    // http://code.google.com/p/v8/issues/detail?id=839
    +    var result = destination;
    +    delete arguments[0];
    +
    +    forEach(arguments, function(source) {
    +      forProps(source, function(value, key) {
    +        result[key] = value;
    +      });
    +    });
    +    return result;
    +  }
    +
    +  /**
    +   * A generic `Array#filter` like method.
    +   *
    +   * @static
    +   * @memberOf Benchmark
    +   * @param {Array} array The array to iterate over.
    +   * @param {Function|String} callback The function/alias called per iteration.
    +   * @param {Mixed} thisArg The `this` binding for the callback.
    +   * @returns {Array} A new array of values that passed callback filter.
    +   * @example
    +   *
    +   * // get odd numbers
    +   * Benchmark.filter([1, 2, 3, 4, 5], function(n) {
    +   *   return n % 2;
    +   * }); // -> [1, 3, 5];
    +   *
    +   * // get fastest benchmarks
    +   * Benchmark.filter(benches, 'fastest');
    +   *
    +   * // get slowest benchmarks
    +   * Benchmark.filter(benches, 'slowest');
    +   *
    +   * // get benchmarks that completed without erroring
    +   * Benchmark.filter(benches, 'successful');
    +   */
    +  function filter(array, callback, thisArg) {
    +    var result;
    +
    +    if (callback == 'successful') {
    +      // callback to exclude those that are errored, unrun, or have hz of Infinity
    +      callback = function(bench) { return bench.cycles && isFinite(bench.hz); };
    +    }
    +    else if (callback == 'fastest' || callback == 'slowest') {
    +      // get successful, sort by period + margin of error, and filter fastest/slowest
    +      result = filter(array, 'successful').sort(function(a, b) {
    +        a = a.stats; b = b.stats;
    +        return (a.mean + a.moe > b.mean + b.moe ? 1 : -1) * (callback == 'fastest' ? 1 : -1);
    +      });
    +      result = filter(result, function(bench) {
    +        return result[0].compare(bench) == 0;
    +      });
    +    }
    +    return result || reduce(array, function(result, value, index) {
    +      return callback.call(thisArg, value, index, array) ? (result.push(value), result) : result;
    +    }, []);
    +  }
    +
    +  /**
    +   * A generic `Array#forEach` like method.
    +   * Callbacks may terminate the loop by explicitly returning `false`.
    +   *
    +   * @static
    +   * @memberOf Benchmark
    +   * @param {Array} array The array to iterate over.
    +   * @param {Function} callback The function called per iteration.
    +   * @param {Mixed} thisArg The `this` binding for the callback.
    +   * @returns {Array} Returns the array iterated over.
    +   */
    +  function forEach(array, callback, thisArg) {
    +    var index = -1,
    +        length = (array = Object(array)).length >>> 0;
    +
    +    if (thisArg !== undefined) {
    +      callback = bind(callback, thisArg);
    +    }
    +    while (++index < length) {
    +      if (index in array &&
    +          callback(array[index], index, array) === false) {
    +        break;
    +      }
    +    }
    +    return array;
    +  }
    +
    +  /**
    +   * Iterates over an object's own properties, executing the `callback` for each.
    +   * Callbacks may terminate the loop by explicitly returning `false`.
    +   *
    +   * @static
    +   * @memberOf Benchmark
    +   * @param {Object} object The object to iterate over.
    +   * @param {Function} callback The function executed per own property.
    +   * @param {Mixed} thisArg The `this` binding for the callback.
    +   * @returns {Object} Returns the object iterated over.
    +   */
    +  function forOwn(object, callback, thisArg) {
    +    return forProps(object, callback, { 'bind': thisArg, 'which': 'own' });
    +  }
    +
    +  /**
    +   * Converts a number to a more readable comma-separated string representation.
    +   *
    +   * @static
    +   * @memberOf Benchmark
    +   * @param {Number} number The number to convert.
    +   * @returns {String} The more readable string representation.
    +   */
    +  function formatNumber(number) {
    +    number = String(number).split('.');
    +    return number[0].replace(/(?=(?:\d{3})+$)(?!\b)/g, ',') +
    +      (number[1] ? '.' + number[1] : '');
    +  }
    +
    +  /**
    +   * Checks if an object has the specified key as a direct property.
    +   *
    +   * @static
    +   * @memberOf Benchmark
    +   * @param {Object} object The object to check.
    +   * @param {String} key The key to check for.
    +   * @returns {Boolean} Returns `true` if key is a direct property, else `false`.
    +   */
    +  function hasKey() {
    +    // lazy define for worst case fallback (not as accurate)
    +    hasKey = function(object, key) {
    +      var parent = object != null && (object.constructor || Object).prototype;
    +      return !!parent && key in Object(object) && !(key in parent && object[key] === parent[key]);
    +    };
    +    // for modern browsers
    +    if (isClassOf(hasOwnProperty, 'Function')) {
    +      hasKey = function(object, key) {
    +        return object != null && hasOwnProperty.call(object, key);
    +      };
    +    }
    +    // for Safari 2
    +    else if ({}.__proto__ == Object.prototype) {
    +      hasKey = function(object, key) {
    +        var result = false;
    +        if (object != null) {
    +          object = Object(object);
    +          object.__proto__ = [object.__proto__, object.__proto__ = null, result = key in object][0];
    +        }
    +        return result;
    +      };
    +    }
    +    return hasKey.apply(this, arguments);
    +  }
    +
    +  /**
    +   * A generic `Array#indexOf` like method.
    +   *
    +   * @static
    +   * @memberOf Benchmark
    +   * @param {Array} array The array to iterate over.
    +   * @param {Mixed} value The value to search for.
    +   * @param {Number} [fromIndex=0] The index to start searching from.
    +   * @returns {Number} The index of the matched value or `-1`.
    +   */
    +  function indexOf(array, value, fromIndex) {
    +    var index = toInteger(fromIndex),
    +        length = (array = Object(array)).length >>> 0;
    +
    +    index = (index < 0 ? max(0, length + index) : index) - 1;
    +    while (++index < length) {
    +      if (index in array && value === array[index]) {
    +        return index;
    +      }
    +    }
    +    return -1;
    +  }
    +
    +  /**
    +   * Modify a string by replacing named tokens with matching object property values.
    +   *
    +   * @static
    +   * @memberOf Benchmark
    +   * @param {String} string The string to modify.
    +   * @param {Object} object The template object.
    +   * @returns {String} The modified string.
    +   */
    +  function interpolate(string, object) {
    +    forOwn(object, function(value, key) {
    +      // escape regexp special characters in `key`
    +      string = string.replace(RegExp('#\\{' + key.replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1') + '\\}', 'g'), value);
    +    });
    +    return string;
    +  }
    +
    +  /**
    +   * Invokes a method on all items in an array.
    +   *
    +   * @static
    +   * @memberOf Benchmark
    +   * @param {Array} benches Array of benchmarks to iterate over.
    +   * @param {String|Object} name The name of the method to invoke OR options object.
    +   * @param {Mixed} [arg1, arg2, ...] Arguments to invoke the method with.
    +   * @returns {Array} A new array of values returned from each method invoked.
    +   * @example
    +   *
    +   * // invoke `reset` on all benchmarks
    +   * Benchmark.invoke(benches, 'reset');
    +   *
    +   * // invoke `emit` with arguments
    +   * Benchmark.invoke(benches, 'emit', 'complete', listener);
    +   *
    +   * // invoke `run(true)`, treat benchmarks as a queue, and register invoke callbacks
    +   * Benchmark.invoke(benches, {
    +   *
    +   *   // invoke the `run` method
    +   *   'name': 'run',
    +   *
    +   *   // pass a single argument
    +   *   'args': true,
    +   *
    +   *   // treat as queue, removing benchmarks from front of `benches` until empty
    +   *   'queued': true,
    +   *
    +   *   // called before any benchmarks have been invoked.
    +   *   'onStart': onStart,
    +   *
    +   *   // called between invoking benchmarks
    +   *   'onCycle': onCycle,
    +   *
    +   *   // called after all benchmarks have been invoked.
    +   *   'onComplete': onComplete
    +   * });
    +   */
    +  function invoke(benches, name) {
    +    var args,
    +        bench,
    +        queued,
    +        index = -1,
    +        eventProps = { 'currentTarget': benches },
    +        options = { 'onStart': noop, 'onCycle': noop, 'onComplete': noop },
    +        result = map(benches, function(bench) { return bench; });
    +
    +    /**
    +     * Invokes the method of the current object and if synchronous, fetches the next.
    +     */
    +    function execute() {
    +      var listeners,
    +          async = isAsync(bench);
    +
    +      if (async) {
    +        // use `getNext` as the first listener
    +        bench.on('complete', getNext);
    +        listeners = bench.events.complete;
    +        listeners.splice(0, 0, listeners.pop());
    +      }
    +      // execute method
    +      result[index] = isClassOf(bench && bench[name], 'Function') ? bench[name].apply(bench, args) : undefined;
    +      // if synchronous return true until finished
    +      return !async && getNext();
    +    }
    +
    +    /**
    +     * Fetches the next bench or executes `onComplete` callback.
    +     */
    +    function getNext(event) {
    +      var cycleEvent,
    +          last = bench,
    +          async = isAsync(last);
    +
    +      if (async) {
    +        last.off('complete', getNext);
    +        last.emit('complete');
    +      }
    +      // emit "cycle" event
    +      eventProps.type = 'cycle';
    +      eventProps.target = last;
    +      cycleEvent = Event(eventProps);
    +      options.onCycle.call(benches, cycleEvent);
    +
    +      // choose next benchmark if not exiting early
    +      if (!cycleEvent.aborted && raiseIndex() !== false) {
    +        bench = queued ? benches[0] : result[index];
    +        if (isAsync(bench)) {
    +          delay(bench, execute);
    +        }
    +        else if (async) {
    +          // resume execution if previously asynchronous but now synchronous
    +          while (execute()) { }
    +        }
    +        else {
    +          // continue synchronous execution
    +          return true;
    +        }
    +      } else {
    +        // emit "complete" event
    +        eventProps.type = 'complete';
    +        options.onComplete.call(benches, Event(eventProps));
    +      }
    +      // When used as a listener `event.aborted = true` will cancel the rest of
    +      // the "complete" listeners because they were already called above and when
    +      // used as part of `getNext` the `return false` will exit the execution while-loop.
    +      if (event) {
    +        event.aborted = true;
    +      } else {
    +        return false;
    +      }
    +    }
    +
    +    /**
    +     * Checks if invoking `Benchmark#run` with asynchronous cycles.
    +     */
    +    function isAsync(object) {
    +      // avoid using `instanceof` here because of IE memory leak issues with host objects
    +      var async = args[0] && args[0].async;
    +      return Object(object).constructor == Benchmark && name == 'run' &&
    +        ((async == null ? object.options.async : async) && support.timeout || object.defer);
    +    }
    +
    +    /**
    +     * Raises `index` to the next defined index or returns `false`.
    +     */
    +    function raiseIndex() {
    +      var length = result.length;
    +      if (queued) {
    +        // if queued remove the previous bench and subsequent skipped non-entries
    +        do {
    +          ++index > 0 && shift.call(benches);
    +        } while ((length = benches.length) && !('0' in benches));
    +      }
    +      else {
    +        while (++index < length && !(index in result)) { }
    +      }
    +      // if we reached the last index then return `false`
    +      return (queued ? length : index < length) ? index : (index = false);
    +    }
    +
    +    // juggle arguments
    +    if (isClassOf(name, 'String')) {
    +      // 2 arguments (array, name)
    +      args = slice.call(arguments, 2);
    +    } else {
    +      // 2 arguments (array, options)
    +      options = extend(options, name);
    +      name = options.name;
    +      args = isClassOf(args = 'args' in options ? options.args : [], 'Array') ? args : [args];
    +      queued = options.queued;
    +    }
    +
    +    // start iterating over the array
    +    if (raiseIndex() !== false) {
    +      // emit "start" event
    +      bench = result[index];
    +      eventProps.type = 'start';
    +      eventProps.target = bench;
    +      options.onStart.call(benches, Event(eventProps));
    +
    +      // end early if the suite was aborted in an "onStart" listener
    +      if (benches.aborted && benches.constructor == Suite && name == 'run') {
    +        // emit "cycle" event
    +        eventProps.type = 'cycle';
    +        options.onCycle.call(benches, Event(eventProps));
    +        // emit "complete" event
    +        eventProps.type = 'complete';
    +        options.onComplete.call(benches, Event(eventProps));
    +      }
    +      // else start
    +      else {
    +        if (isAsync(bench)) {
    +          delay(bench, execute);
    +        } else {
    +          while (execute()) { }
    +        }
    +      }
    +    }
    +    return result;
    +  }
    +
    +  /**
    +   * Creates a string of joined array values or object key-value pairs.
    +   *
    +   * @static
    +   * @memberOf Benchmark
    +   * @param {Array|Object} object The object to operate on.
    +   * @param {String} [separator1=','] The separator used between key-value pairs.
    +   * @param {String} [separator2=': '] The separator used between keys and values.
    +   * @returns {String} The joined result.
    +   */
    +  function join(object, separator1, separator2) {
    +    var result = [],
    +        length = (object = Object(object)).length,
    +        arrayLike = length === length >>> 0;
    +
    +    separator2 || (separator2 = ': ');
    +    each(object, function(value, key) {
    +      result.push(arrayLike ? value : key + separator2 + value);
    +    });
    +    return result.join(separator1 || ',');
    +  }
    +
    +  /**
    +   * A generic `Array#map` like method.
    +   *
    +   * @static
    +   * @memberOf Benchmark
    +   * @param {Array} array The array to iterate over.
    +   * @param {Function} callback The function called per iteration.
    +   * @param {Mixed} thisArg The `this` binding for the callback.
    +   * @returns {Array} A new array of values returned by the callback.
    +   */
    +  function map(array, callback, thisArg) {
    +    return reduce(array, function(result, value, index) {
    +      result[index] = callback.call(thisArg, value, index, array);
    +      return result;
    +    }, Array(Object(array).length >>> 0));
    +  }
    +
    +  /**
    +   * Retrieves the value of a specified property from all items in an array.
    +   *
    +   * @static
    +   * @memberOf Benchmark
    +   * @param {Array} array The array to iterate over.
    +   * @param {String} property The property to pluck.
    +   * @returns {Array} A new array of property values.
    +   */
    +  function pluck(array, property) {
    +    return map(array, function(object) {
    +      return object == null ? undefined : object[property];
    +    });
    +  }
    +
    +  /**
    +   * A generic `Array#reduce` like method.
    +   *
    +   * @static
    +   * @memberOf Benchmark
    +   * @param {Array} array The array to iterate over.
    +   * @param {Function} callback The function called per iteration.
    +   * @param {Mixed} accumulator Initial value of the accumulator.
    +   * @returns {Mixed} The accumulator.
    +   */
    +  function reduce(array, callback, accumulator) {
    +    var noaccum = arguments.length < 3;
    +    forEach(array, function(value, index) {
    +      accumulator = noaccum ? (noaccum = false, value) : callback(accumulator, value, index, array);
    +    });
    +    return accumulator;
    +  }
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  /**
    +   * Aborts all benchmarks in the suite.
    +   *
    +   * @name abort
    +   * @memberOf Benchmark.Suite
    +   * @returns {Object} The suite instance.
    +   */
    +  function abortSuite() {
    +    var event,
    +        me = this,
    +        resetting = calledBy.resetSuite;
    +
    +    if (me.running) {
    +      event = Event('abort');
    +      me.emit(event);
    +      if (!event.cancelled || resetting) {
    +        // avoid infinite recursion
    +        calledBy.abortSuite = true;
    +        me.reset();
    +        delete calledBy.abortSuite;
    +
    +        if (!resetting) {
    +          me.aborted = true;
    +          invoke(me, 'abort');
    +        }
    +      }
    +    }
    +    return me;
    +  }
    +
    +  /**
    +   * Adds a test to the benchmark suite.
    +   *
    +   * @memberOf Benchmark.Suite
    +   * @param {String} name A name to identify the benchmark.
    +   * @param {Function|String} fn The test to benchmark.
    +   * @param {Object} [options={}] Options object.
    +   * @returns {Object} The benchmark instance.
    +   * @example
    +   *
    +   * // basic usage
    +   * suite.add(fn);
    +   *
    +   * // or using a name first
    +   * suite.add('foo', fn);
    +   *
    +   * // or with options
    +   * suite.add('foo', fn, {
    +   *   'onCycle': onCycle,
    +   *   'onComplete': onComplete
    +   * });
    +   *
    +   * // or name and options
    +   * suite.add('foo', {
    +   *   'fn': fn,
    +   *   'onCycle': onCycle,
    +   *   'onComplete': onComplete
    +   * });
    +   *
    +   * // or options only
    +   * suite.add({
    +   *   'name': 'foo',
    +   *   'fn': fn,
    +   *   'onCycle': onCycle,
    +   *   'onComplete': onComplete
    +   * });
    +   */
    +  function add(name, fn, options) {
    +    var me = this,
    +        bench = Benchmark(name, fn, options),
    +        event = Event({ 'type': 'add', 'target': bench });
    +
    +    if (me.emit(event), !event.cancelled) {
    +      me.push(bench);
    +    }
    +    return me;
    +  }
    +
    +  /**
    +   * Creates a new suite with cloned benchmarks.
    +   *
    +   * @name clone
    +   * @memberOf Benchmark.Suite
    +   * @param {Object} options Options object to overwrite cloned options.
    +   * @returns {Object} The new suite instance.
    +   */
    +  function cloneSuite(options) {
    +    var me = this,
    +        result = new me.constructor(extend({}, me.options, options));
    +
    +    // copy own properties
    +    forOwn(me, function(value, key) {
    +      if (!hasKey(result, key)) {
    +        result[key] = value && isClassOf(value.clone, 'Function')
    +          ? value.clone()
    +          : deepClone(value);
    +      }
    +    });
    +    return result;
    +  }
    +
    +  /**
    +   * An `Array#filter` like method.
    +   *
    +   * @name filter
    +   * @memberOf Benchmark.Suite
    +   * @param {Function|String} callback The function/alias called per iteration.
    +   * @returns {Object} A new suite of benchmarks that passed callback filter.
    +   */
    +  function filterSuite(callback) {
    +    var me = this,
    +        result = new me.constructor;
    +
    +    result.push.apply(result, filter(me, callback));
    +    return result;
    +  }
    +
    +  /**
    +   * Resets all benchmarks in the suite.
    +   *
    +   * @name reset
    +   * @memberOf Benchmark.Suite
    +   * @returns {Object} The suite instance.
    +   */
    +  function resetSuite() {
    +    var event,
    +        me = this,
    +        aborting = calledBy.abortSuite;
    +
    +    if (me.running && !aborting) {
    +      // no worries, `resetSuite()` is called within `abortSuite()`
    +      calledBy.resetSuite = true;
    +      me.abort();
    +      delete calledBy.resetSuite;
    +    }
    +    // reset if the state has changed
    +    else if ((me.aborted || me.running) &&
    +        (me.emit(event = Event('reset')), !event.cancelled)) {
    +      me.running = false;
    +      if (!aborting) {
    +        invoke(me, 'reset');
    +      }
    +    }
    +    return me;
    +  }
    +
    +  /**
    +   * Runs the suite.
    +   *
    +   * @name run
    +   * @memberOf Benchmark.Suite
    +   * @param {Object} [options={}] Options object.
    +   * @returns {Object} The suite instance.
    +   * @example
    +   *
    +   * // basic usage
    +   * suite.run();
    +   *
    +   * // or with options
    +   * suite.run({ 'async': true, 'queued': true });
    +   */
    +  function runSuite(options) {
    +    var me = this;
    +
    +    me.reset();
    +    me.running = true;
    +    options || (options = {});
    +
    +    invoke(me, {
    +      'name': 'run',
    +      'args': options,
    +      'queued': options.queued,
    +      'onStart': function(event) {
    +        me.emit(event);
    +      },
    +      'onCycle': function(event) {
    +        var bench = event.target;
    +        if (bench.error) {
    +          me.emit({ 'type': 'error', 'target': bench });
    +        }
    +        me.emit(event);
    +        event.aborted = me.aborted;
    +      },
    +      'onComplete': function(event) {
    +        me.running = false;
    +        me.emit(event);
    +      }
    +    });
    +    return me;
    +  }
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  /**
    +   * Executes all registered listeners of the specified event type.
    +   *
    +   * @memberOf Benchmark, Benchmark.Suite
    +   * @param {String|Object} type The event type or object.
    +   * @returns {Mixed} Returns the return value of the last listener executed.
    +   */
    +  function emit(type) {
    +    var listeners,
    +        me = this,
    +        event = Event(type),
    +        events = me.events,
    +        args = (arguments[0] = event, arguments);
    +
    +    event.currentTarget || (event.currentTarget = me);
    +    event.target || (event.target = me);
    +    delete event.result;
    +
    +    if (events && (listeners = hasKey(events, event.type) && events[event.type])) {
    +      forEach(listeners.slice(), function(listener) {
    +        if ((event.result = listener.apply(me, args)) === false) {
    +          event.cancelled = true;
    +        }
    +        return !event.aborted;
    +      });
    +    }
    +    return event.result;
    +  }
    +
    +  /**
    +   * Returns an array of event listeners for a given type that can be manipulated
    +   * to add or remove listeners.
    +   *
    +   * @memberOf Benchmark, Benchmark.Suite
    +   * @param {String} type The event type.
    +   * @returns {Array} The listeners array.
    +   */
    +  function listeners(type) {
    +    var me = this,
    +        events = me.events || (me.events = {});
    +
    +    return hasKey(events, type) ? events[type] : (events[type] = []);
    +  }
    +
    +  /**
    +   * Unregisters a listener for the specified event type(s),
    +   * or unregisters all listeners for the specified event type(s),
    +   * or unregisters all listeners for all event types.
    +   *
    +   * @memberOf Benchmark, Benchmark.Suite
    +   * @param {String} [type] The event type.
    +   * @param {Function} [listener] The function to unregister.
    +   * @returns {Object} The benchmark instance.
    +   * @example
    +   *
    +   * // unregister a listener for an event type
    +   * bench.off('cycle', listener);
    +   *
    +   * // unregister a listener for multiple event types
    +   * bench.off('start cycle', listener);
    +   *
    +   * // unregister all listeners for an event type
    +   * bench.off('cycle');
    +   *
    +   * // unregister all listeners for multiple event types
    +   * bench.off('start cycle complete');
    +   *
    +   * // unregister all listeners for all event types
    +   * bench.off();
    +   */
    +  function off(type, listener) {
    +    var me = this,
    +        events = me.events;
    +
    +    events && each(type ? type.split(' ') : events, function(listeners, type) {
    +      var index;
    +      if (typeof listeners == 'string') {
    +        type = listeners;
    +        listeners = hasKey(events, type) && events[type];
    +      }
    +      if (listeners) {
    +        if (listener) {
    +          index = indexOf(listeners, listener);
    +          if (index > -1) {
    +            listeners.splice(index, 1);
    +          }
    +        } else {
    +          listeners.length = 0;
    +        }
    +      }
    +    });
    +    return me;
    +  }
    +
    +  /**
    +   * Registers a listener for the specified event type(s).
    +   *
    +   * @memberOf Benchmark, Benchmark.Suite
    +   * @param {String} type The event type.
    +   * @param {Function} listener The function to register.
    +   * @returns {Object} The benchmark instance.
    +   * @example
    +   *
    +   * // register a listener for an event type
    +   * bench.on('cycle', listener);
    +   *
    +   * // register a listener for multiple event types
    +   * bench.on('start cycle', listener);
    +   */
    +  function on(type, listener) {
    +    var me = this,
    +        events = me.events || (me.events = {});
    +
    +    forEach(type.split(' '), function(type) {
    +      (hasKey(events, type)
    +        ? events[type]
    +        : (events[type] = [])
    +      ).push(listener);
    +    });
    +    return me;
    +  }
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  /**
    +   * Aborts the benchmark without recording times.
    +   *
    +   * @memberOf Benchmark
    +   * @returns {Object} The benchmark instance.
    +   */
    +  function abort() {
    +    var event,
    +        me = this,
    +        resetting = calledBy.reset;
    +
    +    if (me.running) {
    +      event = Event('abort');
    +      me.emit(event);
    +      if (!event.cancelled || resetting) {
    +        // avoid infinite recursion
    +        calledBy.abort = true;
    +        me.reset();
    +        delete calledBy.abort;
    +
    +        if (support.timeout) {
    +          clearTimeout(me._timerId);
    +          delete me._timerId;
    +        }
    +        if (!resetting) {
    +          me.aborted = true;
    +          me.running = false;
    +        }
    +      }
    +    }
    +    return me;
    +  }
    +
    +  /**
    +   * Creates a new benchmark using the same test and options.
    +   *
    +   * @memberOf Benchmark
    +   * @param {Object} options Options object to overwrite cloned options.
    +   * @returns {Object} The new benchmark instance.
    +   * @example
    +   *
    +   * var bizarro = bench.clone({
    +   *   'name': 'doppelganger'
    +   * });
    +   */
    +  function clone(options) {
    +    var me = this,
    +        result = new me.constructor(extend({}, me, options));
    +
    +    // correct the `options` object
    +    result.options = extend({}, me.options, options);
    +
    +    // copy own custom properties
    +    forOwn(me, function(value, key) {
    +      if (!hasKey(result, key)) {
    +        result[key] = deepClone(value);
    +      }
    +    });
    +    return result;
    +  }
    +
    +  /**
    +   * Determines if a benchmark is faster than another.
    +   *
    +   * @memberOf Benchmark
    +   * @param {Object} other The benchmark to compare.
    +   * @returns {Number} Returns `-1` if slower, `1` if faster, and `0` if indeterminate.
    +   */
    +  function compare(other) {
    +    var critical,
    +        zStat,
    +        me = this,
    +        sample1 = me.stats.sample,
    +        sample2 = other.stats.sample,
    +        size1 = sample1.length,
    +        size2 = sample2.length,
    +        maxSize = max(size1, size2),
    +        minSize = min(size1, size2),
    +        u1 = getU(sample1, sample2),
    +        u2 = getU(sample2, sample1),
    +        u = min(u1, u2);
    +
    +    function getScore(xA, sampleB) {
    +      return reduce(sampleB, function(total, xB) {
    +        return total + (xB > xA ? 0 : xB < xA ? 1 : 0.5);
    +      }, 0);
    +    }
    +
    +    function getU(sampleA, sampleB) {
    +      return reduce(sampleA, function(total, xA) {
    +        return total + getScore(xA, sampleB);
    +      }, 0);
    +    }
    +
    +    function getZ(u) {
    +      return (u - ((size1 * size2) / 2)) / sqrt((size1 * size2 * (size1 + size2 + 1)) / 12);
    +    }
    +
    +    // exit early if comparing the same benchmark
    +    if (me == other) {
    +      return 0;
    +    }
    +    // reject the null hyphothesis the two samples come from the
    +    // same population (i.e. have the same median) if...
    +    if (size1 + size2 > 30) {
    +      // ...the z-stat is greater than 1.96 or less than -1.96
    +      // http://www.statisticslectures.com/topics/mannwhitneyu/
    +      zStat = getZ(u);
    +      return abs(zStat) > 1.96 ? (zStat > 0 ? -1 : 1) : 0;
    +    }
    +    // ...the U value is less than or equal the critical U value
    +    // http://www.geoib.com/mann-whitney-u-test.html
    +    critical = maxSize < 5 || minSize < 3 ? 0 : uTable[maxSize][minSize - 3];
    +    return u <= critical ? (u == u1 ? 1 : -1) : 0;
    +  }
    +
    +  /**
    +   * Reset properties and abort if running.
    +   *
    +   * @memberOf Benchmark
    +   * @returns {Object} The benchmark instance.
    +   */
    +  function reset() {
    +    var data,
    +        event,
    +        me = this,
    +        index = 0,
    +        changes = { 'length': 0 },
    +        queue = { 'length': 0 };
    +
    +    if (me.running && !calledBy.abort) {
    +      // no worries, `reset()` is called within `abort()`
    +      calledBy.reset = true;
    +      me.abort();
    +      delete calledBy.reset;
    +    }
    +    else {
    +      // a non-recursive solution to check if properties have changed
    +      // http://www.jslab.dk/articles/non.recursive.preorder.traversal.part4
    +      data = { 'destination': me, 'source': extend({}, me.constructor.prototype, me.options) };
    +      do {
    +        forOwn(data.source, function(value, key) {
    +          var changed,
    +              destination = data.destination,
    +              currValue = destination[key];
    +
    +          if (value && typeof value == 'object') {
    +            if (isClassOf(value, 'Array')) {
    +              // check if an array value has changed to a non-array value
    +              if (!isClassOf(currValue, 'Array')) {
    +                changed = currValue = [];
    +              }
    +              // or has changed its length
    +              if (currValue.length != value.length) {
    +                changed = currValue = currValue.slice(0, value.length);
    +                currValue.length = value.length;
    +              }
    +            }
    +            // check if an object has changed to a non-object value
    +            else if (!currValue || typeof currValue != 'object') {
    +              changed = currValue = {};
    +            }
    +            // register a changed object
    +            if (changed) {
    +              changes[changes.length++] = { 'destination': destination, 'key': key, 'value': currValue };
    +            }
    +            queue[queue.length++] = { 'destination': currValue, 'source': value };
    +          }
    +          // register a changed primitive
    +          else if (value !== currValue && !(value == null || isClassOf(value, 'Function'))) {
    +            changes[changes.length++] = { 'destination': destination, 'key': key, 'value': value };
    +          }
    +        });
    +      }
    +      while ((data = queue[index++]));
    +
    +      // if changed emit the `reset` event and if it isn't cancelled reset the benchmark
    +      if (changes.length && (me.emit(event = Event('reset')), !event.cancelled)) {
    +        forEach(changes, function(data) {
    +          data.destination[data.key] = data.value;
    +        });
    +      }
    +    }
    +    return me;
    +  }
    +
    +  /**
    +   * Displays relevant benchmark information when coerced to a string.
    +   *
    +   * @name toString
    +   * @memberOf Benchmark
    +   * @returns {String} A string representation of the benchmark instance.
    +   */
    +  function toStringBench() {
    +    var me = this,
    +        error = me.error,
    +        hz = me.hz,
    +        id = me.id,
    +        stats = me.stats,
    +        size = stats.sample.length,
    +        pm = support.java ? '+/-' : '\xb1',
    +        result = me.name || (isNaN(id) ? id : '');
    +
    +    if (error) {
    +      result += ': ' + join(error);
    +    } else {
    +      result += ' x ' + formatNumber(hz.toFixed(hz < 100 ? 2 : 0)) + ' ops/sec ' + pm +
    +        stats.rme.toFixed(2) + '% (' + size + ' run' + (size == 1 ? '' : 's') + ' sampled)';
    +    }
    +    return result;
    +  }
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  /**
    +   * Clocks the time taken to execute a test per cycle (secs).
    +   *
    +   * @private
    +   * @param {Object} bench The benchmark instance.
    +   * @returns {Number} The time taken.
    +   */
    +  function clock() {
    +    var applet,
    +        options = Benchmark.options,
    +        template = { 'begin': 's$=new n$', 'end': 'r$=(new n$-s$)/1e3', 'uid': uid },
    +        timers = [{ 'ns': timer.ns, 'res': max(0.0015, getRes('ms')), 'unit': 'ms' }];
    +
    +    // lazy define for hi-res timers
    +    clock = function(clone) {
    +      var deferred;
    +      if (clone instanceof Deferred) {
    +        deferred = clone;
    +        clone = deferred.benchmark;
    +      }
    +
    +      var bench = clone._original,
    +          fn = bench.fn,
    +          fnArg = deferred ? getFirstArgument(fn) || 'deferred' : '',
    +          stringable = isStringable(fn);
    +
    +      var source = {
    +        'setup': getSource(bench.setup, preprocess('m$.setup()')),
    +        'fn': getSource(fn, preprocess('m$.fn(' + fnArg + ')')),
    +        'fnArg': fnArg,
    +        'teardown': getSource(bench.teardown, preprocess('m$.teardown()'))
    +      };
    +
    +      var count = bench.count = clone.count,
    +          decompilable = support.decompilation || stringable,
    +          id = bench.id,
    +          isEmpty = !(source.fn || stringable),
    +          name = bench.name || (typeof id == 'number' ? '' : id),
    +          ns = timer.ns,
    +          result = 0;
    +
    +      // init `minTime` if needed
    +      clone.minTime = bench.minTime || (bench.minTime = bench.options.minTime = options.minTime);
    +
    +      // repair nanosecond timer
    +      // (some Chrome builds erase the `ns` variable after millions of executions)
    +      if (applet) {
    +        try {
    +          ns.nanoTime();
    +        } catch(e) {
    +          // use non-element to avoid issues with libs that augment them
    +          ns = timer.ns = new applet.Packages.nano;
    +        }
    +      }
    +
    +      // Compile in setup/teardown functions and the test loop.
    +      // Create a new compiled test, instead of using the cached `bench.compiled`,
    +      // to avoid potential engine optimizations enabled over the life of the test.
    +      var compiled = bench.compiled = createFunction(preprocess('t$'), interpolate(
    +        preprocess(deferred
    +          ? 'var d$=this,#{fnArg}=d$,m$=d$.benchmark._original,f$=m$.fn,su$=m$.setup,td$=m$.teardown;' +
    +            // when `deferred.cycles` is `0` then...
    +            'if(!d$.cycles){' +
    +            // set `deferred.fn`
    +            'd$.fn=function(){var #{fnArg}=d$;if(typeof f$=="function"){try{#{fn}\n}catch(e$){f$(d$)}}else{#{fn}\n}};' +
    +            // set `deferred.teardown`
    +            'd$.teardown=function(){d$.cycles=0;if(typeof td$=="function"){try{#{teardown}\n}catch(e$){td$()}}else{#{teardown}\n}};' +
    +            // execute the benchmark's `setup`
    +            'if(typeof su$=="function"){try{#{setup}\n}catch(e$){su$()}}else{#{setup}\n};' +
    +            // start timer
    +            't$.start(d$);' +
    +            // execute `deferred.fn` and return a dummy object
    +            '}d$.fn();return{}'
    +
    +          : 'var r$,s$,m$=this,f$=m$.fn,i$=m$.count,n$=t$.ns;#{setup}\n#{begin};' +
    +            'while(i$--){#{fn}\n}#{end};#{teardown}\nreturn{elapsed:r$,uid:"#{uid}"}'),
    +        source
    +      ));
    +
    +      try {
    +        if (isEmpty) {
    +          // Firefox may remove dead code from Function#toString results
    +          // http://bugzil.la/536085
    +          throw new Error('The test "' + name + '" is empty. This may be the result of dead code removal.');
    +        }
    +        else if (!deferred) {
    +          // pretest to determine if compiled code is exits early, usually by a
    +          // rogue `return` statement, by checking for a return object with the uid
    +          bench.count = 1;
    +          compiled = (compiled.call(bench, timer) || {}).uid == uid && compiled;
    +          bench.count = count;
    +        }
    +      } catch(e) {
    +        compiled = null;
    +        clone.error = e || new Error(String(e));
    +        bench.count = count;
    +      }
    +      // fallback when a test exits early or errors during pretest
    +      if (decompilable && !compiled && !deferred && !isEmpty) {
    +        compiled = createFunction(preprocess('t$'), interpolate(
    +          preprocess(
    +            (clone.error && !stringable
    +              ? 'var r$,s$,m$=this,f$=m$.fn,i$=m$.count'
    +              : 'function f$(){#{fn}\n}var r$,s$,m$=this,i$=m$.count'
    +            ) +
    +            ',n$=t$.ns;#{setup}\n#{begin};m$.f$=f$;while(i$--){m$.f$()}#{end};' +
    +            'delete m$.f$;#{teardown}\nreturn{elapsed:r$}'
    +          ),
    +          source
    +        ));
    +
    +        try {
    +          // pretest one more time to check for errors
    +          bench.count = 1;
    +          compiled.call(bench, timer);
    +          bench.compiled = compiled;
    +          bench.count = count;
    +          delete clone.error;
    +        }
    +        catch(e) {
    +          bench.count = count;
    +          if (clone.error) {
    +            compiled = null;
    +          } else {
    +            bench.compiled = compiled;
    +            clone.error = e || new Error(String(e));
    +          }
    +        }
    +      }
    +      // assign `compiled` to `clone` before calling in case a deferred benchmark
    +      // immediately calls `deferred.resolve()`
    +      clone.compiled = compiled;
    +      // if no errors run the full test loop
    +      if (!clone.error) {
    +        result = compiled.call(deferred || bench, timer).elapsed;
    +      }
    +      return result;
    +    };
    +
    +    /*------------------------------------------------------------------------*/
    +
    +    /**
    +     * Gets the current timer's minimum resolution (secs).
    +     */
    +    function getRes(unit) {
    +      var measured,
    +          begin,
    +          count = 30,
    +          divisor = 1e3,
    +          ns = timer.ns,
    +          sample = [];
    +
    +      // get average smallest measurable time
    +      while (count--) {
    +        if (unit == 'us') {
    +          divisor = 1e6;
    +          if (ns.stop) {
    +            ns.start();
    +            while (!(measured = ns.microseconds())) { }
    +          } else if (ns[perfName]) {
    +            divisor = 1e3;
    +            measured = Function('n', 'var r,s=n.' + perfName + '();while(!(r=n.' + perfName + '()-s)){};return r')(ns);
    +          } else {
    +            begin = ns();
    +            while (!(measured = ns() - begin)) { }
    +          }
    +        }
    +        else if (unit == 'ns') {
    +          divisor = 1e9;
    +          if (ns.nanoTime) {
    +            begin = ns.nanoTime();
    +            while (!(measured = ns.nanoTime() - begin)) { }
    +          } else {
    +            begin = (begin = ns())[0] + (begin[1] / divisor);
    +            while (!(measured = ((measured = ns())[0] + (measured[1] / divisor)) - begin)) { }
    +            divisor = 1;
    +          }
    +        }
    +        else {
    +          begin = new ns;
    +          while (!(measured = new ns - begin)) { }
    +        }
    +        // check for broken timers (nanoTime may have issues)
    +        // http://alivebutsleepy.srnet.cz/unreliable-system-nanotime/
    +        if (measured > 0) {
    +          sample.push(measured);
    +        } else {
    +          sample.push(Infinity);
    +          break;
    +        }
    +      }
    +      // convert to seconds
    +      return getMean(sample) / divisor;
    +    }
    +
    +    /**
    +     * Replaces all occurrences of `$` with a unique number and
    +     * template tokens with content.
    +     */
    +    function preprocess(code) {
    +      return interpolate(code, template).replace(/\$/g, /\d+/.exec(uid));
    +    }
    +
    +    /*------------------------------------------------------------------------*/
    +
    +    // detect nanosecond support from a Java applet
    +    each(doc && doc.applets || [], function(element) {
    +      return !(timer.ns = applet = 'nanoTime' in element && element);
    +    });
    +
    +    // check type in case Safari returns an object instead of a number
    +    try {
    +      if (typeof timer.ns.nanoTime() == 'number') {
    +        timers.push({ 'ns': timer.ns, 'res': getRes('ns'), 'unit': 'ns' });
    +      }
    +    } catch(e) { }
    +
    +    // detect Chrome's microsecond timer:
    +    // enable benchmarking via the --enable-benchmarking command
    +    // line switch in at least Chrome 7 to use chrome.Interval
    +    try {
    +      if ((timer.ns = new (window.chrome || window.chromium).Interval)) {
    +        timers.push({ 'ns': timer.ns, 'res': getRes('us'), 'unit': 'us' });
    +      }
    +    } catch(e) { }
    +
    +    // detect `performance.now` microsecond resolution timer
    +    if ((timer.ns = perfName && perfObject)) {
    +      timers.push({ 'ns': timer.ns, 'res': getRes('us'), 'unit': 'us' });
    +    }
    +
    +    // detect Node's nanosecond resolution timer available in Node >= 0.8
    +    if (processObject && typeof (timer.ns = processObject.hrtime) == 'function') {
    +      timers.push({ 'ns': timer.ns, 'res': getRes('ns'), 'unit': 'ns' });
    +    }
    +
    +    // detect Wade Simmons' Node microtime module
    +    if (microtimeObject && typeof (timer.ns = microtimeObject.now) == 'function') {
    +      timers.push({ 'ns': timer.ns,  'res': getRes('us'), 'unit': 'us' });
    +    }
    +
    +    // pick timer with highest resolution
    +    timer = reduce(timers, function(timer, other) {
    +      return other.res < timer.res ? other : timer;
    +    });
    +
    +    // remove unused applet
    +    if (timer.unit != 'ns' && applet) {
    +      applet = destroyElement(applet);
    +    }
    +    // error if there are no working timers
    +    if (timer.res == Infinity) {
    +      throw new Error('Benchmark.js was unable to find a working timer.');
    +    }
    +    // use API of chosen timer
    +    if (timer.unit == 'ns') {
    +      if (timer.ns.nanoTime) {
    +        extend(template, {
    +          'begin': 's$=n$.nanoTime()',
    +          'end': 'r$=(n$.nanoTime()-s$)/1e9'
    +        });
    +      } else {
    +        extend(template, {
    +          'begin': 's$=n$()',
    +          'end': 'r$=n$(s$);r$=r$[0]+(r$[1]/1e9)'
    +        });
    +      }
    +    }
    +    else if (timer.unit == 'us') {
    +      if (timer.ns.stop) {
    +        extend(template, {
    +          'begin': 's$=n$.start()',
    +          'end': 'r$=n$.microseconds()/1e6'
    +        });
    +      } else if (perfName) {
    +        extend(template, {
    +          'begin': 's$=n$.' + perfName + '()',
    +          'end': 'r$=(n$.' + perfName + '()-s$)/1e3'
    +        });
    +      } else {
    +        extend(template, {
    +          'begin': 's$=n$()',
    +          'end': 'r$=(n$()-s$)/1e6'
    +        });
    +      }
    +    }
    +
    +    // define `timer` methods
    +    timer.start = createFunction(preprocess('o$'),
    +      preprocess('var n$=this.ns,#{begin};o$.elapsed=0;o$.timeStamp=s$'));
    +
    +    timer.stop = createFunction(preprocess('o$'),
    +      preprocess('var n$=this.ns,s$=o$.timeStamp,#{end};o$.elapsed=r$'));
    +
    +    // resolve time span required to achieve a percent uncertainty of at most 1%
    +    // http://spiff.rit.edu/classes/phys273/uncert/uncert.html
    +    options.minTime || (options.minTime = max(timer.res / 2 / 0.01, 0.05));
    +    return clock.apply(null, arguments);
    +  }
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  /**
    +   * Computes stats on benchmark results.
    +   *
    +   * @private
    +   * @param {Object} bench The benchmark instance.
    +   * @param {Object} options The options object.
    +   */
    +  function compute(bench, options) {
    +    options || (options = {});
    +
    +    var async = options.async,
    +        elapsed = 0,
    +        initCount = bench.initCount,
    +        minSamples = bench.minSamples,
    +        queue = [],
    +        sample = bench.stats.sample;
    +
    +    /**
    +     * Adds a clone to the queue.
    +     */
    +    function enqueue() {
    +      queue.push(bench.clone({
    +        '_original': bench,
    +        'events': {
    +          'abort': [update],
    +          'cycle': [update],
    +          'error': [update],
    +          'start': [update]
    +        }
    +      }));
    +    }
    +
    +    /**
    +     * Updates the clone/original benchmarks to keep their data in sync.
    +     */
    +    function update(event) {
    +      var clone = this,
    +          type = event.type;
    +
    +      if (bench.running) {
    +        if (type == 'start') {
    +          // Note: `clone.minTime` prop is inited in `clock()`
    +          clone.count = bench.initCount;
    +        }
    +        else {
    +          if (type == 'error') {
    +            bench.error = clone.error;
    +          }
    +          if (type == 'abort') {
    +            bench.abort();
    +            bench.emit('cycle');
    +          } else {
    +            event.currentTarget = event.target = bench;
    +            bench.emit(event);
    +          }
    +        }
    +      } else if (bench.aborted) {
    +        // clear abort listeners to avoid triggering bench's abort/cycle again
    +        clone.events.abort.length = 0;
    +        clone.abort();
    +      }
    +    }
    +
    +    /**
    +     * Determines if more clones should be queued or if cycling should stop.
    +     */
    +    function evaluate(event) {
    +      var critical,
    +          df,
    +          mean,
    +          moe,
    +          rme,
    +          sd,
    +          sem,
    +          variance,
    +          clone = event.target,
    +          done = bench.aborted,
    +          now = +new Date,
    +          size = sample.push(clone.times.period),
    +          maxedOut = size >= minSamples && (elapsed += now - clone.times.timeStamp) / 1e3 > bench.maxTime,
    +          times = bench.times,
    +          varOf = function(sum, x) { return sum + pow(x - mean, 2); };
    +
    +      // exit early for aborted or unclockable tests
    +      if (done || clone.hz == Infinity) {
    +        maxedOut = !(size = sample.length = queue.length = 0);
    +      }
    +
    +      if (!done) {
    +        // sample mean (estimate of the population mean)
    +        mean = getMean(sample);
    +        // sample variance (estimate of the population variance)
    +        variance = reduce(sample, varOf, 0) / (size - 1) || 0;
    +        // sample standard deviation (estimate of the population standard deviation)
    +        sd = sqrt(variance);
    +        // standard error of the mean (a.k.a. the standard deviation of the sampling distribution of the sample mean)
    +        sem = sd / sqrt(size);
    +        // degrees of freedom
    +        df = size - 1;
    +        // critical value
    +        critical = tTable[Math.round(df) || 1] || tTable.infinity;
    +        // margin of error
    +        moe = sem * critical;
    +        // relative margin of error
    +        rme = (moe / mean) * 100 || 0;
    +
    +        extend(bench.stats, {
    +          'deviation': sd,
    +          'mean': mean,
    +          'moe': moe,
    +          'rme': rme,
    +          'sem': sem,
    +          'variance': variance
    +        });
    +
    +        // Abort the cycle loop when the minimum sample size has been collected
    +        // and the elapsed time exceeds the maximum time allowed per benchmark.
    +        // We don't count cycle delays toward the max time because delays may be
    +        // increased by browsers that clamp timeouts for inactive tabs.
    +        // https://developer.mozilla.org/en/window.setTimeout#Inactive_tabs
    +        if (maxedOut) {
    +          // reset the `initCount` in case the benchmark is rerun
    +          bench.initCount = initCount;
    +          bench.running = false;
    +          done = true;
    +          times.elapsed = (now - times.timeStamp) / 1e3;
    +        }
    +        if (bench.hz != Infinity) {
    +          bench.hz = 1 / mean;
    +          times.cycle = mean * bench.count;
    +          times.period = mean;
    +        }
    +      }
    +      // if time permits, increase sample size to reduce the margin of error
    +      if (queue.length < 2 && !maxedOut) {
    +        enqueue();
    +      }
    +      // abort the invoke cycle when done
    +      event.aborted = done;
    +    }
    +
    +    // init queue and begin
    +    enqueue();
    +    invoke(queue, {
    +      'name': 'run',
    +      'args': { 'async': async },
    +      'queued': true,
    +      'onCycle': evaluate,
    +      'onComplete': function() { bench.emit('complete'); }
    +    });
    +  }
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  /**
    +   * Cycles a benchmark until a run `count` can be established.
    +   *
    +   * @private
    +   * @param {Object} clone The cloned benchmark instance.
    +   * @param {Object} options The options object.
    +   */
    +  function cycle(clone, options) {
    +    options || (options = {});
    +
    +    var deferred;
    +    if (clone instanceof Deferred) {
    +      deferred = clone;
    +      clone = clone.benchmark;
    +    }
    +
    +    var clocked,
    +        cycles,
    +        divisor,
    +        event,
    +        minTime,
    +        period,
    +        async = options.async,
    +        bench = clone._original,
    +        count = clone.count,
    +        times = clone.times;
    +
    +    // continue, if not aborted between cycles
    +    if (clone.running) {
    +      // `minTime` is set to `Benchmark.options.minTime` in `clock()`
    +      cycles = ++clone.cycles;
    +      clocked = deferred ? deferred.elapsed : clock(clone);
    +      minTime = clone.minTime;
    +
    +      if (cycles > bench.cycles) {
    +        bench.cycles = cycles;
    +      }
    +      if (clone.error) {
    +        event = Event('error');
    +        event.message = clone.error;
    +        clone.emit(event);
    +        if (!event.cancelled) {
    +          clone.abort();
    +        }
    +      }
    +    }
    +
    +    // continue, if not errored
    +    if (clone.running) {
    +      // time taken to complete last test cycle
    +      bench.times.cycle = times.cycle = clocked;
    +      // seconds per operation
    +      period = bench.times.period = times.period = clocked / count;
    +      // ops per second
    +      bench.hz = clone.hz = 1 / period;
    +      // avoid working our way up to this next time
    +      bench.initCount = clone.initCount = count;
    +      // do we need to do another cycle?
    +      clone.running = clocked < minTime;
    +
    +      if (clone.running) {
    +        // tests may clock at `0` when `initCount` is a small number,
    +        // to avoid that we set its count to something a bit higher
    +        if (!clocked && (divisor = divisors[clone.cycles]) != null) {
    +          count = floor(4e6 / divisor);
    +        }
    +        // calculate how many more iterations it will take to achive the `minTime`
    +        if (count <= clone.count) {
    +          count += Math.ceil((minTime - clocked) / period);
    +        }
    +        clone.running = count != Infinity;
    +      }
    +    }
    +    // should we exit early?
    +    event = Event('cycle');
    +    clone.emit(event);
    +    if (event.aborted) {
    +      clone.abort();
    +    }
    +    // figure out what to do next
    +    if (clone.running) {
    +      // start a new cycle
    +      clone.count = count;
    +      if (deferred) {
    +        clone.compiled.call(deferred, timer);
    +      } else if (async) {
    +        delay(clone, function() { cycle(clone, options); });
    +      } else {
    +        cycle(clone);
    +      }
    +    }
    +    else {
    +      // fix TraceMonkey bug associated with clock fallbacks
    +      // http://bugzil.la/509069
    +      if (support.browser) {
    +        runScript(uid + '=1;delete ' + uid);
    +      }
    +      // done
    +      clone.emit('complete');
    +    }
    +  }
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  /**
    +   * Runs the benchmark.
    +   *
    +   * @memberOf Benchmark
    +   * @param {Object} [options={}] Options object.
    +   * @returns {Object} The benchmark instance.
    +   * @example
    +   *
    +   * // basic usage
    +   * bench.run();
    +   *
    +   * // or with options
    +   * bench.run({ 'async': true });
    +   */
    +  function run(options) {
    +    var me = this,
    +        event = Event('start');
    +
    +    // set `running` to `false` so `reset()` won't call `abort()`
    +    me.running = false;
    +    me.reset();
    +    me.running = true;
    +
    +    me.count = me.initCount;
    +    me.times.timeStamp = +new Date;
    +    me.emit(event);
    +
    +    if (!event.cancelled) {
    +      options = { 'async': ((options = options && options.async) == null ? me.async : options) && support.timeout };
    +
    +      // for clones created within `compute()`
    +      if (me._original) {
    +        if (me.defer) {
    +          Deferred(me);
    +        } else {
    +          cycle(me, options);
    +        }
    +      }
    +      // for original benchmarks
    +      else {
    +        compute(me, options);
    +      }
    +    }
    +    return me;
    +  }
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  // Firefox 1 erroneously defines variable and argument names of functions on
    +  // the function itself as non-configurable properties with `undefined` values.
    +  // The bugginess continues as the `Benchmark` constructor has an argument
    +  // named `options` and Firefox 1 will not assign a value to `Benchmark.options`,
    +  // making it non-writable in the process, unless it is the first property
    +  // assigned by for-in loop of `extend()`.
    +  extend(Benchmark, {
    +
    +    /**
    +     * The default options copied by benchmark instances.
    +     *
    +     * @static
    +     * @memberOf Benchmark
    +     * @type Object
    +     */
    +    'options': {
    +
    +      /**
    +       * A flag to indicate that benchmark cycles will execute asynchronously
    +       * by default.
    +       *
    +       * @memberOf Benchmark.options
    +       * @type Boolean
    +       */
    +      'async': false,
    +
    +      /**
    +       * A flag to indicate that the benchmark clock is deferred.
    +       *
    +       * @memberOf Benchmark.options
    +       * @type Boolean
    +       */
    +      'defer': false,
    +
    +      /**
    +       * The delay between test cycles (secs).
    +       * @memberOf Benchmark.options
    +       * @type Number
    +       */
    +      'delay': 0.005,
    +
    +      /**
    +       * Displayed by Benchmark#toString when a `name` is not available
    +       * (auto-generated if absent).
    +       *
    +       * @memberOf Benchmark.options
    +       * @type String
    +       */
    +      'id': undefined,
    +
    +      /**
    +       * The default number of times to execute a test on a benchmark's first cycle.
    +       *
    +       * @memberOf Benchmark.options
    +       * @type Number
    +       */
    +      'initCount': 1,
    +
    +      /**
    +       * The maximum time a benchmark is allowed to run before finishing (secs).
    +       * Note: Cycle delays aren't counted toward the maximum time.
    +       *
    +       * @memberOf Benchmark.options
    +       * @type Number
    +       */
    +      'maxTime': 5,
    +
    +      /**
    +       * The minimum sample size required to perform statistical analysis.
    +       *
    +       * @memberOf Benchmark.options
    +       * @type Number
    +       */
    +      'minSamples': 5,
    +
    +      /**
    +       * The time needed to reduce the percent uncertainty of measurement to 1% (secs).
    +       *
    +       * @memberOf Benchmark.options
    +       * @type Number
    +       */
    +      'minTime': 0,
    +
    +      /**
    +       * The name of the benchmark.
    +       *
    +       * @memberOf Benchmark.options
    +       * @type String
    +       */
    +      'name': undefined,
    +
    +      /**
    +       * An event listener called when the benchmark is aborted.
    +       *
    +       * @memberOf Benchmark.options
    +       * @type Function
    +       */
    +      'onAbort': undefined,
    +
    +      /**
    +       * An event listener called when the benchmark completes running.
    +       *
    +       * @memberOf Benchmark.options
    +       * @type Function
    +       */
    +      'onComplete': undefined,
    +
    +      /**
    +       * An event listener called after each run cycle.
    +       *
    +       * @memberOf Benchmark.options
    +       * @type Function
    +       */
    +      'onCycle': undefined,
    +
    +      /**
    +       * An event listener called when a test errors.
    +       *
    +       * @memberOf Benchmark.options
    +       * @type Function
    +       */
    +      'onError': undefined,
    +
    +      /**
    +       * An event listener called when the benchmark is reset.
    +       *
    +       * @memberOf Benchmark.options
    +       * @type Function
    +       */
    +      'onReset': undefined,
    +
    +      /**
    +       * An event listener called when the benchmark starts running.
    +       *
    +       * @memberOf Benchmark.options
    +       * @type Function
    +       */
    +      'onStart': undefined
    +    },
    +
    +    /**
    +     * Platform object with properties describing things like browser name,
    +     * version, and operating system.
    +     *
    +     * @static
    +     * @memberOf Benchmark
    +     * @type Object
    +     */
    +    'platform': req('platform') || window.platform || {
    +
    +      /**
    +       * The platform description.
    +       *
    +       * @memberOf Benchmark.platform
    +       * @type String
    +       */
    +      'description': window.navigator && navigator.userAgent || null,
    +
    +      /**
    +       * The name of the browser layout engine.
    +       *
    +       * @memberOf Benchmark.platform
    +       * @type String|Null
    +       */
    +      'layout': null,
    +
    +      /**
    +       * The name of the product hosting the browser.
    +       *
    +       * @memberOf Benchmark.platform
    +       * @type String|Null
    +       */
    +      'product': null,
    +
    +      /**
    +       * The name of the browser/environment.
    +       *
    +       * @memberOf Benchmark.platform
    +       * @type String|Null
    +       */
    +      'name': null,
    +
    +      /**
    +       * The name of the product's manufacturer.
    +       *
    +       * @memberOf Benchmark.platform
    +       * @type String|Null
    +       */
    +      'manufacturer': null,
    +
    +      /**
    +       * The name of the operating system.
    +       *
    +       * @memberOf Benchmark.platform
    +       * @type String|Null
    +       */
    +      'os': null,
    +
    +      /**
    +       * The alpha/beta release indicator.
    +       *
    +       * @memberOf Benchmark.platform
    +       * @type String|Null
    +       */
    +      'prerelease': null,
    +
    +      /**
    +       * The browser/environment version.
    +       *
    +       * @memberOf Benchmark.platform
    +       * @type String|Null
    +       */
    +      'version': null,
    +
    +      /**
    +       * Return platform description when the platform object is coerced to a string.
    +       *
    +       * @memberOf Benchmark.platform
    +       * @type Function
    +       * @returns {String} The platform description.
    +       */
    +      'toString': function() {
    +        return this.description || '';
    +      }
    +    },
    +
    +    /**
    +     * The semantic version number.
    +     *
    +     * @static
    +     * @memberOf Benchmark
    +     * @type String
    +     */
    +    'version': '1.0.0',
    +
    +    // an object of environment/feature detection flags
    +    'support': support,
    +
    +    // clone objects
    +    'deepClone': deepClone,
    +
    +    // iteration utility
    +    'each': each,
    +
    +    // augment objects
    +    'extend': extend,
    +
    +    // generic Array#filter
    +    'filter': filter,
    +
    +    // generic Array#forEach
    +    'forEach': forEach,
    +
    +    // generic own property iteration utility
    +    'forOwn': forOwn,
    +
    +    // converts a number to a comma-separated string
    +    'formatNumber': formatNumber,
    +
    +    // generic Object#hasOwnProperty
    +    // (trigger hasKey's lazy define before assigning it to Benchmark)
    +    'hasKey': (hasKey(Benchmark, ''), hasKey),
    +
    +    // generic Array#indexOf
    +    'indexOf': indexOf,
    +
    +    // template utility
    +    'interpolate': interpolate,
    +
    +    // invokes a method on each item in an array
    +    'invoke': invoke,
    +
    +    // generic Array#join for arrays and objects
    +    'join': join,
    +
    +    // generic Array#map
    +    'map': map,
    +
    +    // retrieves a property value from each item in an array
    +    'pluck': pluck,
    +
    +    // generic Array#reduce
    +    'reduce': reduce
    +  });
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  extend(Benchmark.prototype, {
    +
    +    /**
    +     * The number of times a test was executed.
    +     *
    +     * @memberOf Benchmark
    +     * @type Number
    +     */
    +    'count': 0,
    +
    +    /**
    +     * The number of cycles performed while benchmarking.
    +     *
    +     * @memberOf Benchmark
    +     * @type Number
    +     */
    +    'cycles': 0,
    +
    +    /**
    +     * The number of executions per second.
    +     *
    +     * @memberOf Benchmark
    +     * @type Number
    +     */
    +    'hz': 0,
    +
    +    /**
    +     * The compiled test function.
    +     *
    +     * @memberOf Benchmark
    +     * @type Function|String
    +     */
    +    'compiled': undefined,
    +
    +    /**
    +     * The error object if the test failed.
    +     *
    +     * @memberOf Benchmark
    +     * @type Object
    +     */
    +    'error': undefined,
    +
    +    /**
    +     * The test to benchmark.
    +     *
    +     * @memberOf Benchmark
    +     * @type Function|String
    +     */
    +    'fn': undefined,
    +
    +    /**
    +     * A flag to indicate if the benchmark is aborted.
    +     *
    +     * @memberOf Benchmark
    +     * @type Boolean
    +     */
    +    'aborted': false,
    +
    +    /**
    +     * A flag to indicate if the benchmark is running.
    +     *
    +     * @memberOf Benchmark
    +     * @type Boolean
    +     */
    +    'running': false,
    +
    +    /**
    +     * Compiled into the test and executed immediately **before** the test loop.
    +     *
    +     * @memberOf Benchmark
    +     * @type Function|String
    +     * @example
    +     *
    +     * // basic usage
    +     * var bench = Benchmark({
    +     *   'setup': function() {
    +     *     var c = this.count,
    +     *         element = document.getElementById('container');
    +     *     while (c--) {
    +     *       element.appendChild(document.createElement('div'));
    +     *     }
    +     *   },
    +     *   'fn': function() {
    +     *     element.removeChild(element.lastChild);
    +     *   }
    +     * });
    +     *
    +     * // compiles to something like:
    +     * var c = this.count,
    +     *     element = document.getElementById('container');
    +     * while (c--) {
    +     *   element.appendChild(document.createElement('div'));
    +     * }
    +     * var start = new Date;
    +     * while (count--) {
    +     *   element.removeChild(element.lastChild);
    +     * }
    +     * var end = new Date - start;
    +     *
    +     * // or using strings
    +     * var bench = Benchmark({
    +     *   'setup': '\
    +     *     var a = 0;\n\
    +     *     (function() {\n\
    +     *       (function() {\n\
    +     *         (function() {',
    +     *   'fn': 'a += 1;',
    +     *   'teardown': '\
    +     *          }())\n\
    +     *        }())\n\
    +     *      }())'
    +     * });
    +     *
    +     * // compiles to something like:
    +     * var a = 0;
    +     * (function() {
    +     *   (function() {
    +     *     (function() {
    +     *       var start = new Date;
    +     *       while (count--) {
    +     *         a += 1;
    +     *       }
    +     *       var end = new Date - start;
    +     *     }())
    +     *   }())
    +     * }())
    +     */
    +    'setup': noop,
    +
    +    /**
    +     * Compiled into the test and executed immediately **after** the test loop.
    +     *
    +     * @memberOf Benchmark
    +     * @type Function|String
    +     */
    +    'teardown': noop,
    +
    +    /**
    +     * An object of stats including mean, margin or error, and standard deviation.
    +     *
    +     * @memberOf Benchmark
    +     * @type Object
    +     */
    +    'stats': {
    +
    +      /**
    +       * The margin of error.
    +       *
    +       * @memberOf Benchmark#stats
    +       * @type Number
    +       */
    +      'moe': 0,
    +
    +      /**
    +       * The relative margin of error (expressed as a percentage of the mean).
    +       *
    +       * @memberOf Benchmark#stats
    +       * @type Number
    +       */
    +      'rme': 0,
    +
    +      /**
    +       * The standard error of the mean.
    +       *
    +       * @memberOf Benchmark#stats
    +       * @type Number
    +       */
    +      'sem': 0,
    +
    +      /**
    +       * The sample standard deviation.
    +       *
    +       * @memberOf Benchmark#stats
    +       * @type Number
    +       */
    +      'deviation': 0,
    +
    +      /**
    +       * The sample arithmetic mean.
    +       *
    +       * @memberOf Benchmark#stats
    +       * @type Number
    +       */
    +      'mean': 0,
    +
    +      /**
    +       * The array of sampled periods.
    +       *
    +       * @memberOf Benchmark#stats
    +       * @type Array
    +       */
    +      'sample': [],
    +
    +      /**
    +       * The sample variance.
    +       *
    +       * @memberOf Benchmark#stats
    +       * @type Number
    +       */
    +      'variance': 0
    +    },
    +
    +    /**
    +     * An object of timing data including cycle, elapsed, period, start, and stop.
    +     *
    +     * @memberOf Benchmark
    +     * @type Object
    +     */
    +    'times': {
    +
    +      /**
    +       * The time taken to complete the last cycle (secs).
    +       *
    +       * @memberOf Benchmark#times
    +       * @type Number
    +       */
    +      'cycle': 0,
    +
    +      /**
    +       * The time taken to complete the benchmark (secs).
    +       *
    +       * @memberOf Benchmark#times
    +       * @type Number
    +       */
    +      'elapsed': 0,
    +
    +      /**
    +       * The time taken to execute the test once (secs).
    +       *
    +       * @memberOf Benchmark#times
    +       * @type Number
    +       */
    +      'period': 0,
    +
    +      /**
    +       * A timestamp of when the benchmark started (ms).
    +       *
    +       * @memberOf Benchmark#times
    +       * @type Number
    +       */
    +      'timeStamp': 0
    +    },
    +
    +    // aborts benchmark (does not record times)
    +    'abort': abort,
    +
    +    // creates a new benchmark using the same test and options
    +    'clone': clone,
    +
    +    // compares benchmark's hertz with another
    +    'compare': compare,
    +
    +    // executes listeners
    +    'emit': emit,
    +
    +    // get listeners
    +    'listeners': listeners,
    +
    +    // unregister listeners
    +    'off': off,
    +
    +    // register listeners
    +    'on': on,
    +
    +    // reset benchmark properties
    +    'reset': reset,
    +
    +    // runs the benchmark
    +    'run': run,
    +
    +    // pretty print benchmark info
    +    'toString': toStringBench
    +  });
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  extend(Deferred.prototype, {
    +
    +    /**
    +     * The deferred benchmark instance.
    +     *
    +     * @memberOf Benchmark.Deferred
    +     * @type Object
    +     */
    +    'benchmark': null,
    +
    +    /**
    +     * The number of deferred cycles performed while benchmarking.
    +     *
    +     * @memberOf Benchmark.Deferred
    +     * @type Number
    +     */
    +    'cycles': 0,
    +
    +    /**
    +     * The time taken to complete the deferred benchmark (secs).
    +     *
    +     * @memberOf Benchmark.Deferred
    +     * @type Number
    +     */
    +    'elapsed': 0,
    +
    +    /**
    +     * A timestamp of when the deferred benchmark started (ms).
    +     *
    +     * @memberOf Benchmark.Deferred
    +     * @type Number
    +     */
    +    'timeStamp': 0,
    +
    +    // cycles/completes the deferred benchmark
    +    'resolve': resolve
    +  });
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  extend(Event.prototype, {
    +
    +    /**
    +     * A flag to indicate if the emitters listener iteration is aborted.
    +     *
    +     * @memberOf Benchmark.Event
    +     * @type Boolean
    +     */
    +    'aborted': false,
    +
    +    /**
    +     * A flag to indicate if the default action is cancelled.
    +     *
    +     * @memberOf Benchmark.Event
    +     * @type Boolean
    +     */
    +    'cancelled': false,
    +
    +    /**
    +     * The object whose listeners are currently being processed.
    +     *
    +     * @memberOf Benchmark.Event
    +     * @type Object
    +     */
    +    'currentTarget': undefined,
    +
    +    /**
    +     * The return value of the last executed listener.
    +     *
    +     * @memberOf Benchmark.Event
    +     * @type Mixed
    +     */
    +    'result': undefined,
    +
    +    /**
    +     * The object to which the event was originally emitted.
    +     *
    +     * @memberOf Benchmark.Event
    +     * @type Object
    +     */
    +    'target': undefined,
    +
    +    /**
    +     * A timestamp of when the event was created (ms).
    +     *
    +     * @memberOf Benchmark.Event
    +     * @type Number
    +     */
    +    'timeStamp': 0,
    +
    +    /**
    +     * The event type.
    +     *
    +     * @memberOf Benchmark.Event
    +     * @type String
    +     */
    +    'type': ''
    +  });
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  /**
    +   * The default options copied by suite instances.
    +   *
    +   * @static
    +   * @memberOf Benchmark.Suite
    +   * @type Object
    +   */
    +  Suite.options = {
    +
    +    /**
    +     * The name of the suite.
    +     *
    +     * @memberOf Benchmark.Suite.options
    +     * @type String
    +     */
    +    'name': undefined
    +  };
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  extend(Suite.prototype, {
    +
    +    /**
    +     * The number of benchmarks in the suite.
    +     *
    +     * @memberOf Benchmark.Suite
    +     * @type Number
    +     */
    +    'length': 0,
    +
    +    /**
    +     * A flag to indicate if the suite is aborted.
    +     *
    +     * @memberOf Benchmark.Suite
    +     * @type Boolean
    +     */
    +    'aborted': false,
    +
    +    /**
    +     * A flag to indicate if the suite is running.
    +     *
    +     * @memberOf Benchmark.Suite
    +     * @type Boolean
    +     */
    +    'running': false,
    +
    +    /**
    +     * An `Array#forEach` like method.
    +     * Callbacks may terminate the loop by explicitly returning `false`.
    +     *
    +     * @memberOf Benchmark.Suite
    +     * @param {Function} callback The function called per iteration.
    +     * @returns {Object} The suite iterated over.
    +     */
    +    'forEach': methodize(forEach),
    +
    +    /**
    +     * An `Array#indexOf` like method.
    +     *
    +     * @memberOf Benchmark.Suite
    +     * @param {Mixed} value The value to search for.
    +     * @returns {Number} The index of the matched value or `-1`.
    +     */
    +    'indexOf': methodize(indexOf),
    +
    +    /**
    +     * Invokes a method on all benchmarks in the suite.
    +     *
    +     * @memberOf Benchmark.Suite
    +     * @param {String|Object} name The name of the method to invoke OR options object.
    +     * @param {Mixed} [arg1, arg2, ...] Arguments to invoke the method with.
    +     * @returns {Array} A new array of values returned from each method invoked.
    +     */
    +    'invoke': methodize(invoke),
    +
    +    /**
    +     * Converts the suite of benchmarks to a string.
    +     *
    +     * @memberOf Benchmark.Suite
    +     * @param {String} [separator=','] A string to separate each element of the array.
    +     * @returns {String} The string.
    +     */
    +    'join': [].join,
    +
    +    /**
    +     * An `Array#map` like method.
    +     *
    +     * @memberOf Benchmark.Suite
    +     * @param {Function} callback The function called per iteration.
    +     * @returns {Array} A new array of values returned by the callback.
    +     */
    +    'map': methodize(map),
    +
    +    /**
    +     * Retrieves the value of a specified property from all benchmarks in the suite.
    +     *
    +     * @memberOf Benchmark.Suite
    +     * @param {String} property The property to pluck.
    +     * @returns {Array} A new array of property values.
    +     */
    +    'pluck': methodize(pluck),
    +
    +    /**
    +     * Removes the last benchmark from the suite and returns it.
    +     *
    +     * @memberOf Benchmark.Suite
    +     * @returns {Mixed} The removed benchmark.
    +     */
    +    'pop': [].pop,
    +
    +    /**
    +     * Appends benchmarks to the suite.
    +     *
    +     * @memberOf Benchmark.Suite
    +     * @returns {Number} The suite's new length.
    +     */
    +    'push': [].push,
    +
    +    /**
    +     * Sorts the benchmarks of the suite.
    +     *
    +     * @memberOf Benchmark.Suite
    +     * @param {Function} [compareFn=null] A function that defines the sort order.
    +     * @returns {Object} The sorted suite.
    +     */
    +    'sort': [].sort,
    +
    +    /**
    +     * An `Array#reduce` like method.
    +     *
    +     * @memberOf Benchmark.Suite
    +     * @param {Function} callback The function called per iteration.
    +     * @param {Mixed} accumulator Initial value of the accumulator.
    +     * @returns {Mixed} The accumulator.
    +     */
    +    'reduce': methodize(reduce),
    +
    +    // aborts all benchmarks in the suite
    +    'abort': abortSuite,
    +
    +    // adds a benchmark to the suite
    +    'add': add,
    +
    +    // creates a new suite with cloned benchmarks
    +    'clone': cloneSuite,
    +
    +    // executes listeners of a specified type
    +    'emit': emit,
    +
    +    // creates a new suite of filtered benchmarks
    +    'filter': filterSuite,
    +
    +    // get listeners
    +    'listeners': listeners,
    +
    +    // unregister listeners
    +    'off': off,
    +
    +   // register listeners
    +    'on': on,
    +
    +    // resets all benchmarks in the suite
    +    'reset': resetSuite,
    +
    +    // runs all benchmarks in the suite
    +    'run': runSuite,
    +
    +    // array methods
    +    'concat': concat,
    +
    +    'reverse': reverse,
    +
    +    'shift': shift,
    +
    +    'slice': slice,
    +
    +    'splice': splice,
    +
    +    'unshift': unshift
    +  });
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  // expose Deferred, Event and Suite
    +  extend(Benchmark, {
    +    'Deferred': Deferred,
    +    'Event': Event,
    +    'Suite': Suite
    +  });
    +
    +  // expose Benchmark
    +  // some AMD build optimizers, like r.js, check for specific condition patterns like the following:
    +  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
    +    // define as an anonymous module so, through path mapping, it can be aliased
    +    define(function() {
    +      return Benchmark;
    +    });
    +  }
    +  // check for `exports` after `define` in case a build optimizer adds an `exports` object
    +  else if (freeExports) {
    +    // in Node.js or RingoJS v0.8.0+
    +    if (typeof module == 'object' && module && module.exports == freeExports) {
    +      (module.exports = Benchmark).Benchmark = Benchmark;
    +    }
    +    // in Narwhal or RingoJS v0.7.0-
    +    else {
    +      freeExports.Benchmark = Benchmark;
    +    }
    +  }
    +  // in a browser or Rhino
    +  else {
    +    // use square bracket notation so Closure Compiler won't munge `Benchmark`
    +    // http://code.google.com/closure/compiler/docs/api-tutorial3.html#export
    +    window['Benchmark'] = Benchmark;
    +  }
    +
    +  // trigger clock's lazy define early to avoid a security error
    +  if (support.air) {
    +    clock({ '_original': { 'fn': noop, 'count': 1, 'options': {} } });
    +  }
    +}(this));
    diff --git a/cep/node_modules/benchmark/doc/README.md b/cep/node_modules/benchmark/doc/README.md
    new file mode 100644
    index 0000000..5b8960a
    --- /dev/null
    +++ b/cep/node_modules/benchmark/doc/README.md
    @@ -0,0 +1,2629 @@
    +# Benchmark.js v1.0.0
    +
    +
    +
    +
    +
    +
    +## `Benchmark`
    +* [`Benchmark`](#benchmarkname-fn--options)
    +* [`Benchmark.version`](#benchmarkversion)
    +* [`Benchmark.deepClone`](#benchmarkdeepclonevalue)
    +* [`Benchmark.each`](#benchmarkeachobject-callback-thisarg)
    +* [`Benchmark.extend`](#benchmarkextenddestination--source)
    +* [`Benchmark.filter`](#benchmarkfilterarray-callback-thisarg)
    +* [`Benchmark.forEach`](#benchmarkforeacharray-callback-thisarg)
    +* [`Benchmark.formatNumber`](#benchmarkformatnumbernumber)
    +* [`Benchmark.forOwn`](#benchmarkforownobject-callback-thisarg)
    +* [`Benchmark.hasKey`](#benchmarkhaskeyobject-key)
    +* [`Benchmark.indexOf`](#benchmarkindexofarray-value--fromindex0)
    +* [`Benchmark.interpolate`](#benchmarkinterpolatestring-object)
    +* [`Benchmark.invoke`](#benchmarkinvokebenches-name--arg1-arg2-)
    +* [`Benchmark.join`](#benchmarkjoinobject--separator1--separator2:)
    +* [`Benchmark.map`](#benchmarkmaparray-callback-thisarg)
    +* [`Benchmark.pluck`](#benchmarkpluckarray-property)
    +* [`Benchmark.reduce`](#benchmarkreducearray-callback-accumulator)
    +
    +
    +
    +
    +
    +
    +## `Benchmark.prototype`
    +* [`Benchmark.prototype.aborted`](#benchmarkprototypeaborted)
    +* [`Benchmark.prototype.compiled`](#benchmarkprototypecompiled)
    +* [`Benchmark.prototype.count`](#benchmarkprototypecount)
    +* [`Benchmark.prototype.cycles`](#benchmarkprototypecycles)
    +* [`Benchmark.prototype.fn`](#benchmarkprototypefn)
    +* [`Benchmark.prototype.hz`](#benchmarkprototypehz)
    +* [`Benchmark.prototype.running`](#benchmarkprototyperunning)
    +* [`Benchmark.prototype.setup`](#benchmarkprototypesetup)
    +* [`Benchmark.prototype.teardown`](#benchmarkprototypeteardown)
    +* [`Benchmark.prototype.abort`](#benchmarkprototypeabort)
    +* [`Benchmark.prototype.clone`](#benchmarkprototypecloneoptions)
    +* [`Benchmark.prototype.compare`](#benchmarkprototypecompareother)
    +* [`Benchmark.prototype.emit`](#benchmarkprototypeemittype)
    +* [`Benchmark.prototype.listeners`](#benchmarkprototypelistenerstype)
    +* [`Benchmark.prototype.off`](#benchmarkprototypeofftype-listener)
    +* [`Benchmark.prototype.on`](#benchmarkprototypeontype-listener)
    +* [`Benchmark.prototype.reset`](#benchmarkprototypereset)
    +* [`Benchmark.prototype.run`](#benchmarkprototyperunoptions)
    +* [`Benchmark.prototype.toString`](#benchmarkprototypetostring)
    +
    +
    +
    +
    +
    +
    +## `Benchmark.options`
    +* [`Benchmark.options`](#benchmarkoptions)
    +* [`Benchmark.options.async`](#benchmarkoptionsasync)
    +* [`Benchmark.options.defer`](#benchmarkoptionsdefer)
    +* [`Benchmark.options.delay`](#benchmarkoptionsdelay)
    +* [`Benchmark.options.id`](#benchmarkoptionsid)
    +* [`Benchmark.options.initCount`](#benchmarkoptionsinitcount)
    +* [`Benchmark.options.maxTime`](#benchmarkoptionsmaxtime)
    +* [`Benchmark.options.minSamples`](#benchmarkoptionsminsamples)
    +* [`Benchmark.options.minTime`](#benchmarkoptionsmintime)
    +* [`Benchmark.options.name`](#benchmarkoptionsname)
    +* [`Benchmark.options.onAbort`](#benchmarkoptionsonabort)
    +* [`Benchmark.options.onComplete`](#benchmarkoptionsoncomplete)
    +* [`Benchmark.options.onCycle`](#benchmarkoptionsoncycle)
    +* [`Benchmark.options.onError`](#benchmarkoptionsonerror)
    +* [`Benchmark.options.onReset`](#benchmarkoptionsonreset)
    +* [`Benchmark.options.onStart`](#benchmarkoptionsonstart)
    +
    +
    +
    +
    +
    +
    +## `Benchmark.platform`
    +* [`Benchmark.platform`](#benchmarkplatform)
    +* [`Benchmark.platform.description`](#benchmarkplatformdescription)
    +* [`Benchmark.platform.layout`](#benchmarkplatformlayout)
    +* [`Benchmark.platform.manufacturer`](#benchmarkplatformmanufacturer)
    +* [`Benchmark.platform.name`](#benchmarkplatformname)
    +* [`Benchmark.platform.os`](#benchmarkplatformos)
    +* [`Benchmark.platform.prerelease`](#benchmarkplatformprerelease)
    +* [`Benchmark.platform.product`](#benchmarkplatformproduct)
    +* [`Benchmark.platform.version`](#benchmarkplatformversion)
    +* [`Benchmark.platform.toString`](#benchmarkplatformtostring)
    +
    +
    +
    +
    +
    +
    +## `Benchmark.support`
    +* [`Benchmark.support`](#benchmarksupport)
    +* [`Benchmark.support.air`](#benchmarksupportair)
    +* [`Benchmark.support.argumentsClass`](#benchmarksupportargumentsclass)
    +* [`Benchmark.support.browser`](#benchmarksupportbrowser)
    +* [`Benchmark.support.charByIndex`](#benchmarksupportcharbyindex)
    +* [`Benchmark.support.charByOwnIndex`](#benchmarksupportcharbyownindex)
    +* [`Benchmark.support.decompilation`](#benchmarksupportdecompilation)
    +* [`Benchmark.support.descriptors`](#benchmarksupportdescriptors)
    +* [`Benchmark.support.getAllKeys`](#benchmarksupportgetallkeys)
    +* [`Benchmark.support.iteratesOwnLast`](#benchmarksupportiteratesownfirst)
    +* [`Benchmark.support.java`](#benchmarksupportjava)
    +* [`Benchmark.support.nodeClass`](#benchmarksupportnodeclass)
    +* [`Benchmark.support.timeout`](#benchmarksupporttimeout)
    +
    +
    +
    +
    +
    +
    +## `Benchmark.prototype.error`
    +* [`Benchmark.prototype.error`](#benchmarkprototypeerror)
    +
    +
    +
    +
    +
    +
    +## `Benchmark.prototype.stats`
    +* [`Benchmark.prototype.stats`](#benchmarkprototypestats)
    +* [`Benchmark.prototype.stats.deviation`](#benchmark-statsdeviation)
    +* [`Benchmark.prototype.stats.mean`](#benchmark-statsmean)
    +* [`Benchmark.prototype.stats.moe`](#benchmark-statsmoe)
    +* [`Benchmark.prototype.stats.rme`](#benchmark-statsrme)
    +* [`Benchmark.prototype.stats.sample`](#benchmark-statssample)
    +* [`Benchmark.prototype.stats.sem`](#benchmark-statssem)
    +* [`Benchmark.prototype.stats.variance`](#benchmark-statsvariance)
    +
    +
    +
    +
    +
    +
    +## `Benchmark.prototype.times`
    +* [`Benchmark.prototype.times`](#benchmarkprototypetimes)
    +* [`Benchmark.prototype.times.cycle`](#benchmark-timescycle)
    +* [`Benchmark.prototype.times.elapsed`](#benchmark-timeselapsed)
    +* [`Benchmark.prototype.times.period`](#benchmark-timesperiod)
    +* [`Benchmark.prototype.times.timeStamp`](#benchmark-timestimestamp)
    +
    +
    +
    +
    +
    +
    +## `Benchmark.Deferred`
    +* [`Benchmark.Deferred`](#benchmarkdeferredclone)
    +
    +
    +
    +
    +
    +
    +## `Benchmark.Deferred.prototype`
    +* [`Benchmark.Deferred.prototype.benchmark`](#benchmarkdeferredprototypebenchmark)
    +* [`Benchmark.Deferred.prototype.cycles`](#benchmarkdeferredprototypecycles)
    +* [`Benchmark.Deferred.prototype.elapsed`](#benchmarkdeferredprototypeelapsed)
    +* [`Benchmark.Deferred.prototype.resolve`](#benchmarkdeferredprototyperesolve)
    +* [`Benchmark.Deferred.prototype.timeStamp`](#benchmarkdeferredprototypetimestamp)
    +
    +
    +
    +
    +
    +
    +## `Benchmark.Event`
    +* [`Benchmark.Event`](#benchmarkeventtype)
    +
    +
    +
    +
    +
    +
    +## `Benchmark.Event.prototype`
    +* [`Benchmark.Event.prototype.aborted`](#benchmarkeventprototypeaborted)
    +* [`Benchmark.Event.prototype.cancelled`](#benchmarkeventprototypecancelled)
    +* [`Benchmark.Event.prototype.result`](#benchmarkeventprototyperesult)
    +* [`Benchmark.Event.prototype.timeStamp`](#benchmarkeventprototypetimestamp)
    +* [`Benchmark.Event.prototype.type`](#benchmarkeventprototypetype)
    +
    +
    +
    +
    +
    +
    +## `Benchmark.Event.prototype.currentTarget`
    +* [`Benchmark.Event.prototype.currentTarget`](#benchmarkeventprototypecurrenttarget)
    +
    +
    +
    +
    +
    +
    +## `Benchmark.Event.prototype.target`
    +* [`Benchmark.Event.prototype.target`](#benchmarkeventprototypetarget)
    +
    +
    +
    +
    +
    +
    +## `Benchmark.Suite`
    +* [`Benchmark.Suite`](#benchmarksuitename--options)
    +
    +
    +
    +
    +
    +
    +## `Benchmark.Suite.prototype`
    +* [`Benchmark.Suite.prototype.aborted`](#benchmarksuiteprototypeaborted)
    +* [`Benchmark.Suite.prototype.length`](#benchmarksuiteprototypelength)
    +* [`Benchmark.Suite.prototype.running`](#benchmarksuiteprototyperunning)
    +* [`Benchmark.Suite.prototype.abort`](#benchmarksuiteprototypeabort)
    +* [`Benchmark.Suite.prototype.add`](#benchmarksuiteprototypeaddname-fn--options)
    +* [`Benchmark.Suite.prototype.clone`](#benchmarksuiteprototypecloneoptions)
    +* [`Benchmark.Suite.prototype.emit`](#benchmarkprototypeemittype)
    +* [`Benchmark.Suite.prototype.filter`](#benchmarksuiteprototypefiltercallback)
    +* [`Benchmark.Suite.prototype.forEach`](#benchmarksuiteprototypeforeachcallback)
    +* [`Benchmark.Suite.prototype.indexOf`](#benchmarksuiteprototypeindexofvalue)
    +* [`Benchmark.Suite.prototype.invoke`](#benchmarksuiteprototypeinvokename--arg1-arg2-)
    +* [`Benchmark.Suite.prototype.join`](#benchmarksuiteprototypejoinseparator-)
    +* [`Benchmark.Suite.prototype.listeners`](#benchmarkprototypelistenerstype)
    +* [`Benchmark.Suite.prototype.map`](#benchmarksuiteprototypemapcallback)
    +* [`Benchmark.Suite.prototype.off`](#benchmarkprototypeofftype-listener)
    +* [`Benchmark.Suite.prototype.on`](#benchmarkprototypeontype-listener)
    +* [`Benchmark.Suite.prototype.pluck`](#benchmarksuiteprototypepluckproperty)
    +* [`Benchmark.Suite.prototype.pop`](#benchmarksuiteprototypepop)
    +* [`Benchmark.Suite.prototype.push`](#benchmarksuiteprototypepush)
    +* [`Benchmark.Suite.prototype.reduce`](#benchmarksuiteprototypereducecallback-accumulator)
    +* [`Benchmark.Suite.prototype.reset`](#benchmarksuiteprototypereset)
    +* [`Benchmark.Suite.prototype.reverse`](#benchmarksuiteprototypereverse)
    +* [`Benchmark.Suite.prototype.run`](#benchmarksuiteprototyperunoptions)
    +* [`Benchmark.Suite.prototype.shift`](#benchmarksuiteprototypeshift)
    +* [`Benchmark.Suite.prototype.slice`](#benchmarksuiteprototypeslicestart-end)
    +* [`Benchmark.Suite.prototype.sort`](#benchmarksuiteprototypesortcomparefnnull)
    +* [`Benchmark.Suite.prototype.splice`](#benchmarksuiteprototypesplicestart-deletecount--val1-val2-)
    +* [`Benchmark.Suite.prototype.unshift`](#benchmarksuiteprototypeunshift)
    +
    +
    +
    +
    +
    +
    +## `Benchmark.Suite.options`
    +* [`Benchmark.Suite.options`](#benchmarksuiteoptions)
    +* [`Benchmark.Suite.options.name`](#benchmarksuiteoptionsname)
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +## `Benchmark`
    +
    +
    +
    +### `Benchmark(name, fn [, options={}])`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L404 "View in source") [Ⓣ][1]
    +
    +The Benchmark constructor.
    +
    +#### Arguments
    +1. `name` *(String)*: A name to identify the benchmark.
    +2. `fn` *(Function|String)*: The test to benchmark.
    +3. `[options={}]` *(Object)*: Options object.
    +
    +#### Example
    +~~~ js
    +// basic usage (the `new` operator is optional)
    +var bench = new Benchmark(fn);
    +
    +// or using a name first
    +var bench = new Benchmark('foo', fn);
    +
    +// or with options
    +var bench = new Benchmark('foo', fn, {
    +
    +  // displayed by Benchmark#toString if `name` is not available
    +  'id': 'xyz',
    +
    +  // called when the benchmark starts running
    +  'onStart': onStart,
    +
    +  // called after each run cycle
    +  'onCycle': onCycle,
    +
    +  // called when aborted
    +  'onAbort': onAbort,
    +
    +  // called when a test errors
    +  'onError': onError,
    +
    +  // called when reset
    +  'onReset': onReset,
    +
    +  // called when the benchmark completes running
    +  'onComplete': onComplete,
    +
    +  // compiled/called before the test loop
    +  'setup': setup,
    +
    +  // compiled/called after the test loop
    +  'teardown': teardown
    +});
    +
    +// or name and options
    +var bench = new Benchmark('foo', {
    +
    +  // a flag to indicate the benchmark is deferred
    +  'defer': true,
    +
    +  // benchmark test function
    +  'fn': function(deferred) {
    +    // call resolve() when the deferred test is finished
    +    deferred.resolve();
    +  }
    +});
    +
    +// or options only
    +var bench = new Benchmark({
    +
    +  // benchmark name
    +  'name': 'foo',
    +
    +  // benchmark test as a string
    +  'fn': '[1,2,3,4].sort()'
    +});
    +
    +// a test's `this` binding is set to the benchmark instance
    +var bench = new Benchmark('foo', function() {
    +  'My name is '.concat(this.name); // My name is foo
    +});
    +~~~
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.version`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3267 "View in source") [Ⓣ][1]
    +
    +*(String)*: The semantic version number.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.deepClone(value)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L1225 "View in source") [Ⓣ][1]
    +
    +A deep clone utility.
    +
    +#### Arguments
    +1. `value` *(Mixed)*: The value to clone.
    +
    +#### Returns
    +*(Mixed)*: The cloned value.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.each(object, callback, thisArg)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L1400 "View in source") [Ⓣ][1]
    +
    +An iteration utility for arrays and objects. Callbacks may terminate the loop by explicitly returning `false`.
    +
    +#### Arguments
    +1. `object` *(Array|Object)*: The object to iterate over.
    +2. `callback` *(Function)*: The function called per iteration.
    +3. `thisArg` *(Mixed)*: The `this` binding for the callback.
    +
    +#### Returns
    +*(Array, Object)*: Returns the object iterated over.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.extend(destination [, source={}])`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L1446 "View in source") [Ⓣ][1]
    +
    +Copies enumerable properties from the source(s) object to the destination object.
    +
    +#### Arguments
    +1. `destination` *(Object)*: The destination object.
    +2. `[source={}]` *(Object)*: The source object.
    +
    +#### Returns
    +*(Object)*: The destination object.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.filter(array, callback, thisArg)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L1485 "View in source") [Ⓣ][1]
    +
    +A generic `Array#filter` like method.
    +
    +#### Arguments
    +1. `array` *(Array)*: The array to iterate over.
    +2. `callback` *(Function|String)*: The function/alias called per iteration.
    +3. `thisArg` *(Mixed)*: The `this` binding for the callback.
    +
    +#### Returns
    +*(Array)*: A new array of values that passed callback filter.
    +
    +#### Example
    +~~~ js
    +// get odd numbers
    +Benchmark.filter([1, 2, 3, 4, 5], function(n) {
    +  return n % 2;
    +}); // -> [1, 3, 5];
    +
    +// get fastest benchmarks
    +Benchmark.filter(benches, 'fastest');
    +
    +// get slowest benchmarks
    +Benchmark.filter(benches, 'slowest');
    +
    +// get benchmarks that completed without erroring
    +Benchmark.filter(benches, 'successful');
    +~~~
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.forEach(array, callback, thisArg)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L1518 "View in source") [Ⓣ][1]
    +
    +A generic `Array#forEach` like method. Callbacks may terminate the loop by explicitly returning `false`.
    +
    +#### Arguments
    +1. `array` *(Array)*: The array to iterate over.
    +2. `callback` *(Function)*: The function called per iteration.
    +3. `thisArg` *(Mixed)*: The `this` binding for the callback.
    +
    +#### Returns
    +*(Array)*: Returns the array iterated over.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.formatNumber(number)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L1557 "View in source") [Ⓣ][1]
    +
    +Converts a number to a more readable comma-separated string representation.
    +
    +#### Arguments
    +1. `number` *(Number)*: The number to convert.
    +
    +#### Returns
    +*(String)*: The more readable string representation.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.forOwn(object, callback, thisArg)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L1545 "View in source") [Ⓣ][1]
    +
    +Iterates over an object's own properties, executing the `callback` for each. Callbacks may terminate the loop by explicitly returning `false`.
    +
    +#### Arguments
    +1. `object` *(Object)*: The object to iterate over.
    +2. `callback` *(Function)*: The function executed per own property.
    +3. `thisArg` *(Mixed)*: The `this` binding for the callback.
    +
    +#### Returns
    +*(Object)*: Returns the object iterated over.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.hasKey(object, key)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L1572 "View in source") [Ⓣ][1]
    +
    +Checks if an object has the specified key as a direct property.
    +
    +#### Arguments
    +1. `object` *(Object)*: The object to check.
    +2. `key` *(String)*: The key to check for.
    +
    +#### Returns
    +*(Boolean)*: Returns `true` if key is a direct property, else `false`.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.indexOf(array, value [, fromIndex=0])`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L1608 "View in source") [Ⓣ][1]
    +
    +A generic `Array#indexOf` like method.
    +
    +#### Arguments
    +1. `array` *(Array)*: The array to iterate over.
    +2. `value` *(Mixed)*: The value to search for.
    +3. `[fromIndex=0]` *(Number)*: The index to start searching from.
    +
    +#### Returns
    +*(Number)*: The index of the matched value or `-1`.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.interpolate(string, object)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L1630 "View in source") [Ⓣ][1]
    +
    +Modify a string by replacing named tokens with matching object property values.
    +
    +#### Arguments
    +1. `string` *(String)*: The string to modify.
    +2. `object` *(Object)*: The template object.
    +
    +#### Returns
    +*(String)*: The modified string.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.invoke(benches, name [, arg1, arg2, ...])`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L1677 "View in source") [Ⓣ][1]
    +
    +Invokes a method on all items in an array.
    +
    +#### Arguments
    +1. `benches` *(Array)*: Array of benchmarks to iterate over.
    +2. `name` *(String|Object)*: The name of the method to invoke OR options object.
    +3. `[arg1, arg2, ...]` *(Mixed)*: Arguments to invoke the method with.
    +
    +#### Returns
    +*(Array)*: A new array of values returned from each method invoked.
    +
    +#### Example
    +~~~ js
    +// invoke `reset` on all benchmarks
    +Benchmark.invoke(benches, 'reset');
    +
    +// invoke `emit` with arguments
    +Benchmark.invoke(benches, 'emit', 'complete', listener);
    +
    +// invoke `run(true)`, treat benchmarks as a queue, and register invoke callbacks
    +Benchmark.invoke(benches, {
    +
    +  // invoke the `run` method
    +  'name': 'run',
    +
    +  // pass a single argument
    +  'args': true,
    +
    +  // treat as queue, removing benchmarks from front of `benches` until empty
    +  'queued': true,
    +
    +  // called before any benchmarks have been invoked.
    +  'onStart': onStart,
    +
    +  // called between invoking benchmarks
    +  'onCycle': onCycle,
    +
    +  // called after all benchmarks have been invoked.
    +  'onComplete': onComplete
    +});
    +~~~
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.join(object [, separator1=',', separator2=': '])`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L1831 "View in source") [Ⓣ][1]
    +
    +Creates a string of joined array values or object key-value pairs.
    +
    +#### Arguments
    +1. `object` *(Array|Object)*: The object to operate on.
    +2. `[separator1=',']` *(String)*: The separator used between key-value pairs.
    +3. `[separator2=': ']` *(String)*: The separator used between keys and values.
    +
    +#### Returns
    +*(String)*: The joined result.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.map(array, callback, thisArg)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L1853 "View in source") [Ⓣ][1]
    +
    +A generic `Array#map` like method.
    +
    +#### Arguments
    +1. `array` *(Array)*: The array to iterate over.
    +2. `callback` *(Function)*: The function called per iteration.
    +3. `thisArg` *(Mixed)*: The `this` binding for the callback.
    +
    +#### Returns
    +*(Array)*: A new array of values returned by the callback.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.pluck(array, property)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L1869 "View in source") [Ⓣ][1]
    +
    +Retrieves the value of a specified property from all items in an array.
    +
    +#### Arguments
    +1. `array` *(Array)*: The array to iterate over.
    +2. `property` *(String)*: The property to pluck.
    +
    +#### Returns
    +*(Array)*: A new array of property values.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.reduce(array, callback, accumulator)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L1885 "View in source") [Ⓣ][1]
    +
    +A generic `Array#reduce` like method.
    +
    +#### Arguments
    +1. `array` *(Array)*: The array to iterate over.
    +2. `callback` *(Function)*: The function called per iteration.
    +3. `accumulator` *(Mixed)*: Initial value of the accumulator.
    +
    +#### Returns
    +*(Mixed)*: The accumulator.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +## `Benchmark.prototype`
    +
    +
    +
    +### `Benchmark.prototype.aborted`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3377 "View in source") [Ⓣ][1]
    +
    +*(Boolean)*: A flag to indicate if the benchmark is aborted.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.compiled`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3353 "View in source") [Ⓣ][1]
    +
    +*(Function, String)*: The compiled test function.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.count`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3329 "View in source") [Ⓣ][1]
    +
    +*(Number)*: The number of times a test was executed.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.cycles`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3337 "View in source") [Ⓣ][1]
    +
    +*(Number)*: The number of cycles performed while benchmarking.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.fn`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3369 "View in source") [Ⓣ][1]
    +
    +*(Function, String)*: The test to benchmark.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.hz`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3345 "View in source") [Ⓣ][1]
    +
    +*(Number)*: The number of executions per second.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.running`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3385 "View in source") [Ⓣ][1]
    +
    +*(Boolean)*: A flag to indicate if the benchmark is running.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.setup`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3448 "View in source") [Ⓣ][1]
    +
    +*(Function, String)*: Compiled into the test and executed immediately **before** the test loop.
    +
    +#### Example
    +~~~ js
    +// basic usage
    +var bench = Benchmark({
    +  'setup': function() {
    +    var c = this.count,
    +        element = document.getElementById('container');
    +    while (c--) {
    +      element.appendChild(document.createElement('div'));
    +    }
    +  },
    +  'fn': function() {
    +    element.removeChild(element.lastChild);
    +  }
    +});
    +
    +// compiles to something like:
    +var c = this.count,
    +    element = document.getElementById('container');
    +while (c--) {
    +  element.appendChild(document.createElement('div'));
    +}
    +var start = new Date;
    +while (count--) {
    +  element.removeChild(element.lastChild);
    +}
    +var end = new Date - start;
    +
    +// or using strings
    +var bench = Benchmark({
    +  'setup': '\
    +    var a = 0;\n\
    +    (function() {\n\
    +      (function() {\n\
    +        (function() {',
    +  'fn': 'a += 1;',
    +  'teardown': '\
    +         }())\n\
    +       }())\n\
    +     }())'
    +});
    +
    +// compiles to something like:
    +var a = 0;
    +(function() {
    +  (function() {
    +    (function() {
    +      var start = new Date;
    +      while (count--) {
    +        a += 1;
    +      }
    +      var end = new Date - start;
    +    }())
    +  }())
    +}())
    +~~~
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.teardown`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3456 "View in source") [Ⓣ][1]
    +
    +*(Function, String)*: Compiled into the test and executed immediately **after** the test loop.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.abort()`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L2218 "View in source") [Ⓣ][1]
    +
    +Aborts the benchmark without recording times.
    +
    +#### Returns
    +*(Object)*: The benchmark instance.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.clone(options)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L2257 "View in source") [Ⓣ][1]
    +
    +Creates a new benchmark using the same test and options.
    +
    +#### Arguments
    +1. `options` *(Object)*: Options object to overwrite cloned options.
    +
    +#### Returns
    +*(Object)*: The new benchmark instance.
    +
    +#### Example
    +~~~ js
    +var bizarro = bench.clone({
    +  'name': 'doppelganger'
    +});
    +~~~
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.compare(other)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L2280 "View in source") [Ⓣ][1]
    +
    +Determines if a benchmark is faster than another.
    +
    +#### Arguments
    +1. `other` *(Object)*: The benchmark to compare.
    +
    +#### Returns
    +*(Number)*: Returns `-1` if slower, `1` if faster, and `0` if indeterminate.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.emit(type)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L2095 "View in source") [Ⓣ][1]
    +
    +Executes all registered listeners of the specified event type.
    +
    +#### Arguments
    +1. `type` *(String|Object)*: The event type or object.
    +
    +#### Returns
    +*(Mixed)*: Returns the return value of the last listener executed.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.listeners(type)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L2125 "View in source") [Ⓣ][1]
    +
    +Returns an array of event listeners for a given type that can be manipulated to add or remove listeners.
    +
    +#### Arguments
    +1. `type` *(String)*: The event type.
    +
    +#### Returns
    +*(Array)*: The listeners array.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.off([type, listener])`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L2158 "View in source") [Ⓣ][1]
    +
    +Unregisters a listener for the specified event type(s), or unregisters all listeners for the specified event type(s), or unregisters all listeners for all event types.
    +
    +#### Arguments
    +1. `[type]` *(String)*: The event type.
    +2. `[listener]` *(Function)*: The function to unregister.
    +
    +#### Returns
    +*(Object)*: The benchmark instance.
    +
    +#### Example
    +~~~ js
    +// unregister a listener for an event type
    +bench.off('cycle', listener);
    +
    +// unregister a listener for multiple event types
    +bench.off('start cycle', listener);
    +
    +// unregister all listeners for an event type
    +bench.off('cycle');
    +
    +// unregister all listeners for multiple event types
    +bench.off('start cycle complete');
    +
    +// unregister all listeners for all event types
    +bench.off();
    +~~~
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.on(type, listener)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L2197 "View in source") [Ⓣ][1]
    +
    +Registers a listener for the specified event type(s).
    +
    +#### Arguments
    +1. `type` *(String)*: The event type.
    +2. `listener` *(Function)*: The function to register.
    +
    +#### Returns
    +*(Object)*: The benchmark instance.
    +
    +#### Example
    +~~~ js
    +// register a listener for an event type
    +bench.on('cycle', listener);
    +
    +// register a listener for multiple event types
    +bench.on('start cycle', listener);
    +~~~
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.reset()`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L2334 "View in source") [Ⓣ][1]
    +
    +Reset properties and abort if running.
    +
    +#### Returns
    +*(Object)*: The benchmark instance.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.run([options={}])`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3000 "View in source") [Ⓣ][1]
    +
    +Runs the benchmark.
    +
    +#### Arguments
    +1. `[options={}]` *(Object)*: Options object.
    +
    +#### Returns
    +*(Object)*: The benchmark instance.
    +
    +#### Example
    +~~~ js
    +// basic usage
    +bench.run();
    +
    +// or with options
    +bench.run({ 'async': true });
    +~~~
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.toString()`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L2405 "View in source") [Ⓣ][1]
    +
    +Displays relevant benchmark information when coerced to a string.
    +
    +#### Returns
    +*(String)*: A string representation of the benchmark instance.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +## `Benchmark.options`
    +
    +
    +
    +### `Benchmark.options`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3049 "View in source") [Ⓣ][1]
    +
    +*(Object)*: The default options copied by benchmark instances.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.options.async`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3058 "View in source") [Ⓣ][1]
    +
    +*(Boolean)*: A flag to indicate that benchmark cycles will execute asynchronously by default.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.options.defer`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3066 "View in source") [Ⓣ][1]
    +
    +*(Boolean)*: A flag to indicate that the benchmark clock is deferred.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.options.delay`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3073 "View in source") [Ⓣ][1]
    +
    +*(Number)*: The delay between test cycles *(secs)*.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.options.id`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3082 "View in source") [Ⓣ][1]
    +
    +*(String)*: Displayed by Benchmark#toString when a `name` is not available *(auto-generated if absent)*.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.options.initCount`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3090 "View in source") [Ⓣ][1]
    +
    +*(Number)*: The default number of times to execute a test on a benchmark's first cycle.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.options.maxTime`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3099 "View in source") [Ⓣ][1]
    +
    +*(Number)*: The maximum time a benchmark is allowed to run before finishing *(secs)*. Note: Cycle delays aren't counted toward the maximum time.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.options.minSamples`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3107 "View in source") [Ⓣ][1]
    +
    +*(Number)*: The minimum sample size required to perform statistical analysis.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.options.minTime`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3115 "View in source") [Ⓣ][1]
    +
    +*(Number)*: The time needed to reduce the percent uncertainty of measurement to `1`% *(secs)*.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.options.name`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3123 "View in source") [Ⓣ][1]
    +
    +*(String)*: The name of the benchmark.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.options.onAbort`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3131 "View in source") [Ⓣ][1]
    +
    +An event listener called when the benchmark is aborted.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.options.onComplete`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3139 "View in source") [Ⓣ][1]
    +
    +An event listener called when the benchmark completes running.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.options.onCycle`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3147 "View in source") [Ⓣ][1]
    +
    +An event listener called after each run cycle.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.options.onError`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3155 "View in source") [Ⓣ][1]
    +
    +An event listener called when a test errors.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.options.onReset`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3163 "View in source") [Ⓣ][1]
    +
    +An event listener called when the benchmark is reset.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.options.onStart`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3171 "View in source") [Ⓣ][1]
    +
    +An event listener called when the benchmark starts running.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +## `Benchmark.platform`
    +
    +
    +
    +### `Benchmark.platform`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3182 "View in source") [Ⓣ][1]
    +
    +*(Object)*: Platform object with properties describing things like browser name, version, and operating system.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.platform.description`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3190 "View in source") [Ⓣ][1]
    +
    +*(String)*: The platform description.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.platform.layout`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3198 "View in source") [Ⓣ][1]
    +
    +*(String, Null)*: The name of the browser layout engine.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.platform.manufacturer`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3222 "View in source") [Ⓣ][1]
    +
    +*(String, Null)*: The name of the product's manufacturer.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.platform.name`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3214 "View in source") [Ⓣ][1]
    +
    +*(String, Null)*: The name of the browser/environment.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.platform.os`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3230 "View in source") [Ⓣ][1]
    +
    +*(String, Null)*: The name of the operating system.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.platform.prerelease`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3238 "View in source") [Ⓣ][1]
    +
    +*(String, Null)*: The alpha/beta release indicator.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.platform.product`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3206 "View in source") [Ⓣ][1]
    +
    +*(String, Null)*: The name of the product hosting the browser.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.platform.version`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3246 "View in source") [Ⓣ][1]
    +
    +*(String, Null)*: The browser/environment version.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.platform.toString()`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3255 "View in source") [Ⓣ][1]
    +
    +Return platform description when the platform object is coerced to a string.
    +
    +#### Returns
    +*(String)*: The platform description.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +## `Benchmark.support`
    +
    +
    +
    +### `Benchmark.support`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L135 "View in source") [Ⓣ][1]
    +
    +*(Object)*: An object used to flag environments/features.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.support.air`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L145 "View in source") [Ⓣ][1]
    +
    +*(Boolean)*: Detect Adobe AIR.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.support.argumentsClass`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L153 "View in source") [Ⓣ][1]
    +
    +*(Boolean)*: Detect if `arguments` objects have the correct internal [[Class]] value.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.support.browser`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L161 "View in source") [Ⓣ][1]
    +
    +*(Boolean)*: Detect if in a browser environment.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.support.charByIndex`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L169 "View in source") [Ⓣ][1]
    +
    +*(Boolean)*: Detect if strings support accessing characters by index.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.support.charByOwnIndex`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L179 "View in source") [Ⓣ][1]
    +
    +*(Boolean)*: Detect if strings have indexes as own properties.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.support.decompilation`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L207 "View in source") [Ⓣ][1]
    +
    +*(Boolean)*: Detect if functions support decompilation.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.support.descriptors`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L228 "View in source") [Ⓣ][1]
    +
    +*(Boolean)*: Detect ES5+ property descriptor API.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.support.getAllKeys`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L242 "View in source") [Ⓣ][1]
    +
    +*(Boolean)*: Detect ES5+ Object.getOwnPropertyNames().
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.support.iteratesOwnFirst`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L255 "View in source") [Ⓣ][1]
    +
    +*(Boolean)*: Detect if own properties are iterated before inherited properties *(all but IE < `9`)*.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.support.java`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L190 "View in source") [Ⓣ][1]
    +
    +*(Boolean)*: Detect if Java is enabled/exposed.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.support.nodeClass`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L272 "View in source") [Ⓣ][1]
    +
    +*(Boolean)*: Detect if a node's [[Class]] is resolvable *(all but IE < `9`)* and that the JS engine errors when attempting to coerce an object to a string without a `toString` property value of `typeof` "function".
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.support.timeout`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L198 "View in source") [Ⓣ][1]
    +
    +*(Boolean)*: Detect if the Timers API exists.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +## `Benchmark.prototype.error`
    +
    +
    +
    +### `Benchmark.prototype.error`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3361 "View in source") [Ⓣ][1]
    +
    +*(Object)*: The error object if the test failed.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +## `Benchmark.prototype.stats`
    +
    +
    +
    +### `Benchmark.prototype.stats`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3464 "View in source") [Ⓣ][1]
    +
    +*(Object)*: An object of stats including mean, margin or error, and standard deviation.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.stats.deviation`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3496 "View in source") [Ⓣ][1]
    +
    +*(Number)*: The sample standard deviation.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.stats.mean`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3504 "View in source") [Ⓣ][1]
    +
    +*(Number)*: The sample arithmetic mean.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.stats.moe`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3472 "View in source") [Ⓣ][1]
    +
    +*(Number)*: The margin of error.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.stats.rme`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3480 "View in source") [Ⓣ][1]
    +
    +*(Number)*: The relative margin of error *(expressed as a percentage of the mean)*.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.stats.sample`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3512 "View in source") [Ⓣ][1]
    +
    +*(Array)*: The array of sampled periods.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.stats.sem`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3488 "View in source") [Ⓣ][1]
    +
    +*(Number)*: The standard error of the mean.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.stats.variance`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3520 "View in source") [Ⓣ][1]
    +
    +*(Number)*: The sample variance.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +## `Benchmark.prototype.times`
    +
    +
    +
    +### `Benchmark.prototype.times`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3529 "View in source") [Ⓣ][1]
    +
    +*(Object)*: An object of timing data including cycle, elapsed, period, start, and stop.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.times.cycle`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3537 "View in source") [Ⓣ][1]
    +
    +*(Number)*: The time taken to complete the last cycle *(secs)*.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.times.elapsed`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3545 "View in source") [Ⓣ][1]
    +
    +*(Number)*: The time taken to complete the benchmark *(secs)*.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.times.period`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3553 "View in source") [Ⓣ][1]
    +
    +*(Number)*: The time taken to execute the test once *(secs)*.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.prototype.times.timeStamp`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3561 "View in source") [Ⓣ][1]
    +
    +*(Number)*: A timestamp of when the benchmark started *(ms)*.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +## `Benchmark.Deferred`
    +
    +
    +
    +### `Benchmark.Deferred(clone)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L445 "View in source") [Ⓣ][1]
    +
    +The Deferred constructor.
    +
    +#### Arguments
    +1. `clone` *(Object)*: The cloned benchmark instance.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +## `Benchmark.Deferred.prototype`
    +
    +
    +
    +### `Benchmark.Deferred.prototype.benchmark`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3605 "View in source") [Ⓣ][1]
    +
    +*(Object)*: The deferred benchmark instance.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Deferred.prototype.cycles`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3613 "View in source") [Ⓣ][1]
    +
    +*(Number)*: The number of deferred cycles performed while benchmarking.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Deferred.prototype.elapsed`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3621 "View in source") [Ⓣ][1]
    +
    +*(Number)*: The time taken to complete the deferred benchmark *(secs)*.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Deferred.prototype.resolve`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L1188 "View in source") [Ⓣ][1]
    +
    +*(Unknown)*: Handles cycling/completing the deferred benchmark.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Deferred.prototype.timeStamp`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3629 "View in source") [Ⓣ][1]
    +
    +*(Number)*: A timestamp of when the deferred benchmark started *(ms)*.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +## `Benchmark.Event`
    +
    +
    +
    +### `Benchmark.Event(type)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L461 "View in source") [Ⓣ][1]
    +
    +The Event constructor.
    +
    +#### Arguments
    +1. `type` *(String|Object)*: The event type.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +## `Benchmark.Event.prototype`
    +
    +
    +
    +### `Benchmark.Event.prototype.aborted`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3645 "View in source") [Ⓣ][1]
    +
    +*(Boolean)*: A flag to indicate if the emitters listener iteration is aborted.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Event.prototype.cancelled`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3653 "View in source") [Ⓣ][1]
    +
    +*(Boolean)*: A flag to indicate if the default action is cancelled.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Event.prototype.result`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3669 "View in source") [Ⓣ][1]
    +
    +*(Mixed)*: The return value of the last executed listener.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Event.prototype.timeStamp`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3685 "View in source") [Ⓣ][1]
    +
    +*(Number)*: A timestamp of when the event was created *(ms)*.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Event.prototype.type`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3693 "View in source") [Ⓣ][1]
    +
    +*(String)*: The event type.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +## `Benchmark.Event.prototype.currentTarget`
    +
    +
    +
    +### `Benchmark.Event.prototype.currentTarget`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3661 "View in source") [Ⓣ][1]
    +
    +*(Object)*: The object whose listeners are currently being processed.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +## `Benchmark.Event.prototype.target`
    +
    +
    +
    +### `Benchmark.Event.prototype.target`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3677 "View in source") [Ⓣ][1]
    +
    +*(Object)*: The object to which the event was originally emitted.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +## `Benchmark.Suite`
    +
    +
    +
    +### `Benchmark.Suite(name [, options={}])`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L507 "View in source") [Ⓣ][1]
    +
    +The Suite constructor.
    +
    +#### Arguments
    +1. `name` *(String)*: A name to identify the suite.
    +2. `[options={}]` *(Object)*: Options object.
    +
    +#### Example
    +~~~ js
    +// basic usage (the `new` operator is optional)
    +var suite = new Benchmark.Suite;
    +
    +// or using a name first
    +var suite = new Benchmark.Suite('foo');
    +
    +// or with options
    +var suite = new Benchmark.Suite('foo', {
    +
    +  // called when the suite starts running
    +  'onStart': onStart,
    +
    +  // called between running benchmarks
    +  'onCycle': onCycle,
    +
    +  // called when aborted
    +  'onAbort': onAbort,
    +
    +  // called when a test errors
    +  'onError': onError,
    +
    +  // called when reset
    +  'onReset': onReset,
    +
    +  // called when the suite completes running
    +  'onComplete': onComplete
    +});
    +~~~
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +## `Benchmark.Suite.prototype`
    +
    +
    +
    +### `Benchmark.Suite.prototype.aborted`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3734 "View in source") [Ⓣ][1]
    +
    +*(Boolean)*: A flag to indicate if the suite is aborted.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.length`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3726 "View in source") [Ⓣ][1]
    +
    +*(Number)*: The number of benchmarks in the suite.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.running`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3742 "View in source") [Ⓣ][1]
    +
    +*(Boolean)*: A flag to indicate if the suite is running.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.abort()`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L1902 "View in source") [Ⓣ][1]
    +
    +Aborts all benchmarks in the suite.
    +
    +#### Returns
    +*(Object)*: The suite instance.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.add(name, fn [, options={}])`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L1962 "View in source") [Ⓣ][1]
    +
    +Adds a test to the benchmark suite.
    +
    +#### Arguments
    +1. `name` *(String)*: A name to identify the benchmark.
    +2. `fn` *(Function|String)*: The test to benchmark.
    +3. `[options={}]` *(Object)*: Options object.
    +
    +#### Returns
    +*(Object)*: The benchmark instance.
    +
    +#### Example
    +~~~ js
    +// basic usage
    +suite.add(fn);
    +
    +// or using a name first
    +suite.add('foo', fn);
    +
    +// or with options
    +suite.add('foo', fn, {
    +  'onCycle': onCycle,
    +  'onComplete': onComplete
    +});
    +
    +// or name and options
    +suite.add('foo', {
    +  'fn': fn,
    +  'onCycle': onCycle,
    +  'onComplete': onComplete
    +});
    +
    +// or options only
    +suite.add({
    +  'name': 'foo',
    +  'fn': fn,
    +  'onCycle': onCycle,
    +  'onComplete': onComplete
    +});
    +~~~
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.clone(options)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L1981 "View in source") [Ⓣ][1]
    +
    +Creates a new suite with cloned benchmarks.
    +
    +#### Arguments
    +1. `options` *(Object)*: Options object to overwrite cloned options.
    +
    +#### Returns
    +*(Object)*: The new suite instance.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.emit(type)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L2095 "View in source") [Ⓣ][1]
    +
    +Executes all registered listeners of the specified event type.
    +
    +#### Arguments
    +1. `type` *(String|Object)*: The event type or object.
    +
    +#### Returns
    +*(Mixed)*: Returns the return value of the last listener executed.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.filter(callback)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L2004 "View in source") [Ⓣ][1]
    +
    +An `Array#filter` like method.
    +
    +#### Arguments
    +1. `callback` *(Function|String)*: The function/alias called per iteration.
    +
    +#### Returns
    +*(Object)*: A new suite of benchmarks that passed callback filter.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.forEach(callback)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3752 "View in source") [Ⓣ][1]
    +
    +An `Array#forEach` like method. Callbacks may terminate the loop by explicitly returning `false`.
    +
    +#### Arguments
    +1. `callback` *(Function)*: The function called per iteration.
    +
    +#### Returns
    +*(Object)*: The suite iterated over.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.indexOf(value)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3761 "View in source") [Ⓣ][1]
    +
    +An `Array#indexOf` like method.
    +
    +#### Arguments
    +1. `value` *(Mixed)*: The value to search for.
    +
    +#### Returns
    +*(Number)*: The index of the matched value or `-1`.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.invoke(name [, arg1, arg2, ...])`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3771 "View in source") [Ⓣ][1]
    +
    +Invokes a method on all benchmarks in the suite.
    +
    +#### Arguments
    +1. `name` *(String|Object)*: The name of the method to invoke OR options object.
    +2. `[arg1, arg2, ...]` *(Mixed)*: Arguments to invoke the method with.
    +
    +#### Returns
    +*(Array)*: A new array of values returned from each method invoked.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.join([separator=','])`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3780 "View in source") [Ⓣ][1]
    +
    +Converts the suite of benchmarks to a string.
    +
    +#### Arguments
    +1. `[separator=',']` *(String)*: A string to separate each element of the array.
    +
    +#### Returns
    +*(String)*: The string.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.listeners(type)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L2125 "View in source") [Ⓣ][1]
    +
    +Returns an array of event listeners for a given type that can be manipulated to add or remove listeners.
    +
    +#### Arguments
    +1. `type` *(String)*: The event type.
    +
    +#### Returns
    +*(Array)*: The listeners array.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.map(callback)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3789 "View in source") [Ⓣ][1]
    +
    +An `Array#map` like method.
    +
    +#### Arguments
    +1. `callback` *(Function)*: The function called per iteration.
    +
    +#### Returns
    +*(Array)*: A new array of values returned by the callback.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.off([type, listener])`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L2158 "View in source") [Ⓣ][1]
    +
    +Unregisters a listener for the specified event type(s), or unregisters all listeners for the specified event type(s), or unregisters all listeners for all event types.
    +
    +#### Arguments
    +1. `[type]` *(String)*: The event type.
    +2. `[listener]` *(Function)*: The function to unregister.
    +
    +#### Returns
    +*(Object)*: The benchmark instance.
    +
    +#### Example
    +~~~ js
    +// unregister a listener for an event type
    +bench.off('cycle', listener);
    +
    +// unregister a listener for multiple event types
    +bench.off('start cycle', listener);
    +
    +// unregister all listeners for an event type
    +bench.off('cycle');
    +
    +// unregister all listeners for multiple event types
    +bench.off('start cycle complete');
    +
    +// unregister all listeners for all event types
    +bench.off();
    +~~~
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.on(type, listener)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L2197 "View in source") [Ⓣ][1]
    +
    +Registers a listener for the specified event type(s).
    +
    +#### Arguments
    +1. `type` *(String)*: The event type.
    +2. `listener` *(Function)*: The function to register.
    +
    +#### Returns
    +*(Object)*: The benchmark instance.
    +
    +#### Example
    +~~~ js
    +// register a listener for an event type
    +bench.on('cycle', listener);
    +
    +// register a listener for multiple event types
    +bench.on('start cycle', listener);
    +~~~
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.pluck(property)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3798 "View in source") [Ⓣ][1]
    +
    +Retrieves the value of a specified property from all benchmarks in the suite.
    +
    +#### Arguments
    +1. `property` *(String)*: The property to pluck.
    +
    +#### Returns
    +*(Array)*: A new array of property values.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.pop()`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3806 "View in source") [Ⓣ][1]
    +
    +Removes the last benchmark from the suite and returns it.
    +
    +#### Returns
    +*(Mixed)*: The removed benchmark.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.push()`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3814 "View in source") [Ⓣ][1]
    +
    +Appends benchmarks to the suite.
    +
    +#### Returns
    +*(Number)*: The suite's new length.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.reduce(callback, accumulator)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3833 "View in source") [Ⓣ][1]
    +
    +An `Array#reduce` like method.
    +
    +#### Arguments
    +1. `callback` *(Function)*: The function called per iteration.
    +2. `accumulator` *(Mixed)*: Initial value of the accumulator.
    +
    +#### Returns
    +*(Mixed)*: The accumulator.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.reset()`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L2019 "View in source") [Ⓣ][1]
    +
    +Resets all benchmarks in the suite.
    +
    +#### Returns
    +*(Object)*: The suite instance.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.reverse()`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L638 "View in source") [Ⓣ][1]
    +
    +Rearrange the host array's elements in reverse order.
    +
    +#### Returns
    +*(Array)*: The reversed array.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.run([options={}])`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L2056 "View in source") [Ⓣ][1]
    +
    +Runs the suite.
    +
    +#### Arguments
    +1. `[options={}]` *(Object)*: Options object.
    +
    +#### Returns
    +*(Object)*: The suite instance.
    +
    +#### Example
    +~~~ js
    +// basic usage
    +suite.run();
    +
    +// or with options
    +suite.run({ 'async': true, 'queued': true });
    +~~~
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.shift()`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L671 "View in source") [Ⓣ][1]
    +
    +Removes the first element of the host array and returns it.
    +
    +#### Returns
    +*(Mixed)*: The first element of the array.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.slice(start, end)`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L684 "View in source") [Ⓣ][1]
    +
    +Creates an array of the host array's elements from the start index up to, but not including, the end index.
    +
    +#### Arguments
    +1. `start` *(Number)*: The starting index.
    +2. `end` *(Number)*: The end index.
    +
    +#### Returns
    +*(Array)*: The new array.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.sort([compareFn=null])`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3823 "View in source") [Ⓣ][1]
    +
    +Sorts the benchmarks of the suite.
    +
    +#### Arguments
    +1. `[compareFn=null]` *(Function)*: A function that defines the sort order.
    +
    +#### Returns
    +*(Object)*: The sorted suite.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.splice(start, deleteCount [, val1, val2, ...])`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L714 "View in source") [Ⓣ][1]
    +
    +Allows removing a range of elements and/or inserting elements into the host array.
    +
    +#### Arguments
    +1. `start` *(Number)*: The start index.
    +2. `deleteCount` *(Number)*: The number of elements to delete.
    +3. `[val1, val2, ...]` *(Mixed)*: values to insert at the `start` index.
    +
    +#### Returns
    +*(Array)*: An array of removed elements.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.prototype.unshift()`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L749 "View in source") [Ⓣ][1]
    +
    +Appends arguments to the host array.
    +
    +#### Returns
    +*(Number)*: The new length.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +## `Benchmark.Suite.options`
    +
    +
    +
    +### `Benchmark.Suite.options`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3705 "View in source") [Ⓣ][1]
    +
    +*(Object)*: The default options copied by suite instances.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +### `Benchmark.Suite.options.name`
    +# [Ⓢ](https://github.com/bestiejs/benchmark.js/blob/master/benchmark.js#L3713 "View in source") [Ⓣ][1]
    +
    +*(String)*: The name of the suite.
    +
    +* * *
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +  [1]: #Benchmark "Jump back to the TOC."
    \ No newline at end of file
    diff --git a/cep/node_modules/benchmark/package.json b/cep/node_modules/benchmark/package.json
    new file mode 100644
    index 0000000..3b4183c
    --- /dev/null
    +++ b/cep/node_modules/benchmark/package.json
    @@ -0,0 +1,98 @@
    +{
    +  "_args": [
    +    [
    +      {
    +        "raw": "benchmark@1.0.0",
    +        "scope": null,
    +        "escapedName": "benchmark",
    +        "name": "benchmark",
    +        "rawSpec": "1.0.0",
    +        "spec": "1.0.0",
    +        "type": "version"
    +      },
    +      "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\socket.io-adapter\\node_modules\\socket.io-parser"
    +    ]
    +  ],
    +  "_from": "benchmark@1.0.0",
    +  "_id": "benchmark@1.0.0",
    +  "_inCache": true,
    +  "_installable": true,
    +  "_location": "/benchmark",
    +  "_phantomChildren": {},
    +  "_requested": {
    +    "raw": "benchmark@1.0.0",
    +    "scope": null,
    +    "escapedName": "benchmark",
    +    "name": "benchmark",
    +    "rawSpec": "1.0.0",
    +    "spec": "1.0.0",
    +    "type": "version"
    +  },
    +  "_requiredBy": [
    +    "/socket.io-adapter/socket.io-parser",
    +    "/socket.io-parser"
    +  ],
    +  "_resolved": "https://registry.npmjs.org/benchmark/-/benchmark-1.0.0.tgz",
    +  "_shasum": "2f1e2fa4c359f11122aa183082218e957e390c73",
    +  "_shrinkwrap": null,
    +  "_spec": "benchmark@1.0.0",
    +  "_where": "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\socket.io-adapter\\node_modules\\socket.io-parser",
    +  "author": {
    +    "name": "Mathias Bynens",
    +    "email": "mathias@benchmarkjs.com",
    +    "url": "http://mathiasbynens.be/"
    +  },
    +  "bugs": {
    +    "url": "https://github.com/bestiejs/benchmark.js/issues",
    +    "email": "bugs@benchmarkjs.com"
    +  },
    +  "dependencies": {},
    +  "description": "A benchmarking library that works on nearly all JavaScript platforms, supports high-resolution timers, and returns statistically significant results.",
    +  "devDependencies": {},
    +  "directories": {
    +    "doc": "./doc",
    +    "test": "./test"
    +  },
    +  "dist": {
    +    "shasum": "2f1e2fa4c359f11122aa183082218e957e390c73",
    +    "tarball": "https://registry.npmjs.org/benchmark/-/benchmark-1.0.0.tgz"
    +  },
    +  "engines": [
    +    "node",
    +    "rhino"
    +  ],
    +  "homepage": "http://benchmarkjs.com/",
    +  "keywords": [
    +    "benchmark",
    +    "narwhal",
    +    "node",
    +    "performance",
    +    "ringo",
    +    "speed"
    +  ],
    +  "licenses": [
    +    {
    +      "type": "MIT",
    +      "url": "http://mths.be/mit"
    +    }
    +  ],
    +  "main": "benchmark",
    +  "maintainers": [
    +    {
    +      "name": "jdalton",
    +      "email": "john@fusejs.com"
    +    },
    +    {
    +      "name": "mathias",
    +      "email": "mathias@qiwi.be"
    +    }
    +  ],
    +  "name": "benchmark",
    +  "optionalDependencies": {},
    +  "readme": "ERROR: No README data found!",
    +  "repository": {
    +    "type": "git",
    +    "url": "git+https://github.com/bestiejs/benchmark.js.git"
    +  },
    +  "version": "1.0.0"
    +}
    diff --git a/cep/node_modules/benchmark/test/run-test.sh b/cep/node_modules/benchmark/test/run-test.sh
    new file mode 100644
    index 0000000..43424e4
    --- /dev/null
    +++ b/cep/node_modules/benchmark/test/run-test.sh
    @@ -0,0 +1,9 @@
    +cd "$(dirname "$0")"
    +for cmd in rhino ringo narwhal node; do
    +	echo ""
    +	echo "Testing in $cmd..."
    +	$cmd test.js
    +done
    +echo ""
    +echo "Testing in a browser..."
    +open index.html
    diff --git a/cep/node_modules/benchmark/test/test.js b/cep/node_modules/benchmark/test/test.js
    new file mode 100644
    index 0000000..d694494
    --- /dev/null
    +++ b/cep/node_modules/benchmark/test/test.js
    @@ -0,0 +1,2074 @@
    +;(function(window, undefined) {
    +  'use strict';
    +
    +  /** Use a single load function */
    +  var load = typeof require == 'function' ? require : window.load;
    +
    +  /** The `platform` object to check */
    +  var platform =
    +    window.platform ||
    +    load('../vendor/platform.js/platform.js') ||
    +    window.platform;
    +
    +  /** The unit testing framework */
    +  var QUnit =
    +    window.QUnit || (
    +      window.setTimeout || (window.addEventListener = window.setTimeout = / /),
    +      window.QUnit = load('../vendor/qunit/qunit/qunit' + (platform.name == 'Narwhal' ? '-1.8.0' : '') + '.js') || window.QUnit,
    +      load('../vendor/qunit-clib/qunit-clib.js'),
    +      (window.addEventListener || 0).test && delete window.addEventListener,
    +      window.QUnit
    +    );
    +
    +  /** The `Benchmark` constructor to test */
    +  var Benchmark =
    +    window.Benchmark || (
    +      Benchmark = load('../benchmark.js') || window.Benchmark,
    +      Benchmark.Benchmark || Benchmark
    +    );
    +
    +  /** API shortcut */
    +  var forOwn = Benchmark.forOwn;
    +
    +  /** Used to get property descriptors */
    +  var getDescriptor = Object.getOwnPropertyDescriptor;
    +
    +  /** Used to set property descriptors */
    +  var setDescriptor = Object.defineProperty;
    +
    +  /** Shortcut used to convert array-like objects to arrays */
    +  var slice = [].slice;
    +
    +  /** Used to resolve a value's internal [[Class]] */
    +  var toString = {}.toString;
    +
    +  /** Used to check problem JScript properties (a.k.a. the [[DontEnum]] bug) */
    +  var shadowed = {
    +    'constructor': 1,
    +    'hasOwnProperty': 2,
    +    'isPrototypeOf': 3,
    +    'propertyIsEnumerable': 4,
    +    'toLocaleString': 5,
    +    'toString': 6,
    +    'valueOf': 7
    +  };
    +
    +  /** Used to flag environments/features */
    +  var support = {
    +    'descriptors': !!function() {
    +      try {
    +        var o = {};
    +        return (setDescriptor(o, o, o), 'value' in getDescriptor(o, o));
    +      } catch(e) { }
    +    }()
    +  };
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  /**
    +   * Skips a given number of tests with a passing result.
    +   *
    +   * @private
    +   * @param {Number} [count=1] The number of tests to skip.
    +   */
    +  function skipTest(count) {
    +    count || (count = 1);
    +    while (count--) {
    +      ok(true, 'test skipped');
    +    }
    +  }
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  // init Benchmark.options.minTime
    +  Benchmark(function() { throw 0; }).run();
    +
    +  // set a shorter max time
    +  Benchmark.options.maxTime = Benchmark.options.minTime * 5;
    +
    +  // explicitly call `QUnit.module()` instead of `module()`
    +  // in case we are in a CLI environment
    +  QUnit.module('Benchmark');
    +
    +  (function() {
    +    test('has the default `Benchmark.platform` value', function() {
    +      if (window.document) {
    +        equal(String(Benchmark.platform), navigator.userAgent);
    +      } else {
    +        skipTest(1)
    +      }
    +    });
    +
    +    test('supports loading Benchmark.js as a module', function() {
    +      if (window.document && window.require) {
    +        equal((Benchmark2 || {}).version, Benchmark.version);
    +      } else {
    +        skipTest(1)
    +      }
    +    });
    +
    +    test('supports loading Platform.js as a module', function() {
    +      if (window.document && window.require) {
    +        var platform = (Benchmark2 || {}).platform || {};
    +        equal(typeof platform.name, 'string');
    +      } else {
    +        skipTest(1)
    +      }
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark constructor');
    +
    +  (function() {
    +    test('creates a new instance when called without the `new` operator', function() {
    +      ok(Benchmark() instanceof Benchmark);
    +    });
    +
    +    test('supports passing an options object', function() {
    +      var bench = Benchmark({ 'name': 'foo', 'fn': function() { } });
    +      ok(bench.fn && bench.name == 'foo');
    +    });
    +
    +    test('supports passing a "name" and "fn" argument', function() {
    +      var bench = Benchmark('foo', function() { });
    +      ok(bench.fn && bench.name == 'foo');
    +    });
    +
    +    test('supports passing a "name" argument and an options object', function() {
    +      var bench = Benchmark('foo', { 'fn': function() { } });
    +      ok(bench.fn && bench.name == 'foo');
    +    });
    +
    +    test('supports passing a "name" argument and an options object', function() {
    +      var bench = Benchmark('foo', function() { }, { 'id': 'bar' });
    +      ok(bench.fn && bench.name == 'foo' && bench.id == 'bar');
    +    });
    +
    +    test('supports passing an empy string for the "fn" options property', function() {
    +      var bench = Benchmark({ 'fn': '' }).run();
    +      ok(!bench.error);
    +    });
    +
    +    test('detects dead code', function() {
    +      var bench = Benchmark(function() { }).run();
    +      ok(/setup\(\)/.test(bench.compiled) ? !bench.error : bench.error);
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark compilation');
    +
    +  (function() {
    +    test('compiles using the default `Function#toString`', function() {
    +      var bench = Benchmark({
    +        'setup': function() { var a = 1; },
    +        'fn': function() { throw a; },
    +        'teardown': function() { a = 2; }
    +      }).run();
    +
    +      var compiled = bench.compiled;
    +      if (/setup\(\)/.test(compiled)) {
    +        skipTest();
    +      }
    +      else {
    +        ok(/var a\s*=\s*1/.test(compiled) && /throw a/.test(compiled) && /a\s*=\s*2/.test(compiled));
    +      }
    +    });
    +
    +    test('compiles using a custom "toString" method', function() {
    +      var bench = Benchmark({
    +        'setup': function() { },
    +        'fn': function() { },
    +        'teardown': function() { }
    +      });
    +
    +      bench.setup.toString = function() { return 'var a = 1;' };
    +      bench.fn.toString = function() { return 'throw a;' };
    +      bench.teardown.toString = function() { return 'a = 2;' };
    +      bench.run();
    +
    +      var compiled = bench.compiled;
    +      if (/setup\(\)/.test(compiled)) {
    +        skipTest();
    +      }
    +      else {
    +        ok(/var a\s*=\s*1/.test(compiled) && /throw a/.test(compiled) && /a\s*=\s*2/.test(compiled));
    +      }
    +    });
    +
    +    test('compiles using a string value', function() {
    +      var bench = Benchmark({
    +        'setup': 'var a = 1;',
    +        'fn': 'throw a;',
    +        'teardown': 'a = 2;'
    +      }).run();
    +
    +      var compiled = bench.compiled;
    +      if (/setup\(\)/.test(compiled)) {
    +        skipTest();
    +      }
    +      else {
    +        ok(/var a\s*=\s*1/.test(compiled) && /throw a/.test(compiled) && /a\s*=\s*2/.test(compiled));
    +      }
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark test binding');
    +
    +  (function() {
    +    var count = 0;
    +
    +    var tests = {
    +      'inlined "setup", "fn", and "teardown"': (
    +        'if(/ops/.test(this))this._fn=true;'
    +      ),
    +      'called "fn" and inlined "setup"/"teardown" reached by error': function() {
    +        count++;
    +        if (/ops/.test(this)) {
    +          this._fn = true;
    +        }
    +      },
    +      'called "fn" and inlined "setup"/"teardown" reached by `return` statement': function() {
    +        if (/ops/.test(this)) {
    +          this._fn = true;
    +        }
    +        return;
    +      }
    +    };
    +
    +    forOwn(tests, function(fn, title) {
    +      test('has correct binding for ' + title, function() {
    +        var bench = Benchmark({
    +          'setup': 'if(/ops/.test(this))this._setup=true;',
    +          'fn': fn,
    +          'teardown': 'if(/ops/.test(this))this._teardown=true;',
    +          'onCycle': function() { this.abort(); }
    +        }).run();
    +
    +        var compiled = bench.compiled;
    +        if (/setup\(\)/.test(compiled)) {
    +          skipTest(3);
    +        }
    +        else {
    +          ok(bench._setup, 'correct binding for "setup"');
    +          ok(bench._fn, 'correct binding for "fn"');
    +          ok(bench._teardown, 'correct binding for "teardown"');
    +        }
    +      });
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.deepClone');
    +
    +  (function() {
    +    function createCircularObject() {
    +      var result = {
    +        'foo': { 'b': { 'foo': { 'c': { } } } },
    +        'bar': { }
    +      };
    +
    +      result.foo.b.foo.c.foo = result;
    +      result.bar.b = result.foo.b;
    +      return result;
    +    }
    +
    +    function Klass() {
    +      this.a = 1;
    +    }
    +
    +    Klass.prototype = { 'b': 1 };
    +
    +    var notCloneable = {
    +      'an arguments object': arguments,
    +      'an element': window.document && document.body,
    +      'a function': Klass,
    +      'a Klass instance': new Klass
    +    };
    +
    +    var objects = {
    +      'an array': ['a', 'b', 'c', ''],
    +      'an array-like-object': { '0': 'a', '1': 'b', '2': 'c',  '3': '', 'length': 5 },
    +      'boolean': false,
    +      'boolean object': Object(false),
    +      'an object': { 'a': 0, 'b': 1, 'c': 3 },
    +      'an object with object values': { 'a': /a/, 'b': ['B'], 'c': { 'C': 1 } },
    +      'null': null,
    +      'a number': 3,
    +      'a number object': Object(3),
    +      'a regexp': /x/gim,
    +      'a string': 'x',
    +      'a string object': Object('x'),
    +      'undefined': undefined
    +    };
    +
    +    objects['an array'].length = 5;
    +
    +    forOwn(objects, function(object, key) {
    +      test('clones ' + key + ' correctly', function() {
    +        var kind = toString.call(object),
    +            clone = Benchmark.deepClone(object);
    +
    +        if (object == null) {
    +          equal(clone, object);
    +        } else {
    +          deepEqual(clone.valueOf(), object.valueOf());
    +        }
    +        if (object === Object(object)) {
    +          ok(clone !== object);
    +        } else {
    +          skipTest();
    +        }
    +      });
    +    });
    +
    +    forOwn(notCloneable, function(object, key) {
    +      test('does not clone ' + key, function() {
    +        ok(Benchmark.deepClone(object) === object);
    +      });
    +    });
    +
    +    test('clones using Klass#deepClone', function() {
    +      var object = new Klass;
    +      Klass.prototype.deepClone = function() { return new Klass; };
    +
    +      var clone = Benchmark.deepClone(object);
    +      ok(clone !== object && clone instanceof Klass);
    +
    +      delete Klass.prototype.clone;
    +    });
    +
    +    test('clones problem JScript properties', function() {
    +      var clone = Benchmark.deepClone(shadowed);
    +      deepEqual(clone, shadowed);
    +    });
    +
    +    test('clones string object with custom property', function() {
    +      var object = new String('x');
    +      object.x = 1;
    +
    +      var clone = Benchmark.deepClone(object);
    +      ok(clone == 'x' && typeof clone == 'object' && clone.x === 1 && toString.call(clone) == '[object String]');
    +    });
    +
    +    test('clones objects with circular references', function() {
    +      var object = createCircularObject(),
    +          clone = Benchmark.deepClone(object);
    +
    +      ok(clone.bar.b === clone.foo.b && clone === clone.foo.b.foo.c.foo && clone !== object);
    +    });
    +
    +    test('clones non-extensible objects with circular references', function() {
    +      if (Object.preventExtensions) {
    +        var object = Object.preventExtensions(createCircularObject());
    +        Object.preventExtensions(object.bar.b);
    +
    +        var clone = Benchmark.deepClone(object);
    +        ok(clone.bar.b === clone.foo.b && clone === clone.foo.b.foo.c.foo && clone !== object);
    +      } else {
    +        skipTest(1)
    +      }
    +    });
    +
    +    test('clones sealed objects with circular references', function() {
    +      if (Object.seal) {
    +        var object = Object.seal(createCircularObject());
    +        Object.seal(object.bar.b);
    +
    +        var clone = Benchmark.deepClone(object);
    +        ok(clone.bar.b === clone.foo.b && clone === clone.foo.b.foo.c.foo && clone !== object);
    +      } else {
    +        skipTest(1)
    +      }
    +    });
    +
    +    test('clones frozen objects with circular references', function() {
    +      if (Object.freeze) {
    +        var object = Object.freeze(createCircularObject());
    +        Object.freeze(object.bar.b);
    +
    +        var clone = Benchmark.deepClone(object);
    +        ok(clone.bar.b === clone.foo.b && clone === clone.foo.b.foo.c.foo && clone !== object);
    +      } else {
    +        skipTest(1)
    +      }
    +    });
    +
    +    test('clones objects with custom descriptors and circular references', function() {
    +      var accessor,
    +          descriptor;
    +
    +      if (support.descriptors) {
    +        var object = setDescriptor({}, 'foo', {
    +          'configurable': true,
    +          'value': setDescriptor({}, 'b', {
    +            'writable': true,
    +            'value': setDescriptor({}, 'foo', {
    +              'get': function() { return accessor; },
    +              'set': function(value) { accessor = value; }
    +            })
    +          })
    +        });
    +
    +        setDescriptor(object, 'bar', { 'value': {} });
    +        object.foo.b.foo = { 'c': object };
    +        object.bar.b = object.foo.b;
    +
    +        var clone = Benchmark.deepClone(object);
    +        ok(clone !== object &&
    +          clone.bar.b === clone.foo.b &&
    +          clone !== clone.foo.b.foo.c.foo &&
    +          (descriptor = getDescriptor(clone, 'foo')) &&
    +          descriptor.configurable && !(descriptor.enumerable && descriptor.writable) &&
    +          (descriptor = getDescriptor(clone.foo, 'b')) &&
    +          descriptor.writable && !(descriptor.configurable && descriptor.enumerable) &&
    +          (descriptor = getDescriptor(clone.foo.b, 'foo')) &&
    +          descriptor.get && descriptor.set &&
    +          (descriptor = getDescriptor(clone.foo.b, 'foo')) &&
    +          !(descriptor.configurable && descriptor.enumerable && descriptor.writable) &&
    +          (descriptor = getDescriptor(clone, 'bar')) &&
    +          !(descriptor.configurable && descriptor.enumerable && descriptor.writable));
    +      }
    +      else {
    +        skipTest(1)
    +      }
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.each');
    +
    +  (function() {
    +    var xpathResult;
    +
    +    var objects = {
    +      'array': ['a', 'b', 'c', ''],
    +      'array-like-object': { '0': 'a', '1': 'b', '2': 'c',  '3': '', 'length': 5 },
    +      'xpath snapshot': null
    +    };
    +
    +    if (window.document && document.evaluate) {
    +      xpathResult = [document.documentElement, document.getElementsByTagName('head')[0], document.body];
    +      objects['xpath snapshot'] = document.evaluate('//*[self::html or self::head or self::body]', document, null, 7, null);
    +    }
    +
    +    objects.array.length = 5;
    +
    +    forOwn(objects, function(object, key) {
    +      test('passes the correct arguments when passing an ' + key, function() {
    +        if (object) {
    +          var args
    +          Benchmark.each(object, function() {
    +            args || (args = slice.call(arguments));
    +          });
    +
    +          if (key == 'xpath snapshot') {
    +            ok(args[0] === xpathResult[0]);
    +          } else {
    +            equal(args[0], 'a');
    +          }
    +          equal(args[1], 0);
    +          ok(args[2] === object);
    +        }
    +        else {
    +          skipTest(3);
    +        }
    +      });
    +
    +      test('returns the passed object when passing an ' + key, function() {
    +        if (object) {
    +          var actual = Benchmark.each(object, function() { });
    +          ok(actual === object);
    +        }
    +        else {
    +          skipTest();
    +        }
    +      });
    +
    +      test('iterates over all indexes when passing an ' + key, function() {
    +        if (object) {
    +          var values = [];
    +          Benchmark.each(object, function(value) {
    +            values.push(value);
    +          });
    +
    +          deepEqual(values, key == 'xpath snapshot' ? xpathResult : ['a', 'b', 'c', '']);
    +        }
    +        else {
    +          skipTest();
    +        }
    +      });
    +
    +      test('exits early when returning `false` when passing an ' + key, function() {
    +        if (object) {
    +          var values = [];
    +          Benchmark.each(object, function(value) {
    +            values.push(value);
    +            return values.length < 2;
    +          });
    +
    +          deepEqual(values, key == 'xpath snapshot' ? xpathResult.slice(0, 2) : ['a', 'b']);
    +        }
    +        else {
    +          skipTest();
    +        }
    +      });
    +    });
    +
    +    test('passes the third callback argument as an object', function() {
    +      var thirdArg;
    +      Benchmark.each('hello', function(value, index, object) {
    +        thirdArg = object;
    +      });
    +
    +      ok(thirdArg && typeof thirdArg == 'object');
    +    });
    +
    +    test('iterates over strings by index', function() {
    +      var values = [];
    +      Benchmark.each('hello', function(value) {
    +        values.push(value)
    +      });
    +
    +      deepEqual(values, ['h', 'e', 'l', 'l', 'o']);
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.extend');
    +
    +  (function() {
    +    test('allows no source argument', function() {
    +      var object = {};
    +      equal(Benchmark.extend(object), object);
    +    });
    +
    +    test('allows a single source argument', function() {
    +      var source = { 'x': 1, 'y': 1 },
    +          actual = Benchmark.extend({}, source);
    +
    +      deepEqual(Benchmark.extend({}, source), { 'x': 1, 'y': 1 });
    +    });
    +
    +    test('allows multiple source arguments', function() {
    +      var source1 = { 'x': 1, 'y': 1 },
    +          source2 = { 'y': 2, 'z': 2 },
    +          actual = Benchmark.extend({}, source1, source2);
    +
    +      deepEqual(actual, { 'x': 1, 'y': 2, 'z': 2 });
    +    });
    +
    +    test('will add inherited source properties', function() {
    +      function Source() { }
    +      Source.prototype.x = 1;
    +      deepEqual(Benchmark.extend({}, new Source), { 'x': 1 });
    +    });
    +
    +    test('will add problem JScript properties', function() {
    +      deepEqual(Benchmark.extend({}, shadowed), shadowed);
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.filter');
    +
    +  (function() {
    +    var objects = {
    +      'array': ['a', 'b', 'c', ''],
    +      'array-like-object': { '0': 'a', '1': 'b', '2': 'c',  '3': '', 'length': 5 }
    +    };
    +
    +    objects.array.length = 5;
    +
    +    forOwn(objects, function(object, key) {
    +      test('passes the correct arguments when passing an ' + key, function() {
    +        var args;
    +        Benchmark.filter(object, function() {
    +          args || (args = slice.call(arguments));
    +        });
    +
    +        deepEqual(args, ['a', 0, object]);
    +      });
    +
    +      test('produces the correct result when passing an ' + key, function() {
    +        var actual = Benchmark.filter(object, function(value, index) {
    +          return index > 0;
    +        });
    +
    +        deepEqual(actual, ['b', 'c', '']);
    +      });
    +
    +      test('iterates over sparse ' + key + 's correctly', function() {
    +        var actual = Benchmark.filter(object, function(value) {
    +          return value === undefined;
    +        });
    +
    +        deepEqual(actual, []);
    +      });
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.forOwn');
    +
    +  (function() {
    +    function fn() {
    +      // no-op
    +    }
    +
    +    function KlassA() {
    +      this.a = 1;
    +      this.b = 2;
    +      this.c = 3;
    +    }
    +
    +    function KlassB() {
    +      this.a = 1;
    +      this.constructor = 2;
    +      this.hasOwnProperty = 3;
    +      this.isPrototypeOf = 4;
    +      this.propertyIsEnumerable = 5;
    +      this.toLocaleString = 6;
    +      this.toString = 7;
    +      this.valueOf = 8;
    +    }
    +
    +    function KlassC() {
    +      // no-op
    +    }
    +
    +    fn.a = 1;
    +    fn.b = 2;
    +    fn.c = 3;
    +
    +    KlassC.prototype.a = 1;
    +    KlassC.prototype.b = 2;
    +    KlassC.prototype.c = 3;
    +
    +    var objects = {
    +      'an arguments object': arguments,
    +      'a function': fn,
    +      'an object': new KlassA,
    +      'an object shadowing properties on Object.prototype': new KlassB,
    +      'a prototype object': KlassC.prototype,
    +      'a string': 'abc'
    +    };
    +
    +    forOwn(objects, function(object, key) {
    +      test('passes the correct arguments when passing ' + key, function() {
    +        var args;
    +        Benchmark.forOwn(object, function() {
    +          args || (args = slice.call(arguments));
    +        });
    +
    +        equal(typeof args[0], key == 'a string' ? 'string' : 'number');
    +        equal(typeof args[1], 'string');
    +        equal(args[2] && typeof args[2], key == 'a function' ? 'function' : 'object');
    +      });
    +
    +      test('returns the passed object when passing ' + key, function() {
    +        var actual = Benchmark.forOwn(object, function() { });
    +        deepEqual(actual, object);
    +      });
    +
    +      test('iterates over own properties when passing ' + key, function() {
    +        var values = [];
    +        Benchmark.forOwn(object, function(value) {
    +          values.push(value);
    +        });
    +
    +        if (object instanceof KlassB) {
    +          deepEqual(values.sort(), [1, 2, 3, 4, 5, 6, 7, 8]);
    +        } else if (key == 'a string') {
    +          deepEqual(values, ['a', 'b', 'c']);
    +        } else {
    +          deepEqual(values.sort(), [1, 2, 3]);
    +        }
    +      });
    +
    +      test('exits early when returning `false` when passing ' + key, function() {
    +        var values = [];
    +        Benchmark.forOwn(object, function(value) {
    +          values.push(value);
    +          return false;
    +        });
    +
    +        equal(values.length, 1);
    +      });
    +
    +      if (object instanceof KlassB) {
    +        test('exits correctly when transitioning to the JScript [[DontEnum]] fix', function() {
    +          var values = [];
    +          Benchmark.forOwn(object, function(value) {
    +            values.push(value);
    +            return values.length < 2;
    +          });
    +
    +          equal(values.length, 2);
    +        });
    +      }
    +    });
    +  }(1, 2, 3));
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.formatNumber');
    +
    +  (function() {
    +    test('formats a million correctly', function() {
    +      equal(Benchmark.formatNumber(1e6), '1,000,000');
    +    });
    +
    +    test('formats less than 100 correctly', function() {
    +      equal(Benchmark.formatNumber(23), '23');
    +    });
    +
    +    test('formats numbers with decimal values correctly', function() {
    +      equal(Benchmark.formatNumber(1234.56), '1,234.56');
    +    });
    +
    +    test('formats negative numbers correctly', function() {
    +      equal(Benchmark.formatNumber(-1234.56), '-1,234.56');
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.hasKey');
    +
    +  (function() {
    +    test('returns `true` for own properties', function() {
    +      var object = { 'x': 1 };
    +      equal(Benchmark.hasKey(object, 'x'), true);
    +    });
    +
    +    test('returns `false` for inherited properties', function() {
    +      equal(Benchmark.hasKey({}, 'toString'), false);
    +    });
    +
    +    test('doesn\'t use an object\'s `hasOwnProperty` method', function() {
    +      var object = { 'hasOwnProperty': function() { return true; } };
    +      equal(Benchmark.hasKey(object, 'x'), false);
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.indexOf');
    +
    +  (function() {
    +    var objects = {
    +      'array': ['a', 'b', 'c', ''],
    +      'array-like-object': { '0': 'a', '1': 'b', '2': 'c',  '3': '', 'length': 5 }
    +    };
    +
    +    objects.array.length = 5;
    +
    +    forOwn(objects, function(object, key) {
    +      test('produces the correct result when passing an ' + key, function() {
    +        equal(Benchmark.indexOf(object, 'b'), 1);
    +      });
    +
    +      test('matches values by strict equality when passing an ' + key, function() {
    +        equal(Benchmark.indexOf(object, new String('b')), -1);
    +      });
    +
    +      test('iterates over sparse ' + key + 's correctly', function() {
    +        equal(Benchmark.indexOf(object, undefined), -1);
    +      });
    +    });
    +
    +    test('searches from the given `fromIndex`', function() {
    +      var array = ['a', 'b', 'c', 'a'];
    +      equal(Benchmark.indexOf(array, 'a', 1), 3);
    +    });
    +
    +    test('handles extreme negative `fromIndex` values correctly', function() {
    +      var array = ['a'];
    +      array['-1'] = 'z';
    +      equal(Benchmark.indexOf(array, 'z', -2), -1);
    +    });
    +
    +    test('handles extreme positive `fromIndex` values correctly', function() {
    +      var object = { '0': 'a', '1': 'b', '2': 'c', 'length': 2 };
    +      equal(Benchmark.indexOf(object, 'c', 2), -1);
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.interpolate');
    +
    +  (function() {
    +    test('replaces tokens correctly', function() {
    +      var actual = Benchmark.interpolate('#{greeting} #{location}.', {
    +        'greeting': 'Hello',
    +        'location': 'world'
    +      });
    +
    +      equal(actual, 'Hello world.');
    +    });
    +
    +    test('ignores inherited object properties', function() {
    +      var actual = Benchmark.interpolate('x#{toString}', {});
    +      equal(actual, 'x#{toString}');
    +    });
    +
    +    test('allows for no template object', function() {
    +      var actual = Benchmark.interpolate('x');
    +      equal(actual, 'x');
    +    });
    +
    +    test('replaces duplicate tokens', function() {
    +      var actual = Benchmark.interpolate('#{x}#{x}#{x}', { 'x': 'a' });
    +      equal(actual, 'aaa');
    +    });
    +
    +    test('handles keys containing RegExp special characters', function() {
    +      var actual = Benchmark.interpolate('#{.*+?^=!:${}()|[]\\/}', { '.*+?^=!:${}()|[]\\/': 'x' });
    +      equal(actual, 'x');
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.invoke');
    +
    +  (function() {
    +    var objects = {
    +      'array': ['a', ['b'], 'c', null],
    +      'array-like-object': { '0': 'a', '1': ['b'], '2': 'c',  '3': null, 'length': 5 }
    +    };
    +
    +    objects.array.length = 5;
    +
    +    forOwn(objects, function(object, key) {
    +      test('produces the correct result when passing an ' + key, function() {
    +        var actual = Benchmark.invoke(object, 'concat');
    +        deepEqual(actual, ['a', ['b'], 'c', undefined, undefined]);
    +        equal('4' in actual, false);
    +      });
    +
    +      test('passes the correct arguments to the invoked method when passing an ' + key, function() {
    +        var actual = Benchmark.invoke(object, 'concat', 'x', 'y', 'z');
    +        deepEqual(actual, ['axyz', ['b', 'x', 'y', 'z'], 'cxyz', undefined, undefined]);
    +        equal('4' in actual, false);
    +      });
    +
    +      test('handles options object with callbacks correctly when passing an ' + key, function() {
    +        function callback() {
    +          callbacks.push(slice.call(arguments));
    +        }
    +
    +        var callbacks = [];
    +        var actual = Benchmark.invoke(object, {
    +          'name': 'concat',
    +          'args': ['x', 'y', 'z'],
    +          'onStart': callback,
    +          'onCycle': callback,
    +          'onComplete': callback
    +        });
    +
    +        deepEqual(actual, ['axyz', ['b', 'x', 'y', 'z'], 'cxyz', undefined, undefined]);
    +        equal('4' in actual, false);
    +
    +        equal(callbacks[0].length, 1);
    +        equal(callbacks[0][0].target, 'a');
    +        deepEqual(callbacks[0][0].currentTarget, object);
    +        equal(callbacks[0][0].type, 'start');
    +        equal(callbacks[1][0].type, 'cycle');
    +        equal(callbacks[5][0].type, 'complete');
    +      });
    +
    +      test('supports queuing when passing an ' + key, function() {
    +        var lengths = [];
    +        var actual = Benchmark.invoke(object, {
    +          'name': 'concat',
    +          'queued': true,
    +          'args': 'x',
    +          'onCycle': function() {
    +            lengths.push(object.length);
    +          }
    +        });
    +
    +        deepEqual(lengths, [5, 4, 3, 2]);
    +        deepEqual(actual, ['ax', ['b', 'x'], 'cx', undefined, undefined]);
    +      });
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.join');
    +
    +  (function() {
    +    var objects = {
    +      'array': ['a', 'b', ''],
    +      'array-like-object': { '0': 'a', '1': 'b', '2': '', 'length': 4 },
    +      'object': { 'a': '0', 'b': '1', '': '2' }
    +    };
    +
    +    objects.array.length = 4;
    +
    +    forOwn(objects, function(object, key) {
    +      test('joins correctly using the default separator when passing an ' + key, function() {
    +        equal(Benchmark.join(object), key == 'object' ? 'a: 0,b: 1,: 2' : 'a,b,');
    +      });
    +
    +      test('joins correctly using a custom separator when passing an ' + key, function() {
    +        equal(Benchmark.join(object, '+', '@'), key == 'object' ? 'a@0+b@1+@2' :  'a+b+');
    +      });
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.map');
    +
    +  (function() {
    +    var objects = {
    +      'array': ['a', 'b', 'c', ''],
    +      'array-like-object': { '0': 'a', '1': 'b', '2': 'c',  '3': '', 'length': 5 }
    +    };
    +
    +    objects.array.length = 5;
    +
    +    forOwn(objects, function(object, key) {
    +      test('passes the correct arguments when passing an ' + key, function() {
    +        var args;
    +        Benchmark.map(object, function() {
    +          args || (args = slice.call(arguments));
    +        });
    +
    +        deepEqual(args, ['a', 0, object]);
    +      });
    +
    +      test('produces the correct result when passing an ' + key, function() {
    +        var actual = Benchmark.map(object, function(value, index) {
    +          return value + index;
    +        });
    +
    +        deepEqual(actual, ['a0', 'b1', 'c2', '3', undefined]);
    +        equal('4' in actual, false);
    +      });
    +
    +      test('produces an array of the correct length for sparse ' + key + 's', function() {
    +        equal(Benchmark.map(object, function() { }).length, 5);
    +      });
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.pluck');
    +
    +  (function() {
    +    var objects = {
    +      'array': [{ '_': 'a' }, { '_': 'b' }, { '_': 'c' }, null],
    +      'array-like-object': { '0': { '_': 'a' }, '1': { '_': 'b' }, '2': { '_': 'c' },  '3': null, 'length': 5 }
    +    };
    +
    +    objects.array.length = 5;
    +
    +    forOwn(objects, function(object, key) {
    +      test('produces the correct result when passing an ' + key, function() {
    +        var actual = Benchmark.pluck(object, '_');
    +        deepEqual(actual, ['a', 'b', 'c', undefined, undefined]);
    +        equal('4' in actual, false);
    +      });
    +
    +      test('produces the correct result for non-existent keys when passing an ' + key, function() {
    +        var actual = Benchmark.pluck(object, 'non-existent');
    +        deepEqual(actual, [undefined, undefined, undefined, undefined, undefined]);
    +        equal('4' in actual, false);
    +      });
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.reduce');
    +
    +  (function() {
    +    var objects = {
    +      'array': ['b', 'c', ''],
    +      'array-like-object': { '0': 'b', '1': 'c',  '2': '', 'length': 4 }
    +    };
    +
    +    objects.array.length = 4;
    +
    +    forOwn(objects, function(object, key) {
    +      test('passes the correct arguments when passing an ' + key, function() {
    +        var args;
    +        Benchmark.reduce(object, function() {
    +          args || (args = slice.call(arguments));
    +        }, 'a');
    +
    +        deepEqual(args, ['a', 'b', 0, object]);
    +      });
    +
    +      test('accumulates correctly when passing an ' + key, function() {
    +        var actual = Benchmark.reduce(object, function(string, value) {
    +          return string + value;
    +        }, 'a');
    +
    +        equal(actual, 'abc');
    +      });
    +
    +      test('handles arguments with no initial value correctly when passing an ' + key, function() {
    +        var args;
    +        Benchmark.reduce(object, function() {
    +          args || (args = slice.call(arguments));
    +        });
    +
    +        deepEqual(args, ['b', 'c', 1, object]);
    +      });
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark#clone');
    +
    +  (function() {
    +    var bench = Benchmark(function() { this.count += 0; }).run();
    +
    +    test('produces the correct result passing no arguments', function() {
    +      var clone = bench.clone();
    +      deepEqual(clone, bench);
    +      ok(clone.stats != bench.stats && clone.times != bench.times && clone.options != bench.options);
    +    });
    +
    +    test('produces the correct result passing a data object', function() {
    +      var clone = bench.clone({ 'fn': '', 'name': 'foo' });
    +      ok(clone.fn === '' && clone.options.fn === '');
    +      ok(clone.name == 'foo' && clone.options.name == 'foo');
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark#run');
    +
    +  (function() {
    +    var data = { 'onComplete': 0, 'onCycle': 0, 'onStart': 0 };
    +
    +    var bench = Benchmark({
    +      'fn': function() {
    +        this.count += 0;
    +      },
    +      'onStart': function() {
    +        data.onStart++;
    +      },
    +      'onComplete': function() {
    +        data.onComplete++;
    +      }
    +    })
    +    .run();
    +
    +    test('onXYZ callbacks should not be triggered by internal benchmark clones', function() {
    +      equal(data.onStart, 1);
    +      equal(data.onComplete, 1);
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  forOwn({
    +    'Benchmark': Benchmark,
    +    'Benchmark.Suite': Benchmark.Suite
    +  },
    +  function(Constructor, namespace) {
    +
    +    QUnit.module(namespace + '#emit');
    +
    +    (function() {
    +      test('emits passed arguments', function() {
    +        var args,
    +            object = Constructor();
    +
    +        object.on('args', function() { args = slice.call(arguments, 1); });
    +        object.emit('args', 'a', 'b', 'c');
    +        deepEqual(args, ['a', 'b', 'c']);
    +      });
    +
    +      test('emits with no listeners', function() {
    +        var event = Benchmark.Event('empty'),
    +            object = Constructor();
    +
    +        object.emit(event);
    +        equal(event.cancelled, false);
    +      });
    +
    +      test('emits with an event type of "toString"', function() {
    +        var event = Benchmark.Event('toString'),
    +            object = Constructor();
    +
    +        object.emit(event);
    +        equal(event.cancelled, false);
    +      });
    +
    +      test('returns the last listeners returned value', function() {
    +        var event = Benchmark.Event('result'),
    +            object = Constructor();
    +
    +        object.on('result', function() { return 'x'; });
    +        object.on('result', function() { return 'y'; });
    +        equal(object.emit(event), 'y');
    +      });
    +
    +      test('aborts the emitters listener iteration when `event.aborted` is `true`', function() {
    +        var event = Benchmark.Event('aborted'),
    +            object = Constructor();
    +
    +        object.on('aborted', function(event) {
    +          event.aborted = true;
    +          return false;
    +        });
    +
    +        object.on('aborted', function(event) {
    +          // should not get here
    +          event.aborted = false;
    +          return true;
    +        });
    +
    +        equal(object.emit(event), false);
    +        equal(event.aborted, true);
    +      });
    +
    +      test('cancels the event if a listener explicitly returns `false`', function() {
    +        var event = Benchmark.Event('cancel'),
    +            object = Constructor();
    +
    +        object.on('cancel', function() { return false; });
    +        object.on('cancel', function() { return true; });
    +        object.emit(event);
    +        equal(event.cancelled, true);
    +      });
    +
    +      test('uses a shallow clone of the listeners when emitting', function() {
    +        var event,
    +            listener2 = function(eventObject) { eventObject.listener2 = true },
    +            object = Constructor();
    +
    +        object.on('shallowclone', function(eventObject) {
    +          event = eventObject;
    +          object.off(event.type, listener2);
    +        })
    +        .on('shallowclone', listener2)
    +        .emit('shallowclone');
    +
    +        ok(event.listener2);
    +      });
    +
    +      test('emits a custom event object', function() {
    +        var event = Benchmark.Event('custom'),
    +            object = Constructor();
    +
    +        object.on('custom', function(eventObject) { eventObject.touched = true; });
    +        object.emit(event);
    +        ok(event.touched);
    +      });
    +
    +      test('sets `event.result` correctly', function() {
    +        var event = Benchmark.Event('result'),
    +            object = Constructor();
    +
    +        object.on('result', function() { return 'x'; });
    +        object.emit(event);
    +        equal(event.result, 'x');
    +      });
    +
    +      test('sets `event.type` correctly', function() {
    +        var event,
    +            object = Constructor();
    +
    +        object.on('type', function(eventObj) {
    +          event = eventObj;
    +        });
    +
    +        object.emit('type');
    +        equal(event.type, 'type');
    +      });
    +    }());
    +
    +    /*------------------------------------------------------------------------*/
    +
    +    QUnit.module(namespace + '#listeners');
    +
    +    (function() {
    +      test('returns the correct listeners', function() {
    +        var listener = function() { },
    +            object = Constructor();
    +
    +        object.on('x', listener);
    +        deepEqual(object.listeners('x'), [listener]);
    +      });
    +
    +      test('returns an array and initializes previously uninitialized listeners', function() {
    +        var object = Constructor();
    +        deepEqual(object.listeners('x'), []);
    +        deepEqual(object.events, { 'x': [] });
    +      });
    +    }());
    +
    +    /*------------------------------------------------------------------------*/
    +
    +    QUnit.module(namespace + '#off');
    +
    +    (function() {
    +      test('returns the benchmark', function() {
    +        var listener = function() { },
    +            object = Constructor();
    +
    +        object.on('x', listener);
    +        equal(object.off('x', listener), object);
    +      });
    +
    +      test('will ignore inherited properties of the event cache', function() {
    +        var Dummy = function() { },
    +            listener = function() { },
    +            object = Constructor();
    +
    +        Dummy.prototype.x = [listener];
    +        object.events = new Dummy;
    +
    +        object.off('x', listener);
    +        deepEqual(object.events.x, [listener]);
    +      });
    +
    +      test('handles an event type and listener', function() {
    +        var listener = function() { },
    +            object = Constructor();
    +
    +        object.on('x', listener);
    +        object.off('x', listener);
    +        deepEqual(object.events.x, []);
    +      });
    +
    +      test('handles unregistering duplicate listeners', function() {
    +        var listener = function() { },
    +            object = Constructor();
    +
    +        object.on('x', listener);
    +        object.on('x', listener);
    +
    +        var events = object.events;
    +        object.off('x', listener);
    +        deepEqual(events.x, [listener]);
    +
    +        object.off('x', listener);
    +        deepEqual(events.x, []);
    +      });
    +
    +      test('handles a non-registered listener', function() {
    +        var object = Constructor();
    +        object.off('x', function() { });
    +        equal(object.events, undefined);
    +      });
    +
    +      test('handles space separated event type and listener', function() {
    +        var listener = function() { },
    +            object = Constructor();
    +
    +        object.on('x', listener);
    +        object.on('y', listener);
    +
    +        var events = object.events;
    +        object.off('x y', listener);
    +        deepEqual(events.x, []);
    +        deepEqual(events.y, []);
    +      });
    +
    +      test('handles space separated event type and no listener', function() {
    +        var listener1 = function() { },
    +            listener2 = function() { },
    +            object = Constructor();
    +
    +        object.on('x', listener1);
    +        object.on('y', listener2);
    +
    +        var events = object.events;
    +        object.off('x y');
    +        deepEqual(events.x, []);
    +        deepEqual(events.y, []);
    +      });
    +
    +      test('handles no arguments', function() {
    +        var listener1 = function() { },
    +            listener2 = function() { },
    +            listener3 = function() { },
    +            object = Constructor();
    +
    +        object.on('x', listener1);
    +        object.on('y', listener2);
    +        object.on('z', listener3);
    +
    +        var events = object.events;
    +        object.off();
    +        deepEqual(events.x, []);
    +        deepEqual(events.y, []);
    +        deepEqual(events.z, []);
    +      });
    +    }());
    +
    +    /*------------------------------------------------------------------------*/
    +
    +    QUnit.module(namespace + '#on');
    +
    +    (function() {
    +      test('returns the benchmark', function() {
    +        var listener = function() { },
    +            object = Constructor();
    +
    +        equal(object.on('x', listener), object);
    +      });
    +
    +      test('will ignore inherited properties of the event cache', function() {
    +        var Dummy = function() { },
    +            listener1 = function() { },
    +            listener2 = function() { },
    +            object = Constructor();
    +
    +        Dummy.prototype.x = [listener1];
    +        object.events = new Dummy;
    +
    +        object.on('x', listener2);
    +        deepEqual(object.events.x, [listener2]);
    +      });
    +
    +      test('handles an event type and listener', function() {
    +        var listener = function() { },
    +            object = Constructor();
    +
    +        object.on('x', listener);
    +        deepEqual(object.events.x, [listener]);
    +      });
    +
    +      test('handles registering duplicate listeners', function() {
    +        var listener = function() { },
    +            object = Constructor();
    +
    +        object.on('x', listener);
    +        object.on('x', listener);
    +        deepEqual(object.events.x, [listener, listener]);
    +      });
    +
    +      test('handles space separated event type and listener', function() {
    +        var listener = function() { },
    +            object = Constructor();
    +
    +        object.on('x y', listener);
    +
    +        var events = object.events;
    +        deepEqual(events.x, [listener]);
    +        deepEqual(events.y, [listener]);
    +      });
    +    }());
    +  });
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.Suite#abort');
    +
    +  (function() {
    +    test('igores abort calls when the suite isn\'t running', function() {
    +      var fired = false;
    +      var suite = Benchmark.Suite('suite', {
    +        'onAbort': function() { fired = true; }
    +      });
    +
    +      suite.add('foo', function() { });
    +      suite.abort();
    +      equal(fired, false);
    +    });
    +
    +    test('ignores abort calls from `Benchmark.Suite#reset` when the suite isn\'t running', function() {
    +      var fired = false;
    +      var suite = Benchmark.Suite('suite', {
    +        'onAbort': function() { fired = true; }
    +      });
    +
    +      suite.add('foo', function() { });
    +      suite.reset();
    +      equal(fired, false);
    +    });
    +
    +    asyncTest('emits an abort event when running', function() {
    +      var fired = false;
    +
    +      Benchmark.Suite({
    +        'onAbort': function() { fired = true; }
    +      })
    +      .on('start', function() {
    +        this.abort();
    +      })
    +      .on('complete', function() {
    +        ok(fired);
    +        QUnit.start();
    +      })
    +      .add(function(){ })
    +      .run({ 'async': true });
    +    });
    +
    +    asyncTest('emits an abort event after calling `Benchmark.Suite#reset`', function() {
    +      var fired = false;
    +
    +      Benchmark.Suite({
    +        'onAbort': function() { fired = true; }
    +      })
    +      .on('start', function() {
    +        this.reset();
    +      })
    +      .on('complete', function() {
    +        ok(fired);
    +        QUnit.start();
    +      })
    +      .add(function(){ })
    +      .run({ 'async': true });
    +    });
    +
    +    asyncTest('should abort deferred benchmark', function() {
    +      var fired = false,
    +          suite = Benchmark.Suite();
    +
    +      suite.on('complete', function() {
    +        equal(fired, false);
    +        QUnit.start();
    +      })
    +      .add('a', {
    +        'defer': true,
    +        'fn': function(deferred) {
    +          // avoid test inlining
    +          suite.name;
    +          // delay resolve
    +          setTimeout(function() {
    +            deferred.resolve();
    +            suite.abort();
    +          }, 10);
    +        }
    +      })
    +      .add('b', {
    +        'defer': true,
    +        'fn': function(deferred) {
    +          // avoid test inlining
    +          suite.name;
    +          // delay resolve
    +          setTimeout(function() {
    +            deferred.resolve();
    +            fired = true;
    +          }, 10);
    +        }
    +      })
    +      .run();
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.Suite#concat');
    +
    +  (function() {
    +    var args = arguments;
    +
    +    test('doesn\'t treat an arguments object like an array', function() {
    +      var suite = Benchmark.Suite();
    +      deepEqual(suite.concat(args), [args]);
    +    });
    +
    +    test('flattens array arguments', function() {
    +      var suite = Benchmark.Suite();
    +      deepEqual(suite.concat([1, 2], 3, [4, 5]), [1, 2, 3, 4, 5]);
    +    });
    +
    +    test('supports concating sparse arrays', function() {
    +      var suite = Benchmark.Suite();
    +      suite[0] = 0;
    +      suite[2] = 2;
    +      suite.length = 3;
    +
    +      var actual = suite.concat(3);
    +      deepEqual(actual, [0, undefined, 2, 3]);
    +      equal('1' in actual, false);
    +    });
    +
    +    test('supports sparse arrays as arguments', function() {
    +      var suite = Benchmark.Suite(),
    +          sparse = [];
    +
    +      sparse[0] = 0;
    +      sparse[2] = 2;
    +      sparse.length = 3;
    +
    +      var actual = suite.concat(sparse);
    +      deepEqual(actual, [0, undefined, 2]);
    +      equal('1' in actual, false);
    +    });
    +
    +    test('creates a new array', function() {
    +      var suite = Benchmark.Suite();
    +      ok(suite.concat(1) !== suite);
    +    });
    +  }(1, 2, 3));
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.Suite#reverse');
    +
    +  (function() {
    +    test('reverses the element order', function() {
    +      var suite = Benchmark.Suite();
    +      suite[0] = 0;
    +      suite[1] = 1;
    +      suite.length = 2;
    +
    +      var actual = suite.reverse();
    +      equal(actual, suite);
    +      deepEqual(slice.call(actual), [1, 0]);
    +    });
    +
    +    test('supports reversing sparse arrays', function() {
    +      var suite = Benchmark.Suite();
    +      suite[0] = 0;
    +      suite[2] = 2;
    +      suite.length = 3;
    +
    +      var actual = suite.reverse();
    +      equal(actual, suite);
    +      deepEqual(slice.call(actual), [2, undefined, 0]);
    +      equal('1' in actual, false);
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.Suite#shift');
    +
    +  (function() {
    +    test('removes the first element', function() {
    +      var suite = Benchmark.Suite();
    +      suite[0] = 0;
    +      suite[1] = 1;
    +      suite.length = 2;
    +
    +      var actual = suite.shift();
    +      equal(actual, 0);
    +      deepEqual(slice.call(suite), [1]);
    +    });
    +
    +    test('shifts an object with no elements', function() {
    +      var suite = Benchmark.Suite(),
    +          actual = suite.shift();
    +
    +      equal(actual, undefined);
    +      deepEqual(slice.call(suite), []);
    +    });
    +
    +    test('should have no elements when length is 0 after shift', function() {
    +      var suite = Benchmark.Suite();
    +      suite[0] = 0;
    +      suite.length = 1;
    +      suite.shift();
    +
    +      // ensure element is removed
    +      equal('0' in suite, false);
    +      equal(suite.length, 0);
    +    });
    +
    +    test('supports shifting sparse arrays', function() {
    +      var suite = Benchmark.Suite();
    +      suite[1] = 1;
    +      suite[3] = 3;
    +      suite.length = 4;
    +
    +      var actual = suite.shift();
    +      equal(actual, undefined);
    +      deepEqual(slice.call(suite), [1, undefined, 3]);
    +      equal('1' in suite, false);
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.Suite#slice');
    +
    +  (function() {
    +    var suite = Benchmark.Suite();
    +    suite[0] = 0;
    +    suite[1] = 1;
    +    suite[2] = 2;
    +    suite[3] = 3;
    +    suite.length = 4;
    +
    +    test('works with no arguments', function() {
    +      var actual = suite.slice();
    +      deepEqual(actual, [0, 1, 2, 3]);
    +      ok(suite !== actual);
    +    });
    +
    +    test('works with positive `start` argument', function() {
    +      var actual = suite.slice(2);
    +      deepEqual(actual, [2, 3]);
    +      ok(suite !== actual);
    +    });
    +
    +    test('works with positive `start` and `end` arguments', function() {
    +      var actual = suite.slice(1, 3);
    +      deepEqual(actual, [1, 2]);
    +      ok(suite !== actual);
    +    });
    +
    +    test('works with `end` values exceeding length', function() {
    +      var actual = suite.slice(1, 10);
    +      deepEqual(actual, [1, 2, 3]);
    +      ok(suite !== actual);
    +    });
    +
    +    test('works with negative `start` and `end` arguments', function() {
    +      var actual = suite.slice(-3, -1);
    +      deepEqual(actual, [1, 2]);
    +      ok(suite !== actual);
    +    });
    +
    +    test('works with an extreme negative `end` value', function() {
    +      var actual = suite.slice(1, -10);
    +      deepEqual(actual, []);
    +      equal('-1' in actual, false);
    +      ok(suite !== actual);
    +    });
    +
    +    test('supports slicing sparse arrays', function() {
    +      var sparse = Benchmark.Suite();
    +      sparse[1] = 1;
    +      sparse[3] = 3;
    +      sparse.length = 4;
    +
    +      var actual = sparse.slice(0, 2);
    +      deepEqual(actual, [undefined, 1]);
    +      equal('0' in actual, false);
    +
    +      actual = sparse.slice(1);
    +      deepEqual(actual, [1, undefined, 3]);
    +      equal('1' in actual, false);
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.Suite#splice');
    +
    +  (function() {
    +    test('works with no arguments', function() {
    +      var suite = Benchmark.Suite();
    +      suite[0] = 0;
    +      suite.length = 1;
    +
    +      var actual = suite.splice();
    +      deepEqual(actual, []);
    +      deepEqual(slice.call(suite), [0]);
    +    });
    +
    +    test('works with only the `start` argument', function() {
    +      var suite = Benchmark.Suite();
    +      suite[0] = 0;
    +      suite[1] = 1;
    +      suite.length = 2;
    +
    +      var actual = suite.splice(1);
    +      deepEqual(actual, [1]);
    +      deepEqual(slice.call(suite), [0]);
    +    });
    +
    +    test('should have no elements when length is 0 after splice', function() {
    +      var suite = Benchmark.Suite();
    +      suite[0] = 0;
    +      suite.length = 1
    +      suite.splice(0, 1);
    +
    +      // ensure element is removed
    +      equal('0' in suite, false);
    +      equal(suite.length, 0);
    +    });
    +
    +    test('works with positive `start` argument', function() {
    +      var suite = Benchmark.Suite();
    +      suite[0] = 0;
    +      suite[1] = 3;
    +      suite.length = 2;
    +
    +      var actual = suite.splice(1, 0, 1, 2);
    +      deepEqual(actual, []);
    +      deepEqual(slice.call(suite), [0, 1, 2, 3]);
    +    });
    +
    +    test('works with positive `start` and `deleteCount` arguments', function() {
    +      var suite = Benchmark.Suite();
    +      suite[0] = 0;
    +      suite[1] = 3;
    +      suite.length = 2;
    +
    +      var actual = suite.splice(1, 1, 1, 2);
    +      deepEqual(actual, [3]);
    +      deepEqual(slice.call(suite), [0, 1, 2]);
    +    });
    +
    +    test('works with `deleteCount` values exceeding length', function() {
    +      var suite = Benchmark.Suite();
    +      suite[0] = 0;
    +      suite[1] = 3;
    +      suite.length = 2;
    +
    +      var actual = suite.splice(1, 10, 1, 2);
    +      deepEqual(actual, [3]);
    +      deepEqual(slice.call(suite), [0, 1, 2]);
    +    });
    +
    +    test('works with negative `start` and `deleteCount` arguments', function() {
    +      var suite = Benchmark.Suite();
    +      suite[0] = 0;
    +      suite[1] = 3;
    +      suite.length = 2;
    +
    +      var actual = suite.splice(-1, -1, 1, 2);
    +      deepEqual(actual, []);
    +      deepEqual(slice.call(suite), [0, 1, 2, 3]);
    +    });
    +
    +    test('works with an extreme negative `deleteCount` value', function() {
    +      var suite = Benchmark.Suite();
    +      suite[0] = 0;
    +      suite[1] = 3;
    +      suite.length = 2;
    +
    +      var actual = suite.splice(0, -10, 1, 2);
    +      deepEqual(actual, []);
    +      deepEqual(slice.call(suite), [1, 2, 0, 3]);
    +    });
    +
    +    test('supports splicing sparse arrays', function() {
    +      var suite = Benchmark.Suite();
    +      suite[1] = 1;
    +      suite[3] = 3;
    +      suite.length = 4;
    +
    +      var actual = suite.splice(1, 2, 1, 2);
    +      deepEqual(actual, [1, undefined]);
    +      equal(actual.length, 2);
    +      deepEqual(slice.call(suite), [undefined, 1, 2, 3]);
    +      equal('0' in suite, false);
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.Suite#unshift');
    +
    +  (function() {
    +    test('adds a first element', function() {
    +      var suite = Benchmark.Suite();
    +      suite[0] = 1;
    +      suite.length = 1;
    +
    +      var actual = suite.unshift(0);
    +      equal(actual, 2);
    +      deepEqual(slice.call(suite), [0, 1]);
    +    });
    +
    +    test('adds multiple elements to the front', function() {
    +      var suite = Benchmark.Suite();
    +      suite[0] = 3;
    +      suite.length = 1;
    +
    +      var actual = suite.unshift(0, 1, 2);
    +      equal(actual, 4);
    +      deepEqual(slice.call(suite), [0, 1, 2, 3]);
    +    });
    +
    +    test('supports unshifting sparse arrays', function() {
    +      var suite = Benchmark.Suite();
    +      suite[1] = 2;
    +      suite.length = 2;
    +
    +      var actual = suite.unshift(0);
    +      equal(actual, 3);
    +      deepEqual(slice.call(suite), [0, undefined, 2]);
    +      equal('1' in suite, false);
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.Suite filtered results onComplete');
    +
    +  (function() {
    +    var count = 0,
    +        suite = Benchmark.Suite();
    +
    +    suite.add('a', function() {
    +      count++;
    +    })
    +    .add('b', function() {
    +      for (var i = 0; i < 1e6; i++) {
    +        count++;
    +      }
    +    })
    +    .add('c', function() {
    +      throw new TypeError;
    +    });
    +
    +    asyncTest('should filter by fastest', function() {
    +      suite.on('complete', function() {
    +        suite.off();
    +        deepEqual(this.filter('fastest').pluck('name'), ['a']);
    +        QUnit.start();
    +      })
    +      .run({ 'async': true });
    +    });
    +
    +    asyncTest('should filter by slowest', function() {
    +      suite.on('complete', function() {
    +        suite.off();
    +        deepEqual(this.filter('slowest').pluck('name'), ['b']);
    +        QUnit.start();
    +      })
    +      .run({ 'async': true });
    +    });
    +
    +    asyncTest('should filter by successful', function() {
    +      suite.on('complete', function() {
    +        suite.off();
    +        deepEqual(this.filter('successful').pluck('name'), ['a', 'b']);
    +        QUnit.start();
    +      })
    +      .run({ 'async': true });
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.Suite event flow');
    +
    +  (function() {
    +    var events = [],
    +        callback = function(event) { events.push(event); };
    +
    +    var suite = Benchmark.Suite('suite', {
    +      'onAdd': callback,
    +      'onAbort': callback,
    +      'onClone': callback,
    +      'onError': callback,
    +      'onStart': callback,
    +      'onCycle': callback,
    +      'onComplete': callback,
    +      'onReset': callback
    +    })
    +    .add('bench', function() {
    +      throw null;
    +    }, {
    +      'onAbort': callback,
    +      'onClone': callback,
    +      'onError': callback,
    +      'onStart': callback,
    +      'onCycle': callback,
    +      'onComplete': callback,
    +      'onReset': callback
    +    })
    +    .run({ 'async': false });
    +
    +    // first Suite#onAdd
    +    test('should emit the suite "add" event first', function() {
    +      var event = events[0];
    +      ok(event.type == 'add' && event.currentTarget.name == 'suite' && event.target.name == 'bench');
    +    });
    +
    +    // next we start the Suite because no reset was needed
    +    test('should emit the suite "start" event', function() {
    +      var event = events[1];
    +      ok(event.type == 'start' && event.currentTarget.name == 'suite' && event.target.name == 'bench');
    +    });
    +
    +    // and so start the first benchmark
    +    test('should emit the benchmark "start" event', function() {
    +      var event = events[2];
    +      ok(event.type == 'start' && event.currentTarget.name == 'bench');
    +    });
    +
    +    // oh no! we abort because of an error
    +    test('should emit the benchmark "error" event', function() {
    +      var event = events[3];
    +      ok(event.type == 'error' && event.currentTarget.name == 'bench');
    +    });
    +
    +    // benchmark error triggered
    +    test('should emit the benchmark "abort" event', function() {
    +      var event = events[4];
    +      ok(event.type == 'abort' && event.currentTarget.name == 'bench');
    +    });
    +
    +    // we reset the benchmark as part of the abort
    +    test('should emit the benchmark "reset" event', function() {
    +      var event = events[5];
    +      ok(event.type == 'reset' && event.currentTarget.name == 'bench');
    +    });
    +
    +    // benchmark is cycle is finished
    +    test('should emit the benchmark "cycle" event', function() {
    +      var event = events[6];
    +      ok(event.type == 'cycle' && event.currentTarget.name == 'bench');
    +    });
    +
    +    // benchmark is complete
    +    test('should emit the benchmark "complete" event', function() {
    +      var event = events[7];
    +      ok(event.type == 'complete' && event.currentTarget.name == 'bench');
    +    });
    +
    +    // the benchmark error triggers a Suite error
    +    test('should emit the suite "error" event', function() {
    +      var event = events[8];
    +      ok(event.type == 'error' && event.currentTarget.name == 'suite' && event.target.name == 'bench');
    +    });
    +
    +    // the Suite cycle finishes
    +    test('should emit the suite "cycle" event', function() {
    +      var event = events[9];
    +      ok(event.type == 'cycle' && event.currentTarget.name == 'suite' && event.target.name == 'bench');
    +    });
    +
    +    // the Suite completes
    +    test('finally it should emit the suite "complete" event', function() {
    +      var event = events[10];
    +      ok(event.type == 'complete' && event.currentTarget.name == 'suite' && event.target.name == 'bench');
    +    });
    +
    +    test('emitted all expected events', function() {
    +      ok(events.length == 11);
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Deferred benchmarks');
    +
    +  (function() {
    +    asyncTest('should run a deferred benchmark correctly', function() {
    +      Benchmark(function(deferred) {
    +        setTimeout(function() { deferred.resolve(); }, 1e3);
    +      }, {
    +        'defer': true,
    +        'onComplete': function() {
    +          equal(this.hz.toFixed(0), 1);
    +          QUnit.start();
    +        }
    +      })
    +      .run();
    +    });
    +
    +    asyncTest('should run with string values for "fn", "setup", and "teardown"', function() {
    +      Benchmark({
    +        'defer': true,
    +        'setup': 'var x = [3, 2, 1];',
    +        'fn': 'setTimeout(function() { x.sort(); deferred.resolve(); }, 10);',
    +        'teardown': 'x.length = 0;',
    +        'onComplete': function() {
    +          ok(true);
    +          QUnit.start();
    +        }
    +      })
    +      .run();
    +    });
    +
    +    asyncTest('should run recursively', function() {
    +      Benchmark({
    +        'defer': true,
    +        'setup': 'var x = [3, 2, 1];',
    +        'fn': 'for (var i = 0; i < 100; i++) x[ i % 2 ? "sort" : "reverse" ](); deferred.resolve();',
    +        'teardown': 'x.length = 0;',
    +        'onComplete': function() {
    +          ok(true);
    +          QUnit.start();
    +        }
    +      })
    +      .run();
    +    });
    +
    +    asyncTest('should execute "setup", "fn", and "teardown" in correct order', function() {
    +      var fired = [];
    +
    +      Benchmark({
    +        'defer': true,
    +        'setup': function() {
    +          fired.push('setup');
    +        },
    +        'fn': function(deferred) {
    +          fired.push('fn');
    +          setTimeout(function() { deferred.resolve(); }, 10);
    +        },
    +        'teardown': function() {
    +          fired.push('teardown');
    +        },
    +        'onComplete': function() {
    +          var actual = fired.join().replace(/(fn,)+/g, '$1').replace(/(setup,fn,teardown(?:,|$))+/, '$1');
    +          equal(actual, 'setup,fn,teardown');
    +          QUnit.start();
    +        }
    +      })
    +      .run();
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  QUnit.module('Benchmark.deepClone');
    +
    +  (function() {
    +    asyncTest('avoids call stack limits', function() {
    +      var result,
    +          count = 0,
    +          object = {},
    +          recurse = function() { count++; recurse(); };
    +
    +      setTimeout(function() {
    +        ok(result, 'avoids call stack limits (stack limit is ' + (count - 1) + ')');
    +        QUnit.start();
    +      }, 15);
    +
    +      if (toString.call(window.java) == '[object JavaPackage]') {
    +        // Java throws uncatchable errors on call stack overflows, so to avoid
    +        // them I chose a number higher than Rhino's call stack limit without
    +        // dynamically testing for the actual limit
    +        count = 3e3;
    +      } else {
    +        try { recurse(); } catch(e) { }
    +      }
    +
    +      // exceed limit
    +      count++;
    +      for (var i = 0, sub = object; i <= count; i++) {
    +        sub = sub[i] = {};
    +      }
    +
    +      try {
    +        for (var i = 0, sub = Benchmark.deepClone(object); sub = sub[i]; i++) { }
    +        result = --i == count;
    +      } catch(e) { }
    +    });
    +  }());
    +
    +  /*--------------------------------------------------------------------------*/
    +
    +  // explicitly call `QUnit.start()` for Narwhal, Rhino, and RingoJS
    +  if (!window.document) {
    +    QUnit.start();
    +  }
    +}(typeof global == 'object' && global || this));
    diff --git a/cep/node_modules/better-assert/.npmignore b/cep/node_modules/better-assert/.npmignore
    new file mode 100644
    index 0000000..f1250e5
    --- /dev/null
    +++ b/cep/node_modules/better-assert/.npmignore
    @@ -0,0 +1,4 @@
    +support
    +test
    +examples
    +*.sock
    diff --git a/cep/node_modules/better-assert/History.md b/cep/node_modules/better-assert/History.md
    new file mode 100644
    index 0000000..cbb579b
    --- /dev/null
    +++ b/cep/node_modules/better-assert/History.md
    @@ -0,0 +1,15 @@
    +
    +1.0.0 / 2013-02-03 
    +==================
    +
    +  * Stop using the removed magic __stack global getter
    +
    +0.1.0 / 2012-10-04 
    +==================
    +
    +  * add throwing of AssertionError for test frameworks etc
    +
    +0.0.1 / 2010-01-03
    +==================
    +
    +  * Initial release
    diff --git a/cep/node_modules/better-assert/Makefile b/cep/node_modules/better-assert/Makefile
    new file mode 100644
    index 0000000..36a3ed7
    --- /dev/null
    +++ b/cep/node_modules/better-assert/Makefile
    @@ -0,0 +1,5 @@
    +
    +test:
    +	@echo "populate me"
    +
    +.PHONY: test
    \ No newline at end of file
    diff --git a/cep/node_modules/better-assert/Readme.md b/cep/node_modules/better-assert/Readme.md
    new file mode 100644
    index 0000000..d8d3a63
    --- /dev/null
    +++ b/cep/node_modules/better-assert/Readme.md
    @@ -0,0 +1,61 @@
    +
    +# better-assert
    +
    +  Better c-style assertions using [callsite](https://github.com/visionmedia/callsite) for
    +  self-documenting failure messages.
    +
    +## Installation
    +
    +    $ npm install better-assert
    +
    +## Example
    +
    + By default assertions are enabled, however the __NO_ASSERT__ environment variable 
    + will deactivate them when truthy.
    +
    +```js
    +var assert = require('better-assert');
    +
    +test();
    +
    +function test() {
    +  var user = { name: 'tobi' };
    +  assert('tobi' == user.name);
    +  assert('number' == typeof user.age);
    +}
    +
    +AssertionError: 'number' == typeof user.age
    +    at test (/Users/tj/projects/better-assert/example.js:9:3)
    +    at Object. (/Users/tj/projects/better-assert/example.js:4:1)
    +    at Module._compile (module.js:449:26)
    +    at Object.Module._extensions..js (module.js:467:10)
    +    at Module.load (module.js:356:32)
    +    at Function.Module._load (module.js:312:12)
    +    at Module.runMain (module.js:492:10)
    +    at process.startup.processNextTick.process._tickCallback (node.js:244:9)
    +```
    +
    +## License 
    +
    +(The MIT License)
    +
    +Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>
    +
    +Permission is hereby granted, free of charge, to any person obtaining
    +a copy of this software and associated documentation files (the
    +'Software'), to deal in the Software without restriction, including
    +without limitation the rights to use, copy, modify, merge, publish,
    +distribute, sublicense, and/or sell copies of the Software, and to
    +permit persons to whom the Software is furnished to do so, subject to
    +the following conditions:
    +
    +The above copyright notice and this permission notice shall be
    +included in all copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
    +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
    +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
    +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
    +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
    +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    \ No newline at end of file
    diff --git a/cep/node_modules/better-assert/example.js b/cep/node_modules/better-assert/example.js
    new file mode 100644
    index 0000000..688c29e
    --- /dev/null
    +++ b/cep/node_modules/better-assert/example.js
    @@ -0,0 +1,10 @@
    +
    +var assert = require('./');
    +
    +test();
    +
    +function test() {
    +  var user = { name: 'tobi' };
    +  assert('tobi' == user.name);
    +  assert('number' == typeof user.age);
    +}
    \ No newline at end of file
    diff --git a/cep/node_modules/better-assert/index.js b/cep/node_modules/better-assert/index.js
    new file mode 100644
    index 0000000..fd1c9b7
    --- /dev/null
    +++ b/cep/node_modules/better-assert/index.js
    @@ -0,0 +1,38 @@
    +/**
    + * Module dependencies.
    + */
    +
    +var AssertionError = require('assert').AssertionError
    +  , callsite = require('callsite')
    +  , fs = require('fs')
    +
    +/**
    + * Expose `assert`.
    + */
    +
    +module.exports = process.env.NO_ASSERT
    +  ? function(){}
    +  : assert;
    +
    +/**
    + * Assert the given `expr`.
    + */
    +
    +function assert(expr) {
    +  if (expr) return;
    +
    +  var stack = callsite();
    +  var call = stack[1];
    +  var file = call.getFileName();
    +  var lineno = call.getLineNumber();
    +  var src = fs.readFileSync(file, 'utf8');
    +  var line = src.split('\n')[lineno-1];
    +  var src = line.match(/assert\((.*)\)/)[1];
    +
    +  var err = new AssertionError({
    +    message: src,
    +    stackStartFunction: stack[0].getFunction()
    +  });
    +
    +  throw err;
    +}
    diff --git a/cep/node_modules/better-assert/package.json b/cep/node_modules/better-assert/package.json
    new file mode 100644
    index 0000000..2339436
    --- /dev/null
    +++ b/cep/node_modules/better-assert/package.json
    @@ -0,0 +1,101 @@
    +{
    +  "_args": [
    +    [
    +      {
    +        "raw": "better-assert@~1.0.0",
    +        "scope": null,
    +        "escapedName": "better-assert",
    +        "name": "better-assert",
    +        "rawSpec": "~1.0.0",
    +        "spec": ">=1.0.0 <1.1.0",
    +        "type": "range"
    +      },
    +      "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\parsejson"
    +    ]
    +  ],
    +  "_from": "better-assert@>=1.0.0 <1.1.0",
    +  "_id": "better-assert@1.0.2",
    +  "_inCache": true,
    +  "_installable": true,
    +  "_location": "/better-assert",
    +  "_npmUser": {
    +    "name": "tony_ado",
    +    "email": "coolhzb@163.com"
    +  },
    +  "_npmVersion": "1.4.9",
    +  "_phantomChildren": {},
    +  "_requested": {
    +    "raw": "better-assert@~1.0.0",
    +    "scope": null,
    +    "escapedName": "better-assert",
    +    "name": "better-assert",
    +    "rawSpec": "~1.0.0",
    +    "spec": ">=1.0.0 <1.1.0",
    +    "type": "range"
    +  },
    +  "_requiredBy": [
    +    "/parsejson",
    +    "/parseqs",
    +    "/parseuri"
    +  ],
    +  "_resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
    +  "_shasum": "40866b9e1b9e0b55b481894311e68faffaebc522",
    +  "_shrinkwrap": null,
    +  "_spec": "better-assert@~1.0.0",
    +  "_where": "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\parsejson",
    +  "author": {
    +    "name": "TJ Holowaychuk",
    +    "email": "tj@vision-media.ca"
    +  },
    +  "bugs": {
    +    "url": "https://github.com/visionmedia/better-assert/issues"
    +  },
    +  "contributors": [
    +    {
    +      "name": "TonyHe",
    +      "email": "coolhzb@163.com"
    +    },
    +    {
    +      "name": "ForbesLindesay"
    +    }
    +  ],
    +  "dependencies": {
    +    "callsite": "1.0.0"
    +  },
    +  "description": "Better assertions for node, reporting the expr, filename, lineno etc",
    +  "devDependencies": {},
    +  "directories": {},
    +  "dist": {
    +    "shasum": "40866b9e1b9e0b55b481894311e68faffaebc522",
    +    "tarball": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz"
    +  },
    +  "engines": {
    +    "node": "*"
    +  },
    +  "homepage": "https://github.com/visionmedia/better-assert",
    +  "keywords": [
    +    "assert",
    +    "stack",
    +    "trace",
    +    "debug"
    +  ],
    +  "main": "index",
    +  "maintainers": [
    +    {
    +      "name": "tjholowaychuk",
    +      "email": "tj@vision-media.ca"
    +    },
    +    {
    +      "name": "tony_ado",
    +      "email": "coolhzb@163.com"
    +    }
    +  ],
    +  "name": "better-assert",
    +  "optionalDependencies": {},
    +  "readme": "ERROR: No README data found!",
    +  "repository": {
    +    "type": "git",
    +    "url": "git+https://github.com/visionmedia/better-assert.git"
    +  },
    +  "version": "1.0.2"
    +}
    diff --git a/cep/node_modules/blob/.npmignore b/cep/node_modules/blob/.npmignore
    new file mode 100644
    index 0000000..548a368
    --- /dev/null
    +++ b/cep/node_modules/blob/.npmignore
    @@ -0,0 +1,2 @@
    +node_modules
    +blob.js
    diff --git a/cep/node_modules/blob/.zuul.yml b/cep/node_modules/blob/.zuul.yml
    new file mode 100644
    index 0000000..380c395
    --- /dev/null
    +++ b/cep/node_modules/blob/.zuul.yml
    @@ -0,0 +1,14 @@
    +ui: mocha-bdd
    +browsers:
    +  - name: chrome
    +    version: 8..latest
    +  - name: firefox
    +    version: 7..latest
    +  - name: safari
    +    version: 6..latest
    +  - name: opera
    +    version: 12.1..latest
    +  - name: ie
    +    version: 10..latest
    +  - name: android
    +    version: latest
    diff --git a/cep/node_modules/blob/Makefile b/cep/node_modules/blob/Makefile
    new file mode 100644
    index 0000000..7d9601a
    --- /dev/null
    +++ b/cep/node_modules/blob/Makefile
    @@ -0,0 +1,14 @@
    +REPORTER = dot
    +
    +build: blob.js
    +
    +blob.js:
    +	@./node_modules/.bin/browserify --standalone blob index.js > blob.js
    +
    +test:
    +	@./node_modules/.bin/zuul -- test/index.js
    +
    +clean:
    +	rm blob.js
    +
    +.PHONY: test blob.js
    diff --git a/cep/node_modules/blob/README.md b/cep/node_modules/blob/README.md
    new file mode 100644
    index 0000000..6915955
    --- /dev/null
    +++ b/cep/node_modules/blob/README.md
    @@ -0,0 +1,14 @@
    +Blob
    +====
    +
    +A module that exports a constructor that uses window.Blob when available, and a BlobBuilder with any vendor prefix in other cases. If neither is available, it exports undefined.
    +
    +Usage:
    +
    +```javascript
    +var Blob = require('blob');
    +var b = new Blob(['hi', 'constructing', 'a', 'blob']);
    +```
    +
    +## Licence
    +MIT
    diff --git a/cep/node_modules/blob/index.js b/cep/node_modules/blob/index.js
    new file mode 100644
    index 0000000..cad3f84
    --- /dev/null
    +++ b/cep/node_modules/blob/index.js
    @@ -0,0 +1,96 @@
    +/**
    + * Create a blob builder even when vendor prefixes exist
    + */
    +
    +var BlobBuilder = global.BlobBuilder
    +  || global.WebKitBlobBuilder
    +  || global.MSBlobBuilder
    +  || global.MozBlobBuilder;
    +
    +/**
    + * Check if Blob constructor is supported
    + */
    +
    +var blobSupported = (function() {
    +  try {
    +    var a = new Blob(['hi']);
    +    return a.size === 2;
    +  } catch(e) {
    +    return false;
    +  }
    +})();
    +
    +/**
    + * Check if Blob constructor supports ArrayBufferViews
    + * Fails in Safari 6, so we need to map to ArrayBuffers there.
    + */
    +
    +var blobSupportsArrayBufferView = blobSupported && (function() {
    +  try {
    +    var b = new Blob([new Uint8Array([1,2])]);
    +    return b.size === 2;
    +  } catch(e) {
    +    return false;
    +  }
    +})();
    +
    +/**
    + * Check if BlobBuilder is supported
    + */
    +
    +var blobBuilderSupported = BlobBuilder
    +  && BlobBuilder.prototype.append
    +  && BlobBuilder.prototype.getBlob;
    +
    +/**
    + * Helper function that maps ArrayBufferViews to ArrayBuffers
    + * Used by BlobBuilder constructor and old browsers that didn't
    + * support it in the Blob constructor.
    + */
    +
    +function mapArrayBufferViews(ary) {
    +  for (var i = 0; i < ary.length; i++) {
    +    var chunk = ary[i];
    +    if (chunk.buffer instanceof ArrayBuffer) {
    +      var buf = chunk.buffer;
    +
    +      // if this is a subarray, make a copy so we only
    +      // include the subarray region from the underlying buffer
    +      if (chunk.byteLength !== buf.byteLength) {
    +        var copy = new Uint8Array(chunk.byteLength);
    +        copy.set(new Uint8Array(buf, chunk.byteOffset, chunk.byteLength));
    +        buf = copy.buffer;
    +      }
    +
    +      ary[i] = buf;
    +    }
    +  }
    +}
    +
    +function BlobBuilderConstructor(ary, options) {
    +  options = options || {};
    +
    +  var bb = new BlobBuilder();
    +  mapArrayBufferViews(ary);
    +
    +  for (var i = 0; i < ary.length; i++) {
    +    bb.append(ary[i]);
    +  }
    +
    +  return (options.type) ? bb.getBlob(options.type) : bb.getBlob();
    +};
    +
    +function BlobConstructor(ary, options) {
    +  mapArrayBufferViews(ary);
    +  return new Blob(ary, options || {});
    +};
    +
    +module.exports = (function() {
    +  if (blobSupported) {
    +    return blobSupportsArrayBufferView ? global.Blob : BlobConstructor;
    +  } else if (blobBuilderSupported) {
    +    return BlobBuilderConstructor;
    +  } else {
    +    return undefined;
    +  }
    +})();
    diff --git a/cep/node_modules/blob/package.json b/cep/node_modules/blob/package.json
    new file mode 100644
    index 0000000..a47c3e2
    --- /dev/null
    +++ b/cep/node_modules/blob/package.json
    @@ -0,0 +1,78 @@
    +{
    +  "_args": [
    +    [
    +      {
    +        "raw": "blob@0.0.4",
    +        "scope": null,
    +        "escapedName": "blob",
    +        "name": "blob",
    +        "rawSpec": "0.0.4",
    +        "spec": "0.0.4",
    +        "type": "version"
    +      },
    +      "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\engine.io-parser"
    +    ]
    +  ],
    +  "_from": "blob@0.0.4",
    +  "_id": "blob@0.0.4",
    +  "_inCache": true,
    +  "_installable": true,
    +  "_location": "/blob",
    +  "_npmUser": {
    +    "name": "rase-",
    +    "email": "tonykovanen@hotmail.com"
    +  },
    +  "_npmVersion": "1.4.6",
    +  "_phantomChildren": {},
    +  "_requested": {
    +    "raw": "blob@0.0.4",
    +    "scope": null,
    +    "escapedName": "blob",
    +    "name": "blob",
    +    "rawSpec": "0.0.4",
    +    "spec": "0.0.4",
    +    "type": "version"
    +  },
    +  "_requiredBy": [
    +    "/engine.io-parser"
    +  ],
    +  "_resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
    +  "_shasum": "bcf13052ca54463f30f9fc7e95b9a47630a94921",
    +  "_shrinkwrap": null,
    +  "_spec": "blob@0.0.4",
    +  "_where": "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\engine.io-parser",
    +  "bugs": {
    +    "url": "https://github.com/rase-/blob/issues"
    +  },
    +  "dependencies": {},
    +  "description": "Abstracts out Blob and uses BlobBulder in cases where it is supported with any vendor prefix.",
    +  "devDependencies": {
    +    "browserify": "3.30.1",
    +    "expect.js": "0.2.0",
    +    "mocha": "1.17.1",
    +    "zuul": "1.5.4"
    +  },
    +  "directories": {},
    +  "dist": {
    +    "shasum": "bcf13052ca54463f30f9fc7e95b9a47630a94921",
    +    "tarball": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz"
    +  },
    +  "homepage": "https://github.com/rase-/blob",
    +  "maintainers": [
    +    {
    +      "name": "rase-",
    +      "email": "tonykovanen@hotmail.com"
    +    }
    +  ],
    +  "name": "blob",
    +  "optionalDependencies": {},
    +  "readme": "ERROR: No README data found!",
    +  "repository": {
    +    "type": "git",
    +    "url": "git+ssh://git@github.com/rase-/blob.git"
    +  },
    +  "scripts": {
    +    "test": "make test"
    +  },
    +  "version": "0.0.4"
    +}
    diff --git a/cep/node_modules/blob/test/index.js b/cep/node_modules/blob/test/index.js
    new file mode 100644
    index 0000000..df9303f
    --- /dev/null
    +++ b/cep/node_modules/blob/test/index.js
    @@ -0,0 +1,94 @@
    +var Blob = require('../');
    +var expect = require('expect.js');
    +
    +describe('blob', function() {
    +  if (!Blob) {
    +    it('should not have a blob or a blob builder in the global namespace, or blob should not be a constructor function if the module exports false', function() {
    +      try {
    +        var ab = (new Uint8Array(5)).buffer;
    +        global.Blob([ab]);
    +        expect().fail('Blob shouldn\'t be constructable');
    +      } catch (e) {}
    +
    +      var BlobBuilder = global.BlobBuilder
    +        || global.WebKitBlobBuilder
    +        || global.MSBlobBuilder
    +        || global.MozBlobBuilder;
    +      expect(BlobBuilder).to.be(undefined);
    +    });
    +  } else {
    +    it('should encode a proper sized blob when given a string argument', function() {
    +      var b = new Blob(['hi']);
    +      expect(b.size).to.be(2);
    +    });
    +
    +    it('should encode a blob with proper size when given two strings as arguments', function() {
    +      var b = new Blob(['hi', 'hello']);
    +      expect(b.size).to.be(7);
    +    });
    +
    +    it('should encode arraybuffers with right content', function(done) {
    +      var ary = new Uint8Array(5);
    +      for (var i = 0; i < 5; i++) ary[i] = i;
    +      var b = new Blob([ary.buffer]);
    +      var fr = new FileReader();
    +      fr.onload = function() {
    +        var newAry = new Uint8Array(this.result);
    +        for (var i = 0; i < 5; i++) expect(newAry[i]).to.be(i);
    +        done();
    +      };
    +      fr.readAsArrayBuffer(b);
    +    });
    +
    +    it('should encode typed arrays with right content', function(done) {
    +      var ary = new Uint8Array(5);
    +      for (var i = 0; i < 5; i++) ary[i] = i;
    +      var b = new Blob([ary]);
    +      var fr = new FileReader();
    +      fr.onload = function() {
    +        var newAry = new Uint8Array(this.result);
    +        for (var i = 0; i < 5; i++) expect(newAry[i]).to.be(i);
    +        done();
    +      };
    +      fr.readAsArrayBuffer(b);
    +    });
    +
    +    it('should encode sliced typed arrays with right content', function(done) {
    +      var ary = new Uint8Array(5);
    +      for (var i = 0; i < 5; i++) ary[i] = i;
    +      var b = new Blob([ary.subarray(2)]);
    +      var fr = new FileReader();
    +      fr.onload = function() {
    +        var newAry = new Uint8Array(this.result);
    +        for (var i = 0; i < 3; i++) expect(newAry[i]).to.be(i + 2);
    +        done();
    +      };
    +      fr.readAsArrayBuffer(b);
    +    });
    +
    +    it('should encode with blobs', function(done) {
    +      var ary = new Uint8Array(5);
    +      for (var i = 0; i < 5; i++) ary[i] = i;
    +      var b = new Blob([new Blob([ary.buffer])]);
    +      var fr = new FileReader();
    +      fr.onload = function() {
    +        var newAry = new Uint8Array(this.result);
    +        for (var i = 0; i < 5; i++) expect(newAry[i]).to.be(i);
    +        done();
    +      };
    +      fr.readAsArrayBuffer(b);
    +    });
    +
    +    it('should enode mixed contents to right size', function() {
    +      var ary = new Uint8Array(5);
    +      for (var i = 0; i < 5; i++) ary[i] = i;
    +      var b = new Blob([ary.buffer, 'hello']);
    +      expect(b.size).to.be(10);
    +    });
    +
    +    it('should accept mime type', function() {
    +      var b = new Blob(['hi', 'hello'], { type: 'text/html' });
    +      expect(b.type).to.be('text/html');
    +    });
    +  }
    +});
    diff --git a/cep/node_modules/callsite/.npmignore b/cep/node_modules/callsite/.npmignore
    new file mode 100644
    index 0000000..f1250e5
    --- /dev/null
    +++ b/cep/node_modules/callsite/.npmignore
    @@ -0,0 +1,4 @@
    +support
    +test
    +examples
    +*.sock
    diff --git a/cep/node_modules/callsite/History.md b/cep/node_modules/callsite/History.md
    new file mode 100644
    index 0000000..4994198
    --- /dev/null
    +++ b/cep/node_modules/callsite/History.md
    @@ -0,0 +1,10 @@
    +
    +1.0.0 / 2013-01-24 
    +==================
    +
    +  * remove lame magical getters
    +
    +0.0.1 / 2010-01-03
    +==================
    +
    +  * Initial release
    diff --git a/cep/node_modules/callsite/Makefile b/cep/node_modules/callsite/Makefile
    new file mode 100644
    index 0000000..634e372
    --- /dev/null
    +++ b/cep/node_modules/callsite/Makefile
    @@ -0,0 +1,6 @@
    +
    +test:
    +	@./node_modules/.bin/mocha \
    +		--require should
    +
    +.PHONY: test
    \ No newline at end of file
    diff --git a/cep/node_modules/callsite/Readme.md b/cep/node_modules/callsite/Readme.md
    new file mode 100644
    index 0000000..0dbd16a
    --- /dev/null
    +++ b/cep/node_modules/callsite/Readme.md
    @@ -0,0 +1,44 @@
    +# callstack
    +
    +  Access to v8's "raw" `CallSite`s.
    +
    +## Installation
    +
    +    $ npm install callsite
    +
    +## Example
    +
    +```js
    +var stack = require('callsite');
    +
    +foo();
    +
    +function foo() {
    +  bar();
    +}
    +
    +function bar() {
    +  baz();
    +}
    +
    +function baz() {
    +  console.log();
    +  stack().forEach(function(site){
    +    console.log('  \033[36m%s\033[90m in %s:%d\033[0m'
    +      , site.getFunctionName() || 'anonymous'
    +      , site.getFileName()
    +      , site.getLineNumber());
    +  });
    +  console.log();
    +}
    +```
    +
    +## Why?
    +
    +  Because you can do weird, stupid, clever, wacky things such as:
    +
    +  - [better-assert](https://github.com/visionmedia/better-assert)
    +
    +## License
    +
    +  MIT
    diff --git a/cep/node_modules/callsite/index.js b/cep/node_modules/callsite/index.js
    new file mode 100644
    index 0000000..d3ee6f8
    --- /dev/null
    +++ b/cep/node_modules/callsite/index.js
    @@ -0,0 +1,10 @@
    +
    +module.exports = function(){
    +  var orig = Error.prepareStackTrace;
    +  Error.prepareStackTrace = function(_, stack){ return stack; };
    +  var err = new Error;
    +  Error.captureStackTrace(err, arguments.callee);
    +  var stack = err.stack;
    +  Error.prepareStackTrace = orig;
    +  return stack;
    +};
    diff --git a/cep/node_modules/callsite/package.json b/cep/node_modules/callsite/package.json
    new file mode 100644
    index 0000000..89fe224
    --- /dev/null
    +++ b/cep/node_modules/callsite/package.json
    @@ -0,0 +1,78 @@
    +{
    +  "_args": [
    +    [
    +      {
    +        "raw": "callsite@1.0.0",
    +        "scope": null,
    +        "escapedName": "callsite",
    +        "name": "callsite",
    +        "rawSpec": "1.0.0",
    +        "spec": "1.0.0",
    +        "type": "version"
    +      },
    +      "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\better-assert"
    +    ]
    +  ],
    +  "_from": "callsite@1.0.0",
    +  "_id": "callsite@1.0.0",
    +  "_inCache": true,
    +  "_installable": true,
    +  "_location": "/callsite",
    +  "_npmUser": {
    +    "name": "tjholowaychuk",
    +    "email": "tj@vision-media.ca"
    +  },
    +  "_npmVersion": "1.2.2",
    +  "_phantomChildren": {},
    +  "_requested": {
    +    "raw": "callsite@1.0.0",
    +    "scope": null,
    +    "escapedName": "callsite",
    +    "name": "callsite",
    +    "rawSpec": "1.0.0",
    +    "spec": "1.0.0",
    +    "type": "version"
    +  },
    +  "_requiredBy": [
    +    "/better-assert"
    +  ],
    +  "_resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
    +  "_shasum": "280398e5d664bd74038b6f0905153e6e8af1bc20",
    +  "_shrinkwrap": null,
    +  "_spec": "callsite@1.0.0",
    +  "_where": "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\better-assert",
    +  "author": {
    +    "name": "TJ Holowaychuk",
    +    "email": "tj@vision-media.ca"
    +  },
    +  "dependencies": {},
    +  "description": "access to v8's CallSites",
    +  "devDependencies": {
    +    "mocha": "*",
    +    "should": "*"
    +  },
    +  "directories": {},
    +  "dist": {
    +    "shasum": "280398e5d664bd74038b6f0905153e6e8af1bc20",
    +    "tarball": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz"
    +  },
    +  "engines": {
    +    "node": "*"
    +  },
    +  "keywords": [
    +    "stack",
    +    "trace",
    +    "line"
    +  ],
    +  "main": "index",
    +  "maintainers": [
    +    {
    +      "name": "tjholowaychuk",
    +      "email": "tj@vision-media.ca"
    +    }
    +  ],
    +  "name": "callsite",
    +  "optionalDependencies": {},
    +  "readme": "ERROR: No README data found!",
    +  "version": "1.0.0"
    +}
    diff --git a/cep/node_modules/component-bind/.npmignore b/cep/node_modules/component-bind/.npmignore
    new file mode 100644
    index 0000000..f1250e5
    --- /dev/null
    +++ b/cep/node_modules/component-bind/.npmignore
    @@ -0,0 +1,4 @@
    +support
    +test
    +examples
    +*.sock
    diff --git a/cep/node_modules/component-bind/History.md b/cep/node_modules/component-bind/History.md
    new file mode 100644
    index 0000000..2795fdb
    --- /dev/null
    +++ b/cep/node_modules/component-bind/History.md
    @@ -0,0 +1,13 @@
    +
    +1.0.0 / 2014-05-27
    +==================
    +
    +  * index: use slice ref (#7, @viatropos)
    +  * package: rename package to "component-bind"
    +  * package: add "repository" field (#6, @repoify)
    +  * package: add "component" section
    +
    +0.0.1 / 2010-01-03
    +==================
    +
    +  * Initial release
    diff --git a/cep/node_modules/component-bind/Makefile b/cep/node_modules/component-bind/Makefile
    new file mode 100644
    index 0000000..4e9c8d3
    --- /dev/null
    +++ b/cep/node_modules/component-bind/Makefile
    @@ -0,0 +1,7 @@
    +
    +test:
    +	@./node_modules/.bin/mocha \
    +		--require should \
    +		--reporter spec
    +
    +.PHONY: test
    \ No newline at end of file
    diff --git a/cep/node_modules/component-bind/Readme.md b/cep/node_modules/component-bind/Readme.md
    new file mode 100644
    index 0000000..6a8febc
    --- /dev/null
    +++ b/cep/node_modules/component-bind/Readme.md
    @@ -0,0 +1,64 @@
    +# bind
    +
    +  Function binding utility.
    +
    +## Installation
    +
    +```
    +$ component install component/bind
    +```
    +
    +## API
    +
    +   - [bind(obj, fn)](#bindobj-fn)
    +   - [bind(obj, fn, ...)](#bindobj-fn-)
    +   - [bind(obj, name)](#bindobj-name)
    +
    + 
    +
    +### bind(obj, fn)
    +should bind the function to the given object.
    +
    +```js
    +var tobi = { name: 'tobi' };
    +
    +function name() {
    +  return this.name;
    +}
    +
    +var fn = bind(tobi, name);
    +fn().should.equal('tobi');
    +```
    +
    +
    +### bind(obj, fn, ...)
    +should curry the remaining arguments.
    +
    +```js
    +function add(a, b) {
    +  return a + b;
    +}
    +
    +bind(null, add)(1, 2).should.equal(3);
    +bind(null, add, 1)(2).should.equal(3);
    +bind(null, add, 1, 2)().should.equal(3);
    +```
    +
    +
    +### bind(obj, name)
    +should bind the method of the given name.
    +
    +```js
    +var tobi = { name: 'tobi' };
    +
    +tobi.getName = function() {
    +  return this.name;
    +};
    +
    +var fn = bind(tobi, 'getName');
    +fn().should.equal('tobi');
    +```
    +
    +## License 
    +
    +  MIT
    \ No newline at end of file
    diff --git a/cep/node_modules/component-bind/component.json b/cep/node_modules/component-bind/component.json
    new file mode 100644
    index 0000000..4e1e93f
    --- /dev/null
    +++ b/cep/node_modules/component-bind/component.json
    @@ -0,0 +1,13 @@
    +{
    +  "name": "bind",
    +  "version": "1.0.0",
    +  "description": "function binding utility",
    +  "keywords": [
    +    "bind",
    +    "utility"
    +  ],
    +  "dependencies": {},
    +  "scripts": [
    +    "index.js"
    +  ]
    +}
    diff --git a/cep/node_modules/component-bind/index.js b/cep/node_modules/component-bind/index.js
    new file mode 100644
    index 0000000..4eeb2c0
    --- /dev/null
    +++ b/cep/node_modules/component-bind/index.js
    @@ -0,0 +1,23 @@
    +/**
    + * Slice reference.
    + */
    +
    +var slice = [].slice;
    +
    +/**
    + * Bind `obj` to `fn`.
    + *
    + * @param {Object} obj
    + * @param {Function|String} fn or string
    + * @return {Function}
    + * @api public
    + */
    +
    +module.exports = function(obj, fn){
    +  if ('string' == typeof fn) fn = obj[fn];
    +  if ('function' != typeof fn) throw new Error('bind() requires a function');
    +  var args = slice.call(arguments, 2);
    +  return function(){
    +    return fn.apply(obj, args.concat(slice.call(arguments)));
    +  }
    +};
    diff --git a/cep/node_modules/component-bind/package.json b/cep/node_modules/component-bind/package.json
    new file mode 100644
    index 0000000..bffed85
    --- /dev/null
    +++ b/cep/node_modules/component-bind/package.json
    @@ -0,0 +1,82 @@
    +{
    +  "_args": [
    +    [
    +      {
    +        "raw": "component-bind@1.0.0",
    +        "scope": null,
    +        "escapedName": "component-bind",
    +        "name": "component-bind",
    +        "rawSpec": "1.0.0",
    +        "spec": "1.0.0",
    +        "type": "version"
    +      },
    +      "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\socket.io-client"
    +    ]
    +  ],
    +  "_from": "component-bind@1.0.0",
    +  "_id": "component-bind@1.0.0",
    +  "_inCache": true,
    +  "_installable": true,
    +  "_location": "/component-bind",
    +  "_npmUser": {
    +    "name": "tootallnate",
    +    "email": "nathan@tootallnate.net"
    +  },
    +  "_npmVersion": "1.4.9",
    +  "_phantomChildren": {},
    +  "_requested": {
    +    "raw": "component-bind@1.0.0",
    +    "scope": null,
    +    "escapedName": "component-bind",
    +    "name": "component-bind",
    +    "rawSpec": "1.0.0",
    +    "spec": "1.0.0",
    +    "type": "version"
    +  },
    +  "_requiredBy": [
    +    "/socket.io-client"
    +  ],
    +  "_resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
    +  "_shasum": "00c608ab7dcd93897c0009651b1d3a8e1e73bbd1",
    +  "_shrinkwrap": null,
    +  "_spec": "component-bind@1.0.0",
    +  "_where": "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\socket.io-client",
    +  "bugs": {
    +    "url": "https://github.com/component/bind/issues"
    +  },
    +  "component": {
    +    "scripts": {
    +      "bind/index.js": "index.js"
    +    }
    +  },
    +  "dependencies": {},
    +  "description": "function binding utility",
    +  "devDependencies": {
    +    "mocha": "*",
    +    "should": "*"
    +  },
    +  "directories": {},
    +  "dist": {
    +    "shasum": "00c608ab7dcd93897c0009651b1d3a8e1e73bbd1",
    +    "tarball": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz"
    +  },
    +  "homepage": "https://github.com/component/bind",
    +  "keywords": [
    +    "bind",
    +    "utility"
    +  ],
    +  "maintainers": [
    +    {
    +      "name": "tootallnate",
    +      "email": "nathan@tootallnate.net"
    +    }
    +  ],
    +  "name": "component-bind",
    +  "optionalDependencies": {},
    +  "readme": "ERROR: No README data found!",
    +  "repository": {
    +    "type": "git",
    +    "url": "git+https://github.com/component/bind.git"
    +  },
    +  "version": "1.0.0"
    +}
    diff --git a/cep/node_modules/component-emitter/.npmignore b/cep/node_modules/component-emitter/.npmignore
    new file mode 100644
    index 0000000..f05b1f2
    --- /dev/null
    +++ b/cep/node_modules/component-emitter/.npmignore
    @@ -0,0 +1,2 @@
    +node_modules
    +test
    diff --git a/cep/node_modules/component-emitter/.travis.yml b/cep/node_modules/component-emitter/.travis.yml
    new file mode 100644
    index 0000000..8750e3b
    --- /dev/null
    +++ b/cep/node_modules/component-emitter/.travis.yml
    @@ -0,0 +1,4 @@
    +node_js:
    +- "0.8"
    +- "0.10"
    +language: node_js
    \ No newline at end of file
    diff --git a/cep/node_modules/component-emitter/History.md b/cep/node_modules/component-emitter/History.md
    new file mode 100644
    index 0000000..b898ca6
    --- /dev/null
    +++ b/cep/node_modules/component-emitter/History.md
    @@ -0,0 +1,52 @@
    +
    +1.1.2 / 2014-02-10
    +==================
    +
    +  * package: rename to "component-emitter"
    +  * package: update "main" and "component" fields
    +  * Add license to Readme (same format as the other components)
    +  * created .npmignore
    +  * travis stuff
    +
    +1.1.1 / 2013-12-01
    +==================
    +
    +  * fix .once adding .on to the listener
    +  * docs: Emitter#off()
    +  * component: add `.repo` prop
    +
    +1.1.0 / 2013-10-20
    +==================
    +
    + * add `.addEventListener()` and `.removeEventListener()` aliases
    +
    +1.0.1 / 2013-06-27
    +==================
    +
    + * add support for legacy ie
    +
    +1.0.0 / 2013-02-26
    +==================
    +
    +  * add `.off()` support for removing all listeners
    +
    +0.0.6 / 2012-10-08
    +==================
    +
    +  * add `this._callbacks` initialization to prevent funky gotcha
    +
    +0.0.5 / 2012-09-07
    +==================
    +
    +  * fix `Emitter.call(this)` usage
    +
    +0.0.3 / 2012-07-11
    +==================
    +
    +  * add `.listeners()`
    +  * rename `.has()` to `.hasListeners()`
    +
    +0.0.2 / 2012-06-28
    +==================
    +
    +  * fix `.off()` with `.once()`-registered callbacks
    diff --git a/cep/node_modules/component-emitter/Makefile b/cep/node_modules/component-emitter/Makefile
    new file mode 100644
    index 0000000..4e9c8d3
    --- /dev/null
    +++ b/cep/node_modules/component-emitter/Makefile
    @@ -0,0 +1,7 @@
    +
    +test:
    +	@./node_modules/.bin/mocha \
    +		--require should \
    +		--reporter spec
    +
    +.PHONY: test
    \ No newline at end of file
    diff --git a/cep/node_modules/component-emitter/Readme.md b/cep/node_modules/component-emitter/Readme.md
    new file mode 100644
    index 0000000..0f3f9b9
    --- /dev/null
    +++ b/cep/node_modules/component-emitter/Readme.md
    @@ -0,0 +1,74 @@
    +# Emitter [![Build Status](https://travis-ci.org/component/emitter.png)](https://travis-ci.org/component/emitter)
    +
    +  Event emitter component.
    +
    +## Installation
    +
    +```
    +$ component install component/emitter
    +```
    +
    +## API
    +
    +### Emitter(obj)
    +
    +  The `Emitter` may also be used as a mixin. For example
    +  a "plain" object may become an emitter, or you may
    +  extend an existing prototype.
    +
    +  As an `Emitter` instance:
    +
    +```js
    +var Emitter = require('emitter');
    +var emitter = new Emitter;
    +emitter.emit('something');
    +```
    +
    +  As a mixin:
    +
    +```js
    +var Emitter = require('emitter');
    +var user = { name: 'tobi' };
    +Emitter(user);
    +
    +user.emit('im a user');
    +```
    +
    +  As a prototype mixin:
    +
    +```js
    +var Emitter = require('emitter');
    +Emitter(User.prototype);
    +```
    +
    +### Emitter#on(event, fn)
    +
    +  Register an `event` handler `fn`.
    +
    +### Emitter#once(event, fn)
    +
    +  Register a single-shot `event` handler `fn`,
    +  removed immediately after it is invoked the
    +  first time.
    +
    +### Emitter#off(event, fn)
    +
    +  * Pass `event` and `fn` to remove a listener.
    +  * Pass `event` to remove all listeners on that event.
    +  * Pass nothing to remove all listeners on all events.
    +
    +### Emitter#emit(event, ...)
    +
    +  Emit an `event` with variable option args.
    +
    +### Emitter#listeners(event)
    +
    +  Return an array of callbacks, or an empty array.
    +
    +### Emitter#hasListeners(event)
    +
    +  Check if this emitter has `event` handlers.
    +
    +## License
    +
    +MIT
    diff --git a/cep/node_modules/component-emitter/bower.json b/cep/node_modules/component-emitter/bower.json
    new file mode 100644
    index 0000000..c618d41
    --- /dev/null
    +++ b/cep/node_modules/component-emitter/bower.json
    @@ -0,0 +1,21 @@
    +{
    +  "name": "emitter",
    +  "description": "Event emitter",
    +  "keywords": [
    +    "emitter",
    +    "events"
    +  ],
    +  "version": "1.1.2",
    +  "license": "MIT",
    +  "main": "index.js",
    +  "homepage": "https://github.com/component/emitter",
    +  "ignore": [
    +    "**/.*",
    +    "node_modules",
    +    "bower_components",
    +    "test",
    +    "Makefile",
    +    "package.json",
    +    "component.json"
    +  ]
    +}
    diff --git a/cep/node_modules/component-emitter/component.json b/cep/node_modules/component-emitter/component.json
    new file mode 100644
    index 0000000..68ba0b1
    --- /dev/null
    +++ b/cep/node_modules/component-emitter/component.json
    @@ -0,0 +1,14 @@
    +{
    +  "name": "emitter",
    +  "repo": "component/emitter",
    +  "description": "Event emitter",
    +  "keywords": [
    +    "emitter",
    +    "events"
    +  ],
    +  "version": "1.1.2",
    +  "scripts": [
    +    "index.js"
    +  ],
    +  "license": "MIT"
    +}
    diff --git a/cep/node_modules/component-emitter/index.js b/cep/node_modules/component-emitter/index.js
    new file mode 100644
    index 0000000..ad71163
    --- /dev/null
    +++ b/cep/node_modules/component-emitter/index.js
    @@ -0,0 +1,164 @@
    +
    +/**
    + * Expose `Emitter`.
    + */
    +
    +module.exports = Emitter;
    +
    +/**
    + * Initialize a new `Emitter`.
    + *
    + * @api public
    + */
    +
    +function Emitter(obj) {
    +  if (obj) return mixin(obj);
    +};
    +
    +/**
    + * Mixin the emitter properties.
    + *
    + * @param {Object} obj
    + * @return {Object}
    + * @api private
    + */
    +
    +function mixin(obj) {
    +  for (var key in Emitter.prototype) {
    +    obj[key] = Emitter.prototype[key];
    +  }
    +  return obj;
    +}
    +
    +/**
    + * Listen on the given `event` with `fn`.
    + *
    + * @param {String} event
    + * @param {Function} fn
    + * @return {Emitter}
    + * @api public
    + */
    +
    +Emitter.prototype.on =
    +Emitter.prototype.addEventListener = function(event, fn){
    +  this._callbacks = this._callbacks || {};
    +  (this._callbacks[event] = this._callbacks[event] || [])
    +    .push(fn);
    +  return this;
    +};
    +
    +/**
    + * Adds an `event` listener that will be invoked a single
    + * time then automatically removed.
    + *
    + * @param {String} event
    + * @param {Function} fn
    + * @return {Emitter}
    + * @api public
    + */
    +
    +Emitter.prototype.once = function(event, fn){
    +  var self = this;
    +  this._callbacks = this._callbacks || {};
    +
    +  function on() {
    +    self.off(event, on);
    +    fn.apply(this, arguments);
    +  }
    +
    +  on.fn = fn;
    +  this.on(event, on);
    +  return this;
    +};
    +
    +/**
    + * Remove the given callback for `event` or all
    + * registered callbacks.
    + *
    + * @param {String} event
    + * @param {Function} fn
    + * @return {Emitter}
    + * @api public
    + */
    +
    +Emitter.prototype.off =
    +Emitter.prototype.removeListener =
    +Emitter.prototype.removeAllListeners =
    +Emitter.prototype.removeEventListener = function(event, fn){
    +  this._callbacks = this._callbacks || {};
    +
    +  // all
    +  if (0 == arguments.length) {
    +    this._callbacks = {};
    +    return this;
    +  }
    +
    +  // specific event
    +  var callbacks = this._callbacks[event];
    +  if (!callbacks) return this;
    +
    +  // remove all handlers
    +  if (1 == arguments.length) {
    +    delete this._callbacks[event];
    +    return this;
    +  }
    +
    +  // remove specific handler
    +  var cb;
    +  for (var i = 0; i < callbacks.length; i++) {
    +    cb = callbacks[i];
    +    if (cb === fn || cb.fn === fn) {
    +      callbacks.splice(i, 1);
    +      break;
    +    }
    +  }
    +  return this;
    +};
    +
    +/**
    + * Emit `event` with the given args.
    + *
    + * @param {String} event
    + * @param {Mixed} ...
    + * @return {Emitter}
    + */
    +
    +Emitter.prototype.emit = function(event){
    +  this._callbacks = this._callbacks || {};
    +  var args = [].slice.call(arguments, 1)
    +    , callbacks = this._callbacks[event];
    +
    +  if (callbacks) {
    +    callbacks = callbacks.slice(0);
    +    for (var i = 0, len = callbacks.length; i < len; ++i) {
    +      callbacks[i].apply(this, args);
    +    }
    +  }
    +
    +  return this;
    +};
    +
    +/**
    + * Return array of callbacks for `event`.
    + *
    + * @param {String} event
    + * @return {Array}
    + * @api public
    + */
    +
    +Emitter.prototype.listeners = function(event){
    +  this._callbacks = this._callbacks || {};
    +  return this._callbacks[event] || [];
    +};
    +
    +/**
    + * Check if this emitter has `event` handlers.
    + *
    + * @param {String} event
    + * @return {Boolean}
    + * @api public
    + */
    +
    +Emitter.prototype.hasListeners = function(event){
    +  return !! this.listeners(event).length;
    +};
    diff --git a/cep/node_modules/component-emitter/package.json b/cep/node_modules/component-emitter/package.json
    new file mode 100644
    index 0000000..f735419
    --- /dev/null
    +++ b/cep/node_modules/component-emitter/package.json
    @@ -0,0 +1,84 @@
    +{
    +  "_args": [
    +    [
    +      {
    +        "raw": "component-emitter@1.1.2",
    +        "scope": null,
    +        "escapedName": "component-emitter",
    +        "name": "component-emitter",
    +        "rawSpec": "1.1.2",
    +        "spec": "1.1.2",
    +        "type": "version"
    +      },
    +      "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\socket.io-adapter\\node_modules\\socket.io-parser"
    +    ]
    +  ],
    +  "_from": "component-emitter@1.1.2",
    +  "_id": "component-emitter@1.1.2",
    +  "_inCache": true,
    +  "_installable": true,
    +  "_location": "/component-emitter",
    +  "_npmUser": {
    +    "name": "tootallnate",
    +    "email": "nathan@tootallnate.net"
    +  },
    +  "_npmVersion": "1.3.24",
    +  "_phantomChildren": {},
    +  "_requested": {
    +    "raw": "component-emitter@1.1.2",
    +    "scope": null,
    +    "escapedName": "component-emitter",
    +    "name": "component-emitter",
    +    "rawSpec": "1.1.2",
    +    "spec": "1.1.2",
    +    "type": "version"
    +  },
    +  "_requiredBy": [
    +    "/engine.io-client",
    +    "/socket.io-adapter/socket.io-parser",
    +    "/socket.io-parser"
    +  ],
    +  "_resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz",
    +  "_shasum": "296594f2753daa63996d2af08d15a95116c9aec3",
    +  "_shrinkwrap": null,
    +  "_spec": "component-emitter@1.1.2",
    +  "_where": "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\socket.io-adapter\\node_modules\\socket.io-parser",
    +  "bugs": {
    +    "url": "https://github.com/component/emitter/issues"
    +  },
    +  "component": {
    +    "scripts": {
    +      "emitter/index.js": "index.js"
    +    }
    +  },
    +  "dependencies": {},
    +  "description": "Event emitter",
    +  "devDependencies": {
    +    "mocha": "*",
    +    "should": "*"
    +  },
    +  "directories": {},
    +  "dist": {
    +    "shasum": "296594f2753daa63996d2af08d15a95116c9aec3",
    +    "tarball": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz"
    +  },
    +  "homepage": "https://github.com/component/emitter",
    +  "main": "index.js",
    +  "maintainers": [
    +    {
    +      "name": "tootallnate",
    +      "email": "nathan@tootallnate.net"
    +    }
    +  ],
    +  "name": "component-emitter",
    +  "optionalDependencies": {},
    +  "readme": "ERROR: No README data found!",
    +  "repository": {
    +    "type": "git",
    +    "url": "git+https://github.com/component/emitter.git"
    +  },
    +  "scripts": {
    +    "test": "make test"
    +  },
    +  "version": "1.1.2"
    +}
    diff --git a/cep/node_modules/component-inherit/.npmignore b/cep/node_modules/component-inherit/.npmignore
    new file mode 100644
    index 0000000..665aa21
    --- /dev/null
    +++ b/cep/node_modules/component-inherit/.npmignore
    @@ -0,0 +1,3 @@
    +components
    +build
    +node_modules
    diff --git a/cep/node_modules/component-inherit/History.md b/cep/node_modules/component-inherit/History.md
    new file mode 100644
    index 0000000..22d87e1
    --- /dev/null
    +++ b/cep/node_modules/component-inherit/History.md
    @@ -0,0 +1,5 @@
    +
    +0.0.2 / 2012-09-03 
    +==================
    +
    +  * fix typo in package.json
    diff --git a/cep/node_modules/component-inherit/Makefile b/cep/node_modules/component-inherit/Makefile
    new file mode 100644
    index 0000000..ebbc52a
    --- /dev/null
    +++ b/cep/node_modules/component-inherit/Makefile
    @@ -0,0 +1,16 @@
    +
    +build: components index.js
    +	@component build
    +
    +components:
    +	@Component install
    +
    +clean:
    +	rm -fr build components template.js
    +
    +test:
    +	@node_modules/.bin/mocha \
    +		--require should \
    +		--reporter spec
    +
    +.PHONY: clean test
    diff --git a/cep/node_modules/component-inherit/Readme.md b/cep/node_modules/component-inherit/Readme.md
    new file mode 100644
    index 0000000..f03ab27
    --- /dev/null
    +++ b/cep/node_modules/component-inherit/Readme.md
    @@ -0,0 +1,24 @@
    +# inherit
    +
    +  Prototype inheritance utility.
    +
    +## Installation
    +
    +```
    +$ component install component/inherit
    +```
    +
    +## Example
    +
    +```js
    +var inherit = require('inherit');
    +
    +function Human() {}
    +function Woman() {}
    +
    +inherit(Woman, Human);
    +```
    +
    +## License
    +
    +  MIT
    diff --git a/cep/node_modules/component-inherit/component.json b/cep/node_modules/component-inherit/component.json
    new file mode 100644
    index 0000000..ae57747
    --- /dev/null
    +++ b/cep/node_modules/component-inherit/component.json
    @@ -0,0 +1,10 @@
    +{
    +  "name": "inherit",
    +  "description": "Prototype inheritance utility",
    +  "version": "0.0.3",
    +  "keywords": ["inherit", "utility"],
    +  "dependencies": {},
    +  "scripts": [
    +    "index.js"
    +  ]
    +}
    diff --git a/cep/node_modules/component-inherit/index.js b/cep/node_modules/component-inherit/index.js
    new file mode 100644
    index 0000000..aaebc03
    --- /dev/null
    +++ b/cep/node_modules/component-inherit/index.js
    @@ -0,0 +1,7 @@
    +
    +module.exports = function(a, b){
    +  var fn = function(){};
    +  fn.prototype = b.prototype;
    +  a.prototype = new fn;
    +  a.prototype.constructor = a;
    +};
    \ No newline at end of file
    diff --git a/cep/node_modules/component-inherit/package.json b/cep/node_modules/component-inherit/package.json
    new file mode 100644
    index 0000000..6f5357e
    --- /dev/null
    +++ b/cep/node_modules/component-inherit/package.json
    @@ -0,0 +1,79 @@
    +{
    +  "_args": [
    +    [
    +      {
    +        "raw": "component-inherit@0.0.3",
    +        "scope": null,
    +        "escapedName": "component-inherit",
    +        "name": "component-inherit",
    +        "rawSpec": "0.0.3",
    +        "spec": "0.0.3",
    +        "type": "version"
    +      },
    +      "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\engine.io-client"
    +    ]
    +  ],
    +  "_from": "component-inherit@0.0.3",
    +  "_id": "component-inherit@0.0.3",
    +  "_inCache": true,
    +  "_installable": true,
    +  "_location": "/component-inherit",
    +  "_npmUser": {
    +    "name": "coreh",
    +    "email": "thecoreh@gmail.com"
    +  },
    +  "_npmVersion": "1.3.24",
    +  "_phantomChildren": {},
    +  "_requested": {
    +    "raw": "component-inherit@0.0.3",
    +    "scope": null,
    +    "escapedName": "component-inherit",
    +    "name": "component-inherit",
    +    "rawSpec": "0.0.3",
    +    "spec": "0.0.3",
    +    "type": "version"
    +  },
    +  "_requiredBy": [
    +    "/engine.io-client"
    +  ],
    +  "_resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
    +  "_shasum": "645fc4adf58b72b649d5cae65135619db26ff143",
    +  "_shrinkwrap": null,
    +  "_spec": "component-inherit@0.0.3",
    +  "_where": "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\engine.io-client",
    +  "bugs": {
    +    "url": "https://github.com/component/inherit/issues"
    +  },
    +  "component": {
    +    "scripts": {
    +      "inherit/index.js": "index.js"
    +    }
    +  },
    +  "dependencies": {},
    +  "description": "Prototype inheritance utility",
    +  "devDependencies": {},
    +  "directories": {},
    +  "dist": {
    +    "shasum": "645fc4adf58b72b649d5cae65135619db26ff143",
    +    "tarball": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz"
    +  },
    +  "homepage": "https://github.com/component/inherit",
    +  "keywords": [
    +    "inherit",
    +    "utility"
    +  ],
    +  "maintainers": [
    +    {
    +      "name": "coreh",
    +      "email": "thecoreh@gmail.com"
    +    }
    +  ],
    +  "name": "component-inherit",
    +  "optionalDependencies": {},
    +  "readme": "ERROR: No README data found!",
    +  "repository": {
    +    "type": "git",
    +    "url": "git+https://github.com/component/inherit.git"
    +  },
    +  "version": "0.0.3"
    +}
    diff --git a/cep/node_modules/component-inherit/test/inherit.js b/cep/node_modules/component-inherit/test/inherit.js
    new file mode 100644
    index 0000000..14852f2
    --- /dev/null
    +++ b/cep/node_modules/component-inherit/test/inherit.js
    @@ -0,0 +1,21 @@
    +
    +/**
    + * Module dependencies.
    + */
    +
    +var inherit = require('..');
    +
    +describe('inherit(a, b)', function(){
    +  it('should inherit b\'s prototype', function(){
    +    function Loki(){}
    +    function Animal(){}
    +
    +    Animal.prototype.species = 'unknown';
    +
    +    inherit(Loki, Animal);
    +
    +    var loki = new Loki;
    +    loki.species.should.equal('unknown');
    +    loki.constructor.should.equal(Loki);
    +  })
    +})
    \ No newline at end of file
    diff --git a/cep/node_modules/debug/.jshintrc b/cep/node_modules/debug/.jshintrc
    new file mode 100644
    index 0000000..299877f
    --- /dev/null
    +++ b/cep/node_modules/debug/.jshintrc
    @@ -0,0 +1,3 @@
    +{
    +  "laxbreak": true
    +}
    diff --git a/cep/node_modules/debug/.npmignore b/cep/node_modules/debug/.npmignore
    new file mode 100644
    index 0000000..7e6163d
    --- /dev/null
    +++ b/cep/node_modules/debug/.npmignore
    @@ -0,0 +1,6 @@
    +support
    +test
    +examples
    +example
    +*.sock
    +dist
    diff --git a/cep/node_modules/debug/History.md b/cep/node_modules/debug/History.md
    new file mode 100644
    index 0000000..854c971
    --- /dev/null
    +++ b/cep/node_modules/debug/History.md
    @@ -0,0 +1,195 @@
    +
    +2.2.0 / 2015-05-09
    +==================
    +
    +  * package: update "ms" to v0.7.1 (#202, @dougwilson)
    +  * README: add logging to file example (#193, @DanielOchoa)
    +  * README: fixed a typo (#191, @amir-s)
    +  * browser: expose `storage` (#190, @stephenmathieson)
    +  * Makefile: add a `distclean` target (#189, @stephenmathieson)
    +
    +2.1.3 / 2015-03-13
    +==================
    +
    +  * Updated stdout/stderr example (#186)
    +  * Updated example/stdout.js to match debug current behaviour
    +  * Renamed example/stderr.js to stdout.js
    +  * Update Readme.md (#184)
    +  * replace high intensity foreground color for bold (#182, #183)
    +
    +2.1.2 / 2015-03-01
    +==================
    +
    +  * dist: recompile
    +  * update "ms" to v0.7.0
    +  * package: update "browserify" to v9.0.3
    +  * component: fix "ms.js" repo location
    +  * changed bower package name
    +  * updated documentation about using debug in a browser
    +  * fix: security error on safari (#167, #168, @yields)
    +
    +2.1.1 / 2014-12-29
    +==================
    +
    +  * browser: use `typeof` to check for `console` existence
    +  * browser: check for `console.log` truthiness (fix IE 8/9)
    +  * browser: add support for Chrome apps
    +  * Readme: added Windows usage remarks
    +  * Add `bower.json` to properly support bower install
    +
    +2.1.0 / 2014-10-15
    +==================
    +
    +  * node: implement `DEBUG_FD` env variable support
    +  * package: update "browserify" to v6.1.0
    +  * package: add "license" field to package.json (#135, @panuhorsmalahti)
    +
    +2.0.0 / 2014-09-01
    +==================
    +
    +  * package: update "browserify" to v5.11.0
    +  * node: use stderr rather than stdout for logging (#29, @stephenmathieson)
    +
    +1.0.4 / 2014-07-15
    +==================
    +
    +  * dist: recompile
    +  * example: remove `console.info()` log usage
    +  * example: add "Content-Type" UTF-8 header to browser example
    +  * browser: place %c marker after the space character
    +  * browser: reset the "content" color via `color: inherit`
    +  * browser: add colors support for Firefox >= v31
    +  * debug: prefer an instance `log()` function over the global one (#119)
    +  * Readme: update documentation about styled console logs for FF v31 (#116, @wryk)
    +
    +1.0.3 / 2014-07-09
    +==================
    +
    +  * Add support for multiple wildcards in namespaces (#122, @seegno)
    +  * browser: fix lint
    +
    +1.0.2 / 2014-06-10
    +==================
    +
    +  * browser: update color palette (#113, @gscottolson)
    +  * common: make console logging function configurable (#108, @timoxley)
    +  * node: fix %o colors on old node <= 0.8.x
    +  * Makefile: find node path using shell/which (#109, @timoxley)
    +
    +1.0.1 / 2014-06-06
    +==================
    +
    +  * browser: use `removeItem()` to clear localStorage
    +  * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777)
    +  * package: add "contributors" section
    +  * node: fix comment typo
    +  * README: list authors
    +
    +1.0.0 / 2014-06-04
    +==================
    +
    +  * make ms diff be global, not be scope
    +  * debug: ignore empty strings in enable()
    +  * node: make DEBUG_COLORS able to disable coloring
    +  * *: export the `colors` array
    +  * npmignore: don't publish the `dist` dir
    +  * Makefile: refactor to use browserify
    +  * package: add "browserify" as a dev dependency
    +  * Readme: add Web Inspector Colors section
    +  * node: reset terminal color for the debug content
    +  * node: map "%o" to `util.inspect()`
    +  * browser: map "%j" to `JSON.stringify()`
    +  * debug: add custom "formatters"
    +  * debug: use "ms" module for humanizing the diff
    +  * Readme: add "bash" syntax highlighting
    +  * browser: add Firebug color support
    +  * browser: add colors for WebKit browsers
    +  * node: apply log to `console`
    +  * rewrite: abstract common logic for Node & browsers
    +  * add .jshintrc file
    +
    +0.8.1 / 2014-04-14
    +==================
    +
    +  * package: re-add the "component" section
    +
    +0.8.0 / 2014-03-30
    +==================
    +
    +  * add `enable()` method for nodejs. Closes #27
    +  * change from stderr to stdout
    +  * remove unnecessary index.js file
    +
    +0.7.4 / 2013-11-13
    +==================
    +
    +  * remove "browserify" key from package.json (fixes something in browserify)
    +
    +0.7.3 / 2013-10-30
    +==================
    +
    +  * fix: catch localStorage security error when cookies are blocked (Chrome)
    +  * add debug(err) support. Closes #46
    +  * add .browser prop to package.json. Closes #42
    +
    +0.7.2 / 2013-02-06
    +==================
    +
    +  * fix package.json
    +  * fix: Mobile Safari (private mode) is broken with debug
    +  * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript
    +
    +0.7.1 / 2013-02-05
    +==================
    +
    +  * add repository URL to package.json
    +  * add DEBUG_COLORED to force colored output
    +  * add browserify support
    +  * fix component. Closes #24
    +
    +0.7.0 / 2012-05-04
    +==================
    +
    +  * Added .component to package.json
    +  * Added debug.component.js build
    +
    +0.6.0 / 2012-03-16
    +==================
    +
    +  * Added support for "-" prefix in DEBUG [Vinay Pulim]
    +  * Added `.enabled` flag to the node version [TooTallNate]
    +
    +0.5.0 / 2012-02-02
    +==================
    +
    +  * Added: humanize diffs. Closes #8
    +  * Added `debug.disable()` to the CS variant
    +  * Removed padding. Closes #10
    +  * Fixed: persist client-side variant again. Closes #9
    +
    +0.4.0 / 2012-02-01
    +==================
    +
    +  * Added browser variant support for older browsers [TooTallNate]
    +  * Added `debug.enable('project:*')` to browser variant [TooTallNate]
    +  * Added padding to diff (moved it to the right)
    +
    +0.3.0 / 2012-01-26
    +==================
    +
    +  * Added millisecond diff when isatty, otherwise UTC string
    +
    +0.2.0 / 2012-01-22
    +==================
    +
    +  * Added wildcard support
    +
    +0.1.0 / 2011-12-02
    +==================
    +
    +  * Added: remove colors unless stderr isatty [TooTallNate]
    +
    +0.0.1 / 2010-01-03
    +==================
    +
    +  * Initial release
    diff --git a/cep/node_modules/debug/Makefile b/cep/node_modules/debug/Makefile
    new file mode 100644
    index 0000000..5cf4a59
    --- /dev/null
    +++ b/cep/node_modules/debug/Makefile
    @@ -0,0 +1,36 @@
    +
    +# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
    +THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
    +THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)
    +
    +# BIN directory
    +BIN := $(THIS_DIR)/node_modules/.bin
    +
    +# applications
    +NODE ?= $(shell which node)
    +NPM ?= $(NODE) $(shell which npm)
    +BROWSERIFY ?= $(NODE) $(BIN)/browserify
    +
    +all: dist/debug.js
    +
    +install: node_modules
    +
    +clean:
    +	@rm -rf dist
    +
    +dist:
    +	@mkdir -p $@
    +
    +dist/debug.js: node_modules browser.js debug.js dist
    +	@$(BROWSERIFY) \
    +		--standalone debug \
    +		. > $@
    +
    +distclean: clean
    +	@rm -rf node_modules
    +
    +node_modules: package.json
    +	@NODE_ENV= $(NPM) install
    +	@touch node_modules
    +
    +.PHONY: all install clean distclean
    diff --git a/cep/node_modules/debug/Readme.md b/cep/node_modules/debug/Readme.md
    new file mode 100644
    index 0000000..b4f45e3
    --- /dev/null
    +++ b/cep/node_modules/debug/Readme.md
    @@ -0,0 +1,188 @@
    +# debug
    +
    +  tiny node.js debugging utility modelled after node core's debugging technique.
    +
    +## Installation
    +
    +```bash
    +$ npm install debug
    +```
    +
    +## Usage
    +
    + With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility.
    +
    +Example _app.js_:
    +
    +```js
    +var debug = require('debug')('http')
    +  , http = require('http')
    +  , name = 'My App';
    +
    +// fake app
    +
    +debug('booting %s', name);
    +
    +http.createServer(function(req, res){
    +  debug(req.method + ' ' + req.url);
    +  res.end('hello\n');
    +}).listen(3000, function(){
    +  debug('listening');
    +});
    +
    +// fake worker of some kind
    +
    +require('./worker');
    +```
    +
    +Example _worker.js_:
    +
    +```js
    +var debug = require('debug')('worker');
    +
    +setInterval(function(){
    +  debug('doing some work');
    +}, 1000);
    +```
    +
    + The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples:
    +
    +  ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png)
    +
    +  ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png)
    +
    +#### Windows note
    +
    + On Windows the environment variable is set using the `set` command.
    +
    + ```cmd
    + set DEBUG=*,-not_this
    + ```
    +
    +Then, run the program to be debugged as usual.
    +
    +## Millisecond diff
    +
    +  When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls.
    +
    +  ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png)
    +
    +  When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below:
    +
    +  ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png)
    +
    +## Conventions
    +
    + If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser".
    +
    +## Wildcards
    +
    +  The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.
    +
    +  You can also exclude specific debuggers by prefixing them with a "-" character.  For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:".
    +
    +## Browser support
    +
    +  Debug works in the browser as well, currently persisted by `localStorage`. Consider the situation shown below where you have `worker:a` and `worker:b`, and wish to debug both. Somewhere in the code on your page, include:
    +
    +```js
    +window.myDebug = require("debug");
    +```
    +
    +  ("debug" is a global object in the browser so we give this object a different name.) When your page is open in the browser, type the following in the console:
    +
    +```js
    +myDebug.enable("worker:*")
    +```
    +
    +  Refresh the page. Debug output will continue to be sent to the console until it is disabled by typing `myDebug.disable()` in the console.
    +
    +```js
    +a = debug('worker:a');
    +b = debug('worker:b');
    +
    +setInterval(function(){
    +  a('doing some work');
    +}, 1000);
    +
    +setInterval(function(){
    +  b('doing some work');
    +}, 1200);
    +```
    +
    +#### Web Inspector Colors
    +
    +  Colors are also enabled on "Web Inspectors" that understand the `%c` formatting
    +  option. These are WebKit web inspectors, Firefox ([since version
    +  31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/))
    +  and the Firebug plugin for Firefox (any version).
    +
    +  Colored output looks something like:
    +
    +  ![](https://cloud.githubusercontent.com/assets/71256/3139768/b98c5fd8-e8ef-11e3-862a-f7253b6f47c6.png)
    +
    +### stderr vs stdout
    +
    +You can set an alternative logging method per-namespace by overriding the `log` method on a per-namespace or globally:
    +
    +Example _stdout.js_:
    +
    +```js
    +var debug = require('debug');
    +var error = debug('app:error');
    +
    +// by default stderr is used
    +error('goes to stderr!');
    +
    +var log = debug('app:log');
    +// set this namespace to log via console.log
    +log.log = console.log.bind(console); // don't forget to bind to console!
    +log('goes to stdout');
    +error('still goes to stderr!');
    +
    +// set all output to go via console.info
    +// overrides all per-namespace log settings
    +debug.log = console.info.bind(console);
    +error('now goes to stdout via console.info');
    +log('still goes to stdout, but via console.info now');
    +```
    +
    +### Save debug output to a file
    +
    +You can save all debug statements to a file by piping them.
    +
    +Example:
    +
    +```bash
    +$ DEBUG_FD=3 node your-app.js 3> whatever.log
    +```
    +
    +## Authors
    +
    + - TJ Holowaychuk
    + - Nathan Rajlich
    +
    +## License
    +
    +(The MIT License)
    +
    +Copyright (c) 2014 TJ Holowaychuk <tj@vision-media.ca>
    +
    +Permission is hereby granted, free of charge, to any person obtaining
    +a copy of this software and associated documentation files (the
    +'Software'), to deal in the Software without restriction, including
    +without limitation the rights to use, copy, modify, merge, publish,
    +distribute, sublicense, and/or sell copies of the Software, and to
    +permit persons to whom the Software is furnished to do so, subject to
    +the following conditions:
    +
    +The above copyright notice and this permission notice shall be
    +included in all copies or substantial portions of the Software.
    +
    +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
    +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
    +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
    +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
    +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
    +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    diff --git a/cep/node_modules/debug/bower.json b/cep/node_modules/debug/bower.json
    new file mode 100644
    index 0000000..6af573f
    --- /dev/null
    +++ b/cep/node_modules/debug/bower.json
    @@ -0,0 +1,28 @@
    +{
    +  "name": "visionmedia-debug",
    +  "main": "dist/debug.js",
    +  "version": "2.2.0",
    +  "homepage": "https://github.com/visionmedia/debug",
    +  "authors": [
    +    "TJ Holowaychuk "
    +  ],
    +  "description": "visionmedia-debug",
    +  "moduleType": [
    +    "amd",
    +    "es6",
    +    "globals",
    +    "node"
    +  ],
    +  "keywords": [
    +    "visionmedia",
    +    "debug"
    +  ],
    +  "license": "MIT",
    +  "ignore": [
    +    "**/.*",
    +    "node_modules",
    +    "bower_components",
    +    "test",
    +    "tests"
    +  ]
    +}
    diff --git a/cep/node_modules/debug/browser.js b/cep/node_modules/debug/browser.js
    new file mode 100644
    index 0000000..7c76452
    --- /dev/null
    +++ b/cep/node_modules/debug/browser.js
    @@ -0,0 +1,168 @@
    +
    +/**
    + * This is the web browser implementation of `debug()`.
    + *
    + * Expose `debug()` as the module.
    + */
    +
    +exports = module.exports = require('./debug');
    +exports.log = log;
    +exports.formatArgs = formatArgs;
    +exports.save = save;
    +exports.load = load;
    +exports.useColors = useColors;
    +exports.storage = 'undefined' != typeof chrome
    +               && 'undefined' != typeof chrome.storage
    +                  ? chrome.storage.local
    +                  : localstorage();
    +
    +/**
    + * Colors.
    + */
    +
    +exports.colors = [
    +  'lightseagreen',
    +  'forestgreen',
    +  'goldenrod',
    +  'dodgerblue',
    +  'darkorchid',
    +  'crimson'
    +];
    +
    +/**
    + * Currently only WebKit-based Web Inspectors, Firefox >= v31,
    + * and the Firebug extension (any Firefox version) are known
    + * to support "%c" CSS customizations.
    + *
    + * TODO: add a `localStorage` variable to explicitly enable/disable colors
    + */
    +
    +function useColors() {
    +  // is webkit? http://stackoverflow.com/a/16459606/376773
    +  return ('WebkitAppearance' in document.documentElement.style) ||
    +    // is firebug? http://stackoverflow.com/a/398120/376773
    +    (window.console && (console.firebug || (console.exception && console.table))) ||
    +    // is firefox >= v31?
    +    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
    +    (navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31);
    +}
    +
    +/**
    + * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
    + */
    +
    +exports.formatters.j = function(v) {
    +  return JSON.stringify(v);
    +};
    +
    +
    +/**
    + * Colorize log arguments if enabled.
    + *
    + * @api public
    + */
    +
    +function formatArgs() {
    +  var args = arguments;
    +  var useColors = this.useColors;
    +
    +  args[0] = (useColors ? '%c' : '')
    +    + this.namespace
    +    + (useColors ? ' %c' : ' ')
    +    + args[0]
    +    + (useColors ? '%c ' : ' ')
    +    + '+' + exports.humanize(this.diff);
    +
    +  if (!useColors) return args;
    +
    +  var c = 'color: ' + this.color;
    +  args = [args[0], c, 'color: inherit'].concat(Array.prototype.slice.call(args, 1));
    +
    +  // the final "%c" is somewhat tricky, because there could be other
    +  // arguments passed either before or after the %c, so we need to
    +  // figure out the correct index to insert the CSS into
    +  var index = 0;
    +  var lastC = 0;
    +  args[0].replace(/%[a-z%]/g, function(match) {
    +    if ('%%' === match) return;
    +    index++;
    +    if ('%c' === match) {
    +      // we only are interested in the *last* %c
    +      // (the user may have provided their own)
    +      lastC = index;
    +    }
    +  });
    +
    +  args.splice(lastC, 0, c);
    +  return args;
    +}
    +
    +/**
    + * Invokes `console.log()` when available.
    + * No-op when `console.log` is not a "function".
    + *
    + * @api public
    + */
    +
    +function log() {
    +  // this hackery is required for IE8/9, where
    +  // the `console.log` function doesn't have 'apply'
    +  return 'object' === typeof console
    +    && console.log
    +    && Function.prototype.apply.call(console.log, console, arguments);
    +}
    +
    +/**
    + * Save `namespaces`.
    + *
    + * @param {String} namespaces
    + * @api private
    + */
    +
    +function save(namespaces) {
    +  try {
    +    if (null == namespaces) {
    +      exports.storage.removeItem('debug');
    +    } else {
    +      exports.storage.debug = namespaces;
    +    }
    +  } catch(e) {}
    +}
    +
    +/**
    + * Load `namespaces`.
    + *
    + * @return {String} returns the previously persisted debug modes
    + * @api private
    + */
    +
    +function load() {
    +  var r;
    +  try {
    +    r = exports.storage.debug;
    +  } catch(e) {}
    +  return r;
    +}
    +
    +/**
    + * Enable namespaces listed in `localStorage.debug` initially.
    + */
    +
    +exports.enable(load());
    +
    +/**
    + * Localstorage attempts to return the localstorage.
    + *
    + * This is necessary because safari throws
    + * when a user disables cookies/localstorage
    + * and you attempt to access it.
    + *
    + * @return {LocalStorage}
    + * @api private
    + */
    +
    +function localstorage(){
    +  try {
    +    return window.localStorage;
    +  } catch (e) {}
    +}
    diff --git a/cep/node_modules/debug/component.json b/cep/node_modules/debug/component.json
    new file mode 100644
    index 0000000..ca10637
    --- /dev/null
    +++ b/cep/node_modules/debug/component.json
    @@ -0,0 +1,19 @@
    +{
    +  "name": "debug",
    +  "repo": "visionmedia/debug",
    +  "description": "small debugging utility",
    +  "version": "2.2.0",
    +  "keywords": [
    +    "debug",
    +    "log",
    +    "debugger"
    +  ],
    +  "main": "browser.js",
    +  "scripts": [
    +    "browser.js",
    +    "debug.js"
    +  ],
    +  "dependencies": {
    +    "rauchg/ms.js": "0.7.1"
    +  }
    +}
    diff --git a/cep/node_modules/debug/debug.js b/cep/node_modules/debug/debug.js
    new file mode 100644
    index 0000000..7571a86
    --- /dev/null
    +++ b/cep/node_modules/debug/debug.js
    @@ -0,0 +1,197 @@
    +
    +/**
    + * This is the common logic for both the Node.js and web browser
    + * implementations of `debug()`.
    + *
    + * Expose `debug()` as the module.
    + */
    +
    +exports = module.exports = debug;
    +exports.coerce = coerce;
    +exports.disable = disable;
    +exports.enable = enable;
    +exports.enabled = enabled;
    +exports.humanize = require('ms');
    +
    +/**
    + * The currently active debug mode names, and names to skip.
    + */
    +
    +exports.names = [];
    +exports.skips = [];
    +
    +/**
    + * Map of special "%n" handling functions, for the debug "format" argument.
    + *
    + * Valid key names are a single, lowercased letter, i.e. "n".
    + */
    +
    +exports.formatters = {};
    +
    +/**
    + * Previously assigned color.
    + */
    +
    +var prevColor = 0;
    +
    +/**
    + * Previous log timestamp.
    + */
    +
    +var prevTime;
    +
    +/**
    + * Select a color.
    + *
    + * @return {Number}
    + * @api private
    + */
    +
    +function selectColor() {
    +  return exports.colors[prevColor++ % exports.colors.length];
    +}
    +
    +/**
    + * Create a debugger with the given `namespace`.
    + *
    + * @param {String} namespace
    + * @return {Function}
    + * @api public
    + */
    +
    +function debug(namespace) {
    +
    +  // define the `disabled` version
    +  function disabled() {
    +  }
    +  disabled.enabled = false;
    +
    +  // define the `enabled` version
    +  function enabled() {
    +
    +    var self = enabled;
    +
    +    // set `diff` timestamp
    +    var curr = +new Date();
    +    var ms = curr - (prevTime || curr);
    +    self.diff = ms;
    +    self.prev = prevTime;
    +    self.curr = curr;
    +    prevTime = curr;
    +
    +    // add the `color` if not set
    +    if (null == self.useColors) self.useColors = exports.useColors();
    +    if (null == self.color && self.useColors) self.color = selectColor();
    +
    +    var args = Array.prototype.slice.call(arguments);
    +
    +    args[0] = exports.coerce(args[0]);
    +
    +    if ('string' !== typeof args[0]) {
    +      // anything else let's inspect with %o
    +      args = ['%o'].concat(args);
    +    }
    +
    +    // apply any `formatters` transformations
    +    var index = 0;
    +    args[0] = args[0].replace(/%([a-z%])/g, function(match, format) {
    +      // if we encounter an escaped % then don't increase the array index
    +      if (match === '%%') return match;
    +      index++;
    +      var formatter = exports.formatters[format];
    +      if ('function' === typeof formatter) {
    +        var val = args[index];
    +        match = formatter.call(self, val);
    +
    +        // now we need to remove `args[index]` since it's inlined in the `format`
    +        args.splice(index, 1);
    +        index--;
    +      }
    +      return match;
    +    });
    +
    +    if ('function' === typeof exports.formatArgs) {
    +      args = exports.formatArgs.apply(self, args);
    +    }
    +    var logFn = enabled.log || exports.log || console.log.bind(console);
    +    logFn.apply(self, args);
    +  }
    +  enabled.enabled = true;
    +
    +  var fn = exports.enabled(namespace) ? enabled : disabled;
    +
    +  fn.namespace = namespace;
    +
    +  return fn;
    +}
    +
    +/**
    + * Enables a debug mode by namespaces. This can include modes
    + * separated by a colon and wildcards.
    + *
    + * @param {String} namespaces
    + * @api public
    + */
    +
    +function enable(namespaces) {
    +  exports.save(namespaces);
    +
    +  var split = (namespaces || '').split(/[\s,]+/);
    +  var len = split.length;
    +
    +  for (var i = 0; i < len; i++) {
    +    if (!split[i]) continue; // ignore empty strings
    +    namespaces = split[i].replace(/\*/g, '.*?');
    +    if (namespaces[0] === '-') {
    +      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
    +    } else {
    +      exports.names.push(new RegExp('^' + namespaces + '$'));
    +    }
    +  }
    +}
    +
    +/**
    + * Disable debug output.
    + *
    + * @api public
    + */
    +
    +function disable() {
    +  exports.enable('');
    +}
    +
    +/**
    + * Returns true if the given mode name is enabled, false otherwise.
    + *
    + * @param {String} name
    + * @return {Boolean}
    + * @api public
    + */
    +
    +function enabled(name) {
    +  var i, len;
    +  for (i = 0, len = exports.skips.length; i < len; i++) {
    +    if (exports.skips[i].test(name)) {
    +      return false;
    +    }
    +  }
    +  for (i = 0, len = exports.names.length; i < len; i++) {
    +    if (exports.names[i].test(name)) {
    +      return true;
    +    }
    +  }
    +  return false;
    +}
    +
    +/**
    + * Coerce `val`.
    + *
    + * @param {Mixed} val
    + * @return {Mixed}
    + * @api private
    + */
    +
    +function coerce(val) {
    +  if (val instanceof Error) return val.stack || val.message;
    +  return val;
    +}
    diff --git a/cep/node_modules/debug/node.js b/cep/node_modules/debug/node.js
    new file mode 100644
    index 0000000..1d392a8
    --- /dev/null
    +++ b/cep/node_modules/debug/node.js
    @@ -0,0 +1,209 @@
    +
    +/**
    + * Module dependencies.
    + */
    +
    +var tty = require('tty');
    +var util = require('util');
    +
    +/**
    + * This is the Node.js implementation of `debug()`.
    + *
    + * Expose `debug()` as the module.
    + */
    +
    +exports = module.exports = require('./debug');
    +exports.log = log;
    +exports.formatArgs = formatArgs;
    +exports.save = save;
    +exports.load = load;
    +exports.useColors = useColors;
    +
    +/**
    + * Colors.
    + */
    +
    +exports.colors = [6, 2, 3, 4, 5, 1];
    +
    +/**
    + * The file descriptor to write the `debug()` calls to.
    + * Set the `DEBUG_FD` env variable to override with another value. i.e.:
    + *
    + *   $ DEBUG_FD=3 node script.js 3>debug.log
    + */
    +
    +var fd = parseInt(process.env.DEBUG_FD, 10) || 2;
    +var stream = 1 === fd ? process.stdout :
    +             2 === fd ? process.stderr :
    +             createWritableStdioStream(fd);
    +
    +/**
    + * Is stdout a TTY? Colored output is enabled when `true`.
    + */
    +
    +function useColors() {
    +  var debugColors = (process.env.DEBUG_COLORS || '').trim().toLowerCase();
    +  if (0 === debugColors.length) {
    +    return tty.isatty(fd);
    +  } else {
    +    return '0' !== debugColors
    +        && 'no' !== debugColors
    +        && 'false' !== debugColors
    +        && 'disabled' !== debugColors;
    +  }
    +}
    +
    +/**
    + * Map %o to `util.inspect()`, since Node doesn't do that out of the box.
    + */
    +
    +var inspect = (4 === util.inspect.length ?
    +  // node <= 0.8.x
    +  function (v, colors) {
    +    return util.inspect(v, void 0, void 0, colors);
    +  } :
    +  // node > 0.8.x
    +  function (v, colors) {
    +    return util.inspect(v, { colors: colors });
    +  }
    +);
    +
    +exports.formatters.o = function(v) {
    +  return inspect(v, this.useColors)
    +    .replace(/\s*\n\s*/g, ' ');
    +};
    +
    +/**
    + * Adds ANSI color escape codes if enabled.
    + *
    + * @api public
    + */
    +
    +function formatArgs() {
    +  var args = arguments;
    +  var useColors = this.useColors;
    +  var name = this.namespace;
    +
    +  if (useColors) {
    +    var c = this.color;
    +
    +    args[0] = '  \u001b[3' + c + ';1m' + name + ' '
    +      + '\u001b[0m'
    +      + args[0] + '\u001b[3' + c + 'm'
    +      + ' +' + exports.humanize(this.diff) + '\u001b[0m';
    +  } else {
    +    args[0] = new Date().toUTCString()
    +      + ' ' + name + ' ' + args[0];
    +  }
    +  return args;
    +}
    +
    +/**
    + * Invokes `console.error()` with the specified arguments.
    + */
    +
    +function log() {
    +  return stream.write(util.format.apply(this, arguments) + '\n');
    +}
    +
    +/**
    + * Save `namespaces`.
    + *
    + * @param {String} namespaces
    + * @api private
    + */
    +
    +function save(namespaces) {
    +  if (null == namespaces) {
    +    // If you set a process.env field to null or undefined, it gets cast to the
    +    // string 'null' or 'undefined'. Just delete instead.
    +    delete process.env.DEBUG;
    +  } else {
    +    process.env.DEBUG = namespaces;
    +  }
    +}
    +
    +/**
    + * Load `namespaces`.
    + *
    + * @return {String} returns the previously persisted debug modes
    + * @api private
    + */
    +
    +function load() {
    +  return process.env.DEBUG;
    +}
    +
    +/**
    + * Copied from `node/src/node.js`.
    + *
    + * XXX: It's lame that node doesn't expose this API out-of-the-box. It also
    + * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.
    + */
    +
    +function createWritableStdioStream (fd) {
    +  var stream;
    +  var tty_wrap = process.binding('tty_wrap');
    +
    +  // Note stream._type is used for test-module-load-list.js
    +
    +  switch (tty_wrap.guessHandleType(fd)) {
    +    case 'TTY':
    +      stream = new tty.WriteStream(fd);
    +      stream._type = 'tty';
    +
    +      // Hack to have stream not keep the event loop alive.
    +      // See https://github.com/joyent/node/issues/1726
    +      if (stream._handle && stream._handle.unref) {
    +        stream._handle.unref();
    +      }
    +      break;
    +
    +    case 'FILE':
    +      var fs = require('fs');
    +      stream = new fs.SyncWriteStream(fd, { autoClose: false });
    +      stream._type = 'fs';
    +      break;
    +
    +    case 'PIPE':
    +    case 'TCP':
    +      var net = require('net');
    +      stream = new net.Socket({
    +        fd: fd,
    +        readable: false,
    +        writable: true
    +      });
    +
    +      // FIXME Should probably have an option in net.Socket to create a
    +      // stream from an existing fd which is writable only. But for now
    +      // we'll just add this hack and set the `readable` member to false.
    +      // Test: ./node test/fixtures/echo.js < /etc/passwd
    +      stream.readable = false;
    +      stream.read = null;
    +      stream._type = 'pipe';
    +
    +      // FIXME Hack to have stream not keep the event loop alive.
    +      // See https://github.com/joyent/node/issues/1726
    +      if (stream._handle && stream._handle.unref) {
    +        stream._handle.unref();
    +      }
    +      break;
    +
    +    default:
    +      // Probably an error on in uv_guess_handle()
    +      throw new Error('Implement me. Unknown stream file type!');
    +  }
    +
    +  // For supporting legacy API we put the FD here.
    +  stream.fd = fd;
    +
    +  stream._isStdio = true;
    +
    +  return stream;
    +}
    +
    +/**
    + * Enable namespaces listed in `process.env.DEBUG` initially.
    + */
    +
    +exports.enable(load());
    diff --git a/cep/node_modules/debug/package.json b/cep/node_modules/debug/package.json
    new file mode 100644
    index 0000000..c88db88
    --- /dev/null
    +++ b/cep/node_modules/debug/package.json
    @@ -0,0 +1,112 @@
    +{
    +  "_args": [
    +    [
    +      {
    +        "raw": "debug@2.2.0",
    +        "scope": null,
    +        "escapedName": "debug",
    +        "name": "debug",
    +        "rawSpec": "2.2.0",
    +        "spec": "2.2.0",
    +        "type": "version"
    +      },
    +      "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\socket.io"
    +    ]
    +  ],
    +  "_from": "debug@2.2.0",
    +  "_id": "debug@2.2.0",
    +  "_inCache": true,
    +  "_installable": true,
    +  "_location": "/debug",
    +  "_nodeVersion": "0.12.2",
    +  "_npmUser": {
    +    "name": "tootallnate",
    +    "email": "nathan@tootallnate.net"
    +  },
    +  "_npmVersion": "2.7.4",
    +  "_phantomChildren": {},
    +  "_requested": {
    +    "raw": "debug@2.2.0",
    +    "scope": null,
    +    "escapedName": "debug",
    +    "name": "debug",
    +    "rawSpec": "2.2.0",
    +    "spec": "2.2.0",
    +    "type": "version"
    +  },
    +  "_requiredBy": [
    +    "/engine.io",
    +    "/engine.io-client",
    +    "/socket.io",
    +    "/socket.io-adapter",
    +    "/socket.io-client",
    +    "/socket.io-parser"
    +  ],
    +  "_resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
    +  "_shasum": "f87057e995b1a1f6ae6a4960664137bc56f039da",
    +  "_shrinkwrap": null,
    +  "_spec": "debug@2.2.0",
    +  "_where": "D:\\repositories\\tk-framework-adobe\\extensions\\http_server\\node_modules\\socket.io",
    +  "author": {
    +    "name": "TJ Holowaychuk",
    +    "email": "tj@vision-media.ca"
    +  },
    +  "browser": "./browser.js",
    +  "bugs": {
    +    "url": "https://github.com/visionmedia/debug/issues"
    +  },
    +  "component": {
    +    "scripts": {
    +      "debug/index.js": "browser.js",
    +      "debug/debug.js": "debug.js"
    +    }
    +  },
    +  "contributors": [
    +    {
    +      "name": "Nathan Rajlich",
    +      "email": "nathan@tootallnate.net",
    +      "url": "http://n8.io"
    +    }
    +  ],
    +  "dependencies": {
    +    "ms": "0.7.1"
    +  },
    +  "description": "small debugging utility",
    +  "devDependencies": {
    +    "browserify": "9.0.3",
    +    "mocha": "*"
    +  },
    +  "directories": {},
    +  "dist": {
    +    "shasum": "f87057e995b1a1f6ae6a4960664137bc56f039da",
    +    "tarball": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz"
    +  },
    +  "gitHead": "b38458422b5aa8aa6d286b10dfe427e8a67e2b35",
    +  "homepage": "https://github.com/visionmedia/debug",
    +  "keywords": [
    +    "debug",
    +    "log",
    +    "debugger"
    +  ],
    +  "license": "MIT",
    +  "main": "./node.js",
    +  "maintainers": [
    +    {
    +      "name": "tjholowaychuk",
    +      "email": "tj@vision-media.ca"
    +    },
    +    {
    +      "name": "tootallnate",
    +      "email": "nathan@tootallnate.net"
    +    }
    +  ],
    +  "name": "debug",
    +  "optionalDependencies": {},
    +  "readme": "ERROR: No README data found!",
    +  "repository": {
    +    "type": "git",
    +    "url": "git://github.com/visionmedia/debug.git"
    +  },
    +  "scripts": {},
    +  "version": "2.2.0"
    +}
    diff --git a/cep/node_modules/engine.io-client/.npmignore b/cep/node_modules/engine.io-client/.npmignore
    new file mode 100644
    index 0000000..3957910
    --- /dev/null
    +++ b/cep/node_modules/engine.io-client/.npmignore
    @@ -0,0 +1,2 @@
    +support/
    +test
    diff --git a/cep/node_modules/engine.io-client/.travis.yml b/cep/node_modules/engine.io-client/.travis.yml
    new file mode 100644
    index 0000000..3eb12a7
    --- /dev/null
    +++ b/cep/node_modules/engine.io-client/.travis.yml
    @@ -0,0 +1,46 @@
    +language: node_js
    +sudo: false
    +node_js:
    +  - '0.10'
    +  - '0.12'
    +  - '4'
    +notifications:
    +  irc: "irc.freenode.org#socket.io"
    +matrix:
    +  include:
    +  - node_js: '0.10'
    +    env: BROWSER_NAME=chrome BROWSER_VERSION=latest
    +  - node_js: '0.10'
    +    env: BROWSER_NAME=safari BROWSER_VERSION=latest
    +  - node_js: '0.10'
    +    env: BROWSER_NAME=ie BROWSER_VERSION=6
    +  - node_js: '0.10'
    +    env: BROWSER_NAME=ie BROWSER_VERSION=7
    +  - node_js: '0.10'
    +    env: BROWSER_NAME=ie BROWSER_VERSION=8
    +  - node_js: '0.10'
    +    env: BROWSER_NAME=ie BROWSER_VERSION=9
    +  - node_js: '0.10'
    +    env: BROWSER_NAME=ie BROWSER_VERSION=10 BROWSER_PLATFORM="Windows 2012"
    +  - node_js: '0.10'
    +    env: BROWSER_NAME=ie BROWSER_VERSION=latest BROWSER_PLATFORM="Windows 2012"
    +  - node_js: '0.10'
    +    env: BROWSER_NAME=iphone BROWSER_VERSION=5.1
    +  - node_js: '0.10'
    +    env: BROWSER_NAME=iphone BROWSER_VERSION=6.1
    +  - node_js: '0.10'
    +    env: BROWSER_NAME=iphone BROWSER_VERSION=7.1
    +  - node_js: '0.10'
    +    env: BROWSER_NAME=iphone BROWSER_VERSION=8.4
    +  - node_js: '0.10'
    +    env: BROWSER_NAME=iphone BROWSER_VERSION=latest
    +  - node_js: '0.10'
    +    env: BROWSER_NAME=android BROWSER_VERSION=4.0
    +  - node_js: '0.10'
    +    env: BROWSER_NAME=android BROWSER_VERSION=4.1
    +  - node_js: '0.10'
    +    env: BROWSER_NAME=android BROWSER_VERSION=4.2
    +  - node_js: '0.10'
    +    env: BROWSER_NAME=android BROWSER_VERSION=4.3
    +  - node_js: '0.10'
    +    env: BROWSER_NAME=android BROWSER_VERSION=4.4
    diff --git a/cep/node_modules/engine.io-client/.zuul.yml b/cep/node_modules/engine.io-client/.zuul.yml
    new file mode 100644
    index 0000000..15d6892
    --- /dev/null
    +++ b/cep/node_modules/engine.io-client/.zuul.yml
    @@ -0,0 +1,6 @@
    +ui: mocha-bdd
    +server: ./test/support/server.js
    +tunnel:
    +  type: ngrok
    +  authtoken: 6Aw8vTgcG5EvXdQywVvbh_3fMxvd4Q7dcL2caAHAFjV
    +  proto: tcp
    diff --git a/cep/node_modules/engine.io-client/History.md b/cep/node_modules/engine.io-client/History.md
    new file mode 100644
    index 0000000..7b1dc9b
    --- /dev/null
    +++ b/cep/node_modules/engine.io-client/History.md
    @@ -0,0 +1,568 @@
    +
    +1.6.11 / 2016-06-23
    +===================
    +
    +  * bump version
    +
    +1.6.10 / 2016-06-23
    +===================
    +
    +  * bump version
    +
    +1.6.9 / 2016-05-02
    +==================
    +
    +  * default `rejectUnauthorized` to `true`
    +
    +1.6.8 / 2016-01-25
    +==================
    +
    +  * safely resolve `ws` module
    +
    +1.6.7 / 2016-01-10
    +==================
    +
    +  * prevent `ws` from being added to the bundle
    +  * added jsonp fix for when no `
    +
    +```
    +
    +### With browserify
    +
    +Engine.IO is a commonjs module, which means you can include it by using
    +`require` on the browser and package using [browserify](http://browserify.org/):
    +
    +1. install the client package
    +
    +    ```bash
    +    $ npm install engine.io-client
    +    ```
    +
    +1. write your app code
    +
    +    ```js
    +    var socket = require('engine.io-client')('ws://localhost');
    +    socket.on('open', function(){
    +      socket.on('message', function(data){});
    +      socket.on('close', function(){});
    +    });
    +    ```
    +
    +1. build your app bundle
    +
    +    ```bash
    +    $ browserify app.js > bundle.js
    +    ```
    +
    +1. include on your page
    +
    +    ```html
    +    
    +    ```
    +
    +### Sending and receiving binary
    +
    +```html
    +
    +
    +```
    +
    +### Node.JS
    +
    +Add `engine.io-client` to your `package.json` and then:
    +
    +```js
    +var socket = require('engine.io-client')('ws://localhost');
    +socket.on('open', function(){
    +  socket.on('message', function(data){});
    +  socket.on('close', function(){});
    +});
    +```
    +
    +### Node.js with certificates
    +```js
    +var opts = {
    +  key: fs.readFileSync('test/fixtures/client.key'),
    +  cert: fs.readFileSync('test/fixtures/client.crt'),
    +  ca: fs.readFileSync('test/fixtures/ca.crt')
    +};
    +
    +var socket = require('engine.io-client')('ws://localhost', opts);
    +socket.on('open', function(){
    +  socket.on('message', function(data){});
    +  socket.on('close', function(){});
    +});
    +```
    +
    +### Node.js with extraHeaders
    +```js
    +var opts = {
    +  extraHeaders: {
    +    'X-Custom-Header-For-My-Project': 'my-secret-access-token',
    +    'Cookie': 'user_session=NI2JlCKF90aE0sJZD9ZzujtdsUqNYSBYxzlTsvdSUe35ZzdtVRGqYFr0kdGxbfc5gUOkR9RGp20GVKza; path=/; expires=Tue, 07-Apr-2015 18:18:08 GMT; secure; HttpOnly'
    +  }
    +};
    +
    +var socket = require('engine.io-client')('ws://localhost', opts);
    +socket.on('open', function(){
    +  socket.on('message', function(data){});
    +  socket.on('close', function(){});
    +});
    +```
    +
    +## Features
    +
    +- Lightweight
    +- Runs on browser and node.js seamlessly
    +- Transports are independent of `Engine`
    +  - Easy to debug
    +  - Easy to unit test
    +- Runs inside HTML5 WebWorker
    +- Can send and receive binary data
    +  - Receives as ArrayBuffer or Blob when in browser, and Buffer or ArrayBuffer
    +    in Node
    +  - When XHR2 or WebSockets are used, binary is emitted directly. Otherwise
    +    binary is encoded into base64 strings, and decoded when binary types are
    +    supported.
    +  - With browsers that don't support ArrayBuffer, an object { base64: true,
    +    data: dataAsBase64String } is emitted on the `message` event.
    +
    +## API
    +
    +### Socket
    +
    +The client class. Mixes in [Emitter](http://github.com/component/emitter).
    +Exposed as `eio` in the browser standalone build.
    +
    +#### Properties
    +
    +- `protocol` _(Number)_: protocol revision number
    +- `binaryType` _(String)_ : can be set to 'arraybuffer' or 'blob' in browsers,
    +  and `buffer` or `arraybuffer` in Node. Blob is only used in browser if it's
    +  supported.
    +
    +#### Events
    +
    +- `open`
    +  - Fired upon successful connection.
    +- `message`
    +  - Fired when data is received from the server.
    +  - **Arguments**
    +    - `String` | `ArrayBuffer`: utf-8 encoded data or ArrayBuffer containing
    +      binary data
    +- `close`
    +  - Fired upon disconnection. In compliance with the WebSocket API spec, this event may be 
    +    fired even if the `open` event does not occur (i.e. due to connection error or `close()`).
    +- `error`
    +  - Fired when an error occurs.
    +- `flush`
    +  - Fired upon completing a buffer flush
    +- `drain`
    +  - Fired after `drain` event of transport if writeBuffer is empty
    +- `upgradeError`
    +  - Fired if an error occurs with a transport we're trying to upgrade to.
    +- `upgrade`
    +  - Fired upon upgrade success, after the new transport is set
    +- `ping`
    +  - Fired upon _flushing_ a ping packet (ie: actual packet write out)
    +- `pong`
    +  - Fired upon receiving a pong packet.
    +
    +#### Methods
    +
    +- **constructor**
    +    - Initializes the client
    +    - **Parameters**
    +      - `String` uri
    +      - `Object`: optional, options object
    +    - **Options**
    +      - `agent` (`http.Agent`): `http.Agent` to use, defaults to `false` (NodeJS only)
    +      - `upgrade` (`Boolean`): defaults to true, whether the client should try
    +      to upgrade the transport from long-polling to something better.
    +      - `forceJSONP` (`Boolean`): forces JSONP for polling transport.
    +      - `jsonp` (`Boolean`): determines whether to use JSONP when
    +        necessary for polling. If disabled (by settings to false) an error will
    +        be emitted (saying "No transports available") if no other transports
    +        are available. If another transport is available for opening a
    +        connection (e.g. WebSocket) that transport
    +        will be used instead.
    +      - `forceBase64` (`Boolean`): forces base 64 encoding for polling transport even when XHR2 responseType is available and WebSocket even if the used standard supports binary.
    +      - `enablesXDR` (`Boolean`): enables XDomainRequest for IE8 to avoid loading bar flashing with click sound. default to `false` because XDomainRequest has a flaw of not sending cookie.
    +      - `timestampRequests` (`Boolean`): whether to add the timestamp with each
    +        transport request. Note: polling requests are always stamped unless this
    +        option is explicitly set to `false` (`false`)
    +      - `timestampParam` (`String`): timestamp parameter (`t`)
    +      - `policyPort` (`Number`): port the policy server listens on (`843`)
    +      - `path` (`String`): path to connect to, default is `/engine.io`
    +      - `transports` (`Array`): a list of transports to try (in order).
    +      Defaults to `['polling', 'websocket']`. `Engine`
    +      always attempts to connect directly with the first one, provided the
    +      feature detection test for it passes.
    +      - `rememberUpgrade` (`Boolean`): defaults to false.
    +        If true and if the previous websocket connection to the server succeeded,
    +        the connection attempt will bypass the normal upgrade process and will initially
    +        try websocket. A connection attempt following a transport error will use the
    +        normal upgrade process. It is recommended you turn this on only when using
    +        SSL/TLS connections, or if you know that your network does not block websockets.
    +      - `pfx` (`String`): Certificate, Private key and CA certificates to use for SSL. Can be used in Node.js client environment to manually specify certificate information.
    +      - `key` (`String`): Private key to use for SSL. Can be used in Node.js client environment to manually specify certificate information.
    +      - `passphrase` (`String`): A string of passphrase for the private key or pfx. Can be used in Node.js client environment to manually specify certificate information.
    +      - `cert` (`String`): Public x509 certificate to use. Can be used in Node.js client environment to manually specify certificate information.
    +      - `ca` (`String`|`Array`): An authority certificate or array of authority certificates to check the remote host against.. Can be used in Node.js client environment to manually specify certificate information.
    +      - `ciphers` (`String`): A string describing the ciphers to use or exclude. Consult the [cipher format list](http://www.openssl.org/docs/apps/ciphers.html#CIPHER_LIST_FORMAT) for details on the format. Can be used in Node.js client environment to manually specify certificate information.
    +      - `rejectUnauthorized` (`Boolean`): If true, the server certificate is verified against the list of supplied CAs. An 'error' event is emitted if verification fails. Verification happens at the connection level, before the HTTP request is sent. Can be used in Node.js client environment to manually specify certificate information.
    +      - `perMessageDeflate` (`Object|Boolean`): parameters of the WebSocket permessage-deflate extension
    +        (see [ws module](https://github.com/einaros/ws) api docs). Set to `false` to disable. (`true`)
    +        - `threshold` (`Number`): data is compressed only if the byte size is above this value. This option is ignored on the browser. (`1024`)
    +      - `extraHeaders` (`Object`): Headers that will be passed for each request to the server (via xhr-polling and via websockets). These values then can be used during handshake or for special proxies. Can only be used in Node.js client environment.
    +- `send`
    +    - Sends a message to the server
    +    - **Parameters**
    +      - `String` | `ArrayBuffer` | `ArrayBufferView` | `Blob`: data to send
    +      - `Object`: optional, options object
    +      - `Function`: optional, callback upon `drain`
    +    - **Options**
    +      - `compress` (`Boolean`): whether to compress sending data. This option is ignored and forced to be `true` on the browser. (`true`)
    +- `close`
    +    - Disconnects the client.
    +
    +### Transport
    +
    +The transport class. Private. _Inherits from EventEmitter_.
    +
    +#### Events
    +
    +- `poll`: emitted by polling transports upon starting a new request
    +- `pollComplete`: emitted by polling transports upon completing a request
    +- `drain`: emitted by polling transports upon a buffer drain
    +
    +## Tests
    +
    +`engine.io-client` is used to test
    +[engine](http://github.com/socketio/engine.io). Running the `engine.io`
    +test suite ensures the client works and vice-versa.
    +
    +Browser tests are run using [zuul](https://github.com/defunctzombie/zuul). You can
    +run the tests locally using the following command.
    +
    +```
    +./node_modules/.bin/zuul --local 8080 -- test/index.js
    +```
    +
    +Additionally, `engine.io-client` has a standalone test suite you can run
    +with `make test` which will run node.js and browser tests. You must have zuul setup with
    +a saucelabs account.
    +
    +## Support
    +
    +The support channels for `engine.io-client` are the same as `socket.io`:
    +  - irc.freenode.net **#socket.io**
    +  - [Google Groups](http://groups.google.com/group/socket_io)
    +  - [Website](http://socket.io)
    +
    +## Development
    +
    +To contribute patches, run tests or benchmarks, make sure to clone the
    +repository:
    +
    +```bash
    +git clone git://github.com/socketio/engine.io-client.git
    +```
    +
    +Then:
    +
    +```bash
    +cd engine.io-client
    +npm install
    +```
    +
    +See the `Tests` section above for how to run tests before submitting any patches.
    +
    +## License
    +
    +MIT - Copyright (c) 2014 Automattic, Inc.
    +
    diff --git a/cep/node_modules/engine.io-client/engine.io.js b/cep/node_modules/engine.io-client/engine.io.js
    new file mode 100644
    index 0000000..eeefaa9
    --- /dev/null
    +++ b/cep/node_modules/engine.io-client/engine.io.js
    @@ -0,0 +1,4244 @@
    +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.eio=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0) {
    +      this.extraHeaders = opts.extraHeaders;
    +    }
    +  }
    +
    +  this.open();
    +}
    +
    +Socket.priorWebsocketSuccess = false;
    +
    +/**
    + * Mix in `Emitter`.
    + */
    +
    +Emitter(Socket.prototype);
    +
    +/**
    + * Protocol version.
    + *
    + * @api public
    + */
    +
    +Socket.protocol = parser.protocol; // this is an int
    +
    +/**
    + * Expose deps for legacy compatibility
    + * and standalone browser access.
    + */
    +
    +Socket.Socket = Socket;
    +Socket.Transport = _dereq_('./transport');
    +Socket.transports = _dereq_('./transports');
    +Socket.parser = _dereq_('engine.io-parser');
    +
    +/**
    + * Creates transport of the given type.
    + *
    + * @param {String} transport name
    + * @return {Transport}
    + * @api private
    + */
    +
    +Socket.prototype.createTransport = function (name) {
    +  debug('creating transport "%s"', name);
    +  var query = clone(this.query);
    +
    +  // append engine.io protocol identifier
    +  query.EIO = parser.protocol;
    +
    +  // transport name
    +  query.transport = name;
    +
    +  // session id if we already have one
    +  if (this.id) query.sid = this.id;
    +
    +  var transport = new transports[name]({
    +    agent: this.agent,
    +    hostname: this.hostname,
    +    port: this.port,
    +    secure: this.secure,
    +    path: this.path,
    +    query: query,
    +    forceJSONP: this.forceJSONP,
    +    jsonp: this.jsonp,
    +    forceBase64: this.forceBase64,
    +    enablesXDR: this.enablesXDR,
    +    timestampRequests: this.timestampRequests,
    +    timestampParam: this.timestampParam,
    +    policyPort: this.policyPort,
    +    socket: this,
    +    pfx: this.pfx,
    +    key: this.key,
    +    passphrase: this.passphrase,
    +    cert: this.cert,
    +    ca: this.ca,
    +    ciphers: this.ciphers,
    +    rejectUnauthorized: this.rejectUnauthorized,
    +    perMessageDeflate: this.perMessageDeflate,
    +    extraHeaders: this.extraHeaders
    +  });
    +
    +  return transport;
    +};
    +
    +function clone (obj) {
    +  var o = {};
    +  for (var i in obj) {
    +    if (obj.hasOwnProperty(i)) {
    +      o[i] = obj[i];
    +    }
    +  }
    +  return o;
    +}
    +
    +/**
    + * Initializes transport to use and starts probe.
    + *
    + * @api private
    + */
    +Socket.prototype.open = function () {
    +  var transport;
    +  if (this.rememberUpgrade && Socket.priorWebsocketSuccess && this.transports.indexOf('websocket') != -1) {
    +    transport = 'websocket';
    +  } else if (0 === this.transports.length) {
    +    // Emit error on next tick so it can be listened to
    +    var self = this;
    +    setTimeout(function() {
    +      self.emit('error', 'No transports available');
    +    }, 0);
    +    return;
    +  } else {
    +    transport = this.transports[0];
    +  }
    +  this.readyState = 'opening';
    +
    +  // Retry with the next transport if the transport is disabled (jsonp: false)
    +  try {
    +    transport = this.createTransport(transport);
    +  } catch (e) {
    +    this.transports.shift();
    +    this.open();
    +    return;
    +  }
    +
    +  transport.open();
    +  this.setTransport(transport);
    +};
    +
    +/**
    + * Sets the current transport. Disables the existing one (if any).
    + *
    + * @api private
    + */
    +
    +Socket.prototype.setTransport = function(transport){
    +  debug('setting transport %s', transport.name);
    +  var self = this;
    +
    +  if (this.transport) {
    +    debug('clearing existing transport %s', this.transport.name);
    +    this.transport.removeAllListeners();
    +  }
    +
    +  // set up transport
    +  this.transport = transport;
    +
    +  // set up transport listeners
    +  transport
    +  .on('drain', function(){
    +    self.onDrain();
    +  })
    +  .on('packet', function(packet){
    +    self.onPacket(packet);
    +  })
    +  .on('error', function(e){
    +    self.onError(e);
    +  })
    +  .on('close', function(){
    +    self.onClose('transport close');
    +  });
    +};
    +
    +/**
    + * Probes a transport.
    + *
    + * @param {String} transport name
    + * @api private
    + */
    +
    +Socket.prototype.probe = function (name) {
    +  debug('probing transport "%s"', name);
    +  var transport = this.createTransport(name, { probe: 1 })
    +    , failed = false
    +    , self = this;
    +
    +  Socket.priorWebsocketSuccess = false;
    +
    +  function onTransportOpen(){
    +    if (self.onlyBinaryUpgrades) {
    +      var upgradeLosesBinary = !this.supportsBinary && self.transport.supportsBinary;
    +      failed = failed || upgradeLosesBinary;
    +    }
    +    if (failed) return;
    +
    +    debug('probe transport "%s" opened', name);
    +    transport.send([{ type: 'ping', data: 'probe' }]);
    +    transport.once('packet', function (msg) {
    +      if (failed) return;
    +      if ('pong' == msg.type && 'probe' == msg.data) {
    +        debug('probe transport "%s" pong', name);
    +        self.upgrading = true;
    +        self.emit('upgrading', transport);
    +        if (!transport) return;
    +        Socket.priorWebsocketSuccess = 'websocket' == transport.name;
    +
    +        debug('pausing current transport "%s"', self.transport.name);
    +        self.transport.pause(function () {
    +          if (failed) return;
    +          if ('closed' == self.readyState) return;
    +          debug('changing transport and sending upgrade packet');
    +
    +          cleanup();
    +
    +          self.setTransport(transport);
    +          transport.send([{ type: 'upgrade' }]);
    +          self.emit('upgrade', transport);
    +          transport = null;
    +          self.upgrading = false;
    +          self.flush();
    +        });
    +      } else {
    +        debug('probe transport "%s" failed', name);
    +        var err = new Error('probe error');
    +        err.transport = transport.name;
    +        self.emit('upgradeError', err);
    +      }
    +    });
    +  }
    +
    +  function freezeTransport() {
    +    if (failed) return;
    +
    +    // Any callback called by transport should be ignored since now
    +    failed = true;
    +
    +    cleanup();
    +
    +    transport.close();
    +    transport = null;
    +  }
    +
    +  //Handle any error that happens while probing
    +  function onerror(err) {
    +    var error = new Error('probe error: ' + err);
    +    error.transport = transport.name;
    +
    +    freezeTransport();
    +
    +    debug('probe transport "%s" failed because of error: %s', name, err);
    +
    +    self.emit('upgradeError', error);
    +  }
    +
    +  function onTransportClose(){
    +    onerror("transport closed");
    +  }
    +
    +  //When the socket is closed while we're probing
    +  function onclose(){
    +    onerror("socket closed");
    +  }
    +
    +  //When the socket is upgraded while we're probing
    +  function onupgrade(to){
    +    if (transport && to.name != transport.name) {
    +      debug('"%s" works - aborting "%s"', to.name, transport.name);
    +      freezeTransport();
    +    }
    +  }
    +
    +  //Remove all listeners on the transport and on self
    +  function cleanup(){
    +    transport.removeListener('open', onTransportOpen);
    +    transport.removeListener('error', onerror);
    +    transport.removeListener('close', onTransportClose);
    +    self.removeListener('close', onclose);
    +    self.removeListener('upgrading', onupgrade);
    +  }
    +
    +  transport.once('open', onTransportOpen);
    +  transport.once('error', onerror);
    +  transport.once('close', onTransportClose);
    +
    +  this.once('close', onclose);
    +  this.once('upgrading', onupgrade);
    +
    +  transport.open();
    +
    +};
    +
    +/**
    + * Called when connection is deemed open.
    + *
    + * @api public
    + */
    +
    +Socket.prototype.onOpen = function () {
    +  debug('socket open');
    +  this.readyState = 'open';
    +  Socket.priorWebsocketSuccess = 'websocket' == this.transport.name;
    +  this.emit('open');
    +  this.flush();
    +
    +  // we check for `readyState` in case an `open`
    +  // listener already closed the socket
    +  if ('open' == this.readyState && this.upgrade && this.transport.pause) {
    +    debug('starting upgrade probes');
    +    for (var i = 0, l = this.upgrades.length; i < l; i++) {
    +      this.probe(this.upgrades[i]);
    +    }
    +  }
    +};
    +
    +/**
    + * Handles a packet.
    + *
    + * @api private
    + */
    +
    +Socket.prototype.onPacket = function (packet) {
    +  if ('opening' == this.readyState || 'open' == this.readyState) {
    +    debug('socket receive: type "%s", data "%s"', packet.type, packet.data);
    +
    +    this.emit('packet', packet);
    +
    +    // Socket is live - any packet counts
    +    this.emit('heartbeat');
    +
    +    switch (packet.type) {
    +      case 'open':
    +        this.onHandshake(parsejson(packet.data));
    +        break;
    +
    +      case 'pong':
    +        this.setPing();
    +        this.emit('pong');
    +        break;
    +
    +      case 'error':
    +        var err = new Error('server error');
    +        err.code = packet.data;
    +        this.onError(err);
    +        break;
    +
    +      case 'message':
    +        this.emit('data', packet.data);
    +        this.emit('message', packet.data);
    +        break;
    +    }
    +  } else {
    +    debug('packet received with socket readyState "%s"', this.readyState);
    +  }
    +};
    +
    +/**
    + * Called upon handshake completion.
    + *
    + * @param {Object} handshake obj
    + * @api private
    + */
    +
    +Socket.prototype.onHandshake = function (data) {
    +  this.emit('handshake', data);
    +  this.id = data.sid;
    +  this.transport.query.sid = data.sid;
    +  this.upgrades = this.filterUpgrades(data.upgrades);
    +  this.pingInterval = data.pingInterval;
    +  this.pingTimeout = data.pingTimeout;
    +  this.onOpen();
    +  // In case open handler closes socket
    +  if  ('closed' == this.readyState) return;
    +  this.setPing();
    +
    +  // Prolong liveness of socket on heartbeat
    +  this.removeListener('heartbeat', this.onHeartbeat);
    +  this.on('heartbeat', this.onHeartbeat);
    +};
    +
    +/**
    + * Resets ping timeout.
    + *
    + * @api private
    + */
    +
    +Socket.prototype.onHeartbeat = function (timeout) {
    +  clearTimeout(this.pingTimeoutTimer);
    +  var self = this;
    +  self.pingTimeoutTimer = setTimeout(function () {
    +    if ('closed' == self.readyState) return;
    +    self.onClose('ping timeout');
    +  }, timeout || (self.pingInterval + self.pingTimeout));
    +};
    +
    +/**
    + * Pings server every `this.pingInterval` and expects response
    + * within `this.pingTimeout` or closes connection.
    + *
    + * @api private
    + */
    +
    +Socket.prototype.setPing = function () {
    +  var self = this;
    +  clearTimeout(self.pingIntervalTimer);
    +  self.pingIntervalTimer = setTimeout(function () {
    +    debug('writing ping packet - expecting pong within %sms', self.pingTimeout);
    +    self.ping();
    +    self.onHeartbeat(self.pingTimeout);
    +  }, self.pingInterval);
    +};
    +
    +/**
    +* Sends a ping packet.
    +*
    +* @api private
    +*/
    +
    +Socket.prototype.ping = function () {
    +  var self = this;
    +  this.sendPacket('ping', function(){
    +    self.emit('ping');
    +  });
    +};
    +
    +/**
    + * Called on `drain` event
    + *
    + * @api private
    + */
    +
    +Socket.prototype.onDrain = function() {
    +  this.writeBuffer.splice(0, this.prevBufferLen);
    +
    +  // setting prevBufferLen = 0 is very important
    +  // for example, when upgrading, upgrade packet is sent over,
    +  // and a nonzero prevBufferLen could cause problems on `drain`
    +  this.prevBufferLen = 0;
    +
    +  if (0 === this.writeBuffer.length) {
    +    this.emit('drain');
    +  } else {
    +    this.flush();
    +  }
    +};
    +
    +/**
    + * Flush write buffers.
    + *
    + * @api private
    + */
    +
    +Socket.prototype.flush = function () {
    +  if ('closed' != this.readyState && this.transport.writable &&
    +    !this.upgrading && this.writeBuffer.length) {
    +    debug('flushing %d packets in socket', this.writeBuffer.length);
    +    this.transport.send(this.writeBuffer);
    +    // keep track of current length of writeBuffer
    +    // splice writeBuffer and callbackBuffer on `drain`
    +    this.prevBufferLen = this.writeBuffer.length;
    +    this.emit('flush');
    +  }
    +};
    +
    +/**
    + * Sends a message.
    + *
    + * @param {String} message.
    + * @param {Function} callback function.
    + * @param {Object} options.
    + * @return {Socket} for chaining.
    + * @api public
    + */
    +
    +Socket.prototype.write =
    +Socket.prototype.send = function (msg, options, fn) {
    +  this.sendPacket('message', msg, options, fn);
    +  return this;
    +};
    +
    +/**
    + * Sends a packet.
    + *
    + * @param {String} packet type.
    + * @param {String} data.
    + * @param {Object} options.
    + * @param {Function} callback function.
    + * @api private
    + */
    +
    +Socket.prototype.sendPacket = function (type, data, options, fn) {
    +  if('function' == typeof data) {
    +    fn = data;
    +    data = undefined;
    +  }
    +
    +  if ('function' == typeof options) {
    +    fn = options;
    +    options = null;
    +  }
    +
    +  if ('closing' == this.readyState || 'closed' == this.readyState) {
    +    return;
    +  }
    +
    +  options = options || {};
    +  options.compress = false !== options.compress;
    +
    +  var packet = {
    +    type: type,
    +    data: data,
    +    options: options
    +  };
    +  this.emit('packetCreate', packet);
    +  this.writeBuffer.push(packet);
    +  if (fn) this.once('flush', fn);
    +  this.flush();
    +};
    +
    +/**
    + * Closes the connection.
    + *
    + * @api private
    + */
    +
    +Socket.prototype.close = function () {
    +  if ('opening' == this.readyState || 'open' == this.readyState) {
    +    this.readyState = 'closing';
    +
    +    var self = this;
    +
    +    if (this.writeBuffer.length) {
    +      this.once('drain', function() {
    +        if (this.upgrading) {
    +          waitForUpgrade();
    +        } else {
    +          close();
    +        }
    +      });
    +    } else if (this.upgrading) {
    +      waitForUpgrade();
    +    } else {
    +      close();
    +    }
    +  }
    +
    +  function close() {
    +    self.onClose('forced close');
    +    debug('socket closing - telling transport to close');
    +    self.transport.close();
    +  }
    +
    +  function cleanupAndClose() {
    +    self.removeListener('upgrade', cleanupAndClose);
    +    self.removeListener('upgradeError', cleanupAndClose);
    +    close();
    +  }
    +
    +  function waitForUpgrade() {
    +    // wait for upgrade to finish since we can't send packets while pausing a transport
    +    self.once('upgrade', cleanupAndClose);
    +    self.once('upgradeError', cleanupAndClose);
    +  }
    +
    +  return this;
    +};
    +
    +/**
    + * Called upon transport error
    + *
    + * @api private
    + */
    +
    +Socket.prototype.onError = function (err) {
    +  debug('socket error %j', err);
    +  Socket.priorWebsocketSuccess = false;
    +  this.emit('error', err);
    +  this.onClose('transport error', err);
    +};
    +
    +/**
    + * Called upon transport close.
    + *
    + * @api private
    + */
    +
    +Socket.prototype.onClose = function (reason, desc) {
    +  if ('opening' == this.readyState || 'open' == this.readyState || 'closing' == this.readyState) {
    +    debug('socket close with reason: "%s"', reason);
    +    var self = this;
    +
    +    // clear timers
    +    clearTimeout(this.pingIntervalTimer);
    +    clearTimeout(this.pingTimeoutTimer);
    +
    +    // stop event from firing again for transport
    +    this.transport.removeAllListeners('close');
    +
    +    // ensure transport won't stay open
    +    this.transport.close();
    +
    +    // ignore further transport communication
    +    this.transport.removeAllListeners();
    +
    +    // set ready state
    +    this.readyState = 'closed';
    +
    +    // clear session id
    +    this.id = null;
    +
    +    // emit close event
    +    this.emit('close', reason, desc);
    +
    +    // clean buffers after, so users can still
    +    // grab the buffers on `close` event
    +    self.writeBuffer = [];
    +    self.prevBufferLen = 0;
    +  }
    +};
    +
    +/**
    + * Filters upgrades, returning only those matching client transports.
    + *
    + * @param {Array} server upgrades
    + * @api private
    + *
    + */
    +
    +Socket.prototype.filterUpgrades = function (upgrades) {
    +  var filteredUpgrades = [];
    +  for (var i = 0, j = upgrades.length; i

    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 I-Ko?4FC8~NI{*Lx literal 0 HcmV?d00001 diff --git a/cep/fonts/OpenSans/OpenSans-Regular.ttf b/cep/fonts/OpenSans/OpenSans-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..db433349b7047f72f40072630c1bc110620bf09e GIT binary patch literal 217360 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 !}#gv~NV!5|5YF|kE)J0y^zWbk4>=%|6F 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 literal 0 HcmV?d00001 diff --git a/cep/fonts/OpenSans/OpenSans-Semibold.ttf b/cep/fonts/OpenSans/OpenSans-Semibold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1a7679e3949fb045f152f456bc4adad31e8b9f55 GIT binary patch literal 221328 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%0DJH?LFC28_mTUAZOar9j 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