+
+
diff --git a/example/tweeter/tweeterclient.js b/example/tweeter/tweeterclient.js
new file mode 100644
index 00000000..84fc5ef7
--- /dev/null
+++ b/example/tweeter/tweeterclient.js
@@ -0,0 +1,36 @@
+function noop(){}
+$(document).ready(function(){
+ function xhr(method, url, data, callback){
+ jQuery.getJSON(url, function(){
+ callback.apply(this, arguments);
+ scope.updateView();
+ });
+ }
+
+ var resourceFactory = new ResourceFactory(xhr);
+
+ var Tweeter = resourceFactory.route("http://twitter.com/statuses/:service:username.json", {}, {
+ home: {method:'GET', params: {service:'home_timeline'}, isArray:true },
+ user: {method:'GET', params: {service:'user_timeline/'}, isArray:true }
+ });
+
+
+ var scope = window.scope = angular.compile(document, {
+ location:angular.startUrlWatcher()
+ });
+
+ function fetchTweets(username){
+ return username ? Tweeter.user({username: username}) : Tweeter.home();
+ }
+
+ scope.set('fetchTweets', fetchTweets);
+ scope.set('users', [
+ {screen_name:'mhevery', name:'Mi\u0161ko Hevery',
+ notes:'Author of http://www.getangular.com.',
+ profile_image_url:'http://a3.twimg.com/profile_images/54360179/Me_-_Small_Banner_normal.jpg'},
+ {screen_name:'abrons', name:'Adam Abrons',
+ notes:'Author of & Ruby guru see: http://www.angularjs.org.',
+ profile_image_url:'http://media.linkedin.com/mpr/mpr/shrink_80_80/p/2/000/005/0a8/044278d.jpg'}
+ ]);
+ scope.init();
+});
diff --git a/jsTestDriver-jquery.conf b/jsTestDriver-jquery.conf
new file mode 100644
index 00000000..34538bce
--- /dev/null
+++ b/jsTestDriver-jquery.conf
@@ -0,0 +1,24 @@
+server: http://localhost:9876
+
+load:
+ - lib/jasmine/jasmine-0.10.3.js
+ - lib/jasmine-jstd-adapter/JasmineAdapter.js
+ - lib/jquery/jquery-1.4.2.js
+ - test/jquery_alias.js
+ - src/Angular.js
+ - src/*.js
+ - src/scenario/Runner.js
+ - src/scenario/*.js
+ - test/testabilityPatch.js
+ - test/angular-mocks.js
+ - test/scenario/*.js
+ - test/*.js
+
+exclude:
+ - src/angular.prefix
+ - src/angular.suffix
+ - src/angular-bootstrap.js
+ - src/AngularPublic.js
+ - src/scenario/bootstrap.js
+ - test/jquery_remove.js
+
diff --git a/jsTestDriver.conf b/jsTestDriver.conf
new file mode 100644
index 00000000..16bcf1db
--- /dev/null
+++ b/jsTestDriver.conf
@@ -0,0 +1,23 @@
+server: http://localhost:9876
+
+load:
+ - lib/jasmine/jasmine-0.10.3.js
+ - lib/jasmine-jstd-adapter/JasmineAdapter.js
+ - lib/jquery/jquery-1.4.2.js
+ - test/jquery_remove.js
+ - src/Angular.js
+ - src/*.js
+ - src/scenario/Runner.js
+ - src/scenario/*.js
+ - test/testabilityPatch.js
+ - test/angular-mocks.js
+ - test/scenario/*.js
+ - test/*.js
+
+exclude:
+ - test/jquery_alias.js
+ - src/angular.prefix
+ - src/angular.suffix
+ - src/angular-bootstrap.js
+ - src/scenario/bootstrap.js
+ - src/AngularPublic.js
diff --git a/jstd.log b/jstd.log
new file mode 100644
index 00000000..950b6ce4
--- /dev/null
+++ b/jstd.log
@@ -0,0 +1,762 @@
+Apr 8, 2010 2:04:32 PM com.google.jstestdriver.ServerStartupAction run
+INFO: Starting server...
+Apr 8, 2010 2:04:32 PM org.mortbay.log.Slf4jLog info
+INFO: Transparent ProxyServlet @ forward to http://localhost:9876
+Apr 8, 2010 2:04:33 PM com.google.jstestdriver.BrowserHunter captureBrowser
+INFO: Browser Captured: Firefox version 3.6.3 (1)
+Apr 8, 2010 2:04:33 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1?start HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Content-Type: text/plain; charset=UTF-8
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:04:33 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Content-Type: text/plain; charset=UTF-8
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:04:36 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1?start HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Content-Type: text/plain; charset=UTF-8
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:04:43 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Content-Type: text/plain; charset=UTF-8
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:04:53 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:05:04 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Content-Type: text/plain; charset=UTF-8
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:05:14 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:05:24 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Content-Type: text/plain; charset=UTF-8
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:05:34 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:05:44 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:05:54 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Content-Type: text/plain; charset=UTF-8
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:06:04 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:06:14 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:06:24 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Content-Type: text/plain; charset=UTF-8
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:06:34 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Content-Type: text/plain; charset=UTF-8
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:06:44 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:06:54 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:07:04 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:07:14 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Content-Type: text/plain; charset=UTF-8
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:07:24 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Content-Type: text/plain; charset=UTF-8
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:07:34 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Pragma: no-cache
+Cache-Control: no-cache
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+
+
+Apr 8, 2010 2:07:44 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:07:55 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Content-Type: text/plain; charset=UTF-8
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:08:05 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Content-Type: text/plain; charset=UTF-8
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:08:15 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:08:25 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Content-Type: text/plain; charset=UTF-8
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:08:35 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:08:45 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:08:55 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Content-Type: text/plain; charset=UTF-8
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:09:05 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:09:15 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:09:25 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Content-Type: text/plain; charset=UTF-8
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:09:35 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:09:45 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:09:55 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Pragma: no-cache
+Cache-Control: no-cache
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+
+
+Apr 8, 2010 2:10:05 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:10:15 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:10:25 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Content-Type: text/plain; charset=UTF-8
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:10:35 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Content-Type: text/plain; charset=UTF-8
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:10:45 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Content-Type: text/plain; charset=UTF-8
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:10:55 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1?start HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+Pragma: no-cache
+Cache-Control: no-cache
+
+
+Apr 8, 2010 2:10:56 PM com.google.jstestdriver.BrowserQueryResponseServlet doPost
+FINEST: POST: POST /query/1 HTTP/1.1
+Host: misko.i:9876
+User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
+Accept: */*
+Accept-Language: en-us,en;q=0.5
+Accept-Encoding: gzip,deflate
+Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
+Keep-Alive: 115
+Connection: keep-alive
+Referer: http://misko.i:9876/slave/1/Runnerstrict.html
+Pragma: no-cache
+Cache-Control: no-cache
+Content-Type: text/plain; charset=UTF-8
+X-Requested-With: XMLHttpRequest
+Content-Length: 0
+
+
diff --git a/lib/compiler-closure/COPYING b/lib/compiler-closure/COPYING
new file mode 100644
index 00000000..d6456956
--- /dev/null
+++ b/lib/compiler-closure/COPYING
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/lib/compiler-closure/README b/lib/compiler-closure/README
new file mode 100644
index 00000000..af4e6106
--- /dev/null
+++ b/lib/compiler-closure/README
@@ -0,0 +1,193 @@
+/*
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+//
+// Contents
+//
+
+The Closure Compiler performs checking, instrumentation, and
+optimizations on JavaScript code. The purpose of this README is to
+explain how to build and run the Closure Compiler.
+
+The Closure Compiler requires Java 6 or higher.
+http://www.java.com/
+
+
+//
+// Building The Closure Compiler
+//
+
+There are three ways to get a Closure Compiler executable.
+
+1) Use one we built for you.
+
+Pre-built Closure binaries can be found at
+http://code.google.com/p/closure-compiler/downloads/list
+
+
+2) Check out the source and build it with Apache Ant.
+
+First, check out the full source tree of the Closure Compiler. There
+are instructions on how to do this at the project site.
+http://code.google.com/p/closure-compiler/source/checkout
+
+Apache Ant is a cross-platform build tool.
+http://ant.apache.org/
+
+At the root of the source tree, there is an Ant file named
+build.xml. To use it, navigate to the same directory and type the
+command
+
+ant jar
+
+This will produce a jar file called "build/compiler.jar".
+
+
+3) Check out the source and build it with Eclipse.
+
+Eclipse is a cross-platform IDE.
+http://www.eclipse.org/
+
+Under Eclipse's File menu, click "New > Project ..." and create a
+"Java Project." You will see an options screen. Give the project a
+name, select "Create project from existing source," and choose the
+root of the checked-out source tree as the existing directory. Verify
+that you are using JRE version 6 or higher.
+
+Eclipse can use the build.xml file to discover rules. When you
+navigate to the build.xml file, you will see all the build rules in
+the "Outline" pane. Run the "jar" rule to build the compiler in
+build/compiler.jar.
+
+
+//
+// Running The Closure Compiler
+//
+
+Once you have the jar binary, running the Closure Compiler is straightforward.
+
+On the command line, type
+
+java -jar compiler.jar
+
+This starts the compiler in interactive mode. Type
+
+var x = 17 + 25;
+
+then hit "Enter", then hit "Ctrl-Z" (on Windows) or "Ctrl-D" (on Mac or Linux)
+and "Enter" again. The Compiler will respond:
+
+var x=42;
+
+The Closure Compiler has many options for reading input from a file,
+writing output to a file, checking your code, and running
+optimizations. To learn more, type
+
+java -jar compiler.jar --help
+
+You can read more detailed documentation about the many flags at
+http://code.google.com/closure/compiler/docs/gettingstarted_app.html
+
+
+//
+// Compiling Multiple Scripts
+//
+
+If you have multiple scripts, you should compile them all together with
+one compile command.
+
+java -jar compiler.jar --js=in1.js --js=in2.js ... --js_output_file=out.js
+
+The Closure Compiler will concatenate the files in the order they're
+passed at the command line.
+
+If you need to compile many, many scripts together, you may start to
+run into problems with managing dependencies between scripts. You
+should check out the Closure Library. It contains functions for
+enforcing dependencies between scripts, and a tool called calcdeps.py
+that knows how to give scripts to the Closure Compiler in the right
+order.
+
+http://code.google.com/p/closure-library/
+
+//
+// Licensing
+//
+
+Unless otherwise stated, all source files are licensed under
+the Apache License, Version 2.0.
+
+
+-----
+Code under:
+src/com/google/javascript/rhino
+test/com/google/javascript/rhino
+
+URL: http://www.mozilla.org/rhino
+Version: 1.5R3, with heavy modifications
+License: Netscape Public License and MPL / GPL dual license
+
+Description: A partial copy of Mozilla Rhino. Mozilla Rhino is an
+implementation of JavaScript for the JVM. The JavaScript parser and
+the parse tree data structures were extracted and modified
+significantly for use by Google's JavaScript compiler.
+
+Local Modifications: The packages have been renamespaced. All code not
+relavant to parsing has been removed. A JSDoc parser and static typing
+system have been added.
+
+
+-----
+Code in:
+lib/libtrunk_rhino_parser_jarjared.jar
+
+URL: http://www.mozilla.org/rhino
+Version: Trunk
+License: Netscape Public License and MPL / GPL dual license
+
+Description: Mozilla Rhino is an implementation of JavaScript for the JVM.
+
+Local Modifications: None. We've used JarJar to renamespace the code
+post-compilation. See:
+http://code.google.com/p/jarjar/
+
+
+-----
+Code in:
+lib/google_common.jar
+
+URL: http://code.google.com/p/guava-libraries/
+Version: Trunk
+License: Apache License 2.0
+
+Description: Google's core Java libraries.
+
+Local Modifications: None.
+
+
+----
+Code in:
+lib/junit.jar
+
+URL: http://sourceforge.net/projects/junit/
+Version: 3.8.1
+License: Common Public License 1.0
+
+Description: A framework for writing and running automated tests in Java.
+
+Local Modifications: None.
+
+
diff --git a/lib/compiler-closure/compiler.jar b/lib/compiler-closure/compiler.jar
new file mode 100644
index 00000000..da053a7d
Binary files /dev/null and b/lib/compiler-closure/compiler.jar differ
diff --git a/lib/jasmine-jstd-adapter/JasmineAdapter.js b/lib/jasmine-jstd-adapter/JasmineAdapter.js
new file mode 100644
index 00000000..0fdc4612
--- /dev/null
+++ b/lib/jasmine-jstd-adapter/JasmineAdapter.js
@@ -0,0 +1,111 @@
+/**
+ * @fileoverview Jasmine JsTestDriver Adapter.
+ * @author ibolmo@gmail.com (Olmo Maldonado)
+ * @author misko@hevery.com (Misko Hevery)
+ */
+
+(function() {
+
+ function bind(_this, _function){
+ return function(){
+ return _function.call(_this);
+ };
+ }
+
+ var currentFrame = frame(null, null);
+
+ function frame(parent, name){
+ var caseName = (parent && parent.caseName ? parent.caseName + " " : '') + (name ? name : '');
+ var frame = {
+ name: name,
+ caseName: caseName,
+ parent: parent,
+ testCase: TestCase(caseName),
+ before: [],
+ after: [],
+ runBefore: function(){
+ if (parent) parent.runBefore.apply(this);
+ for ( var i = 0; i < frame.before.length; i++) {
+ frame.before[i].apply(this);
+ }
+ },
+ runAfter: function(){
+ for ( var i = 0; i < frame.after.length; i++) {
+ frame.after[i].apply(this);
+ }
+ if (parent) parent.runAfter.apply(this);
+ }
+ };
+ return frame;
+ };
+
+ jasmine.Env.prototype.describe = (function(describe){
+ return function(description){
+ currentFrame = frame(currentFrame, description);
+ var val = describe.apply(this, arguments);
+ currentFrame = currentFrame.parent;
+ return val;
+ };
+
+ })(jasmine.Env.prototype.describe);
+
+ var id = 0;
+
+ jasmine.Env.prototype.it = (function(it){
+ return function(desc, itFn){
+ var self = this;
+ var spec = it.apply(this, arguments);
+ var currentSpec = this.currentSpec;
+ if (!currentSpec.$id) {
+ currentSpec.$id = id++;
+ }
+ var frame = this.jstdFrame = currentFrame;
+ var name = 'test that it ' + desc;
+ if (this.jstdFrame.testCase.prototype[name])
+ throw "Spec with name '" + desc + "' already exists.";
+ this.jstdFrame.testCase.prototype[name] = function(){
+ jasmine.getEnv().currentSpec = currentSpec;
+ frame.runBefore.apply(currentSpec);
+ try {
+ itFn.apply(currentSpec);
+ } finally {
+ frame.runAfter.apply(currentSpec);
+ }
+ };
+ return spec;
+ };
+
+ })(jasmine.Env.prototype.it);
+
+
+ jasmine.Env.prototype.beforeEach = (function(beforeEach){
+ return function(beforeEachFunction) {
+ beforeEach.apply(this, arguments);
+ currentFrame.before.push(beforeEachFunction);
+ };
+
+ })(jasmine.Env.prototype.beforeEach);
+
+
+ jasmine.Env.prototype.afterEach = (function(afterEach){
+ return function(afterEachFunction) {
+ afterEach.apply(this, arguments);
+ currentFrame.after.push(afterEachFunction);
+ };
+
+ })(jasmine.Env.prototype.afterEach);
+
+
+ jasmine.NestedResults.prototype.addResult = (function(addResult){
+ return function(result) {
+ addResult.call(this, result);
+ if (result.type != 'MessageResult' && !result.passed()) fail(result.message);
+ };
+
+ })(jasmine.NestedResults.prototype.addResult);
+
+ // Reset environment with overriden methods.
+ jasmine.currentEnv_ = null;
+ jasmine.getEnv();
+
+})();
diff --git a/lib/jasmine/jasmine-0.10.3.js b/lib/jasmine/jasmine-0.10.3.js
new file mode 100644
index 00000000..f309493f
--- /dev/null
+++ b/lib/jasmine/jasmine-0.10.3.js
@@ -0,0 +1,2331 @@
+/**
+ * Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework.
+ *
+ * @namespace
+ */
+var jasmine = {};
+
+/**
+ * @private
+ */
+jasmine.unimplementedMethod_ = function() {
+ throw new Error("unimplemented method");
+};
+
+/**
+ * Use jasmine.undefined instead of undefined, since undefined is just
+ * a plain old variable and may be redefined by somebody else.
+ *
+ * @private
+ */
+jasmine.undefined = jasmine.___undefined___;
+
+/**
+ * Default interval for event loop yields. Small values here may result in slow test running. Zero means no updates until all tests have completed.
+ *
+ */
+jasmine.DEFAULT_UPDATE_INTERVAL = 250;
+
+/**
+ * Allows for bound functions to be compared. Internal use only.
+ *
+ * @ignore
+ * @private
+ * @param base {Object} bound 'this' for the function
+ * @param name {Function} function to find
+ */
+jasmine.bindOriginal_ = function(base, name) {
+ var original = base[name];
+ if (original.apply) {
+ return function() {
+ return original.apply(base, arguments);
+ };
+ } else {
+ // IE support
+ return window[name];
+ }
+};
+
+jasmine.setTimeout = jasmine.bindOriginal_(window, 'setTimeout');
+jasmine.clearTimeout = jasmine.bindOriginal_(window, 'clearTimeout');
+jasmine.setInterval = jasmine.bindOriginal_(window, 'setInterval');
+jasmine.clearInterval = jasmine.bindOriginal_(window, 'clearInterval');
+
+jasmine.MessageResult = function(text) {
+ this.type = 'MessageResult';
+ this.text = text;
+ this.trace = new Error(); // todo: test better
+};
+
+jasmine.ExpectationResult = function(params) {
+ this.type = 'ExpectationResult';
+ this.matcherName = params.matcherName;
+ this.passed_ = params.passed;
+ this.expected = params.expected;
+ this.actual = params.actual;
+
+ /** @deprecated */
+ this.details = params.details;
+
+ this.message = this.passed_ ? 'Passed.' : params.message;
+ this.trace = this.passed_ ? '' : new Error(this.message);
+};
+
+jasmine.ExpectationResult.prototype.passed = function () {
+ return this.passed_;
+};
+
+/**
+ * Getter for the Jasmine environment. Ensures one gets created
+ */
+jasmine.getEnv = function() {
+ return jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env();
+};
+
+/**
+ * @ignore
+ * @private
+ * @param value
+ * @returns {Boolean}
+ */
+jasmine.isArray_ = function(value) {
+ return jasmine.isA_("Array", value);
+};
+
+/**
+ * @ignore
+ * @private
+ * @param value
+ * @returns {Boolean}
+ */
+jasmine.isString_ = function(value) {
+ return jasmine.isA_("String", value);
+};
+
+/**
+ * @ignore
+ * @private
+ * @param value
+ * @returns {Boolean}
+ */
+jasmine.isNumber_ = function(value) {
+ return jasmine.isA_("Number", value);
+};
+
+/**
+ * @ignore
+ * @private
+ * @param {String} typeName
+ * @param value
+ * @returns {Boolean}
+ */
+jasmine.isA_ = function(typeName, value) {
+ return Object.prototype.toString.apply(value) === '[object ' + typeName + ']';
+};
+
+/**
+ * Pretty printer for expecations. Takes any object and turns it into a human-readable string.
+ *
+ * @param value {Object} an object to be outputted
+ * @returns {String}
+ */
+jasmine.pp = function(value) {
+ var stringPrettyPrinter = new jasmine.StringPrettyPrinter();
+ stringPrettyPrinter.format(value);
+ return stringPrettyPrinter.string;
+};
+
+/**
+ * Returns true if the object is a DOM Node.
+ *
+ * @param {Object} obj object to check
+ * @returns {Boolean}
+ */
+jasmine.isDomNode = function(obj) {
+ return obj['nodeType'] > 0;
+};
+
+/**
+ * Returns a matchable 'generic' object of the class type. For use in expecations of type when values don't matter.
+ *
+ * @example
+ * // don't care about which function is passed in, as long as it's a function
+ * expect(mySpy).wasCalledWith(jasmine.any(Function));
+ *
+ * @param {Class} clazz
+ * @returns matchable object of the type clazz
+ */
+jasmine.any = function(clazz) {
+ return new jasmine.Matchers.Any(clazz);
+};
+
+/**
+ * Jasmine Spies are test doubles that can act as stubs, spies, fakes or when used in an expecation, mocks.
+ *
+ * Spies should be created in test setup, before expectations. They can then be checked, using the standard Jasmine
+ * expectation syntax. Spies can be checked if they were called or not and what the calling params were.
+ *
+ * A Spy has the following mehtod: wasCalled, callCount, mostRecentCall, and argsForCall (see docs)
+ * Spies are torn down at the end of every spec.
+ *
+ * Note: Do not call new jasmine.Spy() directly - a spy must be created using spyOn, jasmine.createSpy or jasmine.createSpyObj.
+ *
+ * @example
+ * // a stub
+ * var myStub = jasmine.createSpy('myStub'); // can be used anywhere
+ *
+ * // spy example
+ * var foo = {
+ * not: function(bool) { return !bool; }
+ * }
+ *
+ * // actual foo.not will not be called, execution stops
+ * spyOn(foo, 'not');
+
+ // foo.not spied upon, execution will continue to implementation
+ * spyOn(foo, 'not').andCallThrough();
+ *
+ * // fake example
+ * var foo = {
+ * not: function(bool) { return !bool; }
+ * }
+ *
+ * // foo.not(val) will return val
+ * spyOn(foo, 'not').andCallFake(function(value) {return value;});
+ *
+ * // mock example
+ * foo.not(7 == 7);
+ * expect(foo.not).wasCalled();
+ * expect(foo.not).wasCalledWith(true);
+ *
+ * @constructor
+ * @see spyOn, jasmine.createSpy, jasmine.createSpyObj
+ * @param {String} name
+ */
+jasmine.Spy = function(name) {
+ /**
+ * The name of the spy, if provided.
+ */
+ this.identity = name || 'unknown';
+ /**
+ * Is this Object a spy?
+ */
+ this.isSpy = true;
+ /**
+ * The actual function this spy stubs.
+ */
+ this.plan = function() {
+ };
+ /**
+ * Tracking of the most recent call to the spy.
+ * @example
+ * var mySpy = jasmine.createSpy('foo');
+ * mySpy(1, 2);
+ * mySpy.mostRecentCall.args = [1, 2];
+ */
+ this.mostRecentCall = {};
+
+ /**
+ * Holds arguments for each call to the spy, indexed by call count
+ * @example
+ * var mySpy = jasmine.createSpy('foo');
+ * mySpy(1, 2);
+ * mySpy(7, 8);
+ * mySpy.mostRecentCall.args = [7, 8];
+ * mySpy.argsForCall[0] = [1, 2];
+ * mySpy.argsForCall[1] = [7, 8];
+ */
+ this.argsForCall = [];
+ this.calls = [];
+};
+
+/**
+ * Tells a spy to call through to the actual implemenatation.
+ *
+ * @example
+ * var foo = {
+ * bar: function() { // do some stuff }
+ * }
+ *
+ * // defining a spy on an existing property: foo.bar
+ * spyOn(foo, 'bar').andCallThrough();
+ */
+jasmine.Spy.prototype.andCallThrough = function() {
+ this.plan = this.originalValue;
+ return this;
+};
+
+/**
+ * For setting the return value of a spy.
+ *
+ * @example
+ * // defining a spy from scratch: foo() returns 'baz'
+ * var foo = jasmine.createSpy('spy on foo').andReturn('baz');
+ *
+ * // defining a spy on an existing property: foo.bar() returns 'baz'
+ * spyOn(foo, 'bar').andReturn('baz');
+ *
+ * @param {Object} value
+ */
+jasmine.Spy.prototype.andReturn = function(value) {
+ this.plan = function() {
+ return value;
+ };
+ return this;
+};
+
+/**
+ * For throwing an exception when a spy is called.
+ *
+ * @example
+ * // defining a spy from scratch: foo() throws an exception w/ message 'ouch'
+ * var foo = jasmine.createSpy('spy on foo').andThrow('baz');
+ *
+ * // defining a spy on an existing property: foo.bar() throws an exception w/ message 'ouch'
+ * spyOn(foo, 'bar').andThrow('baz');
+ *
+ * @param {String} exceptionMsg
+ */
+jasmine.Spy.prototype.andThrow = function(exceptionMsg) {
+ this.plan = function() {
+ throw exceptionMsg;
+ };
+ return this;
+};
+
+/**
+ * Calls an alternate implementation when a spy is called.
+ *
+ * @example
+ * var baz = function() {
+ * // do some stuff, return something
+ * }
+ * // defining a spy from scratch: foo() calls the function baz
+ * var foo = jasmine.createSpy('spy on foo').andCall(baz);
+ *
+ * // defining a spy on an existing property: foo.bar() calls an anonymnous function
+ * spyOn(foo, 'bar').andCall(function() { return 'baz';} );
+ *
+ * @param {Function} fakeFunc
+ */
+jasmine.Spy.prototype.andCallFake = function(fakeFunc) {
+ this.plan = fakeFunc;
+ return this;
+};
+
+/**
+ * Resets all of a spy's the tracking variables so that it can be used again.
+ *
+ * @example
+ * spyOn(foo, 'bar');
+ *
+ * foo.bar();
+ *
+ * expect(foo.bar.callCount).toEqual(1);
+ *
+ * foo.bar.reset();
+ *
+ * expect(foo.bar.callCount).toEqual(0);
+ */
+jasmine.Spy.prototype.reset = function() {
+ this.wasCalled = false;
+ this.callCount = 0;
+ this.argsForCall = [];
+ this.calls = [];
+ this.mostRecentCall = {};
+};
+
+jasmine.createSpy = function(name) {
+
+ var spyObj = function() {
+ spyObj.wasCalled = true;
+ spyObj.callCount++;
+ var args = jasmine.util.argsToArray(arguments);
+ spyObj.mostRecentCall.object = this;
+ spyObj.mostRecentCall.args = args;
+ spyObj.argsForCall.push(args);
+ spyObj.calls.push({object: this, args: args});
+ return spyObj.plan.apply(this, arguments);
+ };
+
+ var spy = new jasmine.Spy(name);
+
+ for (var prop in spy) {
+ spyObj[prop] = spy[prop];
+ }
+
+ spyObj.reset();
+
+ return spyObj;
+};
+
+/**
+ * Determines whether an object is a spy.
+ *
+ * @param {jasmine.Spy|Object} putativeSpy
+ * @returns {Boolean}
+ */
+jasmine.isSpy = function(putativeSpy) {
+ return putativeSpy && putativeSpy.isSpy;
+};
+
+/**
+ * Creates a more complicated spy: an Object that has every property a function that is a spy. Used for stubbing something
+ * large in one call.
+ *
+ * @param {String} baseName name of spy class
+ * @param {Array} methodNames array of names of methods to make spies
+ */
+jasmine.createSpyObj = function(baseName, methodNames) {
+ if (!jasmine.isArray_(methodNames) || methodNames.length == 0) {
+ throw new Error('createSpyObj requires a non-empty array of method names to create spies for');
+ }
+ var obj = {};
+ for (var i = 0; i < methodNames.length; i++) {
+ obj[methodNames[i]] = jasmine.createSpy(baseName + '.' + methodNames[i]);
+ }
+ return obj;
+};
+
+jasmine.log = function(message) {
+ jasmine.getEnv().currentSpec.log(message);
+};
+
+/**
+ * Function that installs a spy on an existing object's method name. Used within a Spec to create a spy.
+ *
+ * @example
+ * // spy example
+ * var foo = {
+ * not: function(bool) { return !bool; }
+ * }
+ * spyOn(foo, 'not'); // actual foo.not will not be called, execution stops
+ *
+ * @see jasmine.createSpy
+ * @param obj
+ * @param methodName
+ * @returns a Jasmine spy that can be chained with all spy methods
+ */
+var spyOn = function(obj, methodName) {
+ return jasmine.getEnv().currentSpec.spyOn(obj, methodName);
+};
+
+/**
+ * Creates a Jasmine spec that will be added to the current suite.
+ *
+ * // TODO: pending tests
+ *
+ * @example
+ * it('should be true', function() {
+ * expect(true).toEqual(true);
+ * });
+ *
+ * @param {String} desc description of this specification
+ * @param {Function} func defines the preconditions and expectations of the spec
+ */
+var it = function(desc, func) {
+ return jasmine.getEnv().it(desc, func);
+};
+
+/**
+ * Creates a disabled Jasmine spec.
+ *
+ * A convenience method that allows existing specs to be disabled temporarily during development.
+ *
+ * @param {String} desc description of this specification
+ * @param {Function} func defines the preconditions and expectations of the spec
+ */
+var xit = function(desc, func) {
+ return jasmine.getEnv().xit(desc, func);
+};
+
+/**
+ * Starts a chain for a Jasmine expectation.
+ *
+ * It is passed an Object that is the actual value and should chain to one of the many
+ * jasmine.Matchers functions.
+ *
+ * @param {Object} actual Actual value to test against and expected value
+ */
+var expect = function(actual) {
+ return jasmine.getEnv().currentSpec.expect(actual);
+};
+
+/**
+ * Defines part of a jasmine spec. Used in cominbination with waits or waitsFor in asynchrnous specs.
+ *
+ * @param {Function} func Function that defines part of a jasmine spec.
+ */
+var runs = function(func) {
+ jasmine.getEnv().currentSpec.runs(func);
+};
+
+/**
+ * Waits for a timeout before moving to the next runs()-defined block.
+ * @param {Number} timeout
+ */
+var waits = function(timeout) {
+ jasmine.getEnv().currentSpec.waits(timeout);
+};
+
+/**
+ * Waits for the latchFunction to return true before proceeding to the next runs()-defined block.
+ *
+ * @param {Number} timeout
+ * @param {Function} latchFunction
+ * @param {String} message
+ */
+var waitsFor = function(timeout, latchFunction, message) {
+ jasmine.getEnv().currentSpec.waitsFor(timeout, latchFunction, message);
+};
+
+/**
+ * A function that is called before each spec in a suite.
+ *
+ * Used for spec setup, including validating assumptions.
+ *
+ * @param {Function} beforeEachFunction
+ */
+var beforeEach = function(beforeEachFunction) {
+ jasmine.getEnv().beforeEach(beforeEachFunction);
+};
+
+/**
+ * A function that is called after each spec in a suite.
+ *
+ * Used for restoring any state that is hijacked during spec execution.
+ *
+ * @param {Function} afterEachFunction
+ */
+var afterEach = function(afterEachFunction) {
+ jasmine.getEnv().afterEach(afterEachFunction);
+};
+
+/**
+ * Defines a suite of specifications.
+ *
+ * Stores the description and all defined specs in the Jasmine environment as one suite of specs. Variables declared
+ * are accessible by calls to beforeEach, it, and afterEach. Describe blocks can be nested, allowing for specialization
+ * of setup in some tests.
+ *
+ * @example
+ * // TODO: a simple suite
+ *
+ * // TODO: a simple suite with a nested describe block
+ *
+ * @param {String} description A string, usually the class under test.
+ * @param {Function} specDefinitions function that defines several specs.
+ */
+var describe = function(description, specDefinitions) {
+ return jasmine.getEnv().describe(description, specDefinitions);
+};
+
+/**
+ * Disables a suite of specifications. Used to disable some suites in a file, or files, temporarily during development.
+ *
+ * @param {String} description A string, usually the class under test.
+ * @param {Function} specDefinitions function that defines several specs.
+ */
+var xdescribe = function(description, specDefinitions) {
+ return jasmine.getEnv().xdescribe(description, specDefinitions);
+};
+
+
+// Provide the XMLHttpRequest class for IE 5.x-6.x:
+jasmine.XmlHttpRequest = (typeof XMLHttpRequest == "undefined") ? function() {
+ try {
+ return new ActiveXObject("Msxml2.XMLHTTP.6.0");
+ } catch(e) {
+ }
+ try {
+ return new ActiveXObject("Msxml2.XMLHTTP.3.0");
+ } catch(e) {
+ }
+ try {
+ return new ActiveXObject("Msxml2.XMLHTTP");
+ } catch(e) {
+ }
+ try {
+ return new ActiveXObject("Microsoft.XMLHTTP");
+ } catch(e) {
+ }
+ throw new Error("This browser does not support XMLHttpRequest.");
+} : XMLHttpRequest;
+
+/**
+ * Adds suite files to an HTML document so that they are executed, thus adding them to the current
+ * Jasmine environment.
+ *
+ * @param {String} url path to the file to include
+ * @param {Boolean} opt_global
+ * @deprecated We suggest you use a different method of including JS source files. jasmine.include will be removed soon.
+ */
+jasmine.include = function(url, opt_global) {
+ if (opt_global) {
+ document.write('
+
+
+
+
+